added new mcpCAN communication file to allow for easier testing and data storage.
[goodfet] / client / goodfet.mcpcan
index 82636b3..a5aa968 100755 (executable)
@@ -20,6 +20,9 @@ if(len(sys.argv)==1):
     #print "%s poke 0x$adr 0x$val" % sys.argv[0];
 
     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();
 
@@ -40,24 +43,99 @@ 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);
     for foo in [packet0, packet1]:
         print client.packet2str(foo);
+
 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 """
+    """ More features to be added soon """
+    if len(sys.argv)>2:
+        rate=float(sys.argv[2]);
+        client.MCPsetrate(rate);
+    client.MCPreqstatListenOnly();
+    while 1:
+        packet=client.rxpacket();
+        if packet!=None:
+            plist=[];
+            for byte in packet:
+                plist.append(byte);
+            arbid=plist[0:2];
+            eid=plist[2:4];
+            dlc=plist[4:5];
+            data=plist[5:13];         
+            print "\nArbID: " + client.packet2str(arbid);
+            print "EID: " + client.packet2str(eid);
+            print "DLC: " + client.packet2str(dlc);
+            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();
@@ -69,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):
@@ -88,3 +176,41 @@ if(sys.argv[1]=="peek"):
     while start<=stop:
         print "%04x: %02x" % (start,client.peek8(start));
         start=start+1;
+        
+# AWWW YEAAAA CODIN THAT SHIT
+# as written, this should
+
+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);
+
+
+
+
+    
+