goodfet.ccspi help additions.
[goodfet] / client / goodfet.ccspi
1 #!/usr/bin/env python
2
3 #GoodFET Chipcon SPI Client
4 # (C) 2011 Travis Goodspeed
5
6 #N.B.,
7 #Might be CC2420 Specific
8
9 import sys;
10 import binascii;
11 import array, time;
12
13 from GoodFETCCSPI import GoodFETCCSPI;
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 regs" % sys.argv[0];
19     print "%s test" % sys.argv[0];
20     print "%s peek 0x$start [0x$stop]" % sys.argv[0];
21     print "%s poke 0x$adr 0x$val" % sys.argv[0];
22     print "%s txtest" % sys.argv[0];
23     
24     print "\n%s rssi" % sys.argv[0];
25     print "%s sniff [chan]" % sys.argv[0];
26     print "%s bsniff [chan]" % sys.argv[0];
27     print "%s sniffdissect" % sys.argv[0];
28     
29     
30     print;
31     print "%s txtoscount [-i|-r]   TinyOS BlinkToLED" % sys.argv[0];    
32     
33     sys.exit();
34
35 #Initialize FET and set baud rate
36 client=GoodFETCCSPI();
37 client.serInit()
38
39
40 client.setup();
41
42 #Dummy read.
43 #Might read as all ones if chip has a startup delay.
44
45 if(sys.argv[1]=="carrier"):
46     if len(sys.argv)>2:
47         client.RF_setfreq(eval(sys.argv[2]));
48     while 1:    
49         client.RF_carrier();
50     while(1):
51         time.sleep(1);
52
53 if(sys.argv[1]=="modulated_spectrum"):
54     if len(sys.argv)>2:
55         client.RF_setfreq(eval(sys.argv[2]));
56     while 1:
57         client.RF_modulated_spectrum();
58     while(1):
59         time.sleep(1);
60
61 if(sys.argv[1]=="info"):
62     print "Found   %s" % client.identstr();
63     print "Freq:   %05f MHz" % (client.RF_getfreq()/(10**6));
64     print "Status: %s" % client.status();
65 if(sys.argv[1]=="regs"):
66     for adr in range(0x10,0x40): #*1024):
67         val=client.peek(adr);
68         print "%04x:=0x%04x" % (adr,val);
69 if(sys.argv[1]=="test"):
70     data=client.trans([0x20, 0xde, 0xad]);
71     print "%02x %02x" % (ord(data[1]), ord(data[2]));
72     data=client.trans([0x40|0x20, 0xde, 0xad]);
73     print "%02x %02x" % (ord(data[1]), ord(data[2]));
74 if(sys.argv[1]=="rssi"):
75     if len(sys.argv)>2:
76         freq=eval(sys.argv[2]);
77         if freq>100:
78             client.RF_setfreq(freq);
79         else:
80             client.RF_setchan(freq);
81     print "Listening on %f MHz." % (client.RF_getfreq()/10.0**6);
82         
83     client.strobe(0x02); #Calibrate
84     time.sleep(1);
85     
86     while 1:
87         client.CC_RFST_RX();
88         #client.strobe(0x03); #SRXON
89         rssi=client.RF_getrssi();
90         #client.CC_RFST_IDLE(); #idle
91         time.sleep(0.01);
92         string="";
93         for foo in range(0,rssi>>2):
94             string=("%s."%string);
95         print "%02x %04i %s" % (rssi,rssi, string); 
96 if(sys.argv[1]=="sniff" or sys.argv[1]=="sniffdissect"):
97     #Promiscuous mode.
98     client.RF_promiscuity(1);
99     client.RF_autocrc(0);
100     
101     if len(sys.argv)>2:
102         freq=eval(sys.argv[2]);
103         if freq>100:
104             client.RF_setfreq(freq);
105         else:
106             client.RF_setchan(freq);
107     client.CC_RFST_RX();
108     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
109                                             client.RF_getfreq()/10**6);
110     #Now we're ready to get packets.
111     while 1:
112         packet=None;
113         while packet==None:
114             packet=client.RF_rxpacket();
115         if sys.argv[1]=="sniffdissect":
116             client.printdissect(packet);
117         else:
118             client.printpacket(packet);
119         sys.stdout.flush();
120 if(sys.argv[1]=="bsniff"):
121     #Just broadcast.
122     client.RF_promiscuity(0);
123     client.RF_setsmac(0xFFFFFFFF);
124     client.RF_autocrc(1);
125     
126     if len(sys.argv)>2:
127         freq=eval(sys.argv[2]);
128         if freq>100:
129             client.RF_setfreq(freq);
130         else:
131             client.RF_setchan(freq);
132     client.CC_RFST_RX();
133     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
134                                             client.RF_getfreq()/10**6);
135     #Now we're ready to get packets.
136     while 1:
137         packet=None;
138         while packet==None:
139             packet=client.RF_rxpacket();
140         client.printpacket(packet);
141         sys.stdout.flush();
142
143 if(sys.argv[1]=="txtest"):
144     if len(sys.argv)>2:
145         freq=eval(sys.argv[2]);
146         if freq>100:
147             client.RF_setfreq(freq);
148         else:
149             client.RF_setchan(freq);
150     print "Transmitting DEADBEEF as %010x on %i MHz" % (
151         client.RF_getsmac(),
152         client.RF_getfreq()/10**6);
153     
154     while 1:
155         client.RF_txpacket([0x0f, 0x01, 0x08, 0x82,
156                             0xff, 0xff, 0xff, 0xff,
157                             0xde, 0xad, 0xbe, 0xef,
158                             0xba, 0xbe, 0xc0]);
159 if(sys.argv[1]=="txtoscount"):
160     '''
161     Clone of what TinyOS's BlinkToLED demo code does.
162     Specify a channel a TinyOS mote programmed with BlinkToLED is on, and this will act as the second device.
163     '''
164     if (len(sys.argv)<=3):
165         print "Provide -r to work via replays or -i to work via incrementing itself.";
166         sys.exit(1);
167     if (sys.argv[3]=="-r"):
168         client.RF_promiscuity(1);
169     client.RF_autocrc(1);
170     if len(sys.argv)>2:
171         freq=eval(sys.argv[2]);
172         if freq>100:
173             client.RF_setfreq(freq);
174         else:
175             client.RF_setchan(freq);
176     if (sys.argv[3]=="-r"):
177         client.CC_RFST_RX();
178         print "Listening as %010x on %i MHz" % (client.RF_getsmac(), client.RF_getfreq()/10**6);
179     print "Transmitting like the TinyOS CountToRadio program on %i MHz" % (client.RF_getfreq()/10**6);
180     if (sys.argv[3]=="-i"):
181         i = 0;
182         countpkt = [0x0f, 0x41, 0x88, 0xFF, 0x22, 0x00, 0xff, 0xff, 0x01, 0x00, 0x3f, 0x06, 0x00, 0xFF];
183     while 1:
184         if (sys.argv[3]=="-r"): #give -r to do via replays from the other device
185             packet=None;
186             while packet==None:
187                 packet=client.RF_rxpacket();
188             #print "Recd:",
189             #client.printpacket(packet);
190             pkt = packet[:14];
191             #print "Sent:",
192             #client.printpacket(pkt)
193             client.RF_txpacket(pkt);
194         elif (sys.argv[3]=="-i"): #give -i to have it increment and send
195             #Use this code for it to actually do increments itself:
196             pkt = countpkt[:];
197             pkt[3] = i;
198             pkt[13] = i+1;
199             #for j in pkt:
200             #    print hex(j)[2:],;
201             #print;
202             client.RF_txpacket(pkt);
203             if i >= 31: i = 0;
204             else:       i += 1;
205             time.sleep(0.5);
206
207 if(sys.argv[1]=="txpiptest"):# or sys.argv[1]=="txpipscapy"):
208     if len(sys.argv)>2:
209         freq=eval(sys.argv[2]);
210         if freq>100:
211             client.RF_setfreq(freq);
212         else:
213             client.RF_setchan(freq);
214     print "Transmitting on as %010x on %i MHz" % (
215         client.RF_getsmac(),
216         client.RF_getfreq()/10**6);
217     
218     client.RF_setsync(0xFFFF);
219     
220     while 1:
221         client.RF_txpacket([
222                 0x7f, 
223                 #Real header, must begin with SFD.
224                 0x00, 0x00, 0x00,
225                 0x00, 0xA7,
226                 
227                 #Length
228                 0x1f, 0x01, 0x08, 0x82,
229                 0xDF, 0xff, 0xff, 0xff,
230                 0xde, 0xad, 0xbe, 0xef,
231                 0xba, 0xbe, 0xc0,
232                 
233                 #Preamble
234                 0x00, 0x00, 0x00,
235                 #SFD
236                 0x00, 0xA7,  #CC2420 SFD
237                 #Packet In Packet
238                 0x0f, 0x01, 0x08, 0x82,
239                 0xff, 0xff, 0xff, 0xff,
240                 0xde, 0xad, 0xbe, 0xef,
241                 0xba, 0xbe, 0xc0,
242                 
243                 0xff, 0xff, 0xff, 0xff,
244                 0xff, 0xff, 0xff, 0xff,
245                 0xff, 0xff, 0xff, 0xff,
246                 0xff, 0xff, 0xff, 0xff,
247                 0xff, 0xff, 0xff, 0xff,
248                 0xff, 0xff, 0xff, 0xff,
249                 0xff, 0xff, 0xff, 0xff,
250                 ]);
251
252 if(sys.argv[1]=="peek"):
253     start=0x0000;
254     if(len(sys.argv)>2):
255         start=int(sys.argv[2],16);
256     stop=start;
257     if(len(sys.argv)>3):
258         stop=int(sys.argv[3],16);
259     print "Peeking from %04x to %04x." % (start,stop);
260     while start<=stop:
261         print "%04x: 0x%04x" % (start,client.peek(start));
262         start=start+1;
263 if(sys.argv[1]=="poke"):
264     start=0x0000;
265     val=0x00;
266     if(len(sys.argv)>2):
267         start=int(sys.argv[2],16);
268     if(len(sys.argv)>3):
269         val=int(sys.argv[3],16);
270     print "Poking r%02x to become 0x%04x." % (start,val);
271     
272     client.poke(start,val);
273