From f81cfc87d4423ae75dd9337803d1c4d22ea61271 Mon Sep 17 00:00:00 2001 From: Philip Manke Date: Tue, 4 Feb 2025 19:31:17 +0100 Subject: [PATCH 1/3] add property 'ready' to acquisition_context --- cuvis/AcquisitionContext.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/cuvis/AcquisitionContext.py b/cuvis/AcquisitionContext.py index 4eb6198..bc007cf 100644 --- a/cuvis/AcquisitionContext.py +++ b/cuvis/AcquisitionContext.py @@ -20,6 +20,7 @@ def __init__(self, base: Union[Calibration, SessionFile], *, simulate: bool = Fa self._handle = None self._simulate = simulate self._state_poll_task = None + self._ready_poll_task = None if isinstance(base, Calibration): _ptr = cuvis_il.new_p_int() @@ -48,6 +49,14 @@ def state(self) -> HardwareState: raise SDKException() return internal.__HardwareState__[cuvis_il.p_cuvis_hardware_state_t_value(val)] + @property + @copydoc(cuvis_il.cuvis_acq_cont_get_state) + def ready(self) -> bool: + val = cuvis_il.new_p_int_t() + if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_ready_get(self._handle, val): + raise SDKException() + return bool(cuvis_il.p_cuvis_int_t_value(val)) + @property @copydoc(cuvis_il.cuvis_acq_cont_get_component_count) def component_count(self) -> int: @@ -479,6 +488,25 @@ def set_binning_async(self, val: bool) -> Async: raise SDKException() return Async(cuvis_il.p_int_value(_pasync)) + def register_ready_callback(self, callback: Callable[Awaitable[None]]) -> None: + + self.reset_ready_callback() + + async def _internal_state_loop(): + poll_time = 0.5 + while True: + if self.ready: + await callback() + else: + await a.sleep(poll_time) + + self._ready_poll_task = a.create_task(_internal_state_loop()) + + def reset_ready_callback(self) -> None: + if self._ready_poll_task is not None: + self._ready_poll_task.cancel() + self._ready_poll_task = None + def register_state_change_callback(self, callback: Callable[[HardwareState, list[tuple[str, bool]]], Awaitable[None]]) -> None: """ From 801f59e065383669e943a4a7a55d5653f684a179 Mon Sep 17 00:00:00 2001 From: Philip Manke Date: Wed, 5 Feb 2025 12:44:30 +0100 Subject: [PATCH 2/3] Fix infinite callback --- cuvis/AcquisitionContext.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cuvis/AcquisitionContext.py b/cuvis/AcquisitionContext.py index bc007cf..f062d28 100644 --- a/cuvis/AcquisitionContext.py +++ b/cuvis/AcquisitionContext.py @@ -497,6 +497,7 @@ async def _internal_state_loop(): while True: if self.ready: await callback() + break else: await a.sleep(poll_time) From 0b1cbd48b55a81365496dd0a46c5aeec5f51ba9d Mon Sep 17 00:00:00 2001 From: Philip Manke Date: Thu, 6 Feb 2025 14:10:01 +0100 Subject: [PATCH 3/3] fix types and naming --- cuvis/AcquisitionContext.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/cuvis/AcquisitionContext.py b/cuvis/AcquisitionContext.py index f062d28..ccbc594 100644 --- a/cuvis/AcquisitionContext.py +++ b/cuvis/AcquisitionContext.py @@ -50,12 +50,12 @@ def state(self) -> HardwareState: return internal.__HardwareState__[cuvis_il.p_cuvis_hardware_state_t_value(val)] @property - @copydoc(cuvis_il.cuvis_acq_cont_get_state) + @copydoc(cuvis_il.cuvis_acq_cont_ready_get) def ready(self) -> bool: - val = cuvis_il.new_p_int_t() + val = cuvis_il.new_p_int() if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_ready_get(self._handle, val): raise SDKException() - return bool(cuvis_il.p_cuvis_int_t_value(val)) + return bool(cuvis_il.p_int_value(val)) @property @copydoc(cuvis_il.cuvis_acq_cont_get_component_count) @@ -488,11 +488,10 @@ def set_binning_async(self, val: bool) -> Async: raise SDKException() return Async(cuvis_il.p_int_value(_pasync)) - def register_ready_callback(self, callback: Callable[Awaitable[None]]) -> None: - + def register_ready_callback(self, callback: Callable[None, Awaitable[None]]) -> None: self.reset_ready_callback() - async def _internal_state_loop(): + async def _internal_ready_loop(): poll_time = 0.5 while True: if self.ready: @@ -501,7 +500,7 @@ async def _internal_state_loop(): else: await a.sleep(poll_time) - self._ready_poll_task = a.create_task(_internal_state_loop()) + self._ready_poll_task = a.create_task(_internal_ready_loop()) def reset_ready_callback(self) -> None: if self._ready_poll_task is not None: