Mercurial > code > home > repos > homeauto
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) |