Skip to content

Commit

Permalink
Adds support for parsing frames with array signals
Browse files Browse the repository at this point in the history
Added frame encoding and decoding tests
  • Loading branch information
c4deszes committed Nov 3, 2020
1 parent 951a6e6 commit fbbe8e7
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 11 deletions.
2 changes: 1 addition & 1 deletion ldfparser/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from .parser import LDF, parseLDF, parseLDFtoDict
from .lin import LinFrame, LinSignal
from .node import LinMaster, LinSlave
from .node import LinMaster, LinSlave, LinProductId
14 changes: 11 additions & 3 deletions ldfparser/lin.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,17 @@ def parse_raw(self, data: bytearray) -> Dict[str, int]:
"""
message = {}
unpacked = self._packer.unpack(self._flip_bytearray(data))
for i in range(len(unpacked)):
# TODO: handle array signals
message[self.signals[i].name] = unpacked[i]
signal_index = 0
i = 0
while i < len(unpacked):
if self.signals[signal_index].is_array():
signal_size = int(self.signals[signal_index].width / 8)
message[self.signals[signal_index].name] = list(unpacked[i:i+signal_size])
i += signal_size - 1
else:
message[self.signals[signal_index].name] = unpacked[i]
signal_index += 1
i += 1
return message

def parse(self, data: bytearray, converters: Dict[str, LinSignalType]) -> Dict[str, Union[str, int, float]]:
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
long_description = fh.read()
setup(
name='ldfparser',
version='0.5.0-snapshot',
version='0.5.0',
author="Balazs Eszes",
author_email="c4deszes@gmail.com",
description="LDF Language support for Python",
Expand Down
36 changes: 35 additions & 1 deletion tests/test_frame.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import pytest
import binascii

from ldfparser import LinFrame, LinSignal
from ldfparser.encoding import LinSignalType, LogicalValue, PhysicalValue
Expand All @@ -17,6 +16,41 @@ def test_frame_raw_encoding():
'Signal_3': 1
})

assert list(content) == [100, 10 | 1 << 7]

@pytest.mark.unit
def test_frame_raw_encoding_array():
signal1 = LinSignal('Signal_1', 16, [0, 0])
frame = LinFrame(1, 'Frame_1', 2, {0: signal1})
content = frame.raw({
'Signal_1': [1, 2]
})
assert list(content) == [1, 2]

@pytest.mark.unit
def test_frame_raw_encoding_array2():
signal1 = LinSignal('Signal_1', 16, [0, 0])
signal2 = LinSignal('Signal_2', 8, 0)
frame = LinFrame(1, 'Frame_1', 3, {0: signal1, 16: signal2})
content = frame.raw({
'Signal_1': [1, 2],
'Signal_2': 3
})
assert list(content) == [1, 2, 3]

@pytest.mark.unit
def test_frame_raw_decoding_array():
signal1 = LinSignal('Signal_1', 16, [0, 0])
frame = LinFrame(1, 'Frame_1', 2, {0: signal1})
assert frame.parse_raw(bytearray([1, 2])) == {"Signal_1": [1, 2]}

@pytest.mark.unit
def test_frame_raw_decoding_array2():
signal1 = LinSignal('Signal_1', 16, [0, 0])
signal2 = LinSignal('Signal_2', 8, 0)
frame = LinFrame(1, 'Frame_1', 3, {0: signal1, 16: signal2})
assert frame.parse_raw(bytearray([1, 2, 3])) == {"Signal_1": [1, 2], "Signal_2": 3}

@pytest.mark.unit
def test_frame_raw_encoding_out_of_range():
signal1 = LinSignal('Signal_1', 8, 0)
Expand Down
9 changes: 4 additions & 5 deletions tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from ldfparser.encoding import LogicalValue
import os
import pytest
import unittest
import ldfparser

@pytest.mark.unit
Expand All @@ -12,7 +11,7 @@ def test_load_valid_lin13():

assert ldf.protocol_version == 1.3
assert ldf.language_version == 1.3
assert ldf.baudrate == 19200.0
assert ldf.baudrate == 19200

assert ldf.master.timebase == 0.005
assert ldf.master.jitter == 0.0001
Expand All @@ -28,7 +27,7 @@ def test_load_valid_lin20():

assert ldf.protocol_version == 2.0
assert ldf.language_version == 2.0
assert ldf.baudrate == 19200.0
assert ldf.baudrate == 19200

assert ldf.signal('InternalLightsRequest') is not None
assert ldf.frame('VL1_CEM_Frm1') is not None
Expand All @@ -41,7 +40,7 @@ def test_load_valid_lin21():

assert ldf.protocol_version == 2.1
assert ldf.language_version == 2.1
assert ldf.baudrate == 19200.0
assert ldf.baudrate == 19200
assert ldf.channel == 'DB'

assert ldf.signal('InternalLightsRequest') is not None
Expand All @@ -55,7 +54,7 @@ def test_load_valid_lin22():

assert ldf.protocol_version == 2.2
assert ldf.language_version == 2.2
assert ldf.baudrate == 19200.0
assert ldf.baudrate == 19200
assert ldf.channel == 'DB'

assert ldf.signal('InternalLightsRequest') is not None
Expand Down

0 comments on commit fbbe8e7

Please sign in to comment.