LoRaMac-api-v3.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. /*
  2. / _____) _ | |
  3. ( (____ _____ ____ _| |_ _____ ____| |__
  4. \____ \| ___ | (_ _) ___ |/ ___) _ \
  5. _____) ) ____| | | || |_| ____( (___| | | |
  6. (______/|_____)_|_|_| \__)_____)\____)_| |_|
  7. (C)2013 Semtech
  8. ___ _____ _ ___ _ _____ ___ ___ ___ ___
  9. / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
  10. \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
  11. |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
  12. embedded.connectivity.solutions===============
  13. Description: LoRa MAC layer implementation
  14. License: Revised BSD License, see LICENSE.TXT file include in the project
  15. Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jäckle ( STACKFORCE )
  16. */
  17. #include "board.h"
  18. #include "LoRaMac-api-v3.h"
  19. #include "LoRaMacTest.h"
  20. /*!
  21. * Extern function declarations.
  22. */
  23. extern LoRaMacStatus_t Send( LoRaMacHeader_t *macHdr, uint8_t fPort,
  24. void *fBuffer, uint16_t fBufferSize );
  25. extern LoRaMacStatus_t PrepareFrame( LoRaMacHeader_t *macHdr, LoRaMacFrameCtrl_t *fCtrl,
  26. uint8_t fPort, void *fBuffer, uint16_t fBufferSize );
  27. extern LoRaMacStatus_t SendFrameOnChannel( ChannelParams_t channel );
  28. extern uint32_t LoRaMacState;
  29. extern LoRaMacFlags_t LoRaMacFlags;
  30. /*!
  31. * Static variables
  32. */
  33. static LoRaMacEventFlags_t LoRaMacEventFlags;
  34. static LoRaMacEventInfo_t LoRaMacEventInfo;
  35. static LoRaMacPrimitives_t LoRaMacPrimitives;
  36. static LoRaMacCallback_t LoRaMacCallback;
  37. static LoRaMacCallbacks_t LoRaMacCallbacks;
  38. /*!
  39. * \brief MCPS-Confirm event function
  40. *
  41. * \param [IN] mcpsConfirm - Pointer to the confirm structure,
  42. * containing confirm attributes.
  43. */
  44. static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
  45. {
  46. LoRaMacEventInfo.Status = mcpsConfirm->Status;
  47. LoRaMacEventFlags.Bits.Tx = 1;
  48. LoRaMacEventInfo.TxDatarate = mcpsConfirm->Datarate;
  49. LoRaMacEventInfo.TxNbRetries = mcpsConfirm->NbRetries;
  50. LoRaMacEventInfo.TxAckReceived = mcpsConfirm->AckReceived;
  51. if( ( LoRaMacFlags.Bits.McpsInd != 1 ) && ( LoRaMacFlags.Bits.MlmeReq != 1 ) )
  52. {
  53. LoRaMacCallbacks.MacEvent( &LoRaMacEventFlags, &LoRaMacEventInfo );
  54. LoRaMacEventFlags.Value = 0;
  55. }
  56. }
  57. /*!
  58. * \brief MCPS-Indication event function
  59. *
  60. * \param [IN] mcpsIndication - Pointer to the indication structure,
  61. * containing indication attributes.
  62. */
  63. static void McpsIndication( McpsIndication_t *mcpsIndication )
  64. {
  65. LoRaMacEventInfo.Status = mcpsIndication->Status;
  66. LoRaMacEventFlags.Bits.Rx = 1;
  67. LoRaMacEventFlags.Bits.RxSlot = mcpsIndication->RxSlot;
  68. LoRaMacEventFlags.Bits.Multicast = mcpsIndication->Multicast;
  69. if( mcpsIndication->RxData == true )
  70. {
  71. LoRaMacEventFlags.Bits.RxData = 1;
  72. }
  73. LoRaMacEventInfo.RxPort = mcpsIndication->Port;
  74. LoRaMacEventInfo.RxBuffer = mcpsIndication->Buffer;
  75. LoRaMacEventInfo.RxBufferSize = mcpsIndication->BufferSize;
  76. LoRaMacEventInfo.RxRssi = mcpsIndication->Rssi;
  77. LoRaMacEventInfo.RxSnr = mcpsIndication->Snr;
  78. LoRaMacCallbacks.MacEvent( &LoRaMacEventFlags, &LoRaMacEventInfo );
  79. LoRaMacEventFlags.Value = 0;
  80. }
  81. /*!
  82. * \brief MLME-Confirm event function
  83. *
  84. * \param [IN] mlmeConfirm - Pointer to the confirm structure,
  85. * containing confirm attributes.
  86. */
  87. static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
  88. {
  89. if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
  90. {
  91. switch( mlmeConfirm->MlmeRequest )
  92. {
  93. case MLME_JOIN:
  94. {
  95. // Status is OK, node has joined the network
  96. LoRaMacEventInfo.Status = mlmeConfirm->Status;
  97. LoRaMacEventFlags.Bits.Tx = 1;
  98. LoRaMacEventFlags.Bits.Rx = 1;
  99. LoRaMacEventFlags.Bits.JoinAccept = 1;
  100. break;
  101. }
  102. case MLME_LINK_CHECK:
  103. {
  104. LoRaMacEventFlags.Bits.Tx = 1;
  105. LoRaMacEventFlags.Bits.Rx = 1;
  106. LoRaMacEventFlags.Bits.LinkCheck = 1;
  107. LoRaMacEventInfo.DemodMargin = mlmeConfirm->DemodMargin;
  108. LoRaMacEventInfo.NbGateways = mlmeConfirm->NbGateways;
  109. break;
  110. }
  111. default:
  112. break;
  113. }
  114. }
  115. if( LoRaMacFlags.Bits.McpsInd != 1 )
  116. {
  117. LoRaMacCallbacks.MacEvent( &LoRaMacEventFlags, &LoRaMacEventInfo );
  118. LoRaMacEventFlags.Value = 0;
  119. }
  120. }
  121. void LoRaMacInit( LoRaMacCallbacks_t *callbacks )
  122. {
  123. LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm;
  124. LoRaMacPrimitives.MacMcpsIndication = McpsIndication;
  125. LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm;
  126. LoRaMacCallbacks.MacEvent = callbacks->MacEvent;
  127. LoRaMacCallbacks.GetBatteryLevel = callbacks->GetBatteryLevel;
  128. LoRaMacCallback.GetBatteryLevel = callbacks->GetBatteryLevel;
  129. LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallback );
  130. }
  131. void LoRaMacSetAdrOn( bool enable )
  132. {
  133. MibRequestConfirm_t mibSet;
  134. mibSet.Type = MIB_ADR;
  135. mibSet.Param.AdrEnable = enable;
  136. LoRaMacMibSetRequestConfirm( &mibSet );
  137. }
  138. void LoRaMacInitNwkIds( uint32_t netID, uint32_t devAddr, uint8_t *nwkSKey, uint8_t *appSKey )
  139. {
  140. MibRequestConfirm_t mibSet;
  141. mibSet.Type = MIB_NET_ID;
  142. mibSet.Param.NetID = netID;
  143. LoRaMacMibSetRequestConfirm( &mibSet );
  144. mibSet.Type = MIB_DEV_ADDR;
  145. mibSet.Param.DevAddr = devAddr;
  146. LoRaMacMibSetRequestConfirm( &mibSet );
  147. mibSet.Type = MIB_NWK_SKEY;
  148. mibSet.Param.NwkSKey = nwkSKey;
  149. LoRaMacMibSetRequestConfirm( &mibSet );
  150. mibSet.Type = MIB_APP_SKEY;
  151. mibSet.Param.AppSKey = appSKey;
  152. LoRaMacMibSetRequestConfirm( &mibSet );
  153. mibSet.Type = MIB_NETWORK_JOINED;
  154. mibSet.Param.IsNetworkJoined = true;
  155. LoRaMacMibSetRequestConfirm( &mibSet );
  156. }
  157. void LoRaMacMulticastChannelAdd( MulticastParams_t *channelParam )
  158. {
  159. LoRaMacMulticastChannelLink( channelParam );
  160. }
  161. void LoRaMacMulticastChannelRemove( MulticastParams_t *channelParam )
  162. {
  163. LoRaMacMulticastChannelUnlink( channelParam );
  164. }
  165. uint8_t LoRaMacJoinReq( uint8_t *devEui, uint8_t *appEui, uint8_t *appKey )
  166. {
  167. MlmeReq_t mlmeRequest;
  168. uint8_t status;
  169. mlmeRequest.Type = MLME_JOIN;
  170. mlmeRequest.Req.Join.AppEui = appEui;
  171. mlmeRequest.Req.Join.AppKey = appKey;
  172. mlmeRequest.Req.Join.DevEui = devEui;
  173. switch( LoRaMacMlmeRequest( &mlmeRequest ) )
  174. {
  175. case LORAMAC_STATUS_OK:
  176. {
  177. status = 0;
  178. break;
  179. }
  180. case LORAMAC_STATUS_BUSY:
  181. {
  182. status = 1;
  183. break;
  184. }
  185. case LORAMAC_STATUS_NO_NETWORK_JOINED:
  186. {
  187. status = 2;
  188. break;
  189. }
  190. case LORAMAC_STATUS_LENGTH_ERROR:
  191. case LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR:
  192. {
  193. status = 3;
  194. break;
  195. }
  196. case LORAMAC_STATUS_SERVICE_UNKNOWN:
  197. {
  198. status = 4;
  199. break;
  200. }
  201. case LORAMAC_STATUS_DEVICE_OFF:
  202. {
  203. status = 6;
  204. break;
  205. }
  206. default:
  207. {
  208. status = 1;
  209. break;
  210. }
  211. }
  212. return status;
  213. }
  214. uint8_t LoRaMacLinkCheckReq( void )
  215. {
  216. MlmeReq_t mlmeRequest;
  217. uint8_t status;
  218. mlmeRequest.Type = MLME_LINK_CHECK;
  219. switch( LoRaMacMlmeRequest( &mlmeRequest ) )
  220. {
  221. case LORAMAC_STATUS_OK:
  222. {
  223. status = 0;
  224. break;
  225. }
  226. case LORAMAC_STATUS_SERVICE_UNKNOWN:
  227. {
  228. status = 1;
  229. break;
  230. }
  231. default:
  232. {
  233. status = 1;
  234. break;
  235. }
  236. }
  237. return status;
  238. }
  239. uint8_t LoRaMacSendFrame( uint8_t fPort, void *fBuffer, uint16_t fBufferSize )
  240. {
  241. MibRequestConfirm_t mibGet;
  242. McpsReq_t mcpsRequest;
  243. uint8_t retStatus;
  244. memset1( ( uint8_t* )&LoRaMacEventInfo, 0, sizeof( LoRaMacEventInfo ) );
  245. mibGet.Type = MIB_CHANNELS_DATARATE;
  246. LoRaMacMibGetRequestConfirm( &mibGet );
  247. mcpsRequest.Type = MCPS_UNCONFIRMED;
  248. mcpsRequest.Req.Unconfirmed.fBuffer = fBuffer;
  249. mcpsRequest.Req.Unconfirmed.fBufferSize = fBufferSize;
  250. mcpsRequest.Req.Unconfirmed.fPort = fPort;
  251. mcpsRequest.Req.Unconfirmed.Datarate = mibGet.Param.ChannelsDatarate;
  252. switch( LoRaMacMcpsRequest( &mcpsRequest ) )
  253. {
  254. case LORAMAC_STATUS_OK:
  255. retStatus = 0U;
  256. break;
  257. case LORAMAC_STATUS_BUSY:
  258. retStatus = 1U;
  259. break;
  260. case LORAMAC_STATUS_NO_NETWORK_JOINED:
  261. retStatus = 2U;
  262. break;
  263. case LORAMAC_STATUS_LENGTH_ERROR:
  264. case LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR:
  265. retStatus = 3U;
  266. break;
  267. case LORAMAC_STATUS_SERVICE_UNKNOWN:
  268. retStatus = 4U;
  269. break;
  270. case LORAMAC_STATUS_DEVICE_OFF:
  271. retStatus = 6U;
  272. break;
  273. default:
  274. retStatus = 1U;
  275. break;
  276. }
  277. return retStatus;
  278. }
  279. uint8_t LoRaMacSendConfirmedFrame( uint8_t fPort, void *fBuffer, uint16_t fBufferSize, uint8_t nbRetries )
  280. {
  281. MibRequestConfirm_t mibGet;
  282. McpsReq_t mcpsRequest;
  283. uint8_t retStatus;
  284. memset1( ( uint8_t* )&LoRaMacEventInfo, 0, sizeof( LoRaMacEventInfo ) );
  285. mibGet.Type = MIB_CHANNELS_DATARATE;
  286. LoRaMacMibGetRequestConfirm( &mibGet );
  287. mcpsRequest.Type = MCPS_CONFIRMED;
  288. mcpsRequest.Req.Confirmed.fBuffer = fBuffer;
  289. mcpsRequest.Req.Confirmed.fBufferSize = fBufferSize;
  290. mcpsRequest.Req.Confirmed.fPort = fPort;
  291. mcpsRequest.Req.Confirmed.NbTrials = nbRetries;
  292. mcpsRequest.Req.Confirmed.Datarate = mibGet.Param.ChannelsDatarate;
  293. switch( LoRaMacMcpsRequest( &mcpsRequest ) )
  294. {
  295. case LORAMAC_STATUS_OK:
  296. retStatus = 0U;
  297. break;
  298. case LORAMAC_STATUS_BUSY:
  299. retStatus = 1U;
  300. break;
  301. case LORAMAC_STATUS_NO_NETWORK_JOINED:
  302. retStatus = 2U;
  303. break;
  304. case LORAMAC_STATUS_LENGTH_ERROR:
  305. case LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR:
  306. retStatus = 3U;
  307. break;
  308. case LORAMAC_STATUS_SERVICE_UNKNOWN:
  309. retStatus = 4U;
  310. break;
  311. case LORAMAC_STATUS_DEVICE_OFF:
  312. retStatus = 6U;
  313. break;
  314. default:
  315. retStatus = 1U;
  316. break;
  317. }
  318. return retStatus;
  319. }
  320. uint8_t LoRaMacSend( LoRaMacHeader_t *macHdr, uint8_t *fOpts, uint8_t fPort, void *fBuffer, uint16_t fBufferSize )
  321. {
  322. uint8_t retStatus;
  323. memset1( ( uint8_t* ) &LoRaMacEventInfo, 0, sizeof( LoRaMacEventInfo ) );
  324. switch( Send( macHdr, fPort, fBuffer, fBufferSize ) )
  325. {
  326. case LORAMAC_STATUS_OK:
  327. retStatus = 0U;
  328. break;
  329. case LORAMAC_STATUS_BUSY:
  330. retStatus = 1U;
  331. break;
  332. case LORAMAC_STATUS_NO_NETWORK_JOINED:
  333. retStatus = 2U;
  334. break;
  335. case LORAMAC_STATUS_LENGTH_ERROR:
  336. case LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR:
  337. retStatus = 3U;
  338. break;
  339. case LORAMAC_STATUS_SERVICE_UNKNOWN:
  340. retStatus = 4U;
  341. break;
  342. case LORAMAC_STATUS_DEVICE_OFF:
  343. retStatus = 6U;
  344. break;
  345. default:
  346. retStatus = 1U;
  347. break;
  348. }
  349. return retStatus;
  350. }
  351. uint8_t LoRaMacPrepareFrame( ChannelParams_t channel,LoRaMacHeader_t *macHdr, LoRaMacFrameCtrl_t *fCtrl, uint8_t *fOpts, uint8_t fPort, void *fBuffer, uint16_t fBufferSize )
  352. {
  353. uint8_t retStatus;
  354. switch( PrepareFrame( macHdr, fCtrl, fPort, fBuffer, fBufferSize ) )
  355. {
  356. case LORAMAC_STATUS_OK:
  357. retStatus = 0U;
  358. break;
  359. case LORAMAC_STATUS_BUSY:
  360. retStatus = 1U;
  361. break;
  362. case LORAMAC_STATUS_NO_NETWORK_JOINED:
  363. retStatus = 2U;
  364. break;
  365. case LORAMAC_STATUS_LENGTH_ERROR:
  366. case LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR:
  367. retStatus = 3U;
  368. break;
  369. case LORAMAC_STATUS_SERVICE_UNKNOWN:
  370. retStatus = 4U;
  371. break;
  372. default:
  373. retStatus = 1U;
  374. break;
  375. }
  376. return retStatus;
  377. }
  378. uint8_t LoRaMacSendFrameOnChannel( ChannelParams_t channel )
  379. {
  380. memset1( ( uint8_t* ) &LoRaMacEventInfo, 0, sizeof( LoRaMacEventInfo ) );
  381. SendFrameOnChannel( channel );
  382. /* SendFrameOnChannel has always status "OK" */
  383. return 0;
  384. }
  385. uint8_t LoRaMacSendOnChannel( ChannelParams_t channel, LoRaMacHeader_t *macHdr, LoRaMacFrameCtrl_t *fCtrl, uint8_t *fOpts, uint8_t fPort, void *fBuffer, uint16_t fBufferSize )
  386. {
  387. uint8_t status = 0;
  388. if( ( LoRaMacState & 0x00000001 ) == 0x00000001 )
  389. {
  390. return 1; // MAC is busy transmitting a previous frame
  391. }
  392. status = LoRaMacPrepareFrame( channel, macHdr, fCtrl, fOpts, fPort, fBuffer, fBufferSize );
  393. if( status != 0 )
  394. {
  395. return status;
  396. }
  397. LoRaMacEventInfo.TxNbRetries = 0;
  398. LoRaMacEventInfo.TxAckReceived = false;
  399. return LoRaMacSendFrameOnChannel( channel );
  400. }
  401. void LoRaMacSetDeviceClass( DeviceClass_t deviceClass )
  402. {
  403. MibRequestConfirm_t mibSet;
  404. mibSet.Type = MIB_DEVICE_CLASS;
  405. mibSet.Param.Class = deviceClass;
  406. LoRaMacMibSetRequestConfirm( &mibSet );
  407. }
  408. void LoRaMacSetPublicNetwork( bool enable )
  409. {
  410. MibRequestConfirm_t mibSet;
  411. mibSet.Type = MIB_PUBLIC_NETWORK;
  412. mibSet.Param.EnablePublicNetwork = enable;
  413. LoRaMacMibSetRequestConfirm( &mibSet );
  414. }
  415. void LoRaMacSetDutyCycleOn( bool enable )
  416. {
  417. LoRaMacTestSetDutyCycleOn( enable );
  418. }
  419. void LoRaMacSetChannel( uint8_t id, ChannelParams_t params )
  420. {
  421. LoRaMacChannelAdd( id, params );
  422. }
  423. void LoRaMacSetRx2Channel( Rx2ChannelParams_t param )
  424. {
  425. MibRequestConfirm_t mibSet;
  426. mibSet.Type = MIB_RX2_CHANNEL;
  427. mibSet.Param.Rx2Channel = param;
  428. LoRaMacMibSetRequestConfirm( &mibSet );
  429. }
  430. void LoRaMacSetChannelsMask( uint16_t *mask )
  431. {
  432. MibRequestConfirm_t mibSet;
  433. mibSet.Type = MIB_CHANNELS_MASK;
  434. mibSet.Param.ChannelsMask = mask;
  435. LoRaMacMibSetRequestConfirm( &mibSet );
  436. }
  437. void LoRaMacSetChannelsNbRep( uint8_t nbRep )
  438. {
  439. MibRequestConfirm_t mibSet;
  440. mibSet.Type = MIB_CHANNELS_NB_REP;
  441. mibSet.Param.ChannelNbRep = nbRep;
  442. LoRaMacMibSetRequestConfirm( &mibSet );
  443. }
  444. void LoRaMacSetMaxRxWindow( uint32_t delay )
  445. {
  446. MibRequestConfirm_t mibSet;
  447. mibSet.Type = MIB_MAX_RX_WINDOW_DURATION;
  448. mibSet.Param.MaxRxWindow = delay;
  449. LoRaMacMibSetRequestConfirm( &mibSet );
  450. }
  451. void LoRaMacSetReceiveDelay1( uint32_t delay )
  452. {
  453. MibRequestConfirm_t mibSet;
  454. mibSet.Type = MIB_RECEIVE_DELAY_1;
  455. mibSet.Param.ReceiveDelay1 = delay;
  456. LoRaMacMibSetRequestConfirm( &mibSet );
  457. }
  458. void LoRaMacSetReceiveDelay2( uint32_t delay )
  459. {
  460. MibRequestConfirm_t mibSet;
  461. mibSet.Type = MIB_RECEIVE_DELAY_2;
  462. mibSet.Param.ReceiveDelay2 = delay;
  463. LoRaMacMibSetRequestConfirm( &mibSet );
  464. }
  465. void LoRaMacSetJoinAcceptDelay1( uint32_t delay )
  466. {
  467. MibRequestConfirm_t mibSet;
  468. mibSet.Type = MIB_JOIN_ACCEPT_DELAY_1;
  469. mibSet.Param.JoinAcceptDelay1 = delay;
  470. LoRaMacMibSetRequestConfirm( &mibSet );
  471. }
  472. void LoRaMacSetJoinAcceptDelay2( uint32_t delay )
  473. {
  474. MibRequestConfirm_t mibSet;
  475. mibSet.Type = MIB_JOIN_ACCEPT_DELAY_2;
  476. mibSet.Param.JoinAcceptDelay2 = delay;
  477. LoRaMacMibSetRequestConfirm( &mibSet );
  478. }
  479. void LoRaMacSetChannelsDatarate( int8_t datarate )
  480. {
  481. MibRequestConfirm_t mibSet;
  482. mibSet.Type = MIB_CHANNELS_DATARATE;
  483. mibSet.Param.ChannelsDatarate = datarate;
  484. LoRaMacMibSetRequestConfirm( &mibSet );
  485. }
  486. void LoRaMacSetChannelsTxPower( int8_t txPower )
  487. {
  488. MibRequestConfirm_t mibSet;
  489. mibSet.Type = MIB_CHANNELS_TX_POWER;
  490. mibSet.Param.ChannelsTxPower = txPower;
  491. LoRaMacMibSetRequestConfirm( &mibSet );
  492. }
  493. uint32_t LoRaMacGetUpLinkCounter( void )
  494. {
  495. MibRequestConfirm_t mibGet;
  496. mibGet.Type = MIB_UPLINK_COUNTER;
  497. LoRaMacMibGetRequestConfirm( &mibGet );
  498. return mibGet.Param.UpLinkCounter;
  499. }
  500. uint32_t LoRaMacGetDownLinkCounter( void )
  501. {
  502. MibRequestConfirm_t mibGet;
  503. mibGet.Type = MIB_DOWNLINK_COUNTER;
  504. LoRaMacMibGetRequestConfirm( &mibGet );
  505. return mibGet.Param.DownLinkCounter;
  506. }
  507. void LoRaMacSetMicTest( uint16_t txPacketCounter )
  508. {
  509. LoRaMacTestSetMic( txPacketCounter );
  510. }