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