Fork of Semtech LoRaWAN stack

Fork of LoRaWAN-lib by canuck lehead

Files at this revision

API Documentation at this revision

Comitter:
ubhat
Date:
Mon Sep 19 09:45:15 2016 +0000
Branch:
v4.2.0
Parent:
19:838d3e8dffc6
Child:
21:4ccde8ee9ac8
Commit message:
Fix for data-rate adaptation during message retransmission of confirmed frames; When 125kHz channel enable mask is present, check for minimum number of 125kHz channels to comply with FCC

Changed in this revision

LoRaMac.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/LoRaMac.cpp	Thu Sep 15 19:47:38 2016 +0000
+++ b/LoRaMac.cpp	Mon Sep 19 09:45:15 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"
 
@@ -41,6 +41,17 @@
 #define LORA_MAC_FRMPAYLOAD_OVERHEAD                13 // MHDR(1) + FHDR(7) + Port(1) + MIC(4)
 
 /*!
+ * Minimum number of available channels in Frequency Hopping Mode
+ */
+#define FRQ_HOP_CHNLS_MIN 50
+
+/*!
+ * Minimum number of available channels in Hybrid Mode
+ */
+#define HYBRD_CHNLS_MIN 4
+
+
+/*!
  * Device IEEE EUI
  */
 static uint8_t *LoRaMacDevEui;
@@ -2230,7 +2241,7 @@
     }
     else
     {
-        if( CountNbEnabled125kHzChannels( ChannelsMask ) < 50 )
+        if( CountNbEnabled125kHzChannels( ChannelsMask ) < FRQ_HOP_CHNLS_MIN )
         {// Limit tx power to max 21dBm
             resultTxPower = MAX( txPower, TX_POWER_20_DBM );
         }
@@ -2748,7 +2759,7 @@
             status &= 0xFD;  // Datarate KO
         }
 
-        if( CountNbEnabled125kHzChannels( channelsMask ) < 6 )
+        if( ( CountNbEnabled125kHzChannels( channelsMask ) > 0 ) && ( CountNbEnabled125kHzChannels( channelsMask ) < HYBRD_CHNLS_MIN ) )
         {
             status &= 0xFE; // Channel mask KO
         }
@@ -2764,6 +2775,7 @@
         if( ( status & 0x07 ) == 0x07 )
         {
             ChannelsDatarate = datarate;
+			ChannelsDefaultDatarate = datarate;
             ChannelsTxPower = txPower;
 
             ChannelsMask[0] = channelsMask[0];
@@ -3547,7 +3559,7 @@
 #endif
                 if( chanMaskState == true )
                 {
-                    if( ( CountNbEnabled125kHzChannels( mibSet->Param.ChannelsMask ) < 6 ) &&
+                    if( ( CountNbEnabled125kHzChannels( mibSet->Param.ChannelsMask ) < HYBRD_CHNLS_MIN ) &&
                         ( CountNbEnabled125kHzChannels( mibSet->Param.ChannelsMask ) > 0 ) )
                     {
                         status = LORAMAC_STATUS_PARAMETER_INVALID;