Bootcamp application example using LoRaWAN-lib MAC layer implementation. Provides an application example controlling a 3 color LED and a light sensor.
Dependencies: mbed Chainable_RGB_LED DigitDisplay LoRaWAN-lib SX1272Lib
Fork of LoRaWAN-demo-72 by
For a detailed description of the LoRaWAN operations, please visit the MBED dedicated page at https://developer.mbed.org/teams/Semtech/code/LoRaWAN-demo-72/
Diff: app/main.cpp
- Revision:
- 9:0083afd69815
- Parent:
- 7:ceb4063e6863
--- a/app/main.cpp Tue Apr 04 13:37:39 2017 +0000 +++ b/app/main.cpp Mon Apr 24 13:31:49 2017 +0000 @@ -17,21 +17,21 @@ #include "radio.h" #include "LoRaMac.h" -#include "Comissioning.h" +#include "Commissioning.h" #include "SerialDisplay.h" #include "DigitDisplay.h" #include "ChainableLED.h" /*! - * Defines the application data transmission duty cycle. 5s, value in [us]. + * Defines the application data transmission duty cycle. 5s, value in [ms]. */ -#define APP_TX_DUTYCYCLE 5000000 +#define APP_TX_DUTYCYCLE 5000 /*! * Defines a random delay for application data transmission duty cycle. 1s, - * value in [us]. + * value in [ms]. */ -#define APP_TX_DUTYCYCLE_RND 1000000 +#define APP_TX_DUTYCYCLE_RND 1000 /*! * Default datarate @@ -63,7 +63,7 @@ #define USE_SEMTECH_DEFAULT_CHANNEL_LINEUP 1 -#if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 ) +#if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 ) #define LC4 { 867100000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 } #define LC5 { 867300000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 } @@ -209,7 +209,7 @@ /*! * Device states */ -static enum eDevicState +static enum eDeviceState { DEVICE_STATE_INIT, DEVICE_STATE_JOIN, @@ -391,7 +391,7 @@ { McpsReq_t mcpsReq; LoRaMacTxInfo_t txInfo; - + if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK ) { // Send empty frame in order to flush MAC commands @@ -660,7 +660,7 @@ ComplianceTest.NbGateways = 0; ComplianceTest.Running = true; ComplianceTest.State = 1; - + MibRequestConfirm_t mibReq; mibReq.Type = MIB_ADR; mibReq.Param.AdrEnable = true; @@ -682,7 +682,7 @@ AppDataSize = LORAWAN_APP_DATA_SIZE; ComplianceTest.DownLinkCounter = 0; ComplianceTest.Running = false; - + MibRequestConfirm_t mibReq; mibReq.Type = MIB_ADR; mibReq.Param.AdrEnable = LORAWAN_ADR_ON; @@ -722,16 +722,53 @@ { MlmeReq_t mlmeReq; + // Disable TestMode and revert back to normal operation + IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON; + AppPort = LORAWAN_APP_PORT; + AppDataSize = LORAWAN_APP_DATA_SIZE; + ComplianceTest.DownLinkCounter = 0; + ComplianceTest.Running = false; + + MibRequestConfirm_t mibReq; + mibReq.Type = MIB_ADR; + mibReq.Param.AdrEnable = LORAWAN_ADR_ON; + LoRaMacMibSetRequestConfirm( &mibReq ); +#if defined( USE_BAND_868 ) + LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON ); +#endif + mlmeReq.Type = MLME_JOIN; mlmeReq.Req.Join.DevEui = DevEui; mlmeReq.Req.Join.AppEui = AppEui; mlmeReq.Req.Join.AppKey = AppKey; + mlmeReq.Req.Join.NbTrials = 3; LoRaMacMlmeRequest( &mlmeReq ); DeviceState = DEVICE_STATE_SLEEP; } break; + case 7: // (x) + { + if( mcpsIndication->BufferSize == 3 ) + { + MlmeReq_t mlmeReq; + mlmeReq.Type = MLME_TXCW; + mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] ); + LoRaMacMlmeRequest( &mlmeReq ); + } + else if( mcpsIndication->BufferSize == 7 ) + { + MlmeReq_t mlmeReq; + mlmeReq.Type = MLME_TXCW_1; + mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] ); + mlmeReq.Req.TxCw.Frequency = ( uint32_t )( ( mcpsIndication->Buffer[3] << 16 ) | ( mcpsIndication->Buffer[4] << 8 ) | mcpsIndication->Buffer[5] ) * 100; + mlmeReq.Req.TxCw.Power = mcpsIndication->Buffer[6]; + LoRaMacMlmeRequest( &mlmeReq ); + } + ComplianceTest.State = 1; + } + break; default: break; } @@ -757,19 +794,26 @@ */ static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm ) { - if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) + switch( mlmeConfirm->MlmeRequest ) { - switch( mlmeConfirm->MlmeRequest ) + case MLME_JOIN: { - case MLME_JOIN: + if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) { // Status is OK, node has joined the network IsNetworkJoinedStatusUpdate = true; DeviceState = DEVICE_STATE_SEND; - NextTx = true; - break; + } + else + { + // Join was not successful. Try to join again + DeviceState = DEVICE_STATE_JOIN; } - case MLME_LINK_CHECK: + break; + } + case MLME_LINK_CHECK: + { + if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) { // Check DemodMargin // Check NbGateways @@ -779,11 +823,11 @@ ComplianceTest.DemodMargin = mlmeConfirm->DemodMargin; ComplianceTest.NbGateways = mlmeConfirm->NbGateways; } - break; } - default: - break; + break; } + default: + break; } NextTx = true; UplinkStatusUpdated = true; @@ -867,10 +911,10 @@ TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent ); TimerInit( &Led1Timer, OnLed1TimerEvent ); - TimerSetValue( &Led1Timer, 25000 ); + TimerSetValue( &Led1Timer, 25 ); TimerInit( &Led2Timer, OnLed2TimerEvent ); - TimerSetValue( &Led2Timer, 25000 ); + TimerSetValue( &Led2Timer, 25 ); mibReq.Type = MIB_ADR; mibReq.Param.AdrEnable = LORAWAN_ADR_ON; @@ -884,7 +928,7 @@ LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON ); SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON ); -#if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 ) +#if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 ) LoRaMacChannelAdd( 3, ( ChannelParams_t )LC4 ); LoRaMacChannelAdd( 4, ( ChannelParams_t )LC5 ); LoRaMacChannelAdd( 5, ( ChannelParams_t )LC6 ); @@ -893,6 +937,10 @@ LoRaMacChannelAdd( 8, ( ChannelParams_t )LC9 ); LoRaMacChannelAdd( 9, ( ChannelParams_t )LC10 ); + mibReq.Type = MIB_RX2_DEFAULT_CHANNEL; + mibReq.Param.Rx2DefaultChannel = ( Rx2ChannelParams_t ){ 869525000, DR_3 }; + LoRaMacMibSetRequestConfirm( &mibReq ); + mibReq.Type = MIB_RX2_CHANNEL; mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ){ 869525000, DR_3 }; LoRaMacMibSetRequestConfirm( &mibReq ); @@ -963,7 +1011,7 @@ if( ComplianceTest.Running == true ) { // Schedule next packet transmission - TxDutyCycleTime = 5000000; // 5000000 us + TxDutyCycleTime = 5000; // 5000 ms } else {