Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IVU Feedforward GUI #716

Merged
merged 9 commits into from
Nov 1, 2024
140 changes: 129 additions & 11 deletions pyqt-apps/siriushla/si_ap_idff/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

from qtpy.QtCore import Qt
from qtpy.QtWidgets import QLabel, QGridLayout, QSizePolicy as QSzPlcy, \
QWidget, QGroupBox, QVBoxLayout, QPushButton, QSpacerItem
QWidget, QGroupBox, QHBoxLayout, QVBoxLayout, QPushButton, QSpacerItem, \
QHeaderView

from time import strftime, localtime
import qtawesome as qta

from pydm.widgets import PyDMPushButton
import numpy as np
from pydm.widgets import PyDMPushButton, PyDMWaveformTable

from siriuspy.envars import VACA_PREFIX as _VACA_PREFIX
from siriuspy.namesys import SiriusPVName as _PVName
Expand All @@ -15,7 +17,8 @@

from ..util import connect_window
from ..widgets import SiriusMainWindow, SiriusLabel, SiriusSpinbox, \
PyDMStateButton, SiriusLedState, PyDMLogLabel, SiriusLedAlert
PyDMStateButton, SiriusLedState, PyDMLogLabel, SiriusLedAlert, \
SiriusConnectionSignal
from ..widgets.dialog import StatusDetailDialog
from ..as_ps_control.control_widget.ControlWidgetFactory import \
ControlWidgetFactory
Expand All @@ -24,6 +27,12 @@
from .util import get_idff_icon


class SiriusWaveformTable(PyDMWaveformTable):
RafaelLyra8 marked this conversation as resolved.
Show resolved Hide resolved
def value_changed(self, new_waveform):
if isinstance(new_waveform, np.ndarray):
super().value_changed(new_waveform)


class IDFFWindow(SiriusMainWindow):
"""ID FF main window."""

Expand All @@ -32,10 +41,12 @@ def __init__(self, parent=None, prefix='', idname=''):
super().__init__(parent)
self.prefix = prefix or _VACA_PREFIX
self.idname = idname
self._const = IDFFConst(idname)
self._is_ivu = "IVU" in idname
self._idffname = IDFFConst(idname).idffname
self._idffdata = IDSearch.conv_idname_2_idff(self.idname)
self.device = _PVName(self._const.idffname)
self.dev_pref = self.device.substitute(prefix=prefix)
self.device = _PVName(self._idffname)
self.dev_pref = _PVName(f"SI-{self.device.sub}:BS-IDFF-CHCV:") if self._is_ivu else \
self.device.substitute(prefix=prefix)
self.setObjectName('IDApp')
self.setWindowTitle(self.device)
self.setWindowIcon(get_idff_icon())
Expand All @@ -50,13 +61,119 @@ def _setupUi(self):
wid = QWidget()
lay = QGridLayout(wid)
lay.addWidget(self.title, 0, 0, 1, 2)
lay.addWidget(self._idStatusWidget(), 1, 0)
lay.addWidget(self._corrStatusWidget(), 2, 0)
lay.addWidget(self._basicSettingsWidget(), 3, 0)
lay.addWidget(self._logWidget(), 4, 0)
if not self._is_ivu:
lay.addWidget(self._idStatusWidget(), 1, 0)
lay.addWidget(self._corrStatusWidget(), 2, 0)
lay.addWidget(self._basicSettingsWidget(), 3, 0)
lay.addWidget(self._logWidget(), 4, 0)
else:
lay.addWidget(self._ivuStatusWidget(), 1, 0, 1, 1)
lay.addWidget(self._ivuSettingsWidget(), 2, 0, 3, 1)
lay.addWidget(self._corrsMonitorWidget(), 1, 1, 4, 1)
self.setCentralWidget(wid)

def _ivuStatusWidget(self):
gbox = QGroupBox('ID Status', self)
hlay = QHBoxLayout(gbox)

lbl_gap = QLabel(
'Gap: ', self)
gap_val = SiriusLabel(
self, self.dev_pref.substitute(propty='IDPos-Mon'))
gap_val.showUnits = True

hlay.addWidget(lbl_gap)
hlay.addWidget(gap_val)

return gbox

def _format_timestamp_label(self, value):
self.timestamp.setText(strftime(
'%Y-%m-%d %H:%M:%S', localtime(value/1000)))

