telosb reflexive jamming, beta version, confirmed works in some testing, improvements...
[goodfet] / firmware / apps / radios / ccspi.c
index f47e54c..83dfa37 100644 (file)
@@ -140,7 +140,7 @@ void ccspi_handle_fn( uint8_t const app,
     break;
   case CCSPI_RX:
 #ifdef FIFOP
-     //Has there been an overflow?
+    //Has there been an overflow?
     if((!FIFO)&&FIFOP){
       debugstr("Clearing overflow");
       CLRSS;
@@ -159,14 +159,16 @@ void ccspi_handle_fn( uint8_t const app,
       //ccspitrans8(0x3F|0x40);
       cmddata[0]=0xff; //to be replaced with length
       for(i=0;i<cmddata[0]+2;i++)
-       cmddata[i]=ccspitrans8(0xde);
+        cmddata[i]=ccspitrans8(0xde);
       SETSS;
       
       //Flush buffer.
       CLRSS;
       ccspitrans8(0x08); //SFLUSHRX
       SETSS;
-      txdata(app,verb,cmddata[0]+2);
+      //Only should transmit length of one more than the reported
+      // length of the frame, which holds the length byte:
+      txdata(app,verb,cmddata[0]+1);
     }else{
       //No packet.
       txdata(app,verb,0);
@@ -184,12 +186,57 @@ void ccspi_handle_fn( uint8_t const app,
     
     txdata(app,verb,0);
     break;
+
   case CCSPI_REFLEX:
-    debugstr("Coming soon.");
-    txdata(app,verb,0);
+    debugstr("Beta implementation.");
+    cmddata[0] = 1;
+    txdata(app,verb,cmddata[0]+1);
+
+    while(1) {
+        //Wait until a packet is received
+        while(!SFD);
+        //Turn on LED 2 (green) as signal
+           PLED2DIR |= PLED2PIN;
+           PLED2OUT &= ~PLED2PIN;
+
+        //Switch the radio to TX mode
+        CLRSS;  //Drop !SS to begin transaction.
+        ccspitrans8(0x04);
+        SETSS;  //Raise !SS to end transaction.
+        //txdata(app,verb,len);
+
+        //Load the packet.
+        CLRSS;
+        ccspitrans8(CCSPI_TXFIFO);
+        char pkt[15] = {0x0f, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0};
+        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);
+        //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!
     break;
+
   case CCSPI_TX_FLUSH:
-     //Flush the buffer.
+    //Flush the buffer.
     CLRSS;
     ccspitrans8(CCSPI_SFLUSHTX);
     SETSS;
@@ -199,16 +246,6 @@ void ccspi_handle_fn( uint8_t const app,
   case CCSPI_TX:
 #ifdef FIFOP
     
-    /* //Has there been an overflow?
-    if(ccspi_status()&BIT5){
-      debugstr("Clearing underflow");
-      CLRSS;
-      ccspitrans8(0x09); //SFLUSHTX
-      SETSS;
-    } 
-    */
-    
-        
     //Wait for last packet to TX.
     //while(ccspi_status()&BIT3);
     
@@ -224,6 +261,14 @@ void ccspi_handle_fn( uint8_t const app,
     ccspitrans8(0x04); //STXON
     SETSS;
     
+    //Wait for the pulse on SFD, after which the packet has been sent.
+    while(!SFD);
+    while(SFD);
+    
+    //Flush TX buffer.
+    CLRSS;
+    ccspitrans8(0x09); //SFLUSHTX
+    SETSS;
     
     txdata(app,verb,0);
 #else