Fork of Semtech LoRaWAN stack
Fork of LoRaWAN-lib by
Diff: LoRaMac.cpp
- Branch:
- v4.2.0
- Revision:
- 18:5ccaea55a881
- Parent:
- 17:fca344a6ff18
- Child:
- 19:838d3e8dffc6
--- a/LoRaMac.cpp Wed Sep 14 02:53:13 2016 +0000
+++ b/LoRaMac.cpp Thu Sep 15 15:39:41 2016 -0400
@@ -1837,7 +1837,7 @@
{
Join500KHzRemaining &= ~(1 << curChannel);
channel = 64 + curChannel;
- if( ( Join500KHzRemaining == 0 ) )
+ if( Join500KHzRemaining == 0 )
{
Join500KHzRemaining = 0xFF;
}
@@ -2418,11 +2418,11 @@
static void ProcessMacCommands( uint8_t *payload, uint8_t macIndex, uint8_t commandsSize, uint8_t snr )
{
uint8_t validLinkAdrCmds = 0;
- uint8_t linkAdrStatus = 0x07;
int8_t txPower = 0;
int8_t datarate = 0;
uint8_t nbRep = 0;
uint16_t channelsMask[6] = {0,0,0,0,0,0};
+ uint8_t LinkAdrMacCmdBufferIndex = 0;
while( macIndex < commandsSize )
{
@@ -2437,6 +2437,7 @@
case SRV_MAC_LINK_ADR_REQ:
{
uint8_t chMaskCntl = 0;
+ uint8_t status = 0x07;
uint16_t chMask;
datarate = payload[macIndex++];
@@ -2477,13 +2478,13 @@
#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
if( ( chMaskCntl == 0 ) && ( chMask == 0 ) )
{
- linkAdrStatus &= 0xFE; // Channel mask KO
+ status &= 0xFE; // Channel mask KO
}
else if( ( ( chMaskCntl >= 1 ) && ( chMaskCntl <= 5 )) ||
( chMaskCntl >= 7 ) )
{
// RFU
- linkAdrStatus &= 0xFE; // Channel mask KO
+ status &= 0xFE; // Channel mask KO
}
else
{
@@ -2512,11 +2513,6 @@
{
channelsMask[chMaskCntl] = chMask;
}
- else if( chMaskCntl == 5 )
- {
- // RFU
- linkAdrStatus &= 0xFE; // Channel mask KO
- }
else if( chMaskCntl == 6 )
{
// Enable all 125 kHz channels
@@ -2542,14 +2538,20 @@
channelsMask[3] = 0x0000;
// channel mask applied to 500 kHz channels
- channelsMask[4] = chMask;
+ channelsMask[4] = chMask;
+ chMaskCntl = 4;
+ }
+ else
+ {
+ // RFU
+ status &= 0xFE; // Channel mask KO
}
#else
#error "Please define a frequency band in the compiler options."
#endif
if( ValueInRange( datarate, LORAMAC_TX_MIN_DATARATE, LORAMAC_TX_MAX_DATARATE ) == false )
{
- linkAdrStatus &= 0xFD; // Datarate KO
+ status &= 0xFD; // Datarate KO
}
//
@@ -2557,8 +2559,14 @@
//
if( ValueInRange( txPower, LORAMAC_MAX_TX_POWER, LORAMAC_MIN_TX_POWER ) == false )
{
- linkAdrStatus &= 0xFB; // TxPower KO
- }
+ status &= 0xFB; // TxPower KO
+ }
+
+
+ // Save the mac command status location for possible channel mask KO later
+ LinkAdrMacCmdBufferIndex = MacCommandsBufferIndex;
+
+ AddMacCommand( MOTE_MAC_LINK_ADR_ANS, status, 0 );
}
break;
case SRV_MAC_DUTY_CYCLE_REQ:
@@ -2586,7 +2594,6 @@
{
status &= 0xFE; // Channel frequency KO
}
-
if( ValueInRange( datarate, LORAMAC_RX_MIN_DATARATE, LORAMAC_RX_MAX_DATARATE ) == false )
{
@@ -2714,6 +2721,7 @@
if( validLinkAdrCmds > 0 )
{
uint8_t drOkCounter = 0;
+ uint8_t status = 0x07;
#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
for(uint8_t i=0; i< 6; i++)
@@ -2724,7 +2732,7 @@
{
if ( ( Channels[i * 16 + j].Frequency == 0 ) )
{
- linkAdrStatus &= 0xFE; // Channel mask KO
+ status &= 0xFE; // Channel mask KO
break;
}
else if( ( datarate >= Channels[i * 16 + j].DrRange.Fields.Min ) &&
@@ -2738,23 +2746,23 @@
if ( drOkCounter == 0 )
{
- linkAdrStatus &= 0xFD; // Datarate KO
+ status &= 0xFD; // Datarate KO
}
if( CountNbEnabled125kHzChannels( channelsMask ) < 6 )
{
- linkAdrStatus &= 0xFE; // Channel mask KO
+ status &= 0xFE; // Channel mask KO
}
#if defined( USE_BAND_915_HYBRID )
if( ValidateChannelMask( channelsMask ) == false )
{
- linkAdrStatus &= 0xFE; // Channel mask KO
+ status &= 0xFE; // Channel mask KO
}
#endif
#endif
- if( ( linkAdrStatus & 0x07 ) == 0x07 )
+ if( ( status & 0x07 ) == 0x07 )
{
ChannelsDatarate = datarate;
ChannelsTxPower = txPower;
@@ -2766,12 +2774,18 @@
ChannelsMask[4] = channelsMask[4];
ChannelsMask[5] = channelsMask[5];
- ChannelsNbRep = nbRep;
-
+ ChannelsNbRep = nbRep;
+
+ // Clear remaining channels mask
memcpy1( ( uint8_t* ) ChannelsMaskRemaining, ( uint8_t* ) ChannelsMask, 10 );
}
-
- AddMacCommand( MOTE_MAC_LINK_ADR_ANS, linkAdrStatus, 0 );
+ // Channel Mask KO
+ else
+ {
+ // Update the last Link ADR status with channel mask KO
+ if( (LinkAdrMacCmdBufferIndex+1 ) < LORA_MAC_COMMAND_MAX_LENGTH )
+ MacCommandsBuffer[LinkAdrMacCmdBufferIndex+1] &= status;
+ }
}
}
@@ -4104,8 +4118,8 @@
return 0;
// Normalize system time values to seconds
- uptime = TimerGetCurrentTime( ) / 1e3;
- lastJoinTime = LastJoinTxTime / 1e3;
+ uptime = TimerGetCurrentTime( ) / 1e6;
+ lastJoinTime = LastJoinTxTime / 1e6;
// Get dutycycle for current time
prevDCycleEndTime = 0;
@@ -4151,7 +4165,10 @@
}
- return ( timeOff * 1e6);
+ if(timeOff > JOIN_RETRANSMISSION_DC_WAIT_MAX)
+ timeOff = JOIN_RETRANSMISSION_DC_WAIT_MAX;
+
+ return ( timeOff * 1e6 );
}
void LoRaMacTestRxWindowsOn( bool enable )
