Author: jaguarondi
Date: 2008-08-22 12:10:38 +0200 (Fri, 22 Aug 2008)
New Revision: 1570

Modified:
   firmware/rf/trunk/main.c
   firmware/rf/trunk/prot.c
   firmware/rf/trunk/rf_ctrl.c
   firmware/rf/trunk/varis.c
   firmware/rf/trunk/varis.h
Log:
* First attempt at adaptative frequency hopping. It's probably buggy and I
  need to add some debug functions to trace what's going on.


Modified: firmware/rf/trunk/main.c
===================================================================
--- firmware/rf/trunk/main.c    2008-08-22 10:03:46 UTC (rev 1569)
+++ firmware/rf/trunk/main.c    2008-08-22 10:10:38 UTC (rev 1570)
@@ -107,10 +107,25 @@
     /* Main loop */
     for(;;)
     {
+        uint8_t i;
         if (disconnected_flag)
         {
             disconnected_flag = false;
             system_start_up();
         }
+        for (i=0; i<AFH_RANGE; i++)
+        {
+            if (AFH_collision[i] > AFH_COLL_TRSH)
+            {
+                AFH_collision[i] = -AFH_COLL_TRSH;
+                AFH_freq[i] += CHANNEL_JUMP;
+                if (AFH_freq[i] > CHANNEL_MAX)
+                {
+                    AFH_freq[i] -= NUMBER_OF_CHANNELS;
+                }
+            }
+            if (AFH_prescaler == 0 && AFH_collision[i] > 0)
+                AFH_collision[i]--;
+        }
     }
 }

Modified: firmware/rf/trunk/prot.c
===================================================================
--- firmware/rf/trunk/prot.c    2008-08-22 10:03:46 UTC (rev 1569)
+++ firmware/rf/trunk/prot.c    2008-08-22 10:10:38 UTC (rev 1570)
@@ -68,89 +68,100 @@
  * M/S starts in SLAVE mode then switch to MASTER if no masters are found
  * within a certain time.
  */
+
+    /* Initialize the frequency table */
+    uint8_t k;
+    for (k=0; k<AFH_RANGE; k++)
+    {
+        AFH_freq[k] = k;
+    }
+
 /* SLAVE or M/S */
 #ifndef _MASTER
-       uint8_t tmp;
-       uint16_t j;
+    uint8_t tmp;
+    uint16_t j;
 
-        pwr_dwn_atr2406();
-        wait_n_10us(250);//wait
+    pwr_dwn_atr2406();
+    wait_n_10us(250);//wait
 
-       uint8_t i = 0;
+#if defined(HOPPING)
+    uint8_t channel_idx = 0;
+#endif
 #ifdef _SLAVE /* SLAVE mode */
