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