feat: added xbpm device and added in config

This commit is contained in:
gac-x12sa
2025-07-15 16:56:01 +02:00
parent a4aa1da5dd
commit 53d1798c84
2 changed files with 89 additions and 0 deletions

View File

@@ -135,4 +135,15 @@ xbpm1c4:
enabled: true
readoutPriority: monitored
readOnly: true
softwareTrigger: false
xbpm1:
description: 'XBPM1 (frontend)'
deviceClass: csaxs_bec.devices.epics.xbpms.BPMDevice
deviceConfig:
prefix: 'X12SA-FE-XBPM1'
onFailure: raise
enabled: true
readoutPriority: monitored
readOnly: true
softwareTrigger: false

View File

@@ -0,0 +1,78 @@
from ophyd import Signal, Device, EpicsSignalRO
from ophyd import Component as Cpt
class SumSignal(Signal):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._metadata.update(write_access=False)
def wait_for_connection(self, timeout=0):
super().wait_for_connection(timeout)
self._metadata.update(connected=True)
def get(self, **kwargs):
val1 = self.parent.current1.get()
val2 = self.parent.current2.get()
val3 = self.parent.current3.get()
val4 = self.parent.current4.get()
return val1 + val2 + val3 + val4
def describe(self):
desc = {
"shape": [],
"dtype": "number",
"source": "PV: {} / {}".format(self.parent.current1.pvname, self.parent.current1.pvname),
"units": "",
"precision": self.parent.current1.precision,
}
return desc
class DiffXYSignal(Signal):
def __init__(self, sum1, sum2, *args, **kwargs):
self.sum1 = sum1
self.sum2 = sum2
super().__init__(*args, **kwargs)
self._metadata.update(write_access=False)
def wait_for_connection(self, timeout=0):
super().wait_for_connection(timeout)
self._metadata.update(connected=True)
def get(self, **kwargs):
summed_1 = 0
summed_2 = 0
for signal in self.sum1:
summed_1 += getattr(self.parent, signal).get()
for signal in self.sum2:
summed_2 += getattr(self.parent, signal).get()
return summed_1 - summed_2
def describe(self):
desc = {
"shape": [],
"dtype": "number",
"source": "PV: {} / {}".format(self.parent.current1.pvname, self.parent.current1.pvname),
"units": "",
"precision": self.parent.current1.precision,
}
return desc
class BPMDevice(Device):
current1 = Cpt(EpicsSignalRO, ":Current1:MeanValue_RBV", kind="normal")
current2 = Cpt(EpicsSignalRO, ":Current2:MeanValue_RBV", kind="normal")
current3 = Cpt(EpicsSignalRO, ":Current3:MeanValue_RBV", kind="normal")
current4 = Cpt(EpicsSignalRO, ":Current4:MeanValue_RBV", kind="normal")
sum = Cpt(SumSignal, kind="hinted")
x = Cpt(DiffXYSignal, sum1=["current1", "current2"], sum2=["current3", "current4"])
y = Cpt(DiffXYSignal, sum1=["current1", "current3"], sum2=["current2", "current4"])
def __init__(self, prefix="", *args, **kwargs):
super().__init__(*args, prefix=prefix, **kwargs)
if __name__ == "__main__":
dev = BPMDevice(name="bpm", prefix='X12SA-FE-XBPM1')
dev.wait_for_connection()
print(dev.read())