+
+
+
+ def packet2parsed(self,data):
+ """
+ This method will parse the packet that was received via L{rxpacket}.
+
+ @type data: List
+ @param data: data packet read off of the MCP2515 from the CAN bus. format will be
+ 14 bytes where each element is a character whose unicode integer value corresponds
+ to the hex value of the byte (use the ord() method).
+
+ @rtype: Dictionary
+ @return: Dictionary of the packet parsed into various components. The key values will be as follows
+
+ 1. ide : 1 if the message is an extended frame. 0 otherwise
+ 2. eID : extended ID. Not included if not an extended frame
+ 3. rtr : 1 if the message is a remote transmission request (RTR)
+ 4. sID : Standard ID.
+ 5. length: packet length (between 0 and 8)
+ 6. db0 : Data byte 0 (not included if RTR message)
+
+ ---
+ 7. db7 : Data byte 7 (not included if RTR message)
+ """
+ dp1 = ord(data[0])
+ dp2 = ord(data[1])
+ dp5 = ord(data[4])
+
+ packet = {}
+ #get the ide bit. allows us to check to see if we have an extended
+ #frame
+ packet['ide'] = (dp2 & 0x0f)>>3
+ #we have an extended frame
+ if( packet['ide'] != 0):
+ #get lower nibble, last 2 bits
+ eId = dp2 & 0x03
+ eId = eId<<8 | ord(data[2])
+ eId = eId<<8 | ord(data[3])
+ rtr = dp5>>6 & 0x01
+ packet['eID'] = " eID: %06d" %(eId)
+ packet['rtr'] = " rtr: %d" % (rtr)
+
+ else:
+ packet['rtr'] = dp2>>4 & 0x01
+
+
+ # Create the standard ID. from the message
+ packet['sID'] = dp1<<3 | dp2>>5
+ packet['length'] = dp5 & 0x0f
+
+ #generate the data section
+ for i in range(0,packet['length']):
+ idx = 5 + i
+ dbidx = 'db%d'%i
+ packet[dbidx] = ord(data[idx])
+ return packet
+
+ def packet2parsedstr(self,data):
+ """
+ This will return a string that is the parsed CAN message. The bytes will be parsed
+ for the standard ID, extended ID (if one is present), rtr, length and databytes (if present).
+ The message will be placed into a string as decimal integers not hex values. This method
+ calls L{packet2parsed} to do the packet parsing.
+
+ @type data: List
+ @param data: Data packet as returned by the L{rxpacket}
+ @rtype: String
+ @return: String that shows the data message in decimal format, parsed.
+ """
+ packet = self.packet2parsed(data)
+ msg = "sID: %04d" %packet['sId']
+ if( packetParsed.get('eID')):
+ msg += " eID: %d" %packetParsed.get('eID')
+ msg += " rtr: %d"%packetParsed['rtr']
+ length = packetParsed['length']
+ msg += " length: %d"%length
+ msg += " data:"
+ for i in range(0,length):
+ dbidx = 'db%d'%i
+ msg +=" %03d"% ord(packetParsed[dbidx]) # could change this to HEX
+ #msg = self.client.packet2parsedstr(packet)
+ return msg
+
+