annotate service/arduinoNode/write_arduino_code.py @ 1348:e681221ab8a3

release 0.4.0 Ignore-this: fa3be75cf8765569c6498f743858ad48 darcs-hash:9803849d98c7a18ed90df08f907749c1ee1d037d
author drewp <drewp@bigasterisk.com>
date Thu, 25 Apr 2019 23:01:26 -0700
parents f349fe25789c
children
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) {
1140
f349fe25789c rgb strip animation support in arduinoNode
drewp <drewp@bigasterisk.com>
parents: 1034
diff changeset
43 {
f349fe25789c rgb strip animation support in arduinoNode
drewp <drewp@bigasterisk.com>
parents: 1034
diff changeset
44 %(code)s
f349fe25789c rgb strip animation support in arduinoNode
drewp <drewp@bigasterisk.com>
parents: 1034
diff changeset
45 }
1034
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
46 Serial.write('k');
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
47 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
48 ''' % dict(cmdNum=devCommandNum[dev.uri],
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
49 code=code)
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 gen = ''
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
52 else:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
53 raise NotImplementedError
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
54
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
55 if gen:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
56 generated[attr] += '// for %s\n%s\n' % (dev.uri, gen.strip())
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58 code = '''
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
59 %(includes)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
60
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
61 %(global)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
62 byte frame=1;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
63 unsigned long lastFrame=0;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
64
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
65 void setup() {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
66 Serial.begin(%(baudrate)d);
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
67 Serial.flush();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
68 %(setups)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
69 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
70
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
71 void idle() {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
72 // this slowdown is to spend somewhat less time PWMing, to reduce
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
73 // 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
74 // latching)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
75 if (micros() < lastFrame + 80) {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
76 return;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
77 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
78 lastFrame = micros();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
79 frame++;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
80 %(idles)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
81 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
82
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
83 void loop() {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
84 byte head, cmd;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
85 idle();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
86 if (Serial.available() >= 2) {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
87 head = Serial.read();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
88 if (head != 0x60) {
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
89 Serial.flush();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
90 return;
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
91 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
92 cmd = Serial.read();
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
93 if (cmd == 0x00) { // poll
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
94 %(polls)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
95 Serial.write('x');
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
96 } else if (cmd == 0x01) { // get code checksum
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
97 Serial.write("CODE_CHECKSUM");
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 %(actions)s
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
100 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
101 }
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
102 ''' % generated
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
103 return code
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
104
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
105 def indent(code):
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
106 try:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
107 with tempfile.SpooledTemporaryFile() as codeFile:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
108 codeFile.write(code)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
109 codeFile.seek(0)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
110 code = subprocess.check_output([
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
111 'indent',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
112 '-linux',
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
113 '-fc1', # ok to indent comments
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
114 '-i4', # 4-space indent
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
115 '-sob' # swallow blanks (not working)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
116 ], stdin=codeFile)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
117 except OSError as e:
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
118 log.warn("indent failed (%r)", e)
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
119 return code
43a2170bbdb8 refactor to write_arduino_node
drewp <drewp@bigasterisk.com>
parents:
diff changeset
120