Index: DialityCoreCanProtocol.py =================================================================== diff -u -rea4f115e0e15a89f6a517f33e7d511dea9ad808d -r65448aafb518b3e8a7cb5de5ca115666cec839d1 --- DialityCoreCanProtocol.py (.../DialityCoreCanProtocol.py) (revision ea4f115e0e15a89f6a517f33e7d511dea9ad808d) +++ DialityCoreCanProtocol.py (.../DialityCoreCanProtocol.py) (revision 65448aafb518b3e8a7cb5de5ca115666cec839d1) @@ -34,7 +34,7 @@ PAYLOAD_LENGTH_INDEX = 5 PAYLOAD_START_INDEX = 6 - PAYLOAD_LENGTH_FIRST_PACKET = 5 + PAYLOAD_LENGTH_FIRST_PACKET = 1 HEADER_LENGTH = 6 PACKET_LENGTH = 8 @@ -405,75 +405,77 @@ message = self.__listener_buffer.get_message(0.0) - if message is not None and message.dlc == DenaliMessage.PACKET_LENGTH: - # We have received a legit can message of 8 bytes - can_data = [b for b in message.data] - channel_id = message.arbitration_id - message_length = can_data[3] + if message is not None: - # if we are building a long message, then proceed to push it to the channel dictionary - if channel_id in self.__longMsgChannelIDSet: - self.__dialinMessageList = self.__longMessageBuilders[channel_id].push(can_data) + if message.dlc == DenaliMessage.PACKET_LENGTH: + # We have received a legit can message of 8 bytes + can_data = [b for b in message.data] + channel_id = message.arbitration_id + message_length = can_data[DenaliMessage.PAYLOAD_LENGTH_INDEX] - elif can_data[0] == self.START_BYTE and \ - message_length <= DenaliMessage.PAYLOAD_LENGTH_FIRST_PACKET: # This is a short packet - # This is the first time that we are building a message - self.__dialinMessageList = can_data # deliver the packet + # if we are building a long message, then proceed to push it to the channel dictionary + if channel_id in self.__longMsgChannelIDSet: + self.__dialinMessageList = self.__longMessageBuilders[channel_id].push(can_data) - elif can_data[0] == self.START_BYTE and \ - message_length > DenaliMessage.PAYLOAD_LENGTH_FIRST_PACKET: # Long packet start - # We are starting to build a long message, include it in the lonMsgChannelIDSet - self.__longMsgChannelIDSet.add(channel_id) + elif can_data[0] == DenaliMessage.START_BYTE and \ + message_length <= DenaliMessage.PAYLOAD_LENGTH_FIRST_PACKET: # This is a short packet + # This is the first time that we are building a message + self.__dialinMessageList = can_data # deliver the packet - if channel_id not in self.__longMessageBuilders.keys(): # if we don't have a builder. Create it! - self.__longMessageBuilders[channel_id] = LongDenaliMessageBuilder(can_data) - self.__dialinMessageList = None + elif can_data[0] == self.START_BYTE and \ + message_length > DenaliMessage.PAYLOAD_LENGTH_FIRST_PACKET: # Long packet start + # We are starting to build a long message, include it in the lonMsgChannelIDSet + self.__longMsgChannelIDSet.add(channel_id) - else: # if we do have a builder. This is the first time - self.__dialinMessageList = self.__longMessageBuilders[channel_id].push(can_data, first_packet=True) + if channel_id not in self.__longMessageBuilders.keys(): # if we don't have a builder. Create it! + self.__longMessageBuilders[channel_id] = LongDenaliMessageBuilder(can_data) + self.__dialinMessageList = None - # At this point we have a complete (long or short) Diality Packet + else: # if we do have a builder. This is the first time + self.__dialinMessageList = self.__longMessageBuilders[channel_id].push(can_data, first_packet=True) - if self.__dialinMessageList is not None: - complete_dialin_message = DenaliMessage.buildBasicMessage(channel_id=channel_id, - message=self.__dialinMessageList) - dialin_msg_id = DenaliMessage.getMessageID(complete_dialin_message) - dialin_ch_id = DenaliMessage.getChannelID(complete_dialin_message) + # Do we have a complete (long or short) Denali Message? + if self.__dialinMessageList is not None: + message_valid = True #assume true for now, set to false if CRC check fails below + complete_dialin_message = DenaliMessage.buildBasicMessage(channel_id=channel_id, + message=self.__dialinMessageList) + dialin_msg_id = DenaliMessage.getMessageID(complete_dialin_message) + dialin_ch_id = DenaliMessage.getChannelID(complete_dialin_message) - # Need to verify CRC at this point + if dialin_ch_id in self.__longMsgChannelIDSet: + # We need to remove channel ID from the long message set + self.__longMsgChannelIDSet.remove(dialin_ch_id) - if DenaliMessage.verifyCRC(complete_dialin_message) is False: - # if verify is False, let's drop (ignore) this message - dialin_ch_id = None - dialin_msg_id = None - sys.stderr.write("Incorrect CRC, received message: {}, crc: {}, calculated crc: {}\n".format( - self.__dialinMessageList, DenaliMessage.getCRC(complete_dialin_message), - DenaliMessage.crc8(self.__dialinMessageList))) + # Need to verify CRC at this point + if DenaliMessage.verifyCRC(complete_dialin_message) is False: + # if verify is False, let's drop (ignore) this message + message_valid = False + dialin_ch_id = None + dialin_msg_id = None + sys.stderr.write("Incorrect CRC, received message: {}, crc: {}, calculated crc: {}\n".format( + self.__dialinMessageList, DenaliMessage.getCRC(complete_dialin_message), + DenaliMessage.crc8(self.__dialinMessageList))) - if dialin_ch_id in self.__longMsgChannelIDSet: - # We need to remove channel ID from the long message set - self.__longMsgChannelIDSet.remove(dialin_ch_id) + if message_valid == True: + # We first check if this is a response to a send request that is pending + if dialin_msg_id == self.__sendPacketRequestID: - # We first check if this is a response to a send request that is pending - if dialin_msg_id == self.__sendPacketRequestID: + self.__dialinCommandResponseMessage = complete_dialin_message + self.__sendEvent.set() + self.__sendPacketRequestID = -1 - self.__dialinCommandResponseMessage = complete_dialin_message - self.__sendEvent.set() - self.__sendPacketRequestID = -1 + # If it is not, this is a publication message and we need to call it's register function + elif dialin_ch_id in self.__sync_response_dictionary.keys() and \ + dialin_msg_id in self.__sync_response_dictionary[channel_id].keys(): - # If it is not, this is a publication message and we need to call it's register function - elif dialin_ch_id in self.__sync_response_dictionary.keys() and \ - dialin_msg_id in self.__sync_response_dictionary[channel_id].keys(): + self.__sync_response_dictionary[dialin_ch_id][dialin_msg_id](complete_dialin_message) - self.__sync_response_dictionary[dialin_ch_id][dialin_msg_id](complete_dialin_message) + # Done with this message, let's get the next one + self.__dialinMessageList = None - # Done with this message, let's get the next one - self.__dialinMessageList = None - - else: - + else: #no new packets in receive buffer # We have received nothing, let's sleep 1 msec and let's check again - sleep(0.001) + sleep(0.01) def registerReceivingPublicationFunction(self, channel_id, message_id, function): """