annotate service/arduinoNode/write_arduino_code.py @ 1703:80b01d548b9c

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