]> Pileus Git - ~andy/csm213a-hw/commitdiff
Add serial interface
authorAndy Spencer <andy753421@gmail.com>
Sun, 2 Feb 2014 09:02:43 +0000 (09:02 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sun, 2 Feb 2014 09:06:08 +0000 (09:06 +0000)
vis/device.py
vis/makefile
vis/visual.py
vis/visual.ui

index a2050335fad4bc61ee56ec614a1e91a5b79e6272..b729f02fc80ecddca1705cd3cecaa8ba3cf8a770 100644 (file)
@@ -1,5 +1,16 @@
+from re     import compile
 from serial import Serial
 
 from serial import Serial
 
+class State:
+       acc   = [None]*3
+       mag   = [None]*3
+       touch = [None]*2
+       light = [None]*1
+       a2d   = [None]*6
+
+       def __init__(self):
+               pass
+
 class Device:
        # Attributes
        port = "/dev/ttyACM0"
 class Device:
        # Attributes
        port = "/dev/ttyACM0"
@@ -7,12 +18,85 @@ class Device:
        # Constructors
        def __init__(self, config):
                self.config = config
        # Constructors
        def __init__(self, config):
                self.config = config
+               self.serial = None
 
        # Methods
        def connect(self):
 
        # Methods
        def connect(self):
-               self.conn = Serial(self.port, \
-                       baudrate = self.config.baudrate, \
-                       parity   = self.config.parity,   \
-                       bytesize = self.config.databits, \
-                       stopbits = self.config.stopbits)
+               try:
+                       self.inbuf  = []
+                       self.serial = Serial(self.port,          \
+                               baudrate = self.config.baudrate, \
+                               parity   = self.config.parity,   \
+                               bytesize = self.config.databits, \
+                               stopbits = self.config.stopbits, \
+                               timeout  = 0)
+               except Exception as ex:
+                       return str(ex)
+
+       def disconnect(self):
+               if self.serial and self.serial.isOpen():
+                       self.serial.close()
+
+       def running(self):
+               if self.serial == None:
+                       return False
+               if self.serial.isOpen() == False:
+                       return False
+               return True
+
+       def process(self):
+               items = []
+               while self.serial.readable():
+                       try:
+                               char = self.serial.read()
+                       except Exception as ex:
+                               char = ''
+                       if char == '':
+                               break
+                       if char == '\r' or char == '\n':
+                               if len(self.inbuf) == 0:
+                                       continue
+                               line = "".join(self.inbuf)
+                               item = self._parse_ascii(line)
+                               items.append(item)
+                               self.inbuf = []
+                       else:
+                               self.inbuf.append(char)
+               return items
+
+       # Private methods
+       def _parse_ascii(self, line):
+               acc_re = compile("\[ACC\] accX=(.*) accY=(.*) accZ=(.*)")
+               mag_re = compile("\[MAG\] magX=(.*) magY=(.*) magZ=(.*)")
+               lgt_re = compile("\[LGT\] Light Intensity=(.*)")
+               tch_re = compile("\[TCH\] Force=(.*) Distance=(.*)")
+               a2d_re = compile("\[A2D\] ...")
+
+               acc_m = acc_re.match(line)
+               mag_m = mag_re.match(line)
+               lgt_m = lgt_re.match(line)
+               tch_m = tch_re.match(line)
+               a2d_m = a2d_re.match(line)
+
+               state = State()
+               if acc_m:
+                       state.acc[0]   = float(acc_m.group(1))
+                       state.acc[1]   = float(acc_m.group(2))
+                       state.acc[2]   = float(acc_m.group(3))
+               if mag_m:              
+                       state.acc[0]   = float(mag_m.group(1))
+                       state.acc[1]   = float(mag_m.group(2))
+                       state.acc[2]   = float(mag_m.group(3))
+               if lgt_m:
+                       state.light[0] = float(lgt_m.group(1))
+               if tch_m:
+                       state.touch[0] = float(tch_m.group(1))
+               if a2d_m:
+                       state.a2d[0]   = float(tch_m.group(1))
+                       state.a2d[1]   = float(tch_m.group(2))
+                       state.a2d[2]   = float(tch_m.group(3))
+                       state.a2d[3]   = float(tch_m.group(4))
+                       state.a2d[4]   = float(tch_m.group(5))
+                       state.a2d[5]   = float(tch_m.group(6))
 
 
+               return state
index 9f2eec9f9301c895edce37b181ee0740230a5803..26271df3f0ed32dd58ce08a3bc7da1e30d6987b6 100644 (file)
@@ -1,5 +1,5 @@
 run:
 run:
-       ./main.py
+       python -u ./main.py
 
 clean:
        rm -rf *.pyc __pycache__
 
 clean:
        rm -rf *.pyc __pycache__
index 908304d908da2b374d93211d51c1982fbe2db559..f07ea0d11c2b0a4858803892992c997f60392c01 100644 (file)
@@ -5,6 +5,10 @@ import gtk
 
 class Visual:
        def __init__(self, config, device, xively):
 
 class Visual:
        def __init__(self, config, device, xively):
+               def get_objects(names):
+                       return map(lambda x:
+                               self.builder.get_object(x), names)
+
                self.config   = config
                self.device   = device
                self.xively   = xively
                self.config   = config
                self.device   = device
                self.xively   = xively
@@ -15,6 +19,12 @@ class Visual:
                self.window   = self.builder.get_object("window")
                self.settings = self.builder.get_object("settings")
 
                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()
        # Signal handlers
        def on_hide(self, win, *args):
                self.settings.hide()
@@ -24,18 +34,24 @@ class Visual:
                self.settings.show()
                return True
 
                self.settings.show()
                return True
 
-       def on_serial(self, win):
-               self.device.connect()
+       def on_serial(self, act):
+               if act.get_active():
+                       self.status(self.device.connect())
+               else:
+                       self.status(self.device.disconnect())
                return True
 
                return True
 
-       def on_xively(self, win):
-               self.xively.connect()
+       def on_xively(self, act):
+               if act.get_active():
+                       self.status(self.xively.connect())
+               else:
+                       self.status(self.xively.disconnect())
                return True
 
        def on_enable(self, _):
                print "Unimplemented: on_enable"
                return True
                return True
 
        def on_enable(self, _):
                print "Unimplemented: on_enable"
                return True
-       
+
        def on_rate(self, _):
                print "Unimplemented: on_rate"
                return True
        def on_rate(self, _):
                print "Unimplemented: on_rate"
                return True
@@ -69,7 +85,56 @@ class Visual:
 
                # TODO - send changes back to config
 
 
                # 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()
        def run(self):
                self.load_config()
                self.window.show()
+               gtk.timeout_add(1000/60, self.timer)
                gtk.main()
                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)
