"""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