diff --git a/src/apps/LoRaMac/common/LmHandler/packages/LmhpRemoteMcastSetup.c b/src/apps/LoRaMac/common/LmHandler/packages/LmhpRemoteMcastSetup.c index d173ab30..ebb949da 100644 --- a/src/apps/LoRaMac/common/LmHandler/packages/LmhpRemoteMcastSetup.c +++ b/src/apps/LoRaMac/common/LmHandler/packages/LmhpRemoteMcastSetup.c @@ -311,14 +311,13 @@ static void LmhpRemoteMcastSetupOnMcpsIndication( McpsIndication_t *mcpsIndicati McChannelParams_t channel = { .IsRemotelySetup = true, - .Class = CLASS_C, // Field not used for multicast channel setup. Must be initialized to something .IsEnabled = true, .GroupID = ( AddressIdentifier_t )McSessionData[id].McGroupData.IdHeader.Fields.McGroupId, .Address = McSessionData[id].McGroupData.McAddr, .McKeys.McKeyE = McSessionData[id].McGroupData.McKeyEncrypted, .FCountMin = McSessionData[id].McGroupData.McFCountMin, .FCountMax = McSessionData[id].McGroupData.McFCountMax, - .RxParams.ClassC = // Field not used for multicast channel setup. Must be initialized to something + .RxParams.Params.ClassC = // Field not used for multicast channel setup. Must be initialized to something { .Frequency = 0, .Datarate = 0 @@ -354,22 +353,23 @@ static void LmhpRemoteMcastSetupOnMcpsIndication( McpsIndication_t *mcpsIndicati uint8_t status = 0x00; uint8_t id = mcpsIndication->Buffer[cmdIndex++] & 0x03; + McSessionData[id].RxParams.Class = CLASS_C; + McSessionData[id].SessionTime = ( mcpsIndication->Buffer[cmdIndex++] << 0 ) & 0x000000FF; McSessionData[id].SessionTime += ( mcpsIndication->Buffer[cmdIndex++] << 8 ) & 0x0000FF00; McSessionData[id].SessionTime += ( mcpsIndication->Buffer[cmdIndex++] << 16 ) & 0x00FF0000; McSessionData[id].SessionTime += ( mcpsIndication->Buffer[cmdIndex++] << 24 ) & 0xFF000000; - // Add Unix to Gps epcoh offset. The system time is based on Unix time. + // Add Unix to Gps epoch offset. The system time is based on Unix time. McSessionData[id].SessionTime += UNIX_GPS_EPOCH_OFFSET; McSessionData[id].SessionTimeout = mcpsIndication->Buffer[cmdIndex++] & 0x0F; - McSessionData[id].RxParams.ClassC.Frequency = ( mcpsIndication->Buffer[cmdIndex++] << 0 ) & 0x000000FF; - McSessionData[id].RxParams.ClassC.Frequency |= ( mcpsIndication->Buffer[cmdIndex++] << 8 ) & 0x0000FF00; - McSessionData[id].RxParams.ClassC.Frequency |= ( mcpsIndication->Buffer[cmdIndex++] << 16 ) & 0x00FF0000; - McSessionData[id].RxParams.ClassC.Frequency *= 100; - - McSessionData[id].RxParams.ClassC.Datarate = mcpsIndication->Buffer[cmdIndex++]; + McSessionData[id].RxParams.Params.ClassC.Frequency = ( mcpsIndication->Buffer[cmdIndex++] << 0 ) & 0x000000FF; + McSessionData[id].RxParams.Params.ClassC.Frequency |= ( mcpsIndication->Buffer[cmdIndex++] << 8 ) & 0x0000FF00; + McSessionData[id].RxParams.Params.ClassC.Frequency |= ( mcpsIndication->Buffer[cmdIndex++] << 16 ) & 0x00FF0000; + McSessionData[id].RxParams.Params.ClassC.Frequency *= 100; + McSessionData[id].RxParams.Params.ClassC.Datarate = mcpsIndication->Buffer[cmdIndex++]; LmhpRemoteMcastSetupState.DataBuffer[dataBufferIndex++] = REMOTE_MCAST_SETUP_MC_GROUP_CLASS_C_SESSION_ANS; if( LoRaMacMcChannelSetupRxParams( ( AddressIdentifier_t )id, &McSessionData[id].RxParams, &status ) == LORAMAC_STATUS_OK ) @@ -403,7 +403,56 @@ static void LmhpRemoteMcastSetupOnMcpsIndication( McpsIndication_t *mcpsIndicati } case REMOTE_MCAST_SETUP_MC_GROUP_CLASS_B_SESSION_REQ: { - // TODO implement command prosessing and handling + uint8_t status = 0x00; + uint8_t id = mcpsIndication->Buffer[cmdIndex++] & 0x03; + + McSessionData[id].RxParams.Class = CLASS_B; + + McSessionData[id].SessionTime = ( mcpsIndication->Buffer[cmdIndex++] << 0 ) & 0x000000FF; + McSessionData[id].SessionTime += ( mcpsIndication->Buffer[cmdIndex++] << 8 ) & 0x0000FF00; + McSessionData[id].SessionTime += ( mcpsIndication->Buffer[cmdIndex++] << 16 ) & 0x00FF0000; + McSessionData[id].SessionTime += ( mcpsIndication->Buffer[cmdIndex++] << 24 ) & 0xFF000000; + + // Add Unix to Gps epoch offset. The system time is based on Unix time. + McSessionData[id].SessionTime += UNIX_GPS_EPOCH_OFFSET; + + McSessionData[id].RxParams.Params.ClassB.Periodicity = ( mcpsIndication->Buffer[cmdIndex] >> 4 ) & 0x07; + McSessionData[id].SessionTimeout = mcpsIndication->Buffer[cmdIndex++] & 0x0F; + + McSessionData[id].RxParams.Params.ClassB.Frequency = ( mcpsIndication->Buffer[cmdIndex++] << 0 ) & 0x000000FF; + McSessionData[id].RxParams.Params.ClassB.Frequency |= ( mcpsIndication->Buffer[cmdIndex++] << 8 ) & 0x0000FF00; + McSessionData[id].RxParams.Params.ClassB.Frequency |= ( mcpsIndication->Buffer[cmdIndex++] << 16 ) & 0x00FF0000; + McSessionData[id].RxParams.Params.ClassB.Frequency *= 100; + McSessionData[id].RxParams.Params.ClassB.Datarate = mcpsIndication->Buffer[cmdIndex++]; + + LmhpRemoteMcastSetupState.DataBuffer[dataBufferIndex++] = REMOTE_MCAST_SETUP_MC_GROUP_CLASS_B_SESSION_ANS; + if( LoRaMacMcChannelSetupRxParams( ( AddressIdentifier_t )id, &McSessionData[id].RxParams, &status ) == LORAMAC_STATUS_OK ) + { + SysTime_t curTime = { .Seconds = 0, .SubSeconds = 0 }; + curTime = SysTimeGet( ); + + int32_t timeToSessionStart = McSessionData[id].SessionTime - curTime.Seconds; + if( timeToSessionStart > 0 ) + { + // Start session start timer + TimerSetValue( &SessionStartTimer, timeToSessionStart * 1000 ); + TimerStart( &SessionStartTimer ); + + DBG( "Time2SessionStart: %ld ms\n", timeToSessionStart * 1000 ); + + LmhpRemoteMcastSetupState.DataBuffer[dataBufferIndex++] = status; + LmhpRemoteMcastSetupState.DataBuffer[dataBufferIndex++] = ( timeToSessionStart >> 0 ) & 0xFF; + LmhpRemoteMcastSetupState.DataBuffer[dataBufferIndex++] = ( timeToSessionStart >> 8 ) & 0xFF; + LmhpRemoteMcastSetupState.DataBuffer[dataBufferIndex++] = ( timeToSessionStart >> 16 ) & 0xFF; + break; + } + else + { + // Session start time before current device time + status |= 0x10; + } + } + LmhpRemoteMcastSetupState.DataBuffer[dataBufferIndex++] = status; break; } default: @@ -436,9 +485,17 @@ static void LmhpRemoteMcastSetupOnMcpsIndication( McpsIndication_t *mcpsIndicati DBG( "McFCountMax : %lu\n", McSessionData[0].McGroupData.McFCountMax ); DBG( "SessionTime : %lu\n", McSessionData[0].SessionTime ); DBG( "SessionTimeT: %d\n", McSessionData[0].SessionTimeout ); - DBG( "Rx Freq : %lu\n", McSessionData[0].RxParams.ClassC.Frequency ); - DBG( "Rx DR : DR_%d\n", McSessionData[0].RxParams.ClassC.Datarate ); - + if( McSessionData[0].RxParams.Class == CLASS_B ) + { + DBG( "Rx Freq : %lu\n", McSessionData[0].RxParams.Params.ClassB.Frequency ); + DBG( "Rx DR : DR_%d\n", McSessionData[0].RxParams.Params.ClassB.Datarate ); + DBG( "Periodicity : %u\n", McSessionData[0].RxParams.Params.ClassB.Periodicity ); + } + else + { + DBG( "Rx Freq : %lu\n", McSessionData[0].RxParams.Params.ClassC.Frequency ); + DBG( "Rx DR : DR_%d\n", McSessionData[0].RxParams.Params.ClassC.Datarate ); + } } } diff --git a/src/mac/LoRaMac.c b/src/mac/LoRaMac.c index be852579..3ab2224d 100644 --- a/src/mac/LoRaMac.c +++ b/src/mac/LoRaMac.c @@ -1998,11 +1998,11 @@ static LoRaMacStatus_t SwitchClass( DeviceClass_t deviceClass ) for( int8_t i = 0; i < LORAMAC_MAX_MC_CTX; i++ ) { - if( Nvm.MacGroup2.MulticastChannelList[i].ChannelParams.IsEnabled == true ) - // TODO: Check multicast channel device class. + if( ( Nvm.MacGroup2.MulticastChannelList[i].ChannelParams.IsEnabled == true ) && + ( Nvm.MacGroup2.MulticastChannelList[i].ChannelParams.RxParams.Class == CLASS_C ) ) { - Nvm.MacGroup2.MacParams.RxCChannel.Frequency = Nvm.MacGroup2.MulticastChannelList[i].ChannelParams.RxParams.ClassC.Frequency; - Nvm.MacGroup2.MacParams.RxCChannel.Datarate = Nvm.MacGroup2.MulticastChannelList[i].ChannelParams.RxParams.ClassC.Datarate; + Nvm.MacGroup2.MacParams.RxCChannel.Frequency = Nvm.MacGroup2.MulticastChannelList[i].ChannelParams.RxParams.Params.ClassC.Frequency; + Nvm.MacGroup2.MacParams.RxCChannel.Datarate = Nvm.MacGroup2.MulticastChannelList[i].ChannelParams.RxParams.Params.ClassC.Datarate; MacCtx.RxWindowCConfig.Channel = MacCtx.Channel; MacCtx.RxWindowCConfig.Frequency = Nvm.MacGroup2.MacParams.RxCChannel.Frequency; @@ -4900,12 +4900,6 @@ LoRaMacStatus_t LoRaMacMcChannelSetup( McChannelParams_t *channel ) } } - if( channel->Class == CLASS_B ) - { - // Calculate class b parameters - LoRaMacClassBSetMulticastPeriodicity( &Nvm.MacGroup2.MulticastChannelList[channel->GroupID] ); - } - // Reset multicast channel downlink counter to initial value. *Nvm.MacGroup2.MulticastChannelList[channel->GroupID].DownLinkCounter = FCNT_DOWN_INITAL_VALUE; return LORAMAC_STATUS_OK; @@ -4954,8 +4948,7 @@ LoRaMacStatus_t LoRaMacMcChannelSetupRxParams( AddressIdentifier_t groupID, McRx return LORAMAC_STATUS_BUSY; } - DeviceClass_t devClass = Nvm.MacGroup2.MulticastChannelList[groupID].ChannelParams.Class; - if( ( devClass == CLASS_A ) || ( devClass > CLASS_C ) ) + if( ( rxParams->Class == CLASS_A ) || ( rxParams->Class > CLASS_C ) ) { return LORAMAC_STATUS_PARAMETER_INVALID; } @@ -4969,13 +4962,13 @@ LoRaMacStatus_t LoRaMacMcChannelSetupRxParams( AddressIdentifier_t groupID, McRx VerifyParams_t verify; // Check datarate - if( devClass == CLASS_B ) + if( rxParams->Class == CLASS_B ) { - verify.DatarateParams.Datarate = rxParams->ClassB.Datarate; + verify.DatarateParams.Datarate = rxParams->Params.ClassB.Datarate; } else { - verify.DatarateParams.Datarate = rxParams->ClassC.Datarate; + verify.DatarateParams.Datarate = rxParams->Params.ClassC.Datarate; } verify.DatarateParams.DownlinkDwellTime = Nvm.MacGroup2.MacParams.DownlinkDwellTime; @@ -4985,13 +4978,13 @@ LoRaMacStatus_t LoRaMacMcChannelSetupRxParams( AddressIdentifier_t groupID, McRx } // Check frequency - if( devClass == CLASS_B ) + if( rxParams->Class == CLASS_B ) { - verify.Frequency = rxParams->ClassB.Frequency; + verify.Frequency = rxParams->Params.ClassB.Frequency; } else { - verify.Frequency = rxParams->ClassC.Frequency; + verify.Frequency = rxParams->Params.ClassC.Frequency; } if( RegionVerify( Nvm.MacGroup2.Region, &verify, PHY_FREQUENCY ) == true ) { @@ -5003,6 +4996,12 @@ LoRaMacStatus_t LoRaMacMcChannelSetupRxParams( AddressIdentifier_t groupID, McRx // Apply parameters Nvm.MacGroup2.MulticastChannelList[groupID].ChannelParams.RxParams = *rxParams; } + + if( rxParams->Class == CLASS_B ) + { + // Calculate class b parameters + LoRaMacClassBSetMulticastPeriodicity( &Nvm.MacGroup2.MulticastChannelList[groupID] ); + } return LORAMAC_STATUS_OK; } diff --git a/src/mac/LoRaMacClassB.c b/src/mac/LoRaMacClassB.c index 5fa146eb..e21d4ef9 100644 --- a/src/mac/LoRaMacClassB.c +++ b/src/mac/LoRaMacClassB.c @@ -1208,7 +1208,7 @@ static void LoRaMacClassBProcessMulticastSlot( void ) } // Apply frequency - frequency = Ctx.PingSlotCtx.NextMulticastChannel->ChannelParams.RxParams.ClassB.Frequency; + frequency = Ctx.PingSlotCtx.NextMulticastChannel->ChannelParams.RxParams.Params.ClassB.Frequency; // Restore the floor plan frequency if there is no individual frequency assigned if( frequency == 0 ) @@ -1237,7 +1237,7 @@ static void LoRaMacClassBProcessMulticastSlot( void ) Ctx.MulticastSlotState = PINGSLOT_STATE_RX; - multicastSlotRxConfig.Datarate = Ctx.PingSlotCtx.NextMulticastChannel->ChannelParams.RxParams.ClassB.Datarate; + multicastSlotRxConfig.Datarate = Ctx.PingSlotCtx.NextMulticastChannel->ChannelParams.RxParams.Params.ClassB.Datarate; multicastSlotRxConfig.DownlinkDwellTime = Ctx.LoRaMacClassBParams.LoRaMacParams->DownlinkDwellTime; multicastSlotRxConfig.Frequency = frequency; multicastSlotRxConfig.RxContinuous = false; @@ -1798,7 +1798,7 @@ void LoRaMacClassBSetMulticastPeriodicity( MulticastCtx_t* multicastChannel ) #ifdef LORAMAC_CLASSB_ENABLED if( multicastChannel != NULL ) { - multicastChannel->PingNb = CalcPingNb( multicastChannel->ChannelParams.RxParams.ClassB.Periodicity ); + multicastChannel->PingNb = CalcPingNb( multicastChannel->ChannelParams.RxParams.Params.ClassB.Periodicity ); multicastChannel->PingPeriod = CalcPingPeriod( multicastChannel->PingNb ); } #endif // LORAMAC_CLASSB_ENABLED diff --git a/src/mac/LoRaMacTypes.h b/src/mac/LoRaMacTypes.h index b87cdedf..1896a376 100644 --- a/src/mac/LoRaMacTypes.h +++ b/src/mac/LoRaMacTypes.h @@ -48,522 +48,522 @@ extern "C" /*! * Start value for unicast keys enumeration */ -#define LORAMAC_CRYPTO_UNICAST_KEYS 0 +#define LORAMAC_CRYPTO_UNICAST_KEYS 0 /*! * Start value for multicast keys enumeration */ -#define LORAMAC_CRYPTO_MULTICAST_KEYS 127 +#define LORAMAC_CRYPTO_MULTICAST_KEYS 127 /*! * Maximum number of multicast context */ -#define LORAMAC_MAX_MC_CTX 4 +#define LORAMAC_MAX_MC_CTX 4 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | SF12 - BW125 + * AU915 | SF10 - BW125 + * CN470 | SF12 - BW125 + * CN779 | SF12 - BW125 + * EU433 | SF12 - BW125 + * EU868 | SF12 - BW125 + * IN865 | SF12 - BW125 + * KR920 | SF12 - BW125 + * US915 | SF10 - BW125 + * RU864 | SF12 - BW125 + */ +#define DR_0 0 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | SF11 - BW125 + * AU915 | SF9 - BW125 + * CN470 | SF11 - BW125 + * CN779 | SF11 - BW125 + * EU433 | SF11 - BW125 + * EU868 | SF11 - BW125 + * IN865 | SF11 - BW125 + * KR920 | SF11 - BW125 + * US915 | SF9 - BW125 + * RU864 | SF11 - BW125 + */ +#define DR_1 1 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | SF10 - BW125 + * AU915 | SF8 - BW125 + * CN470 | SF10 - BW125 + * CN779 | SF10 - BW125 + * EU433 | SF10 - BW125 + * EU868 | SF10 - BW125 + * IN865 | SF10 - BW125 + * KR920 | SF10 - BW125 + * US915 | SF8 - BW125 + * RU864 | SF10 - BW125 + */ +#define DR_2 2 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | SF9 - BW125 + * AU915 | SF7 - BW125 + * CN470 | SF9 - BW125 + * CN779 | SF9 - BW125 + * EU433 | SF9 - BW125 + * EU868 | SF9 - BW125 + * IN865 | SF9 - BW125 + * KR920 | SF9 - BW125 + * US915 | SF7 - BW125 + * RU864 | SF9 - BW125 + */ +#define DR_3 3 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | SF8 - BW125 + * AU915 | SF8 - BW500 + * CN470 | SF8 - BW125 + * CN779 | SF8 - BW125 + * EU433 | SF8 - BW125 + * EU868 | SF8 - BW125 + * IN865 | SF8 - BW125 + * KR920 | SF8 - BW125 + * US915 | SF8 - BW500 + * RU864 | SF8 - BW125 + */ +#define DR_4 4 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | SF7 - BW125 + * AU915 | RFU + * CN470 | SF7 - BW125 + * CN779 | SF7 - BW125 + * EU433 | SF7 - BW125 + * EU868 | SF7 - BW125 + * IN865 | SF7 - BW125 + * KR920 | SF7 - BW125 + * US915 | RFU + * RU864 | SF7 - BW125 + */ +#define DR_5 5 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | SF7 - BW250 + * AU915 | RFU + * CN470 | SF12 - BW125 + * CN779 | SF7 - BW250 + * EU433 | SF7 - BW250 + * EU868 | SF7 - BW250 + * IN865 | SF7 - BW250 + * KR920 | RFU + * US915 | RFU + * RU864 | SF7 - BW250 + */ +#define DR_6 6 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | FSK + * AU915 | RFU + * CN470 | SF12 - BW125 + * CN779 | FSK + * EU433 | FSK + * EU868 | FSK + * IN865 | FSK + * KR920 | RFU + * US915 | RFU + * RU864 | FSK + */ +#define DR_7 7 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | RFU + * AU915 | SF12 - BW500 + * CN470 | RFU + * CN779 | RFU + * EU433 | RFU + * EU868 | RFU + * IN865 | RFU + * KR920 | RFU + * US915 | SF12 - BW500 + * RU864 | RFU + */ +#define DR_8 8 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | RFU + * AU915 | SF11 - BW500 + * CN470 | RFU + * CN779 | RFU + * EU433 | RFU + * EU868 | RFU + * IN865 | RFU + * KR920 | RFU + * US915 | SF11 - BW500 + * RU864 | RFU + */ +#define DR_9 9 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | RFU + * AU915 | SF10 - BW500 + * CN470 | RFU + * CN779 | RFU + * EU433 | RFU + * EU868 | RFU + * IN865 | RFU + * KR920 | RFU + * US915 | SF10 - BW500 + * RU864 | RFU + */ +#define DR_10 10 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | RFU + * AU915 | SF9 - BW500 + * CN470 | RFU + * CN779 | RFU + * EU433 | RFU + * EU868 | RFU + * IN865 | RFU + * KR920 | RFU + * US915 | SF9 - BW500 + * RU864 | RFU + */ +#define DR_11 11 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | RFU + * AU915 | SF8 - BW500 + * CN470 | RFU + * CN779 | RFU + * EU433 | RFU + * EU868 | RFU + * IN865 | RFU + * KR920 | RFU + * US915 | SF8 - BW500 + * RU864 | RFU + */ +#define DR_12 12 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | RFU + * AU915 | SF7 - BW500 + * CN470 | RFU + * CN779 | RFU + * EU433 | RFU + * EU868 | RFU + * IN865 | RFU + * KR920 | RFU + * US915 | SF7 - BW500 + * RU864 | RFU + */ +#define DR_13 13 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | RFU + * AU915 | RFU + * CN470 | RFU + * CN779 | RFU + * EU433 | RFU + * EU868 | RFU + * IN865 | RFU + * KR920 | RFU + * US915 | RFU + * RU864 | RFU + */ +#define DR_14 14 + +/*! + * Region | SF + * ------------ | :-----: + * AS923 | RFU + * AU915 | RFU + * CN470 | RFU + * CN779 | RFU + * EU433 | RFU + * EU868 | RFU + * IN865 | RFU + * KR920 | RFU + * US915 | RFU + * RU864 | RFU + */ +#define DR_15 15 + + + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | Max EIRP + * AU915 | Max EIRP + * CN470 | Max EIRP + * CN779 | Max EIRP + * EU433 | Max EIRP + * EU868 | Max EIRP + * IN865 | Max EIRP + * KR920 | Max EIRP + * US915 | Max ERP + * RU864 | Max EIRP + */ +#define TX_POWER_0 0 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | Max EIRP - 2 + * AU915 | Max EIRP - 2 + * CN470 | Max EIRP - 2 + * CN779 | Max EIRP - 2 + * EU433 | Max EIRP - 2 + * EU868 | Max EIRP - 2 + * IN865 | Max EIRP - 2 + * KR920 | Max EIRP - 2 + * US915 | Max ERP - 2 + * RU864 | Max EIRP - 2 + */ +#define TX_POWER_1 1 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | Max EIRP - 4 + * AU915 | Max EIRP - 4 + * CN470 | Max EIRP - 4 + * CN779 | Max EIRP - 4 + * EU433 | Max EIRP - 4 + * EU868 | Max EIRP - 4 + * IN865 | Max EIRP - 4 + * KR920 | Max EIRP - 4 + * US915 | Max ERP - 4 + * RU864 | Max EIRP - 4 + */ +#define TX_POWER_2 2 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | Max EIRP - 6 + * AU915 | Max EIRP - 6 + * CN470 | Max EIRP - 6 + * CN779 | Max EIRP - 6 + * EU433 | Max EIRP - 6 + * EU868 | Max EIRP - 6 + * IN865 | Max EIRP - 6 + * KR920 | Max EIRP - 6 + * US915 | Max ERP - 6 + * RU864 | Max EIRP - 6 + */ +#define TX_POWER_3 3 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | Max EIRP - 8 + * AU915 | Max EIRP - 8 + * CN470 | Max EIRP - 8 + * CN779 | Max EIRP - 8 + * EU433 | Max EIRP - 8 + * EU868 | Max EIRP - 8 + * IN865 | Max EIRP - 8 + * KR920 | Max EIRP - 8 + * US915 | Max ERP - 8 + * RU864 | Max EIRP - 8 + */ +#define TX_POWER_4 4 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | Max EIRP - 10 + * AU915 | Max EIRP - 10 + * CN470 | Max EIRP - 10 + * CN779 | Max EIRP - 10 + * EU433 | Max EIRP - 10 + * EU868 | Max EIRP - 10 + * IN865 | Max EIRP - 10 + * KR920 | Max EIRP - 10 + * US915 | Max ERP - 10 + * RU864 | Max EIRP - 10 + */ +#define TX_POWER_5 5 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | Max EIRP - 12 + * AU915 | Max EIRP - 12 + * CN470 | Max EIRP - 12 + * CN779 | - + * EU433 | - + * EU868 | Max EIRP - 12 + * IN865 | Max EIRP - 12 + * KR920 | Max EIRP - 12 + * US915 | Max ERP - 12 + * RU864 | Max EIRP - 12 + */ +#define TX_POWER_6 6 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | Max EIRP - 14 + * AU915 | Max EIRP - 14 + * CN470 | Max EIRP - 14 + * CN779 | - + * EU433 | - + * EU868 | Max EIRP - 14 + * IN865 | Max EIRP - 14 + * KR920 | Max EIRP - 14 + * US915 | Max ERP - 14 + * RU864 | Max EIRP - 14 + */ +#define TX_POWER_7 7 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | - + * AU915 | Max EIRP - 16 + * CN470 | - + * CN779 | - + * EU433 | - + * EU868 | - + * IN865 | Max EIRP - 16 + * KR920 | - + * US915 | Max ERP - 16 + * RU864 | - + */ +#define TX_POWER_8 8 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | - + * AU915 | Max EIRP - 18 + * CN470 | - + * CN779 | - + * EU433 | - + * EU868 | - + * IN865 | Max EIRP - 18 + * KR920 | - + * US915 | Max ERP - 18 + * RU864 | - + */ +#define TX_POWER_9 9 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | - + * AU915 | Max EIRP - 20 + * CN470 | - + * CN779 | - + * EU433 | - + * EU868 | - + * IN865 | Max EIRP - 20 + * KR920 | - + * US915 | Max ERP - 20 + * RU864 | - + */ +#define TX_POWER_10 10 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | - + * AU915 | Max EIRP - 22 + * CN470 | - + * CN779 | - + * EU433 | - + * EU868 | - + * IN865 | - + * KR920 | - + * US915 | Max ERP - 22 + * RU864 | - + */ +#define TX_POWER_11 11 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | - + * AU915 | Max EIRP - 24 + * CN470 | - + * CN779 | - + * EU433 | - + * EU868 | - + * IN865 | - + * KR920 | - + * US915 | Max ERP - 24 + * RU864 | - + */ +#define TX_POWER_12 12 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | - + * AU915 | Max EIRP - 26 + * CN470 | - + * CN779 | - + * EU433 | - + * EU868 | - + * IN865 | - + * KR920 | - + * US915 | Max ERP - 26 + * RU864 | - + */ +#define TX_POWER_13 13 + +/*! + * Region | dBM + * ------------ | :-----: + * AS923 | - + * AU915 | Max EIRP - 28 + * CN470 | - + * CN779 | - + * EU433 | - + * EU868 | - + * IN865 | - + * KR920 | - + * US915 | Max ERP - 28 + * RU864 | - + */ +#define TX_POWER_14 14 + +/*! + * RFU + */ +#define TX_POWER_15 15 /*! - * Region | SF - * ------------ | :-----: - * AS923 | SF12 - BW125 - * AU915 | SF10 - BW125 - * CN470 | SF12 - BW125 - * CN779 | SF12 - BW125 - * EU433 | SF12 - BW125 - * EU868 | SF12 - BW125 - * IN865 | SF12 - BW125 - * KR920 | SF12 - BW125 - * US915 | SF10 - BW125 - * RU864 | SF12 - BW125 - */ -#define DR_0 0 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | SF11 - BW125 - * AU915 | SF9 - BW125 - * CN470 | SF11 - BW125 - * CN779 | SF11 - BW125 - * EU433 | SF11 - BW125 - * EU868 | SF11 - BW125 - * IN865 | SF11 - BW125 - * KR920 | SF11 - BW125 - * US915 | SF9 - BW125 - * RU864 | SF11 - BW125 - */ -#define DR_1 1 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | SF10 - BW125 - * AU915 | SF8 - BW125 - * CN470 | SF10 - BW125 - * CN779 | SF10 - BW125 - * EU433 | SF10 - BW125 - * EU868 | SF10 - BW125 - * IN865 | SF10 - BW125 - * KR920 | SF10 - BW125 - * US915 | SF8 - BW125 - * RU864 | SF10 - BW125 - */ -#define DR_2 2 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | SF9 - BW125 - * AU915 | SF7 - BW125 - * CN470 | SF9 - BW125 - * CN779 | SF9 - BW125 - * EU433 | SF9 - BW125 - * EU868 | SF9 - BW125 - * IN865 | SF9 - BW125 - * KR920 | SF9 - BW125 - * US915 | SF7 - BW125 - * RU864 | SF9 - BW125 - */ -#define DR_3 3 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | SF8 - BW125 - * AU915 | SF8 - BW500 - * CN470 | SF8 - BW125 - * CN779 | SF8 - BW125 - * EU433 | SF8 - BW125 - * EU868 | SF8 - BW125 - * IN865 | SF8 - BW125 - * KR920 | SF8 - BW125 - * US915 | SF8 - BW500 - * RU864 | SF8 - BW125 - */ -#define DR_4 4 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | SF7 - BW125 - * AU915 | RFU - * CN470 | SF7 - BW125 - * CN779 | SF7 - BW125 - * EU433 | SF7 - BW125 - * EU868 | SF7 - BW125 - * IN865 | SF7 - BW125 - * KR920 | SF7 - BW125 - * US915 | RFU - * RU864 | SF7 - BW125 - */ -#define DR_5 5 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | SF7 - BW250 - * AU915 | RFU - * CN470 | SF12 - BW125 - * CN779 | SF7 - BW250 - * EU433 | SF7 - BW250 - * EU868 | SF7 - BW250 - * IN865 | SF7 - BW250 - * KR920 | RFU - * US915 | RFU - * RU864 | SF7 - BW250 - */ -#define DR_6 6 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | FSK - * AU915 | RFU - * CN470 | SF12 - BW125 - * CN779 | FSK - * EU433 | FSK - * EU868 | FSK - * IN865 | FSK - * KR920 | RFU - * US915 | RFU - * RU864 | FSK - */ -#define DR_7 7 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | RFU - * AU915 | SF12 - BW500 - * CN470 | RFU - * CN779 | RFU - * EU433 | RFU - * EU868 | RFU - * IN865 | RFU - * KR920 | RFU - * US915 | SF12 - BW500 - * RU864 | RFU - */ -#define DR_8 8 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | RFU - * AU915 | SF11 - BW500 - * CN470 | RFU - * CN779 | RFU - * EU433 | RFU - * EU868 | RFU - * IN865 | RFU - * KR920 | RFU - * US915 | SF11 - BW500 - * RU864 | RFU - */ -#define DR_9 9 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | RFU - * AU915 | SF10 - BW500 - * CN470 | RFU - * CN779 | RFU - * EU433 | RFU - * EU868 | RFU - * IN865 | RFU - * KR920 | RFU - * US915 | SF10 - BW500 - * RU864 | RFU - */ -#define DR_10 10 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | RFU - * AU915 | SF9 - BW500 - * CN470 | RFU - * CN779 | RFU - * EU433 | RFU - * EU868 | RFU - * IN865 | RFU - * KR920 | RFU - * US915 | SF9 - BW500 - * RU864 | RFU - */ -#define DR_11 11 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | RFU - * AU915 | SF8 - BW500 - * CN470 | RFU - * CN779 | RFU - * EU433 | RFU - * EU868 | RFU - * IN865 | RFU - * KR920 | RFU - * US915 | SF8 - BW500 - * RU864 | RFU - */ -#define DR_12 12 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | RFU - * AU915 | SF7 - BW500 - * CN470 | RFU - * CN779 | RFU - * EU433 | RFU - * EU868 | RFU - * IN865 | RFU - * KR920 | RFU - * US915 | SF7 - BW500 - * RU864 | RFU - */ -#define DR_13 13 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | RFU - * AU915 | RFU - * CN470 | RFU - * CN779 | RFU - * EU433 | RFU - * EU868 | RFU - * IN865 | RFU - * KR920 | RFU - * US915 | RFU - * RU864 | RFU - */ -#define DR_14 14 - -/*! - * Region | SF - * ------------ | :-----: - * AS923 | RFU - * AU915 | RFU - * CN470 | RFU - * CN779 | RFU - * EU433 | RFU - * EU868 | RFU - * IN865 | RFU - * KR920 | RFU - * US915 | RFU - * RU864 | RFU - */ -#define DR_15 15 - - - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | Max EIRP - * AU915 | Max EIRP - * CN470 | Max EIRP - * CN779 | Max EIRP - * EU433 | Max EIRP - * EU868 | Max EIRP - * IN865 | Max EIRP - * KR920 | Max EIRP - * US915 | Max ERP - * RU864 | Max EIRP - */ -#define TX_POWER_0 0 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | Max EIRP - 2 - * AU915 | Max EIRP - 2 - * CN470 | Max EIRP - 2 - * CN779 | Max EIRP - 2 - * EU433 | Max EIRP - 2 - * EU868 | Max EIRP - 2 - * IN865 | Max EIRP - 2 - * KR920 | Max EIRP - 2 - * US915 | Max ERP - 2 - * RU864 | Max EIRP - 2 - */ -#define TX_POWER_1 1 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | Max EIRP - 4 - * AU915 | Max EIRP - 4 - * CN470 | Max EIRP - 4 - * CN779 | Max EIRP - 4 - * EU433 | Max EIRP - 4 - * EU868 | Max EIRP - 4 - * IN865 | Max EIRP - 4 - * KR920 | Max EIRP - 4 - * US915 | Max ERP - 4 - * RU864 | Max EIRP - 4 - */ -#define TX_POWER_2 2 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | Max EIRP - 6 - * AU915 | Max EIRP - 6 - * CN470 | Max EIRP - 6 - * CN779 | Max EIRP - 6 - * EU433 | Max EIRP - 6 - * EU868 | Max EIRP - 6 - * IN865 | Max EIRP - 6 - * KR920 | Max EIRP - 6 - * US915 | Max ERP - 6 - * RU864 | Max EIRP - 6 - */ -#define TX_POWER_3 3 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | Max EIRP - 8 - * AU915 | Max EIRP - 8 - * CN470 | Max EIRP - 8 - * CN779 | Max EIRP - 8 - * EU433 | Max EIRP - 8 - * EU868 | Max EIRP - 8 - * IN865 | Max EIRP - 8 - * KR920 | Max EIRP - 8 - * US915 | Max ERP - 8 - * RU864 | Max EIRP - 8 - */ -#define TX_POWER_4 4 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | Max EIRP - 10 - * AU915 | Max EIRP - 10 - * CN470 | Max EIRP - 10 - * CN779 | Max EIRP - 10 - * EU433 | Max EIRP - 10 - * EU868 | Max EIRP - 10 - * IN865 | Max EIRP - 10 - * KR920 | Max EIRP - 10 - * US915 | Max ERP - 10 - * RU864 | Max EIRP - 10 - */ -#define TX_POWER_5 5 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | Max EIRP - 12 - * AU915 | Max EIRP - 12 - * CN470 | Max EIRP - 12 - * CN779 | - - * EU433 | - - * EU868 | Max EIRP - 12 - * IN865 | Max EIRP - 12 - * KR920 | Max EIRP - 12 - * US915 | Max ERP - 12 - * RU864 | Max EIRP - 12 - */ -#define TX_POWER_6 6 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | Max EIRP - 14 - * AU915 | Max EIRP - 14 - * CN470 | Max EIRP - 14 - * CN779 | - - * EU433 | - - * EU868 | Max EIRP - 14 - * IN865 | Max EIRP - 14 - * KR920 | Max EIRP - 14 - * US915 | Max ERP - 14 - * RU864 | Max EIRP - 14 - */ -#define TX_POWER_7 7 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | - - * AU915 | Max EIRP - 16 - * CN470 | - - * CN779 | - - * EU433 | - - * EU868 | - - * IN865 | Max EIRP - 16 - * KR920 | - - * US915 | Max ERP - 16 - * RU864 | - - */ -#define TX_POWER_8 8 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | - - * AU915 | Max EIRP - 18 - * CN470 | - - * CN779 | - - * EU433 | - - * EU868 | - - * IN865 | Max EIRP - 18 - * KR920 | - - * US915 | Max ERP - 18 - * RU864 | - - */ -#define TX_POWER_9 9 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | - - * AU915 | Max EIRP - 20 - * CN470 | - - * CN779 | - - * EU433 | - - * EU868 | - - * IN865 | Max EIRP - 20 - * KR920 | - - * US915 | Max ERP - 20 - * RU864 | - - */ -#define TX_POWER_10 10 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | - - * AU915 | Max EIRP - 22 - * CN470 | - - * CN779 | - - * EU433 | - - * EU868 | - - * IN865 | - - * KR920 | - - * US915 | Max ERP - 22 - * RU864 | - - */ -#define TX_POWER_11 11 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | - - * AU915 | Max EIRP - 24 - * CN470 | - - * CN779 | - - * EU433 | - - * EU868 | - - * IN865 | - - * KR920 | - - * US915 | Max ERP - 24 - * RU864 | - - */ -#define TX_POWER_12 12 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | - - * AU915 | Max EIRP - 26 - * CN470 | - - * CN779 | - - * EU433 | - - * EU868 | - - * IN865 | - - * KR920 | - - * US915 | Max ERP - 26 - * RU864 | - - */ -#define TX_POWER_13 13 - -/*! - * Region | dBM - * ------------ | :-----: - * AS923 | - - * AU915 | Max EIRP - 28 - * CN470 | - - * CN779 | - - * EU433 | - - * EU868 | - - * IN865 | - - * KR920 | - - * US915 | Max ERP - 28 - * RU864 | - - */ -#define TX_POWER_14 14 - -/*! - * RFU - */ -#define TX_POWER_15 15 - -/*! * LoRaWAN devices classes definition * * LoRaWAN Specification V1.0.2, chapter 2.1 @@ -807,35 +807,42 @@ typedef enum eAddressIdentifier /* * Multicast Rx window parameters */ -typedef union uMcRxParams +typedef struct sMcRxParams { - struct - { - /*! - * Reception frequency of the ping slot windows - */ - uint32_t Frequency; - /*! - * Datarate of the ping slot - */ - int8_t Datarate; - /*! - * This parameter is necessary for class B operation. It defines the - * periodicity of the multicast downlink slots - */ - uint16_t Periodicity; - }ClassB; - struct + /*! + * Multicats channel LoRaWAN class B or C + */ + DeviceClass_t Class; + union { - /*! - * Reception frequency of the ping slot windows - */ - uint32_t Frequency; - /*! - * Datarate of the ping slot - */ - int8_t Datarate; - }ClassC; + struct + { + /*! + * Reception frequency of the ping slot windows + */ + uint32_t Frequency; + /*! + * Datarate of the ping slot + */ + int8_t Datarate; + /*! + * This parameter is necessary for class B operation. It defines the + * periodicity of the multicast downlink slots + */ + uint16_t Periodicity; + }ClassB; + struct + { + /*! + * Reception frequency of the ping slot windows + */ + uint32_t Frequency; + /*! + * Datarate of the ping slot + */ + int8_t Datarate; + }ClassC; + }Params; }McRxParams_t; /*! @@ -848,10 +855,6 @@ typedef struct sMcChannelParams * Indicates which set of keys are to be used. \ref uMcKeys */ bool IsRemotelySetup; - /*! - * Multicats channel LoRaWAN class B or C - */ - DeviceClass_t Class; /*! * True if the entry is active */ @@ -1179,62 +1182,62 @@ typedef struct sBand }Band_t; /*! - * LoRaMAC channels parameters definition - */ -typedef union uDrRange -{ - /*! - * Byte-access to the bits - */ - int8_t Value; - /*! - * Structure to store the minimum and the maximum datarate - */ - struct sFields - { - /*! - * Minimum data rate - * - * LoRaWAN Regional Parameters V1.0.2rB - * - * The allowed ranges are region specific. Please refer to \ref DR_0 to \ref DR_15 for details. - */ - int8_t Min : 4; - /*! - * Maximum data rate - * - * LoRaWAN Regional Parameters V1.0.2rB - * - * The allowed ranges are region specific. Please refer to \ref DR_0 to \ref DR_15 for details. - */ - int8_t Max : 4; - }Fields; -}DrRange_t; - -/*! - * LoRaMAC channel definition - */ -typedef struct sChannelParams -{ - /*! - * Frequency in Hz - */ - uint32_t Frequency; - /*! - * Alternative frequency for RX window 1 - */ - uint32_t Rx1Frequency; - /*! - * Data rate definition - */ - DrRange_t DrRange; - /*! - * Band index - */ - uint8_t Band; -}ChannelParams_t; - -/*! + * LoRaMAC channels parameters definition + */ +typedef union uDrRange +{ + /*! + * Byte-access to the bits + */ + int8_t Value; + /*! + * Structure to store the minimum and the maximum datarate + */ + struct sFields + { + /*! + * Minimum data rate + * + * LoRaWAN Regional Parameters V1.0.2rB + * + * The allowed ranges are region specific. Please refer to \ref DR_0 to \ref DR_15 for details. + */ + int8_t Min : 4; + /*! + * Maximum data rate + * + * LoRaWAN Regional Parameters V1.0.2rB + * + * The allowed ranges are region specific. Please refer to \ref DR_0 to \ref DR_15 for details. + */ + int8_t Max : 4; + }Fields; +}DrRange_t; + +/*! + * LoRaMAC channel definition + */ +typedef struct sChannelParams +{ + /*! + * Frequency in Hz + */ + uint32_t Frequency; + /*! + * Alternative frequency for RX window 1 + */ + uint32_t Rx1Frequency; + /*! + * Data rate definition + */ + DrRange_t DrRange; + /*! + * Band index + */ + uint8_t Band; +}ChannelParams_t; + +/*! * LoRaMAC frame types * * LoRaWAN Specification V1.0.2, chapter 4.2.1, table 1