-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenerate_can_identifiers.py
More file actions
53 lines (44 loc) · 2.01 KB
/
generate_can_identifiers.py
File metadata and controls
53 lines (44 loc) · 2.01 KB
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
import re
from datetime import datetime
HEADER_FILE = "common/can_identifiers.hpp"
OUTPUT_FILE = "raspiboard/robot/can_identifiers.py"
DEFINE_PATTERN = re.compile(r"#define\s+([A-Z0-9_]+)\s+(0x[0-9A-Fa-f]+)")
def parse_header_file(filepath):
identifiers = []
with open(filepath, "r") as file:
for line_num, line in enumerate(file, 1):
match = DEFINE_PATTERN.match(line.strip())
if match:
name, hex_value = match.groups()
try:
value = int(hex_value, 16)
identifiers.append((name, value))
except ValueError:
print(f"Warning: Invalid hex value at line {line_num}: {line.strip()}")
return identifiers
def generate_python_module(identifiers, output_path):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(output_path, "w") as f:
f.write(f"# Auto-generated by generate_can_identifiers.py on {timestamp}\n\n")
f.write("class CANIDS:\n")
for name, value in identifiers:
f.write(f" {name} = {value:#04X}\n")
f.write("\n")
f.write(" @classmethod\n")
f.write(" def get_name(cls, can_id: int) -> str:\n")
f.write(' """\n')
f.write(" Return the name of the CAN ID constant from its value.\n")
f.write(" Raises KeyError if not found.\n")
f.write(' """\n')
f.write(" for name, value in cls.__dict__.items():\n")
f.write(' if not name.startswith("__") and value == can_id:\n')
f.write(" return name\n")
f.write(' raise KeyError(f"CAN ID 0x{can_id:X} not found in CANIDS.")\n')
def main():
identifiers = parse_header_file(HEADER_FILE)
generate_python_module(identifiers, OUTPUT_FILE)
print(f"Generated {OUTPUT_FILE} with {len(identifiers)} identifiers:")
for name, value in identifiers:
print(f" {name} = {value:#04x}")
if __name__ == "__main__":
main()