Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Eiger-Device (Exts logic) #55

Closed
wants to merge 207 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
207 commits
Select commit Hold shift + click to select a range
b0b85b4
Imitial commit
OCopping Sep 30, 2021
383fe38
Added Eiger device class and adapter based on ExampleHTTPDevice
OCopping Sep 30, 2021
83d3a16
Merge remote-tracking branch 'origin/master' into Eiger-Device
OCopping Sep 30, 2021
5395e0f
Interim commit
OCopping Sep 30, 2021
50af7c7
Created EigerConfig for config params, and added it to Eiger device c…
OCopping Sep 30, 2021
e0d397b
Added EigerConfig dataclass to contain the configuration variables of…
OCopping Oct 1, 2021
014cd71
Added PUT endpoint for setting config vars for the Eiger; Changed 'co…
OCopping Oct 1, 2021
918db9d
Fix docstrings
OCopping Oct 1, 2021
e549172
Fix docstrings
OCopping Oct 1, 2021
1474157
Renamed EigerConfig to EigerSettings as to not overload auto-config g…
OCopping Oct 1, 2021
fe1601d
Changed try/except blocks to be ifs with hasattr
OCopping Oct 4, 2021
9fb7b8e
Edited eiger_settings to use same layout as Callum's old eiger_sim pr…
OCopping Oct 4, 2021
a6aef91
Interim commit
OCopping Oct 4, 2021
3a24471
Interim commit
OCopping Oct 4, 2021
3124b35
Added EigerStatus dataclass to store status variables and added it to…
OCopping Oct 4, 2021
ff71cd4
Added basic Eiger command functions and endpoints
OCopping Oct 5, 2021
1f9a968
Added get_status() func; Added changing config check to make sure Eig…
OCopping Oct 5, 2021
7160fff
Minor change to trigger()
OCopping Oct 5, 2021
a1ad19a
Interim commit with added element K-alpha energies
OCopping Oct 7, 2021
fa74485
Merge remote-tracking branch 'origin/master' into Eiger-Device
OCopping Oct 7, 2021
dff2ae9
Added pytest-aiohttp to dev-packages
OCopping Oct 8, 2021
93cd0e9
Added some tests for Eiger and EigerAdapter
OCopping Oct 11, 2021
efd69fd
Added more tests for EigerAdapter endpoints
OCopping Oct 11, 2021
a3a7609
Added tests for Eiger device
OCopping Oct 11, 2021
5551339
Added tests for Eiger trigger()
OCopping Oct 11, 2021
1f70d59
Resolved some review changes
OCopping Oct 11, 2021
7850a10
Put some values inside of Enums
OCopping Oct 11, 2021
c4c7b42
Added type hints to test funcs
OCopping Oct 11, 2021
e19f7fa
Update tickit/devices/eiger/eiger.py
OCopping Oct 11, 2021
b566bfc
Resolved some review comments
OCopping Oct 11, 2021
6b4ce90
Minor changes
OCopping Oct 11, 2021
f5d0915
Made soome changes to tests: Parametrized some tests as were very sim…
OCopping Oct 12, 2021
dff60f7
Merge with master after #27 merge
OCopping Oct 12, 2021
a5f5729
Interim commit
OCopping Oct 12, 2021
6c18535
Moved all EigerAdapter command tests into one parametrized test (apar…
OCopping Oct 12, 2021
8715621
Removed 'foo' and 'bar' references from example yaml
OCopping Oct 12, 2021
4e22ea8
Interim commit
OCopping Oct 12, 2021
005c569
Added setter logic for 'element' config var to also change 'photon_en…
OCopping Oct 12, 2021
669d79a
Edited Eiger objects to no longer use getattr and have custom __getit…
OCopping Oct 12, 2021
1d52837
Fixed tests to work with new __getitem__ funcs in settings and status
OCopping Oct 13, 2021
ac2f4e2
Changed __getitem__ methods to use 'fields' instead of 'asdict', and …
OCopping Oct 13, 2021
a83abc5
Added tests for funcs in EigerSettings and EigerStatus
OCopping Oct 13, 2021
a258045
[WIP] Made changes to Eiger scripts to comply with ODN
OCopping Oct 14, 2021
9a2074d
[WIP] Made example ZeroMQ Adapter (hasn't been tested yet)
OCopping Oct 15, 2021
77900cb
Interim commit
OCopping Oct 15, 2021
24e999a
[WIP] Rewrote ZeroMQAdapter (still not tested as yaml doesn't work); …
OCopping Oct 15, 2021
a4b5d20
Minor changes to zmq files
OCopping Oct 18, 2021
91d0e06
Made an example ZeroMQ stream and adapter, as well as a yaml to run them
OCopping Oct 18, 2021
d1c2bcf
Changed name from ZMQStream to ZeroMQStream to me consistent
OCopping Oct 18, 2021
5044e07
Updated eiger.yaml to allow it to connect to ODN
OCopping Oct 18, 2021
50d1ce4
Changed async time sleep to 1s from 2s
OCopping Oct 18, 2021
19de1cd
Added some tests for zmqadapter
OCopping Oct 18, 2021
41966cc
Added some initial files for the EigerStream, to be developed more on…
OCopping Oct 18, 2021
9c9a859
Removed ZeroMQStream and replaced it with more generic example Counte…
OCopping Oct 19, 2021
b5df7b6
Added temp workaround to stream not being fully set up when data is r…
OCopping Oct 20, 2021
99737cf
Minor fix to eiger test
OCopping Oct 20, 2021
9c35115
Added tests for ZeroMQAdapter
OCopping Oct 20, 2021
1d7eac4
Changed the ZeroMQAdapter device type to Device from Counter to allow…
OCopping Oct 20, 2021
02d460c
Buffer data for ZMQ with an asyncio Queue (#32)
callumforrester Oct 20, 2021
576ed38
Fixed tests for Eiger
OCopping Oct 20, 2021
d5bc16f
Fixed Eiger and EigerSettings tests to work with the json_response me…
OCopping Oct 21, 2021
c9b872f
Some changes to get_config and minor fix to put_config
OCopping Oct 21, 2021
1487a60
Reverted fix to put_config as the issue wasn't in there it was a test
OCopping Oct 21, 2021
17fe2a4
Made some changes to test_zmq_adapter to take into account some chann…
OCopping Oct 21, 2021
d68e289
Edited Eiger tests to work with some of the changes for ODN
OCopping Oct 21, 2021
7106b0e
Edited docstrings of Counter
OCopping Oct 21, 2021
5a40118
Merged with master, minus the removal of HTTPServer and its tests
OCopping Oct 21, 2021
ad7c5dc
Resolved conflicts in Pipfile.lock
OCopping Oct 22, 2021
9cfa5eb
Relocked pipfile.lock
OCopping Oct 22, 2021
fc77d0b
Realised why the http server scripts were deleted (everything merged …
OCopping Oct 22, 2021
44e4845
Changes to Pipfile.lock?
OCopping Oct 22, 2021
f62639f
Merged with master
OCopping Oct 22, 2021
46b8ef5
Updated Eiger scripts to conform with new framework changes, and upda…
OCopping Oct 22, 2021
056c758
Edited Counter to conform to new framework changes
OCopping Oct 22, 2021
0283997
Merge branch 'master' into Eiger-Device
OCopping Oct 22, 2021
e35c836
Didn't add Eiger test files to last commit
OCopping Oct 22, 2021
ecc17aa
Made ZeroMQAdapter generic, moved the after_update() function into ne…
OCopping Oct 22, 2021
8b7634b
Fixed ZMQAdapter by adding a super().run_forever()
OCopping Oct 25, 2021
eb441a5
Removed all device instances when testing ZMQAdapter, as it isn't nee…
OCopping Oct 25, 2021
5870756
Locked aiozmq version
OCopping Oct 25, 2021
2cc8f26
Locked pyzmq version
OCopping Oct 25, 2021
7cf8137
Merge remote-tracking branch 'origin/master' into Eiger-Device
OCopping Oct 25, 2021
5b008b1
Renamed the host and port in ZeroMQAdapter to zmq_host and zmq_port t…
OCopping Oct 25, 2021
8abf4de
Updated the Eiger stream files so that they are now barebones enough …
OCopping Oct 25, 2021
cb21118
Created Eiger monitor files which are barebones enough for ODN to rec…
OCopping Oct 25, 2021
9c5dcad
Implemented the barebones Eiger stream and monitor into EigerDevice a…
OCopping Oct 25, 2021
f8caf45
Made barebones FileWriter scripts for the Eiger, and implemented them…
OCopping Oct 26, 2021
3bb6e63
Added a few more endpoints and made a few minor changes to make ODN h…
OCopping Oct 26, 2021
ff18fc9
Changed the name of host and port in ZeroMQAdapter to zmq_host and zm…
OCopping Oct 26, 2021
02509f8
Added json string generation for the commands to be used by EigerStre…
OCopping Oct 26, 2021
e969192
Using some code from Callum's old Eiger sim, can now generate 'dummy'…
OCopping Oct 27, 2021
10a9f1a
Removed usused import
OCopping Oct 27, 2021
6bfa087
Made changes to separate out the ZeroMQ adapter into its own Eiger su…
OCopping Oct 27, 2021
89ac94a
Edited tests to take into account the changes to Eiger's adapters
OCopping Oct 27, 2021
b94bef5
minor change to docstring
OCopping Oct 27, 2021
035c253
Minor change to test
OCopping Oct 27, 2021
bd461ca
Added more tests for Eiger
OCopping Oct 27, 2021
3abea86
Minor deprication change
OCopping Oct 27, 2021
db2a42c
Minor deprication change
OCopping Oct 27, 2021
3fd7916
Made all the dataclasses into normal classes with __init__s to fix my…
OCopping Oct 27, 2021
067de71
Moved all sub-devices into Eiger as were causing errors; minor change…
OCopping Oct 27, 2021
b1aa37b
Added some tests to status and config sub-objects of Eiger
OCopping Oct 28, 2021
249b6ee
Changed the HTTP host to work with ODN
OCopping Nov 2, 2021
0637f7c
Merge remote-tracking branch 'origin/master' into Eiger-Device
OCopping Nov 2, 2021
bb3b288
Changed value to initial value in counter.py; Removed getter and sett…
OCopping Nov 5, 2021
3041100
Removed commented out tests that don't work
OCopping Nov 5, 2021
cf43c80
Removed commented out tests
OCopping Nov 5, 2021
e33ec42
Added self to LOGGER output
OCopping Nov 5, 2021
727c8f6
Removed commented out code
OCopping Nov 5, 2021
71b22bf
Update tickit/devices/eiger/data/dummydata.py
OCopping Nov 5, 2021
d23a420
Removed comments
OCopping Nov 5, 2021
d6f6fe4
Changed some LOGGER calls from info to debug
OCopping Nov 5, 2021
7094400
Renamed test_zmq_adapter to test_zmqadapter
OCopping Nov 5, 2021
a28bb1a
Changed some LOGGER calls from info to debug
OCopping Nov 5, 2021
c29c9be
Removed unnecessary comments
OCopping Nov 5, 2021
3f58c65
Removed unused imports and code
OCopping Nov 5, 2021
584aae5
Removed unused imports
OCopping Nov 5, 2021
5014358
Removed unnecessary 'continue'; Removed unnecessary comment
OCopping Nov 5, 2021
18e41b2
Update tickit/devices/eiger/eiger_status.py
OCopping Nov 5, 2021
ce2df68
Merge branch 'Eiger-Device' of https://github.com/dls-controls/tickit…
OCopping Nov 5, 2021
a3c388d
Renamed some json strings to be more meaningful
OCopping Nov 5, 2021
d3ea176
Added type hints to run_forever
OCopping Nov 5, 2021
7126e5b
Moved some comments into a docstring
OCopping Nov 5, 2021
065a04e
Removed some comments
OCopping Nov 5, 2021
5211762
Changed a LOGGER warning to debug
OCopping Nov 5, 2021
1d5403b
Update tickit/devices/eiger/eiger.py
OCopping Nov 5, 2021
efcde48
Merge remote-tracking branch 'origin/master' into Eiger-Device
OCopping Nov 5, 2021
40f6170
Fixed docstring for counter
OCopping Nov 5, 2021
51ec088
Merged with master branch
OCopping Nov 9, 2021
9a9b2eb
Added system tests for sub devices of Eiger
OCopping Nov 9, 2021
5909e7a
Added threshold energy setting when changing element; removed some TODOs
OCopping Nov 9, 2021
44a7207
Removed TODO
OCopping Nov 9, 2021
32146d3
Made some changes to zmqadapter.py to allow for better testing, and a…
OCopping Nov 10, 2021
d329581
Made more changes to zmqadapter to allow for better testing, added fi…
OCopping Nov 10, 2021
178eb90
Merge remote-tracking branch 'origin/master' into Eiger-Device
OCopping Nov 11, 2021
56b1c8c
Changed HTTP host back to localhost (0.0.0.0 only needed for ODN)
OCopping Nov 11, 2021
3998cc6
Reworked EigerSettings to have a __setitem__ and minor changes to Eiger
OCopping Nov 11, 2021
4d53ad1
Reworked how the dummy image class is structured
OCopping Nov 11, 2021
573ed35
Changed back to hasattr in the put_config method
OCopping Nov 11, 2021
68bf6be
Reworked eiger_settings to only use getitem and setitem, removed prop…
OCopping Nov 11, 2021
40560db
Reworked some Eiger test files to work properly and not error out; Ch…
OCopping Nov 11, 2021
ce603e7
Added #noqa to magic methods
OCopping Nov 11, 2021
acc7627
Added docstrings to zmqadapter functions.
OCopping Nov 11, 2021
1b34650
Added some docstrings; Added some #noqa declarations; Removed some te…
OCopping Nov 11, 2021
c02c56e
Added Source and Shutter to eiger.yaml to simulate a beam, and added …
OCopping Nov 12, 2021
7d790c9
Made new eiger.yaml for testing and one that uses a shutter
OCopping Nov 12, 2021
f810684
Removed the deduce_encoding function just hard-coded the encoding in …
OCopping Nov 12, 2021
9caad28
Added Eiger basic configuration to CHANGELOG.rst
OCopping Nov 12, 2021
e8c3de4
Update CHANGELOG.rst
OCopping Nov 16, 2021
a756d04
Removed commented out lines
OCopping Nov 16, 2021
999b424
Removed 'just in case' sets in tests
OCopping Nov 16, 2021
4bb0a21
Added trigger endpoint to system test
OCopping Nov 16, 2021
ff49e17
Merge branch 'Eiger-Device' of https://github.com/dls-controls/tickit…
OCopping Nov 16, 2021
1df3dcb
Updated apischema in setup.cfg to allow for merging
OCopping Nov 16, 2021
070b48b
Moved Eiger's adapters into separate files (same with tests)
OCopping Nov 16, 2021
ebabdc3
Merge remote-tracking branch 'origin/master' into Eiger-Device
OCopping Nov 17, 2021
2fab8d9
Added type hints to update now typing is fixed
OCopping Nov 17, 2021
6189ca2
Removed callback period from Eiger update()
OCopping Nov 17, 2021
174faaa
Added '' to allowed element values as if photon energy is manually se…
OCopping Nov 17, 2021
c292170
Made other 'allowed_values' into sets
OCopping Nov 17, 2021
90172da
Added more parameter dependencies
OCopping Nov 17, 2021
e82bd6e
Reworked element dependency setting
OCopping Nov 17, 2021
1144508
Added tests for new dependency setters
OCopping Nov 17, 2021
60e63ed
Fixed merging conflicts
OCopping Nov 17, 2021
46a211d
Fixed more merging issues
OCopping Nov 17, 2021
18e8d40
Added warning about flatfield not being recalculated
OCopping Nov 18, 2021
f97463b
Added datetimes to image json strings
OCopping Nov 18, 2021
95c74ab
[WIP] Added raise_interrupt to trigger endpoint, and trying to test i…
OCopping Nov 18, 2021
a03bda8
Fix HTTPAdater and Eiger triggering (#50)
callumforrester Nov 18, 2021
f59e40c
Merge remote-tracking branch 'origin/master' into Eiger-Device
OCopping Nov 22, 2021
da52e14
Shortened comment as it was too long
OCopping Nov 22, 2021
95699a6
Added PUT endpoints to sub devices of Eiger
OCopping Nov 22, 2021
b9a3d47
Changed metadata for flatfield and pixel_mask
OCopping Nov 22, 2021
f15c922
Minor cchange to get_config()
OCopping Nov 22, 2021
866a02f
Added more global header json strings
OCopping Nov 22, 2021
17cf36c
Added __setitem__ to Eiger sub device config and status objects
OCopping Nov 23, 2021
76f8ca5
Removed PUT endpoints for sub device status objects
OCopping Nov 23, 2021
f2e3a63
Removed __setitem__ functions from sub device status objects
OCopping Nov 23, 2021
d30d5ac
Reworked PUT functions to return arrays instead of SequenceComplete
OCopping Nov 23, 2021
c41fbad
Changed tests to account for PUT returning arrays now
OCopping Nov 23, 2021
81c9501
Reworked eiger_adapters PUT endpoints to return arrays instead of Seq…
OCopping Nov 23, 2021
d660d80
Added tests for update() in Eiger
OCopping Nov 25, 2021
1381ac5
Added decorator to Value to fix connection to ODN
OCopping Nov 25, 2021
0d59418
Added tests for put_config funcs for sub devices of Eiger
OCopping Nov 25, 2021
152971f
Reworked some code to set dependencies into its own function when set…
OCopping Nov 25, 2021
d07b454
Fix for ODN with sequence id when arming Eiger
OCopping Nov 26, 2021
f5b503b
Fixed tests after sequence id fix; added noqa: D102 to sequence_id pr…
OCopping Nov 26, 2021
c1c6024
Minor change to Value object to include allowed values if present (mi…
OCopping Nov 29, 2021
50e9345
Reworked all GET enpoints to use new 'construct_value()' func to make…
OCopping Nov 29, 2021
411fcc3
Reordered the header detail allowed values to be in the same order as…
OCopping Nov 30, 2021
7effbe8
Changed wavelength to be in units of Angstrom as in ODN
OCopping Nov 30, 2021
72f10f8
Fixed tests for EigerSettings and wavelength change
OCopping Nov 30, 2021
f8f114e
Added schema for frame header and data blobs
OCopping Nov 30, 2021
72fd1f2
Reordered EigerMonitor mode allowed_values
OCopping Dec 8, 2021
9312946
Added fmt_json function
OCopping Dec 8, 2021
2cb766f
Changed zmqadapter to use PUSH instead of router and dealer, and rewo…
OCopping Dec 13, 2021
752d728
Removed code to convert to iterable as byestrings are iterable so wou…
OCopping Dec 13, 2021
87aebb7
Fixed tests for zmqadapter.py
OCopping Dec 13, 2021
b8b04c5
Removed formatting.py as not used
OCopping Dec 13, 2021
3c28727
Added frame queueing logic for update function once aquisition start…
OCopping Dec 13, 2021
74aa02c
Edited trigger endpoint to block until aquisition finished; edited Ei…
OCopping Dec 13, 2021
58099bc
Fixed tests for eiger and eiger_adapter
OCopping Dec 14, 2021
191469c
Added docstring to finished_aquisition property
OCopping Dec 14, 2021
432bf95
Fix pydocstyle docstring complaint
OCopping Dec 14, 2021
56ede52
Moved some code around to make neater and prepare for exts logic (mov…
OCopping Dec 15, 2021
9a18314
Added typehints to some vars
OCopping Dec 15, 2021
a6b0a64
Merge branch 'Eiger-Device' into Exts-Logic
OCopping Dec 15, 2021
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
7 changes: 7 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@
"module":"tickit",
"args": ["all", "examples/configs/sunk-tcp.yaml"]
},
{
"name":"Eiger",
"type":"python",
"request":"launch",
"module":"tickit",
"args": ["all", "examples/configs/eiger.yaml"]
},
{
"name":"Nested",
"type":"python",
Expand Down
9 changes: 6 additions & 3 deletions tests/adapters/test_httpadapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class MockAdapter(HTTPAdapter):

device: Device

@HTTPEndpoint.get("/mock_endpoint")
@HTTPEndpoint.get("/mock_endpoint", interrupt=True)
async def mock_endpoint(request: web.Request) -> web.Response:
return web.Response(text="test")

Expand Down Expand Up @@ -63,9 +63,12 @@ async def test_http_adapter_run_forever_method(


@pytest.mark.asyncio
async def test_http_adapter_endpoints():
async def test_http_adapter_endpoints(
mock_device: Device, mock_raise_interrupt: Mock, patch_asyncio_event_wait: Mock
):

adapter = MockAdapter()
adapter = MockAdapter(port=8081)
await adapter.run_forever(mock_device, mock_raise_interrupt)

resp = await list(adapter.endpoints())[0].handler()

Expand Down
22 changes: 7 additions & 15 deletions tests/adapters/test_zmqadapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,7 @@ async def _process_message_queue():
@pytest.fixture
def zeromq_adapter() -> ZeroMQAdapter:
zmq_adapter = ZeroMQAdapter()
zmq_adapter._dealer = AsyncMock()
zmq_adapter._router = AsyncMock()
zmq_adapter._socket = AsyncMock()
zmq_adapter._message_queue = Mock(asyncio.Queue)
return zmq_adapter

Expand All @@ -49,8 +48,7 @@ def test_zeromq_adapter_constructor():
async def test_zeromq_adapter_start_stream(zeromq_adapter):
await zeromq_adapter.start_stream()

assert isinstance(zeromq_adapter._router, aiozmq.stream.ZmqStream)
assert isinstance(zeromq_adapter._dealer, aiozmq.stream.ZmqStream)
assert isinstance(zeromq_adapter._socket, aiozmq.stream.ZmqStream)

await zeromq_adapter.close_stream()

Expand All @@ -62,8 +60,7 @@ async def test_zeromq_adapter_close_stream(zeromq_adapter):
await zeromq_adapter.close_stream()
await asyncio.sleep(0.1)

assert None is zeromq_adapter._router._transport
assert None is zeromq_adapter._dealer._transport
assert None is zeromq_adapter._socket._transport


@pytest.mark.asyncio
Expand All @@ -80,7 +77,7 @@ async def test_zeromq_adapter_send_message(zeromq_adapter):
zeromq_adapter.send_message(mock_message)
task = asyncio.current_task()
asyncio.gather(task)
zeromq_adapter._message_queue.put.assert_called_once()
zeromq_adapter._message_queue.put_nowait.assert_called_once()


@pytest.mark.asyncio
Expand Down Expand Up @@ -118,24 +115,19 @@ async def test_zeromq_adapter_process_message_queue(zeromq_adapter):
@pytest.mark.asyncio
async def test_zeromq_adapter_process_message(zeromq_adapter):

mock_message = "test"

zeromq_adapter._dealer.read.return_value = ("Data", "test")
zeromq_adapter._router.read.return_value = ("Data", "test")
mock_message = [b"test"]

await zeromq_adapter._process_message(mock_message)

zeromq_adapter._dealer.read.assert_awaited_once()
zeromq_adapter._router.read.assert_awaited_once()
zeromq_adapter._socket.write.assert_called_once()


@pytest.mark.asyncio
async def test_zeromq_adapter_process_message_no_message(zeromq_adapter, caplog):

mock_message = None

zeromq_adapter._dealer.read.return_value = ("Data", None)
zeromq_adapter._router.read.return_value = ("Data", None)
zeromq_adapter._socket.read.return_value = ("Data", None)

with caplog.at_level(logging.DEBUG):
await zeromq_adapter._process_message(mock_message)
Expand Down
43 changes: 43 additions & 0 deletions tests/devices/eiger/test_eiger.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import pytest

from tickit.core.device import DeviceUpdate
from tickit.core.typedefs import SimTime
from tickit.devices.eiger.eiger import EigerDevice
from tickit.devices.eiger.eiger_status import State

Expand All @@ -22,6 +24,8 @@ async def test_eiger_initialize(eiger: EigerDevice):

@pytest.mark.asyncio
async def test_eiger_arm(eiger: EigerDevice):
eiger.stream_config.header_detail = "all"

await eiger.arm()

assert State.READY.value == eiger.get_state()["value"]
Expand Down Expand Up @@ -97,3 +101,42 @@ def test_eiger_set_state(eiger: EigerDevice):
eiger._set_state(State.IDLE)

assert State.IDLE.value == eiger.get_state()["value"]


def test_eiger_update_not_aquiring(eiger: EigerDevice):

eiger._set_state(State.IDLE)

time = None
device_input = {"bleep", "bloop"}

update: DeviceUpdate = eiger.update(time, device_input)
assert update.outputs == {}


def test_eiger_update_aquiring(eiger: EigerDevice):

eiger._set_state(State.ACQUIRE)

eiger._num_frames_left = 1

time = SimTime(int(1e8))
device_input = {"bleep", "bloop"}

update: DeviceUpdate = eiger.update(time, device_input)
assert update.outputs == {}


def test_eiger_update_aquiring_no_frames_left(eiger: EigerDevice):

eiger._set_state(State.ACQUIRE)

eiger._num_frames_left = 0

time = None
device_input = {"bleep", "bloop"}

update: DeviceUpdate = eiger.update(time, device_input)

assert eiger.get_state()["value"] == State.IDLE.value
assert update.outputs == {}
66 changes: 56 additions & 10 deletions tests/devices/eiger/test_eiger_adapters.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ def mock_request():
async def test_eiger_system(tickit_task):

commands = {
"initialize": {"sequence_id": 1},
"disarm": {"sequence_id": 3},
"cancel": {"sequence_id": 5},
"abort": {"sequence_id": 6},
"initialize": {"sequence id": 1},
"disarm": {"sequence id": 3},
"cancel": {"sequence id": 5},
"abort": {"sequence id": 6},
}

url = "http://0.0.0.0:8081/detector/api/1.8.0/"
Expand All @@ -90,7 +90,7 @@ async def get_status(status, expected):
async with session.put(
url + "config/element", headers=headers, data=data
) as resp:
assert json.loads(str(await resp.text())) == {"sequence_id": 7}
assert json.loads(str(await resp.text())) == []

# Test each command
for key, value in commands.items():
Expand All @@ -117,7 +117,7 @@ async def get_status(status, expected):
async with session.put(
url + "config/doesnt_exist", headers=headers, data=data
) as resp:
assert json.loads(str(await resp.text())) == {"sequence_id": 9}
assert json.loads(str(await resp.text())) == []

async with session.get(url + "config/element") as resp:
assert json.loads(str(await resp.text()))["value"] == "Co"
Expand All @@ -126,31 +126,77 @@ async def get_status(status, expected):
async with session.put(
url + "config/element", headers=headers, data=data
) as resp:
assert json.loads(str(await resp.text())) == {"sequence_id": 8}
assert json.loads(str(await resp.text())) == ["element"]

async with session.get(url + "config/photon_energy") as resp:
assert json.loads(str(await resp.text()))["value"] == 54.3
assert 54.3 == json.loads(str(await resp.text()))["value"]

async with session.get(filewriter_url + "config/mode") as resp:
assert "enabled" == json.loads(str(await resp.text()))["value"]

data = '{"value": "enabled"}'
async with session.put(
filewriter_url + "config/mode", headers=headers, data=data
) as resp:
assert ["mode"] == json.loads(str(await resp.text()))

data = '{"value": "test"}'
async with session.put(
filewriter_url + "config/test", headers=headers, data=data
) as resp:
assert [] == json.loads(str(await resp.text()))

async with session.get(filewriter_url + "status/state") as resp:
assert "ready" == json.loads(str(await resp.text()))["value"]

async with session.get(monitor_url + "config/mode") as resp:
assert "enabled" == json.loads(str(await resp.text()))["value"]

data = '{"value": "enabled"}'
async with session.put(
monitor_url + "config/mode", headers=headers, data=data
) as resp:
assert ["mode"] == json.loads(str(await resp.text()))

data = '{"value": "test"}'
async with session.put(
monitor_url + "config/test", headers=headers, data=data
) as resp:
assert [] == json.loads(str(await resp.text()))

async with session.get(monitor_url + "status/error") as resp:
assert [] == json.loads(str(await resp.text()))["value"]

async with session.get(stream_url + "config/mode") as resp:
assert "enabled" == json.loads(str(await resp.text()))["value"]

data = '{"value": "enabled"}'
async with session.put(
stream_url + "config/mode", headers=headers, data=data
) as resp:
assert ["mode"] == json.loads(str(await resp.text()))

data = '{"value": "test"}'
async with session.put(
stream_url + "config/test", headers=headers, data=data
) as resp:
assert [] == json.loads(str(await resp.text()))

data = '{"value": "ints"}'
async with session.put(
url + "config/trigger_mode", headers=headers, data=data
) as resp:
assert ["trigger_mode"] == json.loads(str(await resp.text()))

async with session.get(stream_url + "status/state") as resp:
assert "ready" == json.loads(str(await resp.text()))["value"]

assert get_status(status="state", expected="idle")

async with session.put(url + "command/arm") as resp:
assert {"sequence_id": 2} == json.loads(str(await resp.text()))
assert {"sequence id": 2} == json.loads(str(await resp.text()))

assert get_status(status="state", expected="ready")

async with session.put(url + "command/trigger") as resp:
assert {"sequence_id": 4} == json.loads(str(await resp.text()))
assert {"sequence id": 4} == json.loads(str(await resp.text()))
30 changes: 30 additions & 0 deletions tests/devices/eiger/test_eiger_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,33 @@ def test_eiger_settings_set_element(eiger_settings):

assert "Li" == eiger_settings.element
assert KA_Energy["Li"].value == eiger_settings.photon_energy
assert (1240 / eiger_settings.photon_energy) / 10 == eiger_settings.wavelength
assert 0.5 * eiger_settings.photon_energy == eiger_settings.threshold_energy


def test_eiger_settings_set_photon_energy(eiger_settings):
eiger_settings["photon_energy"] = 1000.0

assert 1000.0 == eiger_settings.photon_energy
assert "" == eiger_settings.element
assert (1240 / eiger_settings.photon_energy) / 10 == eiger_settings.wavelength
assert 0.5 * eiger_settings.photon_energy == eiger_settings.threshold_energy


def test_eiger_settings_set_wavelength(eiger_settings):
eiger_settings["wavelength"] = 1.24

assert 1.24 == eiger_settings.wavelength
assert "" == eiger_settings.element
assert 1240 / (eiger_settings.wavelength * 10) == eiger_settings.photon_energy
assert 0.5 * eiger_settings.photon_energy == eiger_settings.threshold_energy


def test_eiger_settings_set_count_time(eiger_settings):
eiger_settings["count_time"] = 0.2

assert 0.2 == eiger_settings.count_time
assert (
eiger_settings.count_time + eiger_settings.detector_readout_time
== eiger_settings.frame_time
)
2 changes: 1 addition & 1 deletion tests/devices/eiger/test_eiger_status.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ def test_eiger_status_constructor():


def test_eiger_status_getitem(eiger_status):
assert 24.5 == eiger_status["th0_temp"]
assert 24.5 == eiger_status["th0_temp"]["value"]
14 changes: 12 additions & 2 deletions tickit/adapters/httpadapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import logging
from dataclasses import dataclass
from inspect import getmembers
from typing import Iterable
from typing import Callable, Iterable

from aiohttp import web
from aiohttp.web_routedef import RouteDef
Expand Down Expand Up @@ -64,4 +64,14 @@ def endpoints(self) -> Iterable[RouteDef]:
for _, func in getmembers(self):
endpoint: HTTPEndpoint = getattr(func, "__endpoint__", None)
if endpoint is not None:
yield endpoint.define(func)
yield self._make_route_def(func, endpoint)

def _make_route_def(self, func: Callable, endpoint: HTTPEndpoint) -> RouteDef:
# Create wrapper around endpoint function that calls interrupt where necessary
async def wrapped_func(*args, **kwargs):
reply = await func(*args, **kwargs)
if endpoint.interrupt:
await self.raise_interrupt()
return reply

return endpoint.define(wrapped_func)
Loading