debuggin of some gui methods
[goodfet] / client / GoodFETMCPCANCommunication.py
index 4e09e9c..b318128 100644 (file)
@@ -25,17 +25,24 @@ import Queue
 class GoodFETMCPCANCommunication:
     
     def __init__(self, dataLocation):
 class GoodFETMCPCANCommunication:
     
     def __init__(self, dataLocation):
-       self.client=GoodFETMCPCAN(); """ Communication with the bus"""
+       self.client=GoodFETMCPCAN();
+       """ Communication with the bus"""
        self.client.serInit()
        self.client.MCPsetup();
        #self.DATA_LOCATION = "../../contrib/ThayerData/"
        self.client.serInit()
        self.client.MCPsetup();
        #self.DATA_LOCATION = "../../contrib/ThayerData/"
-       self.DATA_LOCATION = dataLocation; """ Stores file data location. This is the root folder where basic sniffs will be stored"""
-       self.INJECT_DATA_LOCATION  = self.DATA_LOCATION+"InjectedData/" """ stores the sub folder path where injected data will be stored"""
+       self.DATA_LOCATION = dataLocation; 
+       """ Stores file data location. This is the root folder where basic sniffs will be stored"""
+       self.INJECT_DATA_LOCATION  = self.DATA_LOCATION+"InjectedData/" 
+       """ stores the sub folder path where injected data will be stored"""
        
 
     
     def printInfo(self):
        
 
     
     def printInfo(self):
-        """ This method will print information about the board to the termina. It is usefull for diagnostics"""
+        """ 
+        This method will print information about the board to the terminal. 
+        It is good for diagnostics
+        """
+        
         self.client.MCPreqstatConfiguration();
         
         print "MCP2515 Info:\n\n";
         self.client.MCPreqstatConfiguration();
         
         print "MCP2515 Info:\n\n";
@@ -78,61 +85,29 @@ class GoodFETMCPCANCommunication:
     #   SNIFF
     ##########################
          
     #   SNIFF
     ##########################
          
-    def sniff(self,freq,duration,description, verbose=True, comment=None, filename=None, standardid=None, debug=False, faster=False, parsed=True, data = None,writeToFile=True):
+    def sniff(self,freq,duration,description, verbose=True, comment=None, filename=None, standardid=None, debug=False, faster=False, parsed=True, data = None,writeToFile=True, db0 = None, db1 = None):
         """
         
         """
         #reset eveything on the chip
         self.client.serInit() 
         self.reset()
         """
         
         """
         #reset eveything on the chip
         self.client.serInit() 
         self.reset()
-          
-        #### ON-CHIP FILTERING
-        if(standardid != None):
-            if( comment == None):
-                comment = ""
-            self.client.MCPreqstatConfiguration();  
-            self.client.poke8(0x60,0x26); # set RXB0 CTRL register to ONLY accept STANDARD messages with filter match (RXM1=0, RMX0=1, BUKT=1)
-            self.client.poke8(0x20,0xFF); #set buffer 0 mask 1 (SID 10:3) to FF
-            self.client.poke8(0x21,0xE0); #set buffer 0 mask 2 bits 7:5 (SID 2:0) to 1s
-            if(len(standardid)>2):
-               self.client.poke8(0x70,0x20); # set RXB1 CTRL register to ONLY accept STANDARD messages with filter match (RXM1=0, RMX0=1)
-               self.client.poke8(0x24,0xFF); #set buffer 1 mask 1 (SID 10:3) to FF
-               self.client.poke8(0x25,0xE0); #set buffer 1 mask 2 bits 7:5 (SID 2:0) to 1s 
-            
-            for filter,ID in enumerate(standardid):
-        
-               if (filter==0):
-                RXFSIDH = 0x00;
-                RXFSIDL = 0x01;
-               elif (filter==1):
-                RXFSIDH = 0x04;
-                RXFSIDL = 0x05;
-               elif (filter==2):
-                RXFSIDH = 0x08;
-                RXFSIDL = 0x09;
-               elif (filter==3):
-                RXFSIDH = 0x10;
-                RXFSIDL = 0x11;
-               elif (filter==4):
-                RXFSIDH = 0x14;
-                RXFSIDL = 0x15;
-               else:
-                RXFSIDH = 0x18;
-                RXFSIDL = 0x19;
-        
-               #### split SID into different regs
-               SIDlow = (ID & 0x07) << 5;  # get SID bits 2:0, rotate them to bits 7:5
-               SIDhigh = (ID >> 3) & 0xFF; # get SID bits 10:3, rotate them to bits 7:0
-               
-               #write SID to regs 
-               self.client.poke8(RXFSIDH,SIDhigh);
-               self.client.poke8(RXFSIDL, SIDlow);
-        
-               if (verbose == True):
-                   print "Filtering for SID %d (0x%02xh) with filter #%d"%(ID, ID, filter);
-               comment += ("f%d" %(ID))
-        
         
         
+        # filtering for specific packets
+        if(db0 != None and db1 != None and standardid != None):
+            self.filterForPacket(standardid[0], db0, db1, verbose)
+            if(comment == None):
+                comment = ""
+            comment += ("f%d[%d][%d]" %(standardid[0], db0, db1))
+        # filtering for standard ID
+        elif(standardid != None):
+            self.addFilter(standardid, verbose)
+            if(comment == None):
+                comment = ""
+                for ID in standardid:
+                    comment += ("f%d" %(ID))
+
+                
         self.client.MCPsetrate(freq);
         
         # This will handle the files so that we do not loose them. each day we will create a new csv file
         self.client.MCPsetrate(freq);
         
         # This will handle the files so that we do not loose them. each day we will create a new csv file
