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'])
40 self.smpl = get_objects(['sampling'])
43 def on_hide(self, win, *args):
47 def on_show(self, act):
51 def on_serial(self, act):
53 self.status(self.device.connect())
55 self.status(self.device.disconnect())
58 def on_xively(self, act):
60 self.status(self.logger.connect())
62 self.status(self.logger.disconnect())
65 def on_flush(self, act):
68 def on_enable(self, obj):
69 name = Gtk.Buildable.get_name(obj)
70 name = name.replace('_btn', '')
71 state = obj.get_active()
72 if self.config.enable[name] != state:
73 self.device.set_enable(name, state)
74 self.config.enable[name] = state
77 def on_rate(self, obj):
78 name = Gtk.Buildable.get_name(obj)
79 name = name.replace('_spin', '')
80 value = obj.get_value()
81 if self.config.rate[name] != value:
82 self.device.set_rate(name, value)
83 self.config.rate[name] = value
86 def on_config(self, obj):
87 name = Gtk.Buildable.get_name(obj)
88 if isinstance(obj, Gtk.SpinButton):
89 value = obj.get_value()
91 value = obj.get_text()
92 if getattr(self.config, name) != value:
93 setattr(self.config, name, value)
96 def on_expose(self, obj, _):
97 cairo = obj.window.cairo_create()
98 count = len(self.history)
99 extents = cairo.clip_extents()
100 width = extents[2] - extents[0]
101 height = extents[3] - extents[1]
103 cairo.set_line_width(4)
104 for i in range(0,len(self.history)):
105 x = i*width/(count-1)
106 y = ((1-self.history[i]) * 0.8 + 0.1) * height
113 def on_key(self, win, ev):
117 def on_destroy(self, win):
121 def load_config(self):
122 def set_val(name, val):
123 self.builder.get_object(name).set_value(val)
124 def set_txt(name, val):
125 self.builder.get_object(name).set_text(val)
126 def set_act(name, val):
127 self.builder.get_object(name).set_active(val)
130 set_txt('device', self.config.device)
131 set_val('baudrate', self.config.baudrate)
132 set_txt('parity', self.config.parity)
133 set_val('databits', self.config.databits)
134 set_val('stopbits', self.config.stopbits)
137 set_txt('feedid', self.config.feedid)
138 set_txt('apikey', self.config.apikey)
139 set_val('maxrate', self.config.maxrate)
142 for key in list(self.config.enable.keys()):
143 set_act(key+'_btn', self.config.enable[key])
144 set_val(key+'_spin', self.config.rate[key])
147 def update(self, state):
148 def setval(objs, vals, lbls):
149 for i in range(0,len(objs)):
153 objs[i].set_text('%s: %f' % (lbls[i], vals[i]))
155 objs[i].set_text('%f' % vals[i])
157 setval(self.accs, state.acc, ['X', 'Y', 'Z'])
158 setval(self.mags, state.mag, ['X', 'Y', 'Z'])
159 setval(self.lgts, state.lgt, [])
160 setval(self.tchs, state.tch, ['P', 'D'])
161 setval(self.a2ds, state.a2d, [])
162 #setval(self.smpl, state.)
164 self.history = self.history[1:] + [state.a2d[0]]
165 self.window.queue_draw()
167 def debug(self, state):
168 print('update: ' + str(state))
169 print('\tacc - ' + str(state.acc))
170 print('\tmag - ' + str(state.mag))
171 print('\tlgt - ' + str(state.lgt))
172 print('\ttch - ' + str(state.touch))
173 print('\ta2d - ' + str(state.a2d))
176 def check(state, name):
177 btn = self.builder.get_object(name + '_btn')
178 con = self.builder.get_object(name + '_con')
179 img = Gtk.STOCK_YES if state else Gtk.STOCK_NO
180 btn.set_active(state)
181 con.set_from_stock(img, ICON_SIZE_BUTTON)
183 check(self.device.running(), "serial")
184 check(self.logger.running(), "xively")
186 for item in self.device.process():
188 self.logger.append(item)
196 GLib.timeout_add(1000/60, self.timer)
200 def status(self, msg):
203 status = self.builder.get_object("status")
204 status.push(text=('Error: ' + msg), context_id=0)