#!/usr/bin/env python import pygtk import gtk class Visual: def __init__(self, config, device, logger): def get_objects(names): return map(lambda x: self.builder.get_object(x), names) self.config = config self.device = device self.logger = logger self.builder = gtk.Builder() self.builder.add_from_file('visual.ui') self.builder.connect_signals(self) self.window = self.builder.get_object("window") self.settings = self.builder.get_object("settings") self.accs = get_objects(['accx', 'accy', 'accz']) self.mags = get_objects(['magx', 'magy', 'magz']) self.touch = get_objects(['touch']) self.light = get_objects(['light']) self.a2ds = get_objects(['a2d0', 'a2d1', 'a2d2', 'a2d3', 'a2d4', 'a2d5']) # Signal handlers def on_hide(self, win, *args): self.settings.hide() return True def on_show(self, act): self.settings.show() return True def on_serial(self, act): if act.get_active(): self.status(self.device.connect()) else: self.status(self.device.disconnect()) return True def on_xively(self, act): if act.get_active(): self.status(self.logger.connect()) else: self.status(self.logger.disconnect()) return True def on_enable(self, _): print "Unimplemented: on_enable" return True def on_rate(self, _): print "Unimplemented: on_rate" return True def on_key(self, win, ev): if ev.string == 'q': gtk.main_quit(); def on_destroy(self, win): gtk.main_quit() # Methods def load_config(self): # Serial settings device = self.builder.get_object("device") baud = self.builder.get_object("baudrate") parity = self.builder.get_object("parity") datab = self.builder.get_object("databits") stopb = self.builder.get_object("stopbits") device.set_text(self.config.device) baud.set_value(self.config.baudrate) parity.set_text(self.config.parity) datab.set_value(self.config.databits) stopb.set_value(self.config.stopbits) # Xively settings user = self.builder.get_object("username") pwd = self.builder.get_object("password") api = self.builder.get_object("apikey") user.set_text(self.config.username) pwd.set_text(self.config.password) api.set_text(self.config.apikey) # TODO - send changes back to config def update(self, state): def setxyz(objs, vals): if vals[0]: objs[0].set_text('X: %f' % vals[0]) if vals[1]: objs[1].set_text('Y: %f' % vals[1]) if vals[2]: objs[2].set_text('Z: %f' % vals[2]) def setabs(objs, vals): for i in range(0,len(objs)): if vals[i]: objs[i].set_text('%f' % vals[i]) setxyz(self.accs, state.acc) setxyz(self.mags, state.mag) setabs(self.touch, state.touch) setabs(self.light, state.light) setabs(self.a2ds, state.a2d) def debug(self, state): print 'update: ' + str(state) print '\tacc - ' + str(state.acc) print '\tmag - ' + str(state.mag) print '\tlgt - ' + str(state.light) print '\ttch - ' + str(state.touch) print '\ta2d - ' + str(state.a2d) def timer(self): serial = self.builder.get_object("serial_btn") status = self.builder.get_object("conn") if self.device.running(): serial.set_active(True) status.set_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_BUTTON) else: serial.set_active(False) status.set_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_BUTTON) if self.device.running(): for item in self.device.process(): self.update(item) #self.debug(item) return True def run(self): self.load_config() self.window.show() gtk.timeout_add(1000/60, self.timer) gtk.main() # Private methods def status(self, msg): if not msg: return status = self.builder.get_object("status") status.push(text=('Error: ' + msg), context_id=0)