Skip to content

Commit

Permalink
Add Wfm PVs
Browse files Browse the repository at this point in the history
  • Loading branch information
xresende committed Apr 23, 2024
1 parent cb47bde commit 4537fee
Show file tree
Hide file tree
Showing 8 changed files with 371 additions and 42 deletions.
20 changes: 20 additions & 0 deletions siriuspy/siriuspy/pwrsupply/csdev.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
MAX_WFMSIZE_OTHERS = 4096
DEF_WFMSIZE_OTHERS = 3920
DEFAULT_WFM_OTHERS = _np.zeros(DEF_WFMSIZE_OTHERS, dtype=float)
DEFAULT_WFM_SELECTED = 0
DEFAULT_WFM_FREQUENCY = 2000.0 # [Hz]
DEFAULT_WFM_GAIN = 1.0
DEFAULT_WFM_OFFSET = 0.0 # [A/V]

DEFAULT_WFM = _np.zeros(DEF_WFMSIZE_OTHERS)

Expand Down Expand Up @@ -1268,6 +1272,22 @@ def _get_ps_basic_propty_database():
'value': DEFAULT_SIGGEN_CONFIG[5:9]},
'CycleIndex-Mon': {'type': 'int', 'value': 0, 'unit': 'count'},
# Wfm - UDC
'WfmSelected-SP': {'type': 'int', 'value': DEFAULT_WFM_SELECTED},
'WfmSelected-RB': {'type': 'int', 'value': DEFAULT_WFM_SELECTED},
'WfmSyncMode-Sel': {
'type': 'enum', 'enums': _et.WFMREF_SYNCMODE, 'value': _ConstPSBSMP.E_WFMREFSYNC_ONESHOT},
'WfmSyncMode-Sts': {
'type': 'enum', 'enums': _et.WFMREF_SYNCMODE, 'value': _ConstPSBSMP.E_WFMREFSYNC_ONESHOT},
'WfmFreq-SP': {'type': 'float', 'value': DEFAULT_WFM_FREQUENCY, 'unit': 'Hz'},
'WfmFreq-RB': {'type': 'float', 'value': DEFAULT_WFM_FREQUENCY, 'unit': 'Hz'},
'WfmGain-SP': {'type': 'float', 'value': DEFAULT_WFM_GAIN},
'WfmGain-RB': {'type': 'float', 'value': DEFAULT_WFM_GAIN},
'WfmOffset-SP': {
'type': 'float', 'value': DEFAULT_WFM_OFFSET,
'prec': PS_CURRENT_PRECISION, 'unit': 'A'},
'WfmOffset-RB': {
'type': 'float', 'value': DEFAULT_WFM_OFFSET,
'prec': PS_CURRENT_PRECISION, 'unit': 'A'},
'Wfm-SP': {'type': 'float', 'count': len(DEFAULT_WFM),
'value': list(DEFAULT_WFM), 'unit': 'A',
'prec': PS_CURRENT_PRECISION},
Expand Down
23 changes: 23 additions & 0 deletions siriuspy/siriuspy/pwrsupply/psctrl/pscontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,14 @@ class StandardPSController(PSController):
'CycleAuxParam-SP', # start index of auxparams
]

_WFM_PARMS = [
'WfmSelected-SP',
'WfmSyncMode-SP',
'WfmFreq-SP',
'WfmGain-SP',
'WfmOffset-SP',
]

def write(self, devname, field, value):
"""Write value to pv."""
priority_pvs = dict()
Expand All @@ -188,6 +196,8 @@ def write(self, devname, field, value):
self._set_sofb_current(pvname, value, devname, field, priority_pvs)
elif field in StandardPSController._SIGGEN_PARMS:
self._set_siggen(pvname, value, devname, field, priority_pvs)
elif field in StandardPSController._WFM_PARMS:
self._set_wfm(pvname, value, devname, field, priority_pvs)
else:
self._writers[pvname].execute(value)

