Scans are still hanging...
This commit is contained in:
parent
e44ca3d480
commit
1f3ef42a9d
@ -6,11 +6,17 @@ import warnings
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from AerotechAutomation1Enums import (DataCollectionMode, DataCollectionFrequency,
|
try:
|
||||||
|
from .AerotechAutomation1Enums import *
|
||||||
|
from .AerotechAutomation1Enums import (DataCollectionMode, DataCollectionFrequency,
|
||||||
|
AxisDataSignal, PsoWindowInput, DriveDataCaptureInput, DriveDataCaptureTrigger,
|
||||||
|
TaskDataSignal, SystemDataSignal, TomcatSequencerState)
|
||||||
|
except:
|
||||||
|
from AerotechAutomation1Enums import *
|
||||||
|
from AerotechAutomation1Enums import (DataCollectionMode, DataCollectionFrequency,
|
||||||
AxisDataSignal, PsoWindowInput, DriveDataCaptureInput, DriveDataCaptureTrigger,
|
AxisDataSignal, PsoWindowInput, DriveDataCaptureInput, DriveDataCaptureTrigger,
|
||||||
TaskDataSignal, SystemDataSignal, TomcatSequencerState)
|
TaskDataSignal, SystemDataSignal, TomcatSequencerState)
|
||||||
|
|
||||||
from AerotechAutomation1Enums import *
|
|
||||||
from typing import Union
|
from typing import Union
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
@ -31,14 +37,20 @@ class EpicsMotorX(EpicsMotor):
|
|||||||
def configure(self, d: dict):
|
def configure(self, d: dict):
|
||||||
if "target" in d:
|
if "target" in d:
|
||||||
self._targetPosition = d['target']
|
self._targetPosition = d['target']
|
||||||
|
del d['target']
|
||||||
if "position" in d:
|
if "position" in d:
|
||||||
self._targetPosition = d['position']
|
self._targetPosition = d['position']
|
||||||
#super().configure(d)
|
del d['position']
|
||||||
|
return super().configure(d)
|
||||||
|
|
||||||
def kickoff(self):
|
def kickoff(self):
|
||||||
self._startPosition = float( self.position)
|
self._startPosition = float( self.position)
|
||||||
return self.move(self._targetPosition, wait=False)
|
return self.move(self._targetPosition, wait=False)
|
||||||
|
|
||||||
|
def move(self, position, wait=True, **kwargs):
|
||||||
|
self._startPosition = float( self.position)
|
||||||
|
return super().move(position, wait, **kwargs)
|
||||||
|
|
||||||
def _progress_update(self, value, **kwargs) -> None:
|
def _progress_update(self, value, **kwargs) -> None:
|
||||||
"""Progress update on the scan"""
|
"""Progress update on the scan"""
|
||||||
if (self._startPosition is None) or (self._targetPosition is None) or (not self.moving):
|
if (self._startPosition is None) or (self._targetPosition is None) or (not self.moving):
|
||||||
@ -663,6 +675,7 @@ class aa1AxisPsoBase(Device):
|
|||||||
dstEventsEna = Component(EpicsSignal, "DIST:EVENTS", put_complete=True, kind=Kind.omitted)
|
dstEventsEna = Component(EpicsSignal, "DIST:EVENTS", put_complete=True, kind=Kind.omitted)
|
||||||
dstCounterEna = Component(EpicsSignal, "DIST:COUNTER", put_complete=True, kind=Kind.omitted)
|
dstCounterEna = Component(EpicsSignal, "DIST:COUNTER", put_complete=True, kind=Kind.omitted)
|
||||||
dstCounterVal = Component(EpicsSignalRO, "DIST:CTR0_RBV", auto_monitor=True, kind=Kind.hinted)
|
dstCounterVal = Component(EpicsSignalRO, "DIST:CTR0_RBV", auto_monitor=True, kind=Kind.hinted)
|
||||||
|
dstArrayIdx = Component(EpicsSignalRO, "DIST:IDX_RBV", auto_monitor=True, kind=Kind.hinted)
|
||||||
dstArrayDepleted = Component(EpicsSignalRO, "DIST:ARRAY-DEPLETED-RBV", auto_monitor=True, kind=Kind.hinted)
|
dstArrayDepleted = Component(EpicsSignalRO, "DIST:ARRAY-DEPLETED-RBV", auto_monitor=True, kind=Kind.hinted)
|
||||||
|
|
||||||
dstDirection = Component(EpicsSignal, "DIST:EVENTDIR", put_complete=True, kind=Kind.omitted)
|
dstDirection = Component(EpicsSignal, "DIST:EVENTDIR", put_complete=True, kind=Kind.omitted)
|
||||||
@ -730,11 +743,30 @@ class aa1AxisPsoDistance(aa1AxisPsoBase):
|
|||||||
For a more detailed description of additional signals and masking plase
|
For a more detailed description of additional signals and masking plase
|
||||||
refer to Automation1's online manual.
|
refer to Automation1's online manual.
|
||||||
"""
|
"""
|
||||||
|
SUB_PROGRESS = "progress"
|
||||||
|
|
||||||
def __init__(self, prefix="", *, name, kind=None, read_attrs=None, configuration_attrs=None, parent=None, **kwargs):
|
def __init__(self, prefix="", *, name, kind=None, read_attrs=None, configuration_attrs=None, parent=None, **kwargs):
|
||||||
""" __init__ MUST have a full argument list"""
|
""" __init__ MUST have a full argument list"""
|
||||||
super().__init__(prefix=prefix, name=name, kind=kind, read_attrs=read_attrs, configuration_attrs=configuration_attrs, parent=parent, **kwargs)
|
super().__init__(prefix=prefix, name=name, kind=kind, read_attrs=read_attrs, configuration_attrs=configuration_attrs, parent=parent, **kwargs)
|
||||||
self._Vdistance = 3.141592
|
self._Vdistance = 3.141592
|
||||||
|
self.subscribe(self._progress_update, "progress", run=False)
|
||||||
|
|
||||||
|
def _progress_update(self, value, **kwargs) -> None:
|
||||||
|
"""Progress update on the scan"""
|
||||||
|
if self.dstArrayDepleted.value:
|
||||||
|
print("PSO array depleted")
|
||||||
|
self._run_subs( sub_type=self.SUB_PROGRESS, value=1, max_value=1, done=1, )
|
||||||
|
return
|
||||||
|
|
||||||
|
progress = 1
|
||||||
|
max_value = 1
|
||||||
|
print(f"PSO array proggress: {progress}")
|
||||||
|
self._run_subs(
|
||||||
|
sub_type=self.SUB_PROGRESS,
|
||||||
|
value=int(progress), max_value=max_value, done=int(np.isclose(max_value, progress, 1e-3)), )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ########################################################################
|
# ########################################################################
|
||||||
# PSO high level interface
|
# PSO high level interface
|
||||||
@ -800,18 +832,17 @@ class aa1AxisPsoDistance(aa1AxisPsoBase):
|
|||||||
self.outSource.set("Waveform").wait()
|
self.outSource.set("Waveform").wait()
|
||||||
|
|
||||||
new = self.read_configuration()
|
new = self.read_configuration()
|
||||||
|
print("PSO configured")
|
||||||
return (old, new)
|
return (old, new)
|
||||||
|
|
||||||
# ########################################################################
|
# ########################################################################
|
||||||
# Bluesky step scan interface
|
# Bluesky step scan interface
|
||||||
def stage(self, settle_time=None):
|
def complete(self, settle_time=0.1) -> DeviceStatus:
|
||||||
self.dstEventsEna.set("On").wait()
|
""" DDC just reads back whatever is available in the buffers"""
|
||||||
if hasattr(self, "_distanceValue") and isinstance(self._distanceValue, (np.ndarray, list, tuple)):
|
|
||||||
self.dstArrayRearm.set(1).wait()
|
|
||||||
self.dstCounterEna.set("On").wait()
|
|
||||||
if settle_time is not None:
|
|
||||||
sleep(settle_time)
|
sleep(settle_time)
|
||||||
return super().stage()
|
status = DeviceStatus(self)
|
||||||
|
status.set_finished()
|
||||||
|
return status
|
||||||
|
|
||||||
def trigger(self):
|
def trigger(self):
|
||||||
return super().trigger()
|
return super().trigger()
|
||||||
@ -832,6 +863,7 @@ class aa1AxisPsoDistance(aa1AxisPsoBase):
|
|||||||
self.dstCounterEna.set("On").wait()
|
self.dstCounterEna.set("On").wait()
|
||||||
status = DeviceStatus(self)
|
status = DeviceStatus(self)
|
||||||
status.set_finished()
|
status.set_finished()
|
||||||
|
print("PSO kicked off")
|
||||||
return status
|
return status
|
||||||
|
|
||||||
def complete(self) -> DeviceStatus:
|
def complete(self) -> DeviceStatus:
|
||||||
@ -848,7 +880,10 @@ class aa1AxisPsoDistance(aa1AxisPsoBase):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
# Subscribe and wait for update
|
# Subscribe and wait for update
|
||||||
status = SubscriptionStatus(self.status, notRunning, settle_time=0.5)
|
#status = SubscriptionStatus(self.status, notRunning, settle_time=0.5)
|
||||||
|
# Data capture can be stopped any time
|
||||||
|
status = DeviceStatus(self)
|
||||||
|
status.set_finished()
|
||||||
else:
|
else:
|
||||||
# In distance trigger mode there's no specific goal
|
# In distance trigger mode there's no specific goal
|
||||||
status = DeviceStatus(self)
|
status = DeviceStatus(self)
|
||||||
@ -1007,6 +1042,7 @@ class aa1AxisDriveDataCollection(Device):
|
|||||||
|
|
||||||
# ########################################################################
|
# ########################################################################
|
||||||
# General module status
|
# General module status
|
||||||
|
state = Component(EpicsSignalRO, "STATE", auto_monitor=True, kind=Kind.hinted)
|
||||||
nsamples_rbv = Component(EpicsSignalRO, "SAMPLES_RBV", auto_monitor=True, kind=Kind.hinted)
|
nsamples_rbv = Component(EpicsSignalRO, "SAMPLES_RBV", auto_monitor=True, kind=Kind.hinted)
|
||||||
_switch = Component(EpicsSignal, "ACQUIRE", put_complete=True, kind=Kind.omitted)
|
_switch = Component(EpicsSignal, "ACQUIRE", put_complete=True, kind=Kind.omitted)
|
||||||
_input0 = Component(EpicsSignal, "INPUT0", put_complete=True, kind=Kind.config)
|
_input0 = Component(EpicsSignal, "INPUT0", put_complete=True, kind=Kind.config)
|
||||||
@ -1022,6 +1058,26 @@ class aa1AxisDriveDataCollection(Device):
|
|||||||
_buffer0 = Component(EpicsSignalRO, "BUFFER0", auto_monitor=True, kind=Kind.hinted)
|
_buffer0 = Component(EpicsSignalRO, "BUFFER0", auto_monitor=True, kind=Kind.hinted)
|
||||||
_buffer1 = Component(EpicsSignalRO, "BUFFER1", auto_monitor=True, kind=Kind.hinted)
|
_buffer1 = Component(EpicsSignalRO, "BUFFER1", auto_monitor=True, kind=Kind.hinted)
|
||||||
|
|
||||||
|
SUB_PROGRESS = "progress"
|
||||||
|
|
||||||
|
def __init__(self, prefix="", *, name, kind=None, read_attrs=None, configuration_attrs=None, parent=None, **kwargs):
|
||||||
|
super().__init__(prefix=prefix, name=name, kind=kind, read_attrs=read_attrs, configuration_attrs=configuration_attrs, parent=parent, **kwargs)
|
||||||
|
self.subscribe(self._progress_update, "progress", run=False)
|
||||||
|
|
||||||
|
def _progress_update(self, value, **kwargs) -> None:
|
||||||
|
"""Progress update on the scan"""
|
||||||
|
if self.state.value not in (2, "Acquiring"):
|
||||||
|
self._run_subs( sub_type=self.SUB_PROGRESS, value=1, max_value=1, done=1, )
|
||||||
|
return
|
||||||
|
|
||||||
|
progress = 1
|
||||||
|
max_value = 1
|
||||||
|
self._run_subs(
|
||||||
|
sub_type=self.SUB_PROGRESS,
|
||||||
|
value=int(progress), max_value=max_value, done=int(np.isclose(max_value, progress, 1e-3)), )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def configure(self, d: dict={}) -> tuple:
|
def configure(self, d: dict={}) -> tuple:
|
||||||
npoints = int(d['npoints'])
|
npoints = int(d['npoints'])
|
||||||
trigger = int(d['trigger']) if 'trigger' in d else DriveDataCaptureTrigger.PsoOutput
|
trigger = int(d['trigger']) if 'trigger' in d else DriveDataCaptureTrigger.PsoOutput
|
||||||
@ -1058,7 +1114,8 @@ class aa1AxisDriveDataCollection(Device):
|
|||||||
|
|
||||||
def complete(self, settle_time=0.1) -> DeviceStatus:
|
def complete(self, settle_time=0.1) -> DeviceStatus:
|
||||||
""" DDC just reads back whatever is available in the buffers"""
|
""" DDC just reads back whatever is available in the buffers"""
|
||||||
status = DeviceStatus(self, settle_time=settle_time)
|
sleep(settle_time)
|
||||||
|
status = DeviceStatus(self)
|
||||||
status.set_finished()
|
status.set_finished()
|
||||||
return status
|
return status
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user