36 """Alpao deformable mirror.
38 The Alpao mirrors support hardware triggers modes
39 `TriggerMode.ONCE` and `TriggerMode.START`. By default, they will
40 be set
for software triggering,
and trigger once.
43 serial_number: the serial number of the deformable mirror,
44 something like `
"BIL103"`.
47 _TriggerType_to_asdkTriggerIn = {
48 microscope.TriggerType.SOFTWARE: 0,
49 microscope.TriggerType.RISING_EDGE: 1,
50 microscope.TriggerType.FALLING_EDGE: 2,
53 _supported_TriggerModes = [
54 microscope.TriggerMode.ONCE,
55 microscope.TriggerMode.START,
59 def _normalize_patterns(patterns: numpy.ndarray) -> numpy.ndarray:
61 Alpao SDK expects values in the [-1 1] range, so we normalize
62 them
from the [0 1] range we expect
in our interface.
64 patterns = (patterns * 2) - 1
67 def _find_error_str(self) -> str:
68 """Get an error string from the Alpao SDK error stack.
71 A string with error message. An empty string
if there was
72 no error on the stack.
74 err_msg_buffer_len = 64
75 err_msg_buffer = ctypes.create_string_buffer(err_msg_buffer_len)
77 err = ctypes.pointer(asdk.UInt(0))
78 status = asdk.GetLastError(err, err_msg_buffer, err_msg_buffer_len)
79 if status == asdk.SUCCESS:
80 msg = err_msg_buffer.value
81 if len(msg) > err_msg_buffer_len:
83 msg += b
" (error code %i)" % (err.contents.value)
91 if status != asdk.SUCCESS:
94 raise exception_cls(msg)
96 def __init__(self, serial_number: str, **kwargs) ->
None:
97 super().__init__(**kwargs)
98 self.
_dm = asdk.Init(serial_number.encode())
101 "Failed to initialise connection: don't know why"
109 value = asdk.Scalar_p(asdk.Scalar())
110 status = asdk.Get(self.
_dm, b
"NbOfActuator", value)
117 def n_actuators(self) -> int:
121 def trigger_mode(self) -> microscope.TriggerMode:
125 def trigger_type(self) -> microscope.TriggerType:
128 def _do_apply_pattern(self, pattern: numpy.ndarray) ->
None:
130 data_pointer = pattern.ctypes.data_as(asdk.Scalar_p)
131 status = asdk.Send(self.
_dm, data_pointer)
137 "unsupported trigger of mode '%s' for Alpao Mirrors"
141 ttype == microscope.TriggerType.SOFTWARE
142 and tmode != microscope.TriggerMode.ONCE
145 "trigger mode '%s' only supports trigger type ONCE"
154 "unsupported trigger of type '%s' for Alpao Mirrors"
157 status = asdk.Set(self.
_dm, b
"TriggerIn", value)
168 patterns = numpy.atleast_2d(patterns)
169 n_patterns: int = patterns.shape[0]
179 n_repeats = n_patterns
186 "trigger type '%s' and trigger mode '%s' is not supported"
190 data_pointer = patterns.ctypes.data_as(asdk.Scalar_p)
194 status = asdk.Stop(self.
_dm)
197 status = asdk.SendPattern(
198 self.
_dm, data_pointer, n_patterns, n_repeats
202 def _do_shutdown(self) -> None:
203 status = asdk.Release(self.
_dm)
204 if status != asdk.SUCCESS: