Files
ecmc_plugin_motion/tools/ecmcTrendPv.py

76 lines
2.4 KiB
Python

#*************************************************************************
# 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.
#
# ecmcTrendPv.py
#
# Created on: July 6, 2020
# Author: Anders Sandström
#
# Heavily inspired by: https://exceptionshub.com/real-time-plotting-in-while-loop-with-matplotlib.html
#
# Extends the ecmcTrend class will epics pv callbacks
#
#*************************************************************************
import sys
import os
import epics
import ecmcTrend
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtCore import *
#from PyQt5.QtWidgets import *
#from PyQt5 import QtWidgets
#from PyQt5.QtCore import *
#from PyQt5.QtGui import *
import functools
import numpy as np
import random as rd
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 time
import threading
class comTrend(QObject):
data_signal = pyqtSignal(float)
class ecmcTrendPv(ecmcTrend.ecmcTrend):
def __init__(self,pvName=None):
super(ecmcTrendPv, self).__init__()
self.comTrend = comTrend()
self.comTrend.data_signal.connect(self.addData_callbackFunc) # update trend
self.startval = 0
self.pvName = pvName
self.connectPv(self.pvName) # Epics
self.setTitle(pvName)
return
def connectPv(self, pvname):
if pvname is None:
raise RuntimeError("pvname must not be 'None'")
if len(pvname)==0:
raise RuntimeError("pvname must not be ''")
self.pv = epics.PV(self.pvName)
self.startval = self.pv.get()
self.pv.add_callback(self.onChangePv)
self.myFig.addData(self.startval)
QCoreApplication.processEvents()
def onChangePv(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
self.comTrend.data_signal.emit(value)
def writePV(self,value):
self.pv.put(value)
self.myFig.addData(value)