Source code for fastcs.transports.epics.ca.transport
import asyncio
from dataclasses import dataclass, field
from typing import Any
from softioc import softioc
from fastcs.logging import bind_logger
from fastcs.transports.controller_api import ControllerAPI
from fastcs.transports.epics import (
EpicsDocsOptions,
EpicsGUIOptions,
EpicsIOCOptions,
)
from fastcs.transports.epics.ca.ioc import EpicsCAIOC
from fastcs.transports.epics.docs import EpicsDocs
from fastcs.transports.epics.gui import EpicsGUI
from fastcs.transports.transport import Transport
logger = bind_logger(logger_name=__name__)
[docs]
@dataclass
class EpicsCATransport(Transport):
"""Channel access transport."""
epicsca: EpicsIOCOptions = field(default_factory=EpicsIOCOptions)
docs: EpicsDocsOptions | None = None
gui: EpicsGUIOptions | None = None
def connect(
self,
controller_api: ControllerAPI,
loop: asyncio.AbstractEventLoop,
) -> None:
self._controller_api = controller_api
self._loop = loop
self._pv_prefix = self.epicsca.pv_prefix
self._ioc = EpicsCAIOC(self.epicsca.pv_prefix, controller_api, self.epicsca)
if self.docs is not None:
EpicsDocs(self._controller_api).create_docs(self.docs)
if self.gui is not None:
EpicsGUI(self._controller_api, self._pv_prefix).create_gui(self.gui)
async def serve(self) -> None:
logger.info("Running IOC", pv_prefix=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"
}
def __repr__(self):
return f"EpicsCATransport({self._pv_prefix})"