@@ -202,7 +177,7 @@ class GoodFETMCPCANCommunication:
                         msg += " data:"
                         for i in range(0,length):
                             dbidx = 'db%d'%i
                         msg += " data:"
                         for i in range(0,length):
                             dbidx = 'db%d'%i
-                            msg +=" %03d"% ord(packetParsed[dbidx])
+                            msg +=" %03d"% packetParsed[dbidx]
                         #msg = self.client.packet2parsedstr(packet)
                         print msg
                     # if we want to print just the message as it is read off the chip
                         #msg = self.client.packet2parsedstr(packet)
                         print msg
                     # if we want to print just the message as it is read off the chip
@@ -298,7 +273,12 @@ class GoodFETMCPCANCommunication:
 #        return msgIDs, ids
     
     def sniffTest(self, freq):
 #        return msgIDs, ids
     
     def sniffTest(self, freq):
+        """
+        This method will preform a test to see if we can sniff corretly formed packets from the CAN bus.
         
         
+        @type freq: number
+        @param freq: frequency of the CAN bus
+        """
         rate = freq;
         
         print "Calling MCPsetrate for %i." %rate;
         rate = freq;
         
         print "Calling MCPsetrate for %i." %rate;
@@ -322,7 +302,13 @@ class GoodFETMCPCANCommunication:
    
     
     def freqtest(self,freq):
    
     
     def freqtest(self,freq):
+        """
+        This method will test the frequency provided to see if it is the correct frequency for this CAN bus.
         
         
+        @type freq: Number
+        @param freq: The frequency to listen to the CAN bus.
+        
+        """
         self.client.MCPsetup();
 
         self.client.MCPsetrate(freq);
         self.client.MCPsetup();
 
         self.client.MCPsetrate(freq);
@@ -420,6 +406,7 @@ class GoodFETMCPCANCommunication:
         
         @rtype: None
         @return: This method does not return anything
         
         @rtype: None
         @return: This method does not return anything
+        @todo: rename setFilters
         """
        
         ### ON-CHIP FILTERING
         """
        
         ### ON-CHIP FILTERING
@@ -461,13 +448,97 @@ class GoodFETMCPCANCommunication:
                #write SID to regs 
                self.client.poke8(RXFSIDH,SIDhigh);
                self.client.poke8(RXFSIDL, SIDlow);
                #write SID to regs 
                self.client.poke8(RXFSIDH,SIDhigh);
                self.client.poke8(RXFSIDL, SIDlow);
-        
+                       
                if (verbose == True):
                    print "Filtering for SID %d (0x%02xh) with filter #%d"%(ID, ID, filter);
                
         self.client.MCPreqstatNormal();
     
                if (verbose == True):
                    print "Filtering for SID %d (0x%02xh) with filter #%d"%(ID, ID, filter);
                
         self.client.MCPreqstatNormal();
     
