X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2Fgoodfet.mcpcan;h=77bc08232f6b193b323fe572a7d69dbb4053b748;hp=44b921e531ababdcae5a7a4563044b93eb69f7e7;hb=HEAD;hpb=906e2500df02bdb4b0471a5011e713177e959b49 diff --git a/client/goodfet.mcpcan b/client/goodfet.mcpcan index 44b921e..77bc082 100755 --- a/client/goodfet.mcpcan +++ b/client/goodfet.mcpcan @@ -19,7 +19,11 @@ if(len(sys.argv)==1): print "%s peek 0x$start [0x$stop]" % sys.argv[0]; #print "%s poke 0x$adr 0x$val" % sys.argv[0]; - print "\n%s sniff" % 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(); #Initialize FET and set baud rate @@ -39,21 +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(); @@ -65,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): @@ -84,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); + + + + + +