Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 80 additions & 59 deletions cuvis/AcquisitionContext.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import asyncio as a


class AcquisitionContext(object):
def __init__(self, base: Union[Calibration, SessionFile], *, simulate: bool = False):
self._handle = None
Expand All @@ -38,16 +39,14 @@ def __init__(self, base: Union[Calibration, SessionFile], *, simulate: bool = Fa
"Could not interpret input of type {}.".format(type(base)))
pass


@property
@copydoc(cuvis_il.cuvis_acq_cont_get_state)
def state(self) -> HardwareState:
val = cuvis_il.new_p_cuvis_hardware_state_t()
if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_get_state(
self._handle, val):
raise SDKException()
return internal.__HardwareState__[ cuvis_il.p_cuvis_hardware_state_t_value(val)]

return internal.__HardwareState__[cuvis_il.p_cuvis_hardware_state_t_value(val)]

@property
@copydoc(cuvis_il.cuvis_acq_cont_get_component_count)
Expand All @@ -62,7 +61,7 @@ def component_count(self) -> int:
def _get_component_online(self, idref: int) -> bool:
val = cuvis_il.new_p_int()
if cuvis_il.status_ok != cuvis_il.cuvis_comp_online_get(
self._handle,idref, val):
self._handle, idref, val):
raise SDKException()
return bool(cuvis_il.p_int_value(val))

Expand All @@ -73,7 +72,6 @@ def _get_component_info(self, idref: int) -> ComponentInfo:
self._handle, idref, ci):
raise SDKException()
return ComponentInfo._from_internal(ci)


@property
@copydoc(cuvis_il.cuvis_acq_cont_queue_size_get)
Expand Down Expand Up @@ -122,7 +120,7 @@ def operation_mode(self) -> OperationMode:
if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_operation_mode_get(
self._handle, val):
raise SDKException()
return internal.__OperationMode__[cuvis_il.p_cuvis_operation_mode_t_value(val)]
return internal.__OperationMode__[cuvis_il.p_cuvis_operation_mode_t_value(val)]

@operation_mode.setter
@copydoc(cuvis_il.cuvis_acq_cont_operation_mode_set)
Expand Down Expand Up @@ -236,29 +234,30 @@ def set_fps_async(self, val: float) -> Async:
return Async(cuvis_il.p_int_value(_pasync))

@property
@copydoc(cuvis_il.cuvis_acq_cont_get_pixel_format_swig)
def pixel_format(self, id: int) -> str:
return cuvis_il.cuvis_acq_cont_get_pixel_format_swig(self._handle, id)
@copydoc(cuvis_il.cuvis_comp_pixel_format_get_swig)
def _comp_pixel_format(self, id: int) -> str:
return cuvis_il.cuvis_comp_pixel_format_get_swig(self._handle, id)

@pixel_format.setter
@copydoc(cuvis_il.cuvis_acq_cont_fps_set)
def pixel_format(self, id: int, val: str) -> None:
if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_set_pixel_format(
self._handle, val):
@_comp_pixel_format.setter
@copydoc(cuvis_il.cuvis_comp_pixel_format_set)
def _comp_pixel_format(self, id: int, val: str) -> None:
if cuvis_il.status_ok != cuvis_il.cuvis_comp_pixel_format_set(
self._handle, id, val):
raise SDKException()
pass

@property
@copydoc(cuvis_il.cuvis_acq_cont_get_pixel_format_swig)
def available_pixel_formats(self, id: int) -> list[str]:
@copydoc(cuvis_il.cuvis_comp_available_pixel_format_get_swig)
def _comp_available_pixel_formats(self, id: int) -> list[str]:
pCount = cuvis_il.new_p_int()
if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_get_available_pixel_format_count(
if cuvis_il.status_ok != cuvis_il.cuvis_comp_available_pixel_format_count_get(
self._handle, id, pCount):
raise SDKException()
count = cuvis_il.p_int_value(pCount)
formats = []
for i in range(count):
formats.append(str(cuvis_il.cuvis_acq_cont_get_available_pixel_format_swig(self._handle, id, i)))
formats.append(
str(cuvis_il.cuvis_comp_available_pixel_format_get_swig(self._handle, id, i)))
return formats

@copydoc(cuvis_il.cuvis_acq_cont_has_next_measurement)
Expand Down Expand Up @@ -404,7 +403,7 @@ def bandwidth(self) -> int:

@property
@copydoc(cuvis_il.cuvis_acq_cont_auto_exp_get)
def auto_exp(self) -> bool :
def auto_exp(self) -> bool:
_ptr = cuvis_il.new_p_int()
if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_auto_exp_get(
self._handle, _ptr):
Expand All @@ -426,10 +425,10 @@ def set_auto_exp_async(self, val: bool) -> Async:
self._handle, _pasync, int(val)):
raise SDKException()
return Async(cuvis_il.p_int_value(_pasync))

@property
@copydoc(cuvis_il.cuvis_acq_cont_auto_exp_comp_get)
def auto_exp_comp(self) -> float :
def auto_exp_comp(self) -> float:
_ptr = cuvis_il.new_p_double()
if cuvis_il.status_ok != cuvis_il.cuvis_acq_cont_auto_exp_comp_get(
self._handle, _ptr):
Expand Down Expand Up @@ -476,39 +475,39 @@ def set_binning_async(self, val: bool) -> Async:
self._handle, _pasync, int(val)):
raise SDKException()
return Async(cuvis_il.p_int_value(_pasync))
def register_state_change_callback(self, callback: Callable[[HardwareState, list[tuple[str,bool]]], Awaitable[None]]) -> None:

