def parse_can_frames(can_messages_file): """Parses CAN messages into dictionary of CanFrames Args: string: a string with the CAN message file name Returns: a dictionary of CanFrames """ messages = defaultdict(lambda: None) device_enum = parse_can_device_enum() can_messages = read_protobuf_data(can_messages_file) for can_message in can_messages: identifier = to_identifier(can_message.msg_name) if validator.valid_can_id(can_message.id) is False: raise Exception('Invalid CAN id') if messages[can_message.id] != None: raise Exception('Duplicate CAN id %s' % can_message.id) oneof = can_message.can_data.WhichOneof('frame') fields = [ to_var(x[1]) for x in getattr(can_message.can_data, str(oneof)).ListFields() ] if len(set(fields)) < len(fields): raise Exception('Duplicate fields in %s' % can_message.msg_name) messages[can_message.id] = CanFrame( msg_name=identifier, source=device_enum[can_message.source], target=can_message.target, ftype=oneof, fields=fields, is_critical=can_message.is_critical, is_signed=can_message.is_signed, dlc=int(len(fields) * NUM_DLC_BYTES / max(1, NUM_FIELDS[oneof]))) return messages
def parse_can_message_enum(can_messages_file): """Parses CAN messages into dictionary Args: string: a string with the CAN message file name Returns: a dictionary of CAN messages """ messages = defaultdict(lambda: None) can_messages = read_protobuf_data(can_messages_file) for can_message in can_messages: identifier = to_identifier(can_message.msg_name) if validator.valid_can_id(can_message.id) is False: raise Exception('Invalid CAN id') if messages[can_message.id] != None: raise Exception('Duplicate CAN id %s' % can_message.id) if identifier in messages.values(): raise Exception('Duplicate message name %s' % can_message.msg_name) messages[can_message.id] = identifier return messages
def test_valid_can_id_out_of_range(self): """Tests if a valid can message is out of range.""" self.assertFalse(validator.valid_can_id(NUM_CAN_MESSAGES))
def test_valid_can_id_in_range(self): """Tests if a valid can message is in range.""" for can_msg_id in range(0, NUM_CAN_MESSAGES): self.assertTrue(validator.valid_can_id(can_msg_id))