]> Pileus Git - ~andy/csm213a-hw/blob - vis/visual.py
Add Xively upload
[~andy/csm213a-hw] / vis / visual.py
1 #!/usr/bin/env python
2
3 from gi.repository import Gtk
4 from gi.repository import GLib
5
6 class Visual:
7         def __init__(self, config, device, logger):
8                 def get_objects(names):
9                         return list(map(lambda x:
10                                 self.builder.get_object(x), names))
11
12                 self.config   = config
13                 self.device   = device
14                 self.logger   = logger
15                 self.builder  = Gtk.Builder()
16
17                 self.builder.add_from_file('visual.ui')
18                 self.builder.connect_signals(self)
19                 self.window   = self.builder.get_object("window")
20                 self.settings = self.builder.get_object("settings")
21
22                 self.accs     = get_objects(['accx', 'accy', 'accz'])
23                 self.mags     = get_objects(['magx', 'magy', 'magz'])
24                 self.touch    = get_objects(['touch'])
25                 self.light    = get_objects(['light'])
26                 self.a2ds     = get_objects(['a2d0', 'a2d1', 'a2d2', 'a2d3', 'a2d4', 'a2d5'])
27
28         # Signal handlers
29         def on_hide(self, win, *args):
30                 self.settings.hide()
31                 return True
32
33         def on_show(self, act):
34                 self.settings.show()
35                 return True
36
37         def on_serial(self, act):
38                 if act.get_active():
39                         self.status(self.device.connect())
40                 else:
41                         self.status(self.device.disconnect())
42                 return True
43
44         def on_xively(self, act):
45                 if act.get_active():
46                         self.status(self.logger.connect())
47                 else:
48                         self.status(self.logger.disconnect())
49                 return True
50
51         def on_enable(self, _):
52                 print("Unimplemented: on_enable")
53                 return True
54
55         def on_rate(self, _):
56                 print("Unimplemented: on_rate")
57                 return True
58
59         def on_config(self, obj):
60                 name = Gtk.Buildable.get_name(obj)
61                 if isinstance(obj, Gtk.SpinButton):
62                         value = obj.get_value()
63                 else:
64                         value = obj.get_text()
65                 if getattr(self.config, name) != value:
66                         setattr(self.config, name, value)
67                         self.config.save()
68
69         def on_key(self, win, ev):
70                 if ev.string == 'q':
71                         Gtk.main_quit();
72
73         def on_destroy(self, win):
74                 Gtk.main_quit()
75
76         # Methods
77         def load_config(self):
78                 # Serial settings
79                 device = self.builder.get_object("device")
80                 baud   = self.builder.get_object("baudrate")
81                 parity = self.builder.get_object("parity")
82                 datab  = self.builder.get_object("databits")
83                 stopb  = self.builder.get_object("stopbits")
84                 device.set_text(self.config.device)
85                 baud.set_value(self.config.baudrate)
86                 parity.set_text(self.config.parity)
87                 datab.set_value(self.config.databits)
88                 stopb.set_value(self.config.stopbits)
89
90                 # Xively settings
91                 feed  = self.builder.get_object("feedid")
92                 api   = self.builder.get_object("apikey")
93                 rate  = self.builder.get_object("maxrate")
94                 feed.set_text(self.config.feedid)
95                 api.set_text(self.config.apikey)
96                 rate.set_value(self.config.maxrate)
97
98         def update(self, state):
99                 def setxyz(objs, vals):
100                         if vals[0]: objs[0].set_text('X: %f' % vals[0])
101                         if vals[1]: objs[1].set_text('Y: %f' % vals[1])
102                         if vals[2]: objs[2].set_text('Z: %f' % vals[2])
103                 def setabs(objs, vals):
104                         for i in range(0,len(objs)):
105                                 if vals[i]: objs[i].set_text('%f' % vals[i])
106
107                 setxyz(self.accs,  state.acc)
108                 setxyz(self.mags,  state.mag)
109                 setabs(self.touch, state.touch)
110                 setabs(self.light, state.light)
111                 setabs(self.a2ds,  state.a2d)
112
113         def debug(self, state):
114                 print('update: ' + str(state))
115                 print('\tacc - ' + str(state.acc))
116                 print('\tmag - ' + str(state.mag))
117                 print('\tlgt - ' + str(state.light))
118                 print('\ttch - ' + str(state.touch))
119                 print('\ta2d - ' + str(state.a2d))
120
121         def timer(self):
122                 def check(state, name):
123                         btn = self.builder.get_object(name + '_btn')
124                         con = self.builder.get_object(name + '_con')
125                         img = Gtk.STOCK_YES if state else Gtk.STOCK_NO
126                         btn.set_active(state)
127                         con.set_from_stock(img, Gtk.IconSize.BUTTON)
128
129                 check(self.device.running(), "serial")
130                 check(self.logger.running(), "xively")
131
132                 for item in self.device.process():
133                         self.update(item)
134                         self.logger.append(item)
135                         #self.debug(item)
136
137                 return True
138
139         def run(self):
140                 self.load_config()
141                 self.window.show()
142                 GLib.timeout_add(1000/60, self.timer)
143                 Gtk.main()
144
145         # Private methods
146         def status(self, msg):
147                 if not msg:
148                         return
149                 status = self.builder.get_object("status")
150                 status.push(text=('Error: ' + msg), context_id=0)