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
25 changes: 12 additions & 13 deletions docs/snippets/static05.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,26 @@
from pathlib import Path

from fastcs.attributes import AttrR
from fastcs.connections import IPConnection, IPConnectionSettings
from fastcs.controller import Controller
from fastcs.datatypes import String
from fastcs.launch import FastCS
from fastcs.transport.epics.ca.options import EpicsCAOptions
from fastcs.transport.epics.ca.options import EpicsCAOptions, EpicsGUIOptions
from fastcs.transport.epics.options import EpicsIOCOptions


class TemperatureController(Controller):
device_id = AttrR(String())

def __init__(self, settings: IPConnectionSettings):
super().__init__()

self._ip_settings = settings
self.connection = IPConnection()

async def connect(self):
await self.connection.connect(self._ip_settings)

gui_options = EpicsGUIOptions(
output_path=Path(".") / "demo.bob", title="Demo Temperature Controller"
)
epics_options = EpicsCAOptions(
gui=gui_options,
ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"),
)
fastcs = FastCS(TemperatureController(), [epics_options])

epics_options = EpicsCAOptions(ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"))
connection_settings = IPConnectionSettings("localhost", 25565)
fastcs = FastCS(TemperatureController(connection_settings), [epics_options])
fastcs.create_gui()

# fastcs.run() # Commented as this will block
45 changes: 14 additions & 31 deletions docs/snippets/static06.py
Original file line number Diff line number Diff line change
@@ -1,41 +1,16 @@
from __future__ import annotations
from pathlib import Path

from dataclasses import dataclass

from fastcs.attributes import AttrHandlerR, AttrR
from fastcs.attributes import AttrR
from fastcs.connections import IPConnection, IPConnectionSettings
from fastcs.controller import BaseController, Controller
from fastcs.controller import Controller
from fastcs.datatypes import String
from fastcs.launch import FastCS
from fastcs.transport.epics.ca.options import EpicsCAOptions
from fastcs.transport.epics.options import EpicsIOCOptions


@dataclass
class IDUpdater(AttrHandlerR):
update_period: float | None = 0.2
_controller: TemperatureController | None = None

async def initialise(self, controller: BaseController):
assert isinstance(controller, TemperatureController)
self._controller = controller

@property
def controller(self) -> TemperatureController:
if self._controller is None:
raise RuntimeError("Handler not initialised")

return self._controller

async def update(self, attr: AttrR):
response = await self.controller.connection.send_query("ID?\r\n")
value = response.strip("\r\n")

await attr.set(value)
from fastcs.transport.epics.options import EpicsGUIOptions, EpicsIOCOptions


class TemperatureController(Controller):
device_id = AttrR(String(), handler=IDUpdater())
device_id = AttrR(String())

def __init__(self, settings: IPConnectionSettings):
super().__init__()
Expand All @@ -47,8 +22,16 @@ async def connect(self):
await self.connection.connect(self._ip_settings)


epics_options = EpicsCAOptions(ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"))
gui_options = EpicsGUIOptions(
output_path=Path(".") / "demo.bob", title="Demo Temperature Controller"
)
epics_options = EpicsCAOptions(
gui=gui_options,
ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"),
)
connection_settings = IPConnectionSettings("localhost", 25565)
fastcs = FastCS(TemperatureController(connection_settings), [epics_options])

fastcs.create_gui()

# fastcs.run() # Commented as this will block
27 changes: 16 additions & 11 deletions docs/snippets/static07.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
from __future__ import annotations

from dataclasses import dataclass
from pathlib import Path

from fastcs.attributes import AttrHandlerR, AttrR
from fastcs.connections import IPConnection, IPConnectionSettings
from fastcs.controller import BaseController, Controller
from fastcs.datatypes import Float, String
from fastcs.datatypes import String
from fastcs.launch import FastCS
from fastcs.transport.epics.ca.options import EpicsCAOptions
from fastcs.transport.epics.options import EpicsIOCOptions
from fastcs.transport.epics.options import EpicsGUIOptions, EpicsIOCOptions


@dataclass
class TemperatureControllerUpdater(AttrHandlerR):
command_name: str
class IDUpdater(AttrHandlerR):
update_period: float | None = 0.2
_controller: TemperatureController | None = None

Expand All @@ -29,17 +29,14 @@ def controller(self) -> TemperatureController:
return self._controller

async def update(self, attr: AttrR):
response = await self.controller.connection.send_query(
f"{self.command_name}?\r\n"
)
response = await self.controller.connection.send_query("ID?\r\n")
value = response.strip("\r\n")

await attr.set(attr.dtype(value))
await attr.set(value)


class TemperatureController(Controller):
device_id = AttrR(String(), handler=TemperatureControllerUpdater("ID"))
power = AttrR(Float(), handler=TemperatureControllerUpdater("P"))
device_id = AttrR(String(), handler=IDUpdater())

def __init__(self, settings: IPConnectionSettings):
super().__init__()
Expand All @@ -51,8 +48,16 @@ async def connect(self):
await self.connection.connect(self._ip_settings)


epics_options = EpicsCAOptions(ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"))
gui_options = EpicsGUIOptions(
output_path=Path(".") / "demo.bob", title="Demo Temperature Controller"
)
epics_options = EpicsCAOptions(
gui=gui_options,
ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"),
)
connection_settings = IPConnectionSettings("localhost", 25565)
fastcs = FastCS(TemperatureController(connection_settings), [epics_options])

fastcs.create_gui()

# fastcs.run() # Commented as this will block
28 changes: 15 additions & 13 deletions docs/snippets/static08.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import Any
from pathlib import Path

from fastcs.attributes import AttrHandlerRW, AttrR, AttrRW, AttrW
from fastcs.attributes import AttrHandlerR, AttrR
from fastcs.connections import IPConnection, IPConnectionSettings
from fastcs.controller import BaseController, Controller
from fastcs.datatypes import Float, String
from fastcs.launch import FastCS
from fastcs.transport.epics.ca.options import EpicsCAOptions
from fastcs.transport.epics.options import EpicsIOCOptions
from fastcs.transport.epics.options import EpicsGUIOptions, EpicsIOCOptions


@dataclass
class TemperatureControllerHandler(AttrHandlerRW):
class TemperatureControllerUpdater(AttrHandlerR):
command_name: str
update_period: float | None = 0.2
_controller: TemperatureController | None = None
Expand All @@ -37,16 +37,10 @@ async def update(self, attr: AttrR):

await attr.set(attr.dtype(value))

async def put(self, attr: AttrW, value: Any):
await self.controller.connection.send_command(
f"{self.command_name}={value}\r\n"
)


class TemperatureController(Controller):
device_id = AttrR(String(), handler=TemperatureControllerHandler("ID"))
power = AttrR(Float(), handler=TemperatureControllerHandler("P"))
ramp_rate = AttrRW(Float(), handler=TemperatureControllerHandler("R"))
device_id = AttrR(String(), handler=TemperatureControllerUpdater("ID"))
power = AttrR(Float(), handler=TemperatureControllerUpdater("P"))

def __init__(self, settings: IPConnectionSettings):
super().__init__()
Expand All @@ -58,8 +52,16 @@ async def connect(self):
await self.connection.connect(self._ip_settings)


epics_options = EpicsCAOptions(ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"))
gui_options = EpicsGUIOptions(
output_path=Path(".") / "demo.bob", title="Demo Temperature Controller"
)
epics_options = EpicsCAOptions(
gui=gui_options,
ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"),
)
connection_settings = IPConnectionSettings("localhost", 25565)
fastcs = FastCS(TemperatureController(connection_settings), [epics_options])

fastcs.create_gui()

# fastcs.run() # Commented as this will block
51 changes: 20 additions & 31 deletions docs/snippets/static09.py
Original file line number Diff line number Diff line change
@@ -1,85 +1,74 @@
from __future__ import annotations

from dataclasses import dataclass
from pathlib import Path
from typing import Any

from fastcs.attributes import AttrHandlerRW, AttrR, AttrRW, AttrW
from fastcs.connections import IPConnection, IPConnectionSettings
from fastcs.controller import BaseController, Controller, SubController
from fastcs.datatypes import Float, Int, String
from fastcs.controller import BaseController, Controller
from fastcs.datatypes import Float, String
from fastcs.launch import FastCS
from fastcs.transport.epics.ca.options import EpicsCAOptions
from fastcs.transport.epics.options import EpicsIOCOptions
from fastcs.transport.epics.options import EpicsGUIOptions, EpicsIOCOptions


@dataclass
class TemperatureControllerHandler(AttrHandlerRW):
command_name: str
update_period: float | None = 0.2
_controller: TemperatureController | TemperatureRampController | None = None
_controller: TemperatureController | None = None

async def initialise(self, controller: BaseController):
assert isinstance(controller, TemperatureController | TemperatureRampController)
assert isinstance(controller, TemperatureController)
self._controller = controller

@property
def controller(self) -> TemperatureController | TemperatureRampController:
def controller(self) -> TemperatureController:
if self._controller is None:
raise RuntimeError("Handler not initialised")

return self._controller

async def update(self, attr: AttrR):
response = await self.controller.connection.send_query(
f"{self.command_name}{self.controller.suffix}?\r\n"
f"{self.command_name}?\r\n"
)
value = response.strip("\r\n")

await attr.set(attr.dtype(value))

async def put(self, attr: AttrW, value: Any):
await self.controller.connection.send_command(
f"{self.command_name}{self.controller.suffix}={value}\r\n"
f"{self.command_name}={attr.dtype(value)}\r\n"
)


class TemperatureRampController(SubController):
start = AttrRW(Int(), handler=TemperatureControllerHandler("S"))
end = AttrRW(Int(), handler=TemperatureControllerHandler("E"))

def __init__(self, index: int, connection: IPConnection):
self.suffix = f"{index:02d}"

super().__init__(f"Ramp{self.suffix}")

self.connection = connection


class TemperatureController(Controller):
device_id = AttrR(String(), handler=TemperatureControllerHandler("ID"))
power = AttrR(Float(), handler=TemperatureControllerHandler("P"))
ramp_rate = AttrRW(Float(), handler=TemperatureControllerHandler("R"))

suffix = ""

def __init__(self, ramp_count: int, settings: IPConnectionSettings):
def __init__(self, settings: IPConnectionSettings):
super().__init__()

self._ip_settings = settings
self.connection = IPConnection()

self._ramp_controllers: list[TemperatureRampController] = []
for idx in range(1, ramp_count + 1):
ramp_controller = TemperatureRampController(idx, self.connection)
self._ramp_controllers.append(ramp_controller)
self.register_sub_controller(f"R{idx}", ramp_controller)

async def connect(self):
await self.connection.connect(self._ip_settings)


epics_options = EpicsCAOptions(ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"))
gui_options = EpicsGUIOptions(
output_path=Path(".") / "demo.bob", title="Demo Temperature Controller"
)
epics_options = EpicsCAOptions(
gui=gui_options,
ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"),
)
connection_settings = IPConnectionSettings("localhost", 25565)
fastcs = FastCS(TemperatureController(4, connection_settings), [epics_options])
fastcs = FastCS(TemperatureController(connection_settings), [epics_options])

fastcs.create_gui()

# fastcs.run() # Commented as this will block
24 changes: 13 additions & 11 deletions docs/snippets/static10.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
from __future__ import annotations

import enum
from dataclasses import dataclass
from pathlib import Path
from typing import Any

from fastcs.attributes import AttrHandlerRW, AttrR, AttrRW, AttrW
from fastcs.connections import IPConnection, IPConnectionSettings
from fastcs.controller import BaseController, Controller, SubController
from fastcs.datatypes import Enum, Float, Int, String
from fastcs.datatypes import Float, Int, String
from fastcs.launch import FastCS
from fastcs.transport.epics.ca.options import EpicsCAOptions
from fastcs.transport.epics.options import EpicsIOCOptions
from fastcs.transport.epics.options import EpicsGUIOptions, EpicsIOCOptions


@dataclass
Expand Down Expand Up @@ -40,19 +40,13 @@ async def update(self, attr: AttrR):

async def put(self, attr: AttrW, value: Any):
await self.controller.connection.send_command(
f"{self.command_name}{self.controller.suffix}={value}\r\n"
f"{self.command_name}{self.controller.suffix}={attr.dtype(value)}\r\n"
)


class OnOffEnum(enum.StrEnum):
Off = "0"
On = "1"


class TemperatureRampController(SubController):
start = AttrRW(Int(), handler=TemperatureControllerHandler("S"))
end = AttrRW(Int(), handler=TemperatureControllerHandler("E"))
enabled = AttrRW(Enum(OnOffEnum), handler=TemperatureControllerHandler("N"))

def __init__(self, index: int, connection: IPConnection):
self.suffix = f"{index:02d}"
Expand Down Expand Up @@ -85,8 +79,16 @@ async def connect(self):
await self.connection.connect(self._ip_settings)


epics_options = EpicsCAOptions(ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"))
gui_options = EpicsGUIOptions(
output_path=Path(".") / "demo.bob", title="Demo Temperature Controller"
)
epics_options = EpicsCAOptions(
gui=gui_options,
ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"),
)
connection_settings = IPConnectionSettings("localhost", 25565)
fastcs = FastCS(TemperatureController(4, connection_settings), [epics_options])

fastcs.create_gui()

# fastcs.run() # Commented as this will block
Loading