Expand All @@ -210,6 +220,13 @@ def _set_siggen(self, pvname, value, devname, field, priority_pvs):
values[idx] = value
self._writers[pvname].execute(values)

def _set_wfm(self, pvname, value, devname, field, priority_pvs):
_ = priority_pvs
idx = StandardPSController._WFM_PARMS.index(field)
values = self._get_wfm_arg_values(devname)
values[idx] = value
self._writers[pvname].execute(values)

def _set_sofb_current(self, pvname, value, devname, field, priority_pvs):
_ = field

Expand Down Expand Up @@ -239,3 +256,9 @@ def _get_siggen_arg_values(self, devname):
aux = StandardPSController._SIGGEN_PARMS[-1]
args.extend(self._readers[devname + ':' + aux].read())
return args

def _get_wfm_arg_values(self, devname):
"""Get Wfm args."""
args = [self._readers[devname + ':' + arg].read()
for arg in StandardPSController._WFM_PARMS]
return args
28 changes: 20 additions & 8 deletions siriuspy/siriuspy/pwrsupply/psctrl/pscwriters.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,24 @@ def execute(self, value=None):
self._cfg.execute(value)


class CfgWfm(Function):
"""Command to configure Wfm."""

def __init__(self, device_ids, pru_controller, idx, setpoints=None):
"""Init."""
self._idx = idx
self._setpoints = setpoints
self._cfg = BSMPFunction(
device_ids, pru_controller, _const_psbsmp.F_CFG_WFMREF)

def execute(self, value=None):
"""Execute command."""
if not self._setpoints or \
(self._setpoints and
self._setpoints.apply(value[self._idx])):
self._cfg.execute(value)


class SOFBCurrent(Function):
"""."""

Expand Down Expand Up @@ -438,15 +456,9 @@ def __init__(self, epics_field, epics_database):
self.field = epics_field
self.value = epics_database['value']
self.database = epics_database
if '-Cmd' in epics_field:
self.is_cmd = True
else:
self.is_cmd = False
self.is_cmd = '-Cmd' in epics_field
self.type = epics_database['type']
if 'count' in epics_database:
self.count = epics_database['count']
else:
self.count = None
self.count = epics_database.get('count', None)
if self.type == 'enum' and 'enums' in epics_database:
self.enums = epics_database['enums']
else:
Expand Down
17 changes: 17 additions & 0 deletions siriuspy/siriuspy/pwrsupply/psctrl/psmodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ class _PSModel:
'CycleAmpl-RB': _c.V_SIGGEN_AMPLITUDE,
'CycleOffset-RB': _c.V_SIGGEN_OFFSET,
'CycleAuxParam-RB': _c.V_SIGGEN_AUX_PARAM,
# Wfm
'WfmSelected-RB': _c.V_WFMREF_SELECTED,
'WfmSyncMode-Sts': _c.V_WFMREF_SYNC_MODE,
'WfmFreq-RB': _c.V_WFMREF_FREQUENCY,
'WfmGain-RB': _c.V_WFMREF_GAIN,
'WfmOffset-RB': _c.V_WFMREF_OFFSET,
# Scope
'ScopeSrcAddr-RB': _c.V_SCOPE_SRC_DATA,
'ScopeFreq-RB': _c.V_SCOPE_FREQUENCY,
Expand Down Expand Up @@ -296,6 +302,17 @@ def _writer_wfm(
if epics_field == 'WfmMonAcq-Sel':
return _writers.WfmMonAcq(
device_ids, pru_controller, setpoints)
p2i = {
'WfmSelected-SP': 0,
'WfmSyncMode-Sel': 1,
'WfmFreq-SP': 2,
'WfmGain-SP': 3,
'WfmOffset-SP': 4,
}
if epics_field in p2i:
idx = p2i[epics_field]
return _writers.CfgWfm(
device_ids, pru_controller, idx, setpoints)
return None


Expand Down
Loading

0 comments on commit 4537fee

Please sign in to comment.