comparison service/arduinoNode/arduinoNode.py @ 1048:f3c7f617c335

piNode poll switches much faster. mirror the logic in arduinoNode though vari-rate poll is not supported yet Ignore-this: 4ef38c7a2ed35f77035209bffeffc245 darcs-hash:a7ca5ba671d2919a5de413acc1ca8b8bf1eea31b
author drewp <drewp@bigasterisk.com>
date Tue, 02 Feb 2016 22:37:11 -0800
parents ffe6a00c6cef
children 254df9f881a6
comparison
equal deleted inserted replaced
1047:e3d77b7f16ca 1048:f3c7f617c335
83 self._devCommandNum = dict((dev.uri, ACTION_BASE + devIndex) 83 self._devCommandNum = dict((dev.uri, ACTION_BASE + devIndex)
84 for devIndex, dev in enumerate(self._devs)) 84 for devIndex, dev in enumerate(self._devs))
85 self._polledDevs = [d for d in self._devs if d.generatePollCode()] 85 self._polledDevs = [d for d in self._devs if d.generatePollCode()]
86 86
87 self._statementsFromInputs = {} # input device uri: latest statements 87 self._statementsFromInputs = {} # input device uri: latest statements
88 self._lastPollTime = {} # input device uri: time()
88 self._carbon = CarbonClient(serverHost='bang') 89 self._carbon = CarbonClient(serverHost='bang')
89 self.open() 90 self.open()
90 for d in self._devs: 91 for d in self._devs:
91 self.syncMasterGraphToHostStatements(d) 92 self.syncMasterGraphToHostStatements(d)
92 93
120 import traceback; traceback.print_exc() 121 import traceback; traceback.print_exc()
121 log.warn("poll: %r" % e) 122 log.warn("poll: %r" % e)
122 123
123 def _pollWork(self): 124 def _pollWork(self):
124 t1 = time.time() 125 t1 = time.time()
125 self.ser.write("\x60\x00") 126 self.ser.write("\x60\x00") # "poll everything"
126 for i in self._polledDevs: 127 for i in self._polledDevs:
128 now = time.time()
129 new = i.readFromPoll(self.ser.read)
127 prev = self._statementsFromInputs.get(i.uri, []) 130 prev = self._statementsFromInputs.get(i.uri, [])
128 new = self._statementsFromInputs[i.uri] = inContext( 131 if new or prev:
129 i.readFromPoll(self.ser.read), i.uri) 132 self._statementsFromInputs[i.uri] = new
130 self.masterGraph.patch(Patch.fromDiff(prev, new)) 133 # it's important that quads from different devices
134 # don't clash, since that can lead to inconsistent
135 # patches (e.g.
136 # dev1 changes value from 1 to 2;
137 # dev2 changes value from 2 to 3;
138 # dev1 changes from 2 to 4 but this patch will
139 # fail since the '2' statement is gone)
140 self.masterGraph.patch(Patch.fromDiff(inContext(prev, i.uri),
141 inContext(new, i.uri)))
142 self._lastPollTime[i.uri] = now
131 143
132 #plus statements about succeeding or erroring on the last poll 144 #plus statements about succeeding or erroring on the last poll
133 byte = self.ser.read(1) 145 byte = self.ser.read(1)
134 if byte != 'x': 146 if byte != 'x':
135 raise ValueError("after poll, got %x instead of 'x'" % byte) 147 raise ValueError("after poll, got %x instead of 'x'" % byte)