-
Notifications
You must be signed in to change notification settings - Fork 0
/
run_file.py
101 lines (69 loc) · 2.23 KB
/
run_file.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
"""Run motor program from given file.
Usage: `sudo python3 run_file.py FILE
FILE is a list of commands in JSON format.
Valid commands are:
* "repeat", which takes a "repeats" parameter and list of subcommands
* "move", which takes "position" and "speed" parameters
* "comment", which takes a "comment" parameter
See example_prog.json as an example
Copyright (C) 2015 Tom Oakley
MIT licence
"""
import json
import logging
import sys
import time
import motor
def execute(step):
"""Execute the program step."""
command = step['command']
if command == 'repeat':
n_repeats = step['repeats']
if n_repeats < 0:
# Loop indefinitely
logging.warning('Entering infinite loop')
while True:
for sub_step in step['steps']:
execute(sub_step)
# 0 or more repeats requested
for repeat in range(n_repeats):
for sub_step in step['steps']:
execute(sub_step)
elif command == 'move':
mtr.drive(step['duty'], step['time'])
elif command == 'sleep':
time.sleep(step['duration'])
elif command == 'comment':
logging.info(step['comment'])
else:
raise ValueError('Command {} not expected'.format(command))
def setup_logging(level):
logger = logging.getLogger()
logger.setLevel(level)
# Remove any existing handlers
for handler in logger.handlers:
logger.removeHandler(handler)
# Create a file handler
fh = logging.FileHandler('log.log')
logger.addHandler(fh)
# Create a stream handler to log to terminal
sh = logging.StreamHandler()
logger.addHandler(sh)
fmt = '%(asctime)s %(levelname)-8s %(message)s'
formatter = logging.Formatter(fmt)
for handler in logger.handlers:
handler.setLevel(level)
handler.setFormatter(formatter)
if __name__ == '__main__':
setup_logging(logging.DEBUG)
if len(sys.argv) != 2:
print(__doc__)
sys.exit(1)
with open(sys.argv[1]) as f:
program = json.load(f)
try:
with motor.Motor() as mtr:
for step in program:
execute(step)
except KeyboardInterrupt:
logging.info('Exited by KeyboardInterrrupt')