]> Pileus Git - ~andy/csm213a-hw/blobdiff - vis/device.py
Work on writing settings to devices
[~andy/csm213a-hw] / vis / device.py
index b729f02fc80ecddca1705cd3cecaa8ba3cf8a770..a8963751975191bed1a7294d589cbe2d5d5f6383 100644 (file)
@@ -1,5 +1,8 @@
-from re     import compile
-from serial import Serial
+import time
+
+from re       import compile
+from serial   import Serial
+from datetime import datetime
 
 class State:
        acc   = [None]*3
@@ -7,9 +10,10 @@ class State:
        touch = [None]*2
        light = [None]*1
        a2d   = [None]*6
+       time  = None
 
        def __init__(self):
-               pass
+               self.time = datetime.utcnow()
 
 class Device:
        # Attributes
@@ -30,6 +34,8 @@ class Device:
                                bytesize = self.config.databits, \
                                stopbits = self.config.stopbits, \
                                timeout  = 0)
+                       self.control()
+                       self.serial.flushInput()
                except Exception as ex:
                        return str(ex)
 
@@ -44,27 +50,52 @@ class Device:
                        return False
                return True
 
+       def control(self):
+               for key in list(self.config.enable.keys()):
+                       state = self.config.enable[key]
+                       rate  = self.config.rate[key]
+                       cmd   = 'start' if state else 'stop'
+                       self._write_ascii('%s %s' % (cmd, key))
+                       self._write_ascii('set %s int %d' % (key, rate))
+
        def process(self):
                items = []
+               count = 0
+               limit = 1000
+               if not self.running():
+                       return items
                while self.serial.readable():
                        try:
-                               char = self.serial.read()
+                               char = self.serial.read().decode()
                        except Exception as ex:
                                char = ''
-                       if char == '':
+                       if len(char) == 0:
                                break
                        if char == '\r' or char == '\n':
                                if len(self.inbuf) == 0:
                                        continue
                                line = "".join(self.inbuf)
+                               print('read: [' + line + ']')
                                item = self._parse_ascii(line)
                                items.append(item)
                                self.inbuf = []
                        else:
                                self.inbuf.append(char)
+                       if count > limit:
+                               print("Error: exceeded read limit")
+                               break
+                       count += 1
                return items
 
        # Private methods
+       def _write_ascii(self, line):
+               if self.serial:
+                       print('write: [' + line + ']')
+                       data = bytes(line+'\n', 'UTF-8')
+                       self.serial.write(data)
+                       self.serial.flush()
+                       time.sleep(0.1)
+
        def _parse_ascii(self, line):
                acc_re = compile("\[ACC\] accX=(.*) accY=(.*) accZ=(.*)")
                mag_re = compile("\[MAG\] magX=(.*) magY=(.*) magZ=(.*)")
@@ -84,9 +115,9 @@ class Device:
                        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))
+                       state.mag[0]   = float(mag_m.group(1))
+                       state.mag[1]   = float(mag_m.group(2))
+                       state.mag[2]   = float(mag_m.group(3))
                if lgt_m:
                        state.light[0] = float(lgt_m.group(1))
                if tch_m: