LoRaWAN MAC layer implementation

Dependents:   LoRaWAN-demo-72_tjm LoRaWAN-demo-72_jlc LoRaWAN-demo-elmo frdm_LoRa_Connect_Woodstream_Demo_tjm ... more

LoRAWAN-lib is a port of the GitHub LoRaMac-node LoRaWAN MAC layer implementation.

This library depends on the SX1276Lib or SX1272Lib radio drivers depending on the used mbed component shield.

This library depends also on some cryptographic helper functions as well as helper functions for the timers management. These can be found on the example projects under the system directory.

The example projects are:

  1. LoRaWAN-demo-72
  2. LoRaWAN-demo-76
  3. LoRaWAN-demo-NAMote72

The LoRaWAN specification specifies different ISM bands operating parameters. These are all implemented under the LoRaMac-board.h file.

In order to select which band to use, please change line 24 of board.h file provided on the examples projects as follows:


EU868

board.h

#define USE_BAND_868


US915

board.h

#define USE_BAND_915


US915 - Hybrid

board.h

#define USE_BAND_915_HYBRID


CN780

board.h

#define USE_BAND_780


EU433

board.h

#define USE_BAND_433
Committer:
ubhat
Date:
Tue Jul 17 22:48:35 2018 +0000
Revision:
11:2426a05fe29e
Parent:
4:37c12dbc8dc7
Child:
7:c16969e0f70f
Fix bug where FCnt get incremented twice in the case of ADRACKReq with D/L ACK

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mluis 2:14a5d6ad92d5 1 /*!
mluis 2:14a5d6ad92d5 2 * \file LoRaMac-api-v3.h
mluis 2:14a5d6ad92d5 3 *
mluis 2:14a5d6ad92d5 4 * \brief LoRa MAC wrapper layer implementation
mluis 2:14a5d6ad92d5 5 *
mluis 2:14a5d6ad92d5 6 * \copyright Revised BSD License, see section \ref LICENSE.
mluis 2:14a5d6ad92d5 7 *
mluis 2:14a5d6ad92d5 8 * \code
mluis 2:14a5d6ad92d5 9 * ______ _
mluis 2:14a5d6ad92d5 10 * / _____) _ | |
mluis 2:14a5d6ad92d5 11 * ( (____ _____ ____ _| |_ _____ ____| |__
mluis 2:14a5d6ad92d5 12 * \____ \| ___ | (_ _) ___ |/ ___) _ \
mluis 2:14a5d6ad92d5 13 * _____) ) ____| | | || |_| ____( (___| | | |
mluis 2:14a5d6ad92d5 14 * (______/|_____)_|_|_| \__)_____)\____)_| |_|
mluis 2:14a5d6ad92d5 15 * (C)2013 Semtech
mluis 2:14a5d6ad92d5 16 *
mluis 2:14a5d6ad92d5 17 * ___ _____ _ ___ _ _____ ___ ___ ___ ___
mluis 2:14a5d6ad92d5 18 * / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
mluis 2:14a5d6ad92d5 19 * \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
mluis 2:14a5d6ad92d5 20 * |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
mluis 2:14a5d6ad92d5 21 * embedded.connectivity.solutions===============
mluis 2:14a5d6ad92d5 22 *
mluis 2:14a5d6ad92d5 23 * \endcode
mluis 2:14a5d6ad92d5 24 *
mluis 2:14a5d6ad92d5 25 * \author Miguel Luis ( Semtech )
mluis 2:14a5d6ad92d5 26 *
mluis 2:14a5d6ad92d5 27 * \author Gregory Cristian ( Semtech )
mluis 2:14a5d6ad92d5 28 *
mluis 2:14a5d6ad92d5 29 * \author Daniel Jäckle ( STACKFORCE )
mluis 2:14a5d6ad92d5 30 */
mluis 2:14a5d6ad92d5 31 #ifndef __LORAMAC_API_V3_H__
mluis 2:14a5d6ad92d5 32 #define __LORAMAC_API_V3_H__
mluis 2:14a5d6ad92d5 33
mluis 2:14a5d6ad92d5 34 // Includes board dependent definitions such as channels frequencies
mluis 2:14a5d6ad92d5 35 #include "LoRaMac.h"
mluis 2:14a5d6ad92d5 36 #include "LoRaMac-board.h"
mluis 2:14a5d6ad92d5 37
mluis 2:14a5d6ad92d5 38 /*!
mluis 2:14a5d6ad92d5 39 * Beacon interval in us
mluis 2:14a5d6ad92d5 40 */
mluis 2:14a5d6ad92d5 41 #define BEACON_INTERVAL 128000000
mluis 2:14a5d6ad92d5 42
mluis 2:14a5d6ad92d5 43 /*!
mluis 4:37c12dbc8dc7 44 * Class A&B receive delay 1 in us
mluis 2:14a5d6ad92d5 45 */
mluis 2:14a5d6ad92d5 46 #define RECEIVE_DELAY1 1000000
mluis 4:37c12dbc8dc7 47
mluis 4:37c12dbc8dc7 48 /*!
mluis 4:37c12dbc8dc7 49 * Class A&B receive delay 2 in us
mluis 4:37c12dbc8dc7 50 */
mluis 2:14a5d6ad92d5 51 #define RECEIVE_DELAY2 2000000
mluis 2:14a5d6ad92d5 52
mluis 2:14a5d6ad92d5 53 /*!
mluis 4:37c12dbc8dc7 54 * Join accept receive delay 1 in us
mluis 2:14a5d6ad92d5 55 */
mluis 2:14a5d6ad92d5 56 #define JOIN_ACCEPT_DELAY1 5000000
mluis 4:37c12dbc8dc7 57
mluis 4:37c12dbc8dc7 58 /*!
mluis 4:37c12dbc8dc7 59 * Join accept receive delay 2 in us
mluis 4:37c12dbc8dc7 60 */
mluis 2:14a5d6ad92d5 61 #define JOIN_ACCEPT_DELAY2 6000000
mluis 2:14a5d6ad92d5 62
mluis 2:14a5d6ad92d5 63 /*!
mluis 2:14a5d6ad92d5 64 * Class A&B maximum receive window delay in us
mluis 2:14a5d6ad92d5 65 */
mluis 2:14a5d6ad92d5 66 #define MAX_RX_WINDOW 3000000
mluis 2:14a5d6ad92d5 67
mluis 2:14a5d6ad92d5 68 /*!
mluis 2:14a5d6ad92d5 69 * Maximum allowed gap for the FCNT field
mluis 2:14a5d6ad92d5 70 */
mluis 2:14a5d6ad92d5 71 #define MAX_FCNT_GAP 16384
mluis 2:14a5d6ad92d5 72
mluis 2:14a5d6ad92d5 73 /*!
mluis 2:14a5d6ad92d5 74 * ADR acknowledgement counter limit
mluis 2:14a5d6ad92d5 75 */
mluis 2:14a5d6ad92d5 76 #define ADR_ACK_LIMIT 64
mluis 2:14a5d6ad92d5 77
mluis 2:14a5d6ad92d5 78 /*!
mluis 2:14a5d6ad92d5 79 * Number of ADR acknowledgement requests before returning to default datarate
mluis 2:14a5d6ad92d5 80 */
mluis 2:14a5d6ad92d5 81 #define ADR_ACK_DELAY 32
mluis 2:14a5d6ad92d5 82
mluis 2:14a5d6ad92d5 83 /*!
mluis 2:14a5d6ad92d5 84 * Number of seconds after the start of the second reception window without
mluis 2:14a5d6ad92d5 85 * receiving an acknowledge.
mluis 4:37c12dbc8dc7 86 * AckTimeout = \ref ACK_TIMEOUT + Random( -\ref ACK_TIMEOUT_RND, \ref ACK_TIMEOUT_RND )
mluis 2:14a5d6ad92d5 87 */
mluis 2:14a5d6ad92d5 88 #define ACK_TIMEOUT 2000000
mluis 2:14a5d6ad92d5 89
mluis 2:14a5d6ad92d5 90 /*!
mluis 2:14a5d6ad92d5 91 * Random number of seconds after the start of the second reception window without
mluis 2:14a5d6ad92d5 92 * receiving an acknowledge
mluis 4:37c12dbc8dc7 93 * AckTimeout = \ref ACK_TIMEOUT + Random( -\ref ACK_TIMEOUT_RND, \ref ACK_TIMEOUT_RND )
mluis 2:14a5d6ad92d5 94 */
mluis 2:14a5d6ad92d5 95 #define ACK_TIMEOUT_RND 1000000
mluis 2:14a5d6ad92d5 96
mluis 2:14a5d6ad92d5 97 /*!
mluis 4:37c12dbc8dc7 98 * Check the Mac layer state every MAC_STATE_CHECK_TIMEOUT in us
mluis 2:14a5d6ad92d5 99 */
mluis 2:14a5d6ad92d5 100 #define MAC_STATE_CHECK_TIMEOUT 1000000
mluis 2:14a5d6ad92d5 101
mluis 2:14a5d6ad92d5 102 /*!
mluis 2:14a5d6ad92d5 103 * Maximum number of times the MAC layer tries to get an acknowledge.
mluis 2:14a5d6ad92d5 104 */
mluis 2:14a5d6ad92d5 105 #define MAX_ACK_RETRIES 8
mluis 2:14a5d6ad92d5 106
mluis 2:14a5d6ad92d5 107 /*!
mluis 4:37c12dbc8dc7 108 * RSSI free threshold [dBm]
mluis 2:14a5d6ad92d5 109 */
mluis 4:37c12dbc8dc7 110 #define RSSI_FREE_TH ( int8_t )( -90 )
mluis 2:14a5d6ad92d5 111
mluis 2:14a5d6ad92d5 112 /*!
mluis 4:37c12dbc8dc7 113 * Frame direction definition for up-link communications
mluis 2:14a5d6ad92d5 114 */
mluis 2:14a5d6ad92d5 115 #define UP_LINK 0
mluis 4:37c12dbc8dc7 116
mluis 4:37c12dbc8dc7 117 /*!
mluis 4:37c12dbc8dc7 118 * Frame direction definition for down-link communications
mluis 4:37c12dbc8dc7 119 */
mluis 2:14a5d6ad92d5 120 #define DOWN_LINK 1
mluis 2:14a5d6ad92d5 121
mluis 2:14a5d6ad92d5 122 /*!
mluis 2:14a5d6ad92d5 123 * Sets the length of the LoRaMAC footer field.
mluis 2:14a5d6ad92d5 124 * Mainly indicates the MIC field length
mluis 2:14a5d6ad92d5 125 */
mluis 2:14a5d6ad92d5 126 #define LORAMAC_MFR_LEN 4
mluis 2:14a5d6ad92d5 127
mluis 2:14a5d6ad92d5 128 /*!
mluis 2:14a5d6ad92d5 129 * Syncword for Private LoRa networks
mluis 2:14a5d6ad92d5 130 */
mluis 2:14a5d6ad92d5 131 #define LORA_MAC_PRIVATE_SYNCWORD 0x12
mluis 2:14a5d6ad92d5 132
mluis 2:14a5d6ad92d5 133 /*!
mluis 2:14a5d6ad92d5 134 * Syncword for Public LoRa networks
mluis 2:14a5d6ad92d5 135 */
mluis 2:14a5d6ad92d5 136 #define LORA_MAC_PUBLIC_SYNCWORD 0x34
mluis 2:14a5d6ad92d5 137
mluis 2:14a5d6ad92d5 138 /*!
mluis 2:14a5d6ad92d5 139 * LoRaMAC event flags
mluis 2:14a5d6ad92d5 140 */
mluis 2:14a5d6ad92d5 141 typedef union
mluis 2:14a5d6ad92d5 142 {
mluis 2:14a5d6ad92d5 143 uint8_t Value;
mluis 2:14a5d6ad92d5 144 struct
mluis 2:14a5d6ad92d5 145 {
mluis 2:14a5d6ad92d5 146 uint8_t Tx : 1;
mluis 2:14a5d6ad92d5 147 uint8_t Rx : 1;
mluis 2:14a5d6ad92d5 148 uint8_t RxData : 1;
mluis 2:14a5d6ad92d5 149 uint8_t Multicast : 1;
mluis 2:14a5d6ad92d5 150 uint8_t RxSlot : 2;
mluis 2:14a5d6ad92d5 151 uint8_t LinkCheck : 1;
mluis 2:14a5d6ad92d5 152 uint8_t JoinAccept : 1;
mluis 2:14a5d6ad92d5 153 }Bits;
mluis 2:14a5d6ad92d5 154 }LoRaMacEventFlags_t;
mluis 2:14a5d6ad92d5 155
mluis 2:14a5d6ad92d5 156 /*!
mluis 2:14a5d6ad92d5 157 * LoRaMAC event information
mluis 2:14a5d6ad92d5 158 */
mluis 2:14a5d6ad92d5 159 typedef struct
mluis 2:14a5d6ad92d5 160 {
mluis 2:14a5d6ad92d5 161 LoRaMacEventInfoStatus_t Status;
mluis 2:14a5d6ad92d5 162 bool TxAckReceived;
mluis 2:14a5d6ad92d5 163 uint8_t TxNbRetries;
mluis 2:14a5d6ad92d5 164 uint8_t TxDatarate;
mluis 2:14a5d6ad92d5 165 uint8_t RxPort;
mluis 2:14a5d6ad92d5 166 uint8_t *RxBuffer;
mluis 2:14a5d6ad92d5 167 uint8_t RxBufferSize;
mluis 2:14a5d6ad92d5 168 int16_t RxRssi;
mluis 2:14a5d6ad92d5 169 uint8_t RxSnr;
mluis 2:14a5d6ad92d5 170 uint16_t Energy;
mluis 2:14a5d6ad92d5 171 uint8_t DemodMargin;
mluis 2:14a5d6ad92d5 172 uint8_t NbGateways;
mluis 2:14a5d6ad92d5 173 }LoRaMacEventInfo_t;
mluis 2:14a5d6ad92d5 174
mluis 2:14a5d6ad92d5 175 /*!
mluis 2:14a5d6ad92d5 176 * LoRaMAC events structure
mluis 2:14a5d6ad92d5 177 * Used to notify upper layers of MAC events
mluis 2:14a5d6ad92d5 178 */
mluis 2:14a5d6ad92d5 179 typedef struct sLoRaMacCallbacks
mluis 2:14a5d6ad92d5 180 {
mluis 2:14a5d6ad92d5 181 /*!
mluis 2:14a5d6ad92d5 182 * MAC layer event callback prototype.
mluis 2:14a5d6ad92d5 183 *
mluis 2:14a5d6ad92d5 184 * \param [IN] flags Bit field indicating the MAC events occurred
mluis 2:14a5d6ad92d5 185 * \param [IN] info Details about MAC events occurred
mluis 2:14a5d6ad92d5 186 */
mluis 2:14a5d6ad92d5 187 void ( *MacEvent )( LoRaMacEventFlags_t *flags, LoRaMacEventInfo_t *info );
mluis 2:14a5d6ad92d5 188 /*!
mluis 2:14a5d6ad92d5 189 * Function callback to get the current battery level
mluis 2:14a5d6ad92d5 190 *
mluis 2:14a5d6ad92d5 191 * \retval batteryLevel Current battery level
mluis 2:14a5d6ad92d5 192 */
mluis 2:14a5d6ad92d5 193 uint8_t ( *GetBatteryLevel )( void );
mluis 2:14a5d6ad92d5 194 }LoRaMacCallbacks_t;
mluis 2:14a5d6ad92d5 195
mluis 2:14a5d6ad92d5 196 /*!
mluis 2:14a5d6ad92d5 197 * LoRaMAC layer initialization
mluis 2:14a5d6ad92d5 198 *
mluis 2:14a5d6ad92d5 199 * \param [IN] callbacks Pointer to a structure defining the LoRaMAC
mluis 2:14a5d6ad92d5 200 * callback functions.
mluis 2:14a5d6ad92d5 201 */
mluis 2:14a5d6ad92d5 202 void LoRaMacInit( LoRaMacCallbacks_t *callbacks );
mluis 2:14a5d6ad92d5 203
mluis 2:14a5d6ad92d5 204 /*!
mluis 2:14a5d6ad92d5 205 * Enables/Disables the ADR (Adaptive Data Rate)
mluis 2:14a5d6ad92d5 206 *
mluis 2:14a5d6ad92d5 207 * \param [IN] enable [true: ADR ON, false: ADR OFF]
mluis 2:14a5d6ad92d5 208 */
mluis 2:14a5d6ad92d5 209 void LoRaMacSetAdrOn( bool enable );
mluis 2:14a5d6ad92d5 210
mluis 2:14a5d6ad92d5 211 /*!
mluis 2:14a5d6ad92d5 212 * Initializes the network IDs. Device address,
mluis 2:14a5d6ad92d5 213 * network session AES128 key and application session AES128 key.
mluis 2:14a5d6ad92d5 214 *
mluis 2:14a5d6ad92d5 215 * \remark To be only used when Over-the-Air activation isn't used.
mluis 2:14a5d6ad92d5 216 *
mluis 2:14a5d6ad92d5 217 * \param [IN] netID 24 bits network identifier
mluis 2:14a5d6ad92d5 218 * ( provided by network operator )
mluis 2:14a5d6ad92d5 219 * \param [IN] devAddr 32 bits device address on the network
mluis 2:14a5d6ad92d5 220 * (must be unique to the network)
mluis 2:14a5d6ad92d5 221 * \param [IN] nwkSKey Pointer to the network session AES128 key array
mluis 2:14a5d6ad92d5 222 * ( 16 bytes )
mluis 2:14a5d6ad92d5 223 * \param [IN] appSKey Pointer to the application session AES128 key array
mluis 2:14a5d6ad92d5 224 * ( 16 bytes )
mluis 2:14a5d6ad92d5 225 */
mluis 2:14a5d6ad92d5 226 void LoRaMacInitNwkIds( uint32_t netID, uint32_t devAddr, uint8_t *nwkSKey, uint8_t *appSKey );
mluis 2:14a5d6ad92d5 227
mluis 2:14a5d6ad92d5 228 /*
mluis 2:14a5d6ad92d5 229 * Wrapper function which calls \ref LoRaMacMulticastChannelLink.
mluis 2:14a5d6ad92d5 230 */
mluis 2:14a5d6ad92d5 231 void LoRaMacMulticastChannelAdd( MulticastParams_t *channelParam );
mluis 2:14a5d6ad92d5 232
mluis 2:14a5d6ad92d5 233 /*
mluis 2:14a5d6ad92d5 234 * Wrapper function which calls \ref LoRaMacMulticastChannelUnlink.
mluis 2:14a5d6ad92d5 235 */
mluis 2:14a5d6ad92d5 236 void LoRaMacMulticastChannelRemove( MulticastParams_t *channelParam );
mluis 2:14a5d6ad92d5 237
mluis 2:14a5d6ad92d5 238 /*!
mluis 2:14a5d6ad92d5 239 * Initiates the Over-the-Air activation
mluis 2:14a5d6ad92d5 240 *
mluis 2:14a5d6ad92d5 241 * \param [IN] devEui Pointer to the device EUI array ( 8 bytes )
mluis 2:14a5d6ad92d5 242 * \param [IN] appEui Pointer to the application EUI array ( 8 bytes )
mluis 2:14a5d6ad92d5 243 * \param [IN] appKey Pointer to the application AES128 key array ( 16 bytes )
mluis 2:14a5d6ad92d5 244 *
mluis 2:14a5d6ad92d5 245 * \retval status [0: OK, 1: Tx error, 2: Already joined a network]
mluis 2:14a5d6ad92d5 246 */
mluis 2:14a5d6ad92d5 247 uint8_t LoRaMacJoinReq( uint8_t *devEui, uint8_t *appEui, uint8_t *appKey );
mluis 2:14a5d6ad92d5 248
mluis 2:14a5d6ad92d5 249 /*!
mluis 2:14a5d6ad92d5 250 * Sends a LinkCheckReq MAC command on the next uplink frame
mluis 2:14a5d6ad92d5 251 *
mluis 2:14a5d6ad92d5 252 * \retval status Function status [0: OK, 1: Busy]
mluis 2:14a5d6ad92d5 253 */
mluis 2:14a5d6ad92d5 254 uint8_t LoRaMacLinkCheckReq( void );
mluis 2:14a5d6ad92d5 255
mluis 2:14a5d6ad92d5 256 /*!
mluis 2:14a5d6ad92d5 257 * LoRaMAC layer send frame
mluis 2:14a5d6ad92d5 258 *
mluis 2:14a5d6ad92d5 259 * \param [IN] fPort MAC payload port (must be > 0)
mluis 2:14a5d6ad92d5 260 * \param [IN] fBuffer MAC data buffer to be sent
mluis 2:14a5d6ad92d5 261 * \param [IN] fBufferSize MAC data buffer size
mluis 2:14a5d6ad92d5 262 *
mluis 2:14a5d6ad92d5 263 * \retval status [0: OK, 1: Busy, 2: No network joined,
mluis 2:14a5d6ad92d5 264 * 3: Length or port error, 4: Unknown MAC command
mluis 2:14a5d6ad92d5 265 * 5: Unable to find a free channel
mluis 2:14a5d6ad92d5 266 * 6: Device switched off]
mluis 2:14a5d6ad92d5 267 */
mluis 2:14a5d6ad92d5 268 uint8_t LoRaMacSendFrame( uint8_t fPort, void *fBuffer, uint16_t fBufferSize );
mluis 2:14a5d6ad92d5 269
mluis 2:14a5d6ad92d5 270 /*!
mluis 2:14a5d6ad92d5 271 * LoRaMAC layer send frame
mluis 2:14a5d6ad92d5 272 *
mluis 2:14a5d6ad92d5 273 * \param [IN] fPort MAC payload port (must be > 0)
mluis 2:14a5d6ad92d5 274 * \param [IN] fBuffer MAC data buffer to be sent
mluis 2:14a5d6ad92d5 275 * \param [IN] fBufferSize MAC data buffer size
mluis 2:14a5d6ad92d5 276 * \param [IN] fBufferSize MAC data buffer size
mluis 2:14a5d6ad92d5 277 * \param [IN] nbRetries Number of retries to receive the acknowledgement
mluis 2:14a5d6ad92d5 278 *
mluis 2:14a5d6ad92d5 279 * \retval status [0: OK, 1: Busy, 2: No network joined,
mluis 2:14a5d6ad92d5 280 * 3: Length or port error, 4: Unknown MAC command
mluis 2:14a5d6ad92d5 281 * 5: Unable to find a free channel
mluis 2:14a5d6ad92d5 282 * 6: Device switched off]
mluis 2:14a5d6ad92d5 283 */
mluis 2:14a5d6ad92d5 284 uint8_t LoRaMacSendConfirmedFrame( uint8_t fPort, void *fBuffer, uint16_t fBufferSize, uint8_t nbRetries );
mluis 2:14a5d6ad92d5 285
mluis 2:14a5d6ad92d5 286 /*!
mluis 2:14a5d6ad92d5 287 * ============================================================================
mluis 2:14a5d6ad92d5 288 * = LoRaMac test functions =
mluis 2:14a5d6ad92d5 289 * ============================================================================
mluis 2:14a5d6ad92d5 290 */
mluis 2:14a5d6ad92d5 291
mluis 2:14a5d6ad92d5 292 /*!
mluis 2:14a5d6ad92d5 293 * LoRaMAC layer generic send frame
mluis 2:14a5d6ad92d5 294 *
mluis 2:14a5d6ad92d5 295 * \param [IN] macHdr MAC header field
mluis 2:14a5d6ad92d5 296 * \param [IN] fOpts MAC commands buffer
mluis 2:14a5d6ad92d5 297 * \param [IN] fPort MAC payload port
mluis 2:14a5d6ad92d5 298 * \param [IN] fBuffer MAC data buffer to be sent
mluis 2:14a5d6ad92d5 299 * \param [IN] fBufferSize MAC data buffer size
mluis 2:14a5d6ad92d5 300 * \retval status [0: OK, 1: Busy, 2: No network joined,
mluis 2:14a5d6ad92d5 301 * 3: Length or port error, 4: Unknown MAC command
mluis 2:14a5d6ad92d5 302 * 5: Unable to find a free channel
mluis 2:14a5d6ad92d5 303 * 6: Device switched off]
mluis 2:14a5d6ad92d5 304 */
mluis 2:14a5d6ad92d5 305 uint8_t LoRaMacSend( LoRaMacHeader_t *macHdr, uint8_t *fOpts, uint8_t fPort, void *fBuffer, uint16_t fBufferSize );
mluis 2:14a5d6ad92d5 306
mluis 2:14a5d6ad92d5 307 /*!
mluis 2:14a5d6ad92d5 308 * LoRaMAC layer frame buffer initialization.
mluis 2:14a5d6ad92d5 309 *
mluis 2:14a5d6ad92d5 310 * \param [IN] channel Channel parameters
mluis 2:14a5d6ad92d5 311 * \param [IN] macHdr MAC header field
mluis 2:14a5d6ad92d5 312 * \param [IN] fCtrl MAC frame control field
mluis 2:14a5d6ad92d5 313 * \param [IN] fOpts MAC commands buffer
mluis 2:14a5d6ad92d5 314 * \param [IN] fPort MAC payload port
mluis 2:14a5d6ad92d5 315 * \param [IN] fBuffer MAC data buffer to be sent
mluis 2:14a5d6ad92d5 316 * \param [IN] fBufferSize MAC data buffer size
mluis 2:14a5d6ad92d5 317 * \retval status [0: OK, 1: N/A, 2: No network joined,
mluis 2:14a5d6ad92d5 318 * 3: Length or port error, 4: Unknown MAC command]
mluis 2:14a5d6ad92d5 319 */
mluis 2:14a5d6ad92d5 320 uint8_t LoRaMacPrepareFrame( ChannelParams_t channel,LoRaMacHeader_t *macHdr, LoRaMacFrameCtrl_t *fCtrl, uint8_t *fOpts, uint8_t fPort, void *fBuffer, uint16_t fBufferSize );
mluis 2:14a5d6ad92d5 321
mluis 2:14a5d6ad92d5 322 /*!
mluis 2:14a5d6ad92d5 323 * LoRaMAC layer prepared frame buffer transmission with channel specification
mluis 2:14a5d6ad92d5 324 *
mluis 2:14a5d6ad92d5 325 * \remark LoRaMacPrepareFrame must be called at least once before calling this
mluis 2:14a5d6ad92d5 326 * function.
mluis 2:14a5d6ad92d5 327 *
mluis 2:14a5d6ad92d5 328 * \param [IN] channel Channel parameters
mluis 2:14a5d6ad92d5 329 * \retval status [0: OK, 1: Busy]
mluis 2:14a5d6ad92d5 330 */
mluis 2:14a5d6ad92d5 331 uint8_t LoRaMacSendFrameOnChannel( ChannelParams_t channel );
mluis 2:14a5d6ad92d5 332
mluis 2:14a5d6ad92d5 333 /*!
mluis 2:14a5d6ad92d5 334 * LoRaMAC layer generic send frame with channel specification
mluis 2:14a5d6ad92d5 335 *
mluis 2:14a5d6ad92d5 336 * \param [IN] channel Channel parameters
mluis 2:14a5d6ad92d5 337 * \param [IN] macHdr MAC header field
mluis 2:14a5d6ad92d5 338 * \param [IN] fCtrl MAC frame control field
mluis 2:14a5d6ad92d5 339 * \param [IN] fOpts MAC commands buffer
mluis 2:14a5d6ad92d5 340 * \param [IN] fPort MAC payload port
mluis 2:14a5d6ad92d5 341 * \param [IN] fBuffer MAC data buffer to be sent
mluis 2:14a5d6ad92d5 342 * \param [IN] fBufferSize MAC data buffer size
mluis 2:14a5d6ad92d5 343 * \retval status [0: OK, 1: Busy, 2: No network joined,
mluis 2:14a5d6ad92d5 344 * 3: Length or port error, 4: Unknown MAC command]
mluis 2:14a5d6ad92d5 345 */
mluis 2:14a5d6ad92d5 346 uint8_t LoRaMacSendOnChannel( ChannelParams_t channel, LoRaMacHeader_t *macHdr, LoRaMacFrameCtrl_t *fCtrl, uint8_t *fOpts, uint8_t fPort, void *fBuffer, uint16_t fBufferSize );
mluis 2:14a5d6ad92d5 347
mluis 2:14a5d6ad92d5 348 /*!
mluis 2:14a5d6ad92d5 349 * ============================================================================
mluis 2:14a5d6ad92d5 350 * = LoRaMac setup functions =
mluis 2:14a5d6ad92d5 351 * ============================================================================
mluis 2:14a5d6ad92d5 352 */
mluis 2:14a5d6ad92d5 353
mluis 2:14a5d6ad92d5 354 /*
mluis 2:14a5d6ad92d5 355 * Wrapper function which calls \ref LoRaMacMibSetRequestConfirm to
mluis 2:14a5d6ad92d5 356 * set the LoRaWan device class.
mluis 2:14a5d6ad92d5 357 */
mluis 2:14a5d6ad92d5 358 void LoRaMacSetDeviceClass( DeviceClass_t deviceClass );
mluis 2:14a5d6ad92d5 359
mluis 2:14a5d6ad92d5 360 /*
mluis 2:14a5d6ad92d5 361 * Wrapper function which calls \ref LoRaMacMibSetRequestConfirm to
mluis 2:14a5d6ad92d5 362 * set the network type to public or private.
mluis 2:14a5d6ad92d5 363 */
mluis 2:14a5d6ad92d5 364 void LoRaMacSetPublicNetwork( bool enable );
mluis 2:14a5d6ad92d5 365
mluis 2:14a5d6ad92d5 366 /*
mluis 2:14a5d6ad92d5 367 * Wrapper function which calls \ref LoRaMacChannelAdd.
mluis 2:14a5d6ad92d5 368 */
mluis 2:14a5d6ad92d5 369 void LoRaMacSetChannel( uint8_t id, ChannelParams_t params );
mluis 2:14a5d6ad92d5 370
mluis 2:14a5d6ad92d5 371 /*
mluis 2:14a5d6ad92d5 372 * Wrapper function which calls \ref LoRaMacMibSetRequestConfirm to
mluis 2:14a5d6ad92d5 373 * set the receive window 2 channel.
mluis 2:14a5d6ad92d5 374 */
mluis 2:14a5d6ad92d5 375 void LoRaMacSetRx2Channel( Rx2ChannelParams_t param );
mluis 2:14a5d6ad92d5 376
mluis 2:14a5d6ad92d5 377 /*!
mluis 2:14a5d6ad92d5 378 * Sets channels tx output power
mluis 2:14a5d6ad92d5 379 *
mluis 2:14a5d6ad92d5 380 * \param [IN] txPower [TX_POWER_20_DBM, TX_POWER_14_DBM,
mluis 2:14a5d6ad92d5 381 TX_POWER_11_DBM, TX_POWER_08_DBM,
mluis 2:14a5d6ad92d5 382 TX_POWER_05_DBM, TX_POWER_02_DBM]
mluis 2:14a5d6ad92d5 383 */
mluis 2:14a5d6ad92d5 384 void LoRaMacSetChannelsTxPower( int8_t txPower );
mluis 2:14a5d6ad92d5 385
mluis 2:14a5d6ad92d5 386 /*!
mluis 2:14a5d6ad92d5 387 * Sets channels datarate
mluis 2:14a5d6ad92d5 388 *
mluis 2:14a5d6ad92d5 389 * \param [IN] datarate eu868 - [DR_0, DR_1, DR_2, DR_3, DR_4, DR_5, DR_6, DR_7]
mluis 2:14a5d6ad92d5 390 * us915 - [DR_0, DR_1, DR_2, DR_3, DR_4]
mluis 2:14a5d6ad92d5 391 */
mluis 2:14a5d6ad92d5 392 void LoRaMacSetChannelsDatarate( int8_t datarate );
mluis 2:14a5d6ad92d5 393
mluis 2:14a5d6ad92d5 394 /*
mluis 2:14a5d6ad92d5 395 * Wrapper function which calls \ref LoRaMacMibSetRequestConfirm to
mluis 2:14a5d6ad92d5 396 * set the channels mask.
mluis 2:14a5d6ad92d5 397 */
mluis 2:14a5d6ad92d5 398 void LoRaMacSetChannelsMask( uint16_t *mask );
mluis 2:14a5d6ad92d5 399
mluis 2:14a5d6ad92d5 400 /*
mluis 2:14a5d6ad92d5 401 * Wrapper function which calls \ref LoRaMacMibSetRequestConfirm to
mluis 2:14a5d6ad92d5 402 * set the number of repetitions on a channel.
mluis 2:14a5d6ad92d5 403 */
mluis 2:14a5d6ad92d5 404 void LoRaMacSetChannelsNbRep( uint8_t nbRep );
mluis 2:14a5d6ad92d5 405
mluis 2:14a5d6ad92d5 406 /*
mluis 2:14a5d6ad92d5 407 * Wrapper function which calls \ref LoRaMacMibSetRequestConfirm to
mluis 2:14a5d6ad92d5 408 * set the maximum receive window duration in [us].
mluis 2:14a5d6ad92d5 409 */
mluis 2:14a5d6ad92d5 410 void LoRaMacSetMaxRxWindow( uint32_t delay );
mluis 2:14a5d6ad92d5 411
mluis 2:14a5d6ad92d5 412 /*
mluis 2:14a5d6ad92d5 413 * Wrapper function which calls \ref LoRaMacMibSetRequestConfirm to
mluis 2:14a5d6ad92d5 414 * set the receive delay 1 in [us].
mluis 2:14a5d6ad92d5 415 */
mluis 2:14a5d6ad92d5 416 void LoRaMacSetReceiveDelay1( uint32_t delay );
mluis 2:14a5d6ad92d5 417
mluis 2:14a5d6ad92d5 418 /*
mluis 2:14a5d6ad92d5 419 * Wrapper function which calls \ref LoRaMacMibSetRequestConfirm to
mluis 2:14a5d6ad92d5 420 * set the receive delay 2 in [us].
mluis 2:14a5d6ad92d5 421 */
mluis 2:14a5d6ad92d5 422 void LoRaMacSetReceiveDelay2( uint32_t delay );
mluis 2:14a5d6ad92d5 423
mluis 2:14a5d6ad92d5 424 /*
mluis 2:14a5d6ad92d5 425 * Wrapper function which calls \ref LoRaMacMibSetRequestConfirm to
mluis 2:14a5d6ad92d5 426 * set the join accept delay 1 in [us].
mluis 2:14a5d6ad92d5 427 */
mluis 2:14a5d6ad92d5 428 void LoRaMacSetJoinAcceptDelay1( uint32_t delay );
mluis 2:14a5d6ad92d5 429
mluis 2:14a5d6ad92d5 430 /*
mluis 2:14a5d6ad92d5 431 * Wrapper function which calls \ref LoRaMacMibSetRequestConfirm to
mluis 2:14a5d6ad92d5 432 * set the join accept delay 2 in [us].
mluis 2:14a5d6ad92d5 433 */
mluis 2:14a5d6ad92d5 434 void LoRaMacSetJoinAcceptDelay2( uint32_t delay );
mluis 2:14a5d6ad92d5 435
mluis 2:14a5d6ad92d5 436 /*
mluis 2:14a5d6ad92d5 437 * Wrapper function which calls \ref LoRaMacMibGetRequestConfirm to
mluis 2:14a5d6ad92d5 438 * get the up-link counter.
mluis 2:14a5d6ad92d5 439 */
mluis 2:14a5d6ad92d5 440 uint32_t LoRaMacGetUpLinkCounter( void );
mluis 2:14a5d6ad92d5 441
mluis 2:14a5d6ad92d5 442 /*
mluis 2:14a5d6ad92d5 443 * Wrapper function which calls \ref LoRaMacMibGetRequestConfirm to
mluis 2:14a5d6ad92d5 444 * get the down-link counter.
mluis 2:14a5d6ad92d5 445 */
mluis 2:14a5d6ad92d5 446 uint32_t LoRaMacGetDownLinkCounter( void );
mluis 2:14a5d6ad92d5 447
mluis 2:14a5d6ad92d5 448 /*
mluis 2:14a5d6ad92d5 449 * ============================================================================
mluis 2:14a5d6ad92d5 450 * = LoRaMac test functions =
mluis 2:14a5d6ad92d5 451 * ============================================================================
mluis 2:14a5d6ad92d5 452 */
mluis 2:14a5d6ad92d5 453
mluis 2:14a5d6ad92d5 454 /*!
mluis 2:14a5d6ad92d5 455 * Disables/Enables the duty cycle enforcement (EU868)
mluis 2:14a5d6ad92d5 456 *
mluis 2:14a5d6ad92d5 457 * \param [IN] enable - Enabled or disables the duty cycle
mluis 2:14a5d6ad92d5 458 */
mluis 2:14a5d6ad92d5 459 void LoRaMacTestSetDutyCycleOn( bool enable );
mluis 2:14a5d6ad92d5 460
mluis 2:14a5d6ad92d5 461 /*!
mluis 2:14a5d6ad92d5 462 * Disables/Enables the reception windows opening
mluis 2:14a5d6ad92d5 463 *
mluis 2:14a5d6ad92d5 464 * \param [IN] enable [true: enable, false: disable]
mluis 2:14a5d6ad92d5 465 */
mluis 2:14a5d6ad92d5 466 void LoRaMacTestRxWindowsOn( bool enable );
mluis 2:14a5d6ad92d5 467
mluis 2:14a5d6ad92d5 468 /*!
mluis 2:14a5d6ad92d5 469 * Enables the MIC field test
mluis 2:14a5d6ad92d5 470 *
mluis 2:14a5d6ad92d5 471 * \param [IN] upLinkCounter Fixed Tx packet counter value
mluis 2:14a5d6ad92d5 472 */
mluis 2:14a5d6ad92d5 473 void LoRaMacTestSetMic( uint16_t upLinkCounter );
mluis 2:14a5d6ad92d5 474
mluis 2:14a5d6ad92d5 475 #endif /* __LORAMAC_API_V3_H__ */