]> sigrok.org Git - sigrok-meter.git/blame - sigrok-meter
Add command line option for the driver.
[sigrok-meter.git] / sigrok-meter
CommitLineData
5add80f6
JS
1#!/usr/bin/env python
2
c09ca11b
UH
3##
4## This file is part of the sigrok-meter project.
5##
6## Copyright (C) 2013 Uwe Hermann <uwe@hermann-uwe.de>
7##
8## This program is free software; you can redistribute it and/or modify
9## it under the terms of the GNU General Public License as published by
10## the Free Software Foundation; either version 2 of the License, or
11## (at your option) any later version.
12##
13## This program is distributed in the hope that it will be useful,
14## but WITHOUT ANY WARRANTY; without even the implied warranty of
15## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16## GNU General Public License for more details.
17##
18## You should have received a copy of the GNU General Public License
19## along with this program; if not, write to the Free Software
20## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21##
22
782f5926 23import argparse
13e332b7
UH
24from multiprocessing import Process, Queue
25from gi.repository import Gtk, GObject
f94bb73f 26import re
efdef4fa 27import sigrok.core as sr
782f5926 28import sys
f94bb73f 29import textwrap
13e332b7 30
f94bb73f 31default_drivers = [('demo', {'analog_channels': 1})]
782f5926
JS
32default_loglevel = sr.LogLevel.WARN
33
f94bb73f 34def init_and_run(queue, drivers, loglevel):
13e332b7 35 def datafeed_in(device, packet):
efdef4fa 36 if packet.type == sr.PacketType.ANALOG:
13e332b7
UH
37 data = packet.payload.data
38 unit, unit_str = packet.payload.unit, ""
efdef4fa 39 if unit == sr.Unit.VOLT:
13e332b7 40 unit_str = " V"
efdef4fa 41 elif unit == sr.Unit.OHM:
13e332b7 42 unit_str = " Ohm"
efdef4fa 43 elif unit == sr.Unit.AMPERE:
13e332b7 44 unit_str = " A"
92ba651c 45 mqflags, mqflags_str = packet.payload.mq_flags, ""
efdef4fa 46 if sr.QuantityFlag.AC in mqflags:
13e332b7 47 mqflags_str = " AC"
efdef4fa 48 elif sr.QuantityFlag.DC in mqflags:
13e332b7
UH
49 mqflags_str = " DC"
50 for i in range(packet.payload.num_samples):
53fed2c3 51 dev = "%s %s" % (device.vendor, device.model)
92ba651c 52 val = "%f%s%s" % (data[0][i], unit_str, mqflags_str)
49e0ee28 53 queue.put((dev, val))
13e332b7 54
efdef4fa 55 context = sr.Context_create()
782f5926 56 context.log_level = loglevel
f94bb73f
JS
57
58 devices = []
59 for name, options in drivers:
60 try:
61 dr = context.drivers[name]
62 devices.append(dr.scan(**options)[0])
63 except:
64 print('error getting device for driver "{}", skipping'.format(name))
65
66 if not devices:
67 print('no devices found')
68 return
69
92ba651c 70 session = context.create_session()
49e0ee28
UH
71 for dev in devices:
72 session.add_device(dev)
92ba651c
JS
73 dev.open()
74 session.add_datafeed_callback(datafeed_in)
13e332b7
UH
75 session.start()
76 session.run()
77 session.stop()
c09ca11b 78
730cbd1f
UH
79class SigrokMeter:
80 def __init__(self):
81 self.builder = Gtk.Builder()
82 self.builder.add_from_file("sigrok-meter.glade")
83 self.builder.connect_signals(self)
13e332b7 84 self.value_label = self.builder.get_object("value_label")
49e0ee28 85 self.value_label2 = self.builder.get_object("value_label2")
fd029d02 86 self.win = self.builder.get_object("mainwindow")
730cbd1f 87 self.win.show_all()
13e332b7
UH
88 self.queue = Queue()
89 GObject.timeout_add(100, self.update_label_if_needed)
90
91 def update_label_if_needed(self):
92 try:
93 t = self.queue.get_nowait()
49e0ee28
UH
94 l = self.value_label if t[0] != "Victor" else self.value_label2
95 l.set_text("%s: %s" % (t[0], t[1]))
13e332b7
UH
96 except:
97 pass
98 GObject.timeout_add(100, self.update_label_if_needed)
730cbd1f 99
fd029d02 100 def on_quit(self, *args):
2f5ef701 101 Gtk.main_quit(*args)
730cbd1f 102
fd029d02 103 def on_about(self, action):
730cbd1f 104 about = self.builder.get_object("aboutdialog")
efdef4fa 105 context = sr.Context_create()
92ba651c
JS
106 sr_pkg = context.package_version
107 sr_lib = context.lib_version
a683a5e2
UH
108 s = "Using libsigrok %s (lib version %s)." % (sr_pkg, sr_lib)
109 about.set_comments(s)
dd73092b
UH
110 about.run()
111 about.hide()
2f5ef701 112
f94bb73f 113def parse_cli():
782f5926 114 parser = argparse.ArgumentParser(
f94bb73f
JS
115 description='Simple sigrok GUI for multimeters and dataloggers.',
116 epilog=textwrap.dedent('''\
117 The DRIVER string is the same as for sigrok-cli(1).
118
119 examples:
120
121 %(prog)s --driver tecpel-dmm-8061-ser:conn=/dev/ttyUSB0
122
123 %(prog)s --driver uni-t-ut61e:conn=1a86.e008
124 '''),
125 formatter_class=argparse.RawDescriptionHelpFormatter)
126
127 parser.add_argument('-d', '--driver',
128 action='append',
129 help='The driver to use')
782f5926
JS
130 parser.add_argument('-l', '--loglevel',
131 type=int,
132 help='Set loglevel (5 is most verbose)')
133 args = parser.parse_args()
134
f94bb73f
JS
135 result = {
136 'drivers': default_drivers,
137 'loglevel': default_loglevel
138 }
139
140 if args.driver:
141 result['drivers'] = []
142 for d in args.driver:
143 m = re.match('(?P<name>[^:]+)(?P<opts>(:[^:=]+=[^:=]+)*)', d)
144 if not m:
145 sys.exit('error parsing option "{}"'.format(d))
146
147 opts = m.group('opts').split(':')[1:]
148 opts = [tuple(kv.split('=')) for kv in opts]
149 opts = dict(opts)
150
151 result['drivers'].append((m.group('name'), opts))
152
782f5926
JS
153 if args.loglevel != None:
154 try:
f94bb73f 155 result['loglevel'] = sr.LogLevel.get(args.loglevel)
782f5926
JS
156 except:
157 sys.exit('error: invalid log level')
158
f94bb73f
JS
159 return result
160
161if __name__ == '__main__':
162 args = parse_cli()
9e7bd3d2 163 s = SigrokMeter()
f94bb73f
JS
164 process = Process(target=init_and_run,
165 args=(s.queue, args['drivers'], args['loglevel']))
9e7bd3d2
UH
166 process.start()
167 Gtk.main()
168 process.terminate()
c09ca11b 169