]> Pileus Git - ~andy/csm213a-hw/blob - vis/visual.py
3d93bcbe01f536d4d9c0c2877821af9718f158bf
[~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_flush(self, act):
52                 self.logger.flush()
53
54         def on_enable(self, _):
55                 print("Unimplemented: on_enable")
56                 return True
57
58         def on_rate(self, _):
59                 print("Unimplemented: on_rate")
60                 return True
61
62         def on_config(self, obj):
63                 name = Gtk.Buildable.get_name(obj)
64                 if isinstance(obj, Gtk.SpinButton):
65                         value = obj.get_value()
66                 else:
67                         value = obj.get_text()
68                 if getattr(self.config, name) != value:
69                         setattr(self.config, name, value)
70                         self.config.save()
71
72         def on_key(self, win, ev):
73                 if ev.string == 'q':
74                         Gtk.main_quit();
75
76         def on_destroy(self, win):
77                 Gtk.main_quit()
78
79         # Methods
80         def load_config(self):
81                 # Serial settings
82                 device = self.builder.get_object("device")
83                 baud   = self.builder.get_object("baudrate")
84                 parity = self.builder.get_object("parity")
85                 datab  = self.builder.get_object("databits")
86                 stopb  = self.builder.get_object("stopbits")
87                 device.set_text(self.config.device)
88                 baud.set_value(self.config.baudrate)
89                 parity.set_text(self.config.parity)
90                 datab.set_value(self.config.databits)
91                 stopb.set_value(self.config.stopbits)
92
93                 # Xively settings
94                 feed  = self.builder.get_object("feedid")
95                 api   = self.builder.get_object("apikey")
96                 rate  = self.builder.get_object("maxrate")
97                 feed.set_text(self.config.feedid)
98                 api.set_text(self.config.apikey)
99                 rate.set_value(self.config.maxrate)
100
101         def update(self, state):
102                 def setxyz(objs, vals):
103                         if vals[0]: objs[0].set_text('X: %f' % vals[0])
104                         if vals[1]: objs[1].set_text('Y: %f' % vals[1])
105                         if vals[2]: objs[2].set_text('Z: %f' % vals[2])
106                 def setabs(objs, vals):
107                         for i in range(0,len(objs)):
108                                 if vals[i]: objs[i].set_text('%f' % vals[i])
109
110                 setxyz(self.accs,  state.acc)
111                 setxyz(self.mags,  state.mag)
112                 setabs(self.touch, state.touch)
113                 setabs(self.light, state.light)
114                 setabs(self.a2ds,  state.a2d)
115
116         def debug(self, state):
117                 print('update: ' + str(state))
118                 print('\tacc - ' + str(state.acc))
119                 print('\tmag - ' + str(state.mag))
120                 print('\tlgt - ' + str(state.light))
121                 print('\ttch - ' + str(state.touch))
122                 print('\ta2d - ' + str(state.a2d))
123
124         def timer(self):
125                 def check(state, name):
126                         btn = self.builder.get_object(name + '_btn')
127                         con = self.builder.get_object(name + '_con')
128                         img = Gtk.STOCK_YES if state else Gtk.STOCK_NO
129                         btn.set_active(state)
130                         con.set_from_stock(img, Gtk.IconSize.BUTTON)
131
132                 check(self.device.running(), "serial")
133                 check(self.logger.running(), "xively")
134
135                 for item in self.device.process():
136                         self.update(item)
137                         self.logger.append(item)
138                         #self.debug(item)
139
140                 return True
141
142         def run(self):
143                 self.load_config()
144                 self.window.show()
145                 GLib.timeout_add(1000/60, self.timer)
146                 Gtk.main()
147
148         # Private methods
149         def status(self, msg):
150                 if not msg:
151                         return
152                 status = self.builder.get_object("status")
153                 status.push(text=('Error: ' + msg), context_id=0)