X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=sigrok-meter;h=b2f60070d5442d284d76a58aa74b814599e458f6;hb=1dc3ae069fa8649774fb6d97f0d9e974318d6577;hp=d53a288a2eb7d560943df6aee9e8461ea3f53681;hpb=13e332b78eb4ead7ded3ad2eb5cdaadeda769aad;p=sigrok-meter.git diff --git a/sigrok-meter b/sigrok-meter index d53a288..b2f6007 100755 --- a/sigrok-meter +++ b/sigrok-meter @@ -1,8 +1,9 @@ -#!/usr/bin/python3 +#!/usr/bin/env python ## ## This file is part of the sigrok-meter project. ## ## Copyright (C) 2013 Uwe Hermann +## Copyright (C) 2014 Jens Steinhauser ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -15,81 +16,110 @@ ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +## along with this program; if not, see . ## -from multiprocessing import Process, Queue -from gi.repository import Gtk, GObject -from sigrok.core import Context, Driver, Device, Session, Packet -from sigrok.core import lowlevel as ll - -def init_and_run(queue): - def datafeed_in(device, packet): - if packet.type == Packet.ANALOG: - data = packet.payload.data - unit, unit_str = packet.payload.unit, "" - if unit == ll.SR_UNIT_VOLT: - unit_str = " V" - elif unit == ll.SR_UNIT_OHM: - unit_str = " Ohm" - elif unit == ll.SR_UNIT_AMPERE: - unit_str = " A" - mqflags, mqflags_str = packet.payload.unit, "" - if mqflags & ll.SR_MQFLAG_AC: - mqflags_str = " AC" - elif mqflags & ll.SR_MQFLAG_DC: - mqflags_str = " DC" - for i in range(packet.payload.num_samples): - queue.put("%f%s%s" % (data[i], unit_str, mqflags_str)) - - # ll.sr_log_loglevel_set(5) - context = Context() - driver = context.drivers['voltcraft-vc820'] - device = driver.scan()[0] - device.limit_samples = 1000 - session = Session(context) - session.add_device(device) - session.add_callback(datafeed_in) - session.start() - session.run() - session.stop() - -class SigrokMeter: - def __init__(self): - self.builder = Gtk.Builder() - self.builder.add_from_file("sigrok-meter.glade") - self.builder.connect_signals(self) - self.value_label = self.builder.get_object("value_label") - self.win = self.builder.get_object("mainwindow") - self.win.show_all() - self.queue = Queue() - GObject.timeout_add(100, self.update_label_if_needed) - - def update_label_if_needed(self): - try: - t = self.queue.get_nowait() - self.value_label.set_text(t) - except: - pass - GObject.timeout_add(100, self.update_label_if_needed) +import argparse +import sys +import textwrap +import signal + +default_drivers = [('demo:analog_channels=4', 'samplerate=4')] + +def parse_cli(): + parser = argparse.ArgumentParser( + description='Simple sigrok GUI for multimeters and dataloggers.', + epilog=textwrap.dedent('''\ + The DRIVER string is the same as for sigrok-cli(1). Multiple + DRIVER and CONFIG items can be supplied. The nth CONFIG is applied + to the nth DRIVER. If there are more drivers than configs, the + remaining drivers use the default configuration. + + Examples: + + %(prog)s --driver tecpel-dmm-8061-ser:conn=/dev/ttyUSB0 + + %(prog)s --driver uni-t-ut61e:conn=1a86.e008 + + %(prog)s --driver demo:analog_channels=1 \\ + --config samplerate=10 + + %(prog)s --driver voltcraft-k204:conn=/dev/ttyUSB0 \\ + --driver uni-t-ut61d:conn=1a86.e008 \\ + --driver uni-t-ut61e-ser:conn=/dev/ttyUSB1 + '''), + formatter_class=argparse.RawDescriptionHelpFormatter) + + parser.add_argument('-d', '--driver', + action='append', + default=[], + help='The driver to use') + parser.add_argument('-c', '--config', + action='append', + default=[], + help='Specify device configuration options') + parser.add_argument('-l', '--loglevel', + type=int, + default=None, + help='Set loglevel (5 is most verbose)') + parser.add_argument('--pyside', + action='store_true', + default=False, + help='Force use of PySide (default is to use PyQt4)') + args = parser.parse_args() + + if len(args.config) > len(args.driver): + sys.exit('Error: More configurations than drivers given.') - def on_quit(self, *args): - Gtk.main_quit(*args) + # Merge drivers and configurations into a list of tuples. + setattr(args, 'drivers', []) + if not args.driver: + args.drivers = default_drivers + sys.stderr.write('No driver given, using demo driver.\n') + if args.driver: + args.config.extend([''] * (len(args.driver) - len(args.config))) + args.drivers = zip(args.driver, args.config) + del args.driver + del args.config - def on_about(self, action): - about = self.builder.get_object("aboutdialog") - sr_pkg = ll.sr_package_version_string_get() - sr_lib = ll.sr_lib_version_string_get() - s = "Using libsigrok %s (lib version %s)." % (sr_pkg, sr_lib) - about.set_comments(s) - about.run() - about.hide() + return args if __name__ == '__main__': - s = SigrokMeter() - process = Process(target=init_and_run, args=(s.queue,)) - process.start() - Gtk.main() - process.terminate() + signal.signal(signal.SIGINT, signal.SIG_DFL) + + args = parse_cli() + + import qtcompat + qtcompat.load_modules(args.pyside) + QtCore = qtcompat.QtCore + QtGui = qtcompat.QtGui + + app = QtGui.QApplication([]) + + try: + import sigrok.core as sr + except Exception as e: + QtGui.QMessageBox.critical(None, 'Error starting sigrok-meter', + 'Unable to use the sigrok Python bindings:\n{}.'.format(e)) + sys.exit(1) + + # Initialize modules that need a QApplication to exist. + import settings + settings.init() + import icons + icons.load_icons() + + context = sr.Context_create() + + if args.loglevel != None: + try: + loglevel = sr.LogLevel.get(args.loglevel) + settings.logging.level.setValue(loglevel) + except: + sys.exit('Error: invalid log level.') + + import mainwindow + s = mainwindow.MainWindow(context, args.drivers) + s.show() + sys.exit(app.exec_())