if flags==0:
print "Warning: Requesting to send no buffer.";
- if self.MCPcanstat()>>5!=0:
- print "Warning: currently in %s mode. NOT in normal mode! May not transmit." %self.MCPcanstatstr();
self.SPItrans([0x80|flags]);
def writetxbuffer(self,packet,packbuf=0):
"""Writes the transmit buffer."""
self.SPItrans([0x40|(packbuf<<1)]+packet);
- #READ BACK BUFFER 0 to check what we're about to send out
- data=self.SPItrans([0x03, 0x31,
- 0x00,0x00, #SID
- 0x00,0x00, #EID
- 0x00, #DLC
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00
- ]);
- print "about to transmit:" + self.packet2str(data[2:len(data)]);
-
+
+
def txpacket(self,packet):
"""Transmits a packet through one of the outbound buffers.
As usual, the packet should begin with SIDH.
For now, only TXB0 is supported."""
self.writetxbuffer(packet,0);
-
- #self.SPItrans([0x81]);
self.MCPrts(TXB0=True);
############### UTILITY FUNCTIONS #################
+
+ def simpleParse(self,packet):
+ """
+ This will print a simple parsing of the data with the standard Id and the extended id parsed.
+ """
+ dataPt = ord(packet[0]);
+ dataPt2 = ord(packet[1]);
+ # check if we have a standard frame, the msb of the second
+ # nibble will be 1. otherwise it is an extended rame
+ stdCheck = dataPt2 & 0x0f
+ if( stdCheck == 16 ):
+ #arb id is first byte + 3 msb of the 2nd byte
+ dataPt = dataPt<<3 | dataPt2>>5
+ print "Standard Packet \n Arb ID: "+("%d"%dataPt)
+ else:
+ #arb id is first byte + 3 msb + 2 lsb of 2nd byte +
+ # 3rd byte + 4th byte
+ dataPt = dataPt<<3 | dataPt2>>5
+ dataPt = dataPt<<2 | (dataPt2 & 0x03)
+ dataPt = dataPt<<8 | ord(packet[2])
+ dataPt = dataPt<<8 | ord(packet[3])
+ print "Extended Data Frame \n Arb ID: "+("%d"%dataPt)
+
+ #find the dataLength
+ dataPt5 = packet[4]
+ dataLength = dataPt5 & 0x0e
+ #print "Data Length: "+("%d"%dataLength)
+ # Print the data packet
+ #print "Data:"
+ # Temporary, until correct packets are read
+ if( dataLength > 8 ):
+ dataLength = 8
+ toprint = self.pcket2str(packet[5:12])
+ print toprint
+ # For reading correct packets
+ # if (dataLength > 8 ):
+ # print "Acceptable Length Exceeded"
+ # Data length value should never exceed 8
+ # else:
+ # toprint = self.pcket2str(packet[5:(5+dataLength)])
+ # print toprint
+
def packet2str(self,packet):
"""Converts a packet from the internal format to a string."""
toprint=toprint+("%02x "%ord(bar))
return toprint;
- def packet2parsed(self,packet):
+
+
+ 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])
- #converts the CAN message to a string
- msg="";
- for bar in data:
- msg=msg+("%02x"%bar)
-
- packet = {'msg':msg}
-
+ packet = {}
#get the ide bit. allows us to check to see if we have an extended
#frame
packet['ide'] = (dp2 & 0x0f)>>3
#get lower nibble, last 2 bits
eId = dp2 & 0x03
eId = eId<<8 | ord(data[2])
- packet['eID'] = eId<<8 | ord(data[3])
- packet['rtr'] = dp5>>6 & 0x01
+ 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
-
- #error check, 2nd msb of the lower nibble of byte 2 should be 0
- if( (dp2 & 0x04) == 4 ):
- packet['error'] = 1
- #error check an always 0 bit
- if( (dp5 & 0xf0) == 240):
- packet['error'] = 1
+
# Create the standard ID. from the message
packet['sID'] = dp1<<3 | dp2>>5
-
-
- length = dp5 & 0x0f
- packet['length'] = length
-
- if( length > 8):
- packet['error'] = 1
+ packet['length'] = dp5 & 0x0f
#generate the data section
- for i in range(0,length):
- idx = 5+i
- dbidx = 'db%d' % i
- packet[dbidx] = data[idx]
+ 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
def peek8(self,adr):
# TXRTSCTRL = x0D
-
\ No newline at end of file
+