+
index e8cfec5344f6dee877dd4a2f1172d9da21af04f9..96915dff690391b988dfd1a6e172d76eb5d7ae1c 100644 (file)
@@ -2,21 +2,6 @@
 <interface>
   <requires lib="gtk+" version="2.24"/>
   <!-- interface-naming-policy project-wide -->
 <interface>
   <requires lib="gtk+" version="2.24"/>
   <!-- interface-naming-policy project-wide -->
-  <object class="GtkAction" id="serial_con">
-    <property name="label" translatable="yes">Serial</property>
-    <property name="stock_id">gtk-connect</property>
-    <signal name="activate" handler="on_serial" swapped="no"/>
-  </object>
-  <object class="GtkAction" id="setting_act">
-    <property name="label" translatable="yes">Settings</property>
-    <property name="stock_id">gtk-preferences</property>
-    <signal name="activate" handler="on_show" swapped="no"/>
-  </object>
-  <object class="GtkAction" id="xively_con">
-    <property name="label" translatable="yes">Xively</property>
-    <property name="stock_id">gtk-connect</property>
-    <signal name="activate" handler="on_xively" swapped="no"/>
-  </object>
   <object class="GtkAdjustment" id="a2d_adj">
     <property name="upper">100</property>
     <property name="value">1</property>
   <object class="GtkAdjustment" id="a2d_adj">
     <property name="upper">100</property>
     <property name="value">1</property>
     <property name="page_increment">10</property>
   </object>
   <object class="GtkTextBuffer" id="serial_buf"/>
     <property name="page_increment">10</property>
   </object>
   <object class="GtkTextBuffer" id="serial_buf"/>
+  <object class="GtkToggleAction" id="serial_con">
+    <property name="label" translatable="yes">Serial</property>
+    <property name="stock_id">gtk-connect</property>
+    <signal name="activate" handler="on_serial" swapped="no"/>
+  </object>
+  <object class="GtkAction" id="settings_act">
+    <property name="label" translatable="yes">Settings</property>
+    <property name="stock_id">gtk-preferences</property>
+    <signal name="activate" handler="on_show" swapped="no"/>
+  </object>
+  <object class="GtkToggleAction" id="xively_con">
+    <property name="label" translatable="yes">Xively</property>
+    <property name="stock_id">gtk-connect</property>
+    <signal name="activate" handler="on_xively" swapped="no"/>
+  </object>
   <object class="GtkDialog" id="settings">
     <property name="can_focus">False</property>
     <property name="border_width">5</property>
   <object class="GtkDialog" id="settings">
     <property name="can_focus">False</property>
     <property name="border_width">5</property>
@@ -68,7 +68,7 @@
         <property name="can_focus">False</property>
         <property name="spacing">2</property>
         <child internal-child="action_area">
         <property name="can_focus">False</property>
         <property name="spacing">2</property>
         <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="settings_act">
+          <object class="GtkHButtonBox" id="settings_btns">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             </child>
             <child>
               <object class="GtkToolButton" id="settings_btn">
             </child>
             <child>
               <object class="GtkToolButton" id="settings_btn">
-                <property name="related_action">setting_act</property>
+                <property name="related_action">settings_act</property>
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="label" translatable="yes">settings</property>
                 <property name="use_underline">True</property>
               </object>
               <packing>
                 <property name="use_underline">True</property>
               </object>
               <packing>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <child>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <child>
-                      <object class="GtkLabel" id="a2d6">
+                      <object class="GtkLabel" id="accx">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                       </packing>
                     </child>
                     <child>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkLabel" id="a2d7">
+                      <object class="GtkLabel" id="accy">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                       </packing>
                     </child>
                     <child>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkLabel" id="a2d8">
+                      <object class="GtkLabel" id="accz">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <child>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <child>
-                      <object class="GtkLabel" id="a2d9">
+                      <object class="GtkLabel" id="magx">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                       </packing>
                     </child>
                     <child>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkLabel" id="a2d10">
+                      <object class="GtkLabel" id="magy">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                       </packing>
                     </child>
                     <child>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkLabel" id="a2d11">
+                      <object class="GtkLabel" id="magz">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                   </packing>
                 </child>
                 <child>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkLabel" id="touch_val">
+                  <object class="GtkLabel" id="touch">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="xalign">0</property>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="xalign">0</property>
                   </packing>
                 </child>
                 <child>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkLabel" id="light_val">
+                  <object class="GtkLabel" id="light">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="xalign">0</property>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="xalign">0</property>
               <object class="GtkStatusbar" id="status">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
               <object class="GtkStatusbar" id="status">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="spacing">2</property>
+                <property name="spacing">10</property>
               </object>
               <packing>
                 <property name="expand">True</property>
               </object>
               <packing>
                 <property name="expand">True</property>