annotate service/arduinoNode/write_arduino_code.py @ 1063:295d20307b81

try a speedup for raspi Ignore-this: 9cdbabb99c9888792c167866f06d65eb darcs-hash:a10ec9fb5dc728c876e236137bce904f1d190414
author drewp <drewp@bigasterisk.com>
date Mon, 21 Mar 2016 04:23:59 -0700
parents 43a2170bbdb8
children 3010238b94a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1034
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
1 import tempfile, subprocess, logging, os
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
2 log = logging.getLogger('arduino_code')
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4 def writeMakefile(dev, tag, allLibs):
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
5 return '''
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
6 BOARD_TAG = %(tag)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
7 USER_LIB_PATH := %(libs)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8 ARDUINO_LIBS = %(arduinoLibs)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
9 MONITOR_PORT = %(dev)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
10
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
11 include /usr/share/arduino/Arduino.mk
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
12 ''' % {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
13 'dev': dev,
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
14 'tag': tag,
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
15 'libs': os.path.abspath('arduino-libraries'),
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
16 'arduinoLibs': ' '.join(allLibs),
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
19 def writeCode(baudrate, devs, devCommandNum):
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
20 generated = {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21 'baudrate': baudrate,
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22 'includes': '',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
23 'global': '',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
24 'setups': '',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
25 'polls': '',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
26 'idles': '',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27 'actions': '',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
29 for attr in ['includes', 'global', 'setups', 'polls', 'idles',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
30 'actions']:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31 for dev in devs:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
32 if attr == 'includes':
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33 gen = '\n'.join('#include "%s"\n' % inc
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
34 for inc in dev.generateIncludes())
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
35 elif attr == 'global': gen = dev.generateGlobalCode()
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
36 elif attr == 'setups': gen = dev.generateSetupCode()
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
37 elif attr == 'polls': gen = dev.generatePollCode()
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
38 elif attr == 'idles': gen = dev.generateIdleCode()
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
39 elif attr == 'actions':
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
40 code = dev.generateActionCode()
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
41 if code:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
42 gen = '''else if (cmd == %(cmdNum)s) {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
43 %(code)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
44 Serial.write('k');
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
45 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
46 ''' % dict(cmdNum=devCommandNum[dev.uri],
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
47 code=code)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
48 else:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
49 gen = ''
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
50 else:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
51 raise NotImplementedError
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
52
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
53 if gen:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
54 generated[attr] += '// for %s\n%s\n' % (dev.uri, gen.strip())
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
55
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
56 code = '''
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57 %(includes)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
59 %(global)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
60 byte frame=1;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
61 unsigned long lastFrame=0;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
62
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
63 void setup() {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
64 Serial.begin(%(baudrate)d);
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
65 Serial.flush();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
66 %(setups)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
67 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
68
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
69 void idle() {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
70 // this slowdown is to spend somewhat less time PWMing, to reduce
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
71 // leaking from on channels to off ones (my shift register has no
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
72 // latching)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
73 if (micros() < lastFrame + 80) {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
74 return;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
75 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
76 lastFrame = micros();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
77 frame++;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
78 %(idles)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
79 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
80
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
81 void loop() {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
82 byte head, cmd;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
83 idle();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
84 if (Serial.available() >= 2) {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
85 head = Serial.read();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
86 if (head != 0x60) {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
87 Serial.flush();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
88 return;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
89 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
90 cmd = Serial.read();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
91 if (cmd == 0x00) { // poll
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
92 %(polls)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
93 Serial.write('x');
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
94 } else if (cmd == 0x01) { // get code checksum
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
95 Serial.write("CODE_CHECKSUM");
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
96 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
97 %(actions)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
98 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
99 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
100 ''' % generated
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
101 return code
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
102
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
103 def indent(code):
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
104 try:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
105 with tempfile.SpooledTemporaryFile() as codeFile:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
106 codeFile.write(code)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
107 codeFile.seek(0)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
108 code = subprocess.check_output([
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
109 'indent',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
110 '-linux',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
111 '-fc1', # ok to indent comments
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
112 '-i4', # 4-space indent
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
113 '-sob' # swallow blanks (not working)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
114 ], stdin=codeFile)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
115 except OSError as e:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
116 log.warn("indent failed (%r)", e)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
117 return code
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
118