DBC_Converter/DBC_Converter_Common.py

77 lines
2.9 KiB
Python

import os
import sys
from DBC_Converter_Data_Parsing import load_dbc_file
def generate_structs(signals, output_file):
if not signals:
print("[WARNING] No signals to generate structs for.")
return
# Ensure the output directory exists
output_dir = os.path.dirname(output_file)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
with open(output_file, 'w') as f:
f.write("#ifndef GENERATED_STRUCTS_H\n")
f.write("#define GENERATED_STRUCTS_H\n\n")
f.write("#include <stdint.h>\n\n")
tx_structs = {}
rx_structs = {}
for message_name, message_info in signals.items():
hex_id = message_info["ID"]
if message_info["TX ECU name"] == "VCU":
struct_name = f"{message_name}_{hex_id}"
tx_structs[struct_name] = []
for signal in message_info["Signals"]:
if signal["Length"] <= 32:
tx_structs[struct_name].append(f" uint32_t {signal['Signal name']} : {signal['Length']};")
else:
tx_structs[struct_name].append(f" float {signal['Signal name']};")
for signal in message_info["Signals"]:
if signal["RX ECU name"] == "VCU":
struct_name = f"{message_name}_{hex_id}"
if struct_name not in rx_structs:
rx_structs[struct_name] = []
if signal["Length"] <= 32:
rx_structs[struct_name].append(f" uint32_t {signal['Signal name']} : {signal['Length']};")
else:
rx_structs[struct_name].append(f" float {signal['Signal name']};")
f.write("typedef struct {\n")
f.write(" typedef struct {\n")
for struct_name, fields in tx_structs.items():
f.write(f" typedef struct {{\n")
for field in fields:
f.write(f" {field}\n")
f.write(f" }} {struct_name};\n\n")
f.write(" } TX;\n\n")
f.write(" typedef struct {\n")
for struct_name, fields in rx_structs.items():
f.write(f" typedef struct {{\n")
for field in fields:
f.write(f" {field}\n")
f.write(f" }} {struct_name};\n\n")
f.write(" } RX;\n")
f.write("} VCU;\n\n")
f.write("#endif // GENERATED_STRUCTS_H\n")
print(f"[INFO] Structs written to {output_file}")
if __name__ == "__main__":
dbc_file_path = sys.argv[1]
output_dir = sys.argv[2]
output_structs_file = f"{output_dir}/generated_structs.h"
signals = load_dbc_file(dbc_file_path)
if signals is None:
print(f"[ERROR] Failed to load DBC file: {dbc_file_path}")
sys.exit(1)
generate_structs(signals, output_structs_file)