]> Pileus Git - ~andy/csm213a-hw/commitdiff
Add Xively upload
authorAndy Spencer <andy753421@gmail.com>
Mon, 3 Feb 2014 07:55:44 +0000 (07:55 +0000)
committerAndy Spencer <andy753421@gmail.com>
Mon, 3 Feb 2014 07:55:44 +0000 (07:55 +0000)
- Also update some settings
- Also disconnect on exit

vis/config.py
vis/device.py
vis/logger.py
vis/main.py
vis/visual.py
vis/visual.ui

index 50c5f7724c137c6217ad27e7d8bec0f9f77baf64..928ae7da85ce7030f1f0f0eb503a96be2eaa9a07 100644 (file)
@@ -15,7 +15,7 @@ class Config:
                'xively': {
                        'feedid':   '<feedid>',
                        'apikey':   '<apikey>',
-                       'maxrate':  '6',
+                       'maxrate':  '10',
                }
        }
 
index 385a142f1e9d14c4cd3fcf8385b16a9a25af8b27..ba4678709df6b8872c022b805e9f490b5c79171d 100644 (file)
@@ -1,5 +1,6 @@
-from re     import compile
-from serial import Serial
+from re       import compile
+from serial   import Serial
+from datetime import datetime
 
 class State:
        acc   = [None]*3
@@ -7,9 +8,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
@@ -48,6 +50,8 @@ class Device:
                items = []
                count = 0
                limit = 100
+               if not self.running():
+                       return items
                while self.serial.readable():
                        try:
                                char = self.serial.read().decode()
index ffd79038781a5dfb9f89e328152aa0d9c06c76bd..81e34919d13ea502d75ad483012306cb589c85af 100644 (file)
@@ -1,6 +1,64 @@
+from datetime import datetime
+
+from xively import XivelyAPIClient
+from xively import Datastream
+from xively import Datapoint
+
+
 class Logger:
+       api   = None
+       feed  = None
+       queue = []
+       last  = 0
+
+       # Methods
        def __init__(self, config):
                self.config = config
 
+       # Methods
        def connect(self):
-               pass
+               self.api   = XivelyAPIClient(self.config.apikey)
+               self.feed  = self.api.feeds.get(self.config.feedid)
+               self.last  = datetime.utcnow()
+               self.queue = []
+
+       def disconnect(self):
+               self.api   = None
+               self.feed  = None
+
+       def running(self):
+               if not self.api or not self.feed:
+                       return False
+               return True
+
+       def append(self, state):
+               if not self.feed:
+                       return
+               self.queue.append(state)
+               delta = datetime.utcnow() - self.last
+               if delta.total_seconds() > self.config.maxrate:
+                       self.flush()
+
+       # Private methods
+       def flush(self):
+               def isset(state, key):
+                       value = getattr(state, key)
+                       return any([x!=None for x in value])
+               def get(items, key):
+                       points = [ Datapoint(s.time, getattr(s,key)) \
+                               for s in items if isset(s,key) ]
+                       stream = Datastream(id=key)
+                       stream.datapoints = points
+                       return stream
+
+               self.feed.datastreams = [
+                       get(self.queue, 'acc'),
+                       get(self.queue, 'mag'),
+                       get(self.queue, 'touch'),
+                       get(self.queue, 'light'),
+                       get(self.queue, 'a2d'),
+               ]
+               self.feed.update()
+
+               self.last  = datetime.utcnow()
+               self.queue = []
index 00149ad274d28212d2042232429bb4dd449512a4..7ec155100db1fca295f6fdce7925a3fc3aabfab2 100755 (executable)
@@ -14,6 +14,8 @@ class Main:
 
        def main(self):
                self.visual.run()
+               self.device.disconnect()
+               self.logger.disconnect()
 
 if __name__ == "__main__":
        main = Main()
index 6d06ba4444bf6a478cdafd0dbef54a1157f94fc9..bd52be967b6da0ec7b9fce077be4be8d857adf9b 100644 (file)
@@ -117,21 +117,22 @@ class Visual:
                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.IconSize.BUTTON)
