From 42707cd97e02b5202635d03bd6ed8c033f78559e Mon Sep 17 00:00:00 2001 From: 3minbe Date: Wed, 5 Feb 2025 09:36:06 +0900 Subject: [PATCH] =?UTF-8?q?DBC=20=ED=8C=8C=EC=9D=BC=20=EB=A1=9C=EB=93=9C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=83=88?= =?UTF-8?q?=EB=A1=9C=EC=9A=B4=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EC=8B=A0=ED=98=B8=20=ED=8C=A8=ED=84=B4=EC=97=90=20?= =?UTF-8?q?RX=20ECU=20=EC=9D=B4=EB=A6=84=20=ED=95=84=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DBC_Converter_RX.py | 0 DBC_Converter_TX.py | 0 DBC_to_C_RX.py | 69 ++++++++--------------- Data_Parsing.py | 9 ++- __pycache__/Data_Parsing.cpython-313.pyc | Bin 0 -> 3296 bytes 5 files changed, 31 insertions(+), 47 deletions(-) create mode 100644 DBC_Converter_RX.py create mode 100644 DBC_Converter_TX.py create mode 100644 __pycache__/Data_Parsing.cpython-313.pyc diff --git a/DBC_Converter_RX.py b/DBC_Converter_RX.py new file mode 100644 index 0000000..e69de29 diff --git a/DBC_Converter_TX.py b/DBC_Converter_TX.py new file mode 100644 index 0000000..e69de29 diff --git a/DBC_to_C_RX.py b/DBC_to_C_RX.py index 154c2be..753afbb 100644 --- a/DBC_to_C_RX.py +++ b/DBC_to_C_RX.py @@ -3,6 +3,7 @@ import sys import cantools from datetime import datetime import json +import os def parse_dbc_file(file_path): signals = [] @@ -95,12 +96,12 @@ def parse_dbc_file(file_path): return signals -def generate_vcu_rx_function_with_factors(dbc_path, output_file, channel_info): +def generate_vcu_rx_function_with_factors(dbc_path, output_file): # Load the DBC file db = cantools.database.load_file(dbc_path) # Initialize the header of the C file - c_file_content = f""" + c_file_content = """ #include "can.h" // Declare Factors and Offsets for signals @@ -130,10 +131,9 @@ def generate_vcu_rx_function_with_factors(dbc_path, output_file, channel_info): # Check if "VCU" is in the receivers list if "VCU" in message.receivers: # Define the temporary struct - channel = channel_info.get(str(message.frame_id), "CH0") # 기본 채널 설정 - temp_struct_name = f"{channel}_MV1_0x{message.frame_id:X}_temp" + temp_struct_name = f"CH0_MV1_0x{message.frame_id:X}_temp" c_file_content += f""" -void Receive_{message.name}_{channel}_0x{message.frame_id:X}(void) +void Receive_{message.name}_CH0_0x{message.frame_id:X}(void) {{ struct {{ """ @@ -153,16 +153,16 @@ void Receive_{message.name}_{channel}_0x{message.frame_id:X}(void) start_byte = signal.start // 8 start_bit = signal.start % 8 signal_length = signal.length - shift_expr = f"(CAN_ch[{channel}].rx.buf[{start_byte}] >> shift{start_bit})" + shift_expr = f"(CAN_ch[0].rx.buf[{start_byte}] >> shift{start_bit})" if signal_length > 8: # Handle multi-byte signals multi_byte_expr = [] for i in range((signal_length + 7) // 8): byte_shift = i * 8 if i == 0: - multi_byte_expr.append(f"(CAN_ch[{channel}].rx.buf[{start_byte + i}] >> shift{start_bit})") + multi_byte_expr.append(f"(CAN_ch[0].rx.buf[{start_byte + i}] >> shift{start_bit})") else: - multi_byte_expr.append(f"(CAN_ch[{channel}].rx.buf[{start_byte + i}] << shift{byte_shift})") + multi_byte_expr.append(f"(CAN_ch[0].rx.buf[{start_byte + i}] << shift{byte_shift})") shift_expr = " | ".join(multi_byte_expr) c_file_content += f" {temp_struct_name}.{signal.name}_temp = ({shift_expr}) & _{signal_length}bit;\n" @@ -171,14 +171,14 @@ void Receive_{message.name}_{channel}_0x{message.frame_id:X}(void) # Assign to final ECU variables for signal in message.signals: factor_name = f"Factor_{str(signal.scale).replace('.', '_')}" - offset_name = f"Offset_m_{abs(signal.offset)::.0f}" + offset_name = f"Offset_m_{abs(signal.offset):.0f}" factor = f" * {factor_name}" if signal.scale != 1 else "" offset = f" + {offset_name}" if signal.offset != 0 else "" temp_var = f"{temp_struct_name}.{signal.name}_temp" if signal.is_signed: - c_file_content += f" VCU.RX.{channel}_{message.name}_0x{message.frame_id:X}.{signal.name} = ({temp_var}{factor}){offset};\n" + c_file_content += f" ECU3.RX.CH0_{message.name}_0x{message.frame_id:X}.{signal.name} = ({temp_var}{factor}){offset};\n" else: - c_file_content += f" VCU.RX.{channel}_{message.name}_0x{message.frame_id:X}.{signal.name} = {temp_var}{factor}{offset};\n" + c_file_content += f" ECU3.RX.CH0_{message.name}_0x{message.frame_id:X}.{signal.name} = {temp_var}{factor}{offset};\n" c_file_content += "}\n" @@ -188,7 +188,7 @@ void Receive_{message.name}_{channel}_0x{message.frame_id:X}(void) print(f"Generated RX function C file with Factors and Offsets: {output_file}") -def generate_input_functions(signals, output_file, channel_info): +def generate_input_functions(signals, output_file): if not signals: print("[WARNING] No signals to generate Input functions for.") return @@ -196,16 +196,15 @@ def generate_input_functions(signals, output_file, channel_info): with open(output_file, 'w') as f: for message in signals: hex_id = f"0x{int(message['id']):X}" - channel = channel_info.get(str(message['id']), "CH0") - function_name = f"void Input_Data_Set_{message['name']}_{channel}_{hex_id}(void)" + function_name = f"void Input_Data_Set_{message['name']}_CH0_{hex_id}(void)" f.write(f"{function_name}\n{{\n") for signal in message["signals"]: - f.write(f" GV_{signal['name']} = VCU.RX.{channel}_RX_{message['name']}_{hex_id}.{signal['name']};\n") + f.write(f" GV_{signal['name']} = ECU3.RX.CH0_RX_{message['name']}_{hex_id}.{signal['name']};\n") f.write("}\n\n") print(f"[INFO] Input functions written to {output_file}") -def generate_structs(signals, output_file, channel_info): +def generate_structs(signals, output_file): if not signals: print("[WARNING] No signals to generate structs for.") return @@ -217,19 +216,18 @@ def generate_structs(signals, output_file, channel_info): for message in signals: hex_id = f"0x{int(message['id']):X}" - channel = channel_info.get(str(message['id']), "CH0") f.write(f"typedef struct\n{{\n") for signal in message["signals"]: if signal["size"] <= 32: f.write(f" uint32_t {signal['name']} : {signal['size']};\n") else: f.write(f" float {signal['name']};\n") - f.write(f"}} {channel}_RX_{message['name']}_{hex_id};\n\n") + f.write(f"}} CH0_RX_{message['name']}_{hex_id};\n\n") f.write("#endif // GENERATED_STRUCTS_H\n") print(f"[INFO] Structs written to {output_file}") -def generate_globals(signals, output_file, header_file, channel_info): +def generate_globals(signals, output_file, header_file): if not signals: print("[WARNING] No signals to generate globals for.") return @@ -238,7 +236,6 @@ def generate_globals(signals, output_file, header_file, channel_info): f.write("#include \n") for message in signals: - channel = channel_info.get(str(message['id']), "CH0") for signal in message["signals"]: if signal["size"] > 32: f.write(f"float GV_{signal['name']} = 0.0f;\n") @@ -250,7 +247,6 @@ def generate_globals(signals, output_file, header_file, channel_info): f.write("#define GENERATED_GLOBALS_H\n\n") f.write("#include \n\n") for message in signals: - channel = channel_info.get(str(message['id']), "CH0") for signal in message["signals"]: if signal["size"] > 32: f.write(f"extern float GV_{signal['name']};\n") @@ -260,17 +256,16 @@ def generate_globals(signals, output_file, header_file, channel_info): print(f"[INFO] Globals and extern declarations written to {output_file} and {header_file}") -def generate_initialization(signals, output_file, channel_info): +def generate_initialization(signals, output_file): if not signals: print("[WARNING] No signals to generate initialization for.") return with open(output_file, 'w') as f: - f.write("void VCU_Data_Init(void)\n{\n") + f.write("void ECU3_Data_Init(void)\n{\n") for message in signals: hex_id = f"0x{int(message['id']):X}" - channel = channel_info.get(str(message['id']), "CH0") - struct_prefix = f"VCU.RX.{channel}_RX_{message['name']}_{hex_id}" + struct_prefix = f"ECU3.RX.CH0_RX_{message['name']}_{hex_id}" for signal in message["signals"]: if signal["offset"] != 0.0: if signal["size"] <= 32: @@ -290,20 +285,6 @@ def generate_initialization(signals, output_file, channel_info): if __name__ == "__main__": dbc_file_path = sys.argv[1] output_dir = sys.argv[2] - channel_info_path = sys.argv[3] - - with open(channel_info_path, 'r', encoding='cp1252') as f: - try: - channel_info = json.load(f) - # Convert channel info to int - for key in channel_info: - channel_info[key] = int(channel_info[key].replace("CH", "")) - except json.JSONDecodeError as e: - print(f"[ERROR] Error decoding JSON: {e}") - sys.exit(1) - except Exception as e: - print(f"[ERROR] Error reading channel info file: {e}") - sys.exit(1) output_c_file = f"{output_dir}/generated_receive.c" output_input_file = f"{output_dir}/generated_input.c" @@ -313,8 +294,8 @@ if __name__ == "__main__": output_initialization_file = f"{output_dir}/generated_init.c" signals = parse_dbc_file(dbc_file_path) - generate_vcu_rx_function_with_factors(dbc_file_path, output_c_file, channel_info) - generate_input_functions(signals, output_input_file, channel_info) - generate_structs(signals, output_structs_file, channel_info) - generate_globals(signals, output_globals_file, output_globals_header, channel_info) - generate_initialization(signals, output_initialization_file, channel_info) \ No newline at end of file + generate_vcu_rx_function_with_factors(dbc_file_path, output_c_file) + generate_input_functions(signals, output_input_file) + generate_structs(signals, output_structs_file) + generate_globals(signals, output_globals_file, output_globals_header) + generate_initialization(signals, output_initialization_file) \ No newline at end of file diff --git a/Data_Parsing.py b/Data_Parsing.py index 0483a6a..5d10fbc 100644 --- a/Data_Parsing.py +++ b/Data_Parsing.py @@ -8,7 +8,7 @@ def load_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*([^)]+)\)') + signal_pattern = re.compile(r'SG_\s+(\w+)\s*:\s*(\d+)\|(\d+)@(\d+)\+\s*\(([^,]+),\s*([^)]+)\)\s*\[[^\]]+\]\s*\"[^\"]*\"\s+(\w+)') # 메시지와 시그널 매칭 messages = {} @@ -43,13 +43,15 @@ def load_dbc_file(file_path): byte_order = int(signal_match.group(4)) factor = float(signal_match.group(5)) offset = float(signal_match.group(6)) + rx_ecu_name = signal_match.group(7) messages[current_message]["Signals"].append({ "Signal name": signal_name, "msb": msb, "Length": length, "Byte order": byte_order, "Factor": factor, - "Offset": offset + "Offset": offset, + "RX ECU name": rx_ecu_name }) return messages @@ -59,7 +61,8 @@ def load_dbc_file(file_path): return None if __name__ == "__main__": - file_path = sys.argv[1] + # file_path = sys.argv[1] + file_path = 'C:/Users/MSI/SynologyDrive/3min_be/한자연/!과제/초안전/#Debug/DBC/241007_primary_HyperSafe4.dbc' messages = load_dbc_file(file_path) if messages: diff --git a/__pycache__/Data_Parsing.cpython-313.pyc b/__pycache__/Data_Parsing.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6eb6682ddf9128d211a449c920759b8aca9daa74 GIT binary patch literal 3296 zcmai0O>7&-6`tMYpZG74qHXGjOUjl+{ZSI7$flJhHfdW*EXn426Bk^WSdmL=8*)kP zQm!TRU=%IDQ^6oHECfN#-t1EeB!?V&Y74|i5;RPDD6jh-Da%8|ja_J1orEJ%( zM&iCVZ@%|4@6Ej31CvP);5hU3ACiAI0PqhqQHHU_9Q+G1cK`(_>_Z?nDJEhR?gS#v z5EK!(4gkvnK&eC(gL?p@n#G#BqMA_;x6H6B05IyXsWp9x%(i$NSO@^Hfde3FMIF=O z0hF52ngOL@bd**NQIOX`zT+ic-{k!|#U}|M!hodEo*CNGH!K+$y&3rNL)4NL00SVw z(tML9G4$s(?V@OwW33&a34{Saz~8|&70N_Eh_qK}n3Y)=F&a1!Fd7RZx+JESlJ?T7{9NGzf3PEbt(K}`Wc^D!RoIJBp5N<21j30wFr0D_j* zhS4rx8ww7sD|L*+h>_(b7XUQzrh3xab{sldr|7Xf01=DgfYyaO75~lN;$y>ByfW<(5@1^?FpO&F4!#)ZuxKT5-yOy+#upmY-<5~9Nr^GXyxn2C>i8}yfmjs)QE71Zo@N8HwERLY6^BnMmXYv${IUtfGkrPCToSDsFdChm-NiTQV`} zzrKq)+%9TtyQp7zRWiO9l8Mme;E#rD*U1Y(niSYHCu=D_DX=MN7ZqR^HMCtVe2B0O z1Fv?=&|Gd}iL|sPYc6v_GPk~^Kfjsd$cz~0L|Jo@jpZ_st|Sr?m)kOg4?S#oA{WBp zmGCNgk>yidoXlm&EGtSJ89E;%6HpW&y(U?e$#R0M5;-<5<06bJmPu#fqO6y)DL$9t z1x}LHQcmQvvO3M?V(T)&3prVx6f+x8lt^XRoUCE9&`ezJxNs}RWpjK+kkwfc;=IS? z4&*DEWpnGY3bDwAkmH~YOPZ4;HrZIraiSobrAAT^xG~qY0FrEpZHOY&iMAxN3PmQH z6bsGB^l>i6r`c4LkIR~M?iQj(1=2`65l_WrL+)0Ti)}<35@X9}(}JNjLrY>8tc9#e zHS#X&*I?eGt-L2%dCxTRE*r#`3}T#g3@Vau9`gBMfT1N$l$a%IkqKpD8)>*NiTOAq zenMs07{?^}90O|<4Q7O!oCp)agxDM#y#kBJ3(1M>rfh;qk4NKcu_#KY2tNfHFI}k% z9=_XPA3vkE@0dCZ-filU$z8lwcR26zpYor5lE3tV0A|l~J?QDXH}b_u`P53)c_nYz zIni^^`Gs>IfK!Y30RYYq@Vt3n1MH5xuI}v5Tb|l`YWBg3eXwR9&WGx@V|N3e20ok5 zhrY8Nt9u3umM7NZPkTpey;GImsnW@6?_7TAJ4^3QA6e|Hxo0ZwnbOs&d#>7dx}dN3 z^lks*zOCFhUOq8V(9~UHHP>{-HC>vjx@HT;9mk37@tSkI;vB!vR-Kbo$5er+_m9^4 zrz-tZC3m%dreLUhCJL6PPO{$9UmuvLyWGz@)Z<+RUDfJ+VFX?7f~)Qtuetmcm%kLM zy3Q1g-`iY;d8k(N%v3xm8qZwe!yRYecB?*}?}qeV*ccZD6)CFk51)1E;HfXCU%T!q*+w z?Y$NI_INW%E0abaOiv+fVyyxbUNN7M_n^8yD2z zcb%8~#J%7+WdCY)pyxD&7{ zzjr6USNx4{AjGY0Bz^FJ`=)26CMV~juu-I0aWlHGndL-^O>i?4@Mv#YBa6!yS60cT zW|IhzTe>lFQAlJ0q=-Jiw(v1hL|@(_`cQ5(&JEN(N%HTXe@-_0Cv0&B5x#AJOh}tj z=PJ5IPuiFd3*7RrFZ-1Rm;%rg@0--^^xg6 zPCS@+JQAoF2lJP=$DSBF%XWCoip!7B?R`rwW=U*6wX{@n&(o?C?FdP96}T XXZi;<7(KgB0G)N;08~!#JdFFlCcf@q literal 0 HcmV?d00001