added speedometer hack to MCPCANCommunication
[goodfet] / client / GoodFETMCPCANCommunication.py
index b80f7be..4dce2de 100644 (file)
@@ -3,13 +3,11 @@
 #
 # (C) 2012 Travis Goodspeed <travis at radiantmachines.com>
 #
+#  Edited By: Chris Hoder    2013
+#             Ted Summers    2013
+#             Grayson Zulauf 2013
 #
-# Ted's working copy
-#   1) getting hot reads on frequency
-#   2) allow sniffing in "normal" mode to get ack bits
-#       --check if that's whats causing error flags in board-to-board transmission
-#
-#
+
 
 import sys;
 import binascii;
@@ -24,7 +22,7 @@ import Queue
 
 class GoodFETMCPCANCommunication:
     
-    def __init__(self, dataLocation):
+    def __init__(self, dataLocation = "../../contrib/ThayerData/"):
        self.client=GoodFETMCPCAN();
        """ Communication with the bus"""
        self.client.serInit()
@@ -40,7 +38,7 @@ class GoodFETMCPCANCommunication:
     def printInfo(self):
         """ 
         This method will print information about the board to the terminal. 
-        It is good for diagnostics
+        It is good for diagnostics.
         """
         
         self.client.MCPreqstatConfiguration();
@@ -795,6 +793,25 @@ class GoodFETMCPCANCommunication:
     # row[4] = Data Byte 1
     #    .... up to Data Byte 8 ( THIS ASSUMES A PACKET OF LENGTH 8!!!
     def writeData(self,packets,freq):
+        """
+        This method will write a list of packets to the bus at the given frequency. This method assumes a packet 
+        length of 8 for all packets as well as a standard id.
+        
+        @type packets: List of Lists
+        @param packets: The list of packets to be injected into the bus. Each element of packets is a list that is 
+        a packet to be injected onto the bus. These packets are assumed to be in the following format::
+                 row[0] time delay relative to the last packet. if 0 or empty there will be no delay
+                 row[1] = Standard ID (integer)
+                 row[2] = Data Length (0-8) (if it is zero we assume an Remote Transmit Request)
+                 row[3] = Data Byte 0
+                 row[4] = Data Byte 1
+                 ...
+                 row[10] = Data Byte 7
+        
+        @type freq: number
+        @param freq: Frequency of the CAN bus
+        
+        """
         self.client.serInit()
         self.spitSetup(freq)
         for row in packets:
@@ -811,6 +828,57 @@ class GoodFETMCPCANCommunication:
                 packet.append(row[i])
             print packet
             self.client.txpacket(packet)
+
+
+    def speedometerHack(self):
+        
+        self.client.serInit()
+        self.spitSetup(500)
+
+        self.addFilter([513, 513, 513])
+        
+        SIDlow = (513 & 0x07) << 5;  # get SID bits 2:0, rotate them to bits 7:5
+        SIDhigh = (513 >> 3) & 0xFF; # get SID bits 10:3, rotate them to bits 7:0
+                
+        while(1):
+            
+            packet = None;
+
+            # catch a packet and check its db4 value
+            while (packet == None)
+                packet=self.client.rxpacket();
+                
+            print "DB4 = %d" %packet[9]
+            mph = 1.617*packet[9] - 63.5
+            print "Current MPH = 1.617(%d)-63.5 = %d" %(packet[9], mph)
+                
+            # calculate our new mph and db4 value
+            mph = mph + 15;
+            packet[9] = ( mph + 63.5 ) / 1.617
+
+            # load new packet into TXB0 and check time
+            self.multiPacketSpit(packet0=packet, packet0rts=True)
+            starttime = time.time()
+            
+            # spit new value for 1 second
+            while (time.time()-starttime < 1)
+                self.multiPacketSpit(packet0rts=True)
+            
+
+
+[SIDhigh, SIDlow, 0x00,0x00, # pad out EID regs
+                      0x08, # bit 6 must be set to 0 for data frame (1 for RTR) 
+                      # lower nibble is DLC                   
+                      packet[0],packet[1],packet[2],packet[3],packet[4],packet[5],packet[6],packet[7]]
+    
+    
+        while((time.time()-starttime < duration)):
+                    
+                    if(faster):
+                        packet=self.client.fastrxpacket();
+                    else:
+
+