Skip to content

Commit f4e181e

Browse files
committed
Fixed certification protocol handling when an answer gets delayed by duty-cycle restrictions
1 parent 30fc173 commit f4e181e

File tree

7 files changed

+220
-130
lines changed

7 files changed

+220
-130
lines changed

src/apps/LoRaMac/common/LmHandler/LmHandler.c

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,14 @@ static LoRaMacHandlerBeaconParams_t BeaconParams =
137137
*/
138138
static bool IsClassBSwitchPending = false;
139139

140+
/*!
141+
* Stores the time to wait before next transmission
142+
*
143+
* TODO: Create a new structure to store the current handler states/status
144+
* and add the below variable to it.
145+
*/
146+
static TimerTime_t DutyCycleWaitTime = 0;
147+
140148
/*!
141149
* \brief MCPS-Confirm event function
142150
*
@@ -241,19 +249,6 @@ LmHandlerErrorStatus_t LmHandlerInit( LmHandlerCallbacks_t *handlerCallbacks,
241249
}
242250
else
243251
{
244-
// Read secure-element DEV_EUI, JOI_EUI and SE_PIN values.
245-
mibReq.Type = MIB_DEV_EUI;
246-
LoRaMacMibGetRequestConfirm( &mibReq );
247-
memcpy1( CommissioningParams.DevEui, mibReq.Param.DevEui, 8 );
248-
249-
mibReq.Type = MIB_JOIN_EUI;
250-
LoRaMacMibGetRequestConfirm( &mibReq );
251-
memcpy1( CommissioningParams.JoinEui, mibReq.Param.JoinEui, 8 );
252-
253-
mibReq.Type = MIB_SE_PIN;
254-
LoRaMacMibGetRequestConfirm( &mibReq );
255-
memcpy1( CommissioningParams.SePin, mibReq.Param.SePin, 4 );
256-
257252
#if( OVER_THE_AIR_ACTIVATION == 0 )
258253
// Tell the MAC layer which network server version are we connecting too.
259254
mibReq.Type = MIB_ABP_LORAWAN_VERSION;
@@ -276,6 +271,20 @@ LmHandlerErrorStatus_t LmHandlerInit( LmHandlerCallbacks_t *handlerCallbacks,
276271
LoRaMacMibSetRequestConfirm( &mibReq );
277272
#endif // #if( OVER_THE_AIR_ACTIVATION == 0 )
278273
}
274+
275+
// Read secure-element DEV_EUI, JOI_EUI and SE_PIN values.
276+
mibReq.Type = MIB_DEV_EUI;
277+
LoRaMacMibGetRequestConfirm( &mibReq );
278+
memcpy1( CommissioningParams.DevEui, mibReq.Param.DevEui, 8 );
279+
280+
mibReq.Type = MIB_JOIN_EUI;
281+
LoRaMacMibGetRequestConfirm( &mibReq );
282+
memcpy1( CommissioningParams.JoinEui, mibReq.Param.JoinEui, 8 );
283+
284+
mibReq.Type = MIB_SE_PIN;
285+
LoRaMacMibGetRequestConfirm( &mibReq );
286+
memcpy1( CommissioningParams.SePin, mibReq.Param.SePin, 4 );
287+
279288
mibReq.Type = MIB_PUBLIC_NETWORK;
280289
mibReq.Param.EnablePublicNetwork = LmHandlerParams->PublicNetworkEnable;
281290
LoRaMacMibSetRequestConfirm( &mibReq );
@@ -312,6 +321,17 @@ bool LmHandlerIsBusy( void )
312321
return true;
313322
}
314323

324+
for( int8_t i = 0; i < PKG_MAX_NUMBER; i++ )
325+
{
326+
if( LmHandlerPackages[i] != NULL )
327+
{
328+
if( LmHandlerPackages[i]->IsTxPending( ) == true )
329+
{
330+
return true;
331+
}
332+
}
333+
}
334+
315335
return false;
316336
}
317337

@@ -335,6 +355,11 @@ void LmHandlerProcess( void )
335355
LmHandlerPackagesProcess( );
336356
}
337357

358+
TimerTime_t LmHandlerGetDutyCycleWaitTime( void )
359+
{
360+
return DutyCycleWaitTime;
361+
}
362+
338363
/*!
339364
* Join a LoRa Network in classA
340365
*
@@ -355,6 +380,7 @@ static void LmHandlerJoinRequest( bool isOtaa )
355380

356381
// Starts the OTAA join procedure
357382
LmHandlerCallbacks->OnMacMlmeRequest( LoRaMacMlmeRequest( &mlmeReq ), &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
383+
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;
358384
}
359385
else
360386
{
@@ -440,6 +466,7 @@ LmHandlerErrorStatus_t LmHandlerSend( LmHandlerAppData_t *appData, LmHandlerMsgT
440466

441467
status = LoRaMacMcpsRequest( &mcpsReq );
442468
LmHandlerCallbacks->OnMacMcpsRequest( status, &mcpsReq, mcpsReq.ReqReturn.DutyCycleWaitTime );
469+
DutyCycleWaitTime = mcpsReq.ReqReturn.DutyCycleWaitTime;
443470

444471
if( status == LORAMAC_STATUS_OK )
445472
{
@@ -460,6 +487,7 @@ static LmHandlerErrorStatus_t LmHandlerDeviceTimeReq( void )
460487

461488
status = LoRaMacMlmeRequest( &mlmeReq );
462489
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
490+
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;
463491

464492
if( status == LORAMAC_STATUS_OK )
465493
{
@@ -480,6 +508,7 @@ static LmHandlerErrorStatus_t LmHandlerBeaconReq( void )
480508

481509
status = LoRaMacMlmeRequest( &mlmeReq );
482510
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
511+
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;
483512

484513
if( status == LORAMAC_STATUS_OK )
485514
{
@@ -502,6 +531,7 @@ LmHandlerErrorStatus_t LmHandlerPingSlotReq( uint8_t periodicity )
502531

503532
status = LoRaMacMlmeRequest( &mlmeReq );
504533
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
534+
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;
505535

506536
if( status == LORAMAC_STATUS_OK )
507537
{
@@ -894,7 +924,6 @@ LmHandlerErrorStatus_t LmHandlerPackageRegister( uint8_t id, void *params )
894924
LmHandlerPackages[id]->OnMacMcpsRequest = LmHandlerCallbacks->OnMacMcpsRequest;
895925
LmHandlerPackages[id]->OnMacMlmeRequest = LmHandlerCallbacks->OnMacMlmeRequest;
896926
LmHandlerPackages[id]->OnJoinRequest = LmHandlerJoinRequest;
897-
LmHandlerPackages[id]->OnSendRequest = LmHandlerSend;
898927
LmHandlerPackages[id]->OnDeviceTimeRequest = LmHandlerDeviceTimeReq;
899928
LmHandlerPackages[id]->OnSysTimeUpdate = LmHandlerCallbacks->OnSysTimeUpdate;
900929
LmHandlerPackages[id]->Init( params, LmHandlerParams->DataBuffer, LmHandlerParams->DataBufferMaxSize );

src/apps/LoRaMac/common/LmHandler/LmHandler.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ extern "C"
3131
#endif
3232

3333
#include "LmHandlerTypes.h"
34-
#include "LmhpCompliance.h"
3534

3635
typedef struct LmHandlerJoinParams_s
3736
{
@@ -244,6 +243,13 @@ bool LmHandlerIsBusy( void );
244243
*/
245244
void LmHandlerProcess( void );
246245

