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
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,19 @@ To run local versions of odin-data / odin-control python applications install it
the virtual environment with `$ pip install -e ...` to override the versions installed
from GitHub.

#### Odin Data Example

Another option is to run an odin deployment and open the fastcs-odin devcontainer in
isolation. Detector repositories provide container images and dev deployments, such as
the [odin-data-example](https://github.com/odin-detector/odin-data-example):

```
podman run --rm -it ghcr.io/odin-detector/odin-data-example-runtime
```

This deployment will host an odin server that the default fastcs-odin `Odin IOC` launch
config will connect to.

### Isolated Development Environment

While it is necessary to work on odin-control / odin-data alongside fastcs-odin in some
Expand Down
14 changes: 14 additions & 0 deletions docs/snippets/odin01.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from fastcs.attributes import AttrRW
from fastcs.control_system import FastCS
from fastcs.controllers import Controller
from fastcs.datatypes import Int


class ExampleOdinController(Controller):
foo = AttrRW(Int())


fastcs = FastCS(ExampleOdinController(), [])

if __name__ == "__main__":
fastcs.run()
19 changes: 19 additions & 0 deletions docs/snippets/odin02.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from fastcs.attributes import AttrRW
from fastcs.control_system import FastCS
from fastcs.controllers import Controller
from fastcs.datatypes import Int
from fastcs.transports.epics import EpicsIOCOptions
from fastcs.transports.epics.ca.transport import EpicsCATransport


class ExampleOdinController(Controller):
foo = AttrRW(Int())


fastcs = FastCS(
ExampleOdinController(),
[EpicsCATransport(EpicsIOCOptions(pv_prefix="EXAMPLE"))],
)

if __name__ == "__main__":
fastcs.run()
29 changes: 29 additions & 0 deletions docs/snippets/odin03.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from pathlib import Path

from fastcs.attributes import AttrRW
from fastcs.control_system import FastCS
from fastcs.controllers import Controller
from fastcs.datatypes import Int
from fastcs.transports.epics import EpicsGUIOptions, EpicsIOCOptions
from fastcs.transports.epics.ca.transport import EpicsCATransport


class ExampleOdinController(Controller):
foo = AttrRW(Int())


fastcs = FastCS(
ExampleOdinController(),
[
EpicsCATransport(
EpicsIOCOptions(pv_prefix="EXAMPLE"),
gui=EpicsGUIOptions(
output_path=Path.cwd() / "opis" / "example.bob",
title="Odin Example Detector",
),
)
],
)

if __name__ == "__main__":
fastcs.run()
31 changes: 31 additions & 0 deletions docs/snippets/odin04.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from pathlib import Path

from fastcs.attributes import AttrRW
from fastcs.connections import IPConnectionSettings
from fastcs.control_system import FastCS
from fastcs.datatypes import Int
from fastcs.transports.epics import EpicsGUIOptions, EpicsIOCOptions
from fastcs.transports.epics.ca.transport import EpicsCATransport

from fastcs_odin.controllers import OdinController


class ExampleOdinController(OdinController):
foo = AttrRW(Int())


fastcs = FastCS(
ExampleOdinController(IPConnectionSettings("127.0.0.1", 8888)),
[
EpicsCATransport(
EpicsIOCOptions(pv_prefix="EXAMPLE"),
gui=EpicsGUIOptions(
output_path=Path.cwd() / "opis" / "example.bob",
title="Odin Example Detector",
),
)
],
)

if __name__ == "__main__":
fastcs.run()
48 changes: 48 additions & 0 deletions docs/snippets/odin05.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from pathlib import Path

from fastcs.attributes import AttrRW
from fastcs.connections import IPConnectionSettings
from fastcs.control_system import FastCS
from fastcs.datatypes import Int, String
from fastcs.transports.epics import EpicsGUIOptions, EpicsIOCOptions
from fastcs.transports.epics.ca.transport import EpicsCATransport

from fastcs_odin.controllers import OdinController
from fastcs_odin.io.config_fan_sender_attribute_io import ConfigFanAttributeIORef


class ExampleOdinController(OdinController):
async def initialise(self):
await super().initialise()

self.file_path = AttrRW(
String(),
io_ref=ConfigFanAttributeIORef([self.FP.file_path]),
)
self.file_prefix = AttrRW(
String(),
io_ref=ConfigFanAttributeIORef([self.FP.file_prefix]),
)
self.frames = AttrRW(
Int(),
io_ref=ConfigFanAttributeIORef(
[self.FP.frames, self.DETECTOR.config_frames]
),
)


fastcs = FastCS(
ExampleOdinController(IPConnectionSettings("127.0.0.1", 8888)),
[
EpicsCATransport(
EpicsIOCOptions(pv_prefix="EXAMPLE"),
gui=EpicsGUIOptions(
output_path=Path.cwd() / "opis" / "example.bob",
title="Odin Example Detector",
),
)
],
)

if __name__ == "__main__":
fastcs.run()
87 changes: 87 additions & 0 deletions docs/snippets/odin06.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
from pathlib import Path

from fastcs.attributes import AttrRW
from fastcs.connections import IPConnectionSettings
from fastcs.control_system import FastCS
from fastcs.controllers import BaseController
from fastcs.datatypes import Int, String
from fastcs.transports.epics import EpicsGUIOptions, EpicsIOCOptions
from fastcs.transports.epics.ca.transport import EpicsCATransport

from fastcs_odin.controllers import OdinController
from fastcs_odin.controllers.odin_adapter_controller import OdinAdapterController
from fastcs_odin.controllers.odin_data.frame_processor import (
FrameProcessorAdapterController,
)
from fastcs_odin.http_connection import HTTPConnection
from fastcs_odin.io.config_fan_sender_attribute_io import ConfigFanAttributeIORef
from fastcs_odin.util import OdinParameter


class ExampleFrameProcessorAdapterController(FrameProcessorAdapterController):
frames: AttrRW[int]


class ExampleDetectorAdapterController(OdinAdapterController):
config_frames: AttrRW[int]


class ExampleOdinController(OdinController):
FP: ExampleFrameProcessorAdapterController
DETECTOR: ExampleDetectorAdapterController

async def initialise(self):
await super().initialise()

self.file_path = AttrRW(
String(),
io_ref=ConfigFanAttributeIORef([self.FP.file_path]),
)
self.file_prefix = AttrRW(
String(),
io_ref=ConfigFanAttributeIORef([self.FP.file_prefix]),
)
self.frames = AttrRW(
Int(),
io_ref=ConfigFanAttributeIORef(
[self.FP.frames, self.DETECTOR.config_frames]
),
)

def _create_adapter_controller(
self,
connection: HTTPConnection,
parameters: list[OdinParameter],
adapter: str,
module: str,
) -> BaseController:
match module:
case "ExampleDetectorAdapter":
return ExampleDetectorAdapterController(
connection, parameters, f"{self.API_PREFIX}/{adapter}", self._ios
)
case "FrameProcessorAdapter":
return ExampleFrameProcessorAdapterController(
connection, parameters, f"{self.API_PREFIX}/{adapter}", self._ios
)
case _:
return super()._create_adapter_controller(
connection, parameters, adapter, module
)


fastcs = FastCS(
ExampleOdinController(IPConnectionSettings("127.0.0.1", 8888)),
[
EpicsCATransport(
EpicsIOCOptions(pv_prefix="EXAMPLE"),
gui=EpicsGUIOptions(
output_path=Path.cwd() / "opis" / "example.bob",
title="Odin Example Detector",
),
)
],
)

if __name__ == "__main__":
fastcs.run()
101 changes: 101 additions & 0 deletions docs/snippets/odin07.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
from pathlib import Path

from fastcs.attributes import AttrRW
from fastcs.connections import IPConnectionSettings
from fastcs.control_system import FastCS
from fastcs.controllers import BaseController
from fastcs.datatypes import Int, String
from fastcs.methods import Command, command
from fastcs.transports.epics import EpicsGUIOptions, EpicsIOCOptions
from fastcs.transports.epics.ca.transport import EpicsCATransport

from fastcs_odin.controllers import OdinController
from fastcs_odin.controllers.odin_adapter_controller import OdinAdapterController
from fastcs_odin.controllers.odin_data.frame_processor import (
FrameProcessorAdapterController,
)
from fastcs_odin.http_connection import HTTPConnection
from fastcs_odin.io.config_fan_sender_attribute_io import ConfigFanAttributeIORef
from fastcs_odin.util import OdinParameter


class ExampleFrameProcessorAdapterController(FrameProcessorAdapterController):
frames: AttrRW[int]


class ExampleDetectorAdapterController(OdinAdapterController):
config_frames: AttrRW[int]

start: Command
stop: Command


class ExampleOdinController(OdinController):
FP: ExampleFrameProcessorAdapterController
DETECTOR: ExampleDetectorAdapterController

@command()
async def acquire(self):
await self.FP.start_writing()
await self.DETECTOR.start()

@command()
async def stop(self):
await self.FP.stop_writing()
await self.DETECTOR.stop()

async def initialise(self):
await super().initialise()

self.file_path = AttrRW(
String(),
io_ref=ConfigFanAttributeIORef([self.FP.file_path]),
)
self.file_prefix = AttrRW(
String(),
io_ref=ConfigFanAttributeIORef([self.FP.file_prefix]),
)
self.frames = AttrRW(
Int(),
io_ref=ConfigFanAttributeIORef(
[self.FP.frames, self.DETECTOR.config_frames]
),
)

def _create_adapter_controller(
self,
connection: HTTPConnection,
parameters: list[OdinParameter],
adapter: str,
module: str,
) -> BaseController:
match module:
case "ExampleDetectorAdapter":
return ExampleDetectorAdapterController(
connection, parameters, f"{self.API_PREFIX}/{adapter}", self._ios
)
case "FrameProcessorAdapter":
return ExampleFrameProcessorAdapterController(
connection, parameters, f"{self.API_PREFIX}/{adapter}", self._ios
)
case _:
return super()._create_adapter_controller(
connection, parameters, adapter, module
)


fastcs = FastCS(
ExampleOdinController(IPConnectionSettings("127.0.0.1", 8888)),
[
EpicsCATransport(
EpicsIOCOptions(pv_prefix="EXAMPLE"),
gui=EpicsGUIOptions(
output_path=Path.cwd() / "opis" / "example.bob",
title="Odin Example Detector",
),
)
],
)

if __name__ == "__main__":
fastcs.run()
Loading
Loading