mirror of
https://github.com/3minbe/DBC_Converter.git
synced 2026-05-17 01:23:58 +09:00
채널 매개변수를 추가하여 RX 및 TX 함수에서 CAN 채널을 동적으로 처리하도록 수정
This commit is contained in:
parent
48dbd3e25a
commit
7fe8713106
@ -1,4 +1,5 @@
|
|||||||
import sys
|
import sys
|
||||||
|
import json
|
||||||
from DBC_Converter_Data_Parsing import load_dbc_file
|
from DBC_Converter_Data_Parsing import load_dbc_file
|
||||||
|
|
||||||
#============================== Generate Globals ==============================#
|
#============================== Generate Globals ==============================#
|
||||||
@ -31,7 +32,7 @@ def generate_globals(signals, C_file, header_file):
|
|||||||
print(f"[INFO] Globals and extern declarations written to {C_file} and {header_file}")
|
print(f"[INFO] Globals and extern declarations written to {C_file} and {header_file}")
|
||||||
|
|
||||||
#============================== Generate VCU RX Function ==============================#
|
#============================== Generate VCU RX Function ==============================#
|
||||||
def generate_vcu_rx_function_with_factors(signals, output_file):
|
def generate_vcu_rx_function_with_factors(signals, channel, output_file):
|
||||||
if not signals:
|
if not signals:
|
||||||
print("[ERROR] No signals to generate VCU RX functions for.")
|
print("[ERROR] No signals to generate VCU RX functions for.")
|
||||||
return
|
return
|
||||||
@ -101,28 +102,28 @@ void Receive_{message_name}_{message_info['ID']}(void)
|
|||||||
lsb = signal["msb"] + 8*(signal_length // 8) - (signal_length % 8 - 1)
|
lsb = signal["msb"] + 8*(signal_length // 8) - (signal_length % 8 - 1)
|
||||||
if signal_length > 8:
|
if signal_length > 8:
|
||||||
# Handle multi-byte signals
|
# Handle multi-byte signals
|
||||||
shift_expr = f"(CAN_ch[0].rx.buf[{start_byte}] << shift{7 - start_bit})"
|
shift_expr = f"(CAN_ch[{channel}].rx.buf[{start_byte}] << shift{7 - start_bit})"
|
||||||
multi_byte_expr = []
|
multi_byte_expr = []
|
||||||
for i in range((signal_length + 7) // 8):
|
for i in range((signal_length + 7) // 8):
|
||||||
byte_shift = (7 - start_bit) + (i * 8)
|
byte_shift = (7 - start_bit) + (i * 8)
|
||||||
if i == 0:
|
if i == 0:
|
||||||
multi_byte_expr.append(f"(CAN_ch[0].rx.buf[{start_byte + i}] << shift{7 - start_bit})")
|
multi_byte_expr.append(f"(CAN_ch[{channel}].rx.buf[{start_byte + i}] << shift{7 - start_bit})")
|
||||||
else:
|
else:
|
||||||
multi_byte_expr.append(f"(CAN_ch[0].rx.buf[{start_byte + i}] >> shift{byte_shift})")
|
multi_byte_expr.append(f"(CAN_ch[{channel}].rx.buf[{start_byte + i}] >> shift{byte_shift})")
|
||||||
shift_expr = " | ".join(multi_byte_expr)
|
shift_expr = " | ".join(multi_byte_expr)
|
||||||
else :
|
else :
|
||||||
shift_expr = f"(CAN_ch[0].rx.buf[{start_byte}] >> shift{lsb % 8})"
|
shift_expr = f"(CAN_ch[{channel}].rx.buf[{start_byte}] >> shift{lsb % 8})"
|
||||||
else: # Intel (Little Endian)
|
else: # Intel (Little Endian)
|
||||||
shift_expr = f"(CAN_ch[0].rx.buf[{start_byte}] >> shift{start_bit})"
|
shift_expr = f"(CAN_ch[{channel}].rx.buf[{start_byte}] >> shift{start_bit})"
|
||||||
if signal_length > 8:
|
if signal_length > 8:
|
||||||
# Handle multi-byte signals
|
# Handle multi-byte signals
|
||||||
multi_byte_expr = []
|
multi_byte_expr = []
|
||||||
for i in range((signal_length + 7) // 8):
|
for i in range((signal_length + 7) // 8):
|
||||||
byte_shift = i * 8
|
byte_shift = i * 8
|
||||||
if i == 0:
|
if i == 0:
|
||||||
multi_byte_expr.append(f"(CAN_ch[0].rx.buf[{start_byte + i}] >> shift{start_bit})")
|
multi_byte_expr.append(f"(CAN_ch[{channel}].rx.buf[{start_byte + i}] >> shift{start_bit})")
|
||||||
else:
|
else:
|
||||||
multi_byte_expr.append(f"(CAN_ch[0].rx.buf[{start_byte + i}] << shift{byte_shift})")
|
multi_byte_expr.append(f"(CAN_ch[{channel}].rx.buf[{start_byte + i}] << shift{byte_shift})")
|
||||||
shift_expr = " | ".join(multi_byte_expr)
|
shift_expr = " | ".join(multi_byte_expr)
|
||||||
c_file_content += f" {temp_struct_name}.{signal['Signal name']}_temp = ({shift_expr}) & _{signal_length}bit;\n"
|
c_file_content += f" {temp_struct_name}.{signal['Signal name']}_temp = ({shift_expr}) & _{signal_length}bit;\n"
|
||||||
|
|
||||||
@ -147,7 +148,7 @@ void Receive_{message_name}_{message_info['ID']}(void)
|
|||||||
print(f"Generated RX function C file with Factors and Offsets: {output_file}")
|
print(f"Generated RX function C file with Factors and Offsets: {output_file}")
|
||||||
|
|
||||||
#============================== Generate Input Function ==============================#
|
#============================== Generate Input Function ==============================#
|
||||||
def generate_input_functions(signals, output_file):
|
def generate_input_functions(signals, channel, output_file):
|
||||||
if not signals:
|
if not signals:
|
||||||
print("[WARNING] No signals to generate Input functions for.")
|
print("[WARNING] No signals to generate Input functions for.")
|
||||||
return
|
return
|
||||||
@ -155,15 +156,15 @@ def generate_input_functions(signals, output_file):
|
|||||||
with open(output_file, 'w') as f:
|
with open(output_file, 'w') as f:
|
||||||
for message_name, message_info in signals.items():
|
for message_name, message_info in signals.items():
|
||||||
hex_id = message_info["ID"]
|
hex_id = message_info["ID"]
|
||||||
function_name = f"void Input_Data_Set_{message_name}_CH0_{hex_id}(void)"
|
function_name = f"void Input_Data_Set_{message_name}_CH{channel}_{hex_id}(void)"
|
||||||
f.write(f"{function_name}\n{{\n")
|
f.write(f"{function_name}\n{{\n")
|
||||||
for signal in message_info["Signals"]:
|
for signal in message_info["Signals"]:
|
||||||
f.write(f" GV_{signal['Signal name']} = VCU.RX.CH0_RX_{message_name}_{hex_id}.{signal['Signal name']};\n")
|
f.write(f" GV_{signal['Signal name']} = VCU.RX.CH{channel}_RX_{message_name}_{hex_id}.{signal['Signal name']};\n")
|
||||||
f.write("}\n\n")
|
f.write("}\n\n")
|
||||||
print(f"[INFO] Input functions written to {output_file}")
|
print(f"[INFO] Input functions written to {output_file}")
|
||||||
|
|
||||||
#============================== Generate Initialization ==============================#
|
#============================== Generate Initialization ==============================#
|
||||||
def generate_initialization(signals, output_file):
|
def generate_initialization(signals, channel, output_file):
|
||||||
if not signals:
|
if not signals:
|
||||||
print("[WARNING] No signals to generate initialization for.")
|
print("[WARNING] No signals to generate initialization for.")
|
||||||
return
|
return
|
||||||
@ -172,7 +173,7 @@ def generate_initialization(signals, output_file):
|
|||||||
f.write("void VCU_Data_Init(void)\n{\n")
|
f.write("void VCU_Data_Init(void)\n{\n")
|
||||||
for message_name, message_info in signals.items():
|
for message_name, message_info in signals.items():
|
||||||
hex_id = message_info["ID"]
|
hex_id = message_info["ID"]
|
||||||
struct_prefix = f"VCU.RX.CH0_RX_{message_name}_{hex_id}"
|
struct_prefix = f"VCU.RX.CH{channel}_RX_{message_name}_{hex_id}"
|
||||||
for signal in message_info["Signals"]:
|
for signal in message_info["Signals"]:
|
||||||
if signal["Offset"] != 0.0:
|
if signal["Offset"] != 0.0:
|
||||||
if signal["Length"] <= 32:
|
if signal["Length"] <= 32:
|
||||||
@ -192,6 +193,24 @@ def generate_initialization(signals, output_file):
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
dbc_file_path = sys.argv[1]
|
dbc_file_path = sys.argv[1]
|
||||||
output_dir = sys.argv[2]
|
output_dir = sys.argv[2]
|
||||||
|
channel = sys.argv[3]
|
||||||
|
|
||||||
|
channel = json.loads(channel)
|
||||||
|
|
||||||
|
if list(channel.values())[-1] == "CH0":
|
||||||
|
channel = 0
|
||||||
|
elif list(channel.values())[-1] == "CH1":
|
||||||
|
channel = 1
|
||||||
|
elif list(channel.values())[-1] == "CH2":
|
||||||
|
channel = 2
|
||||||
|
elif list(channel.values())[-1] == "CH3":
|
||||||
|
channel = 3
|
||||||
|
elif list(channel.values())[-1] == "CH4":
|
||||||
|
channel = 4
|
||||||
|
elif list(channel.values())[-1] == "CH5":
|
||||||
|
channel = 5
|
||||||
|
else:
|
||||||
|
print("[ERROR] Invalid channel specified. Must be one of CH0, CH1, CH2, CH3, CH4, or CH5.")
|
||||||
|
|
||||||
output_globals_C_file = f"{output_dir}/generated_RX_globals.c"
|
output_globals_C_file = f"{output_dir}/generated_RX_globals.c"
|
||||||
output_globals_header_file = f"{output_dir}/generated_RX_globals.h"
|
output_globals_header_file = f"{output_dir}/generated_RX_globals.h"
|
||||||
@ -202,6 +221,6 @@ if __name__ == "__main__":
|
|||||||
signals = load_dbc_file(dbc_file_path)
|
signals = load_dbc_file(dbc_file_path)
|
||||||
|
|
||||||
generate_globals(signals, output_globals_C_file, output_globals_header_file)
|
generate_globals(signals, output_globals_C_file, output_globals_header_file)
|
||||||
generate_vcu_rx_function_with_factors(signals, output_c_file)
|
generate_vcu_rx_function_with_factors(signals, channel, output_c_file)
|
||||||
generate_input_functions(signals, output_input_file)
|
generate_input_functions(signals, channel, output_input_file)
|
||||||
generate_initialization(signals, output_initialization_file)
|
generate_initialization(signals, channel, output_initialization_file)
|
||||||
@ -1,8 +1,8 @@
|
|||||||
import sys
|
import sys
|
||||||
|
import json
|
||||||
from DBC_Converter_Data_Parsing import load_dbc_file
|
from DBC_Converter_Data_Parsing import load_dbc_file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#============================== Generate TX Globals ==============================#
|
#============================== Generate TX Globals ==============================#
|
||||||
def generate_tx_globals(signals, output_file, header_file):
|
def generate_tx_globals(signals, output_file, header_file):
|
||||||
if not signals:
|
if not signals:
|
||||||
@ -32,7 +32,7 @@ def generate_tx_globals(signals, output_file, header_file):
|
|||||||
|
|
||||||
|
|
||||||
#============================== Generate TX Functions ==============================#
|
#============================== Generate TX Functions ==============================#
|
||||||
def generate_tx_functions(signals, output_file):
|
def generate_tx_functions(signals, channel, output_file):
|
||||||
if not signals:
|
if not signals:
|
||||||
print("[WARNING] No signals to generate TX functions for.")
|
print("[WARNING] No signals to generate TX functions for.")
|
||||||
return
|
return
|
||||||
@ -40,14 +40,14 @@ def generate_tx_functions(signals, output_file):
|
|||||||
with open(output_file, 'w') as f:
|
with open(output_file, 'w') as f:
|
||||||
for message_name, message_info in signals.items():
|
for message_name, message_info in signals.items():
|
||||||
hex_id = message_info["ID"]
|
hex_id = message_info["ID"]
|
||||||
function_name = f"void Output_Data_Set_{message_name}_CH0_{hex_id}(void)"
|
function_name = f"void Output_Data_Set_{message_name}_CH{channel}_{hex_id}(void)"
|
||||||
f.write(f"{function_name}\n{{\n")
|
f.write(f"{function_name}\n{{\n")
|
||||||
for signal in message_info["Signals"]:
|
for signal in message_info["Signals"]:
|
||||||
factor_str = f"/ {signal['Factor']}" if signal["Factor"] != 1.0 else ""
|
factor_str = f"/ {signal['Factor']}" if signal["Factor"] != 1.0 else ""
|
||||||
offset_str = f"- {signal['Offset']}" if signal["Offset"] != 0.0 else ""
|
offset_str = f"- {signal['Offset']}" if signal["Offset"] != 0.0 else ""
|
||||||
mask = f"_{signal['Length']}bit"
|
mask = f"_{signal['Length']}bit"
|
||||||
f.write(
|
f.write(
|
||||||
f" VCU.TX.CH0_{message_name}_{hex_id}.{signal['Signal name']} = "
|
f" VCU.TX.CH{channel}_{message_name}_{hex_id}.{signal['Signal name']} = "
|
||||||
f"(int)((GV_{signal['Signal name']} {offset_str}) {factor_str}) & {mask};\n"
|
f"(int)((GV_{signal['Signal name']} {offset_str}) {factor_str}) & {mask};\n"
|
||||||
)
|
)
|
||||||
f.write("}\n\n")
|
f.write("}\n\n")
|
||||||
@ -55,7 +55,7 @@ def generate_tx_functions(signals, output_file):
|
|||||||
|
|
||||||
|
|
||||||
#============================== Generate TX Initialization ==============================#
|
#============================== Generate TX Initialization ==============================#
|
||||||
def generate_tx_initialization(signals, output_file):
|
def generate_tx_initialization(signals, channel, output_file):
|
||||||
if not signals:
|
if not signals:
|
||||||
print("[WARNING] No TX signals found for initialization generation.")
|
print("[WARNING] No TX signals found for initialization generation.")
|
||||||
return
|
return
|
||||||
@ -66,14 +66,14 @@ def generate_tx_initialization(signals, output_file):
|
|||||||
hex_id = message_info["ID"]
|
hex_id = message_info["ID"]
|
||||||
f.write(f" // {message_name} ({hex_id})\n")
|
f.write(f" // {message_name} ({hex_id})\n")
|
||||||
for signal in message_info["Signals"]:
|
for signal in message_info["Signals"]:
|
||||||
f.write(f" VCU.TX.CH0_{message_name}_{hex_id}.{signal['Signal name']} = 0;\n")
|
f.write(f" VCU.TX.CH{channel}_{message_name}_{hex_id}.{signal['Signal name']} = 0;\n")
|
||||||
f.write("\n")
|
f.write("\n")
|
||||||
f.write("}\n")
|
f.write("}\n")
|
||||||
print(f"[INFO] TX initialization function written to {output_file}")
|
print(f"[INFO] TX initialization function written to {output_file}")
|
||||||
|
|
||||||
|
|
||||||
#============================== Generate TX Enum ==============================#
|
#============================== Generate TX Enum ==============================#
|
||||||
def generate_tx_enum(signals, output_file, cycle):
|
def generate_tx_enum(signals, channel, output_file, cycle):
|
||||||
if not signals:
|
if not signals:
|
||||||
print("[WARNING] No TX messages found for enum generation.")
|
print("[WARNING] No TX messages found for enum generation.")
|
||||||
return
|
return
|
||||||
@ -81,15 +81,15 @@ def generate_tx_enum(signals, output_file, cycle):
|
|||||||
with open(output_file, 'w') as f:
|
with open(output_file, 'w') as f:
|
||||||
f.write("typedef enum {\n")
|
f.write("typedef enum {\n")
|
||||||
for idx, message_name in enumerate(signals.keys()):
|
for idx, message_name in enumerate(signals.keys()):
|
||||||
enum_name = f"VCU_CH0_TX_{message_name}_{cycle}"
|
enum_name = f"VCU_CH{channel}_TX_{message_name}_{cycle}"
|
||||||
f.write(f" {enum_name} = {idx},\n")
|
f.write(f" {enum_name} = {idx},\n")
|
||||||
f.write(" NUMBER_OF_VCU_CH0_TX_MESSAGE,\n")
|
f.write(f" NUMBER_OF_VCU_CH{channel}_TX_MESSAGE,\n")
|
||||||
f.write("} VCU_CH0_TX;\n")
|
f.write(f"} VCU_CH{channel}_TX;\n")
|
||||||
print(f"[INFO] TX enum written to {output_file}")
|
print(f"[INFO] TX enum written to {output_file}")
|
||||||
|
|
||||||
|
|
||||||
#============================== Generate TX C File ==============================#
|
#============================== Generate TX C File ==============================#
|
||||||
def generate_vcu_can_transmit_single_c_file(signals, output_file):
|
def generate_vcu_can_transmit_single_c_file(signals, channel, output_file):
|
||||||
if not signals:
|
if not signals:
|
||||||
print("[ERROR] No signals to generate VCU CAN transmit functions for.")
|
print("[ERROR] No signals to generate VCU CAN transmit functions for.")
|
||||||
return
|
return
|
||||||
@ -108,7 +108,7 @@ def generate_vcu_can_transmit_single_c_file(signals, output_file):
|
|||||||
|
|
||||||
# Add the function definition for the message
|
# Add the function definition for the message
|
||||||
c_file_content += f"""
|
c_file_content += f"""
|
||||||
void Transmit_{message_name}_CH0_{message_info['ID']}(void)
|
void Transmit_{message_name}_CH{channel}_{message_info['ID']}(void)
|
||||||
{{
|
{{
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -118,7 +118,7 @@ void Transmit_{message_name}_CH0_{message_info['ID']}(void)
|
|||||||
start_byte = signal["msb"] // 8
|
start_byte = signal["msb"] // 8
|
||||||
start_bit = signal["msb"] % 8
|
start_bit = signal["msb"] % 8
|
||||||
signal_length = signal["Length"]
|
signal_length = signal["Length"]
|
||||||
signal_name = f"VCU.TX.CH0_{message_name}_{message_info['ID']}.{signal['Signal name']}"
|
signal_name = f"VCU.TX.CH{channel}_{message_name}_{message_info['ID']}.{signal['Signal name']}"
|
||||||
|
|
||||||
# Handle 8-bit chunks
|
# Handle 8-bit chunks
|
||||||
while signal_length > 0:
|
while signal_length > 0:
|
||||||
@ -152,11 +152,11 @@ void Transmit_{message_name}_CH0_{message_info['ID']}(void)
|
|||||||
# Write buffer assignments to the function
|
# Write buffer assignments to the function
|
||||||
for i, assignment in enumerate(buffer_assignments):
|
for i, assignment in enumerate(buffer_assignments):
|
||||||
if assignment:
|
if assignment:
|
||||||
c_file_content += f" CAN_ch[0].tx.buf[{i}] = ({assignment}) & _8bit;\n"
|
c_file_content += f" CAN_ch[{channel}].tx.buf[{i}] = ({assignment}) & _8bit;\n"
|
||||||
|
|
||||||
# Add the send function call
|
# Add the send function call
|
||||||
c_file_content += f"""
|
c_file_content += f"""
|
||||||
can_send_config(CAN_INST_0, g_messageObjectConf_VCU_0ch_TX[VCU_CH0_TX_{message_name}_10ms]);
|
can_send_config(CAN_INST_0, g_messageObjectConf_VCU_{channel}ch_TX[VCU_CH{channel}_TX_{message_name}_10ms]);
|
||||||
}}
|
}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -170,6 +170,24 @@ void Transmit_{message_name}_CH0_{message_info['ID']}(void)
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
dbc_file_path = sys.argv[1]
|
dbc_file_path = sys.argv[1]
|
||||||
output_dir = sys.argv[2]
|
output_dir = sys.argv[2]
|
||||||
|
channel = sys.argv[3]
|
||||||
|
|
||||||
|
channel = json.loads(channel)
|
||||||
|
|
||||||
|
if list(channel.values())[-1] == "CH0":
|
||||||
|
channel = 0
|
||||||
|
elif list(channel.values())[-1] == "CH1":
|
||||||
|
channel = 1
|
||||||
|
elif list(channel.values())[-1] == "CH2":
|
||||||
|
channel = 2
|
||||||
|
elif list(channel.values())[-1] == "CH3":
|
||||||
|
channel = 3
|
||||||
|
elif list(channel.values())[-1] == "CH4":
|
||||||
|
channel = 4
|
||||||
|
elif list(channel.values())[-1] == "CH5":
|
||||||
|
channel = 5
|
||||||
|
else:
|
||||||
|
print("[ERROR] Invalid channel specified. Must be one of CH0, CH1, CH2, CH3, CH4, or CH5.")
|
||||||
|
|
||||||
output_structs_file = f"{output_dir}/generated_TX_structs.h"
|
output_structs_file = f"{output_dir}/generated_TX_structs.h"
|
||||||
output_globals_file = f"{output_dir}/generated_TX_globals.c"
|
output_globals_file = f"{output_dir}/generated_TX_globals.c"
|
||||||
@ -186,7 +204,7 @@ if __name__ == "__main__":
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
generate_tx_globals(signals, output_globals_file, output_globals_header)
|
generate_tx_globals(signals, output_globals_file, output_globals_header)
|
||||||
generate_tx_functions(signals, output_tx_functions_file)
|
generate_tx_functions(signals, channel, output_tx_functions_file)
|
||||||
generate_tx_initialization(signals, output_tx_initialization)
|
generate_tx_initialization(signals, channel, output_tx_initialization)
|
||||||
generate_tx_enum(signals, output_enum_file, cycle_time)
|
generate_tx_enum(signals, channel, output_enum_file, cycle_time)
|
||||||
generate_vcu_can_transmit_single_c_file(signals, output_c_file)
|
generate_vcu_can_transmit_single_c_file(signals, channel, output_c_file)
|
||||||
BIN
__pycache__/Console_output.cpython-313.pyc
Normal file
BIN
__pycache__/Console_output.cpython-313.pyc
Normal file
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user