d3612858a09d935a61f474c3fb823461ff0fd928
[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     
96     if len(sys.argv)>2:
97         freq=eval(sys.argv[2]);
98         if freq>100:
99             client.RF_setfreq(freq);
100         else:
101             client.RF_setchan(freq);
102     client.CC_RFST_RX();
103     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
104                                             client.RF_getfreq()/10**6);
105     #Now we're ready to get packets.
106     while 1:
107         packet=None;
108         while packet==None:
109             packet=client.RF_rxpacket();
110         if sys.argv[1]=="sniffdissect":
111             client.printdissect(packet);
112         else:
113             client.printpacket(packet);
114         sys.stdout.flush();
115 if(sys.argv[1]=="bsniff"):
116     #Just broadcast.
117     client.RF_promiscuity(0);
118     client.RF_setsmac(0xFFFFFFFF);
119     
120     if len(sys.argv)>2:
121         freq=eval(sys.argv[2]);
122         if freq>100:
123             client.RF_setfreq(freq);
124         else:
125             client.RF_setchan(freq);
126     client.CC_RFST_RX();
127     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
128                                             client.RF_getfreq()/10**6);
129     #Now we're ready to get packets.
130     while 1:
131         packet=None;
132         while packet==None:
133             packet=client.RF_rxpacket();
134         client.printpacket(packet);
135         sys.stdout.flush();
136
137 if(sys.argv[1]=="txtest"):
138     if len(sys.argv)>2:
139         freq=eval(sys.argv[2]);
140         if freq>100:
141             client.RF_setfreq(freq);
142         else:
143             client.RF_setchan(freq);
144     print "Transmitting DEADBEEF as %010x on %i MHz" % (
145         client.RF_getsmac(),
146         client.RF_getfreq()/10**6);
147     
148     while 1:
149         client.RF_txpacket([0x0f, 0x01, 0x08, 0x82,
150                             0xff, 0xff, 0xff, 0xff,
151                             0xde, 0xad, 0xbe, 0xef,
152                             0xba, 0xbe, 0xc0]);
153
154 if(sys.argv[1]=="txpiptest"):
155     if len(sys.argv)>2:
156         freq=eval(sys.argv[2]);
157         if freq>100:
158             client.RF_setfreq(freq);
159         else:
160             print "Channels not yet supported."
161     print "Transmitting on as %010x on %i MHz" % (
162         client.RF_getsmac(),
163         client.RF_getfreq()/10**6);
164     
165     client.RF_setsync(0xFFFF);
166     
167     while 1:
168         client.RF_txpacket([
169                 0x7f, 
170                 #Real header, must begin with SFD.
171                 0x00, 0x00, 0x00,
172                 0x00, 0xA7,
173                 
174                 #Length
175                 0x1f, 0x01, 0x08, 0x82,
176                 0xDF, 0xff, 0xff, 0xff,
177                 0xde, 0xad, 0xbe, 0xef,
178                 0xba, 0xbe, 0xc0,
179                 
180                 
181                 #Preamble
182                 0x00, 0x00, 0x00,
183                 #SFD
184                 0x00, 0xA7,  #CC2420 SFD
185                 #Packet In Packet
186                 0x0f, 0x01, 0x08, 0x82,
187                 0xff, 0xff, 0xff, 0xff,
188                 0xde, 0xad, 0xbe, 0xef,
189                 0xba, 0xbe, 0xc0,
190                 
191                 0xff, 0xff, 0xff, 0xff,
192                 0xff, 0xff, 0xff, 0xff,
193                 0xff, 0xff, 0xff, 0xff,
194                 0xff, 0xff, 0xff, 0xff,
195                 0xff, 0xff, 0xff, 0xff,
196                 0xff, 0xff, 0xff, 0xff,
197                 0xff, 0xff, 0xff, 0xff,
198                 ]);
199
200 if(sys.argv[1]=="peek"):
201     start=0x0000;
202     if(len(sys.argv)>2):
203         start=int(sys.argv[2],16);
204     stop=start;
205     if(len(sys.argv)>3):
206         stop=int(sys.argv[3],16);
207     print "Peeking from %04x to %04x." % (start,stop);
208     while start<=stop:
209         print "%04x: 0x%04x" % (start,client.peek(start));
210         start=start+1;
211 if(sys.argv[1]=="poke"):
212     start=0x0000;
213     val=0x00;
214     if(len(sys.argv)>2):
215         start=int(sys.argv[2],16);
216     if(len(sys.argv)>3):
217         val=int(sys.argv[3],16);
218     print "Poking r%02x to become 0x%04x." % (start,val);
219     
220     client.poke(start,val);
221