X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=sigrok-meter;h=2c658356bff7eb5fa2b45480e906a25f54c7598b;hb=f94bb73fa0f49cc29e2a45509ef12d1c40a3e923;hp=988412e6abf1d4831a5aa1c24f3718491ae3a3c9;hpb=5add80f6b8c35306613372b9b56348f404d2f9b6;p=sigrok-meter.git diff --git a/sigrok-meter b/sigrok-meter index 988412e..2c65835 100755 --- a/sigrok-meter +++ b/sigrok-meter @@ -20,46 +20,58 @@ ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ## +import argparse from multiprocessing import Process, Queue from gi.repository import Gtk, GObject -from sigrok.core import * -from sigrok.core import lowlevel as ll +import re +import sigrok.core as sr +import sys +import textwrap -def init_and_run(queue): +default_drivers = [('demo', {'analog_channels': 1})] +default_loglevel = sr.LogLevel.WARN + +def init_and_run(queue, drivers, loglevel): def datafeed_in(device, packet): - if packet.type is PacketType.ANALOG: + if packet.type == sr.PacketType.ANALOG: data = packet.payload.data unit, unit_str = packet.payload.unit, "" - if unit is Unit.VOLT: + if unit == sr.Unit.VOLT: unit_str = " V" - elif unit is Unit.OHM: + elif unit == sr.Unit.OHM: unit_str = " Ohm" - elif unit is Unit.AMPERE: + elif unit == sr.Unit.AMPERE: unit_str = " A" - mqflags, mqflags_str = packet.payload.mqflags, "" - if QuantityFlag.AC in mqflags: + mqflags, mqflags_str = packet.payload.mq_flags, "" + if sr.QuantityFlag.AC in mqflags: mqflags_str = " AC" - elif QuantityFlag.DC in mqflags: + elif sr.QuantityFlag.DC in mqflags: mqflags_str = " DC" for i in range(packet.payload.num_samples): dev = "%s %s" % (device.vendor, device.model) - val = "%f%s%s" % (data[i], unit_str, mqflags_str) + val = "%f%s%s" % (data[0][i], unit_str, mqflags_str) queue.put((dev, val)) - # log = Log() - # log.level = LogLevel.SPEW - context = Context() - drivers_to_use = ['tecpel-dmm-8061-ser'] - drivers = [context.drivers[d] for d in drivers_to_use] - devices = [d.scan(conn="/dev/ttyUSB0")[0] for d in drivers] - # devices = [d.scan()[0] for d in drivers] - # for dev in devices: - # dev.limit_samples = 1000 - session = Session(context) + context = sr.Context_create() + context.log_level = loglevel + + devices = [] + for name, options in drivers: + try: + dr = context.drivers[name] + devices.append(dr.scan(**options)[0]) + except: + print('error getting device for driver "{}", skipping'.format(name)) + + if not devices: + print('no devices found') + return + + session = context.create_session() for dev in devices: - session.open_device(dev) session.add_device(dev) - session.add_callback(datafeed_in) + dev.open() + session.add_datafeed_callback(datafeed_in) session.start() session.run() session.stop() @@ -90,16 +102,67 @@ class SigrokMeter: 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() + context = sr.Context_create() + sr_pkg = context.package_version + sr_lib = context.lib_version s = "Using libsigrok %s (lib version %s)." % (sr_pkg, sr_lib) about.set_comments(s) about.run() about.hide() +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). + + examples: + + %(prog)s --driver tecpel-dmm-8061-ser:conn=/dev/ttyUSB0 + + %(prog)s --driver uni-t-ut61e:conn=1a86.e008 + '''), + formatter_class=argparse.RawDescriptionHelpFormatter) + + parser.add_argument('-d', '--driver', + action='append', + help='The driver to use') + parser.add_argument('-l', '--loglevel', + type=int, + help='Set loglevel (5 is most verbose)') + args = parser.parse_args() + + result = { + 'drivers': default_drivers, + 'loglevel': default_loglevel + } + + if args.driver: + result['drivers'] = [] + for d in args.driver: + m = re.match('(?P[^:]+)(?P(:[^:=]+=[^:=]+)*)', d) + if not m: + sys.exit('error parsing option "{}"'.format(d)) + + opts = m.group('opts').split(':')[1:] + opts = [tuple(kv.split('=')) for kv in opts] + opts = dict(opts) + + result['drivers'].append((m.group('name'), opts)) + + if args.loglevel != None: + try: + result['loglevel'] = sr.LogLevel.get(args.loglevel) + except: + sys.exit('error: invalid log level') + + return result + if __name__ == '__main__': + args = parse_cli() s = SigrokMeter() - process = Process(target=init_and_run, args=(s.queue,)) + process = Process(target=init_and_run, + args=(s.queue, args['drivers'], args['loglevel'])) process.start() Gtk.main() process.terminate()