annotate service/arduinoNode/write_arduino_code.py @ 328:b069bb37f817

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