Fork of Semtech LoRaWAN stack

Fork of LoRaWAN-lib by canuck lehead

Files at this revision

API Documentation at this revision

Comitter:
ubhat
Date:
Tue Sep 06 11:02:17 2016 +0000
Branch:
v4.2.0
Parent:
13:90a55bd536a1
Child:
15:167ad88b7272
Commit message:
Join channel frequency settings

Changed in this revision

LoRaMac.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/LoRaMac.cpp	Mon Aug 29 16:41:53 2016 -0400
+++ b/LoRaMac.cpp	Tue Sep 06 11:02:17 2016 +0000
@@ -15,7 +15,7 @@
 
 License: Revised BSD License, see LICENSE.TXT file include in the project
 
-Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jäckle ( STACKFORCE )
+Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jäckle ( STACKFORCE )
 */
 #include "board.h"
 
@@ -1760,21 +1760,32 @@
             uint8_t curBlock = (block + i) % 8;
             uint8_t chMask;
 
-            // Cycle through all blocks before using a previously used block 
-            if( ( JoinBlocksRemaining == 0 ) || ( ( JoinBlocksRemaining & ( 1 <<  curBlock ) ) != 0) ) 
+            // Cycle through all blocks before using a previously used block             
+            if( ( ( JoinBlocksRemaining & ( 1 <<  curBlock ) ) != 0) ) 
             {
                 chMask = ( ChannelsMaskRemaining[curBlock/2] >> ( curBlock & 1 ? 8 : 0 ) ) & 0xff; 
                 if( chMask != 0)
                 { 
                     channel = randr(0, 7); 
                     for(uint8_t i = 0; ( i < 8 ); i++)
-                    {
+                    {                       
                         if( ( chMask & ( 1 << channel ) ) != 0 )
                         {
+                            uint16_t chMaskTmp = ( 1 << channel );
+                            chMaskTmp = chMaskTmp << ( curBlock & 1 ? 8 : 0 );
                             channel = channel + ( curBlock * 8 );
-                            JoinBlocksRemaining &= ~(1 << curBlock);
+                            JoinBlocksRemaining &= ~(1 << curBlock);                                                        
+                            ChannelsMaskRemaining[curBlock/2] &= ~chMaskTmp;                            
+                            if( ( JoinBlocksRemaining == 0 ) )
+                            {
+                                JoinBlocksRemaining = 0xFF;
+                            }                           
                             break;
                         }
+                        else
+                        {
+                            channel = ( channel + 1 ) % 8;
+                        }
                     }
                 }
             }
@@ -1795,11 +1806,15 @@
         for(i = 0; i < 8; i++)
         {
             uint8_t curChannel = (channel + i) % 8;
-
-            if( ( Join500KHzRemaining == 0 ) || ( ( Join500KHzRemaining & ( 1 << curChannel ) ) != 0 ) )
+            
+            if( ( ( Join500KHzRemaining & ( 1 << curChannel ) ) != 0 ) )
             {
+                Join500KHzRemaining &= ~(1 << curChannel);
                 channel = 64 + curChannel;
-                Join500KHzRemaining &= ~(1 << channel);
+                if( ( Join500KHzRemaining == 0 ) )
+                {
+                    Join500KHzRemaining = 0xFF;
+                }
                 break;
             }
         }
@@ -1920,7 +1935,7 @@
         delayTx++;
         nextTxDelay = AggregatedTimeOff - TimerGetElapsedTime( AggregatedLastTxDoneTime );
     }
-
+    
     if( nbEnabledChannels > 0 )
     {
 #if defined( USE_BAND_915 ) 
@@ -2976,7 +2991,7 @@
     McpsConfirm.TxPower = txPowerIndex;
 
     Radio.SetChannel( channel.Frequency );
-
+    
 #if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
     if( ChannelsDatarate == DR_7 )
     { // High Speed FSK channel