working integration of timepix
CI for superxas_bec / test (pull_request) Successful in 35s
CI for superxas_bec / test (push) Successful in 34s

This commit is contained in:
2025-09-17 12:55:28 +02:00
parent b839ba5de7
commit c7f2d81f94
2 changed files with 39 additions and 24 deletions
+24 -16
View File
@@ -18,7 +18,7 @@ from bec_lib.logger import bec_logger
from ophyd import ADBase
from ophyd import Component as Cpt
from ophyd import DeviceStatus, Kind, StatusBase
from ophyd_devices import AsyncSignal, CompareStatus, TransitionStatus
from ophyd_devices import AsyncSignal, CompareStatus, PreviewSignal, TransitionStatus
from ophyd_devices.devices.areadetector.cam import ASItpxCam
from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase
from typeguard import typechecked
@@ -137,6 +137,14 @@ class Timepix(PSIDeviceBase, TimePixControl):
max_size=1000,
)
preview = Cpt(
PreviewSignal,
name="preview",
ndim=2,
num_rotation_90=0, # Check this
doc="Preview signal for the Pilatus Detector",
)
def __init__(
self,
*,
@@ -215,12 +223,12 @@ class Timepix(PSIDeviceBase, TimePixControl):
described in model .timepix_fly_client.timepix_fly_interface.TimepixEndFrame
"""
n_energy_points = start_frame.get("NumEnergyPoints", None)
if n_energy_points is None:
logger.error(
f"NumEnergyPoints not found in start_frame: {start_frame}. Have we received the correct frame?"
)
return
# TODO What should we do here if n_energy_points and troin do not match with the expected values?
# if n_energy_points is None:
# logger.error(
# f"NumEnergyPoints not found in start_frame: {start_frame}. Have we received the correct frame?"
# )
# return
# # TODO What should we do here if n_energy_points and troin do not match with the expected values?
if n_energy_points != self._n_energy_points:
logger.error(
f"Number of energy points {n_energy_points} does not match expected {self._n_energy_points}."
@@ -234,7 +242,7 @@ class Timepix(PSIDeviceBase, TimePixControl):
tds_period = 0
tds_total_events = 0
if len(data_frames) == 0:
logger.info(
logger.error(
f"No data frames received in msg_buffer; for start_frame: {start_frame}, end_frame: {end_frame}"
)
else:
@@ -336,16 +344,16 @@ class Timepix(PSIDeviceBase, TimePixControl):
self.backend.on_connected()
# Register the callback for processing data received by the backend
# TODO add initial callback again once issues are resolved
# self.backend.add_callback(self.msg_buffer_callback)
self._msg_dump = []
self.backend.add_callback(self.msg_buffer_callback)
# self._msg_dump = []
def _on_msg_received(start_frame, data_frame, end_frame):
"""Callback"""
self._msg_dump.append(
{"start_frame": start_frame, "data_frame": data_frame, "end_frame": end_frame}
)
# def _on_msg_received(start_frame, data_frame, end_frame):
# """Callback"""
# self._msg_dump.append(
# {"start_frame": start_frame, "data_frame": data_frame, "end_frame": end_frame}
# )
self.backend.add_callback(_on_msg_received)
# self.backend.add_callback(_on_msg_received)
def on_stage(self) -> DeviceStatus | StatusBase | None:
"""
+15 -8
View File
@@ -1,4 +1,4 @@
"""Utility module for the Timepix detector."""
"""Temporary utility module for Status Object implementations."""
from __future__ import annotations
@@ -65,13 +65,20 @@ class AndStatusWithList(DeviceStatus):
return False
# TODO Check if this actually works....
def set_exception(self, exc):
with self._lock:
for st in self.all_statuses:
with st._lock:
if not st.done:
st.set_exception(exc)
# # TODO Check if this actually works....
# def set_exception(self, exc):
# # Propagate the exception to all sub-statuses that are not done yet.
#
# with self._lock:
# if self._externally_initiated_completion:
# return
# if self.done: # Return if status is already done.. It must be resolved already
# return
# super().set_exception(exc)
# for st in self.all_statuses:
# with st._lock:
# if not st.done:
# st.set_exception(exc)
def _run_callbacks(self):
"""