-        /* We loop until a master is found */
-        for(;;){
+    /* We loop until a master is found */
+    for(;;){
 #else /* M/S mode */
         /* If a master is not found, we skip and become master. */
-        for(i=0;i<3;i++){
+    uint8_t i;
+    for(i=0;i<3;i++){
 #endif
-            /* Disable UART */
-            UCSR0A = 0x00;
-            UCSR0B = 0x00;
-            UCSR0C = 0x00;
+        /* Disable UART */
+        UCSR0A = 0x00;
+        UCSR0B = 0x00;
+        UCSR0C = 0x00;
 
-            pwr_up_atr2406();//apply power to ATR2406
-            wait_n_10us(4);//wait for 40us
+        pwr_up_atr2406();//apply power to ATR2406
+        wait_n_10us(4);//wait for 40us
 
-            //scan channel 0 for 89*2*slottime  = 200ms
-            //scan channel 40 for 89*2*slottime = 200ms
-            //scan channel 80 for 89*2*slottime = 200ms
+        //scan channel 0 for 89*2*slottime  = 200ms
+        //scan channel 40 for 89*2*slottime = 200ms
+        //scan channel 80 for 89*2*slottime = 200ms
 #if defined(NOHOPP)
-            channel = TRX_CHANNEL;
+        channel = TRX_CHANNEL;
 #elif defined(HOPPING)
-            /* Scan different channels in case some are clogged-up */
-            i = (i+1) % 3;
-            channel = 0x00 + i*40;
+        /* Scan different channels in case some are clogged-up */
+        channel_idx = (cnt+1) % 3;
+        channel = 0x00 + i*40;
 #elif defined(AFH)
-            /* Scan different channels in case some are clogged-up */
-            AFH_index = (AFH_index+1) % AFH_RANGE;
-            channel = AFH_freq[AFH_index];
+        /* Scan different channels in case some are clogged-up */
+        AFH_index = (AFH_index+1) % AFH_RANGE;
+        channel = AFH_freq[AFH_index];
 #endif
 
-            sof_ary[0] = channel;
-            init_atr2406(channel,RXEN);//configure ATR2406 to desired channel
-            DDRD &= 0xEF;//XCK PIN set to input!!
-            wait_n_10us(37);//wait for 370us
-            set_rxon();//power up RF-Chip in receive mode
-            wait_n_10us(5);//wait for 50us
-            checksum = 0x00;
-            UCSR0A = 0x00;
-            UCSR0B = 0x90;
-            /* Enable RX UART. */
-            UCSR0C = 0x46;
-            for(tmp=0;tmp<POLL_LOOPS;tmp++){
-                start_rf_timer_scanning();
-                rf_rx_state = 0;
-                do{
-                    if(rf_rx_state==0xFF){//something received
-                        if(checksum==0x00){//correct received
-                            //pwr_dwn_atr2406();
-                            rf_rx_state = 0x00;
+        sof_ary[0] = channel;
+        init_atr2406(channel,RXEN);//configure ATR2406 to desired channel
+        DDRD &= 0xEF;//XCK PIN set to input!!
+        wait_n_10us(37);//wait for 370us
+        set_rxon();//power up RF-Chip in receive mode
+        wait_n_10us(5);//wait for 50us
+        checksum = 0x00;
+        UCSR0A = 0x00;
+        UCSR0B = 0x90;
+        /* Enable RX UART. */
+        UCSR0C = 0x46;
+        for(tmp=0;tmp<POLL_LOOPS;tmp++){
+            start_rf_timer_scanning();
+            rf_rx_state = 0;
+            do{
+                if(rf_rx_state==0xFF){//something received
+                    if(checksum==0x00){//correct received
+                        //pwr_dwn_atr2406();
+                        rf_rx_state = 0x00;
 
-                            j = TCNT1;
-                            /* XXX have to change this so ts isn't global 
anymore */
-                            j = j - ts;
-                            /* Changing prescaler!! */
-                            j = j << 3;
-                            OCR1A = T_SYNC - j;
-                            start_rf_timer();
-                            return;
-                        }
+                        j = TCNT1;
+                        /* XXX have to change this so ts isn't global anymore 
*/
+                        j = j - ts;
+                        /* Changing prescaler!! */
+                        j = j << 3;
+                        OCR1A = T_SYNC - j;
+                        start_rf_timer();
+                        return;
                     }
-                    /* XXX use the overflow interrupt and the same timer
-                     * settings as in normal mode. */
-                } while (TCNT1 < 43201); /* 200ms */
-            }
+                }
+                /* XXX use the overflow interrupt and the same timer
+                 * settings as in normal mode. */
+            } while (TCNT1 < 43201); /* 200ms */
         }
+    }
 #endif
 
-        /* MASTER mode. */
-       pwr_dwn_atr2406();
-       pwr_up_atr2406();
-       start_rf_timer();
-       UCSR0A = 0x00;
-       UCSR0B = 0x00;
-       UCSR0C = 0x00;
-        /* Enable RX UART */
-       OCR1A = 0x0020;
+    /* MASTER mode. */
+    pwr_dwn_atr2406();
+    pwr_up_atr2406();
+    start_rf_timer();
+    UCSR0A = 0x00;
+    UCSR0B = 0x00;
+    UCSR0C = 0x00;
+    /* Enable RX UART */
+    OCR1A = 0x0020;
 }

Modified: firmware/rf/trunk/rf_ctrl.c
===================================================================
--- firmware/rf/trunk/rf_ctrl.c 2008-08-22 10:03:46 UTC (rev 1569)
+++ firmware/rf/trunk/rf_ctrl.c 2008-08-22 10:10:38 UTC (rev 1570)
@@ -67,26 +67,25 @@
         /* We shouldn't power down at full rate */
         //pwr_dwn_atr2406();
 
-        if (rf_rx_state==0xFF)
+        AFH_prescaler++;
+        if (rf_rx_state==0xFF && checksum==0x00)
         {
-            set_link();
             /* Good frame received. */
+            set_link();
             connected = CONNECTED_TIMEOUT;
-            if (checksum==0x00)
-            {
-                /* Switch rx buffer */
-                uint8_t volatile *p = rf_buffer_rx;
-                rf_buffer_rx = rf_buffer_rx_full;
-                rf_buffer_rx_full = p;
-                //PORTD ^= 0x08; // XXX DEBUG
-                good_frame_received = true;
-            }
-            else
-                good_frame_received = false;
+            good_frame_received = true;
+
+            /* Switch rx buffer */
+            uint8_t volatile *p = rf_buffer_rx;
+            rf_buffer_rx = rf_buffer_rx_full;
+            rf_buffer_rx_full = p;
+            //PORTD ^= 0x08; // XXX DEBUG
         }
         else
         {
-            good_frame_received = false; /* or whatever value */
+            /* Didn't receive or wrong checksum */
+            good_frame_received = false;
+            AFH_collision[AFH_index]++;
             if (connected)
             {
                 if (!--connected)
@@ -183,7 +182,7 @@
     channel = TRX_CHANNEL;
 #elif defined(HOPPING)
     channel += CHANNEL_JUMP;
-    if(channel > CHANNEL_MAX)
+    if (channel > CHANNEL_MAX)
     {
         channel -= NUMBER_OF_CHANNELS;
     }

Modified: firmware/rf/trunk/varis.c
===================================================================
--- firmware/rf/trunk/varis.c   2008-08-22 10:03:46 UTC (rev 1569)
+++ firmware/rf/trunk/varis.c   2008-08-22 10:10:38 UTC (rev 1570)
@@ -77,9 +77,10 @@
 //variable holding the 4 Byte start of frame
 
 /* Frequency hopping frequency table */
-uint8_t AFH_freq[AFH_RANGE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 19, 11, 12};
-uint8_t AFH_collision[AFH_RANGE];
+uint8_t AFH_freq[AFH_RANGE];
 uint8_t AFH_index;
+int8_t AFH_collision[AFH_RANGE];
+uint8_t AFH_prescaler;
 
 
 volatile uint8_t channel;

Modified: firmware/rf/trunk/varis.h
===================================================================
--- firmware/rf/trunk/varis.h   2008-08-22 10:03:46 UTC (rev 1569)
+++ firmware/rf/trunk/varis.h   2008-08-22 10:10:38 UTC (rev 1570)
@@ -55,8 +55,10 @@
 
 #define AFH_RANGE 13
 extern uint8_t AFH_freq[AFH_RANGE];
-extern uint8_t AFH_collision[AFH_RANGE];
 extern uint8_t AFH_index;
+extern int8_t AFH_collision[AFH_RANGE];
+extern uint8_t AFH_prescaler;
+#define AFH_COLL_TRSH 100
 
 extern volatile uint8_t rf_buffer_tx[];
 extern uint8_t volatile *rf_buffer_rx;


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Tux-droid-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tux-droid-svn

Reply via email to