fixed preprocessor directives in ccspi, readded application to default compilation...
[goodfet] / firmware / apps / radios / ccspi.c
index 83dfa37..524052f 100644 (file)
@@ -12,7 +12,7 @@
 
 #include "platform.h"
 #include "command.h"
-
+#include <stdlib.h> //added for itoa
 #include <signal.h>
 #include <io.h>
 #include <iomacros.h>
@@ -188,10 +188,8 @@ void ccspi_handle_fn( uint8_t const app,
     break;
 
   case CCSPI_REFLEX:
-    debugstr("Beta implementation.");
-    cmddata[0] = 1;
-    txdata(app,verb,cmddata[0]+1);
-
+#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);
@@ -199,40 +197,108 @@ void ccspi_handle_fn( uint8_t const app,
            PLED2DIR |= PLED2PIN;
            PLED2OUT &= ~PLED2PIN;
 
-        //Switch the radio to TX mode
-        CLRSS;  //Drop !SS to begin transaction.
+        //Put radio in TX mode
+        CLRSS;
         ccspitrans8(0x04);
-        SETSS;  //Raise !SS to end transaction.
-        //txdata(app,verb,len);
+        SETSS;
 
-        //Load the packet.
+        //Load the jamming packet.
+        //TODO try to preload this to get faster effects
         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;
-        debugstr("Packet loaded for tx.");
+
         //Transmit the packet.
         CLRSS;
         ccspitrans8(0x04); //STXON
         SETSS;
-        //Wait for the pulse on SFD, after which the packet has been sent.
-        //while(!SFD);
-        //while(SFD);
-        msdelay(300);
+        msdelay(100);      //Instead of waiting for pulse on SFD
         //Flush TX buffer.
         CLRSS;
         ccspitrans8(0x09); //SFLUSHTX
         SETSS;
 
-        //while(SFD);
-        //msdelay(200);
         //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!
+    //TODO the firmware stops staying in this mode after a while, and stops jamming... need to find a fix.
+    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_SEQNUM:
+#if defined(FIFOP) && defined(SFD) && defined(FIFO) && defined(PLED2DIR) && defined(PLED2PIN) && defined(PLED2OUT)
+    //char byte[4];
+    while(1) {
+        //Has there been an overflow in the RX buffer?
+        //TODO do we really need to check this??
+        if((!FIFO)&&FIFOP){
+          //debugstr("Clearing overflow");
+          CLRSS;
+          ccspitrans8(0x08); //SFLUSHRX
+          SETSS;
+        }
+
+        //Wait until a packet is received
+        while(!SFD);
+        //Turn on LED 2 (green) as signal
+           PLED2DIR |= PLED2PIN;
+           PLED2OUT &= ~PLED2PIN;
+
+        //Get the orignally received packet, up to the seqnum field.
+        CLRSS;
+        ccspitrans8(CCSPI_RXFIFO | 0x40);
+        for(i=0;i<4;i++)
+            cmddata[i]=ccspitrans8(0xde);
+        SETSS;
+        //Flush RX buffer.
+        CLRSS;
+        ccspitrans8(0x08); //SFLUSHRX
+        SETSS;
+        //Send the sequence number of the jammed packet back to the client
+        //itoa(cmddata[3], byte, 16);
+        //debugstr(byte);
+        txdata(app,verb,cmddata[3]);
+
+        //Put radio in TX mode
+        CLRSS;
+        ccspitrans8(0x04);
+        SETSS;
+
+        //Load the packet.
+        CLRSS;
+        ccspitrans8(CCSPI_TXFIFO);
+        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(200);       //Instead of examining SFD line status
+        //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.
+#else
+    debugstr("Can't reflexively jam without SFD, FIFO, FIFOP, and P2LEDx definitions - try using telosb platform.");
+    txdata(app,NOK,0);
+#endif
     break;
 
   case CCSPI_TX_FLUSH:
@@ -281,6 +347,5 @@ void ccspi_handle_fn( uint8_t const app,
     txdata(app,verb,0);
     break;
   }
-  
 
 }