+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 = []
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
<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>