Fixed plist[] bug in isniff goodfet.mcpcan client
[goodfet] / client / goodfet.mcpcan
1 #!/usr/bin/env python
2 # GoodFET SPI Flash Client
3 #
4 # (C) 2012 Travis Goodspeed <travis at radiantmachines.com>
5 #
6 # This code is being rewritten and refactored.  You've been warned!
7
8 import sys;
9 import binascii;
10 import array;
11
12 from GoodFETMCPCAN import GoodFETMCPCAN;
13 from intelhex import IntelHex;
14
15 if(len(sys.argv)==1):
16     print "Usage: %s verb [objects]\n" % sys.argv[0];
17     print "%s info" % sys.argv[0];
18     print "%s test" % sys.argv[0];
19     print "%s peek 0x$start [0x$stop]" % sys.argv[0];
20     #print "%s poke 0x$adr 0x$val" % sys.argv[0];
21
22     print "\n%s sniff [kHz]" % sys.argv[0];
23     print "\nSupported rates: 83.3, 100, 125, 250, 500, 1000 kHz.";
24     sys.exit();
25
26 #Initialize FET and set baud rate
27 client=GoodFETMCPCAN();
28 client.serInit()
29
30
31 client.MCPsetup();
32
33 #Dummy read.
34 #Might read as all ones if chip has a startup delay.
35
36 if(sys.argv[1]=="info"):
37     print "MCP2515 Info:\n\n";
38     
39     print "Mode: %s" % client.MCPcanstatstr();
40     print "Read Status: %02x" % client.MCPreadstatus();
41     print "Rx Status:   %02x" % client.MCPrxstatus();
42     print "Tx Errors:  %3d" % client.peek8(0x1c);
43     print "Rx Errors:  %3d" % client.peek8(0x1d);
44     print "RX Buffers:"
45     packet0=client.readrxbuffer(0);
46     packet1=client.readrxbuffer(1);
47     for foo in [packet0, packet1]:
48         print client.packet2str(foo);
49
50 if(sys.argv[1]=="sniff"):
51     if len(sys.argv)>2:
52         rate=float(sys.argv[2]);
53         client.MCPsetrate(rate);
54     client.MCPreqstatListenOnly();
55     while 1:
56         packet=client.rxpacket();
57         if packet!=None:
58             print client.packet2str(packet);
59
60 if(sys.argv[1]=="isniff"):
61     """ An intelligent sniffer, decodes message format """
62     """ More features to be added soon """
63     client.MCPreqstatListenOnly();
64     while 1:
65         packet=client.rxpacket();
66         if packet!=None:
67             plist=[];
68             for byte in packet:
69                 plist.append(byte);
70             arbid=plist[0:2];
71             eid=plist[2:4];
72             dlc=plist[4:5];
73             data=plist[5:13];         
74             print "\nArbID: " + client.packet2str(arbid);
75             print "EID: " + client.packet2str(eid);
76             print "DLC: " + client.packet2str(dlc);
77             print "Data: " + client.packet2str(data);
78
79 if(sys.argv[1]=="test"):
80     print "MCP2515 Self Test:";
81     
82     #Switch to config mode and try to rewrite TEC.
83     client.MCPreqstatConfiguration();
84     client.poke8(0x00,0xde);
85     if client.peek8(0x00)!=0xde:
86         print "ERROR: Poke to TEC failed.";
87     else:
88         print "SUCCESS: Register read/write.";
89     
90     #Switch to Loopback mode and try to catch our own packet.
91     client.MCPreqstatLoopback();
92     client.txpacket([0xb1, 0x6b, 0x00, 0x65,
93                      0xb1, 0x6b, 0x00, 0x65
94                      ]);
95     print "Waiting on loopback packet.";
96     packet=None;
97     while packet==None:
98         packet=client.rxpacket();
99     print "Success!  Got %s" % client.packet2str(packet);
100 if(sys.argv[1]=="peek"):
101     start=0x0000;
102     if(len(sys.argv)>2):
103         start=int(sys.argv[2],16);
104     stop=start;
105     if(len(sys.argv)>3):
106         stop=int(sys.argv[3],16);
107     print "Peeking from %04x to %04x." % (start,stop);
108     while start<=stop:
109         print "%04x: %02x" % (start,client.peek8(start));
110         start=start+1;