246+
/*!
247+
* Gets current duty-cycle wait time
248+
*
249+
* \retval time to wait in ms
250+
*/
251+
TimerTime_t LmHandlerGetDutyCycleWaitTime( void );
252+
247253
/*!
248254
* Instructs the MAC layer to send a ClassA uplink
249255
*

src/apps/LoRaMac/common/LmHandler/packages/LmhPackage.h

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,12 @@ typedef struct LmhPackage_s
5555
*/
5656
bool ( *IsInitialized )( void );
5757
/*!
58-
* Returns the package operation status.
58+
* Returns if a package transmission is pending or not.
5959
*
60-
* \retval status Package operation status
61-
* [true: Running, false: Not running]
60+
* \retval status Package transmission status
61+
* [true: pending, false: Not pending]
6262
*/
63-
bool ( *IsRunning )( void );
63+
bool ( *IsTxPending )( void );
6464
/*!
6565
* Processes the internal package events.
6666
*/
@@ -121,16 +121,6 @@ typedef struct LmhPackage_s
121121
* \param [IN] isOtaa Indicates which activation mode must be used
122122
*/
123123
void ( *OnJoinRequest )( bool isOtaa );
124-
/*!
125-
* Instructs the MAC layer to send a ClassA uplink
126-
*
127-
* \param [IN] appData Data to be sent
128-
* \param [IN] isTxConfirmed Indicates if the uplink requires an acknowledgement
129-
*
130-
* \retval status Returns \ref LORAMAC_HANDLER_SUCCESS if request has been
131-
* processed else \ref LORAMAC_HANDLER_ERROR
132-
*/
133-
LmHandlerErrorStatus_t ( *OnSendRequest )( LmHandlerAppData_t *appData, LmHandlerMsgTypes_t isTxConfirmed );
134124
/*!
135125
* Requests network server time update
136126
*

src/apps/LoRaMac/common/LmHandler/packages/LmhpClockSync.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
*
2020
* \author Miguel Luis ( Semtech )
2121
*/
22-
#include "systime.h"
2322
#include "LmHandler.h"
2423
#include "LmhpClockSync.h"
2524

