diff --git a/examples/configs/eiger/eiger-trigger.yaml b/examples/configs/eiger/eiger-trigger.yaml new file mode 100644 index 00000000..198a7a91 --- /dev/null +++ b/examples/configs/eiger/eiger-trigger.yaml @@ -0,0 +1,9 @@ +- type: tickit.devices.signal_generator.EpicsSignalGenerator + name: gen + inputs: {} +- type: tickit_devices.eiger.Eiger + inputs: + trigger: + component: gen + port: gate + name: eiger diff --git a/src/tickit_devices/eiger/eiger.py b/src/tickit_devices/eiger/eiger.py index 3d294fc6..2db21978 100644 --- a/src/tickit_devices/eiger/eiger.py +++ b/src/tickit_devices/eiger/eiger.py @@ -150,6 +150,9 @@ async def abort(self) -> None: The detector will immediately stop acquiring frames and disarm itself. """ + self._abort() + + def _abort(self) -> None: self._set_state(State.IDLE) self.stream.end_series(self._series_id) @@ -176,7 +179,9 @@ def update(self, time: SimTime, inputs: Inputs) -> DeviceUpdate[Outputs]: LOGGER.debug("Ending Series...") self._set_state(State.IDLE) self.stream.end_series(self._series_id) - if inputs.get("trigger", False): + + trigger_high = inputs.get("trigger", False) + if trigger_high and self.settings.trigger_mode == "exts" and self._is_in_state(State.READY): self._begin_acqusition_mode() # Should have another update immediately to begin acquisition return DeviceUpdate(self.Outputs(), SimTime(time)) diff --git a/src/tickit_devices/eiger/eiger_settings.py b/src/tickit_devices/eiger/eiger_settings.py index fec60af9..078ee450 100644 --- a/src/tickit_devices/eiger/eiger_settings.py +++ b/src/tickit_devices/eiger/eiger_settings.py @@ -112,6 +112,9 @@ class EigerSettings: trigger_mode: str = field( default="exts", metadata=rw_str(allowed_values=["exts", "ints", "exte", "inte"]) ) + trigger_start_delay: float = field( + default=0.0, metadata=rw_float() + ) two_theta_increment: float = field(default=0.0, metadata=rw_float()) two_theta_start: float = field(default=0.0, metadata=rw_float()) wavelength: float = field(default=1.0, metadata=rw_float()) diff --git a/tests/eiger/test_eiger_adapters.py b/tests/eiger/test_eiger_adapters.py index 67958f80..3cc7b34c 100644 --- a/tests/eiger/test_eiger_adapters.py +++ b/tests/eiger/test_eiger_adapters.py @@ -7,6 +7,7 @@ def test_after_update(mocker: MockerFixture) -> None: test_data = [b"data", b"some more data"] # Mock consume_data to return with data the first time and nothing the second time + # Patch consume_data to return with data the first time and nothing the second time device_mock = mocker.MagicMock() device_mock.stream.consume_data.side_effect = [test_data, []] @@ -14,6 +15,7 @@ def test_after_update(mocker: MockerFixture) -> None: add_mock = mocker.patch.object(zmq_adapter, "add_message_to_stream") # Test after_update only calls add_message_to_stream with non-empty data + # First after_update should only call add_message_to_stream with non-empty data zmq_adapter.after_update() add_mock.assert_called_once_with(test_data) add_mock.reset_mock()