359f2c4e954f42fe0379a5c2799869026ad7ce1f
[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     while 1:
166         client.RF_txpacket([0x3f, 0x01, 0x08, 0x82,
167                             0xDE, 0xff, 0xff, 0xff,
168                             0xde, 0xad, 0xbe, 0xef,
169                             0xba, 0xbe, 0xc0,
170                             
171                             0x00, 0x00, 0x00,
172                             0x00, 0x00, 0x00,
173                             0x00, 0x00, 0x00,
174                             0x00, 0x00, 0x00,
175                             
176                             #0x00, 0xA7,  #CC2420 SFD
177                             
178                             0x0f, 0x01, 0x08, 0x82,
179                             0xff, 0xff, 0xff, 0xff,
180                             0xde, 0xad, 0xbe, 0xef,
181                             0xba, 0xbe, 0xc0,
182                             
183                             0xff, 0xff, 0xff, 0xff,
184                             0xff, 0xff, 0xff, 0xff,
185                             0xff, 0xff, 0xff, 0xff,
186                             0xff, 0xff, 0xff, 0xff,
187                             0xff, 0xff, 0xff, 0xff,
188                             0xff, 0xff, 0xff, 0xff,
189                             0xff, 0xff, 0xff, 0xff,
190                             ]);
191
192 if(sys.argv[1]=="peek"):
193     start=0x0000;
194     if(len(sys.argv)>2):
195         start=int(sys.argv[2],16);
196     stop=start;
197     if(len(sys.argv)>3):
198         stop=int(sys.argv[3],16);
199     print "Peeking from %04x to %04x." % (start,stop);
200     while start<=stop:
201         print "%04x: 0x%04x" % (start,client.peek(start));
202         start=start+1;
203 if(sys.argv[1]=="poke"):
204     start=0x0000;
205     val=0x00;
206     if(len(sys.argv)>2):
207         start=int(sys.argv[2],16);
208     if(len(sys.argv)>3):
209         val=int(sys.argv[3],16);
210     print "Poking r%02x to become 0x%04x." % (start,val);
211     
212     client.poke(start,val);
213