aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormorefigs <morefigs@gmail.com>2019-04-13 14:56:01 +1000
committermorefigs <morefigs@gmail.com>2019-04-13 14:56:01 +1000
commitadfda37f027d922bb99d28754b9bb50f204c2990 (patch)
tree38071646d79940f9953f6a4da62c3fc258c1a386
parent1f055ff6edebc43555748c168321c8605f6df818 (diff)
parent0848f627afd3d1dfd7f911e6c0ea2c7f39bcf655 (diff)
downloadpymba-adfda37f027d922bb99d28754b9bb50f204c2990.tar.gz
pymba-adfda37f027d922bb99d28754b9bb50f204c2990.zip
Merge branch 'dev' of github.com:morefigs/pymba into dev
-rw-r--r--pymba/camera.py57
1 files changed, 33 insertions, 24 deletions
diff --git a/pymba/camera.py b/pymba/camera.py
index da0f0fd..2fe0df5 100644
--- a/pymba/camera.py
+++ b/pymba/camera.py
@@ -95,10 +95,10 @@ class Camera(VimbaObject):
# remember state
self._is_armed = False
self._is_acquiring = False
- self._acquisition_mode = None
+ self._acquisition_mode = ''
- # frame to reuse when in single frame mode
- self._single_frame = None
+ self._frame_buffer = ()
+ self._frame_buffer_index = -1
# user registered callback function
self._user_callback = None
@@ -212,6 +212,7 @@ class Camera(VimbaObject):
self.AcquisitionMode = mode
self._acquisition_mode = mode
+ # todo refactor
if mode == SINGLE_FRAME:
self._arm_single_frame()
elif mode == CONTINUOUS:
@@ -221,12 +222,30 @@ class Camera(VimbaObject):
self._is_armed = True
- def _arm_single_frame(self) -> None:
- self._single_frame = self.new_frame()
- self._single_frame.announce()
+ def _arm_single_frame(self, frame_buffer_size: int) -> None:
+ # create frame buffer and announce frames to camera
+ self._frame_buffer_index = -1
+ self._frame_buffer = tuple(self.new_frame()
+ for _ in range(frame_buffer_size))
+ for frame in self._frame_buffer:
+ frame.announce()
+
+ self.start_capture()
+
+ def _arm_continuous(self, callback: Callable, frame_buffer_size: int) -> None:
+ self._user_callback = callback
+
+ # create frame buffer and announce frames to camera
+ self._frame_buffer = tuple(self.new_frame()
+ for _ in range(frame_buffer_size))
+ for frame in self._frame_buffer:
+ frame.announce()
self.start_capture()
+ for frame in self._frame_buffer:
+ frame.queue_for_capture(self._streaming_callback)
+
def acquire_frame(self, timeout_ms: Optional[int] = 2000) -> Frame:
"""
Acquire and return a single frame when the camera is armed in 'SingleFrame' acquisition
@@ -236,27 +255,17 @@ class Camera(VimbaObject):
if not self._is_armed or self._acquisition_mode != SINGLE_FRAME:
raise VimbaException(VimbaException.ERR_INVALID_CAMERA_MODE)
+ self._frame_buffer_index += 1
+ if self._frame_buffer_index <= len(self._frame_buffer):
+ self._frame_buffer_index = 0
+
# capture a single frame
- self._single_frame.queue_for_capture()
+ self._frame_buffer[self._frame_buffer_index].queue_for_capture()
self.AcquisitionStart()
- self._single_frame.wait_for_capture(timeout_ms)
+ self._frame_buffer[self._frame_buffer_index].wait_for_capture(timeout_ms)
self.AcquisitionStop()
- return self._single_frame
-
- def _arm_continuous(self, callback: Callable, frame_buffer_size: int) -> None:
- self._user_callback = callback
-
- # create frame buffer and announce frames to camera
- _frame_buffer = tuple(self.new_frame() for _ in range(frame_buffer_size))
- for frame in _frame_buffer:
- frame.announce()
-
- self.start_capture()
-
- # queue
- for frame in _frame_buffer:
- frame.queue_for_capture(self._streaming_callback)
+ return self._frame_buffer[self._frame_buffer_index]
def start_frame_acquisition(self) -> None:
"""
@@ -305,7 +314,7 @@ class Camera(VimbaObject):
self.flush_capture_queue()
self.revoke_all_frames()
- self._single_frame = None
+ self._frame_buffer = ()
# encourage garbage collection of frame buffer memory
gc.collect()