Skip to content
Draft
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
8 changes: 6 additions & 2 deletions src/fastcs_eiger/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from fastcs.logging import LogLevel, configure_logging
from fastcs.transports.epics import EpicsGUIOptions, EpicsIOCOptions
from fastcs.transports.epics.ca.transport import EpicsCATransport
from fastcs.transports.epics.pva.transport import EpicsPVATransport

from fastcs_eiger import __version__
from fastcs_eiger.controllers.eiger_controller import EigerController
Expand Down Expand Up @@ -66,12 +67,15 @@ def ioc(
)

transports = [
EpicsCATransport(
epicsca=EpicsIOCOptions(pv_prefix=pv_prefix),
EpicsPVATransport(
epicspva=EpicsIOCOptions(pv_prefix=pv_prefix),
gui=EpicsGUIOptions(
output_path=ui_path / "eiger.bob", title=f"Eiger - {pv_prefix}"
),
),
EpicsCATransport(
epicsca=EpicsIOCOptions(pv_prefix=pv_prefix),
),
]
launcher = FastCS(controller, transports)
launcher.run()
Expand Down
24 changes: 18 additions & 6 deletions src/fastcs_eiger/controllers/eiger_monitor_controller.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,37 @@
from io import BytesIO

import numpy as np
from fastcs.attributes import AttrR
from fastcs.datatypes import Waveform
from fastcs.methods import scan
from PIL import Image

from fastcs_eiger.controllers.eiger_subsystem_controller import EigerSubsystemController

DEFAULT_IMAGE_SHAPE = (5000, 5000)
DEFAULT_IMAGE = np.array(range(np.prod(DEFAULT_IMAGE_SHAPE)), dtype=np.uint32).reshape(
*DEFAULT_IMAGE_SHAPE
)


class EigerMonitorController(EigerSubsystemController):
_subsystem = "monitor"

image = AttrR(
Waveform(np.uint32, shape=DEFAULT_IMAGE_SHAPE), initial_value=DEFAULT_IMAGE
)
line = AttrR(Waveform(np.float64, shape=(10,)), initial_value=np.sin(np.arange(10)))

@scan(1)
async def handle_monitor(self):
"""Poll monitor images to display."""
if (image := await self._read_monitor_image()) is not None:
await self.image.update(image)

async def _read_monitor_image(self) -> np.ndarray | None:
response, image_bytes = await self.connection.get_bytes(
"monitor/api/1.8.0/images/next"
)
if response.status != 200:
return
else:
image = Image.open(BytesIO(image_bytes))

# TODO: Populate waveform PV to display as image, once supported in PVI
print(np.array(image))
if response.status == 200:
return np.array(Image.open(BytesIO(image_bytes)).getdata())
Loading