diff --git a/can_bin_to_mdf.py b/can_bin_to_mdf.py index 9e8aa0d..8914fc5 100644 --- a/can_bin_to_mdf.py +++ b/can_bin_to_mdf.py @@ -4,6 +4,7 @@ ESP32 CAN Logger bin 파일을 MDF 형식으로 변환 - CAN Database (DBC 파일) 사용 - Value Table (시그널 값-텍스트 매칭) 지원 (올바른 conversion으로 저장) - asammdf 라이브러리 사용 +- 같은 CAN ID의 시그널들을 그룹으로 묶어서 저장 (수정) """ import struct @@ -165,10 +166,30 @@ class CANBinToMDF: metadata: MDF 파일 메타데이터 (선택) compression: 압축 레벨 (0=없음, 1=deflate, 2=transposed, 기본값=2) """ - signals = [] + total_signals = 0 skipped_signals = [] value_table_signals = [] # value table이 있는 시그널 추적 + # MDF 파일 생성 + if metadata is None: + metadata = {} + + default_metadata = { + 'author': 'ESP32 CAN Logger', + 'department': '', + 'project': 'CAN Data Logging', + 'subject': 'CAN Bus Data', + } + default_metadata.update(metadata) + + mdf = MDF(version='4.10') + + # 메타데이터 설정 + for key, value in default_metadata.items(): + if hasattr(mdf.header, key): + setattr(mdf.header, key, value) + + # 메시지별로 시그널 그룹을 만들어서 append for msg_name, msg_data in decoded_data.items(): timestamps = np.array(msg_data['timestamps'], dtype=np.float64) @@ -178,6 +199,9 @@ class CANBinToMDF: except: continue + # 이 메시지의 시그널들을 담을 리스트 + msg_signals = [] + for signal_name, values in msg_data.items(): if signal_name == 'timestamps': continue @@ -271,30 +295,12 @@ class CANBinToMDF: conversion=conversion # conversion 추가 ) - signals.append(signal) - - # MDF 파일 생성 - if metadata is None: - metadata = {} - - default_metadata = { - 'author': 'ESP32 CAN Logger', - 'department': '', - 'project': 'CAN Data Logging', - 'subject': 'CAN Bus Data', - } - default_metadata.update(metadata) - - mdf = MDF(version='4.10') - - # 메타데이터 설정 - for key, value in default_metadata.items(): - if hasattr(mdf.header, key): - setattr(mdf.header, key, value) - - # 시그널 추가 - if signals: - mdf.append(signals) + msg_signals.append(signal) + + # 같은 CAN ID(메시지)의 시그널들을 그룹으로 묶어서 append + if msg_signals: + mdf.append(msg_signals) + total_signals += len(msg_signals) # MDF 파일 저장 (압축 적용) if compression > 0: @@ -318,7 +324,8 @@ class CANBinToMDF: compression_name = compression_names.get(compression, f"레벨 {compression}") print(f"✓ MDF 파일 생성 완료: {output_path}") - print(f" - 시그널 수: {len(signals)}") + print(f" - 메시지 그룹 수: {len(decoded_data)}개") + print(f" - 총 시그널 수: {total_signals}개") print(f" - Value Table 적용 시그널: {len(value_table_signals)}개") print(f" - 파일 크기: {compressed_size:.2f} MB ({compression_name})") if skipped_signals: @@ -393,8 +400,8 @@ def main(): formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" 사용 예제: - python can_bin_to_mdf_final.py -d example.dbc -i canlog_001.bin -o output.mf4 - python can_bin_to_mdf_final.py -d vehicle.dbc -i data/*.bin -o output/ + python can_bin_to_mdf.py -d example.dbc -i canlog_001.bin -o output.mf4 + python can_bin_to_mdf.py -d vehicle.dbc -i data/*.bin -o output/ """ ) @@ -448,4 +455,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main()