Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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))