-               else:
-                       serial.set_active(False)
-                       status.set_from_stock(Gtk.STOCK_NO,  Gtk.IconSize.BUTTON)
-               if self.device.running():
-                       for item in self.device.process():
-                               self.update(item)
-                               #self.debug(item)
+       def timer(self):
+               def check(state, name):
+                       btn = self.builder.get_object(name + '_btn')
+                       con = self.builder.get_object(name + '_con')
+                       img = Gtk.STOCK_YES if state else Gtk.STOCK_NO
+                       btn.set_active(state)
+                       con.set_from_stock(img, Gtk.IconSize.BUTTON)
+
+               check(self.device.running(), "serial")
+               check(self.logger.running(), "xively")
+
+               for item in self.device.process():
+                       self.update(item)
+                       self.logger.append(item)
+                       #self.debug(item)
 
                return True
 
index f4795b7848d82cbd7cb006f426d222df75c7a90f..ea9b741bad60677ff1c2100074e03597dd60537f 100644 (file)
@@ -2,16 +2,6 @@
 <interface>
   <requires lib="gtk+" version="2.24"/>
   <!-- interface-naming-policy project-wide -->
-  <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="GtkAdjustment" id="a2d_adj">
     <property name="upper">100</property>
     <property name="value">1</property>
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </object>
+  <object class="GtkAdjustment" id="mag_adj">
+    <property name="upper">100</property>
+    <property name="value">1</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkToggleAction" id="serial_act">
+    <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="GtkToggleAction" id="xively_act">
+    <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="datab_adj">
     <property name="lower">6</property>
     <property name="upper">8</property>
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </object>
-  <object class="GtkAdjustment" id="mag_adj">
-    <property name="upper">100</property>
-    <property name="value">1</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
   <object class="GtkAdjustment" id="rate_adj">
     <property name="upper">100</property>
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </object>
   <object class="GtkTextBuffer" id="serial_buf"/>
+  <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="GtkDialog" id="settings">
     <property name="can_focus">False</property>
     <property name="border_width">5</property>
                         <property name="primary_icon_sensitive">True</property>
                         <property name="secondary_icon_sensitive">True</property>
                         <property name="adjustment">baud_adj</property>
-                        <signal name="changed" handler="on_config" swapped="no"/>
+                        <signal name="value-changed" handler="on_config" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
                         <property name="primary_icon_sensitive">True</property>
                         <property name="secondary_icon_sensitive">True</property>
                         <property name="adjustment">stopb_adj</property>
-                        <signal name="changed" handler="on_config" swapped="no"/>
+                        <signal name="value-changed" handler="on_config" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
                         <property name="primary_icon_sensitive">True</property>
                         <property name="secondary_icon_sensitive">True</property>
                         <property name="adjustment">datab_adj</property>
-                        <signal name="changed" handler="on_config" swapped="no"/>
+                        <signal name="value-changed" handler="on_config" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
                         <property name="primary_icon_sensitive">True</property>
                         <property name="secondary_icon_sensitive">True</property>
                         <property name="adjustment">rate_adj</property>
-                        <signal name="changed" handler="on_config" swapped="no"/>
+                        <signal name="value-changed" handler="on_config" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </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="GtkWindow" id="window">
     <property name="can_focus">False</property>
     <signal name="destroy" handler="on_destroy" swapped="no"/>
             <property name="toolbar_style">both</property>
             <child>
               <object class="GtkToggleToolButton" id="serial_btn">
-                <property name="related_action">serial_con</property>
+                <property name="related_action">serial_act</property>
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
                 <property name="use_underline">True</property>
             </child>
             <child>
               <object class="GtkToggleToolButton" id="xively_btn">
-                <property name="related_action">xively_con</property>
+                <property name="related_action">xively_act</property>
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
                 <property name="use_underline">True</property>
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <child>
-              <object class="GtkImage" id="conn">
+              <object class="GtkImage" id="serial_con">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
                 <property name="stock">gtk-no</property>
                 <property name="position">0</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkImage" id="xively_con">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="stock">gtk-no</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
             <child>
               <object class="GtkStatusbar" id="status">
                 <property name="visible">True</property>
               <packing>
                 <property name="expand">True</property>
                 <property name="fill">True</property>
-                <property name="position">1</property>
+                <property name="position">2</property>
               </packing>
             </child>
           </object>