Fork of Semtech LoRaWAN stack

Fork of LoRaWAN-lib by canuck lehead

Branch:
v4.2.0
Revision:
13:90a55bd536a1
Parent:
12:d09ccf69cc93
Child:
14:60c5d589a070
--- a/LoRaMac.cpp	Mon Aug 29 14:28:26 2016 -0400
+++ b/LoRaMac.cpp	Mon Aug 29 16:41:53 2016 -0400
@@ -1509,18 +1509,7 @@
 #if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
                 // Re-enable default channels LC1, LC2, LC3
                 ChannelsMask[0] = ChannelsMask[0] | ( LC( 1 ) + LC( 2 ) + LC( 3 ) );
-#elif defined( USE_BAND_915 )
-                // Re-enable default channels
-                ChannelsMask[0] = 0xFFFF;
-                ChannelsMask[1] = 0xFFFF;
-                ChannelsMask[2] = 0xFFFF;
-                ChannelsMask[3] = 0xFFFF;
-                ChannelsMask[4] = 0x00FF;
-                ChannelsMask[5] = 0x0000;
-#elif defined( USE_BAND_915_HYBRID )
-                // Re-enable default channels
-                ReenableChannels( ChannelsMask[4], ChannelsMask );
-#else
+#elif !defined( USE_BAND_915 ) && !defined( USE_BAND_915_HYBRID )
     #error "Please define a frequency band in the compiler options."
 #endif
                 LoRaMacState &= ~MAC_TX_RUNNING;
@@ -2665,19 +2654,34 @@
     // Process accumulated Link ADR channel mask changes
     if( validLinkAdrCmds > 0 ) 
     {
+        uint8_t drOkCounter = 0;
+
 #if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
         for(uint8_t i=0; i< 6; i++)
         {
             for( uint8_t j = 0; j < 16; j++ )
             {
-                if( ( ( channelsMask[i] & ( 1 << j ) ) != 0 ) && ( Channels[i * 16 + j].Frequency == 0 ) )
-                {// Trying to enable an undefined channel
-                    linkAdrStatus &= 0xFE; // Channel mask KO
-                    break;
+                if( ( channelsMask[i] & ( 1 << j ) ) != 0 ) 
+                {
+                    if ( ( Channels[i * 16 + j].Frequency == 0 ) )
+                    {
+                        linkAdrStatus &= 0xFE; // Channel mask KO
+                        break;
+                    }
+                    else if( ( datarate >= Channels[i * 16 + j].DrRange.Fields.Min ) &&
+                             ( datarate <= Channels[i * 16 + j].DrRange.Fields.Max ) ) 
+                    {
+                        drOkCounter++;
+                    }
                 }
             }
         }
 
+        if ( drOkCounter == 0 )
+        {
+            linkAdrStatus &= 0xFD;  // Datarate KO
+        }
+
         if( CountNbEnabled125kHzChannels( channelsMask ) < 6 )
         {
             linkAdrStatus &= 0xFE; // Channel mask KO