From 754038b2a38a1d2d2de71359a82d68e241ec9535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Br=C3=B6cker?= Date: Thu, 4 Jul 2024 14:25:07 +0200 Subject: [PATCH] fix dbc tests this should be an addon to pr #795 --- src/canmatrix/formats/dbc.py | 12 ++++++--- tests/test_dbc.py | 47 ++++++++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/canmatrix/formats/dbc.py b/src/canmatrix/formats/dbc.py index ffe3ffa9..ed13b52c 100644 --- a/src/canmatrix/formats/dbc.py +++ b/src/canmatrix/formats/dbc.py @@ -238,8 +238,10 @@ def dump(in_db, f, **options): if signal.cycle_time != 0: signal.add_attribute("GenSigCycleTime", signal.cycle_time) if "GenSigStartValue" in db.signal_defines: - signal.add_attribute("GenSigStartValue", signal.phys2raw(None)) - + if signal.phys2raw(None) != 0: + if db.signal_defines["GenSigStartValue"].defaultValue is None: + signal.add_attribute("GenSigStartValue", signal.phys2raw(None)) + name = normalized_names[signal] if compatibility: name = re.sub("[^A-Za-z0-9]", whitespace_replacement, name) @@ -950,7 +952,11 @@ def add_frame_by_id(new_frame): # type: (canmatrix.Frame) -> None # frame.extended = 1 for signal in frame.signals: - default_value = signal.phys2raw(None) + if "GenSigStartValue" in db.signal_defines \ + and db.signal_defines["GenSigStartValue"].defaultValue is not None: + default_value = signal.phys2raw(float_factory(db.signal_defines["GenSigStartValue"].defaultValue)) + else: + default_value = signal.phys2raw(None) gen_sig_start_value = float_factory(signal.attributes.get("GenSigStartValue", default_value)) signal.initial_value = (gen_sig_start_value * signal.factor) + signal.offset signal.cycle_time = int(signal.attributes.get("GenSigCycleTime", 0)) diff --git a/tests/test_dbc.py b/tests/test_dbc.py index ae77ffb5..2f82602f 100644 --- a/tests/test_dbc.py +++ b/tests/test_dbc.py @@ -540,9 +540,52 @@ def test_default_initial_value(): matrix = canmatrix.formats.dbc.load(dbc, dbcImportEncoding="utf8") assert matrix.frames[0].signals[0].initial_value == 10 -# outdbc = io.BytesIO() -# canmatrix.formats.dump(matrix, outdbc, "dbc") +def test_keep_individual_inital_value(): + dbc = io.BytesIO(textwrap.dedent(u'''\ + BO_ 561 ECU1_Message2: 1 ECU1 + SG_ ECU2_Signal2 : 0|8@0+ (2,0) [-2|250] "g" ECU2 + + BA_DEF_ SG_ "GenSigStartValue" FLOAT 0.0 100.0; + + BA_DEF_DEF_ "GenSigStartValue" 10.0; + BA_ "GenSigStartValue" SG_ 561 ECU2_Signal2 42; + ''').encode('utf-8')) + matrix1 = canmatrix.formats.dbc.load(dbc, dbcImportEncoding="utf8") + assert matrix1.frames[0].signals[0].initial_value == decimal.Decimal('84') # in matrix should be the physical value! + outdbc = io.BytesIO() + canmatrix.formats.dump(matrix1, outdbc, "dbc") + # in dbc should be the raw value + assert 'BA_ "GenSigStartValue" SG_ 561 ECU2_Signal2 42' in outdbc.getvalue().decode('utf8') + + +def test_individual_initial_value_merge(): + dbc1 = io.BytesIO(textwrap.dedent(u'''\ + BO_ 560 ECU1_Message: 1 ECU1 + SG_ ECU2_Signal : 0|8@0+ (1,-5) [-2|250] "g" ECU2 + + BA_DEF_ SG_ "GenSigStartValue" FLOAT 0.0 100.0; + + BA_DEF_DEF_ "GenSigStartValue" 10.0; + ''').encode('utf-8')) + + dbc2 = io.BytesIO(textwrap.dedent(u'''\ + BO_ 561 ECU1_Message2: 1 ECU1 + SG_ ECU2_Signal2 : 0|8@0+ (1,0) [-2|250] "g" ECU2 + + BA_DEF_ SG_ "GenSigStartValue" FLOAT 0.0 100.0; + + BA_DEF_DEF_ "GenSigStartValue" 10.0; + BA_ "GenSigStartValue" SG_ 561 ECU2_Signal2 42; + ''').encode('utf-8')) + + matrix1 = canmatrix.formats.dbc.load(dbc1, dbcImportEncoding="utf8") + matrix2 = canmatrix.formats.dbc.load(dbc2, dbcImportEncoding="utf8") + matrix1.merge([matrix2]) + outdbc = io.BytesIO() + canmatrix.formats.dump(matrix1, outdbc, "dbc") + + assert 'BA_ "GenSigStartValue" SG_ 561 ECU2_Signal2 42' in outdbc.getvalue().decode('utf8') def test_no_initial_value(): dbc = io.BytesIO(textwrap.dedent(u'''\