80e9fae02fa9cb1c8d5e5c2adf894436bc533e7e
[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     client.RF_promiscuity(1);
161     client.RF_autocrc(1);
162     if len(sys.argv)>2:
163         freq=eval(sys.argv[2]);
164         if freq>100:
165             client.RF_setfreq(freq);
166         else:
167             client.RF_setchan(freq);
168     client.CC_RFST_RX();
169     print "Listening as %010x on %i MHz" % (client.RF_getsmac(), client.RF_getfreq()/10**6);
170     print "Transmitting like the TinyOS CountToRadio program on %i MHz" % (client.RF_getfreq()/10**6);
171     #i = 0;
172     #countpkt = [0x0f, 0x41, 0x88, 0xFF, 0x22, 0x00, 0xff, 0xff, 0x01, 0x00, 0x3f, 0x06, 0xFF, 0x00, 0x00];
173     while 1:
174         packet=None;
175         while packet==None:
176             packet=client.RF_rxpacket();
177         print "Recd:",
178         client.printpacket(packet);
179         pkt = packet[:14]# + "\x00\x00";
180         print "Sent:",
181         client.printpacket(pkt)
182         client.RF_txpacket(pkt);
183         #TODO expand to actually do increments itself, if desired:
184         #pkt = countpkt[:];
185         #pkt[3] = i;
186         #for j in pkt:
187         #    print hex(j)[2:],;
188         #print;
189         #client.RF_txpacket(pkt);
190         #if i >= 31: i = 0;
191         #else:       i += 1;
192         #time.sleep(1);
193
194 if(sys.argv[1]=="txpiptest"):# or sys.argv[1]=="txpipscapy"):
195     if len(sys.argv)>2:
196         freq=eval(sys.argv[2]);
197         if freq>100:
198             client.RF_setfreq(freq);
199         else:
200             client.RF_setchan(freq);
201     print "Transmitting on as %010x on %i MHz" % (
202         client.RF_getsmac(),
203         client.RF_getfreq()/10**6);
204     
205     client.RF_setsync(0xFFFF);
206     
207     while 1:
208         client.RF_txpacket([
209                 0x7f, 
210                 #Real header, must begin with SFD.
211                 0x00, 0x00, 0x00,
212                 0x00, 0xA7,
213                 
214                 #Length
215                 0x1f, 0x01, 0x08, 0x82,
216                 0xDF, 0xff, 0xff, 0xff,
217                 0xde, 0xad, 0xbe, 0xef,
218                 0xba, 0xbe, 0xc0,
219                 
220                 #Preamble
221                 0x00, 0x00, 0x00,
222                 #SFD
223                 0x00, 0xA7,  #CC2420 SFD
224                 #Packet In Packet
225                 0x0f, 0x01, 0x08, 0x82,
226                 0xff, 0xff, 0xff, 0xff,
227                 0xde, 0xad, 0xbe, 0xef,
228                 0xba, 0xbe, 0xc0,
229                 
230                 0xff, 0xff, 0xff, 0xff,
231                 0xff, 0xff, 0xff, 0xff,
232                 0xff, 0xff, 0xff, 0xff,
233                 0xff, 0xff, 0xff, 0xff,
234                 0xff, 0xff, 0xff, 0xff,
235                 0xff, 0xff, 0xff, 0xff,
236                 0xff, 0xff, 0xff, 0xff,
237                 ]);
238
239 if(sys.argv[1]=="peek"):
240     start=0x0000;
241     if(len(sys.argv)>2):
242         start=int(sys.argv[2],16);
243     stop=start;
244     if(len(sys.argv)>3):
245         stop=int(sys.argv[3],16);
246     print "Peeking from %04x to %04x." % (start,stop);
247     while start<=stop:
248         print "%04x: 0x%04x" % (start,client.peek(start));
249         start=start+1;
250 if(sys.argv[1]=="poke"):
251     start=0x0000;
252     val=0x00;
253     if(len(sys.argv)>2):
254         start=int(sys.argv[2],16);
255     if(len(sys.argv)>3):
256         val=int(sys.argv[3],16);
257     print "Poking r%02x to become 0x%04x." % (start,val);
258     
259     client.poke(start,val);
260