Files
templates/python/set_devices/qt_ports/plot_workers.py

54 lines
1.9 KiB
Python

"""Reusable background workers for dense plots and viewport measurements."""
try:
from PySide6.QtCore import QObject, QRunnable, Signal
except ImportError:
from PySide2.QtCore import QObject, QRunnable, Signal
from set_devices.plot_decimation import pixel_envelope, viewport_samples
from set_devices.oscilloscope import measurements
class EnvelopeSignals(QObject):
ready = Signal(str, object, object)
class EnvelopeJob(QRunnable):
def __init__(self, key, geometry, timestamps, values, left, right, width, signals):
super().__init__()
self.args = (timestamps, values, left, right, width)
self.key, self.geometry, self.signals = key, geometry, signals
def run(self):
try:
points = tuple(pixel_envelope(*self.args))
except Exception:
points = None
try:
self.signals.ready.emit(self.key, self.geometry, points)
except RuntimeError:
pass # The plot may have been closed while the worker was running.
class NavigationSignals(QObject):
ready = Signal(int, object, object)
class NavigationJob(QRunnable):
def __init__(self, revision, series, bounds, emitter):
super().__init__()
self.revision, self.series, self.bounds, self.emitter = revision, series, bounds, emitter
def run(self):
stats = {}
try:
for key, times, values in self.series:
points = [(x, y) for x, y in viewport_samples(times, values, self.bounds.left, self.bounds.right)
if self.bounds.left <= x <= self.bounds.right]
stats[key] = measurements(points), len(points)
self.emitter.ready.emit(self.revision, stats, self.bounds)
except Exception:
try:
self.emitter.ready.emit(self.revision, {}, self.bounds)
except RuntimeError:
pass