def register_state_change_callback(self, callback: Callable[[HardwareState, list[tuple[str, bool]]], Awaitable[None]]) -> None:
"""

"""
self.reset_state_change_callback()

async def _internal_state_loop():
poll_time = 0.5
last_state = HardwareState.Offline
last_component_states = [(cmp.info.display_name, False)
for cmp in self.components()]
first_pending = True
while True:
state_changed = first_pending
first_pending = False

current_state = self.state
if last_state != current_state:
poll_time = 0.5
last_state = HardwareState.Offline
last_component_states = [(cmp.info.display_name, False)
for cmp in self.components()]
first_pending = True
while True:
state_changed = first_pending
first_pending = False

current_state = self.state
if last_state != current_state:
state_changed = True
last_state = current_state
for i, cmp in enumerate(self.components()):
comp_state = cmp.online()
last_comp_state = last_component_states[i][1]

if comp_state != last_comp_state:
state_changed = True
last_state = current_state
for i, cmp in enumerate(self.components()):
comp_state = cmp.online()
last_comp_state = last_component_states[i][1]

if comp_state != last_comp_state:
state_changed = True
last_component_states[i] = last_component_states[i][0] , comp_state
last_component_states[i] = last_component_states[i][0], comp_state

if state_changed:
await callback(last_state, last_component_states)
else:
await a.sleep(poll_time)
if state_changed:
await callback(last_state, last_component_states)
else:
await a.sleep(poll_time)

self._state_poll_task = a.create_task(_internal_state_loop())

Expand All @@ -520,17 +519,12 @@ def reset_state_change_callback(self) -> None:
self._state_poll_task.cancel()
self._state_poll_task = None






def components(self):
"""
Returns an iterator over all components
"""
for i in range(0, self.component_count):
yield Component(self,i)
yield Component(self, i)
pass

def __del__(self):
Expand All @@ -544,6 +538,7 @@ class Component:
"""

"""

def __init__(self, acq: AcquisitionContext, idx: int):
self._acq = acq
self._idx = idx
Expand All @@ -553,29 +548,55 @@ def __init__(self, acq: AcquisitionContext, idx: int):
@copydoc(cuvis_il.cuvis_comp_online_get)
def online(self) -> bool:
return self._acq._get_component_online(self._idx)

@property
@copydoc(cuvis_il.cuvis_comp_temperature_get)
def temperature(self) -> float:
return self._acq._get_temperature(self._idx)

@property
@copydoc(cuvis_il.cuvis_comp_gain_get)
def gain(self) -> float:
return self._acq._get_gain(self._idx)

@gain.setter
@copydoc(cuvis_il.cuvis_comp_gain_set)
def gain(self, val: float) -> None:
return self._acq._set_gain(self._idx, val)

@property
@copydoc(cuvis_il.cuvis_comp_integration_time_factor_get)
def integration_time_factor(self) -> float:
return self._acq._get_integration_time_factor(self._idx)

@integration_time_factor.setter
@copydoc(cuvis_il.cuvis_comp_integration_time_factor_set)
def integration_time_factor(self, val: float) -> None:
return self._acq._set_integration_time_factor(self._idx, val)


@property
@copydoc(cuvis_il.cuvis_comp_pixel_format_get_swig)
def pixel_format(self) -> str:
return cuvis_il.cuvis_comp_pixel_format_get_swig(self._handle, self._idx)

@pixel_format.setter
@copydoc(cuvis_il.cuvis_comp_pixel_format_set)
def pixel_format(self, val: str) -> None:
if cuvis_il.status_ok != cuvis_il.cuvis_comp_pixel_format_set(
self._handle, self._idx, val):
raise SDKException()
pass

@property
@copydoc(cuvis_il.cuvis_comp_available_pixel_format_get_swig)
def available_pixel_formats(self) -> list[str]:
pCount = cuvis_il.new_p_int()
if cuvis_il.status_ok != cuvis_il.cuvis_comp_available_pixel_format_count_get(
self._handle, self._idx, pCount):
raise SDKException()
count = cuvis_il.p_int_value(pCount)
formats = []
for i in range(count):
formats.append(
str(cuvis_il.cuvis_comp_available_pixel_format_get_swig(self._handle, self._idx, i)))
return formats
3 changes: 3 additions & 0 deletions cuvis/FileWriteSettings.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class GeneralExportSettings(object):
pan_scale: float = 0.0
pan_sharpening_interpolation_type: PanSharpeningInterpolationType = PanSharpeningInterpolationType.Linear
pan_sharpening_algorithm: PanSharpeningAlgorithm = PanSharpeningAlgorithm.CubertMacroPixel
pre_pan_sharpen_cube: bool = False
add_pan: bool = False
add_fullscale_pan: bool = False
permissive: bool = False
Expand All @@ -33,6 +34,7 @@ def _get_internal(self):
self.pan_sharpening_interpolation_type]
ge.pan_algorithm = internal.__CuvisPanSharpeningAlgorithm__[
self.pan_sharpening_algorithm]
ge.pre_pan_sharpen_cube = int(self.pre_pan_sharpen_cube)
ge.add_pan = int(self.add_pan)
ge.add_fullscale_pan = int(self.add_fullscale_pan)
ge.permissive = int(self.permissive)
Expand All @@ -47,6 +49,7 @@ def _from_internal(cls, ge):
ge.pan_interpolation_type],
pan_sharpening_algorithm=internal.__PanSharpeningAlgorithm__[
ge.pan_algorithm],
pre_pan_sharpen_cube=ge.pre_pan_sharpen_cube,
add_pan=bool(ge.add_pan),
add_fullscale_pan=bool(ge.add_fullscale_pan),
permissive=bool(ge.permissive))
Expand Down