Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def set_data(self, data):
"""Set for the given variable the PDO data.
:param bytes data: Value for the PDO variable in the PDO message as :class:`bytes`.
"""
byte_offset, bit_offset = divmod(self.offset, 8)
logger.debug("Updating %s to %s in %s",
self.name, binascii.hexlify(data), self.pdo_parent.name)
if bit_offset or self.length % 8:
cur_msg_data = self.pdo_parent.data[byte_offset:byte_offset + len(self.od) // 8]
# Need information of the current variable type (unsigned vs signed)
data_type = self.od.data_type
if data_type == objectdictionary.BOOLEAN:
# A boolean type needs to be treated as an U08
data_type = objectdictionary.UNSIGNED8
od_struct = self.od.STRUCT_TYPES[data_type]
cur_msg_data = od_struct.unpack(cur_msg_data)[0]
# data has to have the same size as old_data
data = od_struct.unpack(data)[0]
# Mask out the old data value
# At the end we need to mask for correct variable length (bitwise operation failure)
shifted = (((1 << self.length) - 1) << bit_offset) & ((1 << len(self.od)) - 1)
bitwise_not = (~shifted) & ((1 << len(self.od)) - 1)
cur_msg_data = cur_msg_data & bitwise_not
# Set the new data on the correct position
data = (data << bit_offset) | cur_msg_data
data = od_struct.pack_into(self.pdo_parent.data, byte_offset, data)
else:
self.pdo_parent.data[byte_offset:byte_offset + len(data)] = data
def test_integer8(self):
var = od.Variable("Test INTEGER8", 0x1000)
var.data_type = od.INTEGER8
self.assertEqual(var.decode_raw(b"\xff"), -1)
self.assertEqual(var.decode_raw(b"\x7f"), 127)
self.assertEqual(var.encode_raw(-2), b"\xfe")
self.assertEqual(var.encode_raw(127), b"\x7f")
def test_array_compact_subobj(self):
array = self.od[0x1003]
self.assertIsInstance(array, canopen.objectdictionary.Array)
self.assertEqual(array.index, 0x1003)
self.assertEqual(array.name, 'Pre-defined error field')
var = array[5]
self.assertIsInstance(var, canopen.objectdictionary.Variable)
self.assertEqual(var.name, 'Pre-defined error field_5')
self.assertEqual(var.index, 0x1003)
self.assertEqual(var.subindex, 5)
self.assertEqual(var.data_type, canopen.objectdictionary.UNSIGNED32)
self.assertEqual(var.access_type, 'ro')
def test_boolean(self):
var = od.Variable("Test BOOLEAN", 0x1000)
var.data_type = od.BOOLEAN
self.assertEqual(var.decode_raw(b"\x01"), True)
self.assertEqual(var.decode_raw(b"\x00"), False)
self.assertEqual(var.encode_raw(True), b"\x01")
self.assertEqual(var.encode_raw(False), b"\x00")
def test_phys(self):
var = od.Variable("Test INTEGER16", 0x1000)
var.data_type = od.INTEGER16
var.factor = 0.1
self.assertAlmostEqual(var.decode_phys(128), 12.8)
self.assertEqual(var.encode_phys(-0.1), -1)
:return: The CanMatrix object created
:rtype: canmatrix.canmatrix.CanMatrix
"""
from canmatrix import canmatrix
from canmatrix import formats
db = canmatrix.CanMatrix()
for pdo_map in self.map.values():
if pdo_map.cob_id is None:
continue
frame = canmatrix.Frame(pdo_map.name,
Id=pdo_map.cob_id,
extended=0)
for var in pdo_map.map:
is_signed = var.od.data_type in objectdictionary.SIGNED_TYPES
is_float = var.od.data_type in objectdictionary.FLOAT_TYPES
min_value = var.od.min
max_value = var.od.max
if min_value is not None:
min_value *= var.od.factor
if max_value is not None:
max_value *= var.od.factor
name = var.name
name = name.replace(" ", "_")
name = name.replace(".", "_")
signal = canmatrix.Signal(name,
startBit=var.offset,
signalSize=var.length,
is_signed=is_signed,
is_float=is_float,
factor=var.od.factor,
min=min_value,
def _find_object(self, index, subindex):
if index not in self.object_dictionary:
# Index does not exist
raise SdoAbortedError(0x06020000)
obj = self.object_dictionary[index]
if not isinstance(obj, objectdictionary.Variable):
# Group or array
if subindex not in obj:
# Subindex does not exist
raise SdoAbortedError(0x06090011)
obj = obj[subindex]
return obj
:return: The CanMatrix object created
:rtype: canmatrix.canmatrix.CanMatrix
"""
from canmatrix import canmatrix
from canmatrix import formats
db = canmatrix.CanMatrix()
for pdo_map in self.map.values():
if pdo_map.cob_id is None:
continue
frame = canmatrix.Frame(pdo_map.name,
Id=pdo_map.cob_id,
extended=0)
for var in pdo_map.map:
is_signed = var.od.data_type in objectdictionary.SIGNED_TYPES
is_float = var.od.data_type in objectdictionary.FLOAT_TYPES
min_value = var.od.min
max_value = var.od.max
if min_value is not None:
min_value *= var.od.factor
if max_value is not None:
max_value *= var.od.factor
name = var.name
name = name.replace(" ", "_")
name = name.replace(".", "_")
signal = canmatrix.Signal(name,
startBit=var.offset,
signalSize=var.length,
is_signed=is_signed,
is_float=is_float,
factor=var.od.factor,