updated features for two different types of sniffing. fixed and scrolling. This can...
[goodfet] / client / goodfet.mcpcan
index 0c0779c..77bc082 100755 (executable)
@@ -21,6 +21,8 @@ if(len(sys.argv)==1):
 
     print "\n%s sniff [kHz]" % sys.argv[0];
     print "\n%s isniff [kHz]" % sys.argv[0];
+    print "\n%s spit [kHz]" % sys.argv[0];
+
     print "\nSupported rates: 83.3, 100, 125, 250, 500, 1000 kHz.";
     sys.exit();
 
@@ -41,7 +43,14 @@ if(sys.argv[1]=="info"):
     print "Read Status: %02x" % client.MCPreadstatus();
     print "Rx Status:   %02x" % client.MCPrxstatus();
     print "Tx Errors:  %3d" % client.peek8(0x1c);
-    print "Rx Errors:  %3d" % client.peek8(0x1d);
+    print "Rx Errors:  %3d\n" % client.peek8(0x1d);
+    
+    print "Timing Info:";
+    print "CNF1: %02x" %client.peek8(0x2a);
+    print "CNF2: %02x" %client.peek8(0x29);
+    print "CNF3: %02x\n" %client.peek8(0x28);
+    print "RXB0 CTRL: %02x" %client.peek8(0x60);
+    print "RXB1 CTRL: %02x" %client.peek8(0x70);
     print "RX Buffers:"
     packet0=client.readrxbuffer(0);
     packet1=client.readrxbuffer(1);
@@ -51,12 +60,57 @@ if(sys.argv[1]=="info"):
 if(sys.argv[1]=="sniff"):
     if len(sys.argv)>2:
         rate=float(sys.argv[2]);
+        print "Calling MCPsetrate for %i." %rate;
         client.MCPsetrate(rate);
     client.MCPreqstatListenOnly();
-    while 1:
+    
+    print "Mode: %s" % client.MCPcanstatstr();
+
+    print "CNF1: %02x" %client.peek8(0x2a);
+    print "CNF2: %02x" %client.peek8(0x29);
+    print "CNF3: %02x\n" %client.peek8(0x28);
+    
+    while(1):
         packet=client.rxpacket();
         if packet!=None:
             print client.packet2str(packet);
+                
+            if (client.peek8(0x2C) & 0x80):
+                client.MCPbitmodify(0x2C,0x80,0x00);
+                print"...malformed packet recieved";
+    
+if(sys.argv[1]=="snifftest"):
+
+    freqrange=[10.4, 41.6, 83.3, 100, 125, 250, 500, 1000];
+    
+    for rate in freqrange:
+
+        print "CAN Freq Test: %3d kHz" %rate;
+        client.MCPsetrate(rate);
+        #print "CNF1/2/3: %02x %02x %02x" %(client.peek8(0x2a), client.peek8(0x29),client.peek8(0x28));
+        client.MCPreqstatListenOnly();
+        print "Mode: %s" % client.MCPcanstatstr();
+        x = 0;
+        errors = 0;
+
+        for n in range(0,400):
+            packet=client.rxpacket();
+            if packet!=None:
+                print client.packet2str(packet);
+                x+=1;
+                
+                if (client.peek8(0x2C) & 0x80):
+                    errors+=1;
+                    client.MCPbitmodify(0x2C,0x80,0x00);
+
+        if x==0:
+            print "No packets sniffed for %3d kHz" %rate;
+        else:
+            percenterror = float(errors/x);
+        
+            print "Results for %3.1 kHz: recieved %3d packets, registered %3d RX errors, for a %3.3f percent error rate." %(rate, x, errors, percenterrors);
+            
+        client.MCPreset();
 
 if(sys.argv[1]=="isniff"):
     """ An intelligent sniffer, decodes message format """
@@ -81,7 +135,7 @@ if(sys.argv[1]=="isniff"):
             print "Data: " + client.packet2str(data);
 
 if(sys.argv[1]=="test"):
-    print "MCP2515 Self Test:";
+    print "\nMCP2515 Self Test:";
     
     #Switch to config mode and try to rewrite TEC.
     client.MCPreqstatConfiguration();
@@ -93,14 +147,24 @@ if(sys.argv[1]=="test"):
     
     #Switch to Loopback mode and try to catch our own packet.
     client.MCPreqstatLoopback();
-    client.txpacket([0xb1, 0x6b, 0x00, 0x65,
-                     0xb1, 0x6b, 0x00, 0x65
-                     ]);
-    print "Waiting on loopback packet.";
+
+    packet1 = [0x00, 
+               0x08, # LOWER nibble must be 8 or greater to set EXTENDED ID 
+               0x00, 0x00,
+               0x08, # UPPER nibble must be 0 to set RTR bit for DATA FRAME
+                  # LOWER nibble is DLC
+               0x01,0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFF]
+    client.txpacket(packet1);
+    client.txpacket(packet1);
+    print "Waiting on loopback packets.";
     packet=None;
-    while packet==None:
+    while(1):
         packet=client.rxpacket();
-    print "Success!  Got %s" % client.packet2str(packet);
+        if packet!=None:
+            print "Message recieved: %s" % client.packet2str(packet);
+
+    
+    
 if(sys.argv[1]=="peek"):
     start=0x0000;
     if(len(sys.argv)>2):
@@ -112,3 +176,38 @@ if(sys.argv[1]=="peek"):
     while start<=stop:
         print "%04x: %02x" % (start,client.peek8(start));
         start=start+1;
+
+if(sys.argv[1]=="spit"):
+
+    if len(sys.argv)>2:
+        rate=float(sys.argv[2]);
+        print "Calling MCPsetrate for %i." %rate;
+        client.MCPsetrate(rate);
+
+    client.MCPreqstatNormal();
+    
+    packet = [0x00, 
+               0x08, # LOWER nibble must be 8 or greater to set EXTENDED ID 
+               0x00, 0x00,
+               0x08, # UPPER nibble must be 0 to set RTR bit for DATA FRAME
+                  # LOWER nibble is DLC
+               0x01,0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFF]    
+    
+    client.txpacket(packet);
+    data = client.peek8(0x30);
+    while (data&0x08)==0:
+        print "waiting...";
+        data=client.peek8(0x30);
+    print "message successfully sent!";
+
+if(sys.argv[1]=="setbitrate"):
+    if len(sys.argv)>2:
+        rate=float(sys.argv[2]);
+        print "Calling MCPsetrate for %i." %rate;
+        client.MCPsetrate(rate);
+
+
+
+
+    
+