diff --git a/ophyd_devices/sim/sim_camera.py b/ophyd_devices/sim/sim_camera.py index 31e6068..eda8bac 100644 --- a/ophyd_devices/sim/sim_camera.py +++ b/ophyd_devices/sim/sim_camera.py @@ -154,15 +154,17 @@ class SimCamera(PSIDetectorBase): SUB_MONITOR = "device_monitor_2d" _default_sub = SUB_MONITOR - exp_time = Cpt(SetableSignal, name="exp_time", value=1, kind=Kind.config) + exp_time = Cpt(SetableSignal, name="exp_time", value=1, dtype=float, shape=(), kind=Kind.config) file_pattern = Cpt(SetableSignal, name="file_pattern", value="", kind=Kind.config) - frames = Cpt(SetableSignal, name="frames", value=1, kind=Kind.config) - burst = Cpt(SetableSignal, name="burst", value=1, kind=Kind.config) + frames = Cpt(SetableSignal, name="frames", value=1, dtype=int, shape=(), kind=Kind.config) + burst = Cpt(SetableSignal, name="burst", value=1, dtype=int, shape=(), kind=Kind.config) image_shape = Cpt(SetableSignal, name="image_shape", value=SHAPE, kind=Kind.config) image = Cpt( ReadOnlySignal, name="image", + dtype=BIT_DEPTH, + shape=SHAPE, value=np.empty(SHAPE, dtype=BIT_DEPTH), compute_readback=True, kind=Kind.omitted, diff --git a/ophyd_devices/sim/sim_flyer.py b/ophyd_devices/sim/sim_flyer.py index 77b2e40..849dbc6 100644 --- a/ophyd_devices/sim/sim_flyer.py +++ b/ophyd_devices/sim/sim_flyer.py @@ -37,7 +37,13 @@ class SimFlyer(Device, FlyerInterface): sim_cls = SimulatedPositioner readback = Cpt( - ReadOnlySignal, name="readback", value=0, kind=Kind.hinted, compute_readback=False + ReadOnlySignal, + name="readback", + value=0, + dtype=float, + shape=(), + kind=Kind.hinted, + compute_readback=False, ) def __init__( diff --git a/ophyd_devices/sim/sim_monitor.py b/ophyd_devices/sim/sim_monitor.py index 2219cd9..1638d2d 100644 --- a/ophyd_devices/sim/sim_monitor.py +++ b/ophyd_devices/sim/sim_monitor.py @@ -67,7 +67,9 @@ class SimMonitor(ReadOnlySignal): name=name, parent=parent, kind=kind, - value=self.BIT_DEPTH(0), + value=0, + dtype=self.BIT_DEPTH, + shape=(), compute_readback=True, sim=self.sim, **kwargs, diff --git a/ophyd_devices/sim/sim_positioner.py b/ophyd_devices/sim/sim_positioner.py index a0bb397..d1a0285 100644 --- a/ophyd_devices/sim/sim_positioner.py +++ b/ophyd_devices/sim/sim_positioner.py @@ -47,9 +47,11 @@ class SimPositioner(Device, PositionerBase): sim_cls = SimulatedPositioner # Define the signals as class attributes - readback = Cpt(ReadOnlySignal, name="readback", value=0, kind=Kind.hinted) - setpoint = Cpt(SetableSignal, value=0, kind=Kind.normal) - motor_is_moving = Cpt(SetableSignal, value=0, kind=Kind.normal) + readback = Cpt( + ReadOnlySignal, name="readback", value=0, dtype=float, shape=(), kind=Kind.hinted + ) + setpoint = Cpt(SetableSignal, value=0, dtype=float, shape=(), kind=Kind.normal) + motor_is_moving = Cpt(SetableSignal, dtype=int, shape=(), value=0, kind=Kind.normal) # Config signals velocity = Cpt(SetableSignal, value=100, kind=Kind.config) diff --git a/ophyd_devices/sim/sim_signals.py b/ophyd_devices/sim/sim_signals.py index b0773b8..111b89b 100644 --- a/ophyd_devices/sim/sim_signals.py +++ b/ophyd_devices/sim/sim_signals.py @@ -42,17 +42,17 @@ class SetableSignal(Signal): self, name: str, *args, - value: any = 0, + value: any = 0.0, kind: int = Kind.normal, precision: float = PRECISION, **kwargs, ): super().__init__(*args, name=name, value=value, kind=kind, **kwargs) self._metadata.update(connected=True, write_access=False) - self._value = value + self._value = self._readback self.precision = precision self.sim = getattr(self.parent, "sim", None) - self._update_sim_state(value) + self._update_sim_state(self._value) self._metadata.update(write_access=True) def _update_sim_state(self, value: any) -> None: @@ -134,7 +134,7 @@ class ReadOnlySignal(Signal): name: str, *args, parent=None, - value: any = 0, + value: any = 0.0, kind: int = Kind.normal, precision: float = PRECISION, compute_readback: bool = False, @@ -143,7 +143,7 @@ class ReadOnlySignal(Signal): ): super().__init__(*args, name=name, parent=parent, value=value, kind=kind, **kwargs) self._metadata.update(connected=True, write_access=False) - self._value = value + self._value = self._readback self.precision = precision self.compute_readback = compute_readback self.sim = sim if sim is not None else getattr(self.parent, "sim", None) @@ -225,7 +225,7 @@ class CustomSetableSignal(BECDeviceBase): name: str, *args, parent=None, - value: any = 0, + value: float = 0.0, kind: int = Kind.normal, precision: float = PRECISION, sim=None, @@ -233,26 +233,15 @@ class CustomSetableSignal(BECDeviceBase): ): if parent: name = f"{parent.name}_{name}" - super().__init__(*args, name=name, parent=parent, kind=kind, **kwargs) + super().__init__(*args, name=name, parent=parent, value=value, kind=kind, **kwargs) self._metadata = {"connected": self.connected, "write_access": True} - self._value = value self._timestamp = time.time() - self._dtype = type(value) - self._shape = self._get_shape(value) self.precision = precision self.sim = sim if sim is not None else getattr(self.parent, "sim", None) self._update_sim_state(value) def _get_shape(self, value: any) -> list: - """Get the shape of the value. - **Note: This logic is from ophyd, and replicated here. - There would be more sophisticated ways, but to keep it consistent, it is replicated here.** - """ - if isinstance(value, np.ndarray): - return list(value.shape) - if isinstance(value, list): - return len(value) - return [] + pass def _update_sim_state(self, value: any) -> None: """Update the readback value.""" @@ -260,13 +249,13 @@ class CustomSetableSignal(BECDeviceBase): self.sim.update_sim_state(self.name, value) def _get_value(self) -> any: - """Update the timestamp of the readback value.""" + """Return the readback value.""" if self.sim: return self.sim.sim_state[self.name]["value"] return self._value def _get_timestamp(self) -> any: - """Update the timestamp of the readback value.""" + """Return the timestamp of the readback value.""" if self.sim: return self.sim.sim_state[self.name]["timestamp"] return self._timestamp @@ -295,9 +284,7 @@ class CustomSetableSignal(BECDeviceBase): Core function for signal. """ - res = { - self.name: {"source": str(self.__class__), "dtype": self._dtype, "shape": self._shape} - } + res = super().describe() if self.precision is not None: res[self.name]["precision"] = self.precision return res diff --git a/ophyd_devices/sim/sim_waveform.py b/ophyd_devices/sim/sim_waveform.py index 2df832a..d40d365 100644 --- a/ophyd_devices/sim/sim_waveform.py +++ b/ophyd_devices/sim/sim_waveform.py @@ -49,17 +49,19 @@ class SimWaveform(Device): SUB_MONITOR = "device_monitor_1d" _default_sub = SUB_MONITOR - exp_time = Cpt(SetableSignal, name="exp_time", value=1, kind=Kind.config) + exp_time = Cpt(SetableSignal, name="exp_time", value=1, dtype=float, shape=(), kind=Kind.config) file_path = Cpt(SetableSignal, name="file_path", value="", kind=Kind.config) file_pattern = Cpt(SetableSignal, name="file_pattern", value="", kind=Kind.config) - frames = Cpt(SetableSignal, name="frames", value=1, kind=Kind.config) - burst = Cpt(SetableSignal, name="burst", value=1, kind=Kind.config) + frames = Cpt(SetableSignal, name="frames", value=1, dtype=int, shape=(), kind=Kind.config) + burst = Cpt(SetableSignal, name="burst", value=1, dtype=int, shape=(), kind=Kind.config) waveform_shape = Cpt(SetableSignal, name="waveform_shape", value=SHAPE, kind=Kind.config) waveform = Cpt( ReadOnlySignal, name="waveform", value=np.empty(SHAPE, dtype=BIT_DEPTH), + dtype=BIT_DEPTH, + shape=SHAPE, compute_readback=True, kind=Kind.normal, )