변환 누락 수정
This commit is contained in:
@@ -229,19 +229,67 @@ class CANBinToMDF:
|
|||||||
# numpy 배열로 변환
|
# numpy 배열로 변환
|
||||||
samples = np.array(values_list)
|
samples = np.array(values_list)
|
||||||
timestamps = np.array(timestamps_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:
|
if len(timestamps) > 0:
|
||||||
total_time_max = max(total_time_max, timestamps[-1])
|
total_time_max = max(total_time_max, timestamps[-1])
|
||||||
|
|
||||||
# Signal 객체 생성
|
# Signal 객체 생성
|
||||||
signal = Signal(
|
signal_kwargs = dict(
|
||||||
samples=samples,
|
samples=samples,
|
||||||
timestamps=timestamps,
|
timestamps=timestamps,
|
||||||
name=f"{msg_name}.{signal_name}",
|
name=f"{msg_name}.{signal_name}",
|
||||||
unit=signal_def.unit or '',
|
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)
|
mdf.append(signal)
|
||||||
signal_count += 1
|
signal_count += 1
|
||||||
@@ -1373,4 +1421,4 @@ def main():
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
Reference in New Issue
Block a user