4 ## This file is part of the sigrok-meter project.
6 ## Copyright (C) 2013 Uwe Hermann <uwe@hermann-uwe.de>
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.
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.
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
24 from multiprocessing import Process, Queue
25 from gi.repository import Gtk, GObject
27 import sigrok.core as sr
31 default_drivers = [('demo', {'analog_channels': 1})]
32 default_loglevel = sr.LogLevel.WARN
38 sr.Unit.OHM: u'\u03A9',
41 sr.Unit.CELSIUS: u'\u00B0C',
42 sr.Unit.FAHRENHEIT: u'\u00B0F',
44 sr.Unit.PERCENTAGE: '%',
48 sr.Unit.DECIBEL_MW: 'dBu',
49 sr.Unit.DECIBEL_VOLT: 'dBV',
51 sr.Unit.DECIBEL_SPL: 'dB',
52 # sr.Unit.CONCENTRATION
53 sr.Unit.REVOLUTIONS_PER_MINUTE: 'rpm',
54 sr.Unit.VOLT_AMPERE: 'VA',
56 sr.Unit.WATT_HOUR: 'Wh',
57 sr.Unit.METER_SECOND: 'm/s',
58 sr.Unit.HECTOPASCAL: 'hPa',
59 sr.Unit.HUMIDITY_293K: '%rF',
60 sr.Unit.DEGREE: u'\u00B0',
64 return units.get(u, '')
66 def init_and_run(queue, drivers, loglevel):
67 def datafeed_in(device, packet):
68 if packet.type == sr.PacketType.ANALOG:
69 data = packet.payload.data
70 unit_str = format_unit(packet.payload.unit)
71 mqflags, mqflags_str = packet.payload.mq_flags, ""
73 if sr.QuantityFlag.AC in mqflags:
75 elif sr.QuantityFlag.DC in mqflags:
78 for i in range(packet.payload.num_samples):
79 dev = "%s %s" % (device.vendor, device.model)
80 mag_str = "%f" % data[0][i]
81 val = ' '.join([mag_str, unit_str, mqflags_str])
84 context = sr.Context_create()
85 context.log_level = loglevel
88 for name, options in drivers:
90 dr = context.drivers[name]
91 devices.append(dr.scan(**options)[0])
93 print('error getting device for driver "{}", skipping'.format(name))
96 print('no devices found')
99 session = context.create_session()
101 session.add_device(dev)
103 session.add_datafeed_callback(datafeed_in)
110 self.builder = Gtk.Builder()
111 self.builder.add_from_file("sigrok-meter.glade")
112 self.builder.connect_signals(self)
113 self.value_label = self.builder.get_object("value_label")
114 self.value_label2 = self.builder.get_object("value_label2")
115 self.win = self.builder.get_object("mainwindow")
118 GObject.timeout_add(100, self.update_label_if_needed)
120 def update_label_if_needed(self):
122 t = self.queue.get_nowait()
123 l = self.value_label if t[0] != "Victor" else self.value_label2
124 l.set_text("%s: %s" % (t[0], t[1]))
127 GObject.timeout_add(100, self.update_label_if_needed)
129 def on_quit(self, *args):
132 def on_about(self, action):
133 about = self.builder.get_object("aboutdialog")
134 context = sr.Context_create()
135 sr_pkg = context.package_version
136 sr_lib = context.lib_version
137 s = "Using libsigrok %s (lib version %s)." % (sr_pkg, sr_lib)
138 about.set_comments(s)
143 parser = argparse.ArgumentParser(
144 description='Simple sigrok GUI for multimeters and dataloggers.',
145 epilog=textwrap.dedent('''\
146 The DRIVER string is the same as for sigrok-cli(1).
150 %(prog)s --driver tecpel-dmm-8061-ser:conn=/dev/ttyUSB0
152 %(prog)s --driver uni-t-ut61e:conn=1a86.e008
154 formatter_class=argparse.RawDescriptionHelpFormatter)
156 parser.add_argument('-d', '--driver',
158 help='The driver to use')
159 parser.add_argument('-l', '--loglevel',
161 help='Set loglevel (5 is most verbose)')
162 args = parser.parse_args()
165 'drivers': default_drivers,
166 'loglevel': default_loglevel
170 result['drivers'] = []
171 for d in args.driver:
172 m = re.match('(?P<name>[^:]+)(?P<opts>(:[^:=]+=[^:=]+)*)', d)
174 sys.exit('error parsing option "{}"'.format(d))
176 opts = m.group('opts').split(':')[1:]
177 opts = [tuple(kv.split('=')) for kv in opts]
180 result['drivers'].append((m.group('name'), opts))
182 if args.loglevel != None:
184 result['loglevel'] = sr.LogLevel.get(args.loglevel)
186 sys.exit('error: invalid log level')
190 if __name__ == '__main__':
193 process = Process(target=init_and_run,
194 args=(s.queue, args['drivers'], args['loglevel']))