]> Pileus Git - ~andy/csm213a-hw/blob - vis/logger.py
84b6e0d5e24d3da740dd75287bddfb84a5bd3065
[~andy/csm213a-hw] / vis / logger.py
1 from datetime import datetime
2
3 from xively import XivelyAPIClient
4 from xively import Datastream
5 from xively import Datapoint
6
7
8 class Logger:
9         api   = None
10         feed  = None
11         queue = []
12         last  = 0
13
14         # Methods
15         def __init__(self, config):
16                 self.config = config
17
18         # Methods
19         def connect(self):
20                 self.api   = XivelyAPIClient(self.config.apikey)
21                 self.feed  = self.api.feeds.get(self.config.feedid)
22                 self.last  = datetime.utcnow()
23                 self.queue = []
24
25         def disconnect(self):
26                 self.api   = None
27                 self.feed  = None
28
29         def running(self):
30                 if not self.api or not self.feed:
31                         return False
32                 return True
33
34         def append(self, state):
35                 if not self.feed:
36                         return
37                 self.queue.append(state)
38                 delta = datetime.utcnow() - self.last
39                 if delta.total_seconds() > self.config.maxrate:
40                         self.flush()
41
42         # Private methods
43         def flush(self):
44                 def isset(state, key):
45                         value = getattr(state, key)
46                         return any([x!=None for x in value])
47                 def get(items, key):
48                         points = [ Datapoint(s.time, getattr(s,key)) \
49                                 for s in items if isset(s,key) ]
50                         stream = Datastream(id=key)
51                         stream.datapoints = points
52                         return stream
53
54                 if not self.running() or len(self.queue) == 0:
55                         return
56
57                 self.feed.datastreams = [
58                         get(self.queue, 'acc'),
59                         get(self.queue, 'mag'),
60                         get(self.queue, 'touch'),
61                         get(self.queue, 'light'),
62                         get(self.queue, 'a2d'),
63                 ]
64                 self.feed.update()
65
66                 self.last  = datetime.utcnow()
67                 self.queue = []