Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rename findNotUsedBits in get_frame_layout #254

Merged
merged 21 commits into from
Dec 4, 2018
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
e2e468a
rename findNotUsedBits in get_frame_layout
ebroecker Nov 21, 2018
1f1f3c6
Merge branch 'development' into reengFindNotUsedBits
ebroecker Nov 21, 2018
d556072
Merge branch 'development' into reengFindNotUsedBits
altendky Nov 24, 2018
635ce59
rename to snail case
ebroecker Nov 24, 2018
2034bc6
Merge branch 'reengFindNotUsedBits' of https://github.com/ebroecker/c…
ebroecker Nov 24, 2018
08b4feb
Merge branch 'development' into reengFindNotUsedBits
ebroecker Nov 24, 2018
7d3ab15
Update src/canmatrix/canmatrix.py
altendky Nov 25, 2018
a4ad83c
switch to emtpty lists instead of "None"
ebroecker Nov 25, 2018
ef22f4f
store signal (object references) instead of signal names
ebroecker Nov 25, 2018
4e5d998
Update src/canmatrix/canmatrix.py
altendky Nov 28, 2018
bce1a27
Update src/canmatrix/canmatrix.py
altendky Nov 28, 2018
48cac9b
Update src/canmatrix/canmatrix.py
altendky Nov 28, 2018
06f86df
Update src/canmatrix/canmatrix.py
altendky Nov 28, 2018
662e82e
Merge branch 'development' into reengFindNotUsedBits
ebroecker Nov 28, 2018
8b45b5c
Merge branch 'development' into reengFindNotUsedBits
ebroecker Nov 29, 2018
713c4db
Merge branch 'development' into reengFindNotUsedBits
ebroecker Nov 30, 2018
b6de835
* replace size*8 with len(bitfield)
ebroecker Nov 30, 2018
6ea31a2
fix range
ebroecker Nov 30, 2018
d97edc4
more pythonic way to merge lists...
ebroecker Nov 30, 2018
31785a7
much more pythonic
ebroecker Nov 30, 2018
ad7b0be
Merge branch 'development' into reengFindNotUsedBits
ebroecker Dec 4, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified examples/cmTemplate.xlsx
Binary file not shown.
83 changes: 36 additions & 47 deletions src/canmatrix/canmatrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -809,70 +809,59 @@ def calcDLC(self):
maxBit = sig.getStartbit() + int(sig.size)
self.size = max(self.size, int(math.ceil(maxBit / 8)))

def findNotUsedBits(self):
def get_frame_layout(self):
"""
Find unused bits in frame.
get layout of frame.

Represents the bit usage in the frame by means of a list with 64 items.
Every item represents one bit and contains unique number for each signal, occupying that bit.
Numbering starts from one.
Represents the bit usage in the frame by means of a list with n items (n bits of frame length).
Every item represents one bit and contains a list of signals (object refs) with each signal, occupying that bit.
Bits with empty list are unused.

Bits with "zero" index are unused.

Example: [2, 2, 2, 1, 1, 0, 0, 3, 3, 3, 3, 0, 0, ...]

:return: list with signal "index plus one" in every bit. Zeros mean 'unused'.
:rtype: list of int
Example: [[], [], [], [sig1], [sig1], [sig1, sig5], [sig2, sig5], [sig2], []]
:return: list of lists with signalnames
:rtype: list of lists
"""
bitfield = []
bitfieldLe = []
bitfieldBe = []

for i in range(0,64):
bitfieldBe.append(0)
bitfieldLe.append(0)
bitfield.append(0)
i = 0

for sig in self.signals:
i += 1
for bit in range(sig.getStartbit(), sig.getStartbit() + int(sig.size)):
if sig.is_little_endian:
bitfieldLe[bit] = i
else:
bitfieldBe[bit] = i

for i in range(0,8):
for j in range(0,8):
bitfield[i*8+j] = bitfieldLe[i*8+(7-j)]
little_bits = [[] for _dummy in range((self.size * 8))]
big_bits = [[] for _dummy in range((self.size * 8))]
for signal in self.signals:
if signal.is_little_endian:
least = len(little_bits) - signal.startBit
most = least - signal.size
for i in range(most, least):
little_bits[i].append(signal)
ebroecker marked this conversation as resolved.
Show resolved Hide resolved
else:
most = signal.startBit
least = most + signal.size
for i in range(most, least):
big_bits[i].append(signal)

for i in range(0,8):
for j in range(0,8):
if bitfield[i*8+j] == 0:
bitfield[i*8+j] = bitfieldBe[i*8+j]
little_bits = reversed(tuple(grouper(little_bits, 8)))
little_bits = tuple(chain(*little_bits))

returnList = [
little + big
for little, big in zip(little_bits, big_bits)
]

return bitfield
return returnList

def createDummySignals(self):
def create_dummy_signals(self):
"""Create big-endian dummy signals for unused bits.

Names of dummy signals are *_Dummy_<frame.name>_<index>*
"""
bitfield = self.findNotUsedBits()
# for i in range(0,8):
# print (bitfield[(i)*8:(i+1)*8])
bitfield = self.get_frame_layout()
startBit = -1
sigCount = 0
for i in range(0,64):
if bitfield[i] == 0 and startBit == -1:
for i in range(len(bitfield)):
if bitfield[i] == [] and startBit == -1:
startBit = i
if (i == 63 or bitfield[i] != 0) and startBit != -1:
if i == 63:
i = 64
if (i == (len(bitfield)-1) or bitfield[i] != []) and startBit != -1:
if i == (len(bitfield)-1):
i = len(bitfield)
self.addSignal(Signal("_Dummy_%s_%d" % (self.name,sigCount),size=i-startBit, startBit=startBit, is_little_endian = False))
startBit = -1
sigCount +=1
sigCount += 1



Expand Down
18 changes: 10 additions & 8 deletions src/canmatrix/tests/test_canmatrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -439,20 +439,22 @@ def test_frame_compute_dlc():

def test_frame_find_unused_bits():
frame = canmatrix.canmatrix.Frame(size=1)
frame.addSignal(canmatrix.canmatrix.Signal(startBit=0, size=3))
frame.addSignal(canmatrix.canmatrix.Signal(startBit=4, size=2))
bit_usage = frame.findNotUsedBits()
assert bit_usage.count(0) == 64 - 3 - 2
assert bit_usage[:8] == [0, 0, 2, 2, 0, 1, 1, 1]
frame.addSignal(canmatrix.canmatrix.Signal(name="sig1",startBit=0, size=3))
frame.addSignal(canmatrix.canmatrix.Signal(name="sig2",startBit=4, size=2))
bit_usage = frame.get_frame_layout()
assert bit_usage.count([]) == frame.size*8 - 3 - 2
sig1 = frame.signalByName("sig1")
sig2 = frame.signalByName("sig2")
assert bit_usage == [[], [], [sig2], [sig2], [], [sig1], [sig1], [sig1]]


def test_frame_create_dummy_signals_covers_all_bits():
frame = canmatrix.canmatrix.Frame(size=1)
frame.addSignal(canmatrix.canmatrix.Signal(startBit=0, size=3))
frame.addSignal(canmatrix.canmatrix.Signal(startBit=4, size=2))
frame.createDummySignals()
assert len(frame.signals) == 2 + 3
assert frame.findNotUsedBits().count(0) == 0
frame.create_dummy_signals()
assert len(frame.signals) == 2 + 2
assert frame.get_frame_layout().count([]) == 0


def test_frame_update_receivers():
Expand Down