]> sigrok.org Git - sigrok-meter.git/blob - sigrok-meter
Add a command line options to adjust the log level.
[sigrok-meter.git] / sigrok-meter
1 #!/usr/bin/env python
2
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
23 import argparse
24 from multiprocessing import Process, Queue
25 from gi.repository import Gtk, GObject
26 import sigrok.core as sr
27 import sys
28
29 default_loglevel = sr.LogLevel.WARN
30
31 def init_and_run(queue, loglevel):
32     def datafeed_in(device, packet):
33         if packet.type == sr.PacketType.ANALOG:
34             data = packet.payload.data
35             unit, unit_str = packet.payload.unit, ""
36             if unit == sr.Unit.VOLT:
37                 unit_str = " V"
38             elif unit == sr.Unit.OHM:
39                 unit_str = " Ohm"
40             elif unit == sr.Unit.AMPERE:
41                 unit_str = " A"
42             mqflags, mqflags_str = packet.payload.mq_flags, ""
43             if sr.QuantityFlag.AC in mqflags:
44                 mqflags_str = " AC"
45             elif sr.QuantityFlag.DC in mqflags:
46                 mqflags_str = " DC"
47             for i in range(packet.payload.num_samples):
48                 dev = "%s %s" % (device.vendor, device.model)
49                 val = "%f%s%s" % (data[0][i], unit_str, mqflags_str)
50                 queue.put((dev, val))
51
52     context = sr.Context_create()
53     context.log_level = loglevel
54     drivers_to_use = ['tecpel-dmm-8061-ser']
55     drivers = [context.drivers[d] for d in drivers_to_use]
56     devices = [d.scan(conn="/dev/ttyUSB0")[0] for d in drivers]
57     # devices = [d.scan()[0] for d in drivers]
58     # for dev in devices:
59     #     dev.limit_samples = 1000
60     session = context.create_session()
61     for dev in devices:
62         session.add_device(dev)
63         dev.open()
64     session.add_datafeed_callback(datafeed_in)
65     session.start()
66     session.run()
67     session.stop()
68
69 class SigrokMeter:
70     def __init__(self):
71         self.builder = Gtk.Builder()
72         self.builder.add_from_file("sigrok-meter.glade")
73         self.builder.connect_signals(self)
74         self.value_label = self.builder.get_object("value_label")
75         self.value_label2 = self.builder.get_object("value_label2")
76         self.win = self.builder.get_object("mainwindow")
77         self.win.show_all()
78         self.queue = Queue()
79         GObject.timeout_add(100, self.update_label_if_needed)
80
81     def update_label_if_needed(self):
82         try:
83             t = self.queue.get_nowait()
84             l = self.value_label if t[0] != "Victor" else self.value_label2
85             l.set_text("%s: %s" % (t[0], t[1]))
86         except:
87             pass
88         GObject.timeout_add(100, self.update_label_if_needed)
89
90     def on_quit(self, *args):
91         Gtk.main_quit(*args)
92
93     def on_about(self, action):
94         about = self.builder.get_object("aboutdialog")
95         context = sr.Context_create()
96         sr_pkg = context.package_version
97         sr_lib = context.lib_version
98         s = "Using libsigrok %s (lib version %s)." % (sr_pkg, sr_lib)
99         about.set_comments(s)
100         about.run()
101         about.hide()
102
103 if __name__ == '__main__':
104     parser = argparse.ArgumentParser(
105         description='Simple sigrok GUI for multimeters and dataloggers.')
106     parser.add_argument('-l', '--loglevel',
107         type=int,
108         help='Set loglevel (5 is most verbose)')
109     args = parser.parse_args()
110
111     loglevel = default_loglevel
112     if args.loglevel != None:
113         try:
114             loglevel = sr.LogLevel.get(args.loglevel)
115         except:
116             sys.exit('error: invalid log level')
117
118     s = SigrokMeter()
119     process = Process(target=init_and_run, args=(s.queue, loglevel))
120     process.start()
121     Gtk.main()
122     process.terminate()
123