Mercurial > code > home > repos > homeauto
annotate service/arduinoNode/arduinoNode.py @ 166:c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
Ignore-this: e78106d25dbb2ac8c5e5d8a81d576358
author | drewp@bigasterisk.com |
---|---|
date | Sat, 11 Apr 2015 01:43:59 -0700 |
parents | 49c1756b2edb |
children | d228105749ac |
rev | line source |
---|---|
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
1 """ |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
2 depends on arduino-mk |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
3 """ |
164 | 4 import shutil |
5 import tempfile | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
6 import glob, sys, logging, subprocess, socket, os, hashlib, time |
164 | 7 import cyclone.web |
8 from rdflib import Graph, Namespace, URIRef, Literal, RDF | |
9 from twisted.internet import reactor, task | |
10 import devices | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
11 import dotrender |
164 | 12 |
13 logging.basicConfig(level=logging.DEBUG) | |
14 | |
15 from loggingserial import LoggingSerial | |
16 | |
17 sys.path.append("/my/site/magma") | |
18 from stategraph import StateGraph | |
19 | |
20 log = logging.getLogger() | |
21 logging.getLogger('serial').setLevel(logging.WARN) | |
22 | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
23 import rdflib.namespace |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
24 old_split = rdflib.namespace.split_uri |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
25 def new_split(uri): |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
26 try: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
27 return old_split(uri) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
28 except Exception: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
29 return uri, '' |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
30 rdflib.namespace.split_uri = new_split |
164 | 31 |
32 ROOM = Namespace('http://projects.bigasterisk.com/room/') | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
33 HOST = Namespace('http://bigasterisk.com/ruler/host/') |
164 | 34 |
35 class Config(object): | |
36 def __init__(self): | |
37 self.graph = Graph() | |
38 log.info('read config') | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
39 self.graph.parse('config.n3', format='n3') |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
40 self.graph.bind('', ROOM) # not working |
164 | 41 self.graph.bind('rdf', RDF) |
42 | |
43 def serialDevices(self): | |
44 return dict([(row.dev, row.board) for row in self.graph.query( | |
45 """SELECT ?board ?dev WHERE { | |
46 ?board :device ?dev; | |
47 a :ArduinoBoard . | |
48 }""", initNs={'': ROOM})]) | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
49 |
164 | 50 class Board(object): |
51 """an arduino connected to this computer""" | |
52 baudrate = 115200 | |
53 def __init__(self, dev, graph, uri, onChange): | |
54 """ | |
55 each connected thing has some pins. | |
56 | |
57 We'll call onChange when we know the currentGraph() has | |
58 changed (and not just in creation time). | |
59 """ | |
60 self.uri = uri | |
61 self.graph = graph | |
62 self.dev = dev | |
63 | |
64 # The order of this list needs to be consistent between the | |
65 # deployToArduino call and the poll call. | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
66 self._devs = devices.makeDevices(graph, self.uri) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
67 self._polledDevs = [d for d in self._devs if d.generatePollCode()] |
164 | 68 |
69 self._statementsFromInputs = {} # input uri: latest statements | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
70 |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
71 self.open() |
164 | 72 |
73 def open(self): | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
74 self.ser = LoggingSerial(port=self.dev, baudrate=self.baudrate, |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
75 timeout=2) |
164 | 76 |
77 def startPolling(self): | |
78 task.LoopingCall(self._poll).start(.5) | |
79 | |
80 def _poll(self): | |
81 """ | |
82 even boards with no inputs need some polling to see if they're | |
83 still ok | |
84 """ | |
85 try: | |
86 self._pollWork() | |
87 except Exception as e: | |
88 log.warn("poll: %r" % e) | |
89 | |
90 def _pollWork(self): | |
91 self.ser.write("\x60\x00") | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
92 for i in self._polledDevs: |
164 | 93 self._statementsFromInputs[i.uri] = i.readFromPoll(self.ser.read) |
94 #plus statements about succeeding or erroring on the last poll | |
95 | |
96 def currentGraph(self): | |
97 g = Graph() | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
98 |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
99 g.add((HOST[socket.gethostname()], ROOM['connectedTo'], self.uri)) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
100 |
164 | 101 for si in self._statementsFromInputs.values(): |
102 for s in si: | |
103 g.add(s) | |
104 return g | |
105 | |
106 def generateArduinoCode(self): | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
107 generated = { |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
108 'baudrate': self.baudrate, |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
109 'includes': '', |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
110 'global': '', |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
111 'setups': '', |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
112 'polls': '' |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
113 } |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
114 for attr in ['includes', 'global', 'setups', 'polls']: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
115 for i in self._devs: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
116 if attr == 'includes': |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
117 gen = '\n'.join('#include "%s"\n' % inc |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
118 for inc in i.generateIncludes()) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
119 elif attr == 'global': gen = i.generateGlobalCode() |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
120 elif attr == 'setups': gen = i.generateSetupCode() |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
121 elif attr == 'polls': gen = i.generatePollCode() |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
122 else: raise NotImplementedError |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
123 |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
124 if gen: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
125 generated[attr] += '// for %s\n%s\n' % (i.uri, gen) |
164 | 126 |
127 return ''' | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
128 %(includes)s |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
129 |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
130 %(global)s |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
131 |
164 | 132 void setup() { |
133 Serial.begin(%(baudrate)d); | |
134 Serial.flush(); | |
135 %(setups)s | |
136 } | |
137 | |
138 void loop() { | |
139 byte head, cmd; | |
140 if (Serial.available() >= 2) { | |
141 head = Serial.read(); | |
142 if (head != 0x60) { | |
143 Serial.flush(); | |
144 return; | |
145 } | |
146 cmd = Serial.read(); | |
147 if (cmd == 0x00) { | |
148 %(polls)s; | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
149 } else if (cmd == 0x01) { |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
150 Serial.write("CODE_CHECKSUM"); |
164 | 151 } |
152 } | |
153 } | |
154 ''' % generated | |
155 | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
156 |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
157 def codeChecksum(self, code): |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
158 # this is run on the code without CODE_CHECKSUM replaced yet |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
159 return hashlib.sha1(code).hexdigest() |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
160 |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
161 def readBoardChecksum(self, length): |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
162 # this is likely right after reset, so it might take 2 seconds |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
163 for tries in range(6): |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
164 self.ser.write("\x60\x01") |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
165 try: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
166 return self.ser.read(length) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
167 except ValueError: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
168 if tries == 5: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
169 raise |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
170 time.sleep(.5) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
171 raise ValueError |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
172 |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
173 def boardIsCurrent(self, currentChecksum): |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
174 try: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
175 boardCksum = self.readBoardChecksum(len(currentChecksum)) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
176 if boardCksum == currentChecksum: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
177 log.info("board has current code (%s)" % currentChecksum) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
178 return True |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
179 else: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
180 log.info("board responds with incorrect code version") |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
181 except Exception as e: |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
182 log.info("can't get code version from board: %r" % e) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
183 return False |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
184 |
164 | 185 def deployToArduino(self): |
186 code = self.generateArduinoCode() | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
187 cksum = self.codeChecksum(code) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
188 code = code.replace('CODE_CHECKSUM', cksum) |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
189 |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
190 if self.boardIsCurrent(cksum): |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
191 return |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
192 |
164 | 193 try: |
194 if hasattr(self, 'ser'): | |
195 self.ser.close() | |
196 workDir = tempfile.mkdtemp(prefix='arduinoNode_board_deploy') | |
197 try: | |
198 self._arduinoMake(workDir, code) | |
199 finally: | |
200 shutil.rmtree(workDir) | |
201 finally: | |
202 self.open() | |
203 | |
204 def _arduinoMake(self, workDir, code): | |
205 with open(workDir + '/makefile', 'w') as makefile: | |
206 makefile.write(''' | |
207 BOARD_TAG = %(tag)s | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
208 USER_LIB_PATH := %(libs)s |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
209 ARDUINO_LIBS = %(arduinoLibs)s |
164 | 210 MONITOR_PORT = %(dev)s |
211 | |
212 include /usr/share/arduino/Arduino.mk | |
213 ''' % { | |
214 'dev': self.dev, | |
215 'tag': self.graph.value(self.uri, ROOM['boardTag']), | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
216 'libs': os.path.abspath('arduino-libraries'), |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
217 'arduinoLibs': ' '.join(sum((d.generateArduinoLibs() |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
218 for d in self._devs), [])), |
164 | 219 }) |
220 | |
221 with open(workDir + '/main.ino', 'w') as main: | |
222 main.write(code) | |
223 | |
224 subprocess.check_call(['make', 'upload'], cwd=workDir) | |
225 | |
226 | |
227 class Index(cyclone.web.RequestHandler): | |
228 def get(self): | |
229 self.set_header("Content-Type", "text/html") | |
230 self.write(open("index.html").read()) | |
231 | |
232 class GraphPage(cyclone.web.RequestHandler): | |
233 def get(self): | |
234 g = StateGraph(ctx=ROOM['arduinosOn%s' % 'host']) | |
235 | |
236 for b in self.settings.boards: | |
237 for stmt in b.currentGraph(): | |
238 g.add(stmt) | |
239 | |
240 if self.get_argument('config', 'no') == 'yes': | |
241 for stmt in self.settings.config.graph: | |
242 g.add(stmt) | |
243 | |
244 self.set_header('Content-type', 'application/x-trig') | |
245 self.write(g.asTrig()) | |
246 | |
247 class Dot(cyclone.web.RequestHandler): | |
248 def get(self): | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
249 configGraph = self.settings.config.graph |
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
250 dot = dotrender.render(configGraph, self.settings.boards) |
164 | 251 self.write(dot) |
252 | |
253 class ArduinoCode(cyclone.web.RequestHandler): | |
254 def get(self): | |
255 board = [b for b in self.settings.boards if | |
256 b.uri == URIRef(self.get_argument('board'))][0] | |
257 self.set_header('Content-type', 'text/plain') | |
258 self.write(board.generateArduinoCode()) | |
259 | |
260 | |
261 def currentSerialDevices(): | |
262 log.info('find connected boards') | |
263 return glob.glob('/dev/serial/by-id/*') | |
264 | |
265 def main(): | |
266 config = Config() | |
267 current = currentSerialDevices() | |
268 | |
269 def onChange(): | |
270 # notify reasoning | |
271 pass | |
272 | |
273 boards = [] | |
274 for dev, board in config.serialDevices().items(): | |
275 if str(dev) not in current: | |
276 continue | |
277 log.info("we have board %s connected at %s" % (board, dev)) | |
278 b = Board(dev, config.graph, board, onChange) | |
279 boards.append(b) | |
280 | |
166
c0180bd2b33a
only recompile if the C code is new. redo Device class api. single temperature sensor is working
drewp@bigasterisk.com
parents:
164
diff
changeset
|
281 boards[0].deployToArduino() |
164 | 282 |
283 log.info('open boards') | |
284 for b in boards: | |
285 b.startPolling() | |
286 | |
287 from twisted.python import log as twlog | |
288 twlog.startLogging(sys.stdout) | |
289 | |
290 log.setLevel(logging.DEBUG) | |
291 reactor.listenTCP(9059, cyclone.web.Application([ | |
292 (r"/", Index), | |
293 (r"/graph", GraphPage), | |
294 (r'/arduinoCode', ArduinoCode), | |
295 (r'/dot', Dot), | |
296 ], config=config, boards=boards)) | |
297 reactor.run() | |
298 | |
299 main() |