diff --git a/src/canmatrix/formats/dbc.py b/src/canmatrix/formats/dbc.py index 6c4e3c5e..28e2b227 100644 --- a/src/canmatrix/formats/dbc.py +++ b/src/canmatrix/formats/dbc.py @@ -241,8 +241,10 @@ def dump(in_db, f, **options): db.add_signal_defines("GenSigStartValue", 'FLOAT 0 100000000000') 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) @@ -953,7 +955,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'''\