diff options
| author | morefigs <morefigs@gmail.com> | 2013-12-24 20:13:04 -0800 |
|---|---|---|
| committer | morefigs <morefigs@gmail.com> | 2013-12-24 20:13:04 -0800 |
| commit | 7077dad4be8cf90cac838519f97231d4fb74715f (patch) | |
| tree | bf8ad08eb08c3b4f348fa1f597ea8bbe87862c1c | |
| parent | d82502ba8b484b297b33383c636618a4a617229d (diff) | |
| download | pymba-7077dad4be8cf90cac838519f97231d4fb74715f.tar.gz pymba-7077dad4be8cf90cac838519f97231d4fb74715f.zip | |
Create vimbaframe.py
| -rw-r--r-- | vimbaframe.py | 89 |
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 |
