Skip to content

Commit 5689639

Browse files
authored
Tickit 0.4.1 (#78)
Update the device adapters to support the latest release of tickit.
1 parent 1b1f686 commit 5689639

File tree

13 files changed

+217
-151
lines changed

13 files changed

+217
-151
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ classifiers = [
1212
]
1313
description = "Devices for tickit, an event-based device simulation framework"
1414
dependencies = [
15-
"tickit==0.3",
15+
"tickit>=0.4.1",
1616
"typing_extensions",
1717
"softioc",
1818
"pydantic>1",

src/tickit_devices/cryostream/__init__.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import pydantic.v1.dataclasses
2+
from tickit.adapters.io import TcpIo
3+
from tickit.core.adapter import AdapterContainer
24
from tickit.core.components.component import Component, ComponentConfig
35
from tickit.core.components.device_simulation import DeviceSimulation
46

@@ -13,8 +15,18 @@ class Cryostream(ComponentConfig):
1315
port: int = 25565
1416

1517
def __call__(self) -> Component: # noqa: D102
18+
device = CryostreamDevice()
19+
adapters = [
20+
AdapterContainer(
21+
CryostreamAdapter(device),
22+
TcpIo(
23+
self.host,
24+
self.port,
25+
),
26+
)
27+
]
1628
return DeviceSimulation(
1729
name=self.name,
18-
device=CryostreamDevice(),
19-
adapters=[CryostreamAdapter(host=self.host, port=self.port)],
30+
device=device,
31+
adapters=adapters,
2032
)

src/tickit_devices/cryostream/cryostream.py

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22
import struct
33
from typing import AsyncIterable, TypedDict
44

5-
from tickit.adapters.composed import ComposedAdapter
6-
from tickit.adapters.interpreters.command import CommandInterpreter, RegexCommand
7-
from tickit.adapters.servers.tcp import TcpServer
5+
from tickit.adapters.specifications import RegexCommand
6+
from tickit.adapters.tcp import CommandAdapter
87
from tickit.core.device import Device, DeviceUpdate
98
from tickit.core.typedefs import SimTime
10-
from tickit.utils.byte_format import ByteFormat
119

1210
from tickit_devices.cryostream.base import CryostreamBase
1311
from tickit_devices.cryostream.states import PhaseIds
@@ -57,31 +55,14 @@ def update(self, time: SimTime, inputs: Inputs) -> DeviceUpdate[Outputs]:
5755
return DeviceUpdate(self.Outputs(temperature=self.gas_temp), None)
5856

5957

60-
class CryostreamAdapter(ComposedAdapter[bytes]):
58+
class CryostreamAdapter(CommandAdapter):
6159
"""A Cryostream TCP adapter which sends regular status packets and can set modes."""
6260

6361
device: CryostreamDevice
6462

65-
def __init__(
66-
self,
67-
host: str = "localhost",
68-
port: int = 25565,
69-
) -> None:
70-
"""A CryostreamAdapter constructor which instantiates a TcpServer with host and
71-
port.
72-
73-
Args:
74-
device (Device): The device which this adapter is attached to
75-
raise_interrupt (Callable): A callback to request that the device is
76-
updated immediately.
77-
host (Optional[str]): The host address of the TcpServer. Defaults to
78-
"localhost".
79-
port (Optional[int]): The bound port of the TcpServer. Defaults to 25565.
80-
"""
81-
super().__init__(
82-
TcpServer(format=ByteFormat(b"%b"), host=host, port=port),
83-
CommandInterpreter(),
84-
)
63+
def __init__(self, device: CryostreamDevice) -> None:
64+
super().__init__()
65+
self.device = device
8566

8667
async def on_connect(self) -> AsyncIterable[bytes]:
8768
"""A method which continiously yields status packets.

src/tickit_devices/eiger/__init__.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import pydantic.v1.dataclasses
2+
from tickit.adapters.io import HttpIo, ZeroMqPushIo
3+
from tickit.core.adapter import AdapterContainer
24
from tickit.core.components.component import Component, ComponentConfig
35
from tickit.core.components.device_simulation import DeviceSimulation
46

@@ -16,11 +18,25 @@ class Eiger(ComponentConfig):
1618
zmq_port: int = 9999
1719

1820
def __call__(self) -> Component: # noqa: D102
21+
device = EigerDevice()
22+
adapters = [
23+
AdapterContainer(
24+
EigerRESTAdapter(device),
25+
HttpIo(
26+
self.host,
27+
self.port,
28+
),
29+
),
30+
AdapterContainer(
31+
EigerZMQAdapter(device),
32+
ZeroMqPushIo(
33+
self.zmq_host,
34+
self.zmq_port,
35+
),
36+
),
37+
]
1938
return DeviceSimulation(
2039
name=self.name,
21-
device=EigerDevice(),
22-
adapters=[
23-
EigerRESTAdapter(host=self.host, port=self.port),
24-
EigerZMQAdapter(host=self.zmq_host, port=self.zmq_port),
25-
],
40+
device=device,
41+
adapters=adapters,
2642
)

src/tickit_devices/eiger/eiger_adapters.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
from aiohttp import web
44
from apischema import serialize
5-
from tickit.adapters.httpadapter import HttpAdapter
6-
from tickit.adapters.interpreters.endpoints.http_endpoint import HttpEndpoint
7-
from tickit.adapters.zeromq.push_adapter import ZeroMqPushAdapter
5+
from tickit.adapters.http import HttpAdapter
6+
from tickit.adapters.specifications import HttpEndpoint
7+
from tickit.adapters.zmq import ZeroMqPushAdapter
88

99
from tickit_devices.eiger.eiger import EigerDevice
1010
from tickit_devices.eiger.eiger_schema import SequenceComplete, Value, construct_value
@@ -24,6 +24,9 @@ class EigerRESTAdapter(HttpAdapter):
2424

2525
device: EigerDevice
2626

27+
def __init__(self, device: EigerDevice) -> None:
28+
self.device = device
29+
2730
@HttpEndpoint.get(f"/{DETECTOR_API}" + "/config/{parameter_name}")
2831
async def get_config(self, request: web.Request) -> web.Response:
2932
"""A HTTP Endpoint for requesting configuration variables from the Eiger.
@@ -189,7 +192,7 @@ async def trigger_eiger(self, request: web.Request) -> web.Response:
189192
LOGGER.debug("Triggering Eiger")
190193
await self.device.trigger()
191194

192-
await self.raise_interrupt()
195+
await self.interrupt()
193196
await self.device.finished_aquisition.wait()
194197

195198
return web.json_response(serialize(SequenceComplete(4)))
@@ -421,7 +424,11 @@ class EigerZMQAdapter(ZeroMqPushAdapter):
421424

422425
device: EigerDevice
423426

427+
def __init__(self, device: EigerDevice) -> None:
428+
super().__init__()
429+
self.device = device
430+
424431
def after_update(self) -> None:
425432
"""Updates IOC values immediately following a device update."""
426433
buffered_data = self.device.stream.consume_data()
427-
self.send_message_sequence_soon([list(buffered_data)])
434+
self.add_message_to_stream([list(buffered_data)])

src/tickit_devices/femto/__init__.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import pydantic.v1.dataclasses
2+
from tickit.adapters.io import EpicsIo
3+
from tickit.core.adapter import AdapterContainer
24
from tickit.core.components.component import Component, ComponentConfig
35
from tickit.core.components.device_simulation import DeviceSimulation
46

@@ -16,12 +18,22 @@ class Femto(ComponentConfig):
1618
ioc_name: str = "FEMTO"
1719

1820
def __call__(self) -> Component: # noqa: D102
21+
device = FemtoDevice(
22+
initial_gain=self.initial_gain, initial_current=self.initial_current
23+
)
24+
adapters = [
25+
AdapterContainer(
26+
FemtoAdapter(device),
27+
EpicsIo(
28+
self.ioc_name,
29+
self.db_file,
30+
),
31+
)
32+
]
1933
return DeviceSimulation(
2034
name=self.name,
21-
device=FemtoDevice(
22-
initial_gain=self.initial_gain, initial_current=self.initial_current
23-
),
24-
adapters=[FemtoAdapter(ioc_name=self.ioc_name, db_file=self.db_file)],
35+
device=device,
36+
adapters=adapters,
2537
)
2638

2739

src/tickit_devices/femto/femto.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import TypedDict
22

33
from softioc import builder
4-
from tickit.adapters.epicsadapter import EpicsAdapter
4+
from tickit.adapters.epics import EpicsAdapter
55
from tickit.core.device import Device, DeviceUpdate
66
from tickit.core.typedefs import SimTime
77

@@ -28,8 +28,9 @@ def __init__(
2828
initial_current (Optional[float]): The input signal current. \
2929
Defaults to 0.0.
3030
"""
31-
self.gain: float = initial_gain
32-
self._current: float = initial_current
31+
self.gain = initial_gain
32+
self._current = initial_current
33+
self._output_current = initial_current * initial_gain
3334

3435
def set_gain(self, gain: float) -> None:
3536
"""Sets a new amplified difference between the input and output signals.
@@ -89,14 +90,18 @@ class FemtoAdapter(EpicsAdapter):
8990

9091
device: FemtoDevice
9192

93+
def __init__(self, device: FemtoDevice) -> None:
94+
super().__init__()
95+
self.device = device
96+
9297
async def callback(self, value) -> None:
9398
"""Device callback function.
9499
95100
Args:
96101
value (float): The value to set the gain to.
97102
"""
98103
self.device.set_gain(value)
99-
await self.raise_interrupt()
104+
await self.interrupt()
100105

101106
def on_db_load(self) -> None:
102107
"""Customises records that have been loaded in to suit the simulation."""

src/tickit_devices/pneumatic/__init__.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import pydantic.v1.dataclasses
2+
from tickit.adapters.io import EpicsIo
3+
from tickit.core.adapter import AdapterContainer
24
from tickit.core.components.component import Component, ComponentConfig
35
from tickit.core.components.device_simulation import DeviceSimulation
46

@@ -15,10 +17,20 @@ class Pneumatic(ComponentConfig):
1517
ioc_name: str = "PNEUMATIC"
1618

1719
def __call__(self) -> Component: # noqa: D102
20+
device = PneumaticDevice(
21+
initial_speed=self.initial_speed, initial_state=self.initial_state
22+
)
23+
adapters = [
24+
AdapterContainer(
25+
PneumaticAdapter(device),
26+
EpicsIo(
27+
self.ioc_name,
28+
self.db_file,
29+
),
30+
)
31+
]
1832
return DeviceSimulation(
1933
name=self.name,
20-
device=PneumaticDevice(
21-
initial_speed=self.initial_speed, initial_state=self.initial_state
22-
),
23-
adapters=[PneumaticAdapter(ioc_name=self.ioc_name, db_file=self.db_file)],
34+
device=device,
35+
adapters=adapters,
2436
)

src/tickit_devices/pneumatic/pneumatic.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import TypedDict
22

33
from softioc import builder
4-
from tickit.adapters.epicsadapter import EpicsAdapter
4+
from tickit.adapters.epics import EpicsAdapter
55
from tickit.core.device import Device, DeviceUpdate
66
from tickit.core.typedefs import SimTime
77

@@ -82,14 +82,18 @@ class PneumaticAdapter(EpicsAdapter):
8282

8383
device: PneumaticDevice
8484

85+
def __init__(self, device: PneumaticDevice) -> None:
86+
super().__init__()
87+
self.device = device
88+
8589
async def callback(self, value) -> None:
8690
"""Set the state of the device and await a response.
8791
8892
Args:
8993
value (bool): The value to set the state to.
9094
"""
9195
self.device.set_state()
92-
await self.raise_interrupt()
96+
await self.interrupt()
9397

9498
def on_db_load(self):
9599
"""Adds a record of the current state to the mapping of interrupting records."""

0 commit comments

Comments
 (0)