return ord(self.data[0]);
def CC_RFST_IDLE(self):
"""Switch the radio to idle mode, clearing overflows and errors."""
- self.strobe(0x00); #SNOP?
+ self.strobe(0x06); #SRXOFF
def CC_RFST_TX(self):
"""Switch the radio to TX mode."""
self.strobe(0x04); #0x05 for CCA
"""Returns the received signal strenght, with a weird offset."""
rssival=self.peek(0x13)&0xFF; #raw RSSI register, should normalize this
return rssival^0x80;
+ lastpacket=range(0,0xff);
def RF_rxpacket(self):
- """Get a packet from the radio. Returns None if none is waiting."""
- print "Don't know how to get a packet.";
- return None;
+ """Get a packet from the radio. Returns None if none is waiting. In
+ order to not require the SFD, FIFO, or FIFOP lines, this
+ implementation works by comparing the buffer to the older
+ contents.
+ """
+ self.strobe(0x03); #SRXON
+ self.strobe(0x08); #SFLUSHRX
+
+ buffer=range(0,0xff);
+ buffer[0]=0x3F | 0x40; #RXFIFO
+ buffer=self.trans(buffer);
+
+ new=False;
+ for foo in range(2,20):
+ if buffer[foo]!=self.lastpacket[foo]:
+ new=True;
+ if not new:
+ return None;
+
+
+ self.lastpacket=buffer;
+ return buffer;
def RF_carrier(self):
"""Hold a carrier wave on the present frequency."""
print "Don't know how to hold a carrier.";
from GoodFETCCSPI import GoodFETCCSPI;
+def printpacket(packet):
+ s="";
+ i=0;
+ for foo in packet:
+ i=i+1;
+ if i>ord(packet[1])+2: break;
+ if i<2: continue;
+ s="%s %02x" % (s,ord(foo));
+ print "%s" % s;
+
+
if(len(sys.argv)==1):
print "Usage: %s verb [objects]\n" % sys.argv[0];
print "%s regs" % sys.argv[0];
for foo in range(0,rssi>>2):
string=("%s."%string);
print "%02x %04i %s" % (rssi,rssi, string);
-
+if(sys.argv[1]=="sniff"):
+ #if len(sys.argv)>2:
+ #print "Set MAC to %s" % sys.argv[2];
+ #client.tune(sys.argv[2]);
+ #client.RF_setmaclen(5);
+
+ client.CC_RFST_RX();
+ print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
+ client.RF_getfreq()/10**6);
+ #Now we're ready to get packets.
+
+ while 1:
+ packet=None;
+ while packet==None:
+ #time.sleep(0.1);
+ packet=client.RF_rxpacket();
+ printpacket(packet);
+ sys.stdout.flush();
if(sys.argv[1]=="peek"):
start=0x0000;
if(len(sys.argv)>2):