X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=sigrok-meter;h=a56233d8cbf3212c24320b761cadd9bb2c1c7601;hb=911ab26ebbbc1021f35643e92150cf12895c2574;hp=d221c43c7d2083973a3bc6b0181ab621564f195c;hpb=50523e84db106a2ddcf952a6cbbd443664287dd5;p=sigrok-meter.git diff --git a/sigrok-meter b/sigrok-meter index d221c43..a56233d 100755 --- a/sigrok-meter +++ b/sigrok-meter @@ -1,5 +1,4 @@ #!/usr/bin/env python - ## ## This file is part of the sigrok-meter project. ## @@ -22,306 +21,106 @@ ## import argparse -import datetime -import os.path -import PyQt4.QtCore as QtCore -import PyQt4.QtGui as QtGui -import re -import sigrok.core as sr import sys import textwrap +import signal -default_drivers = [('demo', {'analog_channels': 1})] -default_loglevel = sr.LogLevel.WARN - -class SamplingThread(QtCore.QObject): - '''A class that handles the reception of sigrok packets in the background.''' - - class Worker(QtCore.QObject): - '''Helper class that does the actual work in another thread.''' - - '''Signal emitted when new data arrived.''' - measured = QtCore.pyqtSignal(object) - - def __init__(self, drivers, loglevel): - super(self.__class__, self).__init__() - - self.context = sr.Context_create() - self.context.log_level = loglevel - - self.sr_pkg_version = self.context.package_version - self.sr_lib_version = self.context.lib_version - - self.devices = [] - for name, options in drivers: - try: - dr = self.context.drivers[name] - self.devices.append(dr.scan(**options)[0]) - except: - print('error getting device for driver "{}", skipping'.format(name)) - - if not self.devices: - print('no devices found') - - def start_sampling(self): - self.session = self.context.create_session() - for dev in self.devices: - self.session.add_device(dev) - dev.open() - self.session.add_datafeed_callback(self.callback) - self.session.start() - self.session.run() - - def stop_sampling(self): - self.session.stop() - - def callback(self, device, packet): - if packet.type == sr.PacketType.ANALOG: - dev = '{} {}'.format(device.vendor, device.model) - - # only send the most recent value - mag = packet.payload.data[0][-1] - - self.measured.emit((dev, mag, packet.payload.unit, - packet.payload.mq_flags)) - - # wait a short time so that in any case we don't flood the GUI - # with new data (for example if the demo device is used) - self.thread().msleep(100) - - # signal used to start the worker across threads - _start_signal = QtCore.pyqtSignal() - - def __init__(self, drivers, loglevel): - super(self.__class__, self).__init__() - - self.worker = self.Worker(drivers, loglevel) - self.thread = QtCore.QThread() - self.worker.moveToThread(self.thread) - - self._start_signal.connect(self.worker.start_sampling) - - self.measured = self.worker.measured - - self.thread.start() - - def start(self): - '''Starts sampling''' - self._start_signal.emit() - - def stop(self): - '''Stops sampling and the background thread.''' - self.worker.stop_sampling() - self.thread.quit() - # the timeout is needed when the demo device is used, because it - # produces so much outstanding data that quitting takes a long time - self.thread.wait(500) - - def sr_pkg_version(self): - '''Returns the version number of the libsigrok package.''' - return self.worker.sr_pkg_version - - def sr_lib_version(self): - '''Returns the version number fo the libsigrok library.''' - return self.worker.sr_lib_version - -class SigrokMeter(QtGui.QMainWindow): - '''The main window of the application.''' - - def __init__(self, thread): - super(SigrokMeter, self).__init__() - self.setup_ui() - - self.inf = float('inf') - - self.thread = thread - self.thread.measured.connect(self.update, QtCore.Qt.QueuedConnection) - self.thread.start() - - def setup_ui(self): - self.setWindowTitle('sigrok-meter') - self.setMinimumHeight(130) - self.setMinimumWidth(260) - - p = os.path.abspath(os.path.dirname(__file__)) - p = os.path.join(p, 'sigrok-logo-notext.png') - self.setWindowIcon(QtGui.QIcon(p)) - - actionQuit = QtGui.QAction(self) - actionQuit.setText('&Quit') - actionQuit.setIcon(QtGui.QIcon.fromTheme('application-exit')) - actionQuit.setShortcut('Ctrl+Q') - actionQuit.triggered.connect(self.close) - - actionAbout = QtGui.QAction(self) - actionAbout.setText('&About') - actionAbout.setIcon(QtGui.QIcon.fromTheme('help-about')) - actionAbout.triggered.connect(self.show_about) - - menubar = self.menuBar() - menuFile = menubar.addMenu('&File') - menuFile.addAction(actionQuit) - menuHelp = menubar.addMenu('&Help') - menuHelp.addAction(actionAbout) - - self.lblValue = QtGui.QLabel('waiting for data...') - self.lblValue.setAlignment(QtCore.Qt.AlignCenter) - font = self.lblValue.font() - font.setPointSize(font.pointSize() * 1.7) - font.setBold(True) - self.lblValue.setFont(font) - self.setCentralWidget(self.lblValue) - self.centralWidget().setContentsMargins(0, 0, 0, 0) - - self.lblDevName = QtGui.QLabel() - self.lblDevName.setToolTip('Name of used measurement device.') - self.statusBar().insertWidget(0, self.lblDevName, 10) - self.lblTime = QtGui.QLabel() - self.lblTime.setToolTip('Time of the last measurement.') - self.statusBar().insertWidget(1, self.lblTime) - - self.statusBar().setSizeGripEnabled(False) - - def show_about(self): - text = textwrap.dedent('''\ -