54 lines
1.9 KiB
Python
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
|
|
|
|
|