def _ivuSettingsWidget(self):
gbox = QGroupBox('Settings', self)
lay = QGridLayout(gbox)

ld_loopstate = QLabel(
'Loop State: ', self)
self.sb_loopstate = PyDMStateButton(
self, self.dev_pref.substitute(propty='LoopState-Sel'))
self.lb_loopstate = SiriusLedState(
self, self.dev_pref.substitute(propty='LoopState-Sts'))

lbl_table_pointer = QLabel(
'Table Pointer: ', self)
self.table_pointer = SiriusLabel(
self, self.dev_pref.substitute(propty='TablePointer-Mon'))

lbl_alarm = QLabel(
'Alarm: ', self)
self.alarm_led = SiriusLedState(
self, self.dev_pref.substitute(propty='Alarms-Mon'))

alarm_details = QPushButton('', self)
alarm_details.setIcon(qta.icon('fa5s.list-ul'))
alarm_details.setToolTip('Open Detailed Alarms View')
alarm_details.setObjectName('sts')
alarm_details.setStyleSheet(
'#sts{min-width:25px; max-width:25px; icon-size:20px;}')
connect_window(
alarm_details, StatusDetailDialog, parent=self,
pvname=self.dev_pref.substitute(propty='Alarms-Mon'),
labels=["Mode/Polar. out of range", "Gap/phase out of range",
"Gap/phase high deviation", "Timeout for serial data"],
section='ID', title='FeedForward Status')

self.clear_alarms = PyDMPushButton(
self, "Clear Alarms",
init_channel=self.dev_pref.substitute(propty='ClearFlags-Cmd'))

lbl_plc_counter = QLabel(
'PLC Counter: ', self)
self.plc_counter = SiriusLabel(
self, self.dev_pref.substitute(propty='PLCCounter-Mon'))

lbl_timestamp = QLabel(
'PLC Timestamp: ', self)
self.timestamp = QLabel('0:00:00', self)
self.timestamp_mon = SiriusConnectionSignal(
self.dev_pref.substitute(propty='PLCTimestamp-Mon'))
self.timestamp_mon.new_value_signal[float].connect(
self._format_timestamp_label)

lbl_table = QLabel(
'Current Table: ', self)
self.table_sp = SiriusWaveformTable(
self, self.dev_pref.substitute(propty='Table-SP'))
self.table_sp.setColumnCount(4)
self.table_sp.columnHeaderLabels = ["CH1", "CH2", "CV1", "CV2"]
self.table_sp.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.table_rb = SiriusWaveformTable(
self, self.dev_pref.substitute(propty='Table-RB'))
self.table_rb.setColumnCount(4)
self.table_rb.columnHeaderLabels = ["CH1", "CH2", "CV1", "CV2"]
self.table_rb.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

lay.addWidget(ld_loopstate, 0, 0)
lay.addWidget(self.sb_loopstate, 0, 1)
lay.addWidget(self.lb_loopstate, 0, 2)
lay.addWidget(lbl_table_pointer, 1, 0)
lay.addWidget(self.table_pointer, 1, 1, 1, 2)
lay.addWidget(lbl_alarm, 2, 0)
lay.addWidget(self.alarm_led, 2, 1)
lay.addWidget(alarm_details, 2, 2)
lay.addWidget(self.clear_alarms, 3, 0, 1, 3)
lay.addWidget(lbl_plc_counter, 4, 0)
lay.addWidget(self.plc_counter, 4, 1, 1, 2)
lay.addWidget(lbl_timestamp, 5, 0)
lay.addWidget(self.timestamp, 5, 1, 1, 2)
lay.addWidget(lbl_table, 6, 0)
lay.addWidget(self.table_sp, 6, 1)
lay.addWidget(self.table_rb, 6, 2)

return gbox

def _basicSettingsWidget(self):
ld_configname = QLabel(
'Config. Name: ', self, alignment=Qt.AlignRight)
Expand Down Expand Up @@ -193,6 +310,7 @@ def _idStatusWidget(self):
lay.addItem(QSpacerItem(0, 15, QSzPlcy.Ignored, QSzPlcy.Fixed), 2, 0)
lay.addWidget(ld_polar, 3, 0)
lay.addWidget(self.lb_polar, 3, 1, 1, 3)

return gbox

def _logWidget(self):
Expand Down
Loading