]>
Commit | Line | Data |
---|---|---|
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 | 23 | import argparse |
13e332b7 UH |
24 | from multiprocessing import Process, Queue |
25 | from gi.repository import Gtk, GObject | |
efdef4fa | 26 | import sigrok.core as sr |
782f5926 | 27 | import sys |
13e332b7 | 28 | |
782f5926 JS |
29 | default_loglevel = sr.LogLevel.WARN |
30 | ||
31 | def init_and_run(queue, loglevel): | |
13e332b7 | 32 | def datafeed_in(device, packet): |
efdef4fa | 33 | if packet.type == sr.PacketType.ANALOG: |
13e332b7 UH |
34 | data = packet.payload.data |
35 | unit, unit_str = packet.payload.unit, "" | |
efdef4fa | 36 | if unit == sr.Unit.VOLT: |
13e332b7 | 37 | unit_str = " V" |
efdef4fa | 38 | elif unit == sr.Unit.OHM: |
13e332b7 | 39 | unit_str = " Ohm" |
efdef4fa | 40 | elif unit == sr.Unit.AMPERE: |
13e332b7 | 41 | unit_str = " A" |
92ba651c | 42 | mqflags, mqflags_str = packet.payload.mq_flags, "" |
efdef4fa | 43 | if sr.QuantityFlag.AC in mqflags: |
13e332b7 | 44 | mqflags_str = " AC" |
efdef4fa | 45 | elif sr.QuantityFlag.DC in mqflags: |
13e332b7 UH |
46 | mqflags_str = " DC" |
47 | for i in range(packet.payload.num_samples): | |
53fed2c3 | 48 | dev = "%s %s" % (device.vendor, device.model) |
92ba651c | 49 | val = "%f%s%s" % (data[0][i], unit_str, mqflags_str) |
49e0ee28 | 50 | queue.put((dev, val)) |
13e332b7 | 51 | |
efdef4fa | 52 | context = sr.Context_create() |
782f5926 | 53 | context.log_level = loglevel |
53fed2c3 | 54 | drivers_to_use = ['tecpel-dmm-8061-ser'] |
49e0ee28 | 55 | drivers = [context.drivers[d] for d in drivers_to_use] |
53fed2c3 UH |
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 | |
92ba651c | 60 | session = context.create_session() |
49e0ee28 UH |
61 | for dev in devices: |
62 | session.add_device(dev) | |
92ba651c JS |
63 | dev.open() |
64 | session.add_datafeed_callback(datafeed_in) | |
13e332b7 UH |
65 | session.start() |
66 | session.run() | |
67 | session.stop() | |
c09ca11b | 68 | |
730cbd1f UH |
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) | |
13e332b7 | 74 | self.value_label = self.builder.get_object("value_label") |
49e0ee28 | 75 | self.value_label2 = self.builder.get_object("value_label2") |
fd029d02 | 76 | self.win = self.builder.get_object("mainwindow") |
730cbd1f | 77 | self.win.show_all() |
13e332b7 UH |
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() | |
49e0ee28 UH |
84 | l = self.value_label if t[0] != "Victor" else self.value_label2 |
85 | l.set_text("%s: %s" % (t[0], t[1])) | |
13e332b7 UH |
86 | except: |
87 | pass | |
88 | GObject.timeout_add(100, self.update_label_if_needed) | |
730cbd1f | 89 | |
fd029d02 | 90 | def on_quit(self, *args): |
2f5ef701 | 91 | Gtk.main_quit(*args) |
730cbd1f | 92 | |
fd029d02 | 93 | def on_about(self, action): |
730cbd1f | 94 | about = self.builder.get_object("aboutdialog") |
efdef4fa | 95 | context = sr.Context_create() |
92ba651c JS |
96 | sr_pkg = context.package_version |
97 | sr_lib = context.lib_version | |
a683a5e2 UH |
98 | s = "Using libsigrok %s (lib version %s)." % (sr_pkg, sr_lib) |
99 | about.set_comments(s) | |
dd73092b UH |
100 | about.run() |
101 | about.hide() | |
2f5ef701 | 102 | |
730cbd1f | 103 | if __name__ == '__main__': |
782f5926 JS |
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 | ||
9e7bd3d2 | 118 | s = SigrokMeter() |
782f5926 | 119 | process = Process(target=init_and_run, args=(s.queue, loglevel)) |
9e7bd3d2 UH |
120 | process.start() |
121 | Gtk.main() | |
122 | process.terminate() | |
c09ca11b | 123 |