5 if sys.version_info<(3,0,0):
10 from gi.repository import Gtk
11 from gi.repository import GLib
13 if sys.version_info<(3,0,0):
14 ICON_SIZE_BUTTON = Gtk.ICON_SIZE_BUTTON
16 ICON_SIZE_BUTTON = Gtk.IconSize.BUTTON
19 def __init__(self, config, device, logger):
20 def get_objects(names):
21 return list(map(lambda x:
22 self.builder.get_object(x), names))
27 self.builder = Gtk.Builder()
28 self.history = [0.5]*1000
30 self.builder.add_from_file('visual.ui')
31 self.builder.connect_signals(self)
32 self.window = self.builder.get_object("window")
33 self.settings = self.builder.get_object("settings")
35 self.accs = get_objects(['accx', 'accy', 'accz'])
36 self.mags = get_objects(['magx', 'magy', 'magz'])
37 self.lgts = get_objects(['lgt'])
38 self.tchs = get_objects(['tchp', 'tchd'])
39 self.a2ds = get_objects(['a2d0', 'a2d1', 'a2d2', 'a2d3', 'a2d4', 'a2d5'])
42 def on_hide(self, win, *args):
46 def on_show(self, act):
50 def on_serial(self, act):
52 self.status(self.device.connect())
54 self.status(self.device.disconnect())
57 def on_xively(self, act):
59 self.status(self.logger.connect())
61 self.status(self.logger.disconnect())
64 def on_flush(self, act):
67 def on_enable(self, obj):
68 name = Gtk.Buildable.get_name(obj)
69 name = name.replace('_btn', '')
70 state = obj.get_active()
71 if self.config.enable[name] != state:
72 self.device.set_enable(name, state)
73 self.config.enable[name] = state
76 def on_rate(self, obj):
77 name = Gtk.Buildable.get_name(obj)
78 name = name.replace('_spin', '')
79 value = obj.get_value()
80 if self.config.rate[name] != value:
81 self.device.set_rate(name, value)
82 self.config.rate[name] = value
85 def on_config(self, obj):
86 name = Gtk.Buildable.get_name(obj)
87 if isinstance(obj, Gtk.SpinButton):
88 value = obj.get_value()
90 value = obj.get_text()
91 if getattr(self.config, name) != value:
92 setattr(self.config, name, value)
95 def on_expose(self, obj, _):
96 cairo = obj.window.cairo_create()
97 count = len(self.history)
98 extents = cairo.clip_extents()
99 width = extents[2] - extents[0]
100 height = extents[3] - extents[1]
102 cairo.set_line_width(4)
103 for i in range(0,len(self.history)):
104 x = i*width/(count-1)
105 y = ((1-self.history[i]) * 0.8 + 0.1) * height
112 def on_key(self, win, ev):
116 def on_destroy(self, win):
120 def load_config(self):
121 def set_val(name, val):
122 self.builder.get_object(name).set_value(val)
123 def set_txt(name, val):
124 self.builder.get_object(name).set_text(val)
125 def set_act(name, val):
126 self.builder.get_object(name).set_active(val)
129 set_txt('device', self.config.device)
130 set_val('baudrate', self.config.baudrate)
131 set_txt('parity', self.config.parity)
132 set_val('databits', self.config.databits)
133 set_val('stopbits', self.config.stopbits)
136 set_txt('feedid', self.config.feedid)
137 set_txt('apikey', self.config.apikey)
138 set_val('maxrate', self.config.maxrate)
141 for key in list(self.config.enable.keys()):
142 set_act(key+'_btn', self.config.enable[key])
143 set_val(key+'_spin', self.config.rate[key])
146 def update(self, state):
147 def setval(objs, vals, lbls):
148 for i in range(0,len(objs)):
152 objs[i].set_text('%s: %f' % (lbls[i], vals[i]))
154 objs[i].set_text('%f' % vals[i])
156 setval(self.accs, state.acc, ['X', 'Y', 'Z'])
157 setval(self.mags, state.mag, ['X', 'Y', 'Z'])
158 setval(self.lgts, state.lgt, [])
159 setval(self.tchs, state.tch, ['P', 'D'])
160 setval(self.a2ds, state.a2d, [])
162 self.history = self.history[1:] + [state.a2d[0]]
163 self.window.queue_draw()
165 def debug(self, state):
166 print('update: ' + str(state))
167 print('\tacc - ' + str(state.acc))
168 print('\tmag - ' + str(state.mag))
169 print('\tlgt - ' + str(state.lgt))
170 print('\ttch - ' + str(state.touch))
171 print('\ta2d - ' + str(state.a2d))
174 def check(state, name):
175 btn = self.builder.get_object(name + '_btn')
176 con = self.builder.get_object(name + '_con')
177 img = Gtk.STOCK_YES if state else Gtk.STOCK_NO
178 btn.set_active(state)
179 con.set_from_stock(img, ICON_SIZE_BUTTON)
181 check(self.device.running(), "serial")
182 check(self.logger.running(), "xively")
184 for item in self.device.process():
186 self.logger.append(item)
194 GLib.timeout_add(1000/60, self.timer)
198 def status(self, msg):
201 status = self.builder.get_object("status")
202 status.push(text=('Error: ' + msg), context_id=0)