Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
26 changes: 13 additions & 13 deletions canard/messaging.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@

class MessageDatabase:
""" Database of CAN messages """

def __init__(self):
# message that belong to this database
self._messages = []

def __getattr__(self, name):
return self.lookup_message(name)

Expand All @@ -30,12 +30,12 @@ def remove_message(self, message):
self._messages.remove(message)
except ValueError:
raise ValueError('Message %s is not in database' % message)

def lookup_message(self, name):
for message in self._messages:
if message.name == name:
return message

def decode(self, frame):
assert isinstance(frame, can.Frame), 'invalid frame'
for message in self._messages:
Expand All @@ -49,7 +49,7 @@ def __str__(self):
return s

class Message(object):

def __getattr__(self, name):
return self.lookup_signal(name)

Expand All @@ -66,7 +66,7 @@ def add_signal(self, signal, start_bit):

def remove_signal(self, signal):
pass

def lookup_signal(self, name):
for start_bit, signal in self._signals.items():
if signal.name == name:
Expand Down Expand Up @@ -102,8 +102,8 @@ def decode(self, frame):

result_signals.append(signal)

return self
return result_signals

def encode(self):
#start with a single value before breaking up into bytes
frame_value = 0
Expand All @@ -114,12 +114,12 @@ def encode(self):
value = signal.raw_value
assert (value < pow(2, signal.bit_length)), 'signal value is too large'
assert value >= 0, 'signal value is less than 0'

frame_value += value << start_bit

# find the last bit of the singal
start_bit = signal.bit_length + start_bit

frame = can.Frame(self.id)
#print("bits: " + str(start_bit))
frame.dlc = math.ceil(start_bit / 8)
Expand Down Expand Up @@ -163,18 +163,18 @@ def __init__(self, name, bit_length, factor=1, offset=0, unit=""):
def value(self):
# convert from raw value to engineering units
return ((self._value * self.factor) - self.offset)

@value.setter
def value(self, value):
# convert from engineering units to raw value
self._value = ((value - self.offset) / self.factor)
return self

@property
def raw_value(self):
# get raw value directly without any conversions
return int(self._value)

@raw_value.setter
def raw_value(self, value):
# set raw value directly without any conversions
Expand Down
2 changes: 1 addition & 1 deletion examples/decode.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

while True:
frame = dev.recv()
signals = b.parse_frame(frame)
signals = b.decode(frame)
if signals:
for s in signals:
print(s)