DBC_Converter/Data_Parsing.py

69 lines
2.6 KiB
Python

import re, sys
def load_dbc_file(file_path):
try:
with open(file_path, 'r') as file:
content = file.read()
# print(f"[INFO] Successfully loaded DBC file: {file_path}")
# 메시지와 시그널을 추출하는 정규 표현식
message_pattern = re.compile(r'BO_\s+(\d+)\s+(\w+)\s*:\s*(\d+)\s+(\w+)')
signal_pattern = re.compile(r'SG_\s+(\w+)\s*:\s*(\d+)\|(\d+)@(\d+)\+\s*\(([^,]+),\s*([^)]+)\)')
# 메시지와 시그널 매칭
messages = {}
current_message = None
for line in content.splitlines():
line = line.strip()
if not line:
current_message = None
continue
message_match = message_pattern.match(line)
if message_match:
decimal_id = int(message_match.group(1))
hex_id = f"0x{decimal_id:03X}"
message_name = message_match.group(2)
dlc = int(message_match.group(3))
tx_ecu_name = message_match.group(4)
current_message = message_name
messages[current_message] = {
"ID": hex_id,
"DLC": dlc,
"TX ECU name": tx_ecu_name,
"Signals": []
}
elif current_message:
signal_match = signal_pattern.match(line)
if signal_match:
signal_name = signal_match.group(1)
msb = int(signal_match.group(2))
length = int(signal_match.group(3))
byte_order = int(signal_match.group(4))
factor = float(signal_match.group(5))
offset = float(signal_match.group(6))
messages[current_message]["Signals"].append({
"Signal name": signal_name,
"msb": msb,
"Length": length,
"Byte order": byte_order,
"Factor": factor,
"Offset": offset
})
return messages
except Exception as e:
print(f"[ERROR] Failed to parse DBC file: {e}")
return None
if __name__ == "__main__":
file_path = sys.argv[1]
messages = load_dbc_file(file_path)
if messages:
for message_name, message_info in messages.items():
print(f"[INFO] Message: {message_name}, Info: {message_info['ID']}, {message_info['DLC']}, {message_info['TX ECU name']}")
for signal in message_info['Signals']:
print(f" └ Signal: {signal}")