@@ -37,6 +36,7 @@
3736
typedef struct LmhpClockSyncState_s
3837
{
3938
bool Initialized;
39+
bool IsTxPending;
4040
uint8_t DataBufferMaxSize;
4141
uint8_t *DataBuffer;
4242
union
@@ -89,6 +89,14 @@ static void LmhpClockSyncInit( void *params, uint8_t *dataBuffer, uint8_t dataBu
8989
*/
9090
static bool LmhpClockSyncIsInitialized( void );
9191

92+
/*!
93+
* Returns if a package transmission is pending or not.
94+
*
95+
* \retval status Package transmission status
96+
* [true: pending, false: Not pending]
97+
*/
98+
static bool LmhpClockSyncIsTxPending( void );
99+
92100
/*!
93101
* Processes the internal package events.
94102
*/
@@ -111,6 +119,7 @@ static void LmhpClockSyncOnMcpsIndication( McpsIndication_t *mcpsIndication );
111119
static LmhpClockSyncState_t LmhpClockSyncState =
112120
{
113121
.Initialized = false,
122+
.IsTxPending = false,
114123
.TimeReqParam.Value = 0,
115124
.AppTimeReqPending = false,
116125
.AdrEnabledPrev = false,
@@ -123,6 +132,7 @@ static LmhPackage_t LmhpClockSyncPackage =
123132
.Port = CLOCK_SYNC_PORT,
124133
.Init = LmhpClockSyncInit,
125134
.IsInitialized = LmhpClockSyncIsInitialized,
135+
.IsTxPending = LmhpClockSyncIsTxPending,
126136
.Process = LmhpClockSyncProcess,
127137
.OnMcpsConfirmProcess = LmhpClockSyncOnMcpsConfirm,
128138
.OnMcpsIndicationProcess = LmhpClockSyncOnMcpsIndication,
@@ -131,7 +141,6 @@ static LmhPackage_t LmhpClockSyncPackage =
131141
.OnMacMcpsRequest = NULL, // To be initialized by LmHandler
132142
.OnMacMlmeRequest = NULL, // To be initialized by LmHandler
133143
.OnJoinRequest = NULL, // To be initialized by LmHandler
134-
.OnSendRequest = NULL, // To be initialized by LmHandler
135144
.OnDeviceTimeRequest = NULL, // To be initialized by LmHandler
136145
.OnSysTimeUpdate = NULL, // To be initialized by LmHandler
137146
};
@@ -153,13 +162,19 @@ static void LmhpClockSyncInit( void * params, uint8_t *dataBuffer, uint8_t dataB
153162
{
154163
LmhpClockSyncState.Initialized = false;
155164
}
165+
LmhpClockSyncState.IsTxPending = false;
156166
}
157167

158168
static bool LmhpClockSyncIsInitialized( void )
159169
{
160170
return LmhpClockSyncState.Initialized;
161171
}
162172

173+
static bool LmhpClockSyncIsTxPending( void )
174+
{
175+
return LmhpClockSyncState.IsTxPending;
176+
}
177+
163178
static void LmhpClockSyncProcess( void )
164179
{
165180
if( LmhpClockSyncState.NbTransmissions > 0 )
@@ -291,7 +306,7 @@ static void LmhpClockSyncOnMcpsIndication( McpsIndication_t *mcpsIndication )
291306
.BufferSize = dataBufferIndex,
292307
.Port = CLOCK_SYNC_PORT
293308
};
294-
LmhpClockSyncPackage.OnSendRequest( &appData, LORAMAC_HANDLER_UNCONFIRMED_MSG );
309+
LmHandlerSend( &appData, LORAMAC_HANDLER_UNCONFIRMED_MSG );
295310
}
296311
}
297312

@@ -353,5 +368,5 @@ LmHandlerErrorStatus_t LmhpClockSyncAppTimeReq( void )
353368
.Port = CLOCK_SYNC_PORT
354369
};
355370
LmhpClockSyncState.AppTimeReqPending = true;
356-
return LmhpClockSyncPackage.OnSendRequest( &appData, LORAMAC_HANDLER_UNCONFIRMED_MSG );
371+
return LmHandlerSend( &appData, LORAMAC_HANDLER_UNCONFIRMED_MSG );
357372
}

0 commit comments

Comments
 (0)