-    
+    def filterForPacket(self, standardid, DB0, DB1, verbose= True):
+        """ 
+        This method will configure filters on the board to listen for a specific packet originating 
+        from standardid with data bytes 0 and 1. It will configure all six filters, so you will not receive any other packets.
+        
+        @type standardid: integer
+        @param standardid: standardID to listen for
+        @type DB0: integer
+        @param standardid: DB0 contents to filter for
+        @type DB1: integer
+        @param standardid: DB1 contents to filter for
+        @type verbose: Boolean
+        @param verbose: If true it will print out messages and diagnostics to terminal.
+        
+        @rtype: None
+        @return: This method does not return anything
+        """
+        
+        ### ON-CHIP FILTERING
+       
+        self.client.MCPreqstatConfiguration();  
+        
+        # SID filtering: set CTRL registers to only accept standard messages
+        self.client.poke8(0x60,0x06); # set RXB0 CTRL register to ONLY accept STANDARD messages with filter match (RXM1=0, RXM=1, BUKT=1)
+        self.client.poke8(0x70,0x00); # set RXB1 CTRL register to ONLY accept STANDARD messages with filter match (RXM1=0, RXM0=1)
+
+        # Mask buffer 0 to match SID, DB0, DB1
+        self.client.poke8(0x20,0xFF); #set buffer 0 mask 1 (SID 10:3) to FF
+        self.client.poke8(0x21,0xE0); #set buffer 0 mask 2 bits 7:5 (SID 2:0) to 1s
+        self.client.poke8(0x22,0xFF); #set buffer 0 mask 3 (DB0) to FF 
+        self.client.poke8(0x23,0xFF); #set buffer 0 mask 4 (DB0) to FF
+
+        # Mask buffer 1 to match SID, DB0, DB1
+        self.client.poke8(0x24,0xFF); #set buffer 1 mask 1 (SID 10:3) to FF
+        self.client.poke8(0x25,0xE0); #set buffer 1 mask 2 bits 7:5 (SID 2:0) to 1s
+        self.client.poke8(0x26,0xFF); #set buffer 1 mask 3 (DB0) to FF
+        self.client.poke8(0x27,0xFF); #set buffer 1 mask 4 (DB1) to FF
+        
+        # Split SID into high and low bytes
+        SIDlow = (standardid & 0x07) << 5;  # get SID bits 2:0, rotate them to bits 7:5
+        SIDhigh = (standardid >> 3) & 0xFF; # get SID bits 10:3, rotate them to bits 7:0
+
+            
+        for filter in range(0,5):
+            if (filter==0):
+                RXFSIDH = 0x00;
+                RXFSIDL = 0x01;
+                RXFDB0 = 0x02;
+                RXFDB1 = 0x03;
+            elif (filter==1):
+                RXFSIDH = 0x04;
+                RXFSIDL = 0x05;
+                RXFDB0 = 0x06;
+                RXFDB1 = 0x07;
+            elif (filter==2):
+                RXFSIDH = 0x08;
+                RXFSIDL = 0x09;
+                RXFDB0 = 0x0A;
+                RXFDB1 = 0x0B;
+            elif (filter==3):
+                RXFSIDH = 0x10;
+                RXFSIDL = 0x11;
+                RXFDB0 = 0x12;
+                RXFDB1 = 0x13;
+            elif (filter==4):
+                RXFSIDH = 0x14;
+                RXFSIDL = 0x15;
+                RXFDB0 = 0x16;
+                RXFDB1 = 0x17;
+            else:
+                RXFSIDH = 0x18;
+                RXFSIDL = 0x19;
+                RXFDB0 = 0x1A;
+                RXFDB1 = 0x1B;
+            
+
+            self.client.poke8(RXFSIDH, SIDhigh);
+            self.client.poke8(RXFSIDL, SIDlow);
+            self.client.poke8(RXFDB0, DB0);
+            self.client.poke8(RXFDB1, DB1);
+                
+            if (verbose == True):
+                print "Filtering for SID %d DB0 %d DB1 %d with filter #%d"%(standardid, DB0, DB1, filter);
+        
+        self.client.MCPreqstatNormal();    
    
         
     def spitSetup(self,freq):
    
         
     def spitSetup(self,freq):
@@ -482,7 +553,7 @@ class GoodFETMCPCANCommunication:
     def spitSingle(self,freq, standardid, repeat,writes, period = None, debug = False, packet = None):
         """ 
         This method will spit a single message onto the bus. If there is no packet information provided then the 
     def spitSingle(self,freq, standardid, repeat,writes, period = None, debug = False, packet = None):
         """ 
         This method will spit a single message onto the bus. If there is no packet information provided then the 
-        message will be sent as a remote transmission request (RTR). The packet length is assumed to be 8 bytes The message can be repeated given number of times with
+        message will be sent as a remote transmission request (RTR). The packet length is assumed to be 8 bytes The message can be repeated given number of times with
         a gap of period (milliseconds) between each message. This will continue for the the number of times specified in the writes input.
         This method will setup the bus and call the spit method, L{spit}. This method includes a bus reset and initialization.
         
         a gap of period (milliseconds) between each message. This will continue for the the number of times specified in the writes input.
         This method will setup the bus and call the spit method, L{spit}. This method includes a bus reset and initialization.
         
