diff --git a/can_converter_gui.py b/can_converter_gui.py index 797d495..e01d581 100644 --- a/can_converter_gui.py +++ b/can_converter_gui.py @@ -229,19 +229,67 @@ class CANBinToMDF: # numpy 배열로 변환 samples = np.array(values_list) timestamps = np.array(timestamps_list) - + + # choices(named values) 시그널 처리: + # cantools가 NamedSignalValue 객체로 디코딩 → 정수값으로 저장하고 + # TABX(ValueToText) conversion 테이블을 붙여 뷰어에서 텍스트로 표시 + conversion = None + if samples.dtype == object: + try: + from cantools.database.namedsignalvalue import NamedSignalValue as NSV + from asammdf.blocks import v4_blocks as v4b, v4_constants as v4c + # 정수값 추출 + int_values = [ + v.value if isinstance(v, NSV) else int(v) + for v in values_list + ] + samples = np.array(int_values, dtype=np.int64) + + # TABX(ValueToText) conversion 생성 + if signal_def.choices: + choice_keys = sorted(signal_def.choices.keys()) + n = len(choice_keys) + cc_kwargs = { + 'conversion_type': v4c.CONVERSION_TYPE_TABX, + 'val_param_nr': n, + 'ref_param_nr': n + 1, + } + for i, k in enumerate(choice_keys): + cc_kwargs[f'val_{i}'] = float(k) + cc_kwargs[f'text_{i}'] = 0 + cc_kwargs['text_default'] = 0 + cc = v4b.ChannelConversion(**cc_kwargs) + cc.referenced_blocks = {} + for i, k in enumerate(choice_keys): + cc.referenced_blocks[f'text_{i}'] = str(signal_def.choices[k]) + cc.referenced_blocks['text_default'] = 'Unknown' + conversion = cc + except Exception: + try: + samples = np.array(values_list, dtype=np.float64) + except Exception: + print(f"⚠️ 시그널 값 변환 실패, 건너뜀 ({msg_name}.{signal_name})") + continue + + # comment 설정 + comment = signal_def.comment or '' + # 최대 시간 추적 if len(timestamps) > 0: total_time_max = max(total_time_max, timestamps[-1]) - + # Signal 객체 생성 - signal = Signal( + signal_kwargs = dict( samples=samples, timestamps=timestamps, name=f"{msg_name}.{signal_name}", unit=signal_def.unit or '', - comment=signal_def.comment or '' + comment=comment ) + if conversion is not None: + signal_kwargs['conversion'] = conversion + + signal = Signal(**signal_kwargs) mdf.append(signal) signal_count += 1 @@ -1373,4 +1421,4 @@ def main(): if __name__ == "__main__": - main() + main() \ No newline at end of file