From a6a53ddfc0155b75b217bf4baa0c79e5406c80a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 2 May 2024 14:40:24 +0200 Subject: [PATCH] WIP --- GNUmakefile | 4 +- README.md | 1 + ecmc_plugin_motion/src/ecmcMotionPlg.cpp | 2 +- ecmc_plugin_motion/src/ecmcPluginMotion.c | 8 +- tools/README.md | 10 +- tools/ecmcMotionMainGui.py | 8 +- tools/ecmcMotionMainPyQtGraph.py | 89 ++- tools/old/ecmcMotionMainGui.py | 848 ++++++++++++++++++++++ tools/test.png | Bin 0 -> 66234 bytes 9 files changed, 933 insertions(+), 37 deletions(-) create mode 100644 tools/old/ecmcMotionMainGui.py create mode 100644 tools/test.png diff --git a/GNUmakefile b/GNUmakefile index 0425d2a..b773253 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -6,7 +6,7 @@ BUILDCLASSES = Linux ARCH_FILTER = deb10% # Run 7.0.6 for now -EXCLUDE_VERSIONS+=3 7.0.5 7.0.7 +EXCLUDE_VERSIONS+=3 7.0.5 7.0.6 IGNORE_MODULES += asynMotor IGNORE_MODULES += motorBase @@ -17,7 +17,7 @@ OPT_CXXFLAGS_YES = -O3 # dependencies ECmasterECMC_VERSION = v1.1.0 motorECMC_VERSION = 7.0.7-ESS -ecmc_VERSION = v9.0.1_RC1 +ecmc_VERSION = 9.5.0 ################################################################################ # THIS RELATES TO THE EtherCAT MASTER LIBRARY diff --git a/README.md b/README.md index 0706d0d..802eb9b 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Plugin designed for commisioning and troubleshooting of motion axes. Motion data are sampled, buffered and exposed to epics as waveforms. +python3 ecmcMotionMainPyQtGraph.py c6025a-04 0 diff --git a/ecmc_plugin_motion/src/ecmcMotionPlg.cpp b/ecmc_plugin_motion/src/ecmcMotionPlg.cpp index 5cf7fd7..2aea597 100644 --- a/ecmc_plugin_motion/src/ecmcMotionPlg.cpp +++ b/ecmc_plugin_motion/src/ecmcMotionPlg.cpp @@ -906,7 +906,7 @@ asynStatus ecmcMotionPlg::writeInt32(asynUser *pasynUser, epicsInt32 value) { } else if( function == asynAxisId_){ return setAxis(value) > 0 ? asynSuccess : asynError; } else if( function == asynModeId_){ - return setMode((TRIGG_MODE)value) > 0 ? asynSuccess : asynError; + return setMode((TRIGG_MODE)value) == 0 ? asynSuccess : asynError; } else if( function == asynModeId_){ return setTrigg(value) ? asynSuccess :asynError; } diff --git a/ecmc_plugin_motion/src/ecmcPluginMotion.c b/ecmc_plugin_motion/src/ecmcPluginMotion.c index e240feb..413f03a 100644 --- a/ecmc_plugin_motion/src/ecmcPluginMotion.c +++ b/ecmc_plugin_motion/src/ecmcPluginMotion.c @@ -48,10 +48,10 @@ int motionConstruct(char *configStr) **/ void motionDestruct(void) { - deleteAllMotionObjs(); - if(lastConfStr){ - free(lastConfStr); - } + //deleteAllMotionObjs(); + //if(lastConfStr){ + // free(lastConfStr); + //} } /** Optional function. diff --git a/tools/README.md b/tools/README.md index 9d714a3..62bcad4 100644 --- a/tools/README.md +++ b/tools/README.md @@ -1,8 +1,2 @@ -# FFT tools - -## GUI - -A python gui for vizualization and control of the FFT plugin can be found in the ecmccomgui repo: -https://github.com/anderssandstrom/ecmccomgui - -![ecmcFFTMainGui.py](docs/gui/ecmcFFTMainGui.png) +# Tool for visualization +python3 ecmcMotionMainPyQtGraph.py c6025a-04 0 diff --git a/tools/ecmcMotionMainGui.py b/tools/ecmcMotionMainGui.py index 21d6699..64acf81 100644 --- a/tools/ecmcMotionMainGui.py +++ b/tools/ecmcMotionMainGui.py @@ -166,12 +166,14 @@ class ecmcMtnMainGui(QtWidgets.QDialog): self.pauseBtn.setFixedSize(100, 50) self.pauseBtn.clicked.connect(self.pauseBtnAction) self.pauseBtn.setStyleSheet("background-color: green") - self.openBtn = QPushButton(text = 'open data') + self.openBtn = QPushButton(text = 'open data') self.openBtn.setFixedSize(100, 50) + self.openBtn.setEnabled(False) # Not yet supported self.openBtn.clicked.connect(self.openBtnAction) self.saveBtn = QPushButton(text = 'save data') self.saveBtn.setFixedSize(100, 50) self.saveBtn.clicked.connect(self.saveBtnAction) + self.saveBtn.setEnabled(False) # Not yet supported self.enableBtn = QPushButton(text = 'enable Mtn') self.enableBtn.setFixedSize(100, 50) self.enableBtn.clicked.connect(self.enableBtnAction) @@ -181,11 +183,13 @@ class ecmcMtnMainGui(QtWidgets.QDialog): self.zoomBtn = QPushButton(text = 'auto zoom') self.zoomBtn.setFixedSize(100, 50) self.zoomBtn.clicked.connect(self.zoomBtnAction) + self.zoomBtn.setEnabled(False) # Not yet supported self.modeCombo = QComboBox() self.modeCombo.setFixedSize(100, 50) self.modeCombo.currentIndexChanged.connect(self.newModeIndexChanged) self.modeCombo.addItem("CONT") - self.modeCombo.addItem("TRIGG") + self.modeCombo.addItem("TRIGG" + self.modeCombo.setEnabled(False)) # Not yet supported self.progressBar = QProgressBar() self.progressBar.reset() self.progressBar.setMinimum(0) diff --git a/tools/ecmcMotionMainPyQtGraph.py b/tools/ecmcMotionMainPyQtGraph.py index 6241e66..0f6ab38 100644 --- a/tools/ecmcMotionMainPyQtGraph.py +++ b/tools/ecmcMotionMainPyQtGraph.py @@ -24,8 +24,12 @@ import pyqtgraph as pg from ecmcPvDataItem import * from ecmcParseAxisStatusWord import * +import os + # Allow buffering of 10s data, need to add setting for this xMaxTime = 10 +caqtdmAxisExpertPanelName = "ecmcAxisExpert_v1.ui" +caqtdmExe ="/usr/local/bin/caqtdm" # List of pv names pvlist = [ 'BuffSze', @@ -58,14 +62,12 @@ pvAnalog = ['PosAct-Arr', 'Stat-Arr'] pvAnaPLotsDefaultEnabled = ['PosAct-Arr', - 'PosSet-Arr', - 'PosErr-Arr'] + 'PosSet-Arr'] pvBinPLotsDefaultEnabled = ['enable', 'enabled', 'busy', - 'attarget', - 'moving'] + 'attarget'] pvBinBlock = ['instartup', 'inrealtime', 'axisType', @@ -83,7 +85,7 @@ pvFistAxisIndexName = 'MCU-Cfg-AX-FrstObjId' pvNextAxisIndexNamePart1 = 'MCU-Cfg-AX' pvNextAxisIndexNamePart2 = '-NxtObjId' -pvmiddlestring='Plg-Mtn' +pvmiddlestring=':Plg-Mtn' class ecmcMtnMainGui(QtWidgets.QDialog): def __init__(self,prefix="IOC_TEST:",mtnPluginId=0): @@ -188,7 +190,8 @@ class ecmcMtnMainGui(QtWidgets.QDialog): # Check connection and read sample rate pvSampleRate = epics.PV(self.pvPrefixStr + pvmiddlestring + str(int(self.mtnPluginId))+ '-SmpHz-RB') - connected = pvSampleRate.wait_for_connection(timeout = 2) + print(self.pvPrefixStr + pvmiddlestring + str(int(self.mtnPluginId))+ '-SmpHz-RB') + connected = pvSampleRate.wait_for_connection(timeout = 3) if connected: print('Connected to ecmc') self.offline = False @@ -200,7 +203,8 @@ class ecmcMtnMainGui(QtWidgets.QDialog): else: print('Not Connected') self.offline = True - self.pause = True + self.pause = True + self.sampleRate = 1000 self.sampleRateValid = True @@ -242,37 +246,58 @@ class ecmcMtnMainGui(QtWidgets.QDialog): self.plotItemBinary.setFixedHeight(150) self.plotItemBinary.setMouseEnabled(y=False) self.plotItemBinary.setLabel('bottom', 'Time [s]') + self.pauseBtn = QPushButton(text = 'pause') self.pauseBtn.setFixedSize(100, 50) self.pauseBtn.clicked.connect(self.pauseBtnAction) self.pauseBtn.setStyleSheet("background-color: green") + #self.pauseBtn.setEnabled(False) + #self.pauseBtn.setVisible(False) + self.openBtn = QPushButton(text = 'open data') self.openBtn.setFixedSize(100, 50) self.openBtn.clicked.connect(self.openBtnAction) + self.openBtn.setEnabled(False) + self.openBtn.setVisible(False) + self.saveBtn = QPushButton(text = 'save data') self.saveBtn.setFixedSize(100, 50) self.saveBtn.clicked.connect(self.saveBtnAction) + self.saveBtn.setEnabled(False) + self.saveBtn.setVisible(False) + self.enableBtn = QPushButton(text = 'enable Mtn') self.enableBtn.setFixedSize(100, 50) self.enableBtn.clicked.connect(self.enableBtnAction) self.triggBtn = QPushButton(text = 'trigg Mtn') self.triggBtn.setFixedSize(100, 50) + self.triggBtn.setEnabled(False) + self.triggBtn.setVisible(False) + self.triggBtn.clicked.connect(self.triggBtnAction) self.zoomBtn = QPushButton(text = 'auto zoom') self.zoomBtn.setFixedSize(100, 50) self.zoomBtn.clicked.connect(self.zoomBtnAction) + self.zoomBtn.setEnabled(False) + self.zoomBtn.setVisible(False) + self.modeCombo = QComboBox() self.modeCombo.setFixedSize(100, 50) self.modeCombo.currentIndexChanged.connect(self.newModeIndexChanged) self.modeCombo.addItem("CONT") self.modeCombo.addItem("TRIGG") + self.modeCombo.setEnabled(False) + self.modeCombo.setVisible(False) + self.progressBar = QProgressBar() self.progressBar.reset() self.progressBar.setMinimum(0) self.progressBar.setMaximum(100) #100% self.progressBar.setValue(0) self.progressBar.setFixedHeight(20) - + self.progressBar.setEnabled(False) + self.progressBar.setVisible(False) + # Fix layout self.setGeometry(300, 300, 1200, 900) @@ -367,17 +392,23 @@ class ecmcMtnMainGui(QtWidgets.QDialog): frameMotion = QFrame(self) layoutMotionGrid = QGridLayout() frameMotion.setLayout(layoutMotionGrid) + self.btnMotorRecord = QPushButton(text = 'Motor Record') self.btnMotorRecord.clicked.connect(self.openMotorRecordPanel) - self.btnMotorRecord.setFixedSize(100, 50) + self.btnMotorRecord.setFixedSize(150, 50) layoutMotionGrid.addWidget(self.btnMotorRecord,0,0) + self.btnCaQTDmAxisExpert = QPushButton(text = 'caqtdm ecmc Axis') + self.btnCaQTDmAxisExpert.clicked.connect(self.openCaQTDmAxisExpert) + self.btnCaQTDmAxisExpert.setFixedSize(150, 50) + layoutMotionGrid.addWidget(self.btnCaQTDmAxisExpert,1,0) + label = QLabel('Axis id:') self.cmbBxSelectAxis = QComboBox() self.cmbBxSelectAxis.currentIndexChanged.connect(self.changeAxisIndex) - layoutMotionGrid.addWidget(label,1,0) - layoutMotionGrid.addWidget(self.cmbBxSelectAxis,1,1) + layoutMotionGrid.addWidget(label,2,0) + layoutMotionGrid.addWidget(self.cmbBxSelectAxis,2,1) layoutVertMain.addWidget(frameMotion) @@ -432,10 +463,14 @@ class ecmcMtnMainGui(QtWidgets.QDialog): QCoreApplication.processEvents() def sig_cb_PosAct_Arr(self,value): + if self.pause: + return if(np.size(value)) > 0: self.MtnYDataValid = True def sig_cb_Time_Arr(self,value): + if self.pause: + return if(np.size(value)) > 0: self.MtnXDataValid = True self.plotAll() @@ -467,13 +502,13 @@ class ecmcMtnMainGui(QtWidgets.QDialog): if id >= 0: self.cmbBxSelectAxis.setCurrentIndex(id) - axisPrefixPvName = self.pvPrefixStr + pvAxisPrefixNamePart1 + str(int(value)) + pvAxisPrefixNamePart2 + axisPrefixPvName = self.pvPrefixStr + ":" + pvAxisPrefixNamePart1 + str(int(value)) + pvAxisPrefixNamePart2 prefixPV = epics.PV(axisPrefixPvName) axisPrefix = prefixPV.get() if axisPrefix is not None: - self.axisPrefix = axisPrefix + self.axisPrefix = axisPrefix.rstrip(':') - axisNamePvName = self.pvPrefixStr + pvAxisNamePart1 + str(int(value)) + pvAxisNamePart2 + axisNamePvName = self.pvPrefixStr + ":" + pvAxisNamePart1 + str(int(value)) + pvAxisNamePart2 namePV = epics.PV(axisNamePvName) axisName = namePV.get() if axisName is not None: @@ -488,6 +523,8 @@ class ecmcMtnMainGui(QtWidgets.QDialog): return def sig_cb_Stat_Arr(self,value): + if self.pause: + return data = self.parseAxisStatWd.convert(value) self.addStatWdData(data) @@ -521,7 +558,7 @@ class ecmcMtnMainGui(QtWidgets.QDialog): self.plotBinary() def readAxisList(self): - axIdPV = epics.PV(self.pvPrefixStr + pvFistAxisIndexName) + axIdPV = epics.PV(self.pvPrefixStr + ":" + pvFistAxisIndexName) axId = axIdPV.get() if axId is None: print('ERROR: First Axis Index PV not found.') @@ -532,7 +569,7 @@ class ecmcMtnMainGui(QtWidgets.QDialog): while axId >= 0: # Get next axis id - pvName = self.pvPrefixStr + pvNextAxisIndexNamePart1 + str(int(axId)) + pvNextAxisIndexNamePart2 + pvName = self.pvPrefixStr + ":" + pvNextAxisIndexNamePart1 + str(int(axId)) + pvNextAxisIndexNamePart2 axIdPV = epics.PV(pvName) axId = axIdPV.get() @@ -544,10 +581,22 @@ class ecmcMtnMainGui(QtWidgets.QDialog): self.pvItems['AxCmd-RB'].pvPut(self.cmbBxSelectAxis.currentData(), use_complete=True) def openMotorRecordPanel(self,xxx): - self.dialog = MotorPanel(self,self.axisPrefix ,self.axisName) - self.dialog.resize(500, 900) + self.dialog = MotorPanel(self,self.axisPrefix + ':' ,self.axisName) + self.dialog.resize(500, 900) self.dialog.show() + def openCaQTDmAxisExpert(self,xxx): + # caqtdm -macro "IOC=$I,SYS=$S,Axis=$A" ecmcAxisExpert_v1.ui + caqtdmString = caqtdmExe + " -macro " + caqtdmMacros = "SYS=" + self.axisPrefix + caqtdmMacros += ",IOC=" + self.axisPrefix + caqtdmMacros += ",Axis=" + self.axisName + + caqtdmString+= "\"" + caqtdmMacros + "\"" + " " + caqtdmAxisExpertPanelName + print(caqtdmString) + #subprocess.call(caqtdmString) + os.system(caqtdmString) + ###### Widget callbacks def pauseBtnAction(self): self.pause = not self.pause @@ -815,9 +864,9 @@ class ecmcMtnMainGui(QtWidgets.QDialog): def printOutHelp(): print("ecmcMtnMainGui: Plots waveforms of Mtn data (updates on Y data callback). ") print("python ecmcMtnMainGui.py ") - print(": Ioc prefix ('IOC_TEST:')") + print(": Ioc prefix ('IOC_TEST')") print(" : Id of mtn plugin ('0')") - print("example : python ecmcMotionMainGui.py 'IOC_TEST:' '0'") + print("example : python ecmcMotionMainGui.py 'IOC_TEST' '0'") print("Will connect to Pvs: Plg-Mtn-*") if __name__ == "__main__": diff --git a/tools/old/ecmcMotionMainGui.py b/tools/old/ecmcMotionMainGui.py new file mode 100644 index 0000000..21d6699 --- /dev/null +++ b/tools/old/ecmcMotionMainGui.py @@ -0,0 +1,848 @@ +#************************************************************************* +# Copyright (c) 2020 European Spallation Source ERIC +# ecmc is distributed subject to a Software License Agreement found +# in file LICENSE that is included with this distribution. +# +# ecmcMtnMainGui.py +# +# Created on: October 6, 2020 +# Author: Anders Sandström +# +# Plots two waveforms (x vs y) updates for each callback on the y-pv +# +#************************************************************************* + +import sys +import os +import epics +from PyQt5.QtWidgets import * +from PyQt5 import QtWidgets +from PyQt5.QtCore import * +from PyQt5.QtGui import * +import numpy as np +import matplotlib +matplotlib.use("Qt5Agg") +from matplotlib.figure import Figure +from matplotlib.animation import TimedAnimation +from matplotlib.lines import Line2D +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas +from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar +import matplotlib.pyplot as plt +import threading + +# Allow buffering of 10s data, need to add setting for this +xMaxTime = 10 + +# List of pv names +pvlist = [ 'BuffSze', + 'ElmCnt', + 'PosAct-Arr', + 'PosSet-Arr', + 'PosErr-Arr', + 'Time-Arr', + 'Ena-Arr', + 'EnaAct-Arr', + 'Bsy-Arr', + 'Exe-Arr', + 'TrjSrc-Arr', + 'EncSrc-Arr', + 'AtTrg-Arr', + 'ErrId-Arr', + 'Mde-RB', + 'Cmd-RB', + 'Stat', + 'AxCmd-RB', + 'SmpHz-RB', + 'TrgCmd-RB', + 'EnaCmd-RB' ] + +pvAnalog = ['PosAct-Arr', + 'PosSet-Arr', + 'PosErr-Arr', + 'ErrId-Arr'] + +pvBinary = ['Ena-Arr', + 'EnaAct-Arr', + 'Bsy-Arr', + 'Exe-Arr', + 'TrjSrc-Arr', + 'EncSrc-Arr', + 'AtTrg-Arr'] + +pvmiddlestring='Plg-Mtn' + +class comSignal(QObject): + data_signal = pyqtSignal(object) + +class ecmcMtnMainGui(QtWidgets.QDialog): + def __init__(self,prefix=None,mtnPluginId=None): + super(ecmcMtnMainGui, self).__init__() + + self.pvnames = {} + self.pvs = {} + self.pv_signal_cbs = {} + self.data = {} + self.datalength = {} + self.plottedLineAnalog = {} + self.plottedLineBinary = {} + + for pv in pvAnalog: + self.plottedLineAnalog[pv] = None + + for pv in pvBinary: + self.plottedLineBinary[pv] = None + + for pv in pvlist: + self.data[pv] = None + self.datalength[pv] = 0 + + #Set some default plot colours + self.plotColor={} + # Analog + self.plotColor['PosAct-Arr']='g' + self.plotColor['PosSet-Arr']='b' + self.plotColor['PosErr-Arr']='k' + self.plotColor['ErrId-Arr']='r' + + # Binary + self.plotColor['Ena-Arr']='b' + self.plotColor['EnaAct-Arr']='c' + self.plotColor['Bsy-Arr']='r' + self.plotColor['Exe-Arr']='m' + self.plotColor['TrjSrc-Arr']='y' + self.plotColor['EncSrc-Arr']='k' + self.plotColor['AtTrg-Arr']='g' + + self.offline = False + self.pvPrefixStr = prefix + self.pvPrefixOrigStr = prefix # save for restore after open datafile + self.mtnPluginId = mtnPluginId + self.mtnPluginOrigId = mtnPluginId + self.allowSave = False + self.path = '.' + self.unitAnalogY = "[]" + self.unitBinaryY = "[]" + self.labelBinaryY = "Binary" + self.labelAnalogY = "Analog" + self.title = "" + #self.NMtn = 1024 + self.sampleRate = 1000 + self.sampleRateValid = False + self.MtnYDataValid = False + self.MtnXDataValid = False + + if prefix is None or mtnPluginId is None: + self.offline = True + self.pause = True + self.data['EnaCmd-RB'] = False + else: + #Check for connection else go offline + self.buildPvNames() + connected = self.pvs['BuffSze'].wait_for_connection(timeout=2) + if connected: + self.offline = False + self.pause = False + else: + self.offline = True + self.pause = True + self.data['EnaCmd-RB'] = False + + self.startupDone=False + self.pause = 0 + self.createWidgets() + self.setStatusOfWidgets() + self.resize(1000,850) + return + + def createWidgets(self): + self.figure = plt.figure() + #self.plottedLineAnalog = None + #self.plottedLineBinary = None + self.axAnalog = None + self.axBinary = None + self.canvas = FigureCanvas(self.figure) + self.toolbar = NavigationToolbar(self.canvas, self) + self.pauseBtn = QPushButton(text = 'pause') + self.pauseBtn.setFixedSize(100, 50) + self.pauseBtn.clicked.connect(self.pauseBtnAction) + self.pauseBtn.setStyleSheet("background-color: green") + self.openBtn = QPushButton(text = 'open data') + self.openBtn.setFixedSize(100, 50) + self.openBtn.clicked.connect(self.openBtnAction) + self.saveBtn = QPushButton(text = 'save data') + self.saveBtn.setFixedSize(100, 50) + self.saveBtn.clicked.connect(self.saveBtnAction) + self.enableBtn = QPushButton(text = 'enable Mtn') + self.enableBtn.setFixedSize(100, 50) + self.enableBtn.clicked.connect(self.enableBtnAction) + self.triggBtn = QPushButton(text = 'trigg Mtn') + self.triggBtn.setFixedSize(100, 50) + self.triggBtn.clicked.connect(self.triggBtnAction) + self.zoomBtn = QPushButton(text = 'auto zoom') + self.zoomBtn.setFixedSize(100, 50) + self.zoomBtn.clicked.connect(self.zoomBtnAction) + self.modeCombo = QComboBox() + self.modeCombo.setFixedSize(100, 50) + self.modeCombo.currentIndexChanged.connect(self.newModeIndexChanged) + self.modeCombo.addItem("CONT") + self.modeCombo.addItem("TRIGG") + self.progressBar = QProgressBar() + self.progressBar.reset() + self.progressBar.setMinimum(0) + self.progressBar.setMaximum(100) #100% + self.progressBar.setValue(0) + self.progressBar.setFixedHeight(20) + + # Fix layout + self.setGeometry(300, 300, 900, 700) + + layoutVert = QVBoxLayout() + layoutVert.addWidget(self.toolbar) + layoutVert.addWidget(self.canvas) + + layoutControl = QHBoxLayout() + layoutControl.addWidget(self.pauseBtn) + layoutControl.addWidget(self.enableBtn) + layoutControl.addWidget(self.triggBtn) + layoutControl.addWidget(self.modeCombo) + layoutControl.addWidget(self.zoomBtn) + layoutControl.addWidget(self.saveBtn) + layoutControl.addWidget(self.openBtn) + + frameControl = QFrame(self) + frameControl.setFixedHeight(70) + frameControl.setLayout(layoutControl) + + + layoutVert.addWidget(frameControl) + layoutVert.addWidget(self.progressBar) + self.setLayout(layoutVert) + + def setStatusOfWidgets(self): + self.saveBtn.setEnabled(self.allowSave) + if self.offline: + self.enableBtn.setStyleSheet("background-color: grey") + self.enableBtn.setEnabled(False) + self.pauseBtn.setStyleSheet("background-color: grey") + self.pauseBtn.setEnabled(False) + self.modeCombo.setEnabled(False) + self.triggBtn.setEnabled(False) + self.setWindowTitle("ecmc Mtn Main plot: Offline") + else: + self.modeCombo.setEnabled(True) + # Check actual value of pvs + enable = self.pvs['EnaCmd-RB'].get() + if enable is None: + print("pvs['EnaCmd-RB'].get() failed") + return + if(enable>0): + self.enableBtn.setStyleSheet("background-color: green") + self.data['EnaCmd-RB'] = True + else: + self.enableBtn.setStyleSheet("background-color: red") + self.data['EnaCmd-RB'] = False + + #self.sourceStr = self.pvSource.get(as_string=True) + #if self.sourceStr is None: + # print("pvSource.get() failed") + # return + + self.sampleRate = self.pvs['SmpHz-RB'].get() + if self.sampleRate is None: + print("pvs['SmpHz-RB'].get() failed") + return + self.sampleRateValid = True + + # calc x Array + step=1/self.sampleRate + + self.x = np.arange(-xMaxTime-step,0+step,step) + print('x') + print(self.x) + + self.data['Mde-RB'] = self.pvs['Mde-RB'].get() + if self.data['Mde-RB'] is None: + print("pvs['Mde-RB'].get() failed") + return + + self.modeStr = "NO_MODE" + self.triggBtn.setEnabled(False) # Only enable if mode = TRIGG = 2 + if self.data['Mde-RB'] == 1: + self.modeStr = "CONT" + self.modeCombo.setCurrentIndex(self.data['Mde-RB']-1) # Index starta t zero + + if self.data['Mde-RB'] == 2: + self.modeStr = "TRIGG" + self.triggBtn.setEnabled(True) + self.modeCombo.setCurrentIndex(self.data['Mde-RB']-1) # Index starta t zero + + self.setWindowTitle("ecmc Mtn Main plot: prefix=" + self.pvPrefixStr + " , mtnId=" + str(self.mtnPluginId) + + ", rate=" + str(self.sampleRate)) + + def addData(self, pvName, values): + # Check if first assignment + if self.data[pvName] is None: + self.data[pvName] = values + return + + self.data[pvName]=np.append(self.data[pvName],values) + # check if delete in beginning is needed + currcount = len(self.data[pvName]) + if self.sampleRateValid: + allowedcount = int(xMaxTime * self.sampleRate) + else: + print('Warning sample rate not defined, fallback to max 10000 values') + allowedcount = 10000 + + # remove if needed + if currcount > allowedcount: + self.data[pvName]=self.data[pvName][currcount-allowedcount:] + + self.datalength[pvName] = len(self.data[pvName]) + + + def buildPvNames(self): + # Pv names based on structure: Plugin-Mtn- + for pv in pvlist: + self.pvnames[pv]=self.buildPvName(pv) + if self.pvnames[pv] is None: + raise RuntimeError("pvname must not be 'None'") + if len(self.pvnames[pv])==0: + raise RuntimeError("pvname must not be ''") + self.pvs[pv] = epics.PV(self.pvnames[pv]) + self.pv_signal_cbs[pv] = comSignal() + + # Signal callbacks (update gui) + # replace any '-' with '_' since '-' not allowed in funcion names + sig_cb_func=getattr(self,'sig_cb_' + pv.replace('-','_')) + self.pv_signal_cbs[pv].data_signal.connect(sig_cb_func) + + # Pv monitor callbacks + mon_cb_func=getattr(self,'on_change_' + pv.replace('-','_')) + self.pvs[pv].add_callback(mon_cb_func) + + QCoreApplication.processEvents() + + def buildPvName(self, suffixname): + return self.pvPrefixStr + pvmiddlestring + str(self.mtnPluginId) + '-' + suffixname + + ###### Pv monitor callbacks + def on_change_BuffSze(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['BuffSze'].data_signal.emit(value) + + def on_change_ElmCnt(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['ElmCnt'].data_signal.emit(value) + + def on_change_PosAct_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['PosAct-Arr'].data_signal.emit(value) + + def on_change_PosSet_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['PosSet-Arr'].data_signal.emit(value) + + def on_change_PosErr_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['PosErr-Arr'].data_signal.emit(value) + + def on_change_Time_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['Time-Arr'].data_signal.emit(value) + + def on_change_Ena_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['Ena-Arr'].data_signal.emit(value) + + def on_change_EnaAct_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['EnaAct-Arr'].data_signal.emit(value) + + def on_change_Bsy_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['Bsy-Arr'].data_signal.emit(value) + + def on_change_Exe_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['Exe-Arr'].data_signal.emit(value) + + def on_change_TrjSrc_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['TrjSrc-Arr'].data_signal.emit(value) + + def on_change_EncSrc_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['EncSrc-Arr'].data_signal.emit(value) + + def on_change_AtTrg_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['AtTrg-Arr'].data_signal.emit(value) + + def on_change_ErrId_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['ErrId-Arr'].data_signal.emit(value) + + def on_change_Mde_RB(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['Mde-RB'].data_signal.emit(value) + + def on_change_Cmd_RB(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['Cmd-RB'].data_signal.emit(value) + + def on_change_Stat(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['Stat'].data_signal.emit(value) + + def on_change_AxCmd_RB(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['AxCmd-RB'].data_signal.emit(value) + + def on_change_SmpHz_RB(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['SmpHz-RB'].data_signal.emit(value) + + def on_change_TrgCmd_RB(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['TrgCmd-RB'].data_signal.emit(value) + + def on_change_EnaCmd_RB(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): + self.pv_signal_cbs['EnaCmd-RB'].data_signal.emit(value) + +# def onChangePvMode(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): +# if self.pause: +# return +# self.comSignalMode.data_signal.emit(value) +# +# def onChangePvEnable(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): +# if self.pause: +# return +# self.comSignalEnable.data_signal.emit(value) +# +# def onChangeX(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): +# if self.pause: +# return +# self.comSignalX.data_signal.emit(value) +# +# def onChangePvSpectY(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): +# if self.pause: +# return +# self.comSignalSpectY.data_signal.emit(value) +# +# def onChangePvrawData(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): +# if self.pause: +# return +# self.comSignalRawData.data_signal.emit(value) +# +# def onChangePvBuffIdAct(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): +# if self.pause: +# return +# self.comSignalBuffIdAct.data_signal.emit(value) + + ###### Signal callbacks + def sig_cb_BuffSze(self,value): + self.data['BuffSze'] = value + + def sig_cb_ElmCnt(self,value): + self.data['ElmCnt'] = value + + def sig_cb_PosAct_Arr(self,value): + if(np.size(value)) > 0: + self.MtnYDataValid = True + self.addData('PosAct-Arr', value) + + def sig_cb_PosSet_Arr(self,value): + self.addData('PosSet-Arr', value) + + def sig_cb_PosErr_Arr(self,value): + self.addData('PosErr-Arr', value) + + def sig_cb_Time_Arr(self,value): + if(np.size(value)) > 0: + self.addData('Time-Arr', value) + self.MtnXDataValid = True + self.plotAll() + return + + def sig_cb_Ena_Arr(self,value): + self.addData('Ena-Arr', value) + + def sig_cb_EnaAct_Arr(self,value): + self.addData('EnaAct-Arr', value) + + def sig_cb_Bsy_Arr(self,value): + self.addData('Bsy-Arr', value) + + def sig_cb_Exe_Arr(self,value): + self.addData('Exe-Arr', value) + + def sig_cb_TrjSrc_Arr(self,value): + self.addData('TrjSrc-Arr', value) + + def sig_cb_EncSrc_Arr(self,value): + self.addData('EncSrc-Arr', value) + + def sig_cb_AtTrg_Arr(self,value): + self.addData('AtTrg-Arr', value) + + def sig_cb_ErrId_Arr(self,value): + self.addData('ErrId-Arr', value) + + def sig_cb_Mde_RB(self,value): + if value < 1 or value> 2: + self.modeStr = "NO_MODE" + print('callbackFuncMode: Error Invalid mode.') + return + + self.data['Mde-RB'] = value + self.modeCombo.setCurrentIndex(self.data['Mde-RB']-1) # Index starta t zero + + if self.data['Mde-RB'] == 1: + self.modeStr = "CONT" + self.triggBtn.setEnabled(False) # Only enable if mode = TRIGG = 2 + + if self.data['Mde-RB'] == 2: + self.modeStr = "TRIGG" + self.triggBtn.setEnabled(True) + return + + def sig_cb_Cmd_RB(self,value): + self.data['Cmd-RB'] = value + + def sig_cb_Stat(self,value): + self.data['Stat'] = value + + def sig_cb_AxCmd_RB(self,value): + self.data['AxCmd-RB'] = value + + def sig_cb_SmpHz_RB(self,value): + self.data['SmpHz-RB'] = value + + def sig_cb_TrgCmd_RB(self,value): + self.data['TrgCmd-RB'] = value + + def sig_cb_EnaCmd_RB(self,value): + self.data['EnaCmd-RB'] = value + + self.data['EnaCmd-RB'] = value + if self.data['EnaCmd-RB']: + self.enableBtn.setStyleSheet("background-color: green") + else: + self.enableBtn.setStyleSheet("background-color: red") + self.data['EnaCmd-RB'] = value + return + + +# def callbackFuncSpectY(self, value): +# if(np.size(value)) > 0: +# +# self.spectY = value +# self.MtnYDataValid = self.RawXDataValid +# self.plotAll() +# return +# +# def callbackFuncrawData(self, value): +# if(np.size(value)) > 0: +# if (self.data['Time-Arr'] is None or np.size(value) != np.size(self.rawdataY)) and self.sampleRateValid: +# self.data['Time-Arr'] = np.arange(-np.size(value)/self.sampleRate, 0, 1/self.sampleRate) +# self.RawXDataValid = True +# +# self.rawdataY = value +# self.RawYDataValid = True +# self.plotAll() +# return +# +# def callbackFuncBuffIdAct(self, value): +# if self.NMtn is None: +# return +# if(self.NMtn>0): +# self.progressBar.setValue(value/self.NMtn*100) +# if value/self.NMtn*100 < 80 and value/self.NMtn*100 >1: +# self.MtnYDataValid = False +# self.RawYDataValid = False +# return + + ###### Widget callbacks + def pauseBtnAction(self): + self.pause = not self.pause + if self.pause: + self.pauseBtn.setStyleSheet("background-color: red") + else: + self.pvPrefixStr = self.pvPrefixOrigStr # Restore if dataset was opened + self.mtnPluginId = self.mtnPluginOrigId # Restore if dataset was opened + self.buildPvNames() + + self.pauseBtn.setStyleSheet("background-color: green") + # Retrigger plots with newest values + #self.comSignalSpectY.data_signal.emit(self.spectY) + #self.comSignalRawData.data_signal.emit(self.rawdataY) + return + + def enableBtnAction(self): + self.data['EnaCmd-RB'] = not self.data['EnaCmd-RB'] + self.pvs['EnaCmd-RB'].put(self.data['EnaCmd-RB']) + if self.data['EnaCmd-RB']: + self.enableBtn.setStyleSheet("background-color: green") + else: + self.enableBtn.setStyleSheet("background-color: red") + return + + def triggBtnAction(self): + self.pvTrigg.put(True) + return + + def zoomBtnAction(self): + if self.data['Time-Arr'] is None: + return + + if self.data['PosAct-Arr'] is None: + return + + self.plotAnalog(True) + self.plotBinary(True) + return + + def newModeIndexChanged(self,index): + if index==0 or index==1: + if not self.offline and self.pvs['Mde-RB'] is not None: + self.pvs['Mde-RB'].put(index+1) + return + + def openBtnAction(self): + #if not self.offline: + # self.pause = 1 # pause while open if online + # self.pauseBtn.setStyleSheet("background-color: red") + # QCoreApplication.processEvents() + # + #fname = QFileDialog.getOpenFileName(self, 'Open file', self.path, "Data files (*.npz)") + #if fname is None: + # return + #if np.size(fname) != 2: + # return + #if len(fname[0])<=0: + # return + #self.path = os.path.dirname(os.path.abspath(fname[0])) + # + #npzfile = np.load(fname[0]) +# + ## verify scope plugin + #if npzfile['plugin'] != "Mtn": + # print ("Invalid data type (wrong plugin type)") + # return + # + ## File valid + #self.data['Time-Arr'] = npzfile['rawdataX'] + #self.rawdataY = npzfile['rawdataY'] + #self.dataX = npzfile['spectX'] + #self.spectY = npzfile['spectY'] + #self.sampleRate = npzfile['sampleRate'] + #self.NMtn = npzfile['NMtn'] + #self.data['Mde-RB'] = npzfile['mode'] + #self.pvPrefixStr = str(npzfile['pvPrefixStr']) + #self.mtnPluginId = npzfile['mtnPluginId'] + #if 'unitRawY' in npzfile: + # self.unitAnalogY = str(npzfile['unitRawY']) + #if 'unitSpectY' in npzfile: + # self.unitSpectY = str(npzfile['unitSpectY']) + #if 'labelRawY' in npzfile: + # self.labelAnalogY = str(npzfile['labelRawY']) + #if 'labelSpectY' in npzfile: + # self.labelSpectY = str(npzfile['labelSpectY']) + #if 'title' in npzfile: + # self.title = str(npzfile['title']) +# + #self.buildPvNames() + # + ## trigg draw + #self.MtnYDataValid = True + #self.MtnXDataValid = True + #self.RawYDataValid = True + #self.RawXDataValid = True + #self.sampleRateValid = True + + + #self.comSignalMode.data_signal.emit(self.data['Mde-RB']) + #self.comSignalX.data_signal.emit(self.dataX) + #self.comSignalSpectY.data_signal.emit(self.spectY) + #self.comSignalRawData.data_signal.emit(self.rawdataY) + + #self.setStatusOfWidgets() +# + #self.startupDone=True + #self.zoomBtnAction() + return + + def saveBtnAction(self): + #fname = QFileDialog.getSaveFileName(self, 'Save file', self.path, "Data files (*.npz)") + #if fname is None: + # return + #if np.size(fname) != 2: + # return + #if len(fname[0])<=0: + # return + ## Save all relevant data + #np.savez(fname[0], + # plugin = "Mtn", + # rawdataX = self.data['Time-Arr'], + # rawdataY = self.rawdataY, + # spectX = self.dataX, + # spectY = self.spectY, + # sampleRate = self.sampleRate, + # NMtn = self.NMtn, + # mode = self.data['Mde-RB'], + # pvPrefixStr = self.pvPrefixStr, + # mtnPluginId = self.mtnPluginId, + # unitRawY = self.unitAnalogY, + # unitSpectY = self.unitSpectY, + # labelRawY = self.labelAnalogY, + # labelSpectY = self.labelSpectY, + # title = self.title + # ) +# + #self.path = os.path.dirname(os.path.abspath(fname[0])) + + return + + def plotAll(self): + if self.MtnYDataValid and self.MtnXDataValid: + self.plotAnalog() + self.plotBinary() + self.MtnYDataValid = False + self.RawYDataValid = False + + def plotAnalog(self, autozoom=False): + if self.data['Time-Arr'] is None: + return + + if self.data['PosAct-Arr'] is None: + return + + # create an axis + if self.axAnalog is None: + self.axAnalog = self.figure.add_subplot(211) + self.axAnalog.set_xlim(-10,0) + + minimum_x=0 + # plot data + for pv in pvAnalog: + if self.plottedLineAnalog[pv] is not None: + self.plottedLineAnalog[pv].remove() + if self.data[pv] is not None: + y = self.data[pv] + y_len=len(y) + x_len=len(self.x) + self.plottedLineAnalog[pv], = self.axAnalog.plot(self.x[x_len-y_len:],y,self.plotColor[pv]) + + minimum_x_temp=-y_len/self.sampleRate + if minimum_x_temp < minimum_x: + minimum_x = minimum_x_temp + + else: + print("Data null for pv: " + pv) + + self.axAnalog.grid(True) + self.axAnalog.set_xlabel('Time [s]') + self.axAnalog.set_ylabel(self.labelAnalogY + ' ' + self.unitAnalogY) + self.axAnalog.set_title(self.title) + + if autozoom: + ymin = np.min(self.data['PosAct-Arr']) + ymax = np.max(self.data['PosAct-Arr']) + # ensure different values + if ymin == ymax: + ymin=ymin-1 + ymax=ymax+1 + range = ymax - ymin + ymax += range * 0.1 + ymin -= range * 0.1 + #xmin = np.min(self.data['Time-Arr']) + xmin=minimum_x + #xmax = np.max(self.data['Time-Arr']) + xmax = 0 + if xmin == xmax: + xmin = xmin - 1 + xmax = xmax + 1 + range = xmax - xmin + xmax += range * 0.02 + xmin -= range * 0.02 + self.axAnalog.set_ylim(ymin,ymax) + self.axAnalog.set_xlim(xmin,xmax) + + # refresh canvas + self.canvas.draw() + self.allowSave = True + self.saveBtn.setEnabled(True) + self.axAnalog.autoscale(enable=False) + + def plotBinary(self, autozoom=False): + if self.data['Time-Arr'] is None: + return + + #if self.data['PosAct-Arr'] is None: + # return + + # create an axis + if self.axBinary is None: + self.axBinary = self.figure.add_subplot(212) + self.axBinary.set_xlim(-10,0) + + + # plot data + minimum_x = 0 + for pv in pvBinary: + if self.plottedLineBinary[pv] is not None: + self.plottedLineBinary[pv].remove() + if self.data[pv] is not None: + y = self.data[pv] + y_len=len(y) + x_len=len(self.x) + self.plottedLineBinary[pv], = self.axBinary.plot(self.x[x_len-y_len:],y,self.plotColor[pv]) + + minimum_x_temp=-y_len/self.sampleRate + if minimum_x_temp < minimum_x: + minimum_x = minimum_x_temp + + else: + print("Data null for pv: " + pv) + + + self.axBinary.grid(True) + self.axBinary.set_xlabel('Time [s]') + self.axBinary.set_ylabel(self.labelBinaryY + ' ' + self.unitBinaryY) + self.axBinary.set_title(self.title) + + if autozoom: + ymin = -0.1 + ymax = 1.1 + # ensure different values + if ymin == ymax: + ymin=ymin-1 + ymax=ymax+1 + range = ymax - ymin + ymax += range * 0.1 + ymin -= range * 0.1 + #xmin = np.min(self.data['Time-Arr']) + xmin=minimum_x + #xmax = np.max(self.data['Time-Arr']) + xmax = 0 + if xmin == xmax: + xmin = xmin - 1 + xmax = xmax + 1 + range = xmax - xmin + xmax += range * 0.02 + xmin -= range * 0.02 + self.axBinary.set_ylim(ymin,ymax) + self.axBinary.set_xlim(xmin,xmax) + + # refresh canvas + self.canvas.draw() + self.allowSave = True + self.saveBtn.setEnabled(True) + self.axBinary.autoscale(enable=False) + +def printOutHelp(): + print("ecmcMtnMainGui: Plots waveforms of Mtn data (updates on Y data callback). ") + print("python ecmcMtnMainGui.py ") + print(": Ioc prefix ('IOC_TEST:')") + print(" : Id of mtn plugin ('0')") + print("example : python ecmcMotionMainGui.py 'IOC_TEST:' '0'") + print("Will connect to Pvs: Plg-Mtn-*") + +if __name__ == "__main__": + import sys + prefix = None + mtnid = None + if len(sys.argv) == 1: + prefix = None + mtnid = None + elif len(sys.argv) == 3: + prefix = sys.argv[1] + mtnid = int(sys.argv[2]) + else: + printOutHelp() + sys.exit() + app = QtWidgets.QApplication(sys.argv) + window=ecmcMtnMainGui(prefix=prefix,mtnPluginId=mtnid) + window.show() + sys.exit(app.exec_()) diff --git a/tools/test.png b/tools/test.png new file mode 100644 index 0000000000000000000000000000000000000000..cde96a03176a8e5a815ce1fef95cd317e2aa0b4d GIT binary patch literal 66234 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 z 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 literal 0 HcmV?d00001