Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
lorawan_data_structures.h
00001 /** 00002 * @file lorawan_data_structures.h 00003 * 00004 * @brief Contains common data structures used by Mbed-OS 00005 * LoRaWAN mplementation. 00006 * 00007 * \code 00008 * ______ _ 00009 * / _____) _ | | 00010 * ( (____ _____ ____ _| |_ _____ ____| |__ 00011 * \____ \| ___ | (_ _) ___ |/ ___) _ \ 00012 * _____) ) ____| | | || |_| ____( (___| | | | 00013 * (______/|_____)_|_|_| \__)_____)\____)_| |_| 00014 * (C)2013 Semtech 00015 * ___ _____ _ ___ _ _____ ___ ___ ___ ___ 00016 * / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __| 00017 * \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _| 00018 * |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___| 00019 * embedded.connectivity.solutions=============== 00020 * 00021 * \endcode 00022 * 00023 * Description: LoRa PHY layer 00024 * 00025 * License: Revised BSD License, see LICENSE.TXT file include in the project 00026 * 00027 * Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jaeckle ( STACKFORCE ) 00028 * 00029 * Copyright (c) 2017, Arm Limited and affiliates. 00030 * SPDX-License-Identifier: BSD-3-Clause 00031 * 00032 */ 00033 00034 #ifndef LORAWAN_SYSTEM_LORAWAN_DATA_STRUCTURES_H_ 00035 #define LORAWAN_SYSTEM_LORAWAN_DATA_STRUCTURES_H_ 00036 00037 #include <inttypes.h> 00038 #include "platform/Callback.h" 00039 00040 /*! 00041 * \brief Timer time variable definition 00042 */ 00043 #ifndef lorawan_time_t 00044 typedef uint32_t lorawan_time_t; 00045 #endif 00046 00047 // Radio wake-up time from sleep - unit ms. 00048 #define RADIO_WAKEUP_TIME 1 00049 00050 /** 00051 * Option Flags for send(), receive() APIs 00052 */ 00053 #define MSG_UNCONFIRMED_FLAG 0x01 00054 #define MSG_CONFIRMED_FLAG 0x02 00055 #define MSG_MULTICAST_FLAG 0x04 00056 #define MSG_PROPRIETARY_FLAG 0x08 00057 00058 /** 00059 * A macro to test a if a bit is on in a channel mask or not. 00060 */ 00061 //#define MASK_BIT_TEST(mask, bit) (mask & (1U << bit)) 00062 //#define MASK_BIT_TEST(mask, bit) ((mask)[(bit) / 16] & (1U << ((bit) % 16))) 00063 /** 00064 * A macro to clear a bit in a channel mask. 00065 */ 00066 //#define MASK_BIT_CLEAR(mask, bit) (mask &= ~(1 << bit)) 00067 00068 /** 00069 * A macro to clear a bit in a channel mask. 00070 */ 00071 //#define MASK_BIT_SET(mask, bit) (mask |= (1 << bit)) 00072 00073 /** 00074 * Bit mask for message flags 00075 */ 00076 00077 #define MSG_FLAG_MASK 0x0F 00078 00079 /** 00080 * Mask for unconfirmed multicast message 00081 */ 00082 #define MSG_UNCONFIRMED_MULTICAST 0x05 00083 00084 /** 00085 * Mask for confirmed multicast message 00086 */ 00087 #define MSG_CONFIRMED_MULTICAST 0x06 00088 00089 /** 00090 * Mask for unconfirmed message proprietary message 00091 */ 00092 #define MSG_UNCONFIRMED_PROPRIETARY 0x09 00093 00094 /** 00095 * Mask for confirmed proprietary message 00096 */ 00097 #define MSG_CONFIRMED_PROPRIETARY 0x0A 00098 00099 /*! 00100 * Sets the length of the LoRaMAC footer field. 00101 * Mainly indicates the MIC field length. 00102 */ 00103 #define LORAMAC_MFR_LEN 4 00104 00105 /*! 00106 * The FRMPayload overhead to be used when setting the `Radio.SetMaxPayloadLength` 00107 * in the `RxWindowSetup` function. 00108 * The maximum PHYPayload = MaxPayloadOfDatarate/MaxPayloadOfDatarateRepeater + LORA_MAC_FRMPAYLOAD_OVERHEAD 00109 */ 00110 #define LORA_MAC_FRMPAYLOAD_OVERHEAD 13 // MHDR(1) + FHDR(7) + Port(1) + MIC(4) 00111 00112 /** 00113 * LoRaMac maximum number of channels 00114 */ 00115 #define LORA_MAX_NB_CHANNELS 16 00116 00117 /** 00118 * Maximum PHY layer payload size for reception. 00119 */ 00120 #define LORAMAC_PHY_MAXPAYLOAD 255 00121 00122 /** 00123 * 00124 * Default user application maximum data size for transmission 00125 */ 00126 // reject if user tries to set more than MTU 00127 #if MBED_CONF_LORA_TX_MAX_SIZE > 255 00128 #warning "Cannot set TX Max size more than MTU=255" 00129 #define MBED_CONF_LORA_TX_MAX_SIZE 255 00130 #endif 00131 00132 /*! 00133 * LoRaWAN device classes definition. 00134 * 00135 * LoRaWAN Specification V1.0.2, chapter 2.1. 00136 */ 00137 typedef enum { 00138 /*! 00139 * LoRaWAN device class A. 00140 * 00141 * LoRaWAN Specification V1.0.2, chapter 3. 00142 */ 00143 CLASS_A , 00144 /*! 00145 * LoRaWAN device class B. 00146 * 00147 * LoRaWAN Specification V1.0.2, chapter 8. 00148 */ 00149 CLASS_B , 00150 /*! 00151 * LoRaWAN device class C. 00152 * 00153 * LoRaWAN Specification V1.0.2, chapter 17. 00154 */ 00155 CLASS_C , 00156 } device_class_t ; 00157 00158 /*! 00159 * LoRaMAC channel parameters definition. 00160 */ 00161 typedef union { 00162 /*! 00163 * Byte-access to the bits. 00164 */ 00165 int8_t value ; 00166 /*! 00167 * The structure to store the minimum and the maximum datarate. 00168 */ 00169 struct sFields 00170 { 00171 /*! 00172 * The minimum data rate. 00173 * 00174 * LoRaWAN Regional Parameters V1.0.2rB. 00175 * 00176 * The allowed ranges are region-specific. Please refer to \ref DR_0 to \ref DR_15 for details. 00177 */ 00178 int8_t min : 4; 00179 /*! 00180 * The maximum data rate. 00181 * 00182 * LoRaWAN Regional Parameters V1.0.2rB. 00183 * 00184 * The allowed ranges are region-specific. Please refer to \ref DR_0 to \ref DR_15 for details. 00185 */ 00186 int8_t max : 4; 00187 } fields; 00188 } dr_range_t ; 00189 00190 /*! 00191 * LoRaMAC channel definition. 00192 */ 00193 typedef struct { 00194 /*! 00195 * The frequency in Hz. 00196 */ 00197 uint32_t frequency ; 00198 /*! 00199 * The alternative frequency for RX window 1. 00200 */ 00201 uint32_t rx1_frequency ; 00202 /*! 00203 * The data rate definition. 00204 */ 00205 dr_range_t dr_range ; 00206 /*! 00207 * The band index. 00208 */ 00209 uint8_t band ; 00210 } channel_params_t ; 00211 00212 /*! 00213 * LoRaMAC band parameters definition. 00214 */ 00215 typedef struct { 00216 /*! 00217 * The duty cycle. 00218 */ 00219 uint16_t duty_cycle ; 00220 /*! 00221 * The maximum TX power. 00222 */ 00223 int8_t max_tx_pwr ; 00224 /*! 00225 * The timestamp of the last Join Request TX frame. 00226 */ 00227 lorawan_time_t last_join_tx_time ; 00228 /*! 00229 * The timestamp of the last TX frame. 00230 */ 00231 lorawan_time_t last_tx_time ; 00232 /*! 00233 * The device off time. 00234 */ 00235 lorawan_time_t off_time ; 00236 /*! 00237 * Lower band boundry 00238 */ 00239 uint32_t lower_band_freq ; 00240 /*! 00241 * Higher band boundry 00242 */ 00243 uint32_t higher_band_freq ; 00244 } band_t ; 00245 00246 /*! 00247 * LoRaMAC receive window 2 channel parameters. 00248 */ 00249 typedef struct { 00250 /*! 00251 * The frequency in Hz. 00252 */ 00253 uint32_t frequency ; 00254 /*! 00255 * The data rate. 00256 * 00257 * LoRaWAN Regional Parameters V1.0.2rB. 00258 * 00259 * The allowed ranges are region-specific. Please refer to \ref DR_0 to \ref DR_15 for details. 00260 */ 00261 uint8_t datarate ; 00262 } rx2_channel_params ; 00263 00264 /*! 00265 * LoRaMAC receive window enumeration 00266 */ 00267 typedef enum { 00268 /*! 00269 * LoRaMAC receive window 1 00270 */ 00271 RX_SLOT_WIN_1 , 00272 /*! 00273 * LoRaMAC receive window 2 00274 */ 00275 RX_SLOT_WIN_2 , 00276 /*! 00277 * LoRaMAC receive window 2 for class c - continuous listening 00278 */ 00279 RX_SLOT_WIN_CLASS_C , 00280 /*! 00281 * LoRaMAC class b ping slot window 00282 */ 00283 RX_SLOT_WIN_PING_SLOT 00284 } rx_slot_t ; 00285 00286 /*! 00287 * The global MAC layer parameters. 00288 */ 00289 typedef struct { 00290 /*! 00291 * The TX power in channels. 00292 */ 00293 int8_t channel_tx_power ; 00294 /*! 00295 * The data rate in channels. 00296 */ 00297 int8_t channel_data_rate ; 00298 /*! 00299 * The system overall timing error in milliseconds. 00300 * [-SystemMaxRxError : +SystemMaxRxError] 00301 * Default: +/-10 ms 00302 */ 00303 uint32_t max_sys_rx_error ; 00304 /*! 00305 * The minimum number of symbols required to detect an RX frame. 00306 * Default: 6 symbols 00307 */ 00308 uint8_t min_rx_symb ; 00309 /*! 00310 * LoRaMac maximum time a reception window stays open. 00311 */ 00312 uint32_t max_rx_win_time ; 00313 /*! 00314 * Receive delay 1. 00315 */ 00316 uint32_t recv_delay1 ; 00317 /*! 00318 * Receive delay 2. 00319 */ 00320 uint32_t recv_delay2 ; 00321 /*! 00322 * Join accept delay 1. 00323 */ 00324 uint32_t join_accept_delay1 ; 00325 /*! 00326 * Join accept delay 1. 00327 */ 00328 uint32_t join_accept_delay2 ; 00329 /*! 00330 * The number of uplink messages repetitions (confirmed messages only). 00331 */ 00332 uint8_t retry_num ; 00333 /*! 00334 * The datarate offset between uplink and downlink on first window. 00335 */ 00336 uint8_t rx1_dr_offset ; 00337 /*! 00338 * LoRaMAC 2nd reception window settings. 00339 */ 00340 rx2_channel_params rx2_channel ; 00341 /*! 00342 * The uplink dwell time configuration. 0: No limit, 1: 400ms 00343 */ 00344 uint8_t uplink_dwell_time ; 00345 /*! 00346 * The downlink dwell time configuration. 0: No limit, 1: 400ms 00347 */ 00348 uint8_t downlink_dwell_time ; 00349 /*! 00350 * The maximum possible EIRP. 00351 */ 00352 float max_eirp ; 00353 /*! 00354 * The antenna gain of the node. 00355 */ 00356 float antenna_gain ; 00357 00358 /*! 00359 * Maximum duty cycle 00360 * \remark Possibility to shutdown the device. 00361 */ 00362 uint8_t max_duty_cycle ; 00363 /*! 00364 * Aggregated duty cycle management 00365 */ 00366 uint16_t aggregated_duty_cycle ; 00367 00368 /*! 00369 * LoRaMac ADR control status 00370 */ 00371 bool adr_on ; 00372 } lora_mac_system_params_t ; 00373 00374 /*! 00375 * LoRaMAC multicast channel parameter. 00376 */ 00377 typedef struct multicast_params_s { 00378 /*! 00379 * Address. 00380 */ 00381 uint32_t address ; 00382 /*! 00383 * Network session key. 00384 */ 00385 uint8_t nwk_skey [16]; 00386 /*! 00387 * Application session key. 00388 */ 00389 uint8_t app_skey [16]; 00390 /*! 00391 * Downlink counter. 00392 */ 00393 uint32_t dl_frame_counter ; 00394 /*! 00395 * A reference pointer to the next multicast channel parameters in the list. 00396 */ 00397 struct multicast_params_s *next ; 00398 } multicast_params_t ; 00399 00400 /*! 00401 * LoRaMAC frame types. 00402 * 00403 * LoRaWAN Specification V1.0.2, chapter 4.2.1, table 1. 00404 */ 00405 typedef enum { 00406 /*! 00407 * LoRaMAC join request frame. 00408 */ 00409 FRAME_TYPE_JOIN_REQ = 0x00, 00410 /*! 00411 * LoRaMAC join accept frame. 00412 */ 00413 FRAME_TYPE_JOIN_ACCEPT = 0x01, 00414 /*! 00415 * LoRaMAC unconfirmed uplink frame. 00416 */ 00417 FRAME_TYPE_DATA_UNCONFIRMED_UP = 0x02, 00418 /*! 00419 * LoRaMAC unconfirmed downlink frame. 00420 */ 00421 FRAME_TYPE_DATA_UNCONFIRMED_DOWN = 0x03, 00422 /*! 00423 * LoRaMAC confirmed uplink frame. 00424 */ 00425 FRAME_TYPE_DATA_CONFIRMED_UP = 0x04, 00426 /*! 00427 * LoRaMAC confirmed downlink frame. 00428 */ 00429 FRAME_TYPE_DATA_CONFIRMED_DOWN = 0x05, 00430 /*! 00431 * LoRaMAC RFU frame. 00432 */ 00433 FRAME_TYPE_RFU = 0x06, 00434 /*! 00435 * LoRaMAC proprietary frame. 00436 */ 00437 FRAME_TYPE_PROPRIETARY = 0x07, 00438 } mac_frame_type_t ; 00439 00440 /*! 00441 * LoRaMAC mote MAC commands. 00442 * 00443 * LoRaWAN Specification V1.0.2, chapter 5, table 4. 00444 */ 00445 typedef enum { 00446 /*! 00447 * LinkCheckReq 00448 */ 00449 MOTE_MAC_LINK_CHECK_REQ = 0x02, 00450 /*! 00451 * LinkADRAns 00452 */ 00453 MOTE_MAC_LINK_ADR_ANS = 0x03, 00454 /*! 00455 * DutyCycleAns 00456 */ 00457 MOTE_MAC_DUTY_CYCLE_ANS = 0x04, 00458 /*! 00459 * RXParamSetupAns 00460 */ 00461 MOTE_MAC_RX_PARAM_SETUP_ANS = 0x05, 00462 /*! 00463 * DevStatusAns 00464 */ 00465 MOTE_MAC_DEV_STATUS_ANS = 0x06, 00466 /*! 00467 * NewChannelAns 00468 */ 00469 MOTE_MAC_NEW_CHANNEL_ANS = 0x07, 00470 /*! 00471 * RXTimingSetupAns 00472 */ 00473 MOTE_MAC_RX_TIMING_SETUP_ANS = 0x08, 00474 /*! 00475 * TXParamSetupAns 00476 */ 00477 MOTE_MAC_TX_PARAM_SETUP_ANS = 0x09, 00478 /*! 00479 * DlChannelAns 00480 */ 00481 MOTE_MAC_DL_CHANNEL_ANS = 0x0A 00482 } mote_mac_cmds_t ; 00483 00484 /*! 00485 * LoRaMAC server MAC commands. 00486 * 00487 * LoRaWAN Specification V1.0.2 chapter 5, table 4. 00488 */ 00489 typedef enum { 00490 /*! 00491 * LinkCheckAns 00492 */ 00493 SRV_MAC_LINK_CHECK_ANS = 0x02, 00494 /*! 00495 * LinkADRReq 00496 */ 00497 SRV_MAC_LINK_ADR_REQ = 0x03, 00498 /*! 00499 * DutyCycleReq 00500 */ 00501 SRV_MAC_DUTY_CYCLE_REQ = 0x04, 00502 /*! 00503 * RXParamSetupReq 00504 */ 00505 SRV_MAC_RX_PARAM_SETUP_REQ = 0x05, 00506 /*! 00507 * DevStatusReq 00508 */ 00509 SRV_MAC_DEV_STATUS_REQ = 0x06, 00510 /*! 00511 * NewChannelReq 00512 */ 00513 SRV_MAC_NEW_CHANNEL_REQ = 0x07, 00514 /*! 00515 * RXTimingSetupReq 00516 */ 00517 SRV_MAC_RX_TIMING_SETUP_REQ = 0x08, 00518 /*! 00519 * NewChannelReq 00520 */ 00521 SRV_MAC_TX_PARAM_SETUP_REQ = 0x09, 00522 /*! 00523 * DlChannelReq 00524 */ 00525 SRV_MAC_DL_CHANNEL_REQ = 0x0A, 00526 } server_mac_cmds_t ; 00527 00528 /*! 00529 * LoRaMAC battery level indicator. 00530 */ 00531 typedef enum { 00532 /*! 00533 * An external power source. 00534 */ 00535 BAT_LEVEL_EXT_SRC = 0x00, 00536 /*! 00537 * Battery level empty. 00538 */ 00539 BAT_LEVEL_EMPTY = 0x01, 00540 /*! 00541 * Battery level full. 00542 */ 00543 BAT_LEVEL_FULL = 0xFE, 00544 /*! 00545 * Battery level - no measurement available. 00546 */ 00547 BAT_LEVEL_NO_MEASURE = 0xFF, 00548 } device_battery_level_t ; 00549 00550 /*! 00551 * LoRaMAC header field definition (MHDR field). 00552 * 00553 * LoRaWAN Specification V1.0.2, chapter 4.2. 00554 */ 00555 typedef union { 00556 /*! 00557 * Byte-access to the bits. 00558 */ 00559 uint8_t value ; 00560 /*! 00561 * The structure containing single access to header bits. 00562 */ 00563 struct hdr_bits_s 00564 { 00565 /*! 00566 * Major version. 00567 */ 00568 uint8_t major : 2; 00569 /*! 00570 * RFU 00571 */ 00572 uint8_t RFU : 3; 00573 /*! 00574 * Message type 00575 */ 00576 uint8_t mtype : 3; 00577 } bits; 00578 } loramac_mhdr_t ; 00579 00580 /*! 00581 * LoRaMAC frame control field definition (FCtrl). 00582 * 00583 * LoRaWAN Specification V1.0.2, chapter 4.3.1. 00584 */ 00585 typedef union { 00586 /*! 00587 * Byte-access to the bits. 00588 */ 00589 uint8_t value ; 00590 /*! 00591 * The structure containing single access to bits. 00592 */ 00593 struct ctrl_bits_s 00594 { 00595 /*! 00596 * Frame options length. 00597 */ 00598 uint8_t fopts_len : 4; 00599 /*! 00600 * Frame pending bit. 00601 */ 00602 uint8_t fpending : 1; 00603 /*! 00604 * Message acknowledge bit. 00605 */ 00606 uint8_t ack : 1; 00607 /*! 00608 * ADR acknowledgment request bit. 00609 */ 00610 uint8_t adr_ack_req : 1; 00611 /*! 00612 * ADR control in the frame header. 00613 */ 00614 uint8_t adr : 1; 00615 } bits; 00616 } loramac_frame_ctrl_t ; 00617 00618 /*! 00619 * The enumeration containing the status of the operation of a MAC service. 00620 */ 00621 typedef enum { 00622 /*! 00623 * Service performed successfully. 00624 */ 00625 LORAMAC_EVENT_INFO_STATUS_OK = 0, 00626 /*! 00627 * An error occurred during the execution of the service. 00628 */ 00629 LORAMAC_EVENT_INFO_STATUS_ERROR , 00630 /*! 00631 * A TX timeout occurred. 00632 */ 00633 LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT , 00634 /*! 00635 * An RX timeout occurred on receive window 1. 00636 */ 00637 LORAMAC_EVENT_INFO_STATUS_RX1_TIMEOUT , 00638 /*! 00639 * An RX timeout occurred on receive window 2. 00640 */ 00641 LORAMAC_EVENT_INFO_STATUS_RX2_TIMEOUT , 00642 /*! 00643 * An RX error occurred on receive window 1. 00644 */ 00645 LORAMAC_EVENT_INFO_STATUS_RX1_ERROR , 00646 /*! 00647 * An RX error occurred on receive window 2. 00648 */ 00649 LORAMAC_EVENT_INFO_STATUS_RX2_ERROR , 00650 /*! 00651 * An error occurred in the join procedure. 00652 */ 00653 LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL , 00654 /*! 00655 * A frame with an invalid downlink counter was received. The 00656 * downlink counter of the frame was equal to the local copy 00657 * of the downlink counter of the node. 00658 */ 00659 LORAMAC_EVENT_INFO_STATUS_DOWNLINK_REPEATED , 00660 /*! 00661 * The MAC could not retransmit a frame since the MAC decreased the datarate. The 00662 * payload size is not applicable for the datarate. 00663 */ 00664 LORAMAC_EVENT_INFO_STATUS_TX_DR_PAYLOAD_SIZE_ERROR , 00665 /*! 00666 * The node has lost MAX_FCNT_GAP or more frames. 00667 */ 00668 LORAMAC_EVENT_INFO_STATUS_DOWNLINK_TOO_MANY_FRAMES_LOSS , 00669 /*! 00670 * An address error occurred. 00671 */ 00672 LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL , 00673 /*! 00674 * Message integrity check failure. 00675 */ 00676 LORAMAC_EVENT_INFO_STATUS_MIC_FAIL , 00677 /*! 00678 * Crypto methods failure 00679 */ 00680 LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL , 00681 } loramac_event_info_status_t ; 00682 00683 /*! 00684 * LoRaMac service state flags. 00685 */ 00686 typedef union { 00687 /*! 00688 * Byte-access to the bits. 00689 */ 00690 uint8_t value ; 00691 /*! 00692 * The structure containing single access to bits. 00693 */ 00694 struct mac_flag_bits_s 00695 { 00696 /*! 00697 * MCPS-Req pending 00698 */ 00699 uint8_t mcps_req : 1; 00700 /*! 00701 * MCPS-Ind pending 00702 */ 00703 uint8_t mcps_ind : 1; 00704 /*! 00705 * MCPS-Ind pending. Skip indication to the application layer. 00706 */ 00707 uint8_t mcps_ind_skip : 1; 00708 /*! 00709 * MLME-Req pending 00710 */ 00711 uint8_t mlme_req : 1; 00712 /*! 00713 * MLME-Ind pending 00714 */ 00715 uint8_t mlme_ind : 1; 00716 /*! 00717 * MAC cycle done 00718 */ 00719 uint8_t mac_done : 1; 00720 } bits; 00721 } loramac_flags_t ; 00722 00723 /*! 00724 * 00725 * \brief LoRaMAC data services 00726 * 00727 * \details The following table list the primitives supported by a 00728 * specific MAC data service: 00729 * 00730 * Name | Request | Indication | Response | Confirm 00731 * --------------------- | :-----: | :--------: | :------: | :-----: 00732 * \ref MCPS_UNCONFIRMED | YES | YES | NO | YES 00733 * \ref MCPS_CONFIRMED | YES | YES | NO | YES 00734 * \ref MCPS_MULTICAST | NO | YES | NO | NO 00735 * \ref MCPS_PROPRIETARY | YES | YES | NO | YES 00736 * 00737 * The following table provides links to the function implementations of the 00738 * related MCPS primitives: 00739 * 00740 * Primitive | Function 00741 * ---------------- | :---------------------: 00742 * MCPS-Request | LoRaMacMlmeRequest 00743 * MCPS-Confirm | MacMcpsConfirm in \ref loramac_primitives_t 00744 * MCPS-Indication | MacMcpsIndication in \ref loramac_primitives_t 00745 */ 00746 typedef enum { 00747 /*! 00748 * Unconfirmed LoRaMAC frame. 00749 */ 00750 MCPS_UNCONFIRMED , 00751 /*! 00752 * Confirmed LoRaMAC frame. 00753 */ 00754 MCPS_CONFIRMED , 00755 /*! 00756 * Multicast LoRaMAC frame. 00757 */ 00758 MCPS_MULTICAST , 00759 /*! 00760 * Proprietary frame. 00761 */ 00762 MCPS_PROPRIETARY , 00763 } mcps_type_t; 00764 00765 /*! 00766 * LoRaMAC MCPS-Request structure. 00767 */ 00768 typedef struct { 00769 /*! 00770 * MCPS-Request type. 00771 */ 00772 mcps_type_t type ; 00773 00774 /*! 00775 * Frame port field. Must be set if the payload is not empty. Use the 00776 * application-specific frame port values: [1...223]. 00777 * 00778 * LoRaWAN Specification V1.0.2, chapter 4.3.2. 00779 */ 00780 uint8_t fport ; 00781 00782 /*! 00783 * Uplink datarate, if ADR is off. 00784 */ 00785 int8_t data_rate ; 00786 /*! 00787 * The number of trials to transmit the frame, if the LoRaMAC layer did not 00788 * receive an acknowledgment. The MAC performs a datarate adaptation 00789 * according to the LoRaWAN Specification V1.0.2, chapter 18.4, as in 00790 * the following table: 00791 * 00792 * Transmission nb | Data Rate 00793 * ----------------|----------- 00794 * 1 (first) | DR 00795 * 2 | DR 00796 * 3 | max(DR-1,0) 00797 * 4 | max(DR-1,0) 00798 * 5 | max(DR-2,0) 00799 * 6 | max(DR-2,0) 00800 * 7 | max(DR-3,0) 00801 * 8 | max(DR-3,0) 00802 * 00803 * Note that if nb_trials is set to 1 or 2, the MAC will not decrease 00804 * the datarate, if the LoRaMAC layer did not receive an acknowledgment. 00805 */ 00806 uint8_t nb_trials ; 00807 00808 /** Payload data 00809 * 00810 * A pointer to the buffer of the frame payload. 00811 */ 00812 void *f_buffer; 00813 /** Payload size 00814 * 00815 * The size of the frame payload. 00816 */ 00817 uint16_t f_buffer_size; 00818 00819 } loramac_mcps_req_t ; 00820 00821 /*! 00822 * LoRaMAC MCPS-Confirm. 00823 */ 00824 typedef struct { 00825 /*! 00826 * Holds the previously performed MCPS-Request type. i.e., the type of 00827 * the MCPS request for which this confirmation is being generated 00828 */ 00829 mcps_type_t req_type ; 00830 /*! 00831 * The status of the operation. 00832 */ 00833 loramac_event_info_status_t status ; 00834 /*! 00835 * The uplink datarate. 00836 */ 00837 uint8_t data_rate ; 00838 /*! 00839 * The transmission power. 00840 */ 00841 int8_t tx_power ; 00842 /*! 00843 * Set if an acknowledgement was received. 00844 */ 00845 bool ack_received ; 00846 /*! 00847 * Provides the number of retransmissions. 00848 */ 00849 uint8_t nb_retries ; 00850 /*! 00851 * The transmission time on air of the frame. 00852 */ 00853 lorawan_time_t tx_toa ; 00854 /*! 00855 * The uplink counter value related to the frame. 00856 */ 00857 uint32_t ul_frame_counter ; 00858 /*! 00859 * The uplink frequency related to the frame. 00860 */ 00861 uint32_t ul_frequency ; 00862 } loramac_mcps_confirm_t ; 00863 00864 /*! 00865 * LoRaMAC MCPS-Indication primitive. 00866 */ 00867 typedef struct { 00868 /*! 00869 * MCPS-Indication type. 00870 */ 00871 mcps_type_t type ; 00872 /*! 00873 * The status of the operation. 00874 */ 00875 loramac_event_info_status_t status ; 00876 /*! 00877 * Multicast. 00878 */ 00879 uint8_t multicast ; 00880 /*! 00881 * The application port. 00882 */ 00883 uint8_t port ; 00884 /*! 00885 * The downlink datarate. 00886 */ 00887 uint8_t rx_datarate ; 00888 /*! 00889 * Frame pending status. 00890 */ 00891 uint8_t fpending_status ; 00892 /*! 00893 * A pointer to the received data stream. 00894 */ 00895 uint8_t *buffer ; 00896 /*! 00897 * The size of the received data stream. 00898 */ 00899 uint16_t buffer_size ; 00900 /*! 00901 * Indicates, if data is available. 00902 */ 00903 bool is_data_recvd ; 00904 /*! 00905 * The RSSI of the received packet. 00906 */ 00907 int16_t rssi ; 00908 /*! 00909 * The SNR of the received packet. 00910 */ 00911 uint8_t snr ; 00912 /*! 00913 * The receive window. 00914 * 00915 * [0: Rx window 1, 1: Rx window 2] 00916 */ 00917 rx_slot_t rx_slot ; 00918 /*! 00919 * Set if an acknowledgement was received. 00920 */ 00921 bool is_ack_recvd ; 00922 /*! 00923 * The downlink counter value for the received frame. 00924 */ 00925 uint32_t dl_frame_counter ; 00926 } loramac_mcps_indication_t ; 00927 00928 /*! 00929 * \brief LoRaMAC management services. 00930 * 00931 * \details The following table list the primitives supported by a 00932 * specific MAC management service: 00933 * 00934 * Name | Request | Indication | Response | Confirm 00935 * ---------------------------- | :-----: | :--------: | :------: | :-----: 00936 * \ref MLME_JOIN | YES | NO | NO | YES 00937 * \ref MLME_LINK_CHECK | YES | NO | NO | YES 00938 * \ref MLME_TXCW | YES | NO | NO | YES 00939 * \ref MLME_SCHEDULE_UPLINK | NO | YES | NO | NO 00940 * 00941 * The following table provides links to the function implementations of the 00942 * related MLME primitives. 00943 * 00944 * Primitive | Function 00945 * ---------------- | :---------------------: 00946 * MLME-Request | LoRaMacMlmeRequest 00947 * MLME-Confirm | MacMlmeConfirm in \ref loramac_primitives_t 00948 * MLME-Indication | MacMlmeIndication in \ref loramac_primitives_t 00949 */ 00950 typedef enum { 00951 /*! 00952 * Initiates the Over-the-Air activation. 00953 * 00954 * LoRaWAN Specification V1.0.2, chapter 6.2. 00955 */ 00956 MLME_JOIN , 00957 /*! 00958 * LinkCheckReq - Connectivity validation. 00959 * 00960 * LoRaWAN Specification V1.0.2, chapter 5, table 4. 00961 */ 00962 MLME_LINK_CHECK , 00963 /*! 00964 * Sets TX continuous wave mode. 00965 * 00966 * LoRaWAN end-device certification. 00967 */ 00968 MLME_TXCW , 00969 /*! 00970 * Sets TX continuous wave mode (new LoRa-Alliance CC definition). 00971 * 00972 * LoRaWAN end-device certification. 00973 */ 00974 MLME_TXCW_1 , 00975 /*! 00976 * Indicates that the application shall perform an uplink as 00977 * soon as possible. 00978 */ 00979 MLME_SCHEDULE_UPLINK 00980 } mlme_type_t; 00981 00982 /*! 00983 * LoRaMAC MLME-Request for the join service. 00984 */ 00985 typedef struct { 00986 /*! 00987 * A globally unique end-device identifier. 00988 * 00989 * LoRaWAN Specification V1.0.2, chapter 6.2.1. 00990 */ 00991 uint8_t *dev_eui ; 00992 /*! 00993 * An application identifier. 00994 * 00995 * LoRaWAN Specification V1.0.2, chapter 6.1.2 00996 */ 00997 uint8_t *app_eui ; 00998 /*! 00999 * AES-128 application key. 01000 * 01001 * LoRaWAN Specification V1.0.2, chapter 6.2.2. 01002 */ 01003 uint8_t *app_key ; 01004 /*! 01005 * The number of trials for the join request. 01006 */ 01007 uint8_t nb_trials ; 01008 } mlme_join_req_t ; 01009 01010 /*! 01011 * LoRaMAC MLME-Request for TX continuous wave mode. 01012 */ 01013 typedef struct { 01014 /*! 01015 * The time while the radio is kept in continuous wave mode, in seconds. 01016 */ 01017 uint16_t timeout ; 01018 /*! 01019 * The RF frequency to set (only used with the new way). 01020 */ 01021 uint32_t frequency ; 01022 /*! 01023 * The RF output power to set (only used with the new way). 01024 */ 01025 uint8_t power ; 01026 } mlme_cw_tx_mode_t ; 01027 01028 /*! 01029 * LoRaMAC MLME-Request structure. 01030 */ 01031 typedef struct { 01032 /*! 01033 * MLME-Request type. 01034 */ 01035 mlme_type_t type ; 01036 01037 /*! 01038 * MLME-Request parameters. 01039 */ 01040 union { 01041 /*! 01042 * MLME-Request parameters for a join request. 01043 */ 01044 mlme_join_req_t join ; 01045 /*! 01046 * MLME-Request parameters for TX continuous mode request. 01047 */ 01048 mlme_cw_tx_mode_t cw_tx_mode ; 01049 } req; 01050 } loramac_mlme_req_t ; 01051 01052 /*! 01053 * LoRaMAC MLME-Confirm primitive. 01054 */ 01055 typedef struct { 01056 /*! 01057 * The previously performed MLME-Request. i.e., the request type 01058 * for which the confirmation is being generated 01059 */ 01060 mlme_type_t req_type ; 01061 /*! 01062 * The status of the operation. 01063 */ 01064 loramac_event_info_status_t status ; 01065 /*! 01066 * The transmission time on air of the frame. 01067 */ 01068 lorawan_time_t tx_toa ; 01069 /*! 01070 * The demodulation margin. Contains the link margin [dB] of the last LinkCheckReq 01071 * successfully received. 01072 */ 01073 uint8_t demod_margin ; 01074 /*! 01075 * The number of gateways which received the last LinkCheckReq. 01076 */ 01077 uint8_t nb_gateways ; 01078 /*! 01079 * The number of retransmissions. 01080 */ 01081 uint8_t nb_retries ; 01082 } loramac_mlme_confirm_t ; 01083 01084 /*! 01085 * LoRaMAC MLME-Indication primitive 01086 */ 01087 typedef struct { 01088 /*! 01089 * MLME-Indication type 01090 */ 01091 mlme_type_t indication_type ; 01092 } loramac_mlme_indication_t ; 01093 01094 /*! 01095 * LoRa MAC Information Base (MIB). 01096 * 01097 * The following table lists the MIB parameters and the related attributes: 01098 * 01099 * Attribute | Get | Set 01100 * --------------------------------- | :-: | :-: 01101 * \ref MIB_DEVICE_CLASS | YES | YES 01102 * \ref MIB_NETWORK_JOINED | YES | YES 01103 * \ref MIB_ADR | YES | YES 01104 * \ref MIB_NET_ID | YES | YES 01105 * \ref MIB_DEV_ADDR | YES | YES 01106 * \ref MIB_NWK_SKEY | YES | YES 01107 * \ref MIB_APP_SKEY | YES | YES 01108 * \ref MIB_PUBLIC_NETWORK | YES | YES 01109 * \ref MIB_REPEATER_SUPPORT | YES | YES 01110 * \ref MIB_CHANNELS | YES | NO 01111 * \ref MIB_RX2_CHANNEL | YES | YES 01112 * \ref MIB_CHANNELS_MASK | YES | YES 01113 * \ref MIB_CHANNELS_DEFAULT_MASK | YES | YES 01114 * \ref MIB_CHANNELS_NB_REP | YES | YES 01115 * \ref MIB_MAX_RX_WINDOW_DURATION | YES | YES 01116 * \ref MIB_RECEIVE_DELAY_1 | YES | YES 01117 * \ref MIB_RECEIVE_DELAY_2 | YES | YES 01118 * \ref MIB_JOIN_ACCEPT_DELAY_1 | YES | YES 01119 * \ref MIB_JOIN_ACCEPT_DELAY_2 | YES | YES 01120 * \ref MIB_CHANNELS_DATARATE | YES | YES 01121 * \ref MIB_CHANNELS_DEFAULT_DATARATE| YES | YES 01122 * \ref MIB_CHANNELS_TX_POWER | YES | YES 01123 * \ref MIB_CHANNELS_DEFAULT_TX_POWER| YES | YES 01124 * \ref MIB_UPLINK_COUNTER | YES | YES 01125 * \ref MIB_DOWNLINK_COUNTER | YES | YES 01126 * \ref MIB_MULTICAST_CHANNEL | YES | NO 01127 * \ref MIB_SYSTEM_MAX_RX_ERROR | YES | YES 01128 * \ref MIB_MIN_RX_SYMBOLS | YES | YES 01129 * \ref MIB_ANTENNA_GAIN | YES | YES 01130 * 01131 * The following table provides links to the function implementations of the 01132 * related MIB primitives: 01133 * 01134 * Primitive | Function 01135 * ---------------- | :---------------------: 01136 * MIB-Set | LoRaMacMibSetRequestConfirm 01137 * MIB-Get | LoRaMacMibGetRequestConfirm 01138 */ 01139 typedef enum { 01140 /*! 01141 * LoRaWAN device class. 01142 * 01143 * LoRaWAN Specification V1.0.2. 01144 */ 01145 MIB_DEVICE_CLASS , 01146 /*! 01147 * LoRaWAN Network joined attribute. 01148 * 01149 * LoRaWAN Specification V1.0.2. 01150 */ 01151 MIB_NETWORK_JOINED , 01152 /*! 01153 * Adaptive data rate. 01154 * 01155 * LoRaWAN Specification V1.0.2, chapter 4.3.1.1. 01156 * 01157 * [true: ADR enabled, false: ADR disabled]. 01158 */ 01159 MIB_ADR , 01160 /*! 01161 * Network identifier. 01162 * 01163 * LoRaWAN Specification V1.0.2, chapter 6.1.1. 01164 */ 01165 MIB_NET_ID , 01166 /*! 01167 * End-device address. 01168 * 01169 * LoRaWAN Specification V1.0.2, chapter 6.1.1. 01170 */ 01171 MIB_DEV_ADDR , 01172 /*! 01173 * Network session key. 01174 * 01175 * LoRaWAN Specification V1.0.2, chapter 6.1.3. 01176 */ 01177 MIB_NWK_SKEY , 01178 /*! 01179 * Application session key. 01180 * 01181 * LoRaWAN Specification V1.0.2, chapter 6.1.4. 01182 */ 01183 MIB_APP_SKEY , 01184 /*! 01185 * Set the network type to public or private. 01186 * 01187 * LoRaWAN Regional Parameters V1.0.2rB. 01188 * 01189 * [true: public network, false: private network] 01190 */ 01191 MIB_PUBLIC_NETWORK , 01192 /*! 01193 * Support the operation with repeaters. 01194 * 01195 * LoRaWAN Regional Parameters V1.0.2rB. 01196 * 01197 * [true: repeater support enabled, false: repeater support disabled] 01198 */ 01199 MIB_REPEATER_SUPPORT , 01200 /*! 01201 * Communication channels. A GET request will return a 01202 * pointer that references the first entry of the channel list. The 01203 * list is of size LORA_MAX_NB_CHANNELS. 01204 * 01205 * LoRaWAN Regional Parameters V1.0.2rB. 01206 */ 01207 MIB_CHANNELS , 01208 /*! 01209 * Set receive window 2 channel. 01210 * 01211 * LoRaWAN Specification V1.0.2, chapter 3.3.1. 01212 */ 01213 MIB_RX2_CHANNEL , 01214 /*! 01215 * Set receive window 2 channel. 01216 * 01217 * LoRaWAN Specification V1.0.2, chapter 3.3.2. 01218 */ 01219 MIB_RX2_DEFAULT_CHANNEL , 01220 /*! 01221 * LoRaWAN channels mask. 01222 * 01223 * LoRaWAN Regional Parameters V1.0.2rB. 01224 */ 01225 MIB_CHANNELS_MASK , 01226 /*! 01227 * LoRaWAN default channels mask. 01228 * 01229 * LoRaWAN Regional Parameters V1.0.2rB. 01230 */ 01231 MIB_CHANNELS_DEFAULT_MASK , 01232 /*! 01233 * Set the number of repetitions on a channel. 01234 * 01235 * LoRaWAN Specification V1.0.2, chapter 5.2. 01236 */ 01237 MIB_CHANNELS_NB_REP , 01238 /*! 01239 * The maximum receive window duration in [ms]. 01240 * 01241 * LoRaWAN Specification V1.0.2, chapter 3.3.3. 01242 */ 01243 MIB_MAX_RX_WINDOW_DURATION , 01244 /*! 01245 * The receive delay 1 in [ms]. 01246 * 01247 * LoRaWAN Regional Parameters V1.0.2rB. 01248 */ 01249 MIB_RECEIVE_DELAY_1 , 01250 /*! 01251 * The receive delay 2 in [ms]. 01252 * 01253 * LoRaWAN Regional Parameters V1.0.2rB. 01254 */ 01255 MIB_RECEIVE_DELAY_2 , 01256 /*! 01257 * The join accept delay 1 in [ms]. 01258 * 01259 * LoRaWAN Regional Parameters V1.0.2rB. 01260 */ 01261 MIB_JOIN_ACCEPT_DELAY_1 , 01262 /*! 01263 * The join accept delay 2 in [ms]. 01264 * 01265 * LoRaWAN Regional Parameters V1.0.2rB. 01266 */ 01267 MIB_JOIN_ACCEPT_DELAY_2 , 01268 /*! 01269 * The default data rate of a channel. 01270 * 01271 * LoRaWAN Regional Parameters V1.0.2rB. 01272 * 01273 * The allowed ranges are region-specific. Please refer to \ref DR_0 to \ref DR_15 for details. 01274 */ 01275 MIB_CHANNELS_DEFAULT_DATARATE , 01276 /*! 01277 * The data rate of a channel. 01278 * 01279 * LoRaWAN Regional Parameters V1.0.2rB. 01280 * 01281 * The allowed ranges are region-specific. Please refer to \ref DR_0 to \ref DR_15 for details. 01282 */ 01283 MIB_CHANNELS_DATARATE , 01284 /*! 01285 * The transmission power of a channel. 01286 * 01287 * LoRaWAN Regional Parameters V1.0.2rB. 01288 * 01289 * The allowed ranges are region-specific. Please refer to \ref TX_POWER_0 to \ref TX_POWER_15 for details. 01290 */ 01291 MIB_CHANNELS_TX_POWER , 01292 /*! 01293 * The transmission power of a channel. 01294 * 01295 * LoRaWAN Regional Parameters V1.0.2rB. 01296 * 01297 * The allowed ranges are region-specific. Please refer to \ref TX_POWER_0 to \ref TX_POWER_15 for details. 01298 */ 01299 MIB_CHANNELS_DEFAULT_TX_POWER , 01300 /*! 01301 * LoRaWAN uplink counter. 01302 * 01303 * LoRaWAN Specification V1.0.2, chapter 4.3.1.5. 01304 */ 01305 MIB_UPLINK_COUNTER , 01306 /*! 01307 * LoRaWAN downlink counter. 01308 * 01309 * LoRaWAN Specification V1.0.2, chapter 4.3.1.5. 01310 */ 01311 MIB_DOWNLINK_COUNTER , 01312 /*! 01313 * Multicast channels. A GET request will return a pointer to the first 01314 * entry of the multicast channel linked list. If the pointer is equal to 01315 * NULL, the list is empty. 01316 */ 01317 MIB_MULTICAST_CHANNEL , 01318 /*! 01319 * System overall timing error in milliseconds. 01320 * [-SystemMaxRxError : +SystemMaxRxError] 01321 * Default: +/-10 ms 01322 */ 01323 MIB_SYSTEM_MAX_RX_ERROR , 01324 /*! 01325 * The minimum number of symbols required to detect an RX frame. 01326 * Default: 6 symbols 01327 */ 01328 MIB_MIN_RX_SYMBOLS , 01329 /*! 01330 * The antenna gain of the node. The default value is region-specific. 01331 * The antenna gain is used to calculate the TX power of the node. 01332 * The formula is: 01333 * radioTxPower = ( int8_t )floor( maxEirp - antennaGain ) 01334 */ 01335 MIB_ANTENNA_GAIN 01336 } mib_type_t ; 01337 01338 /*! 01339 * LoRaMAC MIB parameters. 01340 */ 01341 typedef union { 01342 /*! 01343 * LoRaWAN device class. 01344 * 01345 * Related MIB type: \ref MIB_DEVICE_CLASS 01346 */ 01347 device_class_t dev_class ; 01348 /*! 01349 * LoRaWAN network joined attribute 01350 * 01351 * Related MIB type: \ref MIB_NETWORK_JOINED 01352 */ 01353 bool is_nwk_joined ; 01354 /*! 01355 * Activation state of ADR 01356 * 01357 * Related MIB type: \ref MIB_ADR 01358 */ 01359 bool is_adr_enable ; 01360 /*! 01361 * Network identifier 01362 * 01363 * Related MIB type: \ref MIB_NET_ID 01364 */ 01365 uint32_t net_id ; 01366 /*! 01367 * End-device address 01368 * 01369 * Related MIB type: \ref MIB_DEV_ADDR 01370 */ 01371 uint32_t dev_addr ; 01372 /*! 01373 * Network session key 01374 * 01375 * Related MIB type: \ref MIB_NWK_SKEY 01376 */ 01377 uint8_t *nwk_skey ; 01378 /*! 01379 * Application session key 01380 * 01381 * Related MIB type: \ref MIB_APP_SKEY 01382 */ 01383 uint8_t *app_skey ; 01384 /*! 01385 * Enable or disable a public network 01386 * 01387 * Related MIB type: \ref MIB_PUBLIC_NETWORK 01388 */ 01389 bool enable_public_nwk ; 01390 /*! 01391 * Enable or disable repeater support 01392 * 01393 * Related MIB type: \ref MIB_REPEATER_SUPPORT 01394 */ 01395 bool enable_repeater_support ; 01396 /*! 01397 * LoRaWAN channel 01398 * 01399 * Related MIB type: \ref MIB_CHANNELS 01400 */ 01401 channel_params_t * channel_list ; 01402 /*! 01403 * Channel for the receive window 2 01404 * 01405 * Related MIB type: \ref MIB_RX2_CHANNEL 01406 */ 01407 rx2_channel_params rx2_channel ; 01408 /*! 01409 * Channel for the receive window 2 01410 * 01411 * Related MIB type: \ref MIB_RX2_DEFAULT_CHANNEL 01412 */ 01413 rx2_channel_params default_rx2_channel ; 01414 /*! 01415 * Channel mask 01416 * 01417 * Related MIB type: \ref MIB_CHANNELS_MASK 01418 */ 01419 uint16_t* channel_mask ; 01420 /*! 01421 * Default channel mask 01422 * 01423 * Related MIB type: \ref MIB_CHANNELS_DEFAULT_MASK 01424 */ 01425 uint16_t* default_channel_mask ; 01426 /*! 01427 * Number of frame repetitions 01428 * 01429 * Related MIB type: \ref MIB_CHANNELS_NB_REP 01430 */ 01431 uint8_t channel_nb_rep ; 01432 /*! 01433 * Maximum receive window duration 01434 * 01435 * Related MIB type: \ref MIB_MAX_RX_WINDOW_DURATION 01436 */ 01437 uint32_t max_rx_window ; 01438 /*! 01439 * Receive delay 1 01440 * 01441 * Related MIB type: \ref MIB_RECEIVE_DELAY_1 01442 */ 01443 uint32_t recv_delay1 ; 01444 /*! 01445 * Receive delay 2 01446 * 01447 * Related MIB type: \ref MIB_RECEIVE_DELAY_2 01448 */ 01449 uint32_t recv_delay2 ; 01450 /*! 01451 * Join accept delay 1 01452 * 01453 * Related MIB type: \ref MIB_JOIN_ACCEPT_DELAY_1 01454 */ 01455 uint32_t join_accept_delay1 ; 01456 /*! 01457 * Join accept delay 2 01458 * 01459 * Related MIB type: \ref MIB_JOIN_ACCEPT_DELAY_2 01460 */ 01461 uint32_t join_accept_delay2 ; 01462 /*! 01463 * Channels data rate 01464 * 01465 * Related MIB type: \ref MIB_CHANNELS_DEFAULT_DATARATE 01466 */ 01467 int8_t default_channel_data_rate ; 01468 /*! 01469 * Channels data rate 01470 * 01471 * Related MIB type: \ref MIB_CHANNELS_DATARATE 01472 */ 01473 int8_t channel_data_rate ; 01474 /*! 01475 * Channels TX power 01476 * 01477 * Related MIB type: \ref MIB_CHANNELS_DEFAULT_TX_POWER 01478 */ 01479 int8_t default_channel_tx_pwr ; 01480 /*! 01481 * Channels TX power 01482 * 01483 * Related MIB type: \ref MIB_CHANNELS_TX_POWER 01484 */ 01485 int8_t channel_tx_pwr ; 01486 /*! 01487 * LoRaWAN uplink counter 01488 * 01489 * Related MIB type: \ref MIB_UPLINK_COUNTER 01490 */ 01491 uint32_t ul_frame_counter ; 01492 /*! 01493 * LoRaWAN downlink counter 01494 * 01495 * Related MIB type: \ref MIB_DOWNLINK_COUNTER 01496 */ 01497 uint32_t dl_frame_counter ; 01498 /*! 01499 * Multicast channel 01500 * 01501 * Related MIB type: \ref MIB_MULTICAST_CHANNEL 01502 */ 01503 multicast_params_t * multicast_list ; 01504 /*! 01505 * System overall timing error in milliseconds 01506 * 01507 * Related MIB type: \ref MIB_SYSTEM_MAX_RX_ERROR 01508 */ 01509 uint32_t max_rx_sys_error ; 01510 /*! 01511 * Minimum required number of symbols to detect an RX frame 01512 * 01513 * Related MIB type: \ref MIB_MIN_RX_SYMBOLS 01514 */ 01515 uint8_t min_rx_symb ; 01516 /*! 01517 * Antenna gain 01518 * 01519 * Related MIB type: \ref MIB_ANTENNA_GAIN 01520 */ 01521 float antenna_gain ; 01522 } mib_params_t ; 01523 01524 /*! 01525 * LoRaMAC MIB-RequestConfirm structure 01526 */ 01527 typedef struct { 01528 /*! 01529 * MIB-Request type 01530 */ 01531 mib_type_t type ; 01532 01533 /*! 01534 * MLME-RequestConfirm parameters 01535 */ 01536 mib_params_t param ; 01537 }loramac_mib_req_confirm_t ; 01538 01539 /*! 01540 * LoRaMAC TX information 01541 */ 01542 typedef struct { 01543 /*! 01544 * Defines the size of the applicable payload that can be processed. 01545 */ 01546 uint8_t max_possible_payload_size ; 01547 /*! 01548 * The current payload size, dependent on the current datarate. 01549 */ 01550 uint8_t current_payload_size ; 01551 } loramac_tx_info_t ; 01552 01553 /** LoRaMAC status. 01554 * 01555 */ 01556 typedef enum lorawan_status { 01557 LORAWAN_STATUS_OK = 0, /**< Service started successfully */ 01558 LORAWAN_STATUS_BUSY = -1000, /**< Service not started - LoRaMAC is busy */ 01559 LORAWAN_STATUS_WOULD_BLOCK = -1001, /**< LoRaMAC cannot send at the moment or have nothing to read */ 01560 LORAWAN_STATUS_SERVICE_UNKNOWN = -1002, /**< Service unknown */ 01561 LORAWAN_STATUS_PARAMETER_INVALID = -1003, /**< Service not started - invalid parameter */ 01562 LORAWAN_STATUS_FREQUENCY_INVALID = -1004, /**< Service not started - invalid frequency */ 01563 LORAWAN_STATUS_DATARATE_INVALID = -1005, /**< Service not started - invalid datarate */ 01564 LORAWAN_STATUS_FREQ_AND_DR_INVALID = -1006, /**< Service not started - invalid frequency and datarate */ 01565 LORAWAN_STATUS_NO_NETWORK_JOINED = -1009, /**< Service not started - the device is not in a LoRaWAN */ 01566 LORAWAN_STATUS_LENGTH_ERROR = -1010, /**< Service not started - payload lenght error */ 01567 LORAWAN_STATUS_DEVICE_OFF = -1011, /**< Service not started - the device is switched off */ 01568 LORAWAN_STATUS_NOT_INITIALIZED = -1012, /**< Service not started - stack not initialized */ 01569 LORAWAN_STATUS_UNSUPPORTED = -1013, /**< Service not supported */ 01570 LORAWAN_STATUS_CRYPTO_FAIL = -1014, /**< Service not started - crypto failure */ 01571 LORAWAN_STATUS_PORT_INVALID = -1015, /**< Invalid port */ 01572 LORAWAN_STATUS_CONNECT_IN_PROGRESS = -1016, /**< Services started - Connection in progress */ 01573 LORAWAN_STATUS_NO_ACTIVE_SESSIONS = -1017, /**< Services not started - No active session */ 01574 LORAWAN_STATUS_IDLE = -1018, /**< Services started - Idle at the moment */ 01575 #if defined(LORAWAN_COMPLIANCE_TEST) 01576 LORAWAN_STATUS_COMPLIANCE_TEST_ON = -1019, /**< Compliance test - is on-going */ 01577 #endif 01578 } lorawan_status_t; 01579 01580 /*! 01581 * LoRaMAC events structure. 01582 * Used to notify upper layers of MAC events. 01583 */ 01584 typedef struct { 01585 /*! 01586 * \brief MCPS-Confirm primitive. 01587 * 01588 * \param [OUT] MCPS-Confirm parameters. 01589 */ 01590 mbed::Callback<void(loramac_mcps_confirm_t*)> mcps_confirm; 01591 01592 /*! 01593 * \brief MCPS-Indication primitive. 01594 * 01595 * \param [OUT] MCPS-Indication parameters. 01596 */ 01597 mbed::Callback<void(loramac_mcps_indication_t*)> mcps_indication; 01598 01599 /*! 01600 * \brief MLME-Confirm primitive. 01601 * 01602 * \param [OUT] MLME-Confirm parameters. 01603 */ 01604 mbed::Callback<void(loramac_mlme_confirm_t*)> mlme_confirm; 01605 01606 /*! 01607 * \brief MLME-Indication primitive 01608 * 01609 * \param [OUT] MLME-Indication parameters 01610 */ 01611 mbed::Callback<void(loramac_mlme_indication_t*)> mlme_indication; 01612 }loramac_primitives_t ; 01613 01614 /** Enum of LoRaWAN connection type. 01615 * 01616 * The LoRaWAN connection type specifies how an end-device connects to the gateway. 01617 */ 01618 typedef enum lorawan_connect_type { 01619 LORAWAN_CONNECTION_OTAA = 0, /**< Over The Air Activation */ 01620 LORAWAN_CONNECTION_ABP /**< Activation By Personalization */ 01621 } lorawan_connect_type_t; 01622 01623 /** The lorawan_connect_otaa structure. 01624 * 01625 * A structure representing the LoRaWAN Over The Air Activation 01626 * parameters. 01627 */ 01628 typedef struct { 01629 /** End-device identifier 01630 * 01631 * LoRaWAN Specification V1.0.2, chapter 6.2.1 01632 */ 01633 uint8_t *dev_eui; 01634 /** Application identifier 01635 * 01636 * LoRaWAN Specification V1.0.2, chapter 6.1.2 01637 */ 01638 uint8_t *app_eui; 01639 /** AES-128 application key 01640 * 01641 * LoRaWAN Specification V1.0.2, chapter 6.2.2 01642 */ 01643 uint8_t *app_key; 01644 /** Join request trials 01645 * 01646 * Number of trials for the join request. 01647 */ 01648 uint8_t nb_trials; 01649 } lorawan_connect_otaa_t; 01650 01651 /** The lorawan_connect_abp structure. 01652 * 01653 * A structure representing the LoRaWAN Activation By Personalization 01654 * parameters. 01655 */ 01656 typedef struct { 01657 /** Network identifier 01658 * 01659 * LoRaWAN Specification V1.0.2, chapter 6.1.1 01660 */ 01661 uint32_t nwk_id; 01662 /** End-device address 01663 * 01664 * LoRaWAN Specification V1.0.2, chapter 6.1.1 01665 */ 01666 uint32_t dev_addr; 01667 /** Network session key 01668 * 01669 * LoRaWAN Specification V1.0.2, chapter 6.1.3 01670 */ 01671 uint8_t *nwk_skey; 01672 /** Application session key 01673 * 01674 * LoRaWAN Specification V1.0.2, chapter 6.1.4 01675 */ 01676 uint8_t *app_skey; 01677 } lorawan_connect_abp_t; 01678 01679 /** 01680 * Stack level TX message structure 01681 */ 01682 typedef struct { 01683 01684 /** 01685 * TX Ongoing flag 01686 */ 01687 bool tx_ongoing; 01688 01689 /** 01690 * Application Port Number 01691 */ 01692 uint8_t port; 01693 01694 /** 01695 * Message type 01696 */ 01697 mcps_type_t type; 01698 01699 /*! 01700 * Frame port field. Must be set if the payload is not empty. Use the 01701 * application-specific frame port values: [1...223]. 01702 * 01703 * LoRaWAN Specification V1.0.2, chapter 4.3.2. 01704 */ 01705 uint8_t fport ; 01706 01707 /*! 01708 * Uplink datarate, if ADR is off. 01709 */ 01710 int8_t data_rate ; 01711 /*! 01712 * The number of trials to transmit the frame, if the LoRaMAC layer did not 01713 * receive an acknowledgment. The MAC performs a datarate adaptation 01714 * according to the LoRaWAN Specification V1.0.2, chapter 18.4, as in 01715 * the following table: 01716 * 01717 * Transmission nb | Data Rate 01718 * ----------------|----------- 01719 * 1 (first) | DR 01720 * 2 | DR 01721 * 3 | max(DR-1,0) 01722 * 4 | max(DR-1,0) 01723 * 5 | max(DR-2,0) 01724 * 6 | max(DR-2,0) 01725 * 7 | max(DR-3,0) 01726 * 8 | max(DR-3,0) 01727 * 01728 * Note that if nb_trials is set to 1 or 2, the MAC will not decrease 01729 * the datarate, if the LoRaMAC layer did not receive an acknowledgment. 01730 */ 01731 uint8_t nb_trials ; 01732 01733 /** Payload data 01734 * 01735 * Base pointer to the buffer 01736 */ 01737 uint8_t f_buffer[MBED_CONF_LORA_TX_MAX_SIZE]; 01738 01739 /** Payload size. 01740 * 01741 * The size of the frame payload. 01742 */ 01743 uint16_t f_buffer_size; 01744 01745 /** 01746 * Pending data size 01747 */ 01748 uint16_t pending_size; 01749 01750 } loramac_tx_message_t; 01751 01752 /** lora_mac_rx_message_type_t 01753 * 01754 * An enum representing a structure for RX messages. 01755 */ 01756 typedef enum { 01757 LORAMAC_RX_MLME_CONFIRM = 0, /**< lora_mac_mlme_confirm_t */ 01758 LORAMAC_RX_MCPS_CONFIRM, /**< lora_mac_mcps_confirm_t */ 01759 LORAMAC_RX_MCPS_INDICATION /**< lora_mac_mcps_indication_t */ 01760 } rx_msg_type; 01761 01762 /** lora_mac_rx_message_by_type_t union 01763 * 01764 * A union representing a structure for RX messages. 01765 */ 01766 typedef union { 01767 loramac_mlme_confirm_t mlme_confirm; 01768 loramac_mcps_confirm_t mcps_confirm; 01769 loramac_mcps_indication_t mcps_indication; 01770 } rx_message_u; 01771 01772 /** loramac_rx_message_t 01773 * 01774 * A structure representing a structure for an RX message. 01775 */ 01776 typedef struct { 01777 bool receive_ready; 01778 rx_msg_type type; 01779 rx_message_u msg; 01780 uint16_t pending_size; 01781 uint16_t prev_read_size; 01782 } loramac_rx_message_t; 01783 01784 /** 01785 * Structure to hold A list of LoRa Channels 01786 */ 01787 typedef struct lora_channels_s { 01788 uint8_t id; 01789 channel_params_t ch_param; 01790 } loramac_channel_t; 01791 01792 01793 /** lorawan_connect_t structure 01794 * 01795 * A structure representing the parameters for different connections. 01796 */ 01797 typedef struct lorawan_connect { 01798 /*! 01799 * Select the connection type, either LORAWAN_CONNECTION_OTAA 01800 * or LORAWAN_CONNECTION_ABP. 01801 */ 01802 uint8_t connect_type ; 01803 01804 union { 01805 /*! 01806 * Join the network using OTA 01807 */ 01808 lorawan_connect_otaa_t otaa ; 01809 /*! 01810 * Authentication by personalization 01811 */ 01812 lorawan_connect_abp_t abp ; 01813 } connection_u; 01814 01815 } lorawan_connect_t; 01816 01817 /** LoRaWAN session 01818 * 01819 * A structure for keeping session details. 01820 */ 01821 typedef struct lorawan_session { 01822 /** 01823 * True if the session is active 01824 */ 01825 bool active; 01826 01827 lorawan_connect_t connection; 01828 /** 01829 * LoRaWAN uplink counter 01830 * 01831 * Related MIB type: LORA_MIB_UPLINK_COUNTER 01832 */ 01833 uint32_t uplink_counter; 01834 /** 01835 * LoRaWAN downlink counter 01836 * 01837 * Related MIB type: LORA_MIB_DOWNLINK_COUNTER 01838 */ 01839 uint32_t downlink_counter; 01840 } lorawan_session_t; 01841 01842 /** Commissioning data 01843 * 01844 * A structure for data in commission. 01845 */ 01846 typedef struct { 01847 /** Connection information 01848 * 01849 * Saves information for etc. keys 01850 */ 01851 lorawan_connect_t connection; 01852 /** 01853 * LoRaWAN Up-link counter 01854 * 01855 * Related MIB type: LORA_MIB_UPLINK_COUNTER 01856 */ 01857 uint32_t uplink_counter; 01858 /** 01859 * LoRaWAN Down-link counter 01860 * 01861 * Related MIB type: LORA_MIB_DOWNLINK_COUNTER 01862 */ 01863 uint32_t downlink_counter; 01864 } lorawan_dev_commission_t; 01865 01866 /** Structure containing the uplink status 01867 * 01868 */ 01869 typedef struct { 01870 /** Is acked 01871 * 01872 */ 01873 uint8_t acked; 01874 /** Uplink data rate 01875 * 01876 */ 01877 int8_t datarate; 01878 /** Uplink counter 01879 * 01880 */ 01881 uint16_t uplink_counter; 01882 /** Port is used by application 01883 * 01884 */ 01885 uint8_t port; 01886 /** Payload 01887 * 01888 */ 01889 uint8_t *buffer; 01890 /** Payload size 01891 * 01892 */ 01893 uint8_t buffer_size; 01894 } loramac_uplink_status_t; 01895 01896 /** A structure containing the downlink status 01897 * 01898 */ 01899 typedef struct { 01900 /** RSSI of downlink 01901 * 01902 */ 01903 int16_t rssi; 01904 /** SNR of downlink 01905 * 01906 */ 01907 int8_t snr; 01908 /** Downlink counter 01909 * 01910 */ 01911 uint16_t downlink_counter; 01912 /** Is RX data received 01913 * 01914 */ 01915 bool rx_data; 01916 /** Port used by application 01917 * 01918 */ 01919 uint8_t port; 01920 /** Payload 01921 * 01922 */ 01923 uint8_t *buffer; 01924 /** Payload size 01925 * 01926 */ 01927 uint8_t buffer_size; 01928 } loramac_downlink_status_t; 01929 01930 /*! 01931 * The parameter structure for the function for regional rx configuration. 01932 */ 01933 typedef struct { 01934 /*! 01935 * The RX channel. 01936 */ 01937 uint8_t channel ; 01938 /*! 01939 * The RX datarate. 01940 */ 01941 uint8_t datarate ; 01942 /*! 01943 * The RX bandwidth. 01944 */ 01945 uint8_t bandwidth ; 01946 /*! 01947 * The RX datarate offset. 01948 */ 01949 int8_t dr_offset ; 01950 /*! 01951 * The RX frequency. 01952 */ 01953 uint32_t frequency ; 01954 /*! 01955 * The RX window timeout 01956 */ 01957 uint32_t window_timeout ; 01958 /*! 01959 * The RX window offset 01960 */ 01961 int32_t window_offset ; 01962 /*! 01963 * The downlink dwell time. 01964 */ 01965 uint8_t dl_dwell_time ; 01966 /*! 01967 * Set to true, if a repeater is supported. 01968 */ 01969 bool is_repeater_supported ; 01970 /*! 01971 * Set to true, if RX should be continuous. 01972 */ 01973 bool is_rx_continuous ; 01974 /*! 01975 * Sets the RX window. 01976 */ 01977 rx_slot_t rx_slot ; 01978 } rx_config_params_t ; 01979 01980 /*! 01981 * \brief Timer object description 01982 */ 01983 typedef struct { 01984 mbed::Callback<void()> callback; 01985 int timer_id; 01986 } timer_event_t; 01987 01988 /*! 01989 * LoRaMac internal states 01990 */ 01991 typedef enum { 01992 LORAMAC_IDLE = 0x00000000, 01993 LORAMAC_TX_RUNNING = 0x00000001, 01994 LORAMAC_RX = 0x00000002, 01995 LORAMAC_ACK_REQ = 0x00000004, 01996 LORAMAC_ACK_RETRY = 0x00000008, 01997 LORAMAC_TX_DELAYED = 0x00000010, 01998 LORAMAC_TX_CONFIG = 0x00000020, 01999 LORAMAC_RX_ABORT = 0x00000040, 02000 } loramac_internal_state ; 02001 02002 typedef struct { 02003 /*! 02004 * Device IEEE EUI 02005 */ 02006 uint8_t *dev_eui; 02007 02008 /*! 02009 * Application IEEE EUI 02010 */ 02011 uint8_t *app_eui; 02012 02013 /*! 02014 * AES encryption/decryption cipher application key 02015 */ 02016 uint8_t *app_key; 02017 02018 /*! 02019 * AES encryption/decryption cipher network session key 02020 */ 02021 uint8_t nwk_skey[16]; 02022 02023 /*! 02024 * AES encryption/decryption cipher application session key 02025 */ 02026 uint8_t app_skey[16]; 02027 02028 } loramac_keys; 02029 02030 typedef struct { 02031 /*! 02032 * Aggregated duty cycle management 02033 */ 02034 lorawan_time_t aggregated_last_tx_time; 02035 lorawan_time_t aggregated_timeoff; 02036 02037 /*! 02038 * Stores the time at LoRaMac initialization. 02039 * 02040 * \remark Used for the BACKOFF_DC computation. 02041 */ 02042 lorawan_time_t mac_init_time; 02043 02044 02045 /*! 02046 * Last transmission time on air 02047 */ 02048 lorawan_time_t tx_toa; 02049 02050 /*! 02051 * LoRaMac timer used to check the LoRaMacState (runs every second) 02052 */ 02053 timer_event_t mac_state_check_timer; 02054 02055 /*! 02056 * LoRaMac duty cycle delayed Tx timer 02057 */ 02058 timer_event_t tx_delayed_timer; 02059 02060 /*! 02061 * LoRaMac reception windows timers 02062 */ 02063 timer_event_t rx_window1_timer; 02064 timer_event_t rx_window2_timer; 02065 02066 /*! 02067 * Acknowledge timeout timer. Used for packet retransmissions. 02068 */ 02069 timer_event_t ack_timeout_timer; 02070 02071 } lorawan_timers; 02072 02073 typedef struct { 02074 02075 /*! 02076 * Actual device class 02077 */ 02078 device_class_t dev_class; 02079 02080 /*! 02081 * Holds the type of current Receive window slot 02082 */ 02083 rx_slot_t rx_slot; 02084 02085 /*! 02086 * Indicates if the node is connected to a private or public network 02087 */ 02088 bool is_nwk_public; 02089 02090 /*! 02091 * Indicates if the node supports repeaters 02092 */ 02093 bool is_repeater_supported; 02094 02095 /*! 02096 * IsPacketCounterFixed enables the MIC field tests by fixing the 02097 * ul_frame_counter value 02098 */ 02099 bool is_ul_frame_counter_fixed; 02100 02101 /*! 02102 * Used for test purposes. Disables the opening of the reception windows. 02103 */ 02104 bool is_rx_window_enabled; 02105 02106 /*! 02107 * Indicates if the MAC layer has already joined a network. 02108 */ 02109 bool is_nwk_joined; 02110 02111 /*! 02112 * If the node has sent a FRAME_TYPE_DATA_CONFIRMED_UP this variable indicates 02113 * if the nodes needs to manage the server acknowledgement. 02114 */ 02115 bool is_node_ack_requested; 02116 02117 /*! 02118 * If the server has sent a FRAME_TYPE_DATA_CONFIRMED_DOWN this variable indicates 02119 * if the ACK bit must be set for the next transmission 02120 */ 02121 bool is_srv_ack_requested; 02122 02123 /*! 02124 * Enables/Disables duty cycle management (Test only) 02125 */ 02126 bool is_dutycycle_on; 02127 02128 /*! 02129 * Set to true, if the last uplink was a join request 02130 */ 02131 bool is_last_tx_join_request; 02132 02133 /*! 02134 * Indicates if the AckTimeout timer has expired or not 02135 */ 02136 bool is_ack_retry_timeout_expired; 02137 02138 /*! 02139 * Current channel index 02140 */ 02141 uint8_t channel; 02142 02143 /*! 02144 * Current channel index 02145 */ 02146 uint8_t last_channel_idx; 02147 02148 /*! 02149 * Uplink messages repetitions counter 02150 */ 02151 uint8_t ul_nb_rep_counter; 02152 02153 /*! 02154 * Buffer containing the data to be sent or received. 02155 */ 02156 uint8_t buffer[LORAMAC_PHY_MAXPAYLOAD]; 02157 02158 /*! 02159 * Length of packet in LoRaMacBuffer 02160 */ 02161 uint16_t buffer_pkt_len; 02162 02163 /*! 02164 * Buffer containing the upper layer data. 02165 */ 02166 uint8_t payload[LORAMAC_PHY_MAXPAYLOAD]; 02167 02168 /*! 02169 * Length of the payload in LoRaMacBuffer 02170 */ 02171 uint8_t payload_length; 02172 02173 /*! 02174 * Number of trials to get a frame acknowledged 02175 */ 02176 uint8_t max_ack_timeout_retries; 02177 02178 /*! 02179 * Number of trials to get a frame acknowledged 02180 */ 02181 uint8_t ack_timeout_retry_counter; 02182 02183 /*! 02184 * Maximum number of trials for the Join Request 02185 */ 02186 uint8_t max_join_request_trials; 02187 02188 /*! 02189 * Number of trials for the Join Request 02190 */ 02191 uint8_t join_request_trial_counter; 02192 02193 /*! 02194 * Mac keys 02195 */ 02196 loramac_keys keys; 02197 02198 /*! 02199 * LoRaMac tx/rx operation state 02200 */ 02201 loramac_flags_t flags; 02202 02203 /*! 02204 * Device nonce is a random value extracted by issuing a sequence of RSSI 02205 * measurements 02206 */ 02207 uint16_t dev_nonce; 02208 02209 /*! 02210 * Network ID ( 3 bytes ) 02211 */ 02212 uint32_t net_id; 02213 02214 /*! 02215 * Mote Address 02216 */ 02217 uint32_t dev_addr; 02218 02219 /*! 02220 * LoRaMAC frame counter. Each time a packet is sent the counter is incremented. 02221 * Only the 16 LSB bits are sent 02222 */ 02223 uint32_t ul_frame_counter; 02224 02225 /*! 02226 * LoRaMAC frame counter. Each time a packet is received the counter is incremented. 02227 * Only the 16 LSB bits are received 02228 */ 02229 uint32_t dl_frame_counter; 02230 02231 /*! 02232 * Counts the number of missed ADR acknowledgements 02233 */ 02234 uint32_t adr_ack_counter; 02235 02236 /*! 02237 * LoRaMac internal state 02238 */ 02239 uint32_t mac_state; 02240 02241 /*! 02242 * LoRaMac reception windows delay 02243 * \remark normal frame: RxWindowXDelay = ReceiveDelayX - RADIO_WAKEUP_TIME 02244 * join frame : RxWindowXDelay = JoinAcceptDelayX - RADIO_WAKEUP_TIME 02245 */ 02246 uint32_t rx_window1_delay; 02247 uint32_t rx_window2_delay; 02248 02249 /*! 02250 * Timer objects and stored values 02251 */ 02252 lorawan_timers timers; 02253 02254 /*! 02255 * LoRaMac parameters 02256 */ 02257 lora_mac_system_params_t sys_params; 02258 02259 /*! 02260 * Receive Window configurations for PHY layer 02261 */ 02262 rx_config_params_t rx_window1_config; 02263 rx_config_params_t rx_window2_config; 02264 02265 /*! 02266 * Multicast channels linked list 02267 */ 02268 multicast_params_t *multicast_channels; 02269 02270 } loramac_protocol_params; 02271 02272 /** LoRaWAN callback functions 02273 * 02274 */ 02275 typedef enum lora_events { 02276 CONNECTED=0, 02277 DISCONNECTED, 02278 TX_DONE, 02279 TX_TIMEOUT, 02280 TX_ERROR, 02281 TX_CRYPTO_ERROR, 02282 TX_SCHEDULING_ERROR, 02283 RX_DONE, 02284 RX_TIMEOUT, 02285 RX_ERROR, 02286 JOIN_FAILURE, 02287 } lorawan_event_t; 02288 02289 typedef struct { 02290 // Mandatory. Event Callback must be provided 02291 mbed::Callback<void(lorawan_event_t)> events; 02292 02293 // Rest are optional 02294 // If the user do not assign these callbacks, these callbacks would return 02295 // null if checked with bool operator 02296 // link_check_resp callback and other such callbacks will be maped in 02297 // future releases of Mbed-OS 02298 mbed::Callback<void(uint8_t, uint8_t)> link_check_resp; 02299 02300 // Battery level callback goes in the down direction, i.e., it informs 02301 // the stack about the battery level by calling a function provided 02302 // by the upper layers 02303 mbed::Callback<uint8_t(void)> battery_level; 02304 } lorawan_app_callbacks_t; 02305 02306 typedef struct lora_channelplan { 02307 uint8_t nb_channels; // number of channels 02308 loramac_channel_t *channels; 02309 } lorawan_channelplan_t; 02310 02311 #if defined(LORAWAN_COMPLIANCE_TEST) 02312 /** LoRaWAN compliance tests support data 02313 * 02314 */ 02315 typedef struct compliance_test { 02316 /** Is test running 02317 * 02318 */ 02319 bool running; 02320 /** State of test 02321 * 02322 */ 02323 uint8_t state; 02324 /** Is TX confirmed 02325 * 02326 */ 02327 bool is_tx_confirmed; 02328 /** Port used by the application 02329 * 02330 */ 02331 uint8_t app_port; 02332 /** Maximum size of data used by application 02333 * 02334 */ 02335 uint8_t app_data_size; 02336 /** Data provided by application 02337 * 02338 */ 02339 uint8_t *app_data_buffer; 02340 /** Downlink counter 02341 * 02342 */ 02343 uint16_t downlink_counter; 02344 /** Is link check required 02345 * 02346 */ 02347 bool link_check; 02348 /** Demodulation margin 02349 * 02350 */ 02351 uint8_t demod_margin; 02352 /** Number of gateways 02353 * 02354 */ 02355 uint8_t nb_gateways; 02356 } compliance_test_t; 02357 #endif 02358 02359 #endif /* LORAWAN_SYSTEM_LORAWAN_DATA_STRUCTURES_H_ */
Generated on Tue Jul 12 2022 11:43:35 by
