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
102
103
104
105
|
"""
Generic class for arg parsing and command processing.
"""
__copyright__ = 'Copyright (C) 2019 Theobroma Systems Design und Consulting GmbH'
__license__ = 'MIT'
import sys
import cp210x_controller
def do_delay(dev):
time.sleep(0.3)
def do_list(devs):
print("Found %d board%s:" % (len(devs), "s"[len(devs) == 1:]))
for idx, dev in enumerate(devs):
print("%d: %s %s" % (idx, dev.serial_number, dev.product))
class CommandProcessor:
def __init__(self, product_string, options_dict, command_dict):
self.product_string = product_string
self.options_dict = options_dict
self.command_dict = {
'delay': (do_delay,
'delays execution for 300 ms'),
'list': (do_list,
'lists serial numbers of attached boards'),
}
self.command_dict.update(command_dict)
def print_helpstring(self):
print('Tool to controls power and BIOS disable state')
print('Synopsis: ' + sys.argv[0] + ' OPTIONS COMMAND(S)')
print('Options:')
print("\t-h, --help...displays this help text")
print("\t-i, --ignore-product-string...ignore the product string of the device")
print("\t-s SERIAL, --serial SERIAL...specify the serial number of the device")
if self.options_dict:
for o in self.options_dict:
(cb, helpstr) = self.options_dict[o]
print("\t" + o + "..." + helpstr)
print('Commands:')
for c in self.command_dict:
(cb, helpstr) = self.command_dict[c]
print("\t" + c + "..." + helpstr)
print("")
def validate_commandline(self, argv):
self.ignore_product_string = False
self.serialnumber = None
self.command_list = []
consume = None
for arg in argv:
if arg == '-h' or arg == '--help':
self.print_helpstring()
sys.exit(0)
elif arg == '-i' or arg == '--ignore-product-string':
self.ignore_product_string = True;
elif arg == '-s' or arg == '--serial':
consume = '-s'
elif consume == '-s':
self.serialnumber = arg
consume = None
else:
if self.options_dict and arg in self.options_dict:
(cb, helpstr) = self.options_dict[arg]
cb()
elif arg in self.command_dict:
self.command_list.append(arg)
else:
print("Unkown command " + arg)
sys.exit(1)
def run(self):
# Collect list of potential devices
if self.ignore_product_string == True:
self.product_string = None
# Get list of matching USB devices
devs = cp210x_controller.find_board_list(self.product_string, self.serialnumber)
if len(devs) == 0:
print("No devices found!")
sys.exit(2)
# List devices if required
if 'list' in self.command_list:
do_list(devs)
sys.exit(0)
# Other commands than 'list' require exactly one device
if len(devs) != 1:
print("Please specify target device (found " + str(len(devs)) + " matching devices)")
sys.exit(3)
# Get the one and only device
dev = devs[0]
# Execute commands
for cmd in self.command_list:
(cb, helpstr) = self.command_dict[cmd]
cb(dev)
|