Moving CCSPI reflexive jamming to its own channel.
[goodfet] / firmware / apps / radios / ccspi.c
index a578c92..6644a76 100644 (file)
@@ -19,8 +19,8 @@
 
 //! Handles a Chipcon SPI command.
 void ccspi_handle_fn( uint8_t const app,
-                                         uint8_t const verb,
-                                         uint32_t const len);
+                     uint8_t const verb,
+                     uint32_t const len);
 
 // define the ccspi app's app_t
 app_t const ccspi_app = {
@@ -87,6 +87,64 @@ u8 ccspitrans8(u8 byte){
 }
 
 
+//! Reflexively jam on the present channel.
+void ccspireflexjam(){
+  unsigned long i;
+  #if defined(FIFOP) && defined(SFD) && defined(FIFO) && defined(PLED2DIR) && defined(PLED2PIN) && defined(PLED2OUT)
+    debugstr("Reflex jamming until reset.");
+    txdata(CCSPI,CCSPI_REFLEX,1);  //Let the client continue its business.
+    while(1) {
+      //Wait until a packet is received
+      while(!SFD){
+       //Has there been an overflow in the RX buffer?
+        if((!FIFO)&&FIFOP){
+          debugstr("Clearing RX overflow");
+          CLRSS;
+          ccspitrans8(0x08); //SFLUSHRX
+          SETSS;
+        }
+      }
+      //Turn on LED 2 (green) as signal
+      PLED2DIR |= PLED2PIN;
+      PLED2OUT &= ~PLED2PIN;
+
+      //Put radio in TX mode
+      CLRSS;
+      ccspitrans8(0x04);
+      SETSS;
+
+      //Load the jamming packet.
+      //Note: attempts to preload this actually slowed the jam time down from 7 to 9 bytes.
+      CLRSS;
+      ccspitrans8(CCSPI_TXFIFO);
+      char pkt[15] = {0x0f, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0};
+      //char pkt[12] = {0x0c, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef};
+      for(i=0;i<pkt[0];i++)
+       ccspitrans8(pkt[i]);
+      SETSS;
+
+      //Transmit the packet.
+      CLRSS;
+      ccspitrans8(0x04); //STXON
+      SETSS;
+      msdelay(100);      //Instead of waiting for pulse on SFD
+      //Flush TX buffer.
+      CLRSS;
+      ccspitrans8(0x09); //SFLUSHTX
+      SETSS;
+
+      //Turn off LED 2 (green) as signal
+      PLED2DIR |= PLED2PIN;
+      PLED2OUT |= PLED2PIN;
+    }
+#else
+    debugstr("Can't reflexively jam without SFD, FIFO, FIFOP, and P2LEDx definitions - try using telosb platform.");
+    txdata(app,NOK,0);
+#endif
+}
+
+
+
 //! Writes a register
 u8 ccspi_regwrite(u8 reg, const u8 *buf, int len){
   CLRSS;
@@ -115,6 +173,7 @@ void ccspi_handle_fn( uint8_t const app,
                      uint8_t const verb,
                      uint32_t const len){
   unsigned long i;
+  u8 j;
 
   //debugstr("Chipcon SPI handler.");
 
@@ -126,9 +185,11 @@ void ccspi_handle_fn( uint8_t const app,
   case WRITE:
   case POKE:
     CLRSS; //Drop !SS to begin transaction.
+    j=cmddata[0];//Backup address.
     for(i=0;i<len;i++)
       cmddata[i]=ccspitrans8(cmddata[i]);
     SETSS;  //Raise !SS to end transaction.
+    cmddata[0]=j&~0x40;//Restore address.
     txdata(app,verb,len);
     break;
   case SETUP:
@@ -160,9 +221,9 @@ void ccspi_handle_fn( uint8_t const app,
       SETSS;
 
       //Flush buffer.
-      //CLRSS;
-      //ccspitrans8(0x08); //SFLUSHRX
-      //SETSS;
+      CLRSS;
+      ccspitrans8(0x08); //SFLUSHRX
+      SETSS;
       
       
       //Only should transmit length of one more than the reported
@@ -187,50 +248,8 @@ void ccspi_handle_fn( uint8_t const app,
     break;
 
   case CCSPI_REFLEX:
-#if defined(FIFOP) && defined(SFD) && defined(FIFO) && defined(PLED2DIR) && defined(PLED2PIN) && defined(PLED2OUT)
-    txdata(app,verb,1);  //Just sending some response back to client
-    while(1) {
-        //Wait until a packet is received
-        while(!SFD);
-        //Turn on LED 2 (green) as signal
-           PLED2DIR |= PLED2PIN;
-           PLED2OUT &= ~PLED2PIN;
-
-        //Put radio in TX mode
-        CLRSS;
-        ccspitrans8(0x04);
-        SETSS;
-
-        //Load the jamming packet.
-        //Note: attempts to preload this actually slowed the jam time down from 7 to 9 bytes.
-        CLRSS;
-        ccspitrans8(CCSPI_TXFIFO);
-        char pkt[15] = {0x0f, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0};
-        //char pkt[12] = {0x0c, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef};
-        for(i=0;i<pkt[0];i++)
-          ccspitrans8(pkt[i]);
-        SETSS;
-
-        //Transmit the packet.
-        CLRSS;
-        ccspitrans8(0x04); //STXON
-        SETSS;
-        msdelay(100);      //Instead of waiting for pulse on SFD
-        //Flush TX buffer.
-        CLRSS;
-        ccspitrans8(0x09); //SFLUSHTX
-        SETSS;
-
-        //Turn off LED 2 (green) as signal
-           PLED2DIR |= PLED2PIN;
-           PLED2OUT |= PLED2PIN;
-    }
-    //TODO the firmware stops staying in this mode after a while, and stops jamming... need to find a fix.
+    ccspireflexjam();
     break;
-#else
-    debugstr("Can't reflexively jam without SFD, FIFO, FIFOP, and P2LEDx definitions - try using telosb platform.");
-    txdata(app,NOK,0);
-#endif
 
   case CCSPI_REFLEX_AUTOACK:
 #if defined(FIFOP) && defined(SFD) && defined(FIFO) && defined(PLED2DIR) && defined(PLED2PIN) && defined(PLED2OUT)