Source code for malcolm.modules.ca.parts.cawaveformtablepart
from malcolm.core import (
DEFAULT_TIMEOUT,
BadValueError,
Display,
NumberArrayMeta,
Part,
PartRegistrar,
TableMeta,
Widget,
)
from .. import util
[docs]class CAWaveformTablePart(Part):
"""Defines a float64[] `Attribute` that talks to multiple DBR_DOUBLE
waveform PV, plus checks HOPR & LOPR on these PVs to determine axis limits
"""
def __init__(
self,
name: util.APartName,
description: util.AMetaDescription,
pv_list: util.APvList = (),
name_list: util.ANameList = (),
min_delta: util.AMinDelta = 0.05,
timeout: util.ATimeout = DEFAULT_TIMEOUT,
widget: util.AWidget = Widget.PLOT,
group: util.AGroup = None,
config: util.AConfig = True,
display_from_pv: util.AGetLimits = True,
) -> None:
if len(pv_list) != len(name_list):
raise BadValueError("List of PVs must be same length as list of names!")
super().__init__(name)
self.display_from_pv = display_from_pv
elements = {}
for name in name_list:
elements[name] = NumberArrayMeta(
"float64", name, tags=[Widget.TEXTUPDATE.tag()]
)
self.name_list = name_list
self.pv_list = pv_list
self.caa = util.WaveformTableAttribute(
TableMeta(description, writeable=False, elements=elements),
util.catools.DBR_DOUBLE,
pv_list,
name_list,
min_delta,
timeout,
widget,
group,
config,
on_connect=self._update_display,
)
def _update_display(self, connected_pv):
if self.display_from_pv:
el = [
ind
for ind in range(len(self.pv_list))
if self.pv_list[ind] == connected_pv.name
]
if len(el) == 1:
display = Display(
limitHigh=connected_pv.upper_disp_limit,
limitLow=connected_pv.lower_disp_limit,
precision=connected_pv.precision,
units=connected_pv.units,
)
self.caa.attr.meta.elements[self.name_list[el[0]]].set_display(display)
def setup(self, registrar: PartRegistrar) -> None:
self.caa.setup(registrar, self.name, self.register_hooked)