aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormorefigs <morefigs@gmail.com>2013-12-24 20:13:04 -0800
committermorefigs <morefigs@gmail.com>2013-12-24 20:13:04 -0800
commit7077dad4be8cf90cac838519f97231d4fb74715f (patch)
treebf8ad08eb08c3b4f348fa1f597ea8bbe87862c1c
parentd82502ba8b484b297b33383c636618a4a617229d (diff)
downloadpymba-7077dad4be8cf90cac838519f97231d4fb74715f.tar.gz
pymba-7077dad4be8cf90cac838519f97231d4fb74715f.zip
Create vimbaframe.py
-rw-r--r--vimbaframe.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/vimbaframe.py b/vimbaframe.py
new file mode 100644
index 0000000..e97360e
--- /dev/null
+++ b/vimbaframe.py
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+import vimbastructure as structs
+from vimbaexception import VimbaException
+from vimbadll import VimbaDLL
+from vimbadll import VimbaC_MemoryBlock
+from ctypes import *
+
+class VimbaFrame(object):
+ """
+ A Vimba frame.
+ """
+ def __init__(self, camera):
+ self._camera = camera
+ self._handle = camera.handle
+
+ # get frame sizes
+ self.payloadSize = self._camera.PayloadSize
+ self.width = self._camera.Width
+ self.height = self._camera.Height
+
+ # frame structure
+ self._frame = structs.VimbaFrame()
+
+ def announceFrame(self):
+ """
+ Announce frames to the API that may be queued for frame capturing later.
+ """
+ # size of expected frame
+ sizeOfFrame = self.payloadSize
+
+ # keep this reference to keep block alive for life of frame
+ self._cMem = VimbaC_MemoryBlock(sizeOfFrame)
+ # set buffer to have length of expected payload size
+ self._frame.buffer = self._cMem.block
+
+ # set buffer size to expected payload size
+ self._frame.bufferSize = sizeOfFrame
+
+ errorCode = VimbaDLL.frameAnnounce(self._handle,
+ byref(self._frame),
+ sizeof(self._frame))
+ if errorCode != 0:
+ raise VimbaException(errorCode)
+
+ def revokeFrame(self):
+ """
+ Revoke a frame from the API.
+ """
+ errorCode = VimbaDLL.frameRevoke(self._handle,
+ byref(self._frame))
+ if errorCode != 0:
+ raise VimbaException(errorCode)
+
+ def queueFrameCapture(self):
+ """
+ Queue frames that may be filled during frame capturing.
+ """
+ errorCode = VimbaDLL.captureFrameQueue(self._handle,
+ byref(self._frame),
+ None) # callback not implemented, callback example in pico?
+ if errorCode != 0:
+ raise VimbaException(errorCode)
+
+ def waitFrameCapture(self, timeout = 2000):
+ """
+ Wait for a queued frame to be filled (or dequeued).
+ """
+ errorCode = VimbaDLL.captureFrameWait(self._handle,
+ byref(self._frame),
+ timeout)
+ if errorCode != 0:
+ raise VimbaException(errorCode)
+
+ # custom method for simplified usage
+ def getBufferByteData(self):
+ """
+ Retrieve buffer data in a useful format.
+
+ :returns: array -- buffer data.
+ """
+
+ # cast frame buffer memory contents to a usable type
+ data = cast(self._frame.buffer,
+ POINTER(c_ubyte * self.payloadSize))
+
+ # make array of c_ubytes from buffer
+ array = (c_ubyte * self.height * self.width).from_address(addressof(data.contents))
+
+ return array