Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of LoRaWAN-lib by
Revision 10:46e4f4e97454, committed 2017-04-21
- Comitter:
- mluis
- Date:
- Fri Apr 21 15:26:41 2017 +0000
- Parent:
- 9:d2da17dee1e2
- Commit message:
- Synchronized with https://github.com/Lora-net/LoRaMac-node git revision e506c246652fa44c3f24cecb89d0707b49ece739
Changed in this revision
LoRaMac.cpp | Show annotated file Show diff for this revision Revisions of this file |
LoRaMac.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/LoRaMac.cpp Tue Apr 04 11:40:18 2017 +0000 +++ b/LoRaMac.cpp Fri Apr 21 15:26:41 2017 +0000 @@ -1112,11 +1112,6 @@ OnAckTimeoutTimerEvent( ); } - if( ( RxSlot == 0 ) && ( LoRaMacDeviceClass == CLASS_C ) ) - { - OnRxWindow2TimerEvent( ); - } - LoRaMacFlags.Bits.McpsInd = 1; LoRaMacFlags.Bits.MacDone = 1; @@ -1166,10 +1161,7 @@ McpsIndication.DownLinkCounter = 0; McpsIndication.McpsIndication = MCPS_UNCONFIRMED; - if( LoRaMacDeviceClass != CLASS_C ) - { - Radio.Sleep( ); - } + Radio.Sleep( ); TimerStop( &RxWindowTimer2 ); macHdr.Value = payload[pktHeaderLen++]; @@ -1376,6 +1368,10 @@ ( DownLinkCounter != 0 ) ) { // Duplicated confirmed downlink. Skip indication. + // In this case, the MAC layer shall accept the MAC commands + // which are included in the downlink retransmission. + // It should not provide the same frame to the application + // layer again. skipIndication = true; } } @@ -1396,6 +1392,23 @@ DownLinkCounter = downLinkCounter; } + // This must be done before parsing the payload and the MAC commands. + // We need to reset the MacCommandsBufferIndex here, since we need + // to take retransmissions and repititions into account. Error cases + // will be handled in function OnMacStateCheckTimerEvent. + if( McpsConfirm.McpsRequest == MCPS_CONFIRMED ) + { + if( fCtrl.Bits.Ack == 1 ) + {// Reset MacCommandsBufferIndex when we have received an ACK. + MacCommandsBufferIndex = 0; + } + } + else + {// Reset the variable if we have received any valid frame. + MacCommandsBufferIndex = 0; + } + + // Process payload and MAC commands if( ( ( size - 4 ) - appPayloadStartIndex ) > 0 ) { port = payload[appPayloadStartIndex++]; @@ -1405,6 +1418,7 @@ if( port == 0 ) { + // Only allow frames which do not have fOpts if( fCtrl.Bits.FOptsLen == 0 ) { LoRaMacPayloadDecrypt( payload + appPayloadStartIndex, @@ -1479,8 +1493,11 @@ TimerStop( &AckTimeoutTimer ); } } - LoRaMacFlags.Bits.McpsInd = 1; } + // Provide always an indication, skip the callback to the user application, + // in case of a confirmed downlink retransmission. + LoRaMacFlags.Bits.McpsInd = 1; + LoRaMacFlags.Bits.McpsIndSkip = skipIndication; } else { @@ -1508,11 +1525,6 @@ PrepareRxDoneAbort( ); break; } - - if( ( RxSlot == 0 ) && ( LoRaMacDeviceClass == CLASS_C ) ) - { - OnRxWindow2TimerEvent( ); - } LoRaMacFlags.Bits.MacDone = 1; // Trig OnMacCheckTimerEvent call as soon as possible @@ -1613,6 +1625,7 @@ { // Stop transmit cycle due to tx timeout. LoRaMacState &= ~LORAMAC_TX_RUNNING; + MacCommandsBufferIndex = 0; McpsConfirm.NbRetries = AckTimeoutRetriesCounter; McpsConfirm.AckReceived = false; McpsConfirm.TxTimeOnAir = 0; @@ -1636,7 +1649,7 @@ } else { - if( ( JoinRequestTrials >= MaxJoinRequestTrials ) ) + if( JoinRequestTrials >= MaxJoinRequestTrials ) { LoRaMacState &= ~LORAMAC_TX_RUNNING; } @@ -1652,9 +1665,15 @@ {// Procedure for all other frames if( ( ChannelsNbRepCounter >= LoRaMacParams.ChannelsNbRep ) || ( LoRaMacFlags.Bits.McpsInd == 1 ) ) { + if( LoRaMacFlags.Bits.McpsInd == 0 ) + { // Maximum repititions without downlink. Reset MacCommandsBufferIndex. Increase ADR Ack counter. + // Only process the case when the MAC did not receive a downlink. + MacCommandsBufferIndex = 0; + AdrAckCounter++; + } + ChannelsNbRepCounter = 0; - AdrAckCounter++; if( IsUpLinkCounterFixed == false ) { UpLinkCounter++; @@ -1699,17 +1718,17 @@ { LoRaMacParams.ChannelsDatarate = MAX( LoRaMacParams.ChannelsDatarate - 1, LORAMAC_TX_MIN_DATARATE ); } - if( ValidatePayloadLength( LoRaMacTxPayloadLen, LoRaMacParams.ChannelsDatarate, MacCommandsBufferIndex ) == true ) + // Try to send the frame again + if( ScheduleTx( ) == LORAMAC_STATUS_OK ) { LoRaMacFlags.Bits.MacDone = 0; - // Sends the same frame again - ScheduleTx( ); } else { // The DR is not applicable for the payload size McpsConfirm.Status = LORAMAC_EVENT_INFO_STATUS_TX_DR_PAYLOAD_SIZE_ERROR; + MacCommandsBufferIndex = 0; LoRaMacState &= ~LORAMAC_TX_RUNNING; NodeAckRequested = false; McpsConfirm.AckReceived = false; @@ -1740,6 +1759,7 @@ #endif LoRaMacState &= ~LORAMAC_TX_RUNNING; + MacCommandsBufferIndex = 0; NodeAckRequested = false; McpsConfirm.AckReceived = false; McpsConfirm.NbRetries = AckTimeoutRetriesCounter; @@ -1769,6 +1789,7 @@ LoRaMacFlags.Bits.MlmeReq = 0; } + // Procedure done. Reset variables. LoRaMacFlags.Bits.MacDone = 0; } else @@ -1780,7 +1801,15 @@ if( LoRaMacFlags.Bits.McpsInd == 1 ) { - LoRaMacPrimitives->MacMcpsIndication( &McpsIndication ); + if( LoRaMacDeviceClass == CLASS_C ) + {// Activate RX2 window for Class C + OnRxWindow2TimerEvent( ); + } + if( LoRaMacFlags.Bits.McpsIndSkip == 0 ) + { + LoRaMacPrimitives->MacMcpsIndication( &McpsIndication ); + } + LoRaMacFlags.Bits.McpsIndSkip = 0; LoRaMacFlags.Bits.McpsInd = 0; } } @@ -2282,7 +2311,7 @@ } if( AdrAckCounter >= ( ADR_ACK_LIMIT + ADR_ACK_DELAY ) ) { - if( ( AdrAckCounter % ADR_ACK_DELAY ) == 0 ) + if( ( AdrAckCounter % ADR_ACK_DELAY ) == 1 ) { #if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) if( datarate > LORAMAC_TX_MIN_DATARATE ) @@ -2902,10 +2931,6 @@ RxWindow2Delay = LoRaMacParams.ReceiveDelay2 + RxWindowsParams[1].RxOffset; } - // MacCommandsBufferIndex variable is reset here because we now have - // managed all uplink & downlink parameters. - MacCommandsBufferIndex = 0; - // Schedule transmission of frame if( dutyCycleTimeOff == 0 ) { @@ -3047,17 +3072,7 @@ LoRaMacParams.ChannelsTxPower = LoRaMacParamsDefaults.ChannelsTxPower; LoRaMacParams.ChannelsDatarate = LoRaMacParamsDefaults.ChannelsDatarate; - LoRaMacParams.SystemMaxRxError = LoRaMacParamsDefaults.SystemMaxRxError; - LoRaMacParams.MinRxSymbols = LoRaMacParamsDefaults.MinRxSymbols; - LoRaMacParams.MaxRxWindow = LoRaMacParamsDefaults.MaxRxWindow; - LoRaMacParams.ReceiveDelay1 = LoRaMacParamsDefaults.ReceiveDelay1; - LoRaMacParams.ReceiveDelay2 = LoRaMacParamsDefaults.ReceiveDelay2; - LoRaMacParams.JoinAcceptDelay1 = LoRaMacParamsDefaults.JoinAcceptDelay1; - LoRaMacParams.JoinAcceptDelay2 = LoRaMacParamsDefaults.JoinAcceptDelay2; - LoRaMacParams.Rx1DrOffset = LoRaMacParamsDefaults.Rx1DrOffset; - LoRaMacParams.ChannelsNbRep = LoRaMacParamsDefaults.ChannelsNbRep; - LoRaMacParams.Rx2Channel = LoRaMacParamsDefaults.Rx2Channel; memcpy1( ( uint8_t* ) LoRaMacParams.ChannelsMask, ( uint8_t* ) LoRaMacParamsDefaults.ChannelsMask, sizeof( LoRaMacParams.ChannelsMask ) ); @@ -3188,7 +3203,6 @@ { MacCommandsInNextTx = true; } - MacCommandsBufferIndex = 0; if( ( payload != NULL ) && ( LoRaMacTxPayloadLen > 0 ) ) { @@ -3458,6 +3472,16 @@ } #endif + // Init parameters which are not set in function ResetMacParameters + LoRaMacParams.SystemMaxRxError = LoRaMacParamsDefaults.SystemMaxRxError; + LoRaMacParams.MinRxSymbols = LoRaMacParamsDefaults.MinRxSymbols; + LoRaMacParams.MaxRxWindow = LoRaMacParamsDefaults.MaxRxWindow; + LoRaMacParams.ReceiveDelay1 = LoRaMacParamsDefaults.ReceiveDelay1; + LoRaMacParams.ReceiveDelay2 = LoRaMacParamsDefaults.ReceiveDelay2; + LoRaMacParams.JoinAcceptDelay1 = LoRaMacParamsDefaults.JoinAcceptDelay1; + LoRaMacParams.JoinAcceptDelay2 = LoRaMacParamsDefaults.JoinAcceptDelay2; + LoRaMacParams.ChannelsNbRep = LoRaMacParamsDefaults.ChannelsNbRep; + ResetMacParameters( ); // Initialize timers @@ -4487,7 +4511,7 @@ rxConfigParams.Bandwidth = 2; break; } - + #if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) if( datarate == DR_7 ) { // FSK @@ -4505,4 +4529,3 @@ return rxConfigParams; } -
--- a/LoRaMac.h Tue Apr 04 11:40:18 2017 +0000 +++ b/LoRaMac.h Fri Apr 21 15:26:41 2017 +0000 @@ -636,6 +636,10 @@ */ uint8_t McpsInd : 1; /*! + * MCPS-Ind pending. Skip indication to the application layer + */ + uint8_t McpsIndSkip : 1; + /*! * MLME-Req pending */ uint8_t MlmeReq : 1;