@@ -580,7 +651,6 @@ class GoodFETMCPCANCommunication:
             print "TXB0CTRL: %02x" %self.client.peek8(0x30);
             print "CANINTF: %02x\n"  %self.client.peek8(0x2C);
             print "\n\nATTEMPTING TRANSMISSION!!!"
             print "TXB0CTRL: %02x" %self.client.peek8(0x30);
             print "CANINTF: %02x\n"  %self.client.peek8(0x2C);
             print "\n\nATTEMPTING TRANSMISSION!!!"
-        
                 
         print "Transmitting packet: "
         #print self.client.packet2str(packet)
                 
         print "Transmitting packet: "
         #print self.client.packet2str(packet)
@@ -635,6 +705,7 @@ class GoodFETMCPCANCommunication:
         @param freq: Frequency of the CAN bus
         """
         self.client.MCPsetrate(freq);
         @param freq: Frequency of the CAN bus
         """
         self.client.MCPsetrate(freq);
+
         
 
     # This will write the data provided in the packets which is expected to be a list of lists
         
 
     # This will write the data provided in the packets which is expected to be a list of lists
@@ -686,7 +757,7 @@ if __name__ == "__main__":
         ''')
         
     
         ''')
         
     
-    parser.add_argument('verb', choices=['info', 'test','peek', 'reset', 'sniff', 'freqtest','snifftest', 'spit']);
+    parser.add_argument('verb', choices=['info', 'test','peek', 'reset', 'sniff', 'freqtest','snifftest', 'spit', 'packet']);
     parser.add_argument('-f', '--freq', type=int, default=500, help='The desired frequency (kHz)', choices=[100, 125, 250, 500, 1000]);
     parser.add_argument('-t','--time', type=int, default=15, help='The duration to run the command (s)');
     parser.add_argument('-o', '--output', default=None,help='Output file');
     parser.add_argument('-f', '--freq', type=int, default=500, help='The desired frequency (kHz)', choices=[100, 125, 250, 500, 1000]);
     parser.add_argument('-t','--time', type=int, default=15, help='The duration to run the command (s)');
     parser.add_argument('-o', '--output', default=None,help='Output file');
@@ -697,6 +768,9 @@ if __name__ == "__main__":
     parser.add_argument('-a', '--standardid', type=int, action='append', help='Standard ID to accept with filter 0 [1, 2, 3, 4, 5]', default=None);
     parser.add_argument('-x', '--faster', action='store_true', help='-x will use "fast packet recieve," which may duplicate packets and/or cause other weird behavior.', default=False);
     parser.add_argument('-r', '--repeat', action='store_true', help='-r with "spit" will continuously send the inputted packet. This will put the GoodTHOPTHER into an infinite loop.', default=False);
     parser.add_argument('-a', '--standardid', type=int, action='append', help='Standard ID to accept with filter 0 [1, 2, 3, 4, 5]', default=None);
     parser.add_argument('-x', '--faster', action='store_true', help='-x will use "fast packet recieve," which may duplicate packets and/or cause other weird behavior.', default=False);
     parser.add_argument('-r', '--repeat', action='store_true', help='-r with "spit" will continuously send the inputted packet. This will put the GoodTHOPTHER into an infinite loop.', default=False);
+    parser.add_argument('-db0', '--databyte0', type=int, default = None, help='-db0 to filter for a specfic data byte');
+    parser.add_argument('-db1', '--databyte1', type=int, default = None, help='-db0 to filter for a specfic data byte');
+
     
     
     args = parser.parse_args();
     
     
     args = parser.parse_args();
@@ -710,8 +784,13 @@ if __name__ == "__main__":
     standardid = args.standardid
     faster=args.faster
     repeat = args.repeat
     standardid = args.standardid
     faster=args.faster
     repeat = args.repeat
+    db0 = args.databyte0
+    db1 = args.databyte1
 
 
-    comm = GoodFETMCPCANCommunication();
+    comm = GoodFETMCPCANCommunication("./");
+    
+    if(args.verb=="packet"):
+        comm.filterForPacket(standardid=standardid[0], DB0=db0, DB1=db1, verbose= True)
     
     ##########################
     #   INFO
     
     ##########################
     #   INFO
@@ -741,7 +820,7 @@ if __name__ == "__main__":
     #
     
     if(args.verb=="sniff"):
     #
     
     if(args.verb=="sniff"):
-        comm.sniff(freq=freq,duration=duration,description=description,verbose=verbose,comment=comments,filename=filename, standardid=standardid, debug=debug, faster=faster)    
+        comm.sniff(freq=freq,duration=duration,description=description,verbose=verbose,comment=comments,filename=filename, standardid=standardid, debug=debug, faster=faster, db0=db0, db1=db1)    
                     
     ##########################
     #   SNIFF TEST
                     
     ##########################
     #   SNIFF TEST