Skip to content

Commit

Permalink
Merge branch 'development' into issue_781
Browse files Browse the repository at this point in the history
  • Loading branch information
ebroecker committed Jul 12, 2024
2 parents c88c92a + 9278ea9 commit 531b44c
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 5 deletions.
12 changes: 9 additions & 3 deletions src/canmatrix/formats/dbc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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))
Expand Down
47 changes: 45 additions & 2 deletions tests/test_dbc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'''\
Expand Down

0 comments on commit 531b44c

Please sign in to comment.