From 437062c56386202542cb33f91d33119f55edc7ae Mon Sep 17 00:00:00 2001 From: alistairjordan <> Date: Wed, 3 Jan 2024 17:13:54 +0000 Subject: [PATCH] Region rework --- .../board/lorawan-bridge/LoraMac/LoRaMac.c | 8 + .../LoraMac/common/LmHandler/LmHandler.c | 6 + .../tools/board/lorawan-bridge/LoraMac/main.c | 10 +- .../lorawan-bridge/LoraMac/region/Region.c | 2455 ++++++++++++----- .../board/lorawan-bridge/LoraMac/rtc-board.c | 58 + .../board/lorawan-bridge/LoraMac/rtc-board.h | 2 + .../board/lorawan-bridge/LoraMac/timer.c | 29 +- sysdrv/tools/board/lorawan-bridge/Makefile | 17 +- .../tools/board/lorawan-bridge/libcivetweb.a | Bin 263580 -> 263580 bytes sysdrv/tools/board/lorawan-bridge/rest_server | Bin 0 -> 294256 bytes 10 files changed, 1877 insertions(+), 708 deletions(-) create mode 100644 sysdrv/tools/board/lorawan-bridge/LoraMac/rtc-board.c create mode 100755 sysdrv/tools/board/lorawan-bridge/rest_server diff --git a/sysdrv/tools/board/lorawan-bridge/LoraMac/LoRaMac.c b/sysdrv/tools/board/lorawan-bridge/LoraMac/LoRaMac.c index 0b68920946..ac790e1b6f 100644 --- a/sysdrv/tools/board/lorawan-bridge/LoraMac/LoRaMac.c +++ b/sysdrv/tools/board/lorawan-bridge/LoraMac/LoRaMac.c @@ -45,6 +45,7 @@ #include "LoRaMacAdr.h" #include "LoRaMacSerializer.h" #include "radio.h" +#include #include "LoRaMac.h" @@ -3758,6 +3759,7 @@ LoRaMacStatus_t LoRaMacInitialization( LoRaMacPrimitives_t* primitives, LoRaMacC if( ( primitives == NULL ) || ( callbacks == NULL ) ) { + printf("primitives or callbacks null"); return LORAMAC_STATUS_PARAMETER_INVALID; } @@ -3766,11 +3768,13 @@ LoRaMacStatus_t LoRaMacInitialization( LoRaMacPrimitives_t* primitives, LoRaMacC ( primitives->MacMlmeConfirm == NULL ) || ( primitives->MacMlmeIndication == NULL ) ) { + printf("primitives null"); return LORAMAC_STATUS_PARAMETER_INVALID; } // Verify if the region is supported if( RegionIsActive( region ) == false ) { + printf("region problem: %d", region); return LORAMAC_STATUS_REGION_NOT_SUPPORTED; } @@ -3922,24 +3926,28 @@ LoRaMacStatus_t LoRaMacInitialization( LoRaMacPrimitives_t* primitives, LoRaMacC // Initialize the Secure Element driver if( SecureElementInit( &Nvm.SecureElement ) != SECURE_ELEMENT_SUCCESS ) { + printf("Secure Element Driver failed"); return LORAMAC_STATUS_CRYPTO_ERROR; } // Initialize Crypto module if( LoRaMacCryptoInit( &Nvm.Crypto ) != LORAMAC_CRYPTO_SUCCESS ) { + printf("Crypto Driver failed"); return LORAMAC_STATUS_CRYPTO_ERROR; } // Initialize MAC commands module if( LoRaMacCommandsInit( ) != LORAMAC_COMMANDS_SUCCESS ) { + printf("MAC Driver failed"); return LORAMAC_STATUS_MAC_COMMAD_ERROR; } // Set multicast downlink counter reference if( LoRaMacCryptoSetMulticastReference( Nvm.MacGroup2.MulticastChannelList ) != LORAMAC_CRYPTO_SUCCESS ) { + printf("Multicast Downlink Driver failed"); return LORAMAC_STATUS_CRYPTO_ERROR; } diff --git a/sysdrv/tools/board/lorawan-bridge/LoraMac/common/LmHandler/LmHandler.c b/sysdrv/tools/board/lorawan-bridge/LoraMac/common/LmHandler/LmHandler.c index ebe59fefe1..527b6a5ab0 100644 --- a/sysdrv/tools/board/lorawan-bridge/LoraMac/common/LmHandler/LmHandler.c +++ b/sysdrv/tools/board/lorawan-bridge/LoraMac/common/LmHandler/LmHandler.c @@ -22,6 +22,7 @@ * * \author Miguel Luis ( Semtech ) */ +#include #include #include #include @@ -263,6 +264,7 @@ LmHandlerErrorStatus_t LmHandlerInit( LmHandlerCallbacks_t *handlerCallbacks, if( LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LmHandlerParams->Region ) != LORAMAC_STATUS_OK ) { + printf("IT FAILDED HERE"); return LORAMAC_HANDLER_ERROR; } @@ -335,11 +337,14 @@ LmHandlerErrorStatus_t LmHandlerInit( LmHandlerCallbacks_t *handlerCallbacks, LoRaMacTestSetDutyCycleOn( LmHandlerParams->DutyCycleEnabled ); + printf("HERE1"); LoRaMacStart( ); + printf("HERE2"); mibReq.Type = MIB_NETWORK_ACTIVATION; if( LoRaMacMibGetRequestConfirm( &mibReq ) == LORAMAC_STATUS_OK ) { + printf("HERE3"); if( mibReq.Param.NetworkActivation == ACTIVATION_TYPE_NONE ) { if( LmHandlerCallbacks->OnNetworkParametersChange != NULL ) @@ -348,6 +353,7 @@ LmHandlerErrorStatus_t LmHandlerInit( LmHandlerCallbacks_t *handlerCallbacks, } } } + printf("HERE4"); return LORAMAC_HANDLER_SUCCESS; } diff --git a/sysdrv/tools/board/lorawan-bridge/LoraMac/main.c b/sysdrv/tools/board/lorawan-bridge/LoraMac/main.c index aa11acfe41..2f28281d08 100644 --- a/sysdrv/tools/board/lorawan-bridge/LoraMac/main.c +++ b/sysdrv/tools/board/lorawan-bridge/LoraMac/main.c @@ -24,6 +24,7 @@ /*! \file periodic-uplink/B-L072Z-LRWAN1/main.c */ #include +#include #include "utilities.h" #include "board.h" #include "RegionCommon.h" @@ -274,20 +275,21 @@ int main( void ) // Fatal error, endless loop. while ( 1 ) { + exit(-1); // This is linux now :) } } // Set system maximum tolerated rx error in milliseconds LmHandlerSetSystemMaxRxError( 20 ); - + printf("HERE5"); // The LoRa-Alliance Compliance protocol package should always be // initialized and activated. LmHandlerPackageRegister( PACKAGE_ID_COMPLIANCE, &LmhpComplianceParams ); - + printf("HERE6"); LmHandlerJoin( ); - + printf("HERE7"); StartTxProcess( LORAMAC_HANDLER_TX_ON_TIMER ); - + printf("HERE8"); // while( 1 ) // { // // Process characters sent over the command line interface diff --git a/sysdrv/tools/board/lorawan-bridge/LoraMac/region/Region.c b/sysdrv/tools/board/lorawan-bridge/LoraMac/region/Region.c index 83c380e0dc..01024bf12a 100644 --- a/sysdrv/tools/board/lorawan-bridge/LoraMac/region/Region.c +++ b/sysdrv/tools/board/lorawan-bridge/LoraMac/region/Region.c @@ -32,513 +32,565 @@ #include "Region.h" // Setup regions -#ifdef REGION_AS923 +//#ifdef REGION_AS923 #include "RegionAS923.h" -#define AS923_CASE case LORAMAC_REGION_AS923: -#define AS923_IS_ACTIVE( ) AS923_CASE { return true; } -#define AS923_GET_PHY_PARAM( ) AS923_CASE { return RegionAS923GetPhyParam( getPhy ); } -#define AS923_SET_BAND_TX_DONE( ) AS923_CASE { RegionAS923SetBandTxDone( txDone ); break; } -#define AS923_INIT_DEFAULTS( ) AS923_CASE { RegionAS923InitDefaults( params ); break; } -#define AS923_VERIFY( ) AS923_CASE { return RegionAS923Verify( verify, phyAttribute ); } -#define AS923_APPLY_CF_LIST( ) AS923_CASE { RegionAS923ApplyCFList( applyCFList ); break; } -#define AS923_CHAN_MASK_SET( ) AS923_CASE { return RegionAS923ChanMaskSet( chanMaskSet ); } -#define AS923_COMPUTE_RX_WINDOW_PARAMETERS( ) AS923_CASE { RegionAS923ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } -#define AS923_RX_CONFIG( ) AS923_CASE { return RegionAS923RxConfig( rxConfig, datarate ); } -#define AS923_TX_CONFIG( ) AS923_CASE { return RegionAS923TxConfig( txConfig, txPower, txTimeOnAir ); } -#define AS923_LINK_ADR_REQ( ) AS923_CASE { return RegionAS923LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } -#define AS923_RX_PARAM_SETUP_REQ( ) AS923_CASE { return RegionAS923RxParamSetupReq( rxParamSetupReq ); } -#define AS923_NEW_CHANNEL_REQ( ) AS923_CASE { return RegionAS923NewChannelReq( newChannelReq ); } -#define AS923_TX_PARAM_SETUP_REQ( ) AS923_CASE { return RegionAS923TxParamSetupReq( txParamSetupReq ); } -#define AS923_DL_CHANNEL_REQ( ) AS923_CASE { return RegionAS923DlChannelReq( dlChannelReq ); } -#define AS923_ALTERNATE_DR( ) AS923_CASE { return RegionAS923AlternateDr( currentDr, type ); } -#define AS923_NEXT_CHANNEL( ) AS923_CASE { return RegionAS923NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } -#define AS923_CHANNEL_ADD( ) AS923_CASE { return RegionAS923ChannelAdd( channelAdd ); } -#define AS923_CHANNEL_REMOVE( ) AS923_CASE { return RegionAS923ChannelsRemove( channelRemove ); } -#define AS923_APPLY_DR_OFFSET( ) AS923_CASE { return RegionAS923ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } -#define AS923_RX_BEACON_SETUP( ) AS923_CASE { RegionAS923RxBeaconSetup( rxBeaconSetup, outDr ); break; } -#else -#define AS923_IS_ACTIVE( ) -#define AS923_GET_PHY_PARAM( ) -#define AS923_SET_BAND_TX_DONE( ) -#define AS923_INIT_DEFAULTS( ) -#define AS923_GET_NVM_CTX( ) -#define AS923_VERIFY( ) -#define AS923_APPLY_CF_LIST( ) -#define AS923_CHAN_MASK_SET( ) -#define AS923_COMPUTE_RX_WINDOW_PARAMETERS( ) -#define AS923_RX_CONFIG( ) -#define AS923_TX_CONFIG( ) -#define AS923_LINK_ADR_REQ( ) -#define AS923_RX_PARAM_SETUP_REQ( ) -#define AS923_NEW_CHANNEL_REQ( ) -#define AS923_TX_PARAM_SETUP_REQ( ) -#define AS923_DL_CHANNEL_REQ( ) -#define AS923_ALTERNATE_DR( ) -#define AS923_NEXT_CHANNEL( ) -#define AS923_CHANNEL_ADD( ) -#define AS923_CHANNEL_REMOVE( ) -#define AS923_APPLY_DR_OFFSET( ) -#define AS923_RX_BEACON_SETUP( ) -#endif - -#ifdef REGION_AU915 +//#define AS923_CASE case LORAMAC_REGION_AS923: +#define AS923_IS_ACTIVE( ) { return true; } +#define AS923_GET_PHY_PARAM( ) { return RegionAS923GetPhyParam( getPhy ); } +#define AS923_SET_BAND_TX_DONE( ) { RegionAS923SetBandTxDone( txDone ); break; } +#define AS923_INIT_DEFAULTS( ) { RegionAS923InitDefaults( params ); break; } +#define AS923_VERIFY( ) { return RegionAS923Verify( verify, phyAttribute ); } +#define AS923_APPLY_CF_LIST( ) { RegionAS923ApplyCFList( applyCFList ); break; } +#define AS923_CHAN_MASK_SET( ) { return RegionAS923ChanMaskSet( chanMaskSet ); } +#define AS923_COMPUTE_RX_WINDOW_PARAMETERS( ) { RegionAS923ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } +#define AS923_RX_CONFIG( ) { return RegionAS923RxConfig( rxConfig, datarate ); } +#define AS923_TX_CONFIG( ) { return RegionAS923TxConfig( txConfig, txPower, txTimeOnAir ); } +#define AS923_LINK_ADR_REQ( ) { return RegionAS923LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } +#define AS923_RX_PARAM_SETUP_REQ( ) { return RegionAS923RxParamSetupReq( rxParamSetupReq ); } +#define AS923_NEW_CHANNEL_REQ( ) { return RegionAS923NewChannelReq( newChannelReq ); } +#define AS923_TX_PARAM_SETUP_REQ( ) { return RegionAS923TxParamSetupReq( txParamSetupReq ); } +#define AS923_DL_CHANNEL_REQ( ) { return RegionAS923DlChannelReq( dlChannelReq ); } +#define AS923_ALTERNATE_DR( ) { return RegionAS923AlternateDr( currentDr, type ); } +#define AS923_NEXT_CHANNEL( ) { return RegionAS923NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } +#define AS923_CHANNEL_ADD( ) { return RegionAS923ChannelAdd( channelAdd ); } +#define AS923_CHANNEL_REMOVE( ) { return RegionAS923ChannelsRemove( channelRemove ); } +#define AS923_APPLY_DR_OFFSET( ) { return RegionAS923ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } +#define AS923_RX_BEACON_SETUP( ) { RegionAS923RxBeaconSetup( rxBeaconSetup, outDr ); break; } +// #else +// #define AS923_IS_ACTIVE( ) +// #define AS923_GET_PHY_PARAM( ) +// #define AS923_SET_BAND_TX_DONE( ) +// #define AS923_INIT_DEFAULTS( ) +// #define AS923_GET_NVM_CTX( ) +// #define AS923_VERIFY( ) +// #define AS923_APPLY_CF_LIST( ) +// #define AS923_CHAN_MASK_SET( ) +// #define AS923_COMPUTE_RX_WINDOW_PARAMETERS( ) +// #define AS923_RX_CONFIG( ) +// #define AS923_TX_CONFIG( ) +// #define AS923_LINK_ADR_REQ( ) +// #define AS923_RX_PARAM_SETUP_REQ( ) +// #define AS923_NEW_CHANNEL_REQ( ) +// #define AS923_TX_PARAM_SETUP_REQ( ) +// #define AS923_DL_CHANNEL_REQ( ) +// #define AS923_ALTERNATE_DR( ) +// #define AS923_NEXT_CHANNEL( ) +// #define AS923_CHANNEL_ADD( ) +// #define AS923_CHANNEL_REMOVE( ) +// #define AS923_APPLY_DR_OFFSET( ) +// #define AS923_RX_BEACON_SETUP( ) +// #endif + +//#ifdef REGION_AU915 #include "RegionAU915.h" -#define AU915_CASE case LORAMAC_REGION_AU915: -#define AU915_IS_ACTIVE( ) AU915_CASE { return true; } -#define AU915_GET_PHY_PARAM( ) AU915_CASE { return RegionAU915GetPhyParam( getPhy ); } -#define AU915_SET_BAND_TX_DONE( ) AU915_CASE { RegionAU915SetBandTxDone( txDone ); break; } -#define AU915_INIT_DEFAULTS( ) AU915_CASE { RegionAU915InitDefaults( params ); break; } -#define AU915_VERIFY( ) AU915_CASE { return RegionAU915Verify( verify, phyAttribute ); } -#define AU915_APPLY_CF_LIST( ) AU915_CASE { RegionAU915ApplyCFList( applyCFList ); break; } -#define AU915_CHAN_MASK_SET( ) AU915_CASE { return RegionAU915ChanMaskSet( chanMaskSet ); } -#define AU915_COMPUTE_RX_WINDOW_PARAMETERS( ) AU915_CASE { RegionAU915ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } -#define AU915_RX_CONFIG( ) AU915_CASE { return RegionAU915RxConfig( rxConfig, datarate ); } -#define AU915_TX_CONFIG( ) AU915_CASE { return RegionAU915TxConfig( txConfig, txPower, txTimeOnAir ); } -#define AU915_LINK_ADR_REQ( ) AU915_CASE { return RegionAU915LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } -#define AU915_RX_PARAM_SETUP_REQ( ) AU915_CASE { return RegionAU915RxParamSetupReq( rxParamSetupReq ); } -#define AU915_NEW_CHANNEL_REQ( ) AU915_CASE { return RegionAU915NewChannelReq( newChannelReq ); } -#define AU915_TX_PARAM_SETUP_REQ( ) AU915_CASE { return RegionAU915TxParamSetupReq( txParamSetupReq ); } -#define AU915_DL_CHANNEL_REQ( ) AU915_CASE { return RegionAU915DlChannelReq( dlChannelReq ); } -#define AU915_ALTERNATE_DR( ) AU915_CASE { return RegionAU915AlternateDr( currentDr, type ); } -#define AU915_NEXT_CHANNEL( ) AU915_CASE { return RegionAU915NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } -#define AU915_CHANNEL_ADD( ) AU915_CASE { return RegionAU915ChannelAdd( channelAdd ); } -#define AU915_CHANNEL_REMOVE( ) AU915_CASE { return RegionAU915ChannelsRemove( channelRemove ); } -#define AU915_APPLY_DR_OFFSET( ) AU915_CASE { return RegionAU915ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } -#define AU915_RX_BEACON_SETUP( ) AU915_CASE { RegionAU915RxBeaconSetup( rxBeaconSetup, outDr ); break; } -#else -#define AU915_IS_ACTIVE( ) -#define AU915_GET_PHY_PARAM( ) -#define AU915_SET_BAND_TX_DONE( ) -#define AU915_INIT_DEFAULTS( ) -#define AU915_GET_NVM_CTX( ) -#define AU915_VERIFY( ) -#define AU915_APPLY_CF_LIST( ) -#define AU915_CHAN_MASK_SET( ) -#define AU915_COMPUTE_RX_WINDOW_PARAMETERS( ) -#define AU915_RX_CONFIG( ) -#define AU915_TX_CONFIG( ) -#define AU915_LINK_ADR_REQ( ) -#define AU915_RX_PARAM_SETUP_REQ( ) -#define AU915_NEW_CHANNEL_REQ( ) -#define AU915_TX_PARAM_SETUP_REQ( ) -#define AU915_DL_CHANNEL_REQ( ) -#define AU915_ALTERNATE_DR( ) -#define AU915_NEXT_CHANNEL( ) -#define AU915_CHANNEL_ADD( ) -#define AU915_CHANNEL_REMOVE( ) -#define AU915_APPLY_DR_OFFSET( ) -#define AU915_RX_BEACON_SETUP( ) -#endif - -#ifdef REGION_CN470 +//#define AU915_CASE case LORAMAC_REGION_AU915: +#define AU915_IS_ACTIVE( ) { return true; } +#define AU915_GET_PHY_PARAM( ) { return RegionAU915GetPhyParam( getPhy ); } +#define AU915_SET_BAND_TX_DONE( ) { RegionAU915SetBandTxDone( txDone ); break; } +#define AU915_INIT_DEFAULTS( ) { RegionAU915InitDefaults( params ); break; } +#define AU915_VERIFY( ) { return RegionAU915Verify( verify, phyAttribute ); } +#define AU915_APPLY_CF_LIST( ) { RegionAU915ApplyCFList( applyCFList ); break; } +#define AU915_CHAN_MASK_SET( ) { return RegionAU915ChanMaskSet( chanMaskSet ); } +#define AU915_COMPUTE_RX_WINDOW_PARAMETERS( ) { RegionAU915ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } +#define AU915_RX_CONFIG( ) { return RegionAU915RxConfig( rxConfig, datarate ); } +#define AU915_TX_CONFIG( ) { return RegionAU915TxConfig( txConfig, txPower, txTimeOnAir ); } +#define AU915_LINK_ADR_REQ( ) { return RegionAU915LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } +#define AU915_RX_PARAM_SETUP_REQ( ) { return RegionAU915RxParamSetupReq( rxParamSetupReq ); } +#define AU915_NEW_CHANNEL_REQ( ) { return RegionAU915NewChannelReq( newChannelReq ); } +#define AU915_TX_PARAM_SETUP_REQ( ) { return RegionAU915TxParamSetupReq( txParamSetupReq ); } +#define AU915_DL_CHANNEL_REQ( ) { return RegionAU915DlChannelReq( dlChannelReq ); } +#define AU915_ALTERNATE_DR( ) { return RegionAU915AlternateDr( currentDr, type ); } +#define AU915_NEXT_CHANNEL( ) { return RegionAU915NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } +#define AU915_CHANNEL_ADD( ) { return RegionAU915ChannelAdd( channelAdd ); } +#define AU915_CHANNEL_REMOVE( ) { return RegionAU915ChannelsRemove( channelRemove ); } +#define AU915_APPLY_DR_OFFSET( ) { return RegionAU915ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } +#define AU915_RX_BEACON_SETUP( ) { RegionAU915RxBeaconSetup( rxBeaconSetup, outDr ); break; } +// #else +// #define AU915_IS_ACTIVE( ) +// #define AU915_GET_PHY_PARAM( ) +// #define AU915_SET_BAND_TX_DONE( ) +// #define AU915_INIT_DEFAULTS( ) +// #define AU915_GET_NVM_CTX( ) +// #define AU915_VERIFY( ) +// #define AU915_APPLY_CF_LIST( ) +// #define AU915_CHAN_MASK_SET( ) +// #define AU915_COMPUTE_RX_WINDOW_PARAMETERS( ) +// #define AU915_RX_CONFIG( ) +// #define AU915_TX_CONFIG( ) +// #define AU915_LINK_ADR_REQ( ) +// #define AU915_RX_PARAM_SETUP_REQ( ) +// #define AU915_NEW_CHANNEL_REQ( ) +// #define AU915_TX_PARAM_SETUP_REQ( ) +// #define AU915_DL_CHANNEL_REQ( ) +// #define AU915_ALTERNATE_DR( ) +// #define AU915_NEXT_CHANNEL( ) +// #define AU915_CHANNEL_ADD( ) +// #define AU915_CHANNEL_REMOVE( ) +// #define AU915_APPLY_DR_OFFSET( ) +// #define AU915_RX_BEACON_SETUP( ) +// #endif + +// #ifdef REGION_CN470 #include "RegionCN470.h" -#define CN470_CASE case LORAMAC_REGION_CN470: -#define CN470_IS_ACTIVE( ) CN470_CASE { return true; } -#define CN470_GET_PHY_PARAM( ) CN470_CASE { return RegionCN470GetPhyParam( getPhy ); } -#define CN470_SET_BAND_TX_DONE( ) CN470_CASE { RegionCN470SetBandTxDone( txDone ); break; } -#define CN470_INIT_DEFAULTS( ) CN470_CASE { RegionCN470InitDefaults( params ); break; } -#define CN470_VERIFY( ) CN470_CASE { return RegionCN470Verify( verify, phyAttribute ); } -#define CN470_APPLY_CF_LIST( ) CN470_CASE { RegionCN470ApplyCFList( applyCFList ); break; } -#define CN470_CHAN_MASK_SET( ) CN470_CASE { return RegionCN470ChanMaskSet( chanMaskSet ); } -#define CN470_COMPUTE_RX_WINDOW_PARAMETERS( ) CN470_CASE { RegionCN470ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } -#define CN470_RX_CONFIG( ) CN470_CASE { return RegionCN470RxConfig( rxConfig, datarate ); } -#define CN470_TX_CONFIG( ) CN470_CASE { return RegionCN470TxConfig( txConfig, txPower, txTimeOnAir ); } -#define CN470_LINK_ADR_REQ( ) CN470_CASE { return RegionCN470LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } -#define CN470_RX_PARAM_SETUP_REQ( ) CN470_CASE { return RegionCN470RxParamSetupReq( rxParamSetupReq ); } -#define CN470_NEW_CHANNEL_REQ( ) CN470_CASE { return RegionCN470NewChannelReq( newChannelReq ); } -#define CN470_TX_PARAM_SETUP_REQ( ) CN470_CASE { return RegionCN470TxParamSetupReq( txParamSetupReq ); } -#define CN470_DL_CHANNEL_REQ( ) CN470_CASE { return RegionCN470DlChannelReq( dlChannelReq ); } -#define CN470_ALTERNATE_DR( ) CN470_CASE { return RegionCN470AlternateDr( currentDr, type ); } -#define CN470_NEXT_CHANNEL( ) CN470_CASE { return RegionCN470NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } -#define CN470_CHANNEL_ADD( ) CN470_CASE { return RegionCN470ChannelAdd( channelAdd ); } -#define CN470_CHANNEL_REMOVE( ) CN470_CASE { return RegionCN470ChannelsRemove( channelRemove ); } -#define CN470_APPLY_DR_OFFSET( ) CN470_CASE { return RegionCN470ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } -#define CN470_RX_BEACON_SETUP( ) CN470_CASE { RegionCN470RxBeaconSetup( rxBeaconSetup, outDr ); break; } -#else -#define CN470_IS_ACTIVE( ) -#define CN470_GET_PHY_PARAM( ) -#define CN470_SET_BAND_TX_DONE( ) -#define CN470_INIT_DEFAULTS( ) -#define CN470_GET_NVM_CTX( ) -#define CN470_VERIFY( ) -#define CN470_APPLY_CF_LIST( ) -#define CN470_CHAN_MASK_SET( ) -#define CN470_COMPUTE_RX_WINDOW_PARAMETERS( ) -#define CN470_RX_CONFIG( ) -#define CN470_TX_CONFIG( ) -#define CN470_LINK_ADR_REQ( ) -#define CN470_RX_PARAM_SETUP_REQ( ) -#define CN470_NEW_CHANNEL_REQ( ) -#define CN470_TX_PARAM_SETUP_REQ( ) -#define CN470_DL_CHANNEL_REQ( ) -#define CN470_ALTERNATE_DR( ) -#define CN470_NEXT_CHANNEL( ) -#define CN470_CHANNEL_ADD( ) -#define CN470_CHANNEL_REMOVE( ) -#define CN470_APPLY_DR_OFFSET( ) -#define CN470_RX_BEACON_SETUP( ) -#endif - -#ifdef REGION_CN779 +//#define CN470_CASE case LORAMAC_REGION_CN470: +#define CN470_IS_ACTIVE( ) { return true; } +#define CN470_GET_PHY_PARAM( ) { return RegionCN470GetPhyParam( getPhy ); } +#define CN470_SET_BAND_TX_DONE( ) { RegionCN470SetBandTxDone( txDone ); break; } +#define CN470_INIT_DEFAULTS( ) { RegionCN470InitDefaults( params ); break; } +#define CN470_VERIFY( ) { return RegionCN470Verify( verify, phyAttribute ); } +#define CN470_APPLY_CF_LIST( ) { RegionCN470ApplyCFList( applyCFList ); break; } +#define CN470_CHAN_MASK_SET( ) { return RegionCN470ChanMaskSet( chanMaskSet ); } +#define CN470_COMPUTE_RX_WINDOW_PARAMETERS( ) { RegionCN470ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } +#define CN470_RX_CONFIG( ) { return RegionCN470RxConfig( rxConfig, datarate ); } +#define CN470_TX_CONFIG( ) { return RegionCN470TxConfig( txConfig, txPower, txTimeOnAir ); } +#define CN470_LINK_ADR_REQ( ) { return RegionCN470LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } +#define CN470_RX_PARAM_SETUP_REQ( ) { return RegionCN470RxParamSetupReq( rxParamSetupReq ); } +#define CN470_NEW_CHANNEL_REQ( ) { return RegionCN470NewChannelReq( newChannelReq ); } +#define CN470_TX_PARAM_SETUP_REQ( ) { return RegionCN470TxParamSetupReq( txParamSetupReq ); } +#define CN470_DL_CHANNEL_REQ( ) { return RegionCN470DlChannelReq( dlChannelReq ); } +#define CN470_ALTERNATE_DR( ) { return RegionCN470AlternateDr( currentDr, type ); } +#define CN470_NEXT_CHANNEL( ) { return RegionCN470NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } +#define CN470_CHANNEL_ADD( ) { return RegionCN470ChannelAdd( channelAdd ); } +#define CN470_CHANNEL_REMOVE( ) { return RegionCN470ChannelsRemove( channelRemove ); } +#define CN470_APPLY_DR_OFFSET( ) { return RegionCN470ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } +#define CN470_RX_BEACON_SETUP( ) { RegionCN470RxBeaconSetup( rxBeaconSetup, outDr ); break; } +// #else +// #define CN470_IS_ACTIVE( ) +// #define CN470_GET_PHY_PARAM( ) +// #define CN470_SET_BAND_TX_DONE( ) +// #define CN470_INIT_DEFAULTS( ) +// #define CN470_GET_NVM_CTX( ) +// #define CN470_VERIFY( ) +// #define CN470_APPLY_CF_LIST( ) +// #define CN470_CHAN_MASK_SET( ) +// #define CN470_COMPUTE_RX_WINDOW_PARAMETERS( ) +// #define CN470_RX_CONFIG( ) +// #define CN470_TX_CONFIG( ) +// #define CN470_LINK_ADR_REQ( ) +// #define CN470_RX_PARAM_SETUP_REQ( ) +// #define CN470_NEW_CHANNEL_REQ( ) +// #define CN470_TX_PARAM_SETUP_REQ( ) +// #define CN470_DL_CHANNEL_REQ( ) +// #define CN470_ALTERNATE_DR( ) +// #define CN470_NEXT_CHANNEL( ) +// #define CN470_CHANNEL_ADD( ) +// #define CN470_CHANNEL_REMOVE( ) +// #define CN470_APPLY_DR_OFFSET( ) +// #define CN470_RX_BEACON_SETUP( ) +// #endif + +// #ifdef REGION_CN779 #include "RegionCN779.h" -#define CN779_CASE case LORAMAC_REGION_CN779: -#define CN779_IS_ACTIVE( ) CN779_CASE { return true; } -#define CN779_GET_PHY_PARAM( ) CN779_CASE { return RegionCN779GetPhyParam( getPhy ); } -#define CN779_SET_BAND_TX_DONE( ) CN779_CASE { RegionCN779SetBandTxDone( txDone ); break; } -#define CN779_INIT_DEFAULTS( ) CN779_CASE { RegionCN779InitDefaults( params ); break; } -#define CN779_VERIFY( ) CN779_CASE { return RegionCN779Verify( verify, phyAttribute ); } -#define CN779_APPLY_CF_LIST( ) CN779_CASE { RegionCN779ApplyCFList( applyCFList ); break; } -#define CN779_CHAN_MASK_SET( ) CN779_CASE { return RegionCN779ChanMaskSet( chanMaskSet ); } -#define CN779_COMPUTE_RX_WINDOW_PARAMETERS( ) CN779_CASE { RegionCN779ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } -#define CN779_RX_CONFIG( ) CN779_CASE { return RegionCN779RxConfig( rxConfig, datarate ); } -#define CN779_TX_CONFIG( ) CN779_CASE { return RegionCN779TxConfig( txConfig, txPower, txTimeOnAir ); } -#define CN779_LINK_ADR_REQ( ) CN779_CASE { return RegionCN779LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } -#define CN779_RX_PARAM_SETUP_REQ( ) CN779_CASE { return RegionCN779RxParamSetupReq( rxParamSetupReq ); } -#define CN779_NEW_CHANNEL_REQ( ) CN779_CASE { return RegionCN779NewChannelReq( newChannelReq ); } -#define CN779_TX_PARAM_SETUP_REQ( ) CN779_CASE { return RegionCN779TxParamSetupReq( txParamSetupReq ); } -#define CN779_DL_CHANNEL_REQ( ) CN779_CASE { return RegionCN779DlChannelReq( dlChannelReq ); } -#define CN779_ALTERNATE_DR( ) CN779_CASE { return RegionCN779AlternateDr( currentDr, type ); } -#define CN779_NEXT_CHANNEL( ) CN779_CASE { return RegionCN779NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } -#define CN779_CHANNEL_ADD( ) CN779_CASE { return RegionCN779ChannelAdd( channelAdd ); } -#define CN779_CHANNEL_REMOVE( ) CN779_CASE { return RegionCN779ChannelsRemove( channelRemove ); } -#define CN779_APPLY_DR_OFFSET( ) CN779_CASE { return RegionCN779ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } -#define CN779_RX_BEACON_SETUP( ) CN779_CASE { RegionCN779RxBeaconSetup( rxBeaconSetup, outDr ); break; } -#else -#define CN779_IS_ACTIVE( ) -#define CN779_GET_PHY_PARAM( ) -#define CN779_SET_BAND_TX_DONE( ) -#define CN779_INIT_DEFAULTS( ) -#define CN779_GET_NVM_CTX( ) -#define CN779_VERIFY( ) -#define CN779_APPLY_CF_LIST( ) -#define CN779_CHAN_MASK_SET( ) -#define CN779_COMPUTE_RX_WINDOW_PARAMETERS( ) -#define CN779_RX_CONFIG( ) -#define CN779_TX_CONFIG( ) -#define CN779_LINK_ADR_REQ( ) -#define CN779_RX_PARAM_SETUP_REQ( ) -#define CN779_NEW_CHANNEL_REQ( ) -#define CN779_TX_PARAM_SETUP_REQ( ) -#define CN779_DL_CHANNEL_REQ( ) -#define CN779_ALTERNATE_DR( ) -#define CN779_NEXT_CHANNEL( ) -#define CN779_CHANNEL_ADD( ) -#define CN779_CHANNEL_REMOVE( ) -#define CN779_APPLY_DR_OFFSET( ) -#define CN779_RX_BEACON_SETUP( ) -#endif - -#ifdef REGION_EU433 +//#define CN779_CASE case LORAMAC_REGION_CN779: +#define CN779_IS_ACTIVE( ) { return true; } +#define CN779_GET_PHY_PARAM( ) { return RegionCN779GetPhyParam( getPhy ); } +#define CN779_SET_BAND_TX_DONE( ) { RegionCN779SetBandTxDone( txDone ); break; } +#define CN779_INIT_DEFAULTS( ) { RegionCN779InitDefaults( params ); break; } +#define CN779_VERIFY( ) { return RegionCN779Verify( verify, phyAttribute ); } +#define CN779_APPLY_CF_LIST( ) { RegionCN779ApplyCFList( applyCFList ); break; } +#define CN779_CHAN_MASK_SET( ) { return RegionCN779ChanMaskSet( chanMaskSet ); } +#define CN779_COMPUTE_RX_WINDOW_PARAMETERS( ) { RegionCN779ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } +#define CN779_RX_CONFIG( ) { return RegionCN779RxConfig( rxConfig, datarate ); } +#define CN779_TX_CONFIG( ) { return RegionCN779TxConfig( txConfig, txPower, txTimeOnAir ); } +#define CN779_LINK_ADR_REQ( ) { return RegionCN779LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } +#define CN779_RX_PARAM_SETUP_REQ( ) { return RegionCN779RxParamSetupReq( rxParamSetupReq ); } +#define CN779_NEW_CHANNEL_REQ( ) { return RegionCN779NewChannelReq( newChannelReq ); } +#define CN779_TX_PARAM_SETUP_REQ( ) { return RegionCN779TxParamSetupReq( txParamSetupReq ); } +#define CN779_DL_CHANNEL_REQ( ) { return RegionCN779DlChannelReq( dlChannelReq ); } +#define CN779_ALTERNATE_DR( ) { return RegionCN779AlternateDr( currentDr, type ); } +#define CN779_NEXT_CHANNEL( ) { return RegionCN779NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } +#define CN779_CHANNEL_ADD( ) { return RegionCN779ChannelAdd( channelAdd ); } +#define CN779_CHANNEL_REMOVE( ) { return RegionCN779ChannelsRemove( channelRemove ); } +#define CN779_APPLY_DR_OFFSET( ) { return RegionCN779ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } +#define CN779_RX_BEACON_SETUP( ) { RegionCN779RxBeaconSetup( rxBeaconSetup, outDr ); break; } +// #else +// #define CN779_IS_ACTIVE( ) +// #define CN779_GET_PHY_PARAM( ) +// #define CN779_SET_BAND_TX_DONE( ) +// #define CN779_INIT_DEFAULTS( ) +// #define CN779_GET_NVM_CTX( ) +// #define CN779_VERIFY( ) +// #define CN779_APPLY_CF_LIST( ) +// #define CN779_CHAN_MASK_SET( ) +// #define CN779_COMPUTE_RX_WINDOW_PARAMETERS( ) +// #define CN779_RX_CONFIG( ) +// #define CN779_TX_CONFIG( ) +// #define CN779_LINK_ADR_REQ( ) +// #define CN779_RX_PARAM_SETUP_REQ( ) +// #define CN779_NEW_CHANNEL_REQ( ) +// #define CN779_TX_PARAM_SETUP_REQ( ) +// #define CN779_DL_CHANNEL_REQ( ) +// #define CN779_ALTERNATE_DR( ) +// #define CN779_NEXT_CHANNEL( ) +// #define CN779_CHANNEL_ADD( ) +// #define CN779_CHANNEL_REMOVE( ) +// #define CN779_APPLY_DR_OFFSET( ) +// #define CN779_RX_BEACON_SETUP( ) +// #endif + +// #ifdef REGION_EU433 #include "RegionEU433.h" -#define EU433_CASE case LORAMAC_REGION_EU433: -#define EU433_IS_ACTIVE( ) EU433_CASE { return true; } -#define EU433_GET_PHY_PARAM( ) EU433_CASE { return RegionEU433GetPhyParam( getPhy ); } -#define EU433_SET_BAND_TX_DONE( ) EU433_CASE { RegionEU433SetBandTxDone( txDone ); break; } -#define EU433_INIT_DEFAULTS( ) EU433_CASE { RegionEU433InitDefaults( params ); break; } -#define EU433_VERIFY( ) EU433_CASE { return RegionEU433Verify( verify, phyAttribute ); } -#define EU433_APPLY_CF_LIST( ) EU433_CASE { RegionEU433ApplyCFList( applyCFList ); break; } -#define EU433_CHAN_MASK_SET( ) EU433_CASE { return RegionEU433ChanMaskSet( chanMaskSet ); } -#define EU433_COMPUTE_RX_WINDOW_PARAMETERS( ) EU433_CASE { RegionEU433ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } -#define EU433_RX_CONFIG( ) EU433_CASE { return RegionEU433RxConfig( rxConfig, datarate ); } -#define EU433_TX_CONFIG( ) EU433_CASE { return RegionEU433TxConfig( txConfig, txPower, txTimeOnAir ); } -#define EU433_LINK_ADR_REQ( ) EU433_CASE { return RegionEU433LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } -#define EU433_RX_PARAM_SETUP_REQ( ) EU433_CASE { return RegionEU433RxParamSetupReq( rxParamSetupReq ); } -#define EU433_NEW_CHANNEL_REQ( ) EU433_CASE { return RegionEU433NewChannelReq( newChannelReq ); } -#define EU433_TX_PARAM_SETUP_REQ( ) EU433_CASE { return RegionEU433TxParamSetupReq( txParamSetupReq ); } -#define EU433_DL_CHANNEL_REQ( ) EU433_CASE { return RegionEU433DlChannelReq( dlChannelReq ); } -#define EU433_ALTERNATE_DR( ) EU433_CASE { return RegionEU433AlternateDr( currentDr, type ); } -#define EU433_NEXT_CHANNEL( ) EU433_CASE { return RegionEU433NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } -#define EU433_CHANNEL_ADD( ) EU433_CASE { return RegionEU433ChannelAdd( channelAdd ); } -#define EU433_CHANNEL_REMOVE( ) EU433_CASE { return RegionEU433ChannelsRemove( channelRemove ); } -#define EU433_APPLY_DR_OFFSET( ) EU433_CASE { return RegionEU433ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } -#define EU433_RX_BEACON_SETUP( ) EU433_CASE { RegionEU433RxBeaconSetup( rxBeaconSetup, outDr ); break; } -#else -#define EU433_IS_ACTIVE( ) -#define EU433_GET_PHY_PARAM( ) -#define EU433_SET_BAND_TX_DONE( ) -#define EU433_INIT_DEFAULTS( ) -#define EU433_GET_NVM_CTX( ) -#define EU433_VERIFY( ) -#define EU433_APPLY_CF_LIST( ) -#define EU433_CHAN_MASK_SET( ) -#define EU433_COMPUTE_RX_WINDOW_PARAMETERS( ) -#define EU433_RX_CONFIG( ) -#define EU433_TX_CONFIG( ) -#define EU433_LINK_ADR_REQ( ) -#define EU433_RX_PARAM_SETUP_REQ( ) -#define EU433_NEW_CHANNEL_REQ( ) -#define EU433_TX_PARAM_SETUP_REQ( ) -#define EU433_DL_CHANNEL_REQ( ) -#define EU433_ALTERNATE_DR( ) -#define EU433_NEXT_CHANNEL( ) -#define EU433_CHANNEL_ADD( ) -#define EU433_CHANNEL_REMOVE( ) -#define EU433_APPLY_DR_OFFSET( ) -#define EU433_RX_BEACON_SETUP( ) -#endif - -#ifdef REGION_EU868 +//#define EU433_CASE case LORAMAC_REGION_EU433: +#define EU433_IS_ACTIVE( ) { return true; } +#define EU433_GET_PHY_PARAM( ) { return RegionEU433GetPhyParam( getPhy ); } +#define EU433_SET_BAND_TX_DONE( ) { RegionEU433SetBandTxDone( txDone ); break; } +#define EU433_INIT_DEFAULTS( ) { RegionEU433InitDefaults( params ); break; } +#define EU433_VERIFY( ) { return RegionEU433Verify( verify, phyAttribute ); } +#define EU433_APPLY_CF_LIST( ) { RegionEU433ApplyCFList( applyCFList ); break; } +#define EU433_CHAN_MASK_SET( ) { return RegionEU433ChanMaskSet( chanMaskSet ); } +#define EU433_COMPUTE_RX_WINDOW_PARAMETERS( ) { RegionEU433ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } +#define EU433_RX_CONFIG( ) { return RegionEU433RxConfig( rxConfig, datarate ); } +#define EU433_TX_CONFIG( ) { return RegionEU433TxConfig( txConfig, txPower, txTimeOnAir ); } +#define EU433_LINK_ADR_REQ( ) { return RegionEU433LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } +#define EU433_RX_PARAM_SETUP_REQ( ) { return RegionEU433RxParamSetupReq( rxParamSetupReq ); } +#define EU433_NEW_CHANNEL_REQ( ) { return RegionEU433NewChannelReq( newChannelReq ); } +#define EU433_TX_PARAM_SETUP_REQ( ) { return RegionEU433TxParamSetupReq( txParamSetupReq ); } +#define EU433_DL_CHANNEL_REQ( ) { return RegionEU433DlChannelReq( dlChannelReq ); } +#define EU433_ALTERNATE_DR( ) { return RegionEU433AlternateDr( currentDr, type ); } +#define EU433_NEXT_CHANNEL( ) { return RegionEU433NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } +#define EU433_CHANNEL_ADD( ) { return RegionEU433ChannelAdd( channelAdd ); } +#define EU433_CHANNEL_REMOVE( ) { return RegionEU433ChannelsRemove( channelRemove ); } +#define EU433_APPLY_DR_OFFSET( ) { return RegionEU433ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } +#define EU433_RX_BEACON_SETUP( ) { RegionEU433RxBeaconSetup( rxBeaconSetup, outDr ); break; } +// #else +// #define EU433_IS_ACTIVE( ) +// #define EU433_GET_PHY_PARAM( ) +// #define EU433_SET_BAND_TX_DONE( ) +// #define EU433_INIT_DEFAULTS( ) +// #define EU433_GET_NVM_CTX( ) +// #define EU433_VERIFY( ) +// #define EU433_APPLY_CF_LIST( ) +// #define EU433_CHAN_MASK_SET( ) +// #define EU433_COMPUTE_RX_WINDOW_PARAMETERS( ) +// #define EU433_RX_CONFIG( ) +// #define EU433_TX_CONFIG( ) +// #define EU433_LINK_ADR_REQ( ) +// #define EU433_RX_PARAM_SETUP_REQ( ) +// #define EU433_NEW_CHANNEL_REQ( ) +// #define EU433_TX_PARAM_SETUP_REQ( ) +// #define EU433_DL_CHANNEL_REQ( ) +// #define EU433_ALTERNATE_DR( ) +// #define EU433_NEXT_CHANNEL( ) +// #define EU433_CHANNEL_ADD( ) +// #define EU433_CHANNEL_REMOVE( ) +// #define EU433_APPLY_DR_OFFSET( ) +// #define EU433_RX_BEACON_SETUP( ) +// #endif + +// #ifdef REGION_EU868 #include "RegionEU868.h" -#define EU868_CASE case LORAMAC_REGION_EU868: -#define EU868_IS_ACTIVE( ) EU868_CASE { return true; } -#define EU868_GET_PHY_PARAM( ) EU868_CASE { return RegionEU868GetPhyParam( getPhy ); } -#define EU868_SET_BAND_TX_DONE( ) EU868_CASE { RegionEU868SetBandTxDone( txDone ); break; } -#define EU868_INIT_DEFAULTS( ) EU868_CASE { RegionEU868InitDefaults( params ); break; } -#define EU868_VERIFY( ) EU868_CASE { return RegionEU868Verify( verify, phyAttribute ); } -#define EU868_APPLY_CF_LIST( ) EU868_CASE { RegionEU868ApplyCFList( applyCFList ); break; } -#define EU868_CHAN_MASK_SET( ) EU868_CASE { return RegionEU868ChanMaskSet( chanMaskSet ); } -#define EU868_COMPUTE_RX_WINDOW_PARAMETERS( ) EU868_CASE { RegionEU868ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } -#define EU868_RX_CONFIG( ) EU868_CASE { return RegionEU868RxConfig( rxConfig, datarate ); } -#define EU868_TX_CONFIG( ) EU868_CASE { return RegionEU868TxConfig( txConfig, txPower, txTimeOnAir ); } -#define EU868_LINK_ADR_REQ( ) EU868_CASE { return RegionEU868LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } -#define EU868_RX_PARAM_SETUP_REQ( ) EU868_CASE { return RegionEU868RxParamSetupReq( rxParamSetupReq ); } -#define EU868_NEW_CHANNEL_REQ( ) EU868_CASE { return RegionEU868NewChannelReq( newChannelReq ); } -#define EU868_TX_PARAM_SETUP_REQ( ) EU868_CASE { return RegionEU868TxParamSetupReq( txParamSetupReq ); } -#define EU868_DL_CHANNEL_REQ( ) EU868_CASE { return RegionEU868DlChannelReq( dlChannelReq ); } -#define EU868_ALTERNATE_DR( ) EU868_CASE { return RegionEU868AlternateDr( currentDr, type ); } -#define EU868_NEXT_CHANNEL( ) EU868_CASE { return RegionEU868NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } -#define EU868_CHANNEL_ADD( ) EU868_CASE { return RegionEU868ChannelAdd( channelAdd ); } -#define EU868_CHANNEL_REMOVE( ) EU868_CASE { return RegionEU868ChannelsRemove( channelRemove ); } -#define EU868_APPLY_DR_OFFSET( ) EU868_CASE { return RegionEU868ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } -#define EU868_RX_BEACON_SETUP( ) EU868_CASE { RegionEU868RxBeaconSetup( rxBeaconSetup, outDr ); break; } -#else -#define EU868_IS_ACTIVE( ) -#define EU868_GET_PHY_PARAM( ) -#define EU868_SET_BAND_TX_DONE( ) -#define EU868_INIT_DEFAULTS( ) -#define EU868_GET_NVM_CTX( ) -#define EU868_VERIFY( ) -#define EU868_APPLY_CF_LIST( ) -#define EU868_CHAN_MASK_SET( ) -#define EU868_COMPUTE_RX_WINDOW_PARAMETERS( ) -#define EU868_RX_CONFIG( ) -#define EU868_TX_CONFIG( ) -#define EU868_LINK_ADR_REQ( ) -#define EU868_RX_PARAM_SETUP_REQ( ) -#define EU868_NEW_CHANNEL_REQ( ) -#define EU868_TX_PARAM_SETUP_REQ( ) -#define EU868_DL_CHANNEL_REQ( ) -#define EU868_ALTERNATE_DR( ) -#define EU868_NEXT_CHANNEL( ) -#define EU868_CHANNEL_ADD( ) -#define EU868_CHANNEL_REMOVE( ) -#define EU868_APPLY_DR_OFFSET( ) -#define EU868_RX_BEACON_SETUP( ) -#endif - -#ifdef REGION_KR920 +//#define EU868_CASE case LORAMAC_REGION_EU868: +#define EU868_IS_ACTIVE( ) { return true; } +#define EU868_GET_PHY_PARAM( ) { return RegionEU868GetPhyParam( getPhy ); } +#define EU868_SET_BAND_TX_DONE( ) { RegionEU868SetBandTxDone( txDone ); break; } +#define EU868_INIT_DEFAULTS( ) { RegionEU868InitDefaults( params ); break; } +#define EU868_VERIFY( ) { return RegionEU868Verify( verify, phyAttribute ); } +#define EU868_APPLY_CF_LIST( ) { RegionEU868ApplyCFList( applyCFList ); break; } +#define EU868_CHAN_MASK_SET( ) { return RegionEU868ChanMaskSet( chanMaskSet ); } +#define EU868_COMPUTE_RX_WINDOW_PARAMETERS( ) { RegionEU868ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } +#define EU868_RX_CONFIG( ) { return RegionEU868RxConfig( rxConfig, datarate ); } +#define EU868_TX_CONFIG( ) { return RegionEU868TxConfig( txConfig, txPower, txTimeOnAir ); } +#define EU868_LINK_ADR_REQ( ) { return RegionEU868LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } +#define EU868_RX_PARAM_SETUP_REQ( ) { return RegionEU868RxParamSetupReq( rxParamSetupReq ); } +#define EU868_NEW_CHANNEL_REQ( ) { return RegionEU868NewChannelReq( newChannelReq ); } +#define EU868_TX_PARAM_SETUP_REQ( ) { return RegionEU868TxParamSetupReq( txParamSetupReq ); } +#define EU868_DL_CHANNEL_REQ( ) { return RegionEU868DlChannelReq( dlChannelReq ); } +#define EU868_ALTERNATE_DR( ) { return RegionEU868AlternateDr( currentDr, type ); } +#define EU868_NEXT_CHANNEL( ) { return RegionEU868NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } +#define EU868_CHANNEL_ADD( ) { return RegionEU868ChannelAdd( channelAdd ); } +#define EU868_CHANNEL_REMOVE( ) { return RegionEU868ChannelsRemove( channelRemove ); } +#define EU868_APPLY_DR_OFFSET( ) { return RegionEU868ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } +#define EU868_RX_BEACON_SETUP( ) { RegionEU868RxBeaconSetup( rxBeaconSetup, outDr ); break; } +// #else +// #define EU868_IS_ACTIVE( ) +// #define EU868_GET_PHY_PARAM( ) +// #define EU868_SET_BAND_TX_DONE( ) +// #define EU868_INIT_DEFAULTS( ) +// #define EU868_GET_NVM_CTX( ) +// #define EU868_VERIFY( ) +// #define EU868_APPLY_CF_LIST( ) +// #define EU868_CHAN_MASK_SET( ) +// #define EU868_COMPUTE_RX_WINDOW_PARAMETERS( ) +// #define EU868_RX_CONFIG( ) +// #define EU868_TX_CONFIG( ) +// #define EU868_LINK_ADR_REQ( ) +// #define EU868_RX_PARAM_SETUP_REQ( ) +// #define EU868_NEW_CHANNEL_REQ( ) +// #define EU868_TX_PARAM_SETUP_REQ( ) +// #define EU868_DL_CHANNEL_REQ( ) +// #define EU868_ALTERNATE_DR( ) +// #define EU868_NEXT_CHANNEL( ) +// #define EU868_CHANNEL_ADD( ) +// #define EU868_CHANNEL_REMOVE( ) +// #define EU868_APPLY_DR_OFFSET( ) +// #define EU868_RX_BEACON_SETUP( ) +// #endif + +// #ifdef REGION_KR920 #include "RegionKR920.h" -#define KR920_CASE case LORAMAC_REGION_KR920: -#define KR920_IS_ACTIVE( ) KR920_CASE { return true; } -#define KR920_GET_PHY_PARAM( ) KR920_CASE { return RegionKR920GetPhyParam( getPhy ); } -#define KR920_SET_BAND_TX_DONE( ) KR920_CASE { RegionKR920SetBandTxDone( txDone ); break; } -#define KR920_INIT_DEFAULTS( ) KR920_CASE { RegionKR920InitDefaults( params ); break; } -#define KR920_VERIFY( ) KR920_CASE { return RegionKR920Verify( verify, phyAttribute ); } -#define KR920_APPLY_CF_LIST( ) KR920_CASE { RegionKR920ApplyCFList( applyCFList ); break; } -#define KR920_CHAN_MASK_SET( ) KR920_CASE { return RegionKR920ChanMaskSet( chanMaskSet ); } -#define KR920_COMPUTE_RX_WINDOW_PARAMETERS( ) KR920_CASE { RegionKR920ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } -#define KR920_RX_CONFIG( ) KR920_CASE { return RegionKR920RxConfig( rxConfig, datarate ); } -#define KR920_TX_CONFIG( ) KR920_CASE { return RegionKR920TxConfig( txConfig, txPower, txTimeOnAir ); } -#define KR920_LINK_ADR_REQ( ) KR920_CASE { return RegionKR920LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } -#define KR920_RX_PARAM_SETUP_REQ( ) KR920_CASE { return RegionKR920RxParamSetupReq( rxParamSetupReq ); } -#define KR920_NEW_CHANNEL_REQ( ) KR920_CASE { return RegionKR920NewChannelReq( newChannelReq ); } -#define KR920_TX_PARAM_SETUP_REQ( ) KR920_CASE { return RegionKR920TxParamSetupReq( txParamSetupReq ); } -#define KR920_DL_CHANNEL_REQ( ) KR920_CASE { return RegionKR920DlChannelReq( dlChannelReq ); } -#define KR920_ALTERNATE_DR( ) KR920_CASE { return RegionKR920AlternateDr( currentDr, type ); } -#define KR920_NEXT_CHANNEL( ) KR920_CASE { return RegionKR920NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } -#define KR920_CHANNEL_ADD( ) KR920_CASE { return RegionKR920ChannelAdd( channelAdd ); } -#define KR920_CHANNEL_REMOVE( ) KR920_CASE { return RegionKR920ChannelsRemove( channelRemove ); } -#define KR920_APPLY_DR_OFFSET( ) KR920_CASE { return RegionKR920ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } -#define KR920_RX_BEACON_SETUP( ) KR920_CASE { RegionKR920RxBeaconSetup( rxBeaconSetup, outDr ); break; } -#else -#define KR920_IS_ACTIVE( ) -#define KR920_GET_PHY_PARAM( ) -#define KR920_SET_BAND_TX_DONE( ) -#define KR920_INIT_DEFAULTS( ) -#define KR920_GET_NVM_CTX( ) -#define KR920_VERIFY( ) -#define KR920_APPLY_CF_LIST( ) -#define KR920_CHAN_MASK_SET( ) -#define KR920_COMPUTE_RX_WINDOW_PARAMETERS( ) -#define KR920_RX_CONFIG( ) -#define KR920_TX_CONFIG( ) -#define KR920_LINK_ADR_REQ( ) -#define KR920_RX_PARAM_SETUP_REQ( ) -#define KR920_NEW_CHANNEL_REQ( ) -#define KR920_TX_PARAM_SETUP_REQ( ) -#define KR920_DL_CHANNEL_REQ( ) -#define KR920_ALTERNATE_DR( ) -#define KR920_NEXT_CHANNEL( ) -#define KR920_CHANNEL_ADD( ) -#define KR920_CHANNEL_REMOVE( ) -#define KR920_APPLY_DR_OFFSET( ) -#define KR920_RX_BEACON_SETUP( ) -#endif - -#ifdef REGION_IN865 +//#define KR920_CASE case LORAMAC_REGION_KR920: +#define KR920_IS_ACTIVE( ) { return true; } +#define KR920_GET_PHY_PARAM( ) { return RegionKR920GetPhyParam( getPhy ); } +#define KR920_SET_BAND_TX_DONE( ) { RegionKR920SetBandTxDone( txDone ); break; } +#define KR920_INIT_DEFAULTS( ) { RegionKR920InitDefaults( params ); break; } +#define KR920_VERIFY( ) { return RegionKR920Verify( verify, phyAttribute ); } +#define KR920_APPLY_CF_LIST( ) { RegionKR920ApplyCFList( applyCFList ); break; } +#define KR920_CHAN_MASK_SET( ) { return RegionKR920ChanMaskSet( chanMaskSet ); } +#define KR920_COMPUTE_RX_WINDOW_PARAMETERS( ) { RegionKR920ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } +#define KR920_RX_CONFIG( ) { return RegionKR920RxConfig( rxConfig, datarate ); } +#define KR920_TX_CONFIG( ) { return RegionKR920TxConfig( txConfig, txPower, txTimeOnAir ); } +#define KR920_LINK_ADR_REQ( ) { return RegionKR920LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } +#define KR920_RX_PARAM_SETUP_REQ( ) { return RegionKR920RxParamSetupReq( rxParamSetupReq ); } +#define KR920_NEW_CHANNEL_REQ( ) { return RegionKR920NewChannelReq( newChannelReq ); } +#define KR920_TX_PARAM_SETUP_REQ( ) { return RegionKR920TxParamSetupReq( txParamSetupReq ); } +#define KR920_DL_CHANNEL_REQ( ) { return RegionKR920DlChannelReq( dlChannelReq ); } +#define KR920_ALTERNATE_DR( ) { return RegionKR920AlternateDr( currentDr, type ); } +#define KR920_NEXT_CHANNEL( ) { return RegionKR920NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } +#define KR920_CHANNEL_ADD( ) { return RegionKR920ChannelAdd( channelAdd ); } +#define KR920_CHANNEL_REMOVE( ) { return RegionKR920ChannelsRemove( channelRemove ); } +#define KR920_APPLY_DR_OFFSET( ) { return RegionKR920ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } +#define KR920_RX_BEACON_SETUP( ) { RegionKR920RxBeaconSetup( rxBeaconSetup, outDr ); break; } +// #else +// #define KR920_IS_ACTIVE( ) +// #define KR920_GET_PHY_PARAM( ) +// #define KR920_SET_BAND_TX_DONE( ) +// #define KR920_INIT_DEFAULTS( ) +// #define KR920_GET_NVM_CTX( ) +// #define KR920_VERIFY( ) +// #define KR920_APPLY_CF_LIST( ) +// #define KR920_CHAN_MASK_SET( ) +// #define KR920_COMPUTE_RX_WINDOW_PARAMETERS( ) +// #define KR920_RX_CONFIG( ) +// #define KR920_TX_CONFIG( ) +// #define KR920_LINK_ADR_REQ( ) +// #define KR920_RX_PARAM_SETUP_REQ( ) +// #define KR920_NEW_CHANNEL_REQ( ) +// #define KR920_TX_PARAM_SETUP_REQ( ) +// #define KR920_DL_CHANNEL_REQ( ) +// #define KR920_ALTERNATE_DR( ) +// #define KR920_NEXT_CHANNEL( ) +// #define KR920_CHANNEL_ADD( ) +// #define KR920_CHANNEL_REMOVE( ) +// #define KR920_APPLY_DR_OFFSET( ) +// #define KR920_RX_BEACON_SETUP( ) +// #endif + +// #ifdef REGION_IN865 #include "RegionIN865.h" -#define IN865_CASE case LORAMAC_REGION_IN865: -#define IN865_IS_ACTIVE( ) IN865_CASE { return true; } -#define IN865_GET_PHY_PARAM( ) IN865_CASE { return RegionIN865GetPhyParam( getPhy ); } -#define IN865_SET_BAND_TX_DONE( ) IN865_CASE { RegionIN865SetBandTxDone( txDone ); break; } -#define IN865_INIT_DEFAULTS( ) IN865_CASE { RegionIN865InitDefaults( params ); break; } -#define IN865_VERIFY( ) IN865_CASE { return RegionIN865Verify( verify, phyAttribute ); } -#define IN865_APPLY_CF_LIST( ) IN865_CASE { RegionIN865ApplyCFList( applyCFList ); break; } -#define IN865_CHAN_MASK_SET( ) IN865_CASE { return RegionIN865ChanMaskSet( chanMaskSet ); } -#define IN865_COMPUTE_RX_WINDOW_PARAMETERS( ) IN865_CASE { RegionIN865ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } -#define IN865_RX_CONFIG( ) IN865_CASE { return RegionIN865RxConfig( rxConfig, datarate ); } -#define IN865_TX_CONFIG( ) IN865_CASE { return RegionIN865TxConfig( txConfig, txPower, txTimeOnAir ); } -#define IN865_LINK_ADR_REQ( ) IN865_CASE { return RegionIN865LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } -#define IN865_RX_PARAM_SETUP_REQ( ) IN865_CASE { return RegionIN865RxParamSetupReq( rxParamSetupReq ); } -#define IN865_NEW_CHANNEL_REQ( ) IN865_CASE { return RegionIN865NewChannelReq( newChannelReq ); } -#define IN865_TX_PARAM_SETUP_REQ( ) IN865_CASE { return RegionIN865TxParamSetupReq( txParamSetupReq ); } -#define IN865_DL_CHANNEL_REQ( ) IN865_CASE { return RegionIN865DlChannelReq( dlChannelReq ); } -#define IN865_ALTERNATE_DR( ) IN865_CASE { return RegionIN865AlternateDr( currentDr, type ); } -#define IN865_NEXT_CHANNEL( ) IN865_CASE { return RegionIN865NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } -#define IN865_CHANNEL_ADD( ) IN865_CASE { return RegionIN865ChannelAdd( channelAdd ); } -#define IN865_CHANNEL_REMOVE( ) IN865_CASE { return RegionIN865ChannelsRemove( channelRemove ); } -#define IN865_APPLY_DR_OFFSET( ) IN865_CASE { return RegionIN865ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } -#define IN865_RX_BEACON_SETUP( ) IN865_CASE { RegionIN865RxBeaconSetup( rxBeaconSetup, outDr ); break; } -#else -#define IN865_IS_ACTIVE( ) -#define IN865_GET_PHY_PARAM( ) -#define IN865_SET_BAND_TX_DONE( ) -#define IN865_INIT_DEFAULTS( ) -#define IN865_GET_NVM_CTX( ) -#define IN865_VERIFY( ) -#define IN865_APPLY_CF_LIST( ) -#define IN865_CHAN_MASK_SET( ) -#define IN865_COMPUTE_RX_WINDOW_PARAMETERS( ) -#define IN865_RX_CONFIG( ) -#define IN865_TX_CONFIG( ) -#define IN865_LINK_ADR_REQ( ) -#define IN865_RX_PARAM_SETUP_REQ( ) -#define IN865_NEW_CHANNEL_REQ( ) -#define IN865_TX_PARAM_SETUP_REQ( ) -#define IN865_DL_CHANNEL_REQ( ) -#define IN865_ALTERNATE_DR( ) -#define IN865_NEXT_CHANNEL( ) -#define IN865_CHANNEL_ADD( ) -#define IN865_CHANNEL_REMOVE( ) -#define IN865_APPLY_DR_OFFSET( ) -#define IN865_RX_BEACON_SETUP( ) -#endif - -#ifdef REGION_US915 +//#define IN865_CASE case LORAMAC_REGION_IN865: +#define IN865_IS_ACTIVE( ) { return true; } +#define IN865_GET_PHY_PARAM( ) { return RegionIN865GetPhyParam( getPhy ); } +#define IN865_SET_BAND_TX_DONE( ) { RegionIN865SetBandTxDone( txDone ); break; } +#define IN865_INIT_DEFAULTS( ) { RegionIN865InitDefaults( params ); break; } +#define IN865_VERIFY( ) { return RegionIN865Verify( verify, phyAttribute ); } +#define IN865_APPLY_CF_LIST( ) { RegionIN865ApplyCFList( applyCFList ); break; } +#define IN865_CHAN_MASK_SET( ) { return RegionIN865ChanMaskSet( chanMaskSet ); } +#define IN865_COMPUTE_RX_WINDOW_PARAMETERS( ) { RegionIN865ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } +#define IN865_RX_CONFIG( ) { return RegionIN865RxConfig( rxConfig, datarate ); } +#define IN865_TX_CONFIG( ) { return RegionIN865TxConfig( txConfig, txPower, txTimeOnAir ); } +#define IN865_LINK_ADR_REQ( ) { return RegionIN865LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } +#define IN865_RX_PARAM_SETUP_REQ( ) { return RegionIN865RxParamSetupReq( rxParamSetupReq ); } +#define IN865_NEW_CHANNEL_REQ( ) { return RegionIN865NewChannelReq( newChannelReq ); } +#define IN865_TX_PARAM_SETUP_REQ( ) { return RegionIN865TxParamSetupReq( txParamSetupReq ); } +#define IN865_DL_CHANNEL_REQ( ) { return RegionIN865DlChannelReq( dlChannelReq ); } +#define IN865_ALTERNATE_DR( ) { return RegionIN865AlternateDr( currentDr, type ); } +#define IN865_NEXT_CHANNEL( ) { return RegionIN865NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } +#define IN865_CHANNEL_ADD( ) { return RegionIN865ChannelAdd( channelAdd ); } +#define IN865_CHANNEL_REMOVE( ) { return RegionIN865ChannelsRemove( channelRemove ); } +#define IN865_APPLY_DR_OFFSET( ) { return RegionIN865ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } +#define IN865_RX_BEACON_SETUP( ) { RegionIN865RxBeaconSetup( rxBeaconSetup, outDr ); break; } +// #else +// #define IN865_IS_ACTIVE( ) +// #define IN865_GET_PHY_PARAM( ) +// #define IN865_SET_BAND_TX_DONE( ) +// #define IN865_INIT_DEFAULTS( ) +// #define IN865_GET_NVM_CTX( ) +// #define IN865_VERIFY( ) +// #define IN865_APPLY_CF_LIST( ) +// #define IN865_CHAN_MASK_SET( ) +// #define IN865_COMPUTE_RX_WINDOW_PARAMETERS( ) +// #define IN865_RX_CONFIG( ) +// #define IN865_TX_CONFIG( ) +// #define IN865_LINK_ADR_REQ( ) +// #define IN865_RX_PARAM_SETUP_REQ( ) +// #define IN865_NEW_CHANNEL_REQ( ) +// #define IN865_TX_PARAM_SETUP_REQ( ) +// #define IN865_DL_CHANNEL_REQ( ) +// #define IN865_ALTERNATE_DR( ) +// #define IN865_NEXT_CHANNEL( ) +// #define IN865_CHANNEL_ADD( ) +// #define IN865_CHANNEL_REMOVE( ) +// #define IN865_APPLY_DR_OFFSET( ) +// #define IN865_RX_BEACON_SETUP( ) +// #endif + +// #ifdef REGION_US915 #include "RegionUS915.h" -#define US915_CASE case LORAMAC_REGION_US915: -#define US915_IS_ACTIVE( ) US915_CASE { return true; } -#define US915_GET_PHY_PARAM( ) US915_CASE { return RegionUS915GetPhyParam( getPhy ); } -#define US915_SET_BAND_TX_DONE( ) US915_CASE { RegionUS915SetBandTxDone( txDone ); break; } -#define US915_INIT_DEFAULTS( ) US915_CASE { RegionUS915InitDefaults( params ); break; } -#define US915_VERIFY( ) US915_CASE { return RegionUS915Verify( verify, phyAttribute ); } -#define US915_APPLY_CF_LIST( ) US915_CASE { RegionUS915ApplyCFList( applyCFList ); break; } -#define US915_CHAN_MASK_SET( ) US915_CASE { return RegionUS915ChanMaskSet( chanMaskSet ); } -#define US915_COMPUTE_RX_WINDOW_PARAMETERS( ) US915_CASE { RegionUS915ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } -#define US915_RX_CONFIG( ) US915_CASE { return RegionUS915RxConfig( rxConfig, datarate ); } -#define US915_TX_CONFIG( ) US915_CASE { return RegionUS915TxConfig( txConfig, txPower, txTimeOnAir ); } -#define US915_LINK_ADR_REQ( ) US915_CASE { return RegionUS915LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } -#define US915_RX_PARAM_SETUP_REQ( ) US915_CASE { return RegionUS915RxParamSetupReq( rxParamSetupReq ); } -#define US915_NEW_CHANNEL_REQ( ) US915_CASE { return RegionUS915NewChannelReq( newChannelReq ); } -#define US915_TX_PARAM_SETUP_REQ( ) US915_CASE { return RegionUS915TxParamSetupReq( txParamSetupReq ); } -#define US915_DL_CHANNEL_REQ( ) US915_CASE { return RegionUS915DlChannelReq( dlChannelReq ); } -#define US915_ALTERNATE_DR( ) US915_CASE { return RegionUS915AlternateDr( currentDr, type ); } -#define US915_NEXT_CHANNEL( ) US915_CASE { return RegionUS915NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } -#define US915_CHANNEL_ADD( ) US915_CASE { return RegionUS915ChannelAdd( channelAdd ); } -#define US915_CHANNEL_REMOVE( ) US915_CASE { return RegionUS915ChannelsRemove( channelRemove ); } -#define US915_APPLY_DR_OFFSET( ) US915_CASE { return RegionUS915ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } -#define US915_RX_BEACON_SETUP( ) US915_CASE { RegionUS915RxBeaconSetup( rxBeaconSetup, outDr ); break; } -#else -#define US915_IS_ACTIVE( ) -#define US915_GET_PHY_PARAM( ) -#define US915_SET_BAND_TX_DONE( ) -#define US915_INIT_DEFAULTS( ) -#define US915_GET_NVM_CTX( ) -#define US915_VERIFY( ) -#define US915_APPLY_CF_LIST( ) -#define US915_CHAN_MASK_SET( ) -#define US915_COMPUTE_RX_WINDOW_PARAMETERS( ) -#define US915_RX_CONFIG( ) -#define US915_TX_CONFIG( ) -#define US915_LINK_ADR_REQ( ) -#define US915_RX_PARAM_SETUP_REQ( ) -#define US915_NEW_CHANNEL_REQ( ) -#define US915_TX_PARAM_SETUP_REQ( ) -#define US915_DL_CHANNEL_REQ( ) -#define US915_ALTERNATE_DR( ) -#define US915_NEXT_CHANNEL( ) -#define US915_CHANNEL_ADD( ) -#define US915_CHANNEL_REMOVE( ) -#define US915_APPLY_DR_OFFSET( ) -#define US915_RX_BEACON_SETUP( ) -#endif - -#ifdef REGION_RU864 +//#define US915_CASE case LORAMAC_REGION_US915: +#define US915_IS_ACTIVE( ) { return true; } +#define US915_GET_PHY_PARAM( ) { return RegionUS915GetPhyParam( getPhy ); } +#define US915_SET_BAND_TX_DONE( ) { RegionUS915SetBandTxDone( txDone ); break; } +#define US915_INIT_DEFAULTS( ) { RegionUS915InitDefaults( params ); break; } +#define US915_VERIFY( ) { return RegionUS915Verify( verify, phyAttribute ); } +#define US915_APPLY_CF_LIST( ) { RegionUS915ApplyCFList( applyCFList ); break; } +#define US915_CHAN_MASK_SET( ) { return RegionUS915ChanMaskSet( chanMaskSet ); } +#define US915_COMPUTE_RX_WINDOW_PARAMETERS( ) { RegionUS915ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } +#define US915_RX_CONFIG( ) { return RegionUS915RxConfig( rxConfig, datarate ); } +#define US915_TX_CONFIG( ) { return RegionUS915TxConfig( txConfig, txPower, txTimeOnAir ); } +#define US915_LINK_ADR_REQ( ) { return RegionUS915LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } +#define US915_RX_PARAM_SETUP_REQ( ) { return RegionUS915RxParamSetupReq( rxParamSetupReq ); } +#define US915_NEW_CHANNEL_REQ( ) { return RegionUS915NewChannelReq( newChannelReq ); } +#define US915_TX_PARAM_SETUP_REQ( ) { return RegionUS915TxParamSetupReq( txParamSetupReq ); } +#define US915_DL_CHANNEL_REQ( ) { return RegionUS915DlChannelReq( dlChannelReq ); } +#define US915_ALTERNATE_DR( ) { return RegionUS915AlternateDr( currentDr, type ); } +#define US915_NEXT_CHANNEL( ) { return RegionUS915NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } +#define US915_CHANNEL_ADD( ) { return RegionUS915ChannelAdd( channelAdd ); } +#define US915_CHANNEL_REMOVE( ) { return RegionUS915ChannelsRemove( channelRemove ); } +#define US915_APPLY_DR_OFFSET( ) { return RegionUS915ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } +#define US915_RX_BEACON_SETUP( ) { RegionUS915RxBeaconSetup( rxBeaconSetup, outDr ); break; } +// #else +// #define US915_IS_ACTIVE( ) +// #define US915_GET_PHY_PARAM( ) +// #define US915_SET_BAND_TX_DONE( ) +// #define US915_INIT_DEFAULTS( ) +// #define US915_GET_NVM_CTX( ) +// #define US915_VERIFY( ) +// #define US915_APPLY_CF_LIST( ) +// #define US915_CHAN_MASK_SET( ) +// #define US915_COMPUTE_RX_WINDOW_PARAMETERS( ) +// #define US915_RX_CONFIG( ) +// #define US915_TX_CONFIG( ) +// #define US915_LINK_ADR_REQ( ) +// #define US915_RX_PARAM_SETUP_REQ( ) +// #define US915_NEW_CHANNEL_REQ( ) +// #define US915_TX_PARAM_SETUP_REQ( ) +// #define US915_DL_CHANNEL_REQ( ) +// #define US915_ALTERNATE_DR( ) +// #define US915_NEXT_CHANNEL( ) +// #define US915_CHANNEL_ADD( ) +// #define US915_CHANNEL_REMOVE( ) +// #define US915_APPLY_DR_OFFSET( ) +// #define US915_RX_BEACON_SETUP( ) +// #endif + +// #ifdef REGION_RU864 #include "RegionRU864.h" -#define RU864_CASE case LORAMAC_REGION_RU864: -#define RU864_IS_ACTIVE( ) RU864_CASE { return true; } -#define RU864_GET_PHY_PARAM( ) RU864_CASE { return RegionRU864GetPhyParam( getPhy ); } -#define RU864_SET_BAND_TX_DONE( ) RU864_CASE { RegionRU864SetBandTxDone( txDone ); break; } -#define RU864_INIT_DEFAULTS( ) RU864_CASE { RegionRU864InitDefaults( params ); break; } -#define RU864_VERIFY( ) RU864_CASE { return RegionRU864Verify( verify, phyAttribute ); } -#define RU864_APPLY_CF_LIST( ) RU864_CASE { RegionRU864ApplyCFList( applyCFList ); break; } -#define RU864_CHAN_MASK_SET( ) RU864_CASE { return RegionRU864ChanMaskSet( chanMaskSet ); } -#define RU864_COMPUTE_RX_WINDOW_PARAMETERS( ) RU864_CASE { RegionRU864ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } -#define RU864_RX_CONFIG( ) RU864_CASE { return RegionRU864RxConfig( rxConfig, datarate ); } -#define RU864_TX_CONFIG( ) RU864_CASE { return RegionRU864TxConfig( txConfig, txPower, txTimeOnAir ); } -#define RU864_LINK_ADR_REQ( ) RU864_CASE { return RegionRU864LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } -#define RU864_RX_PARAM_SETUP_REQ( ) RU864_CASE { return RegionRU864RxParamSetupReq( rxParamSetupReq ); } -#define RU864_NEW_CHANNEL_REQ( ) RU864_CASE { return RegionRU864NewChannelReq( newChannelReq ); } -#define RU864_TX_PARAM_SETUP_REQ( ) RU864_CASE { return RegionRU864TxParamSetupReq( txParamSetupReq ); } -#define RU864_DL_CHANNEL_REQ( ) RU864_CASE { return RegionRU864DlChannelReq( dlChannelReq ); } -#define RU864_ALTERNATE_DR( ) RU864_CASE { return RegionRU864AlternateDr( currentDr, type ); } -#define RU864_NEXT_CHANNEL( ) RU864_CASE { return RegionRU864NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } -#define RU864_CHANNEL_ADD( ) RU864_CASE { return RegionRU864ChannelAdd( channelAdd ); } -#define RU864_CHANNEL_REMOVE( ) RU864_CASE { return RegionRU864ChannelsRemove( channelRemove ); } -#define RU864_APPLY_DR_OFFSET( ) RU864_CASE { return RegionRU864ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } -#define RU864_RX_BEACON_SETUP( ) RU864_CASE { RegionRU864RxBeaconSetup( rxBeaconSetup, outDr ); break; } -#else -#define RU864_IS_ACTIVE( ) -#define RU864_GET_PHY_PARAM( ) -#define RU864_SET_BAND_TX_DONE( ) -#define RU864_INIT_DEFAULTS( ) -#define RU864_GET_NVM_CTX( ) -#define RU864_VERIFY( ) -#define RU864_APPLY_CF_LIST( ) -#define RU864_CHAN_MASK_SET( ) -#define RU864_COMPUTE_RX_WINDOW_PARAMETERS( ) -#define RU864_RX_CONFIG( ) -#define RU864_TX_CONFIG( ) -#define RU864_LINK_ADR_REQ( ) -#define RU864_RX_PARAM_SETUP_REQ( ) -#define RU864_NEW_CHANNEL_REQ( ) -#define RU864_TX_PARAM_SETUP_REQ( ) -#define RU864_DL_CHANNEL_REQ( ) -#define RU864_ALTERNATE_DR( ) -#define RU864_NEXT_CHANNEL( ) -#define RU864_CHANNEL_ADD( ) -#define RU864_CHANNEL_REMOVE( ) -#define RU864_APPLY_DR_OFFSET( ) -#define RU864_RX_BEACON_SETUP( ) -#endif +//#define RU864_CASE case LORAMAC_REGION_RU864: +#define RU864_IS_ACTIVE( ) { return true; } +#define RU864_GET_PHY_PARAM( ) { return RegionRU864GetPhyParam( getPhy ); } +#define RU864_SET_BAND_TX_DONE( ) { RegionRU864SetBandTxDone( txDone ); break; } +#define RU864_INIT_DEFAULTS( ) { RegionRU864InitDefaults( params ); break; } +#define RU864_VERIFY( ) { return RegionRU864Verify( verify, phyAttribute ); } +#define RU864_APPLY_CF_LIST( ) { RegionRU864ApplyCFList( applyCFList ); break; } +#define RU864_CHAN_MASK_SET( ) { return RegionRU864ChanMaskSet( chanMaskSet ); } +#define RU864_COMPUTE_RX_WINDOW_PARAMETERS( ) { RegionRU864ComputeRxWindowParameters( datarate, minRxSymbols, rxError, rxConfigParams ); break; } +#define RU864_RX_CONFIG( ) { return RegionRU864RxConfig( rxConfig, datarate ); } +#define RU864_TX_CONFIG( ) { return RegionRU864TxConfig( txConfig, txPower, txTimeOnAir ); } +#define RU864_LINK_ADR_REQ( ) { return RegionRU864LinkAdrReq( linkAdrReq, drOut, txPowOut, nbRepOut, nbBytesParsed ); } +#define RU864_RX_PARAM_SETUP_REQ( ) { return RegionRU864RxParamSetupReq( rxParamSetupReq ); } +#define RU864_NEW_CHANNEL_REQ( ) { return RegionRU864NewChannelReq( newChannelReq ); } +#define RU864_TX_PARAM_SETUP_REQ( ) { return RegionRU864TxParamSetupReq( txParamSetupReq ); } +#define RU864_DL_CHANNEL_REQ( ) { return RegionRU864DlChannelReq( dlChannelReq ); } +#define RU864_ALTERNATE_DR( ) { return RegionRU864AlternateDr( currentDr, type ); } +#define RU864_NEXT_CHANNEL( ) { return RegionRU864NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); } +#define RU864_CHANNEL_ADD( ) { return RegionRU864ChannelAdd( channelAdd ); } +#define RU864_CHANNEL_REMOVE( ) { return RegionRU864ChannelsRemove( channelRemove ); } +#define RU864_APPLY_DR_OFFSET( ) { return RegionRU864ApplyDrOffset( downlinkDwellTime, dr, drOffset ); } +#define RU864_RX_BEACON_SETUP( ) { RegionRU864RxBeaconSetup( rxBeaconSetup, outDr ); break; } +// #else +// #define RU864_IS_ACTIVE( ) +// #define RU864_GET_PHY_PARAM( ) +// #define RU864_SET_BAND_TX_DONE( ) +// #define RU864_INIT_DEFAULTS( ) +// #define RU864_GET_NVM_CTX( ) +// #define RU864_VERIFY( ) +// #define RU864_APPLY_CF_LIST( ) +// #define RU864_CHAN_MASK_SET( ) +// #define RU864_COMPUTE_RX_WINDOW_PARAMETERS( ) +// #define RU864_RX_CONFIG( ) +// #define RU864_TX_CONFIG( ) +// #define RU864_LINK_ADR_REQ( ) +// #define RU864_RX_PARAM_SETUP_REQ( ) +// #define RU864_NEW_CHANNEL_REQ( ) +// #define RU864_TX_PARAM_SETUP_REQ( ) +// #define RU864_DL_CHANNEL_REQ( ) +// #define RU864_ALTERNATE_DR( ) +// #define RU864_NEXT_CHANNEL( ) +// #define RU864_CHANNEL_ADD( ) +// #define RU864_CHANNEL_REMOVE( ) +// #define RU864_APPLY_DR_OFFSET( ) +// #define RU864_RX_BEACON_SETUP( ) +// #endif bool RegionIsActive( LoRaMacRegion_t region ) { switch( region ) { - AS923_IS_ACTIVE( ); - AU915_IS_ACTIVE( ); - CN470_IS_ACTIVE( ); - CN779_IS_ACTIVE( ); - EU433_IS_ACTIVE( ); - EU868_IS_ACTIVE( ); - KR920_IS_ACTIVE( ); - IN865_IS_ACTIVE( ); - US915_IS_ACTIVE( ); - RU864_IS_ACTIVE( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_IS_ACTIVE( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_IS_ACTIVE( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_IS_ACTIVE( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_IS_ACTIVE( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_IS_ACTIVE( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_IS_ACTIVE( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_IS_ACTIVE( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_IS_ACTIVE( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_IS_ACTIVE( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_IS_ACTIVE( ); + break; + + default: { - return false; + return true; // FIX THIS NOW } } } @@ -548,16 +600,69 @@ PhyParam_t RegionGetPhyParam( LoRaMacRegion_t region, GetPhyParams_t* getPhy ) PhyParam_t phyParam = { 0 }; switch( region ) { - AS923_GET_PHY_PARAM( ); - AU915_GET_PHY_PARAM( ); - CN470_GET_PHY_PARAM( ); - CN779_GET_PHY_PARAM( ); - EU433_GET_PHY_PARAM( ); - EU868_GET_PHY_PARAM( ); - KR920_GET_PHY_PARAM( ); - IN865_GET_PHY_PARAM( ); - US915_GET_PHY_PARAM( ); - RU864_GET_PHY_PARAM( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_GET_PHY_PARAM( ); + break; + + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_GET_PHY_PARAM( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_GET_PHY_PARAM( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_GET_PHY_PARAM( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_GET_PHY_PARAM( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_GET_PHY_PARAM( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_GET_PHY_PARAM( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_GET_PHY_PARAM( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_GET_PHY_PARAM( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_GET_PHY_PARAM( ); + break; + + default: { return phyParam; @@ -569,16 +674,67 @@ void RegionSetBandTxDone( LoRaMacRegion_t region, SetBandTxDoneParams_t* txDone { switch( region ) { - AS923_SET_BAND_TX_DONE( ); - AU915_SET_BAND_TX_DONE( ); - CN470_SET_BAND_TX_DONE( ); - CN779_SET_BAND_TX_DONE( ); - EU433_SET_BAND_TX_DONE( ); - EU868_SET_BAND_TX_DONE( ); - KR920_SET_BAND_TX_DONE( ); - IN865_SET_BAND_TX_DONE( ); - US915_SET_BAND_TX_DONE( ); - RU864_SET_BAND_TX_DONE( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_SET_BAND_TX_DONE( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_SET_BAND_TX_DONE( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_SET_BAND_TX_DONE( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_SET_BAND_TX_DONE( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_SET_BAND_TX_DONE( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_SET_BAND_TX_DONE( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_SET_BAND_TX_DONE( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_SET_BAND_TX_DONE( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_SET_BAND_TX_DONE( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_SET_BAND_TX_DONE( ); + break; + default: { return; @@ -590,16 +746,68 @@ void RegionInitDefaults( LoRaMacRegion_t region, InitDefaultsParams_t* params ) { switch( region ) { - AS923_INIT_DEFAULTS( ); - AU915_INIT_DEFAULTS( ); - CN470_INIT_DEFAULTS( ); - CN779_INIT_DEFAULTS( ); - EU433_INIT_DEFAULTS( ); - EU868_INIT_DEFAULTS( ); - KR920_INIT_DEFAULTS( ); - IN865_INIT_DEFAULTS( ); - US915_INIT_DEFAULTS( ); - RU864_INIT_DEFAULTS( ); + + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_INIT_DEFAULTS( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_INIT_DEFAULTS( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_INIT_DEFAULTS( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_INIT_DEFAULTS( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_INIT_DEFAULTS( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_INIT_DEFAULTS( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_INIT_DEFAULTS( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_INIT_DEFAULTS( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_INIT_DEFAULTS( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_INIT_DEFAULTS( ); + break; + default: { break; @@ -611,16 +819,67 @@ bool RegionVerify( LoRaMacRegion_t region, VerifyParams_t* verify, PhyAttribute_ { switch( region ) { - AS923_VERIFY( ); - AU915_VERIFY( ); - CN470_VERIFY( ); - CN779_VERIFY( ); - EU433_VERIFY( ); - EU868_VERIFY( ); - KR920_VERIFY( ); - IN865_VERIFY( ); - US915_VERIFY( ); - RU864_VERIFY( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_VERIFY( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_VERIFY( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_VERIFY( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_VERIFY( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_VERIFY( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_VERIFY( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_VERIFY( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_VERIFY( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_VERIFY( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_VERIFY( ); + break; + default: { return false; @@ -632,16 +891,67 @@ void RegionApplyCFList( LoRaMacRegion_t region, ApplyCFListParams_t* applyCFList { switch( region ) { - AS923_APPLY_CF_LIST( ); - AU915_APPLY_CF_LIST( ); - CN470_APPLY_CF_LIST( ); - CN779_APPLY_CF_LIST( ); - EU433_APPLY_CF_LIST( ); - EU868_APPLY_CF_LIST( ); - KR920_APPLY_CF_LIST( ); - IN865_APPLY_CF_LIST( ); - US915_APPLY_CF_LIST( ); - RU864_APPLY_CF_LIST( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_APPLY_CF_LIST( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_APPLY_CF_LIST( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_APPLY_CF_LIST( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_APPLY_CF_LIST( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_APPLY_CF_LIST( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_APPLY_CF_LIST( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_APPLY_CF_LIST( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_APPLY_CF_LIST( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_APPLY_CF_LIST( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_APPLY_CF_LIST( ); + break; + default: { break; @@ -653,16 +963,67 @@ bool RegionChanMaskSet( LoRaMacRegion_t region, ChanMaskSetParams_t* chanMaskSet { switch( region ) { - AS923_CHAN_MASK_SET( ); - AU915_CHAN_MASK_SET( ); - CN470_CHAN_MASK_SET( ); - CN779_CHAN_MASK_SET( ); - EU433_CHAN_MASK_SET( ); - EU868_CHAN_MASK_SET( ); - KR920_CHAN_MASK_SET( ); - IN865_CHAN_MASK_SET( ); - US915_CHAN_MASK_SET( ); - RU864_CHAN_MASK_SET( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_CHAN_MASK_SET( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_CHAN_MASK_SET( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_CHAN_MASK_SET( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_CHAN_MASK_SET( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_CHAN_MASK_SET( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_CHAN_MASK_SET( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_CHAN_MASK_SET( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_CHAN_MASK_SET( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_CHAN_MASK_SET( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_CHAN_MASK_SET( ); + break; + default: { return false; @@ -674,16 +1035,67 @@ void RegionComputeRxWindowParameters( LoRaMacRegion_t region, int8_t datarate, u { switch( region ) { - AS923_COMPUTE_RX_WINDOW_PARAMETERS( ); - AU915_COMPUTE_RX_WINDOW_PARAMETERS( ); - CN470_COMPUTE_RX_WINDOW_PARAMETERS( ); - CN779_COMPUTE_RX_WINDOW_PARAMETERS( ); - EU433_COMPUTE_RX_WINDOW_PARAMETERS( ); - EU868_COMPUTE_RX_WINDOW_PARAMETERS( ); - KR920_COMPUTE_RX_WINDOW_PARAMETERS( ); - IN865_COMPUTE_RX_WINDOW_PARAMETERS( ); - US915_COMPUTE_RX_WINDOW_PARAMETERS( ); - RU864_COMPUTE_RX_WINDOW_PARAMETERS( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_COMPUTE_RX_WINDOW_PARAMETERS( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_COMPUTE_RX_WINDOW_PARAMETERS( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_COMPUTE_RX_WINDOW_PARAMETERS( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_COMPUTE_RX_WINDOW_PARAMETERS( ); + break; + /*! + * European band on 433MHz + */ + LORAMAC_REGION_EU433: + EU433_COMPUTE_RX_WINDOW_PARAMETERS( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_COMPUTE_RX_WINDOW_PARAMETERS( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_COMPUTE_RX_WINDOW_PARAMETERS( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_COMPUTE_RX_WINDOW_PARAMETERS( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_COMPUTE_RX_WINDOW_PARAMETERS( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_COMPUTE_RX_WINDOW_PARAMETERS( ); + break; + default: { break; @@ -695,16 +1107,67 @@ bool RegionRxConfig( LoRaMacRegion_t region, RxConfigParams_t* rxConfig, int8_t* { switch( region ) { - AS923_RX_CONFIG( ); - AU915_RX_CONFIG( ); - CN470_RX_CONFIG( ); - CN779_RX_CONFIG( ); - EU433_RX_CONFIG( ); - EU868_RX_CONFIG( ); - KR920_RX_CONFIG( ); - IN865_RX_CONFIG( ); - US915_RX_CONFIG( ); - RU864_RX_CONFIG( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_RX_CONFIG( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_RX_CONFIG( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_RX_CONFIG( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_RX_CONFIG( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_RX_CONFIG( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_RX_CONFIG( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_RX_CONFIG( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_RX_CONFIG( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_RX_CONFIG( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_RX_CONFIG( ); + break; + default: { return false; @@ -716,16 +1179,67 @@ bool RegionTxConfig( LoRaMacRegion_t region, TxConfigParams_t* txConfig, int8_t* { switch( region ) { - AS923_TX_CONFIG( ); - AU915_TX_CONFIG( ); - CN470_TX_CONFIG( ); - CN779_TX_CONFIG( ); - EU433_TX_CONFIG( ); - EU868_TX_CONFIG( ); - KR920_TX_CONFIG( ); - IN865_TX_CONFIG( ); - US915_TX_CONFIG( ); - RU864_TX_CONFIG( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_TX_CONFIG( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_TX_CONFIG( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_TX_CONFIG( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_TX_CONFIG( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_TX_CONFIG( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_TX_CONFIG( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_TX_CONFIG( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_TX_CONFIG( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_TX_CONFIG( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_TX_CONFIG( ); + break; + default: { return false; @@ -737,16 +1251,67 @@ uint8_t RegionLinkAdrReq( LoRaMacRegion_t region, LinkAdrReqParams_t* linkAdrReq { switch( region ) { - AS923_LINK_ADR_REQ( ); - AU915_LINK_ADR_REQ( ); - CN470_LINK_ADR_REQ( ); - CN779_LINK_ADR_REQ( ); - EU433_LINK_ADR_REQ( ); - EU868_LINK_ADR_REQ( ); - KR920_LINK_ADR_REQ( ); - IN865_LINK_ADR_REQ( ); - US915_LINK_ADR_REQ( ); - RU864_LINK_ADR_REQ( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_LINK_ADR_REQ( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_LINK_ADR_REQ( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_LINK_ADR_REQ( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_LINK_ADR_REQ( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_LINK_ADR_REQ( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_LINK_ADR_REQ( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_LINK_ADR_REQ( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_LINK_ADR_REQ( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_LINK_ADR_REQ( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_LINK_ADR_REQ( ); + break; + default: { return 0; @@ -758,16 +1323,67 @@ uint8_t RegionRxParamSetupReq( LoRaMacRegion_t region, RxParamSetupReqParams_t* { switch( region ) { - AS923_RX_PARAM_SETUP_REQ( ); - AU915_RX_PARAM_SETUP_REQ( ); - CN470_RX_PARAM_SETUP_REQ( ); - CN779_RX_PARAM_SETUP_REQ( ); - EU433_RX_PARAM_SETUP_REQ( ); - EU868_RX_PARAM_SETUP_REQ( ); - KR920_RX_PARAM_SETUP_REQ( ); - IN865_RX_PARAM_SETUP_REQ( ); - US915_RX_PARAM_SETUP_REQ( ); - RU864_RX_PARAM_SETUP_REQ( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_RX_PARAM_SETUP_REQ( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_RX_PARAM_SETUP_REQ( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_RX_PARAM_SETUP_REQ( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_RX_PARAM_SETUP_REQ( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_RX_PARAM_SETUP_REQ( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_RX_PARAM_SETUP_REQ( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_RX_PARAM_SETUP_REQ( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_RX_PARAM_SETUP_REQ( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_RX_PARAM_SETUP_REQ( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_RX_PARAM_SETUP_REQ( ); + break; + default: { return 0; @@ -779,16 +1395,67 @@ int8_t RegionNewChannelReq( LoRaMacRegion_t region, NewChannelReqParams_t* newCh { switch( region ) { - AS923_NEW_CHANNEL_REQ( ); - AU915_NEW_CHANNEL_REQ( ); - CN470_NEW_CHANNEL_REQ( ); - CN779_NEW_CHANNEL_REQ( ); - EU433_NEW_CHANNEL_REQ( ); - EU868_NEW_CHANNEL_REQ( ); - KR920_NEW_CHANNEL_REQ( ); - IN865_NEW_CHANNEL_REQ( ); - US915_NEW_CHANNEL_REQ( ); - RU864_NEW_CHANNEL_REQ( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_NEW_CHANNEL_REQ( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_NEW_CHANNEL_REQ( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_NEW_CHANNEL_REQ( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_NEW_CHANNEL_REQ( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_NEW_CHANNEL_REQ( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_NEW_CHANNEL_REQ( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_NEW_CHANNEL_REQ( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_NEW_CHANNEL_REQ( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_NEW_CHANNEL_REQ( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_NEW_CHANNEL_REQ( ); + break; + default: { return 0; @@ -800,16 +1467,67 @@ int8_t RegionTxParamSetupReq( LoRaMacRegion_t region, TxParamSetupReqParams_t* t { switch( region ) { - AS923_TX_PARAM_SETUP_REQ( ); - AU915_TX_PARAM_SETUP_REQ( ); - CN470_TX_PARAM_SETUP_REQ( ); - CN779_TX_PARAM_SETUP_REQ( ); - EU433_TX_PARAM_SETUP_REQ( ); - EU868_TX_PARAM_SETUP_REQ( ); - KR920_TX_PARAM_SETUP_REQ( ); - IN865_TX_PARAM_SETUP_REQ( ); - US915_TX_PARAM_SETUP_REQ( ); - RU864_TX_PARAM_SETUP_REQ( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_TX_PARAM_SETUP_REQ( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_TX_PARAM_SETUP_REQ( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_TX_PARAM_SETUP_REQ( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_TX_PARAM_SETUP_REQ( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_TX_PARAM_SETUP_REQ( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_TX_PARAM_SETUP_REQ( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_TX_PARAM_SETUP_REQ( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_TX_PARAM_SETUP_REQ( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_TX_PARAM_SETUP_REQ( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_TX_PARAM_SETUP_REQ( ); + break; + default: { return 0; @@ -821,16 +1539,67 @@ int8_t RegionDlChannelReq( LoRaMacRegion_t region, DlChannelReqParams_t* dlChann { switch( region ) { - AS923_DL_CHANNEL_REQ( ); - AU915_DL_CHANNEL_REQ( ); - CN470_DL_CHANNEL_REQ( ); - CN779_DL_CHANNEL_REQ( ); - EU433_DL_CHANNEL_REQ( ); - EU868_DL_CHANNEL_REQ( ); - KR920_DL_CHANNEL_REQ( ); - IN865_DL_CHANNEL_REQ( ); - US915_DL_CHANNEL_REQ( ); - RU864_DL_CHANNEL_REQ( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_DL_CHANNEL_REQ( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_DL_CHANNEL_REQ( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_DL_CHANNEL_REQ( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_DL_CHANNEL_REQ( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_DL_CHANNEL_REQ( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_DL_CHANNEL_REQ( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_DL_CHANNEL_REQ( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_DL_CHANNEL_REQ( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_DL_CHANNEL_REQ( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_DL_CHANNEL_REQ( ); + break; + default: { return 0; @@ -842,16 +1611,67 @@ int8_t RegionAlternateDr( LoRaMacRegion_t region, int8_t currentDr, AlternateDrT { switch( region ) { - AS923_ALTERNATE_DR( ); - AU915_ALTERNATE_DR( ); - CN470_ALTERNATE_DR( ); - CN779_ALTERNATE_DR( ); - EU433_ALTERNATE_DR( ); - EU868_ALTERNATE_DR( ); - KR920_ALTERNATE_DR( ); - IN865_ALTERNATE_DR( ); - US915_ALTERNATE_DR( ); - RU864_ALTERNATE_DR( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_ALTERNATE_DR( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_ALTERNATE_DR( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_ALTERNATE_DR( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_ALTERNATE_DR( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_ALTERNATE_DR( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_ALTERNATE_DR( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_ALTERNATE_DR( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_ALTERNATE_DR( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_ALTERNATE_DR( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_ALTERNATE_DR( ); + break; + default: { return 0; @@ -863,16 +1683,67 @@ LoRaMacStatus_t RegionNextChannel( LoRaMacRegion_t region, NextChanParams_t* nex { switch( region ) { - AS923_NEXT_CHANNEL( ); - AU915_NEXT_CHANNEL( ); - CN470_NEXT_CHANNEL( ); - CN779_NEXT_CHANNEL( ); - EU433_NEXT_CHANNEL( ); - EU868_NEXT_CHANNEL( ); - KR920_NEXT_CHANNEL( ); - IN865_NEXT_CHANNEL( ); - US915_NEXT_CHANNEL( ); - RU864_NEXT_CHANNEL( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_NEXT_CHANNEL( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_NEXT_CHANNEL( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_NEXT_CHANNEL( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_NEXT_CHANNEL( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_NEXT_CHANNEL( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_NEXT_CHANNEL( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_NEXT_CHANNEL( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_NEXT_CHANNEL( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_NEXT_CHANNEL( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_NEXT_CHANNEL( ); + break; + default: { return LORAMAC_STATUS_REGION_NOT_SUPPORTED; @@ -884,16 +1755,67 @@ LoRaMacStatus_t RegionChannelAdd( LoRaMacRegion_t region, ChannelAddParams_t* ch { switch( region ) { - AS923_CHANNEL_ADD( ); - AU915_CHANNEL_ADD( ); - CN470_CHANNEL_ADD( ); - CN779_CHANNEL_ADD( ); - EU433_CHANNEL_ADD( ); - EU868_CHANNEL_ADD( ); - KR920_CHANNEL_ADD( ); - IN865_CHANNEL_ADD( ); - US915_CHANNEL_ADD( ); - RU864_CHANNEL_ADD( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_CHANNEL_ADD( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_CHANNEL_ADD( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_CHANNEL_ADD( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_CHANNEL_ADD( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_CHANNEL_ADD( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_CHANNEL_ADD( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_CHANNEL_ADD( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_CHANNEL_ADD( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_CHANNEL_ADD( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_CHANNEL_ADD( ); + break; + default: { return LORAMAC_STATUS_PARAMETER_INVALID; @@ -905,16 +1827,67 @@ bool RegionChannelsRemove( LoRaMacRegion_t region, ChannelRemoveParams_t* channe { switch( region ) { - AS923_CHANNEL_REMOVE( ); - AU915_CHANNEL_REMOVE( ); - CN470_CHANNEL_REMOVE( ); - CN779_CHANNEL_REMOVE( ); - EU433_CHANNEL_REMOVE( ); - EU868_CHANNEL_REMOVE( ); - KR920_CHANNEL_REMOVE( ); - IN865_CHANNEL_REMOVE( ); - US915_CHANNEL_REMOVE( ); - RU864_CHANNEL_REMOVE( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_CHANNEL_REMOVE( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_CHANNEL_REMOVE( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_CHANNEL_REMOVE( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_CHANNEL_REMOVE( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_CHANNEL_REMOVE( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_CHANNEL_REMOVE( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_CHANNEL_REMOVE( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_CHANNEL_REMOVE( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_CHANNEL_REMOVE( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_CHANNEL_REMOVE( ); + break; + default: { return false; @@ -926,16 +1899,67 @@ uint8_t RegionApplyDrOffset( LoRaMacRegion_t region, uint8_t downlinkDwellTime, { switch( region ) { - AS923_APPLY_DR_OFFSET( ); - AU915_APPLY_DR_OFFSET( ); - CN470_APPLY_DR_OFFSET( ); - CN779_APPLY_DR_OFFSET( ); - EU433_APPLY_DR_OFFSET( ); - EU868_APPLY_DR_OFFSET( ); - KR920_APPLY_DR_OFFSET( ); - IN865_APPLY_DR_OFFSET( ); - US915_APPLY_DR_OFFSET( ); - RU864_APPLY_DR_OFFSET( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_APPLY_DR_OFFSET( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_APPLY_DR_OFFSET( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_APPLY_DR_OFFSET( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_APPLY_DR_OFFSET( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_APPLY_DR_OFFSET( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_APPLY_DR_OFFSET( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_APPLY_DR_OFFSET( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_APPLY_DR_OFFSET( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_APPLY_DR_OFFSET( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_APPLY_DR_OFFSET( ); + break; + default: { return dr; @@ -947,16 +1971,67 @@ void RegionRxBeaconSetup( LoRaMacRegion_t region, RxBeaconSetup_t* rxBeaconSetup { switch( region ) { - AS923_RX_BEACON_SETUP( ); - AU915_RX_BEACON_SETUP( ); - CN470_RX_BEACON_SETUP( ); - CN779_RX_BEACON_SETUP( ); - EU433_RX_BEACON_SETUP( ); - EU868_RX_BEACON_SETUP( ); - KR920_RX_BEACON_SETUP( ); - IN865_RX_BEACON_SETUP( ); - US915_RX_BEACON_SETUP( ); - RU864_RX_BEACON_SETUP( ); + /*! + * AS band on 923MHz + */ + case LORAMAC_REGION_AS923: + AS923_RX_BEACON_SETUP( ); + break; + /*! + * Australian band on 915MHz + */ + case LORAMAC_REGION_AU915: + AU915_RX_BEACON_SETUP( ); + break; + /*! + * Chinese band on 470MHz + */ + case LORAMAC_REGION_CN470: + CN470_RX_BEACON_SETUP( ); + break; + /*! + * Chinese band on 779MHz + */ + case LORAMAC_REGION_CN779: + CN779_RX_BEACON_SETUP( ); + break; + /*! + * European band on 433MHz + */ + case LORAMAC_REGION_EU433: + EU433_RX_BEACON_SETUP( ); + break; + /*! + * European band on 868MHz + */ + case LORAMAC_REGION_EU868: + EU868_RX_BEACON_SETUP( ); + break; + /*! + * South korean band on 920MHz + */ + case LORAMAC_REGION_KR920: + KR920_RX_BEACON_SETUP( ); + break; + /*! + * India band on 865MHz + */ + case LORAMAC_REGION_IN865: + IN865_RX_BEACON_SETUP( ); + break; + /*! + * North american band on 915MHz + */ + case LORAMAC_REGION_US915: + US915_RX_BEACON_SETUP( ); + break; + /*! + * Russia band on 864MHz + */ + case LORAMAC_REGION_RU864: + RU864_RX_BEACON_SETUP( ); + break; + default: { break; diff --git a/sysdrv/tools/board/lorawan-bridge/LoraMac/rtc-board.c b/sysdrv/tools/board/lorawan-bridge/LoraMac/rtc-board.c new file mode 100644 index 0000000000..df550a2ccc --- /dev/null +++ b/sysdrv/tools/board/lorawan-bridge/LoraMac/rtc-board.c @@ -0,0 +1,58 @@ +#include "timer.h" +#include "rtc-board.h" + +void RtcProcess( void ) +{ + // Not used on this platform. +} + + +uint32_t GettimeToTicks(struct timespec *ts) { + uint32_t time; + time += ts->tv_sec * 1000000000; + time += ts->tv_nsec; + return time; +} + +struct timespec TicksToGettime(uint32_t time) { + struct timespec ts; + ts.tv_sec += time / 1000000000; + ts.tv_nsec += time % 1000000000; + return ts; +} + +TimerTime_t RtcTempCompensation( TimerTime_t period, float temperature ) +{ + //aka, not implemented on this board. + TimerTime_t time = 0; + return time; +} + +uint32_t RtcGetMinimumTimeout( void ) +{ + return 0; //( MIN_ALARM_DELAY ); +} + +uint32_t RtcGetTimerValue(void) { + uint32_t time; + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + time = GettimeToTicks(&ts); +} + +uint32_t RtcTick2Ms(uint32_t clock) { + return clock / 1000000; +} + +uint32_t RtcMs2Tick(uint32_t clock) { + return clock * 1000000; +} + +void RtcSetAlarm( uint32_t timeout ) { + struct timespec ts = TicksToGettime(timeout); + nanosleep(&ts, NULL); +} + +void RtcStopAlarm(void) { + //not needed; +} \ No newline at end of file diff --git a/sysdrv/tools/board/lorawan-bridge/LoraMac/rtc-board.h b/sysdrv/tools/board/lorawan-bridge/LoraMac/rtc-board.h index 8fa38a692b..b6eead485a 100644 --- a/sysdrv/tools/board/lorawan-bridge/LoraMac/rtc-board.h +++ b/sysdrv/tools/board/lorawan-bridge/LoraMac/rtc-board.h @@ -185,6 +185,8 @@ TimerTime_t RtcTempCompensation( TimerTime_t period, float temperature ); */ void RtcProcess( void ); +uint32_t GettimeToTicks(struct timespec *ts); + #ifdef __cplusplus } #endif diff --git a/sysdrv/tools/board/lorawan-bridge/LoraMac/timer.c b/sysdrv/tools/board/lorawan-bridge/LoraMac/timer.c index a2fb516c84..599c33dfa4 100644 --- a/sysdrv/tools/board/lorawan-bridge/LoraMac/timer.c +++ b/sysdrv/tools/board/lorawan-bridge/LoraMac/timer.c @@ -23,6 +23,7 @@ #include "utilities.h" #include "board.h" #include "timer.h" +#include "rtc-board.h" /*! * Safely execute call back @@ -84,8 +85,9 @@ static bool TimerExists( TimerEvent_t *obj ); void TimerInit( TimerEvent_t *obj, void ( *callback )( void *context ) ) { + uint32_t time = RtcGetTimerValue(); + obj->ReloadValue = time; obj->Timestamp = 0; - obj->ReloadValue = 0; obj->IsStarted = false; obj->IsNext2Expire = false; obj->Callback = callback; @@ -100,7 +102,10 @@ void TimerSetContext( TimerEvent_t *obj, void* context ) void TimerStart( TimerEvent_t *obj ) { - uint32_t elapsedTime = 0; + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + uint32_t time = GettimeToTicks(&ts); + uint32_t elapsedTime = time; CRITICAL_SECTION_BEGIN( ); @@ -116,13 +121,13 @@ void TimerStart( TimerEvent_t *obj ) if( TimerListHead == NULL ) { - RtcSetTimerContext( ); + //RtcSetTimerContext( ); // Inserts a timer at time now + obj->Timestamp TimerInsertNewHeadTimer( obj ); } else { - elapsedTime = RtcGetTimerElapsedTime( ); + elapsedTime = RtcGetTimerValue( ); obj->Timestamp += elapsedTime; if( obj->Timestamp < TimerListHead->Timestamp ) @@ -184,8 +189,8 @@ void TimerIrqHandler( void ) TimerEvent_t* cur; TimerEvent_t* next; - uint32_t old = RtcGetTimerContext( ); - uint32_t now = RtcSetTimerContext( ); + uint32_t old = RtcGetTimerValue( ); + uint32_t now = RtcGetTimerValue( ); uint32_t deltaContext = now - old; // intentional wrap around // Update timeStamp based upon new Time Reference @@ -216,7 +221,7 @@ void TimerIrqHandler( void ) } // Remove all the expired object from the list - while( ( TimerListHead != NULL ) && ( TimerListHead->Timestamp < RtcGetTimerElapsedTime( ) ) ) + while( ( TimerListHead != NULL ) && ( TimerListHead->Timestamp < RtcGetTimerValue( ) ) ) { cur = TimerListHead; TimerListHead = TimerListHead->Next; @@ -366,11 +371,11 @@ static void TimerSetTimeout( TimerEvent_t *obj ) int32_t minTicks= RtcGetMinimumTimeout( ); obj->IsNext2Expire = true; - // In case deadline too soon - if( obj->Timestamp < ( RtcGetTimerElapsedTime( ) + minTicks ) ) - { - obj->Timestamp = RtcGetTimerElapsedTime( ) + minTicks; - } + // // In case deadline too soon + // if( obj->Timestamp < ( RtcGetTimerElapsedTime( ) + minTicks ) ) + // { + // obj->Timestamp = RtcGetTimerElapsedTime( ) + minTicks; + // } RtcSetAlarm( obj->Timestamp ); } diff --git a/sysdrv/tools/board/lorawan-bridge/Makefile b/sysdrv/tools/board/lorawan-bridge/Makefile index 9425aaa057..0f413a17f4 100644 --- a/sysdrv/tools/board/lorawan-bridge/Makefile +++ b/sysdrv/tools/board/lorawan-bridge/Makefile @@ -5,11 +5,15 @@ # #This makefile is used to test the other Makefiles +ifeq ($(SYSDRV_PARAM), ) + SYSDRV_PARAM:=../../../Makefile.param + include $(SYSDRV_PARAM) +endif PROG = rest_server SRC = rest.c cJSON/cJSON.c cJSON/cJSON_Utils.c send_json.c lorawan_send.c b64.c/encode.c b64.c/decode.c b64.c/buffer.c -LORAWAN_SRC = LoraMac/spidev_lib/spidev_lib.c LoraMac/board.c LoraMac/main.c LoraMac/spi-board.c LoraMac/delay.c LoraMac/sx1276.c LoraMac/sx1276-board.c LoraMac/LoRaMac.c LoraMac/LoRaMacAdr.c LoraMac/LoRaMacClassB.c LoraMac/LoRaMacCommands.c LoraMac/LoRaMacConfirmQueue.c LoraMac/LoRaMacCrypto.c LoraMac/LoRaMacParser.c LoraMac/LoRaMacSerializer.c LoraMac/timer.c LoraMac/utilities.c LoraMac/systime.c +LORAWAN_SRC = LoraMac/spidev_lib/spidev_lib.c LoraMac/board.c LoraMac/main.c LoraMac/spi-board.c LoraMac/delay.c LoraMac/sx1276.c LoraMac/sx1276-board.c LoraMac/LoRaMac.c LoraMac/LoRaMacAdr.c LoraMac/LoRaMacClassB.c LoraMac/LoRaMacCommands.c LoraMac/LoRaMacConfirmQueue.c LoraMac/LoRaMacCrypto.c LoraMac/LoRaMacParser.c LoraMac/LoRaMacSerializer.c LoraMac/timer.c LoraMac/utilities.c LoraMac/systime.c LoraMac/rtc-board.c LORAMAC_COMMON_SRC = LoraMac/common/LmHandler/LmHandler.c LoraMac/common/LmHandler/packages/FragDecoder.c LoraMac/common/LmHandler/packages/LmhpClockSync.c LoraMac/common/LmHandler/packages/LmhpCompliance.c LoraMac/common/LmHandler/packages/LmhpFragmentation.c LoraMac/common/LmHandler/packages/LmhpRemoteMcastSetup.c LORAMAC_COMMON_SRC += LoraMac/common/CayenneLpp.c LoraMac/common/LmHandlerMsgDisplay.c LORAMAC_SOFT_SE_SRC += LoraMac/soft-se/aes.c LoraMac/soft-se/cmac.c LoraMac/soft-se/soft-se-hal.c LoraMac/soft-se/soft-se.c @@ -23,6 +27,13 @@ INCLUDE = -ILoraMac -ILoraMac/region -ILoraMac/common -ILoraMac/common/LmHandler include $(TOP)/resources/Makefile.in-os +export LC_ALL=C +SHELL:=/bin/bash +# arch=arm default use thumb-2 compile +ifeq ($(SYSDRV_ARCH_TYPE),arm) +PKG_USE_THUMB2 ?= YES +endif + ifeq ($(TARGET_OS),LINUX) LIBS += -ldl LIBS += -lm @@ -31,11 +42,13 @@ endif all: $(PROG) $(PROG): $(CIVETWEB_LIB) $(LORAWAN_SRC) $(LORAMAC_COMMON_SRC) $(LORAMAC_REGION_SRC) $(LORAMAC_SOFT_SE_SRC) - $(CC) -o $@ $(CFLAGS) $(INCLUDE) $(LDFLAGS) $(LORAWAN_SRC) $(LORAMAC_COMMON_SRC) $(LORAMAC_REGION_SRC) $(LORAMAC_SOFT_SE_SRC) $(CIVETWEB_LIB) $(LIBS) + $(SYSDRV_CROSS)-$(CC) -o $@ $(CFLAGS) $(INCLUDE) $(LDFLAGS) $(LORAWAN_SRC) $(LORAMAC_COMMON_SRC) $(LORAMAC_REGION_SRC) $(LORAMAC_SOFT_SE_SRC) $(CIVETWEB_LIB) $(LIBS) + $(call MAROC_COPY_PKG_TO_SYSDRV_OUTPUT, $(SYSDRV_DIR_OUT_ROOTFS), $(PKG_BIN)) $(CIVETWEB_LIB): $(MAKE) -C $(TOP) WITH_IPV6=1 WITH_WEBSOCKET=1 COPT='-DNO_SSL -DMG_EXPERIMENTAL_INTERFACES' clean lib cp $(TOP)/$(CIVETWEB_LIB) . + $(call MAROC_COPY_PKG_TO_SYSDRV_OUTPUT, $(SYSDRV_DIR_OUT_ROOTFS), $(PKG_BIN)) clean: rm -f $(CIVETWEB_LIB) $(PROG) diff --git a/sysdrv/tools/board/lorawan-bridge/libcivetweb.a b/sysdrv/tools/board/lorawan-bridge/libcivetweb.a index 96148345fbba1343ab162cc4c3db857f1b7a80a3..63a984ee598f3cfba9ec58ab81ddf47ebf7d5941 100644 GIT binary patch delta 37 scmbQ!Eik8BpkWK+?4#UXiFpbNMhZp-Mkejcjxqu<)AnUYnZMZs01BcG!vFvP delta 37 scmbQ!Eik8BpkWK+?4#T+smTh4h6+XoM#k;Sjxqu<)AnUYnZMZs01B}V#Q*>R diff --git a/sysdrv/tools/board/lorawan-bridge/rest_server b/sysdrv/tools/board/lorawan-bridge/rest_server new file mode 100755 index 0000000000000000000000000000000000000000..8fe2539b5c93628ec78c1d1dc68ef88225786cc4 GIT binary patch literal 294256 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 T<<-Bbd=Kw#jZh28<$nHuaX}0g literal 0 HcmV?d00001