+
+ def readrxbuffer(self,packbuf=0):
+ """Reads the RX buffer. Might have old data."""
+ data=self.SPItrans([0x90|(packbuf<<2),
+ 0x00,0x00, #SID
+ 0x00,0x00, #EID
+ 0x00, #DLC
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ ]);
+
+ return data[1:len(data)];
+
+ def fastrxpacket(self):
+ return self.readrxbuffer(0);
+
+ def rxpacket(self):
+ """Reads the next incoming packet from either buffer.
+ Returns None immediately if no packet is waiting."""
+ status=self.MCPrxstatus()&0xC0;
+ if status&0x40:
+ #Buffer 0 has higher priority.
+ return self.readrxbuffer(0);
+ elif status&0x80:
+ #Buffer 1 has lower priority.
+ return self.readrxbuffer(1);
+ else:
+ return None;
+
+ ################# TX MANAGEMENT ##################
+
+ def MCPrts(self,TXB0=False,TXB1=False,TXB2=False):
+ """Requests to send one of the transmit buffers."""
+ flags=0;
+ if TXB0: flags=flags|1;
+ if TXB1: flags=flags|2;
+ if TXB2: flags=flags|4;
+
+ if flags==0:
+ print "Warning: Requesting to send no buffer.";
+ self.SPItrans([0x80|flags]);
+
+ def writetxbuffer(self,packet,packbuf=0):
+ """Writes the transmit buffer."""
+
+ self.SPItrans([0x40|(packbuf<<1)]+packet);
+
+ def simpleParse(self,packet):
+ 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 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.MCPrts(TXB0=True);
+
+
+ ############### UTILITY FUNCTIONS #################
+
+ def packet2str(self,packet):
+ """Converts a packet from the internal format to a string."""
+ toprint="";
+ for bar in packet:
+ toprint=toprint+("%02x "%ord(bar))
+ return toprint;
+
+
+ ## This code could be drastica
+ def packet2parsedstr(self,data):
+ dp1 = ord(data[0])
+ dp2 = ord(data[1])
+ dp5 = ord(data[4])
+
+ msg="";
+
+
+
+ #get the ide bit. allows us to check to see if we have an extended
+ #frame
+ ide = (dp2 & 0x0f)>>3
+ #we have an extended frame
+ if( 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
+ eIDmsg = " eID: %06d" %(eId)
+ rtrmsg = " rtr: %d" % (rtr)
+
+ else:
+ rtr = dp2>>4 & 0x01
+ eIDmsg = ""
+ rtrmsg = " rtr: %d"%(rtr)
+
+ # Create the standard ID. from the message
+ sID = dp1<<3 | dp2>>5
+ length = dp5 & 0x0f
+
+ #generate the data section
+ dbmsg = ""
+ for i in range(0,length):
+ idx = 5 + i
+ dbmsg += " %03d"%ord(data[idx])
+
+ msg = "sID: %04d"%sID
+ msg += eIDmsg + rtrmsg
+ msg += " length: %d"%(length)
+ msg += dbmsg
+
+ return msg
+
+