Source code for fastcs.transport.epics.ca.adapter

import asyncio
from typing import Any

from softioc import softioc

from fastcs.controller_api import ControllerAPI
from fastcs.transport.adapter import TransportAdapter
from fastcs.transport.epics.ca.ioc import EpicsCAIOC
from fastcs.transport.epics.ca.options import EpicsCAOptions
from fastcs.transport.epics.docs import EpicsDocs
from fastcs.transport.epics.gui import EpicsGUI


[docs] class EpicsCATransport(TransportAdapter): """Channel access transport.""" def __init__( self, controller_api: ControllerAPI, loop: asyncio.AbstractEventLoop, options: EpicsCAOptions | None = None, ) -> None: self._controller_api = controller_api self._loop = loop self._options = options or EpicsCAOptions() self._pv_prefix = self.options.ca_ioc.pv_prefix self._ioc = EpicsCAIOC( self.options.ca_ioc.pv_prefix, controller_api, self._options.ca_ioc, ) @property def options(self) -> EpicsCAOptions: return self._options def create_docs(self) -> None: EpicsDocs(self._controller_api).create_docs(self.options.docs) def create_gui(self) -> None: EpicsGUI(self._controller_api, self._pv_prefix).create_gui(self.options.gui) async def serve(self) -> None: print(f"Running FastCS IOC: {self._pv_prefix}") self._ioc.run(self._loop) @property def context(self) -> dict[str, Any]: return { command_name: getattr(softioc, command_name) for command_name in softioc.command_names if command_name != "exit" }