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*([^)]+)\)\s*\[[^\]]+\]\s*\"[^\"]*\"\s+(\w+)') # 메시지와 시그널 매칭 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)) sign = signal_match.group(5) factor = float(signal_match.group(6)) offset = float(signal_match.group(7)) rx_ecu_name = signal_match.group(8) messages[current_message]["Signals"].append({ "Signal name": signal_name, "msb": msb, "Length": length, "Byte order": byte_order, "Sign": sign, "Factor": factor, "Offset": offset, "RX ECU name": rx_ecu_name }) 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}")