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.
LoRAWAN-lib is a port of the GitHub LoRaMac-node develop branch LoRaWAN MAC layer implementation.
This library depends on the SX1276Lib or SX1272Lib radio drivers depending on the used mbed component shield.
This library depends also on some cryptographic helper functions as well as helper functions for the timers management. These can be found on the example projects under the system directory.
The example projects are:
The LoRaWAN specification specifies different ISM bands operating parameters. These are all implemented under the LoRaMac-board.h file.
In order to select which band to use, please change line 24 of board.h file provided on the examples projects as follows:
EU868
board.h
#define USE_BAND_868
US915
board.h
#define USE_BAND_915
US915 - Hybrid
board.h
#define USE_BAND_915_HYBRID
CN780
board.h
#define USE_BAND_780
EU433
board.h
#define USE_BAND_433
Diff: LoRaMac.cpp
- Revision:
- 1:4820e04b066c
- Parent:
- 0:66f12acb8acb
- Child:
- 2:76f59096e3a7
diff -r 66f12acb8acb -r 4820e04b066c LoRaMac.cpp
--- a/LoRaMac.cpp Thu Jun 02 07:58:35 2016 +0000
+++ b/LoRaMac.cpp Tue Jul 05 15:12:50 2016 +0000
@@ -389,39 +389,14 @@
#endif
/*!
- * LoRaMAC 2nd reception window settings
- */
-static Rx2ChannelParams_t Rx2Channel = RX_WND_2_CHANNEL;
-
-/*!
- * Datarate offset between uplink and downlink on first window
+ * LoRaMac parameters
*/
-static uint8_t Rx1DrOffset = 0;
-
-/*!
- * Mask indicating which channels are enabled
- */
-static uint16_t ChannelsMask[6];
+LoRaMacParams_t LoRaMacParams;
/*!
- * Channels Tx output power
- */
-static int8_t ChannelsTxPower = LORAMAC_DEFAULT_TX_POWER;
-
-/*!
- * Channels datarate
+ * LoRaMac default parameters
*/
-static int8_t ChannelsDatarate = LORAMAC_DEFAULT_DATARATE;
-
-/*!
- * Channels default datarate
- */
-static int8_t ChannelsDefaultDatarate = LORAMAC_DEFAULT_DATARATE;
-
-/*!
- * Number of uplink messages repetitions [1:15] (unconfirmed messages only)
- */
-static uint8_t ChannelsNbRep = 1;
+LoRaMacParams_t LoRaMacParamsDefaults;
/*!
* Uplink messages repetitions counter
@@ -451,6 +426,9 @@
*/
static uint8_t Channel;
+/*!
+ * Channel index of the last transmission
+ */
static uint8_t LastTxChannel;
/*!
@@ -505,14 +483,6 @@
static TimerEvent_t RxWindowTimer2;
/*!
- * LoRaMac reception windows delay from end of Tx
- */
-static uint32_t ReceiveDelay1;
-static uint32_t ReceiveDelay2;
-static uint32_t JoinAcceptDelay1;
-static uint32_t JoinAcceptDelay2;
-
-/*!
* LoRaMac reception windows delay
* \remark normal frame: RxWindowXDelay = ReceiveDelayX - RADIO_WAKEUP_TIME
* join frame : RxWindowXDelay = JoinAcceptDelayX - RADIO_WAKEUP_TIME
@@ -521,11 +491,6 @@
static uint32_t RxWindow2Delay;
/*!
- * LoRaMac maximum time a reception window stays open
- */
-static uint32_t MaxRxWindow;
-
-/*!
* Acknowledge timeout timer. Used for packet retransmissions.
*/
static TimerEvent_t AckTimeoutTimer;
@@ -879,7 +844,10 @@
*/
LoRaMacStatus_t SendFrameOnChannel( ChannelParams_t channel );
-
+/*!
+ * \brief Resets MAC specific parameters to default
+ */
+static void ResetMacParameters( void );
static void OnRadioTxDone( void )
{
@@ -953,7 +921,7 @@
LoRaMacFlags.Bits.MacDone = 1;
// Trig OnMacCheckTimerEvent call as soon as possible
- TimerSetValue( &MacStateCheckTimer, 1 );
+ TimerSetValue( &MacStateCheckTimer, 1000 );
TimerStart( &MacStateCheckTimer );
}
@@ -1038,26 +1006,26 @@
LoRaMacDevAddr |= ( ( uint32_t )LoRaMacRxPayload[10] << 24 );
// DLSettings
- Rx1DrOffset = ( LoRaMacRxPayload[11] >> 4 ) & 0x07;
- Rx2Channel.Datarate = LoRaMacRxPayload[11] & 0x0F;
+ LoRaMacParams.Rx1DrOffset = ( LoRaMacRxPayload[11] >> 4 ) & 0x07;
+ LoRaMacParams.Rx2Channel.Datarate = LoRaMacRxPayload[11] & 0x0F;
#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
/*
* WARNING: To be removed once Semtech server implementation
* is corrected.
*/
- if( Rx2Channel.Datarate == DR_3 )
+ if( LoRaMacParams.Rx2Channel.Datarate == DR_3 )
{
- Rx2Channel.Datarate = DR_8;
+ LoRaMacParams.Rx2Channel.Datarate = DR_8;
}
#endif
// RxDelay
- ReceiveDelay1 = ( LoRaMacRxPayload[12] & 0x0F );
- if( ReceiveDelay1 == 0 )
+ LoRaMacParams.ReceiveDelay1 = ( LoRaMacRxPayload[12] & 0x0F );
+ if( LoRaMacParams.ReceiveDelay1 == 0 )
{
- ReceiveDelay1 = 1;
+ LoRaMacParams.ReceiveDelay1 = 1;
}
- ReceiveDelay1 *= 1e3;
- ReceiveDelay2 = ReceiveDelay1 + 1e3;
+ LoRaMacParams.ReceiveDelay1 *= 1e6;
+ LoRaMacParams.ReceiveDelay2 = LoRaMacParams.ReceiveDelay1 + 1e6;
#if !( defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID ) )
//CFList
@@ -1077,7 +1045,7 @@
#endif
MlmeConfirm.Status = LORAMAC_EVENT_INFO_STATUS_OK;
IsLoRaMacNetworkJoined = true;
- ChannelsDatarate = ChannelsDefaultDatarate;
+ LoRaMacParams.ChannelsDatarate = LoRaMacParamsDefaults.ChannelsDatarate;
}
else
{
@@ -1250,11 +1218,6 @@
}
}
- if( fCtrl.Bits.FOptsLen > 0 )
- {
- // Decode Options field MAC commands
- ProcessMacCommands( payload, 8, appPayloadStartIndex, snr );
- }
if( ( ( size - 4 ) - appPayloadStartIndex ) > 0 )
{
port = payload[appPayloadStartIndex++];
@@ -1264,19 +1227,32 @@
if( port == 0 )
{
- LoRaMacPayloadDecrypt( payload + appPayloadStartIndex,
- frameLen,
- nwkSKey,
- address,
- DOWN_LINK,
- downLinkCounter,
- LoRaMacRxPayload );
-
- // Decode frame payload MAC commands
- ProcessMacCommands( LoRaMacRxPayload, 0, frameLen, snr );
+ if( fCtrl.Bits.FOptsLen == 0 )
+ {
+ LoRaMacPayloadDecrypt( payload + appPayloadStartIndex,
+ frameLen,
+ nwkSKey,
+ address,
+ DOWN_LINK,
+ downLinkCounter,
+ LoRaMacRxPayload );
+
+ // Decode frame payload MAC commands
+ ProcessMacCommands( LoRaMacRxPayload, 0, frameLen, snr );
+ }
+ else
+ {
+ skipIndication = true;
+ }
}
else
{
+ if( fCtrl.Bits.FOptsLen > 0 )
+ {
+ // Decode Options field MAC commands. Omit the fPort.
+ ProcessMacCommands( payload, 8, appPayloadStartIndex - 1, snr );
+ }
+
LoRaMacPayloadDecrypt( payload + appPayloadStartIndex,
frameLen,
appSKey,
@@ -1293,6 +1269,15 @@
}
}
}
+ else
+ {
+ if( fCtrl.Bits.FOptsLen > 0 )
+ {
+ // Decode Options field MAC commands
+ ProcessMacCommands( payload, 8, appPayloadStartIndex, snr );
+ }
+ }
+
if( skipIndication == false )
{
LoRaMacFlags.Bits.McpsInd = 1;
@@ -1332,7 +1317,7 @@
LoRaMacFlags.Bits.MacDone = 1;
// Trig OnMacCheckTimerEvent call as soon as possible
- TimerSetValue( &MacStateCheckTimer, 1 );
+ TimerSetValue( &MacStateCheckTimer, 1000 );
TimerStart( &MacStateCheckTimer );
}
@@ -1435,14 +1420,14 @@
if( MlmeConfirm.Status == LORAMAC_EVENT_INFO_STATUS_OK )
{
// Stop retransmission
- ChannelsNbRepCounter = ChannelsNbRep;
+ ChannelsNbRepCounter = LoRaMacParams.ChannelsNbRep;
UpLinkCounter = 0;
}
}
}
if( ( LoRaMacFlags.Bits.MlmeReq == 1 ) || ( ( LoRaMacFlags.Bits.McpsReq == 1 ) ) )
{
- if( ( ChannelsNbRepCounter >= ChannelsNbRep ) || ( LoRaMacFlags.Bits.McpsInd == 1 ) )
+ if( ( ChannelsNbRepCounter >= LoRaMacParams.ChannelsNbRep ) || ( LoRaMacFlags.Bits.McpsInd == 1 ) )
{
ChannelsNbRepCounter = 0;
@@ -1488,7 +1473,7 @@
if( ( AckTimeoutRetriesCounter % 2 ) == 1 )
{
- ChannelsDatarate = MAX( ChannelsDatarate - 1, LORAMAC_TX_MIN_DATARATE );
+ LoRaMacParams.ChannelsDatarate = MAX( LoRaMacParams.ChannelsDatarate - 1, LORAMAC_TX_MIN_DATARATE );
}
LoRaMacFlags.Bits.MacDone = 0;
// Sends the same frame again
@@ -1498,18 +1483,18 @@
{
#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 ) );
+ LoRaMacParams.ChannelsMask[0] = LoRaMacParams.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;
+ LoRaMacParams.ChannelsMask[0] = 0xFFFF;
+ LoRaMacParams.ChannelsMask[1] = 0xFFFF;
+ LoRaMacParams.ChannelsMask[2] = 0xFFFF;
+ LoRaMacParams.ChannelsMask[3] = 0xFFFF;
+ LoRaMacParams.ChannelsMask[4] = 0x00FF;
+ LoRaMacParams.ChannelsMask[5] = 0x0000;
#elif defined( USE_BAND_915_HYBRID )
// Re-enable default channels
- ReenableChannels( ChannelsMask[4], ChannelsMask );
+ ReenableChannels( LoRaMacParams.ChannelsMask[4], LoRaMacParams.ChannelsMask );
#else
#error "Please define a frequency band in the compiler options."
#endif
@@ -1600,7 +1585,7 @@
}
#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
- datarate = ChannelsDatarate - Rx1DrOffset;
+ datarate = LoRaMacParams.ChannelsDatarate - LoRaMacParams.Rx1DrOffset;
if( datarate < 0 )
{
datarate = DR_0;
@@ -1622,7 +1607,7 @@
}
RxWindowSetup( Channels[Channel].Frequency, datarate, bandwidth, symbTimeout, false );
#elif ( defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID ) )
- datarate = datarateOffsets[ChannelsDatarate][Rx1DrOffset];
+ datarate = datarateOffsets[LoRaMacParams.ChannelsDatarate][LoRaMacParams.Rx1DrOffset];
if( datarate < 0 )
{
datarate = DR_0;
@@ -1678,22 +1663,22 @@
#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
// For higher datarates, we increase the number of symbols generating a Rx Timeout
- if( ( Rx2Channel.Datarate == DR_3 ) || ( Rx2Channel.Datarate == DR_4 ) )
+ if( ( LoRaMacParams.Rx2Channel.Datarate == DR_3 ) || ( LoRaMacParams.Rx2Channel.Datarate == DR_4 ) )
{ // DR_4, DR_3
symbTimeout = 8;
}
- else if( Rx2Channel.Datarate == DR_5 )
+ else if( LoRaMacParams.Rx2Channel.Datarate == DR_5 )
{
symbTimeout = 10;
}
- else if( Rx2Channel.Datarate == DR_6 )
+ else if( LoRaMacParams.Rx2Channel.Datarate == DR_6 )
{// LoRa 250 kHz
bandwidth = 1;
symbTimeout = 14;
}
#elif ( defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID ) )
// For higher datarates, we increase the number of symbols generating a Rx Timeout
- switch( Rx2Channel.Datarate )
+ switch( LoRaMacParams.Rx2Channel.Datarate )
{
case DR_0: // SF10 - BW125
symbTimeout = 5;
@@ -1723,7 +1708,7 @@
default:
break;
}
- if( Rx2Channel.Datarate >= DR_4 )
+ if( LoRaMacParams.Rx2Channel.Datarate >= DR_4 )
{// LoRa 500 kHz
bandwidth = 2;
}
@@ -1732,11 +1717,11 @@
#endif
if( LoRaMacDeviceClass != CLASS_C )
{
- RxWindowSetup( Rx2Channel.Frequency, Rx2Channel.Datarate, bandwidth, symbTimeout, false );
+ RxWindowSetup( LoRaMacParams.Rx2Channel.Frequency, LoRaMacParams.Rx2Channel.Datarate, bandwidth, symbTimeout, false );
}
else
{
- RxWindowSetup( Rx2Channel.Frequency, Rx2Channel.Datarate, bandwidth, symbTimeout, true );
+ RxWindowSetup( LoRaMacParams.Rx2Channel.Frequency, LoRaMacParams.Rx2Channel.Datarate, bandwidth, symbTimeout, true );
}
}
@@ -1767,17 +1752,17 @@
#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
if( CountNbEnabled125kHzChannels( ChannelsMaskRemaining ) == 0 )
{ // Restore default channels
- memcpy1( ( uint8_t* ) ChannelsMaskRemaining, ( uint8_t* ) ChannelsMask, 8 );
+ memcpy1( ( uint8_t* ) ChannelsMaskRemaining, ( uint8_t* ) LoRaMacParams.ChannelsMask, 8 );
}
- if( ( ChannelsDatarate >= DR_4 ) && ( ( ChannelsMaskRemaining[4] & 0x00FF ) == 0 ) )
+ if( ( LoRaMacParams.ChannelsDatarate >= DR_4 ) && ( ( ChannelsMaskRemaining[4] & 0x00FF ) == 0 ) )
{ // Make sure, that the channels are activated
- ChannelsMaskRemaining[4] = ChannelsMask[4];
+ ChannelsMaskRemaining[4] = LoRaMacParams.ChannelsMask[4];
}
#else
- if( CountBits( ChannelsMask[0], 16 ) == 0 )
+ if( CountBits( LoRaMacParams.ChannelsMask[0], 16 ) == 0 )
{
// Re-enable default channels, if no channel is enabled
- ChannelsMask[0] = ChannelsMask[0] | ( LC( 1 ) + LC( 2 ) + LC( 3 ) );
+ LoRaMacParams.ChannelsMask[0] = LoRaMacParams.ChannelsMask[0] | ( LC( 1 ) + LC( 2 ) + LC( 3 ) );
}
#endif
@@ -1817,7 +1802,7 @@
#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
if( ( ChannelsMaskRemaining[k] & ( 1 << j ) ) != 0 )
#else
- if( ( ChannelsMask[k] & ( 1 << j ) ) != 0 )
+ if( ( LoRaMacParams.ChannelsMask[k] & ( 1 << j ) ) != 0 )
#endif
{
if( Channels[i + j].Frequency == 0 )
@@ -1833,8 +1818,8 @@
}
}
#endif
- if( ( ( Channels[i + j].DrRange.Fields.Min <= ChannelsDatarate ) &&
- ( ChannelsDatarate <= Channels[i + j].DrRange.Fields.Max ) ) == false )
+ if( ( ( Channels[i + j].DrRange.Fields.Min <= LoRaMacParams.ChannelsDatarate ) &&
+ ( LoRaMacParams.ChannelsDatarate <= Channels[i + j].DrRange.Fields.Max ) ) == false )
{ // Check if the current channel selection supports the given datarate
continue;
}
@@ -1935,7 +1920,7 @@
if( rxContinuous == false )
{
- Radio.Rx( MaxRxWindow );
+ Radio.Rx( LoRaMacParams.MaxRxWindow );
}
else
{
@@ -2082,14 +2067,14 @@
{
int8_t resultTxPower = txPower;
#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
- if( ( ChannelsDatarate == DR_4 ) ||
- ( ( ChannelsDatarate >= DR_8 ) && ( ChannelsDatarate <= DR_13 ) ) )
+ if( ( LoRaMacParams.ChannelsDatarate == DR_4 ) ||
+ ( ( LoRaMacParams.ChannelsDatarate >= DR_8 ) && ( LoRaMacParams.ChannelsDatarate <= DR_13 ) ) )
{// Limit tx power to max 26dBm
resultTxPower = MAX( txPower, TX_POWER_26_DBM );
}
else
{
- if( CountNbEnabled125kHzChannels( ChannelsMask ) < 50 )
+ if( CountNbEnabled125kHzChannels( LoRaMacParams.ChannelsMask ) < 50 )
{// Limit tx power to max 21dBm
resultTxPower = MAX( txPower, TX_POWER_20_DBM );
}
@@ -2126,7 +2111,7 @@
static bool AdrNextDr( bool adrEnabled, bool updateChannelMask, int8_t* datarateOut )
{
bool adrAckReq = false;
- int8_t datarate = ChannelsDatarate;
+ int8_t datarate = LoRaMacParams.ChannelsDatarate;
if( adrEnabled == true )
{
@@ -2147,7 +2132,7 @@
}
if( AdrAckCounter >= ( ADR_ACK_LIMIT + ADR_ACK_DELAY ) )
{
- if( ( ( AdrAckCounter - ADR_ACK_DELAY ) % ADR_ACK_LIMIT ) == 0 )
+ if( ( AdrAckCounter % ADR_ACK_DELAY ) == 0 )
{
#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
if( datarate > LORAMAC_TX_MIN_DATARATE )
@@ -2159,7 +2144,7 @@
if( updateChannelMask == true )
{
// Re-enable default channels LC1, LC2, LC3
- ChannelsMask[0] = ChannelsMask[0] | ( LC( 1 ) + LC( 2 ) + LC( 3 ) );
+ LoRaMacParams.ChannelsMask[0] = LoRaMacParams.ChannelsMask[0] | ( LC( 1 ) + LC( 2 ) + LC( 3 ) );
}
}
#elif defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
@@ -2177,15 +2162,15 @@
{
#if 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;
+ LoRaMacParams.ChannelsMask[0] = 0xFFFF;
+ LoRaMacParams.ChannelsMask[1] = 0xFFFF;
+ LoRaMacParams.ChannelsMask[2] = 0xFFFF;
+ LoRaMacParams.ChannelsMask[3] = 0xFFFF;
+ LoRaMacParams.ChannelsMask[4] = 0x00FF;
+ LoRaMacParams.ChannelsMask[5] = 0x0000;
#else // defined( USE_BAND_915_HYBRID )
// Re-enable default channels
- ReenableChannels( ChannelsMask[4], ChannelsMask );
+ ReenableChannels( LoRaMacParams.ChannelsMask[4], LoRaMacParams.ChannelsMask );
#endif
}
}
@@ -2342,14 +2327,14 @@
// Initialize local copy of the channels mask array
for( i = 0; i < 6; i++ )
{
- channelsMask[i] = ChannelsMask[i];
+ channelsMask[i] = LoRaMacParams.ChannelsMask[i];
}
datarate = payload[macIndex++];
txPower = datarate & 0x0F;
datarate = ( datarate >> 4 ) & 0x0F;
if( ( AdrCtrlOn == false ) &&
- ( ( ChannelsDatarate != datarate ) || ( ChannelsTxPower != txPower ) ) )
+ ( ( LoRaMacParams.ChannelsDatarate != datarate ) || ( LoRaMacParams.ChannelsTxPower != txPower ) ) )
{ // ADR disabled don't handle ADR requests if server tries to change datarate or txpower
// Answer the server with fail status
// Power ACK = 0
@@ -2471,17 +2456,17 @@
}
if( ( status & 0x07 ) == 0x07 )
{
- ChannelsDatarate = datarate;
- ChannelsTxPower = txPower;
-
- ChannelsMask[0] = channelsMask[0];
- ChannelsMask[1] = channelsMask[1];
- ChannelsMask[2] = channelsMask[2];
- ChannelsMask[3] = channelsMask[3];
- ChannelsMask[4] = channelsMask[4];
- ChannelsMask[5] = channelsMask[5];
-
- ChannelsNbRep = nbRep;
+ LoRaMacParams.ChannelsDatarate = datarate;
+ LoRaMacParams.ChannelsTxPower = txPower;
+
+ LoRaMacParams.ChannelsMask[0] = channelsMask[0];
+ LoRaMacParams.ChannelsMask[1] = channelsMask[1];
+ LoRaMacParams.ChannelsMask[2] = channelsMask[2];
+ LoRaMacParams.ChannelsMask[3] = channelsMask[3];
+ LoRaMacParams.ChannelsMask[4] = channelsMask[4];
+ LoRaMacParams.ChannelsMask[5] = channelsMask[5];
+
+ LoRaMacParams.ChannelsNbRep = nbRep;
}
AddMacCommand( MOTE_MAC_LINK_ADR_ANS, status, 0 );
}
@@ -2530,9 +2515,9 @@
if( ( status & 0x07 ) == 0x07 )
{
- Rx2Channel.Datarate = datarate;
- Rx2Channel.Frequency = freq;
- Rx1DrOffset = drOffset;
+ LoRaMacParams.Rx2Channel.Datarate = datarate;
+ LoRaMacParams.Rx2Channel.Frequency = freq;
+ LoRaMacParams.Rx1DrOffset = drOffset;
}
AddMacCommand( MOTE_MAC_RX_PARAM_SETUP_ANS, status, 0 );
}
@@ -2623,8 +2608,8 @@
{
delay++;
}
- ReceiveDelay1 = delay * 1e3;
- ReceiveDelay2 = ReceiveDelay1 + 1e3;
+ LoRaMacParams.ReceiveDelay1 = delay * 1e6;
+ LoRaMacParams.ReceiveDelay2 = LoRaMacParams.ReceiveDelay1 + 1e6;
AddMacCommand( MOTE_MAC_RX_TIMING_SETUP_ANS, 0, 0 );
}
break;
@@ -2686,11 +2671,11 @@
while( SetNextChannel( &dutyCycleTimeOff ) == false )
{
// Set the default datarate
- ChannelsDatarate = ChannelsDefaultDatarate;
+ LoRaMacParams.ChannelsDatarate = LoRaMacParamsDefaults.ChannelsDatarate;
#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 ) );
+ LoRaMacParams.ChannelsMask[0] = LoRaMacParams.ChannelsMask[0] | ( LC( 1 ) + LC( 2 ) + LC( 3 ) );
#endif
}
@@ -2718,11 +2703,11 @@
#if defined( USE_BAND_868 ) || defined( USE_BAND_433 ) || defined( USE_BAND_780 )
TimerTime_t timeElapsed = TimerGetElapsedTime( 0 );
- if( timeElapsed < 3600000 )
+ if( timeElapsed < 3600000000 )
{
dutyCycle = BACKOFF_DC_1_HOUR;
}
- else if( timeElapsed < ( 3600000 + 36000000 ) )
+ else if( timeElapsed < ( 3600000000 + 36000000000 ) )
{
dutyCycle = BACKOFF_DC_10_HOURS;
}
@@ -2778,10 +2763,10 @@
#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
#if defined( USE_BAND_915 )
// Re-enable 500 kHz default channels
- ChannelsMask[4] = 0x00FF;
+ LoRaMacParams.ChannelsMask[4] = 0x00FF;
#else // defined( USE_BAND_915_HYBRID )
// Re-enable 500 kHz default channels
- ReenableChannels( ChannelsMask[4], ChannelsMask );
+ ReenableChannels( LoRaMacParams.ChannelsMask[4], LoRaMacParams.ChannelsMask );
#endif
if( ( nbTrials & 0x01 ) == 0x01 )
@@ -2793,23 +2778,23 @@
datarate = DR_1;
}
#else
- if( ( nbTrials % 48 ) != 0 )
+ if( ( nbTrials % 48 ) == 0 )
{
datarate = DR_0;
}
- else if( ( nbTrials % 32 ) != 0 )
+ else if( ( nbTrials % 32 ) == 0 )
{
datarate = DR_1;
}
- else if( ( nbTrials % 24 ) != 0 )
+ else if( ( nbTrials % 24 ) == 0 )
{
datarate = DR_2;
}
- else if( ( nbTrials % 16 ) != 0 )
+ else if( ( nbTrials % 16 ) == 0 )
{
datarate = DR_3;
}
- else if( ( nbTrials % 8 ) != 0 )
+ else if( ( nbTrials % 8 ) == 0 )
{
datarate = DR_4;
}
@@ -2821,6 +2806,66 @@
return datarate;
}
+static void ResetMacParameters( void )
+{
+ IsLoRaMacNetworkJoined = false;
+
+ // Counters
+ UpLinkCounter = 1;
+ DownLinkCounter = 0;
+ AdrAckCounter = 0;
+
+ ChannelsNbRepCounter = 0;
+
+ AckTimeoutRetries = 1;
+ AckTimeoutRetriesCounter = 1;
+ AckTimeoutRetry = false;
+
+ MaxDCycle = 0;
+ AggregatedDCycle = 1;
+
+ MacCommandsBufferIndex = 0;
+ MacCommandsBufferToRepeatIndex = 0;
+
+ IsRxWindowsEnabled = true;
+
+ LoRaMacParams.ChannelsTxPower = LoRaMacParamsDefaults.ChannelsTxPower;
+ LoRaMacParams.ChannelsDatarate = LoRaMacParamsDefaults.ChannelsDatarate;
+
+ 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 ) );
+
+#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
+ memcpy1( ( uint8_t* ) ChannelsMaskRemaining, ( uint8_t* ) LoRaMacParamsDefaults.ChannelsMask, sizeof( LoRaMacParams.ChannelsMask ) );
+#endif
+
+
+ NodeAckRequested = false;
+ SrvAckRequested = false;
+ MacCommandsInNextTx = false;
+
+ // Reset Multicast downlink counters
+ MulticastParams_t *cur = MulticastChannels;
+ while( cur != NULL )
+ {
+ cur->DownLinkCounter = 0;
+ cur = cur->Next;
+ }
+
+ // Initialize channel index.
+ Channel = LORA_MAX_NB_CHANNELS;
+}
+
LoRaMacStatus_t PrepareFrame( LoRaMacHeader_t *macHdr, LoRaMacFrameCtrl_t *fCtrl, uint8_t fPort, void *fBuffer, uint16_t fBufferSize )
{
uint16_t i;
@@ -2844,8 +2889,8 @@
switch( macHdr->Bits.MType )
{
case FRAME_TYPE_JOIN_REQ:
- RxWindow1Delay = JoinAcceptDelay1 - RADIO_WAKEUP_TIME;
- RxWindow2Delay = JoinAcceptDelay2 - RADIO_WAKEUP_TIME;
+ RxWindow1Delay = LoRaMacParams.JoinAcceptDelay1 - RADIO_WAKEUP_TIME;
+ RxWindow2Delay = LoRaMacParams.JoinAcceptDelay2 - RADIO_WAKEUP_TIME;
LoRaMacBufferPktLen = pktHeaderLen;
@@ -2876,15 +2921,15 @@
return LORAMAC_STATUS_NO_NETWORK_JOINED; // No network has been joined yet
}
- fCtrl->Bits.AdrAckReq = AdrNextDr( fCtrl->Bits.Adr, true, &ChannelsDatarate );
-
- if( ValidatePayloadLength( fBufferSize, ChannelsDatarate, MacCommandsBufferIndex ) == false )
+ fCtrl->Bits.AdrAckReq = AdrNextDr( fCtrl->Bits.Adr, true, &LoRaMacParams.ChannelsDatarate );
+
+ if( ValidatePayloadLength( fBufferSize, LoRaMacParams.ChannelsDatarate, MacCommandsBufferIndex ) == false )
{
return LORAMAC_STATUS_LENGTH_ERROR;
}
- RxWindow1Delay = ReceiveDelay1 - RADIO_WAKEUP_TIME;
- RxWindow2Delay = ReceiveDelay2 - RADIO_WAKEUP_TIME;
+ RxWindow1Delay = LoRaMacParams.ReceiveDelay1 - RADIO_WAKEUP_TIME;
+ RxWindow2Delay = LoRaMacParams.ReceiveDelay2 - RADIO_WAKEUP_TIME;
if( SrvAckRequested == true )
{
@@ -2980,50 +3025,50 @@
LoRaMacStatus_t SendFrameOnChannel( ChannelParams_t channel )
{
- int8_t datarate = Datarates[ChannelsDatarate];
+ int8_t datarate = Datarates[LoRaMacParams.ChannelsDatarate];
int8_t txPowerIndex = 0;
int8_t txPower = 0;
- txPowerIndex = LimitTxPower( ChannelsTxPower );
+ txPowerIndex = LimitTxPower( LoRaMacParams.ChannelsTxPower );
txPower = TxPowers[txPowerIndex];
MlmeConfirm.Status = LORAMAC_EVENT_INFO_STATUS_ERROR;
McpsConfirm.Status = LORAMAC_EVENT_INFO_STATUS_ERROR;
- McpsConfirm.Datarate = ChannelsDatarate;
+ McpsConfirm.Datarate = LoRaMacParams.ChannelsDatarate;
McpsConfirm.TxPower = txPowerIndex;
Radio.SetChannel( channel.Frequency );
#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
- if( ChannelsDatarate == DR_7 )
+ if( LoRaMacParams.ChannelsDatarate == DR_7 )
{ // High Speed FSK channel
Radio.SetMaxPayloadLength( MODEM_FSK, LoRaMacBufferPktLen );
- Radio.SetTxConfig( MODEM_FSK, txPower, 25e3, 0, datarate * 1e3, 0, 5, false, true, 0, 0, false, 3e3 );
+ Radio.SetTxConfig( MODEM_FSK, txPower, 25e3, 0, datarate * 1e3, 0, 5, false, true, 0, 0, false, 3e6 );
TxTimeOnAir = Radio.TimeOnAir( MODEM_FSK, LoRaMacBufferPktLen );
}
- else if( ChannelsDatarate == DR_6 )
+ else if( LoRaMacParams.ChannelsDatarate == DR_6 )
{ // High speed LoRa channel
Radio.SetMaxPayloadLength( MODEM_LORA, LoRaMacBufferPktLen );
- Radio.SetTxConfig( MODEM_LORA, txPower, 0, 1, datarate, 1, 8, false, true, 0, 0, false, 3e3 );
+ Radio.SetTxConfig( MODEM_LORA, txPower, 0, 1, datarate, 1, 8, false, true, 0, 0, false, 3e6 );
TxTimeOnAir = Radio.TimeOnAir( MODEM_LORA, LoRaMacBufferPktLen );
}
else
{ // Normal LoRa channel
Radio.SetMaxPayloadLength( MODEM_LORA, LoRaMacBufferPktLen );
- Radio.SetTxConfig( MODEM_LORA, txPower, 0, 0, datarate, 1, 8, false, true, 0, 0, false, 3e3 );
+ Radio.SetTxConfig( MODEM_LORA, txPower, 0, 0, datarate, 1, 8, false, true, 0, 0, false, 3e6 );
TxTimeOnAir = Radio.TimeOnAir( MODEM_LORA, LoRaMacBufferPktLen );
}
#elif defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
Radio.SetMaxPayloadLength( MODEM_LORA, LoRaMacBufferPktLen );
- if( ChannelsDatarate >= DR_4 )
+ if( LoRaMacParams.ChannelsDatarate >= DR_4 )
{ // High speed LoRa channel BW500 kHz
- Radio.SetTxConfig( MODEM_LORA, txPower, 0, 2, datarate, 1, 8, false, true, 0, 0, false, 3e3 );
+ Radio.SetTxConfig( MODEM_LORA, txPower, 0, 2, datarate, 1, 8, false, true, 0, 0, false, 3e6 );
TxTimeOnAir = Radio.TimeOnAir( MODEM_LORA, LoRaMacBufferPktLen );
}
else
{ // Normal LoRa channel
- Radio.SetTxConfig( MODEM_LORA, txPower, 0, 0, datarate, 1, 8, false, true, 0, 0, false, 3e3 );
+ Radio.SetTxConfig( MODEM_LORA, txPower, 0, 0, datarate, 1, 8, false, true, 0, 0, false, 3e6 );
TxTimeOnAir = Radio.TimeOnAir( MODEM_LORA, LoRaMacBufferPktLen );
}
#else
@@ -3066,44 +3111,64 @@
LoRaMacFlags.Value = 0;
LoRaMacDeviceClass = CLASS_A;
-
- UpLinkCounter = 1;
- DownLinkCounter = 0;
- AdrAckCounter = 0;
+ LoRaMacState = MAC_IDLE;
+
JoinRequestTrials = 0;
-
- MacCommandsBufferIndex = 0;
- MacCommandsBufferToRepeatIndex = 0;
-
RepeaterSupport = false;
- IsRxWindowsEnabled = true;
- IsLoRaMacNetworkJoined = false;
- LoRaMacState = MAC_IDLE;
-
+
+ // Reset duty cycle times
+ AggregatedLastTxDoneTime = 0;
+ AggregatedTimeOff = 0;
+
+ // Duty cycle
#if defined( USE_BAND_433 )
- ChannelsMask[0] = LC( 1 ) + LC( 2 ) + LC( 3 );
+ DutyCycleOn = false;
#elif defined( USE_BAND_780 )
- ChannelsMask[0] = LC( 1 ) + LC( 2 ) + LC( 3 );
+ DutyCycleOn = false;
#elif defined( USE_BAND_868 )
- ChannelsMask[0] = LC( 1 ) + LC( 2 ) + LC( 3 );
+ DutyCycleOn = true;
+#elif defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
+ DutyCycleOn = false;
+#else
+ #error "Please define a frequency band in the compiler options."
+#endif
+
+ // Reset to defaults
+ LoRaMacParamsDefaults.ChannelsTxPower = LORAMAC_DEFAULT_TX_POWER;
+ LoRaMacParamsDefaults.ChannelsDatarate = LORAMAC_DEFAULT_DATARATE;
+
+ LoRaMacParamsDefaults.MaxRxWindow = MAX_RX_WINDOW;
+ LoRaMacParamsDefaults.ReceiveDelay1 = RECEIVE_DELAY1;
+ LoRaMacParamsDefaults.ReceiveDelay2 = RECEIVE_DELAY2;
+ LoRaMacParamsDefaults.JoinAcceptDelay1 = JOIN_ACCEPT_DELAY1;
+ LoRaMacParamsDefaults.JoinAcceptDelay2 = JOIN_ACCEPT_DELAY2;
+
+ LoRaMacParamsDefaults.ChannelsNbRep = 1;
+ LoRaMacParamsDefaults.Rx1DrOffset = 0;
+
+ LoRaMacParamsDefaults.Rx2Channel = ( Rx2ChannelParams_t )RX_WND_2_CHANNEL;
+
+ // Channel mask
+#if defined( USE_BAND_433 )
+ LoRaMacParamsDefaults.ChannelsMask[0] = LC( 1 ) + LC( 2 ) + LC( 3 );
+#elif defined( USE_BAND_780 )
+ LoRaMacParamsDefaults.ChannelsMask[0] = LC( 1 ) + LC( 2 ) + LC( 3 );
+#elif defined( USE_BAND_868 )
+ LoRaMacParamsDefaults.ChannelsMask[0] = LC( 1 ) + LC( 2 ) + LC( 3 );
#elif defined( USE_BAND_915 )
- ChannelsMask[0] = 0xFFFF;
- ChannelsMask[1] = 0xFFFF;
- ChannelsMask[2] = 0xFFFF;
- ChannelsMask[3] = 0xFFFF;
- ChannelsMask[4] = 0x00FF;
- ChannelsMask[5] = 0x0000;
-
- memcpy1( ( uint8_t* ) ChannelsMaskRemaining, ( uint8_t* ) ChannelsMask, sizeof( ChannelsMask ) );
+ LoRaMacParamsDefaults.ChannelsMask[0] = 0xFFFF;
+ LoRaMacParamsDefaults.ChannelsMask[1] = 0xFFFF;
+ LoRaMacParamsDefaults.ChannelsMask[2] = 0xFFFF;
+ LoRaMacParamsDefaults.ChannelsMask[3] = 0xFFFF;
+ LoRaMacParamsDefaults.ChannelsMask[4] = 0x00FF;
+ LoRaMacParamsDefaults.ChannelsMask[5] = 0x0000;
#elif defined( USE_BAND_915_HYBRID )
- ChannelsMask[0] = 0x00FF;
- ChannelsMask[1] = 0x0000;
- ChannelsMask[2] = 0x0000;
- ChannelsMask[3] = 0x0000;
- ChannelsMask[4] = 0x0001;
- ChannelsMask[5] = 0x0000;
-
- memcpy1( ( uint8_t* ) ChannelsMaskRemaining, ( uint8_t* ) ChannelsMask, sizeof( ChannelsMask ) );
+ LoRaMacParamsDefaults.ChannelsMask[0] = 0x00FF;
+ LoRaMacParamsDefaults.ChannelsMask[1] = 0x0000;
+ LoRaMacParamsDefaults.ChannelsMask[2] = 0x0000;
+ LoRaMacParamsDefaults.ChannelsMask[3] = 0x0000;
+ LoRaMacParamsDefaults.ChannelsMask[4] = 0x0001;
+ LoRaMacParamsDefaults.ChannelsMask[5] = 0x0000;
#else
#error "Please define a frequency band in the compiler options."
#endif
@@ -3125,34 +3190,9 @@
}
#endif
- ChannelsTxPower = LORAMAC_DEFAULT_TX_POWER;
- ChannelsDefaultDatarate = ChannelsDatarate = LORAMAC_DEFAULT_DATARATE;
- ChannelsNbRep = 1;
- ChannelsNbRepCounter = 0;
-
- MaxDCycle = 0;
- AggregatedDCycle = 1;
- AggregatedLastTxDoneTime = 0;
- AggregatedTimeOff = 0;
-
-#if defined( USE_BAND_433 )
- DutyCycleOn = false;
-#elif defined( USE_BAND_780 )
- DutyCycleOn = false;
-#elif defined( USE_BAND_868 )
- DutyCycleOn = true;
-#elif defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
- DutyCycleOn = false;
-#else
- #error "Please define a frequency band in the compiler options."
-#endif
-
- MaxRxWindow = MAX_RX_WINDOW;
- ReceiveDelay1 = RECEIVE_DELAY1;
- ReceiveDelay2 = RECEIVE_DELAY2;
- JoinAcceptDelay1 = JOIN_ACCEPT_DELAY1;
- JoinAcceptDelay2 = JOIN_ACCEPT_DELAY2;
-
+ ResetMacParameters( );
+
+ // Initialize timers
TimerInit( &MacStateCheckTimer, OnMacStateCheckTimerEvent );
TimerSetValue( &MacStateCheckTimer, MAC_STATE_CHECK_TIMEOUT );
@@ -3172,9 +3212,6 @@
// Random seed initialization
srand1( Radio.Random( ) );
- // Initialize channel index.
- Channel = LORA_MAX_NB_CHANNELS;
-
PublicNetwork = true;
SetPublicNetwork( PublicNetwork );
Radio.Sleep( );
@@ -3184,7 +3221,7 @@
LoRaMacStatus_t LoRaMacQueryTxPossible( uint8_t size, LoRaMacTxInfo_t* txInfo )
{
- int8_t datarate = ChannelsDefaultDatarate;
+ int8_t datarate = LoRaMacParamsDefaults.ChannelsDatarate;
uint8_t fOptLen = MacCommandsBufferIndex + MacCommandsBufferToRepeatIndex;
if( txInfo == NULL )
@@ -3288,57 +3325,57 @@
}
case MIB_RX2_CHANNEL:
{
- mibGet->Param.Rx2Channel = Rx2Channel;
+ mibGet->Param.Rx2Channel = LoRaMacParams.Rx2Channel;
break;
}
case MIB_CHANNELS_MASK:
{
- mibGet->Param.ChannelsMask = ChannelsMask;
+ mibGet->Param.ChannelsMask = LoRaMacParams.ChannelsMask;
break;
}
case MIB_CHANNELS_NB_REP:
{
- mibGet->Param.ChannelNbRep = ChannelsNbRep;
+ mibGet->Param.ChannelNbRep = LoRaMacParams.ChannelsNbRep;
break;
}
case MIB_MAX_RX_WINDOW_DURATION:
{
- mibGet->Param.MaxRxWindow = MaxRxWindow;
+ mibGet->Param.MaxRxWindow = LoRaMacParams.MaxRxWindow;
break;
}
case MIB_RECEIVE_DELAY_1:
{
- mibGet->Param.ReceiveDelay1 = ReceiveDelay1;
+ mibGet->Param.ReceiveDelay1 = LoRaMacParams.ReceiveDelay1;
break;
}
case MIB_RECEIVE_DELAY_2:
{
- mibGet->Param.ReceiveDelay2 = ReceiveDelay2;
+ mibGet->Param.ReceiveDelay2 = LoRaMacParams.ReceiveDelay2;
break;
}
case MIB_JOIN_ACCEPT_DELAY_1:
{
- mibGet->Param.JoinAcceptDelay1 = JoinAcceptDelay1;
+ mibGet->Param.JoinAcceptDelay1 = LoRaMacParams.JoinAcceptDelay1;
break;
}
case MIB_JOIN_ACCEPT_DELAY_2:
{
- mibGet->Param.JoinAcceptDelay2 = JoinAcceptDelay2;
+ mibGet->Param.JoinAcceptDelay2 = LoRaMacParams.JoinAcceptDelay2;
break;
}
case MIB_CHANNELS_DEFAULT_DATARATE:
{
- mibGet->Param.ChannelsDefaultDatarate = ChannelsDefaultDatarate;
+ mibGet->Param.ChannelsDefaultDatarate = LoRaMacParamsDefaults.ChannelsDatarate;
break;
}
case MIB_CHANNELS_DATARATE:
{
- mibGet->Param.ChannelsDatarate = ChannelsDatarate;
+ mibGet->Param.ChannelsDatarate = LoRaMacParams.ChannelsDatarate;
break;
}
case MIB_CHANNELS_TX_POWER:
{
- mibGet->Param.ChannelsTxPower = ChannelsTxPower;
+ mibGet->Param.ChannelsTxPower = LoRaMacParams.ChannelsTxPower;
break;
}
case MIB_UPLINK_COUNTER:
@@ -3462,7 +3499,7 @@
}
case MIB_RX2_CHANNEL:
{
- Rx2Channel = mibSet->Param.Rx2Channel;
+ LoRaMacParams.Rx2Channel = mibSet->Param.Rx2Channel;
break;
}
case MIB_CHANNELS_MASK:
@@ -3484,12 +3521,12 @@
}
else
{
- memcpy1( ( uint8_t* ) ChannelsMask,
- ( uint8_t* ) mibSet->Param.ChannelsMask, sizeof( ChannelsMask ) );
- for ( uint8_t i = 0; i < sizeof( ChannelsMask ) / 2; i++ )
+ memcpy1( ( uint8_t* ) LoRaMacParams.ChannelsMask,
+ ( uint8_t* ) mibSet->Param.ChannelsMask, sizeof( LoRaMacParams.ChannelsMask ) );
+ for ( uint8_t i = 0; i < sizeof( LoRaMacParams.ChannelsMask ) / 2; i++ )
{
// Disable channels which are no longer available
- ChannelsMaskRemaining[i] &= ChannelsMask[i];
+ ChannelsMaskRemaining[i] &= LoRaMacParams.ChannelsMask[i];
}
}
}
@@ -3498,7 +3535,7 @@
status = LORAMAC_STATUS_PARAMETER_INVALID;
}
#else
- memcpy1( ( uint8_t* ) ChannelsMask,
+ memcpy1( ( uint8_t* ) LoRaMacParams.ChannelsMask,
( uint8_t* ) mibSet->Param.ChannelsMask, 2 );
#endif
}
@@ -3513,7 +3550,7 @@
if( ( mibSet->Param.ChannelNbRep >= 1 ) &&
( mibSet->Param.ChannelNbRep <= 15 ) )
{
- ChannelsNbRep = mibSet->Param.ChannelNbRep;
+ LoRaMacParams.ChannelsNbRep = mibSet->Param.ChannelNbRep;
}
else
{
@@ -3523,27 +3560,27 @@
}
case MIB_MAX_RX_WINDOW_DURATION:
{
- MaxRxWindow = mibSet->Param.MaxRxWindow;
+ LoRaMacParams.MaxRxWindow = mibSet->Param.MaxRxWindow;
break;
}
case MIB_RECEIVE_DELAY_1:
{
- ReceiveDelay1 = mibSet->Param.ReceiveDelay1;
+ LoRaMacParams.ReceiveDelay1 = mibSet->Param.ReceiveDelay1;
break;
}
case MIB_RECEIVE_DELAY_2:
{
- ReceiveDelay2 = mibSet->Param.ReceiveDelay2;
+ LoRaMacParams.ReceiveDelay2 = mibSet->Param.ReceiveDelay2;
break;
}
case MIB_JOIN_ACCEPT_DELAY_1:
{
- JoinAcceptDelay1 = mibSet->Param.JoinAcceptDelay1;
+ LoRaMacParams.JoinAcceptDelay1 = mibSet->Param.JoinAcceptDelay1;
break;
}
case MIB_JOIN_ACCEPT_DELAY_2:
{
- JoinAcceptDelay2 = mibSet->Param.JoinAcceptDelay2;
+ LoRaMacParams.JoinAcceptDelay2 = mibSet->Param.JoinAcceptDelay2;
break;
}
case MIB_CHANNELS_DEFAULT_DATARATE:
@@ -3551,7 +3588,7 @@
if( ValueInRange( mibSet->Param.ChannelsDefaultDatarate,
LORAMAC_TX_MIN_DATARATE, LORAMAC_TX_MAX_DATARATE ) )
{
- ChannelsDefaultDatarate = mibSet->Param.ChannelsDefaultDatarate;
+ LoRaMacParamsDefaults.ChannelsDatarate = mibSet->Param.ChannelsDefaultDatarate;
}
else
{
@@ -3564,7 +3601,7 @@
if( ValueInRange( mibSet->Param.ChannelsDatarate,
LORAMAC_TX_MIN_DATARATE, LORAMAC_TX_MAX_DATARATE ) )
{
- ChannelsDatarate = mibSet->Param.ChannelsDatarate;
+ LoRaMacParams.ChannelsDatarate = mibSet->Param.ChannelsDatarate;
}
else
{
@@ -3577,7 +3614,7 @@
if( ValueInRange( mibSet->Param.ChannelsTxPower,
LORAMAC_MAX_TX_POWER, LORAMAC_MIN_TX_POWER ) )
{
- ChannelsTxPower = mibSet->Param.ChannelsTxPower;
+ LoRaMacParams.ChannelsTxPower = mibSet->Param.ChannelsTxPower;
}
else
{
@@ -3643,7 +3680,7 @@
frequencyInvalid = true;
}
- if( params.DrRange.Fields.Min > ChannelsDefaultDatarate )
+ if( params.DrRange.Fields.Min > LoRaMacParamsDefaults.ChannelsDatarate )
{
datarateInvalid = true;
}
@@ -3705,7 +3742,7 @@
// Every parameter is valid, activate the channel
Channels[id] = params;
Channels[id].Band = band;
- ChannelsMask[0] |= ( 1 << id );
+ LoRaMacParams.ChannelsMask[0] |= ( 1 << id );
return LORAMAC_STATUS_OK;
#endif
@@ -3732,7 +3769,7 @@
Channels[id] = ( ChannelParams_t ){ 0, { 0 }, 0 };
// Disable the channel as it doesn't exist anymore
- if( DisableChannelInMask( id, ChannelsMask ) == false )
+ if( DisableChannelInMask( id, LoRaMacParams.ChannelsMask ) == false )
{
return LORAMAC_STATUS_PARAMETER_INVALID;
}
@@ -3862,10 +3899,10 @@
macHdr.Value = 0;
macHdr.Bits.MType = FRAME_TYPE_JOIN_REQ;
- IsLoRaMacNetworkJoined = false;
+ ResetMacParameters( );
JoinRequestTrials++;
- ChannelsDatarate = AlternateDatarate( JoinRequestTrials );
+ LoRaMacParams.ChannelsDatarate = AlternateDatarate( JoinRequestTrials );
status = Send( &macHdr, 0, NULL, 0 );
break;
@@ -3964,7 +4001,7 @@
{
if( ValueInRange( datarate, LORAMAC_TX_MIN_DATARATE, LORAMAC_TX_MAX_DATARATE ) == true )
{
- ChannelsDatarate = datarate;
+ LoRaMacParams.ChannelsDatarate = datarate;
}
else
{