This commit is contained in:
3minbe 2025-01-08 09:28:28 +09:00
parent e7043359bf
commit 3a3736f85d
3 changed files with 35 additions and 56 deletions

View File

@ -24,7 +24,7 @@ class MainView(QtWidgets.QMainWindow):
if os.path.exists(self.settings_file):
with open(self.settings_file, "r", encoding="utf-8") as file:
self.settings = json.load(file) # 설정 파일 로드
self.default_save_path = self.settings.get("default_save_path", self.default_save_path)
self.default_save_path = self.settings.get("default_save_path", os.path.join(os.path.expanduser("~"), "Desktop"))
self.last_opened_dir = self.settings.get("last_opened_dir", os.path.expanduser("~"))
# JSON 파일 내의 file_paths와 channel_info 정보 지우기
self.settings["file_paths"] = []
@ -386,10 +386,10 @@ class MainView(QtWidgets.QMainWindow):
tx_output_dir = os.path.join(self.default_save_path, "DBC 변환", timestamp, file_name, "TX")
os.makedirs(rx_output_dir, exist_ok=True)
os.makedirs(tx_output_dir, exist_ok=True)
channel_info = self.settings.get("channel_info", {}).get(file_path, "0")
channel_info = self.settings.get("channel_info", {}).get(os.path.basename(file_path), "CH0")
try:
subprocess.run(["python", "DBC_to_C_RX.py", file_path, rx_output_dir, channel_info], check=True)
subprocess.run(["python", "DBC_to_C_TX.py", file_path, tx_output_dir, channel_info], check=True)
subprocess.run(["python", "DBC_to_C_RX.py", file_path, rx_output_dir, json.dumps({os.path.basename(file_path): channel_info})], check=True)
subprocess.run(["python", "DBC_to_C_TX.py", file_path, tx_output_dir, json.dumps({os.path.basename(file_path): channel_info})], check=True)
self.updateAlertText(f"변환 성공", [file_path])
except subprocess.CalledProcessError as e:
self.updateAlertText(f"변환 실패: {e}", [file_path])
@ -445,11 +445,13 @@ class MainView(QtWidgets.QMainWindow):
def updateChannelInfo(self, directory, filename, channel):
file_path = os.path.join(directory, filename)
file_name = os.path.basename(file_path)
if "channel_info" not in self.settings:
self.settings["channel_info"] = {}
self.settings["channel_info"][file_path] = channel
self.settings["channel_info"][file_name] = channel
self.saveSettings()
print(f"[INFO] Updated channel info for {file_path} to {channel}")
print(f"[INFO] Updated channel info for {file_name} to {channel}")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)

View File

@ -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 <generated_globals.h>\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 <stdint.h>\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)
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)

View File

@ -1,11 +1,7 @@
{
"theme": "light",
"default_save_path": "C:/Users/MSI/Desktop",
"file_paths": [
"C:/Users/MSI/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC/240321_PHM.dbc"
],
"file_paths": [],
"last_opened_dir": "C:/Users/MSI/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC",
"channel_info": {
"C:/Users/MSI/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC\\240321_PHM.dbc": "CH1"
}
"channel_info": {}
}