20171208

Fork of LoRaWAN-lib by Semtech

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LoRaMac.h Source File

LoRaMac.h

Go to the documentation of this file.
00001 /*!
00002  * \file      LoRaMac.h
00003  *
00004  * \brief     LoRa MAC layer implementation
00005  *
00006  * \copyright Revised BSD License, see section \ref LICENSE.
00007  *
00008  * \code
00009  *                ______                              _
00010  *               / _____)             _              | |
00011  *              ( (____  _____ ____ _| |_ _____  ____| |__
00012  *               \____ \| ___ |    (_   _) ___ |/ ___)  _ \
00013  *               _____) ) ____| | | || |_| ____( (___| | | |
00014  *              (______/|_____)_|_|_| \__)_____)\____)_| |_|
00015  *              (C)2013 Semtech
00016  *
00017  *               ___ _____ _   ___ _  _____ ___  ___  ___ ___
00018  *              / __|_   _/_\ / __| |/ / __/ _ \| _ \/ __| __|
00019  *              \__ \ | |/ _ \ (__| ' <| _| (_) |   / (__| _|
00020  *              |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
00021  *              embedded.connectivity.solutions===============
00022  *
00023  * \endcode
00024  *
00025  * \author    Miguel Luis ( Semtech )
00026  *
00027  * \author    Gregory Cristian ( Semtech )
00028  *
00029  * \author    Daniel Jäckle ( STACKFORCE )
00030  *
00031  * \defgroup  LORAMAC LoRa MAC layer implementation
00032  *            This module specifies the API implementation of the LoRaMAC layer.
00033  *            This is a placeholder for a detailed description of the LoRaMac
00034  *            layer and the supported features.
00035  * \{
00036  *
00037  * \example   classA/LoRaMote/main.c
00038  *            LoRaWAN class A application example for the LoRaMote.
00039  *
00040  * \example   classB/LoRaMote/main.c
00041  *            LoRaWAN class B application example for the LoRaMote.
00042  *
00043  * \example   classC/LoRaMote/main.c
00044  *            LoRaWAN class C application example for the LoRaMote.
00045  */
00046 #ifndef __LORAMAC_H__
00047 #define __LORAMAC_H__
00048 
00049 // Includes board dependent definitions such as channels frequencies
00050 #include "LoRaMac-definitions.h"
00051 
00052 /*!
00053  * Beacon interval in ms
00054  */
00055 #define BEACON_INTERVAL                             128000
00056 
00057 /*!
00058  * Class A&B receive delay 1 in ms
00059  */
00060 #define RECEIVE_DELAY1                              1000
00061 
00062 /*!
00063  * Class A&B receive delay 2 in ms
00064  */
00065 #define RECEIVE_DELAY2                              2000
00066 
00067 /*!
00068  * Join accept receive delay 1 in ms
00069  */
00070 #define JOIN_ACCEPT_DELAY1                          5000
00071 
00072 /*!
00073  * Join accept receive delay 2 in ms
00074  */
00075 #define JOIN_ACCEPT_DELAY2                          6000
00076 
00077 /*!
00078  * Class A&B maximum receive window delay in ms
00079  */
00080 #define MAX_RX_WINDOW                               3000
00081 
00082 /*!
00083  * Maximum allowed gap for the FCNT field
00084  */
00085 #define MAX_FCNT_GAP                                16384
00086 
00087 /*!
00088  * ADR acknowledgement counter limit
00089  */
00090 #define ADR_ACK_LIMIT                               64
00091 
00092 /*!
00093  * Number of ADR acknowledgement requests before returning to default datarate
00094  */
00095 #define ADR_ACK_DELAY                               32
00096 
00097 /*!
00098  * Number of seconds after the start of the second reception window without
00099  * receiving an acknowledge.
00100  * AckTimeout = \ref ACK_TIMEOUT + Random( -\ref ACK_TIMEOUT_RND, \ref ACK_TIMEOUT_RND )
00101  */
00102 #define ACK_TIMEOUT                                 2000
00103 
00104 /*!
00105  * Random number of seconds after the start of the second reception window without
00106  * receiving an acknowledge
00107  * AckTimeout = \ref ACK_TIMEOUT + Random( -\ref ACK_TIMEOUT_RND, \ref ACK_TIMEOUT_RND )
00108  */
00109 #define ACK_TIMEOUT_RND                             1000
00110 
00111 /*!
00112  * Check the Mac layer state every MAC_STATE_CHECK_TIMEOUT in ms
00113  */
00114 #define MAC_STATE_CHECK_TIMEOUT                     1000
00115 
00116 /*!
00117  * Maximum number of times the MAC layer tries to get an acknowledge.
00118  */
00119 #define MAX_ACK_RETRIES                             8
00120 
00121 /*!
00122  * RSSI free threshold [dBm]
00123  */
00124 #define RSSI_FREE_TH                                ( int8_t )( -90 )
00125 
00126 /*!
00127  * Frame direction definition for up-link communications
00128  */
00129 #define UP_LINK                                     0
00130 
00131 /*!
00132  * Frame direction definition for down-link communications
00133  */
00134 #define DOWN_LINK                                   1
00135 
00136 /*!
00137  * Sets the length of the LoRaMAC footer field.
00138  * Mainly indicates the MIC field length
00139  */
00140 #define LORAMAC_MFR_LEN                             4
00141 
00142 /*!
00143  * LoRaWAN devices classes definition
00144  */
00145 typedef enum eDeviceClass 
00146 {
00147     /*!
00148      * LoRaWAN device class A
00149      *
00150      * LoRaWAN Specification V1.0.1, chapter 3ff
00151      */
00152     CLASS_A ,
00153     /*!
00154      * LoRaWAN device class B
00155      *
00156      * LoRaWAN Specification V1.0.1, chapter 8ff
00157      */
00158     CLASS_B ,
00159     /*!
00160      * LoRaWAN device class C
00161      *
00162      * LoRaWAN Specification V1.0.1, chapter 17ff
00163      */
00164     CLASS_C ,
00165 }DeviceClass_t ;
00166 
00167 /*!
00168  * LoRaMAC channels parameters definition
00169  */
00170 typedef union uDrRange 
00171 {
00172     /*!
00173      * Byte-access to the bits
00174      */
00175     int8_t Value ;
00176     /*!
00177      * Structure to store the minimum and the maximum datarate
00178      */
00179     struct sFields 
00180     {
00181          /*!
00182          * Minimum data rate
00183          *
00184          * EU868 - [DR_0, DR_1, DR_2, DR_3, DR_4, DR_5, DR_6, DR_7]
00185          *
00186          * US915 - [DR_0, DR_1, DR_2, DR_3, DR_4]
00187          */
00188         int8_t Min  : 4;
00189         /*!
00190          * Maximum data rate
00191          *
00192          * EU868 - [DR_0, DR_1, DR_2, DR_3, DR_4, DR_5, DR_6, DR_7]
00193          *
00194          * US915 - [DR_0, DR_1, DR_2, DR_3, DR_4]
00195          */
00196         int8_t Max  : 4;
00197     }Fields;
00198 }DrRange_t ;
00199 
00200 /*!
00201  * LoRaMAC band parameters definition
00202  */
00203 typedef struct sBand 
00204 {
00205     /*!
00206      * Duty cycle
00207      */
00208     uint16_t DCycle ;
00209     /*!
00210      * Maximum Tx power
00211      */
00212     int8_t TxMaxPower ;
00213     /*!
00214      * Time stamp of the last Tx frame
00215      */
00216     TimerTime_t LastTxDoneTime ;
00217     /*!
00218      * Holds the time where the device is off
00219      */
00220     TimerTime_t TimeOff ;
00221 }Band_t ;
00222 
00223 /*!
00224  * LoRaMAC channel definition
00225  */
00226 typedef struct sChannelParams 
00227 {
00228     /*!
00229      * Frequency in Hz
00230      */
00231     uint32_t Frequency ;
00232     /*!
00233      * Data rate definition
00234      */
00235     DrRange_t  DrRange ;
00236     /*!
00237      * Band index
00238      */
00239     uint8_t Band ;
00240 }ChannelParams_t ;
00241 
00242 /*!
00243  * LoRaMAC receive window 2 channel parameters
00244  */
00245 typedef struct sRx2ChannelParams 
00246 {
00247     /*!
00248      * Frequency in Hz
00249      */
00250     uint32_t Frequency ;
00251     /*!
00252      * Data rate
00253      *
00254      * EU868 - [DR_0, DR_1, DR_2, DR_3, DR_4, DR_5, DR_6, DR_7]
00255      *
00256      * US915 - [DR_8, DR_9, DR_10, DR_11, DR_12, DR_13]
00257      */
00258     uint8_t  Datarate ;
00259 }Rx2ChannelParams_t ;
00260 
00261 /*!
00262  * Global MAC layer parameters
00263  */
00264 typedef struct sLoRaMacParams 
00265 {
00266     /*!
00267      * Channels TX power
00268      */
00269     int8_t ChannelsTxPower ;
00270     /*!
00271      * Channels data rate
00272      */
00273     int8_t ChannelsDatarate ;
00274     /*!
00275      * System overall timing error in milliseconds. 
00276      * [-SystemMaxRxError : +SystemMaxRxError]
00277      * Default: +/-10 ms
00278      */
00279     uint32_t SystemMaxRxError ;
00280     /*!
00281      * Minimum required number of symbols to detect an Rx frame
00282      * Default: 6 symbols
00283      */
00284     uint8_t MinRxSymbols ;
00285     /*!
00286      * LoRaMac maximum time a reception window stays open
00287      */
00288     uint32_t MaxRxWindow ;
00289     /*!
00290      * Receive delay 1
00291      */
00292     uint32_t ReceiveDelay1 ;
00293     /*!
00294      * Receive delay 2
00295      */
00296     uint32_t ReceiveDelay2 ;
00297     /*!
00298      * Join accept delay 1
00299      */
00300     uint32_t JoinAcceptDelay1 ;
00301     /*!
00302      * Join accept delay 1
00303      */
00304     uint32_t JoinAcceptDelay2 ;
00305     /*!
00306      * Number of uplink messages repetitions [1:15] (unconfirmed messages only)
00307      */
00308     uint8_t ChannelsNbRep ;
00309     /*!
00310      * Datarate offset between uplink and downlink on first window
00311      */
00312     uint8_t Rx1DrOffset ;
00313     /*!
00314      * LoRaMAC 2nd reception window settings
00315      */
00316     Rx2ChannelParams_t  Rx2Channel ;
00317     /*!
00318      * Mask indicating which channels are enabled
00319      */
00320     uint16_t ChannelsMask [6];
00321 }LoRaMacParams_t ;
00322 
00323 /*!
00324  * LoRaMAC multicast channel parameter
00325  */
00326 typedef struct sMulticastParams 
00327 {
00328     /*!
00329      * Address
00330      */
00331     uint32_t Address ;
00332     /*!
00333      * Network session key
00334      */
00335     uint8_t NwkSKey [16];
00336     /*!
00337      * Application session key
00338      */
00339     uint8_t AppSKey [16];
00340     /*!
00341      * Downlink counter
00342      */
00343     uint32_t DownLinkCounter ;
00344     /*!
00345      * Reference pointer to the next multicast channel parameters in the list
00346      */
00347     struct sMulticastParams  *Next ;
00348 }MulticastParams_t ;
00349 
00350 /*!
00351  * LoRaMAC frame types
00352  *
00353  * LoRaWAN Specification V1.0.1, chapter 4.2.1, table 1
00354  */
00355 typedef enum eLoRaMacFrameType 
00356 {
00357     /*!
00358      * LoRaMAC join request frame
00359      */
00360     FRAME_TYPE_JOIN_REQ               = 0x00,
00361     /*!
00362      * LoRaMAC join accept frame
00363      */
00364     FRAME_TYPE_JOIN_ACCEPT            = 0x01,
00365     /*!
00366      * LoRaMAC unconfirmed up-link frame
00367      */
00368     FRAME_TYPE_DATA_UNCONFIRMED_UP    = 0x02,
00369     /*!
00370      * LoRaMAC unconfirmed down-link frame
00371      */
00372     FRAME_TYPE_DATA_UNCONFIRMED_DOWN  = 0x03,
00373     /*!
00374      * LoRaMAC confirmed up-link frame
00375      */
00376     FRAME_TYPE_DATA_CONFIRMED_UP      = 0x04,
00377     /*!
00378      * LoRaMAC confirmed down-link frame
00379      */
00380     FRAME_TYPE_DATA_CONFIRMED_DOWN    = 0x05,
00381     /*!
00382      * LoRaMAC RFU frame
00383      */
00384     FRAME_TYPE_RFU                    = 0x06,
00385     /*!
00386      * LoRaMAC proprietary frame
00387      */
00388     FRAME_TYPE_PROPRIETARY            = 0x07,
00389 }LoRaMacFrameType_t ;
00390 
00391 /*!
00392  * LoRaMAC mote MAC commands
00393  *
00394  * LoRaWAN Specification V1.0.1, chapter 5, table 4
00395  */
00396 typedef enum eLoRaMacMoteCmd 
00397 {
00398     /*!
00399      * LinkCheckReq
00400      */
00401     MOTE_MAC_LINK_CHECK_REQ           = 0x02,
00402     /*!
00403      * LinkADRAns
00404      */
00405     MOTE_MAC_LINK_ADR_ANS             = 0x03,
00406     /*!
00407      * DutyCycleAns
00408      */
00409     MOTE_MAC_DUTY_CYCLE_ANS           = 0x04,
00410     /*!
00411      * RXParamSetupAns
00412      */
00413     MOTE_MAC_RX_PARAM_SETUP_ANS       = 0x05,
00414     /*!
00415      * DevStatusAns
00416      */
00417     MOTE_MAC_DEV_STATUS_ANS           = 0x06,
00418     /*!
00419      * NewChannelAns
00420      */
00421     MOTE_MAC_NEW_CHANNEL_ANS          = 0x07,
00422     /*!
00423      * RXTimingSetupAns
00424      */
00425     MOTE_MAC_RX_TIMING_SETUP_ANS      = 0x08,
00426 }LoRaMacMoteCmd_t ;
00427 
00428 /*!
00429  * LoRaMAC server MAC commands
00430  *
00431  * LoRaWAN Specification V1.0.1 chapter 5, table 4
00432  */
00433 typedef enum eLoRaMacSrvCmd 
00434 {
00435     /*!
00436      * LinkCheckAns
00437      */
00438     SRV_MAC_LINK_CHECK_ANS            = 0x02,
00439     /*!
00440      * LinkADRReq
00441      */
00442     SRV_MAC_LINK_ADR_REQ              = 0x03,
00443     /*!
00444      * DutyCycleReq
00445      */
00446     SRV_MAC_DUTY_CYCLE_REQ            = 0x04,
00447     /*!
00448      * RXParamSetupReq
00449      */
00450     SRV_MAC_RX_PARAM_SETUP_REQ        = 0x05,
00451     /*!
00452      * DevStatusReq
00453      */
00454     SRV_MAC_DEV_STATUS_REQ            = 0x06,
00455     /*!
00456      * NewChannelReq
00457      */
00458     SRV_MAC_NEW_CHANNEL_REQ           = 0x07,
00459     /*!
00460      * RXTimingSetupReq
00461      */
00462     SRV_MAC_RX_TIMING_SETUP_REQ       = 0x08,
00463 }LoRaMacSrvCmd_t ;
00464 
00465 /*!
00466  * LoRaMAC Battery level indicator
00467  */
00468 typedef enum eLoRaMacBatteryLevel 
00469 {
00470     /*!
00471      * External power source
00472      */
00473     BAT_LEVEL_EXT_SRC                 = 0x00,
00474     /*!
00475      * Battery level empty
00476      */
00477     BAT_LEVEL_EMPTY                   = 0x01,
00478     /*!
00479      * Battery level full
00480      */
00481     BAT_LEVEL_FULL                    = 0xFE,
00482     /*!
00483      * Battery level - no measurement available
00484      */
00485     BAT_LEVEL_NO_MEASURE              = 0xFF,
00486 }LoRaMacBatteryLevel_t ;
00487 
00488 /*!
00489  * LoRaMAC header field definition (MHDR field)
00490  *
00491  * LoRaWAN Specification V1.0.1, chapter 4.2
00492  */
00493 typedef union uLoRaMacHeader 
00494 {
00495     /*!
00496      * Byte-access to the bits
00497      */
00498     uint8_t Value ;
00499     /*!
00500      * Structure containing single access to header bits
00501      */
00502     struct sHdrBits 
00503     {
00504         /*!
00505          * Major version
00506          */
00507         uint8_t Major            : 2;
00508         /*!
00509          * RFU
00510          */
00511         uint8_t RFU              : 3;
00512         /*!
00513          * Message type
00514          */
00515         uint8_t MType            : 3;
00516     }Bits;
00517 }LoRaMacHeader_t ;
00518 
00519 /*!
00520  * LoRaMAC frame control field definition (FCtrl)
00521  *
00522  * LoRaWAN Specification V1.0.1, chapter 4.3.1
00523  */
00524 typedef union uLoRaMacFrameCtrl 
00525 {
00526     /*!
00527      * Byte-access to the bits
00528      */
00529     uint8_t Value ;
00530     /*!
00531      * Structure containing single access to bits
00532      */
00533     struct sCtrlBits 
00534     {
00535         /*!
00536          * Frame options length
00537          */
00538         uint8_t FOptsLen         : 4;
00539         /*!
00540          * Frame pending bit
00541          */
00542         uint8_t FPending         : 1;
00543         /*!
00544          * Message acknowledge bit
00545          */
00546         uint8_t Ack              : 1;
00547         /*!
00548          * ADR acknowledgment request bit
00549          */
00550         uint8_t AdrAckReq        : 1;
00551         /*!
00552          * ADR control in frame header
00553          */
00554         uint8_t Adr              : 1;
00555     }Bits;
00556 }LoRaMacFrameCtrl_t ;
00557 
00558 /*!
00559  * Enumeration containing the status of the operation of a MAC service
00560  */
00561 typedef enum eLoRaMacEventInfoStatus 
00562 {
00563     /*!
00564      * Service performed successfully
00565      */
00566     LORAMAC_EVENT_INFO_STATUS_OK  = 0,
00567     /*!
00568      * An error occurred during the execution of the service
00569      */
00570     LORAMAC_EVENT_INFO_STATUS_ERROR ,
00571     /*!
00572      * A Tx timeout occurred
00573      */
00574     LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT ,
00575     /*!
00576      * An Rx timeout occurred on receive window 2
00577      */
00578     LORAMAC_EVENT_INFO_STATUS_RX2_TIMEOUT ,
00579     /*!
00580      * An Rx error occurred on receive window 1
00581      */
00582     LORAMAC_EVENT_INFO_STATUS_RX1_ERROR ,
00583     /*!
00584      * An Rx error occurred on receive window 2
00585      */
00586     LORAMAC_EVENT_INFO_STATUS_RX2_ERROR ,
00587     /*!
00588      * An error occurred in the join procedure
00589      */
00590     LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL ,
00591     /*!
00592      * A frame with an invalid downlink counter was received. The
00593      * downlink counter of the frame was equal to the local copy
00594      * of the downlink counter of the node.
00595      */
00596     LORAMAC_EVENT_INFO_STATUS_DOWNLINK_REPEATED ,
00597     /*!
00598      * The MAC could not retransmit a frame since the MAC decreased the datarate. The
00599      * payload size is not applicable for the datarate.
00600      */
00601     LORAMAC_EVENT_INFO_STATUS_TX_DR_PAYLOAD_SIZE_ERROR ,
00602     /*!
00603      * The node has lost MAX_FCNT_GAP or more frames.
00604      */
00605     LORAMAC_EVENT_INFO_STATUS_DOWNLINK_TOO_MANY_FRAMES_LOSS ,
00606     /*!
00607      * An address error occurred
00608      */
00609     LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL ,
00610     /*!
00611      * message integrity check failure
00612      */
00613     LORAMAC_EVENT_INFO_STATUS_MIC_FAIL ,
00614 }LoRaMacEventInfoStatus_t ;
00615 
00616 /*!
00617  * LoRaMac tx/rx operation state
00618  */
00619 typedef union eLoRaMacFlags_t 
00620 {
00621     /*!
00622      * Byte-access to the bits
00623      */
00624     uint8_t Value ;
00625     /*!
00626      * Structure containing single access to bits
00627      */
00628     struct sMacFlagBits 
00629     {
00630         /*!
00631          * MCPS-Req pending
00632          */
00633         uint8_t McpsReq          : 1;
00634         /*!
00635          * MCPS-Ind pending
00636          */
00637         uint8_t McpsInd          : 1;
00638         /*!
00639          * MCPS-Ind pending. Skip indication to the application layer
00640          */
00641         uint8_t McpsIndSkip      : 1;
00642         /*!
00643          * MLME-Req pending
00644          */
00645         uint8_t MlmeReq          : 1;
00646         /*!
00647          * MAC cycle done
00648          */
00649         uint8_t MacDone          : 1;
00650     }Bits;
00651 }LoRaMacFlags_t ;
00652 
00653 /*!
00654  *
00655  * \brief   LoRaMAC data services
00656  *
00657  * \details The following table list the primitives which are supported by the
00658  *          specific MAC data service:
00659  *
00660  * Name                  | Request | Indication | Response | Confirm
00661  * --------------------- | :-----: | :--------: | :------: | :-----:
00662  * \ref MCPS_UNCONFIRMED | YES     | YES        | NO       | YES
00663  * \ref MCPS_CONFIRMED   | YES     | YES        | NO       | YES
00664  * \ref MCPS_MULTICAST   | NO      | YES        | NO       | NO
00665  * \ref MCPS_PROPRIETARY | YES     | YES        | NO       | YES
00666  *
00667  * The following table provides links to the function implementations of the
00668  * related MCPS primitives:
00669  *
00670  * Primitive        | Function
00671  * ---------------- | :---------------------:
00672  * MCPS-Request     | \ref LoRaMacMlmeRequest
00673  * MCPS-Confirm     | MacMcpsConfirm in \ref LoRaMacPrimitives_t
00674  * MCPS-Indication  | MacMcpsIndication in \ref LoRaMacPrimitives_t
00675  */
00676 typedef enum eMcps
00677 {
00678     /*!
00679      * Unconfirmed LoRaMAC frame
00680      */
00681     MCPS_UNCONFIRMED ,
00682     /*!
00683      * Confirmed LoRaMAC frame
00684      */
00685     MCPS_CONFIRMED ,
00686     /*!
00687      * Multicast LoRaMAC frame
00688      */
00689     MCPS_MULTICAST ,
00690     /*!
00691      * Proprietary frame
00692      */
00693     MCPS_PROPRIETARY ,
00694 }Mcps_t;
00695 
00696 /*!
00697  * LoRaMAC MCPS-Request for an unconfirmed frame
00698  */
00699 typedef struct sMcpsReqUnconfirmed 
00700 {
00701     /*!
00702      * Frame port field. Must be set if the payload is not empty. Use the
00703      * application specific frame port values: [1...223]
00704      *
00705      * LoRaWAN Specification V1.0.1, chapter 4.3.2
00706      */
00707     uint8_t fPort ;
00708     /*!
00709      * Pointer to the buffer of the frame payload
00710      */
00711     void *fBuffer ;
00712     /*!
00713      * Size of the frame payload
00714      */
00715     uint16_t fBufferSize ;
00716     /*!
00717      * Uplink datarate, if ADR is off
00718      */
00719     int8_t Datarate ;
00720 }McpsReqUnconfirmed_t ;
00721 
00722 /*!
00723  * LoRaMAC MCPS-Request for a confirmed frame
00724  */
00725 typedef struct sMcpsReqConfirmed 
00726 {
00727     /*!
00728      * Frame port field. Must be set if the payload is not empty. Use the
00729      * application specific frame port values: [1...223]
00730      *
00731      * LoRaWAN Specification V1.0.1, chapter 4.3.2
00732      */
00733     uint8_t fPort ;
00734     /*!
00735      * Pointer to the buffer of the frame payload
00736      */
00737     void *fBuffer ;
00738     /*!
00739      * Size of the frame payload
00740      */
00741     uint16_t fBufferSize ;
00742     /*!
00743      * Uplink datarate, if ADR is off
00744      */
00745     int8_t Datarate ;
00746     /*!
00747      * Number of trials to transmit the frame, if the LoRaMAC layer did not
00748      * receive an acknowledgment. The MAC performs a datarate adaptation,
00749      * according to the LoRaWAN Specification V1.0.1, chapter 19.4, according
00750      * to the following table:
00751      *
00752      * Transmission nb | Data Rate
00753      * ----------------|-----------
00754      * 1 (first)       | DR
00755      * 2               | DR
00756      * 3               | max(DR-1,0)
00757      * 4               | max(DR-1,0)
00758      * 5               | max(DR-2,0)
00759      * 6               | max(DR-2,0)
00760      * 7               | max(DR-3,0)
00761      * 8               | max(DR-3,0)
00762      *
00763      * Note, that if NbTrials is set to 1 or 2, the MAC will not decrease
00764      * the datarate, in case the LoRaMAC layer did not receive an acknowledgment
00765      */
00766     uint8_t NbTrials ;
00767 }McpsReqConfirmed_t ;
00768 
00769 /*!
00770  * LoRaMAC MCPS-Request for a proprietary frame
00771  */
00772 typedef struct sMcpsReqProprietary 
00773 {
00774     /*!
00775      * Pointer to the buffer of the frame payload
00776      */
00777     void *fBuffer ;
00778     /*!
00779      * Size of the frame payload
00780      */
00781     uint16_t fBufferSize ;
00782     /*!
00783      * Uplink datarate, if ADR is off
00784      */
00785     int8_t Datarate ;
00786 }McpsReqProprietary_t ;
00787 
00788 /*!
00789  * LoRaMAC MCPS-Request structure
00790  */
00791 typedef struct sMcpsReq 
00792 {
00793     /*!
00794      * MCPS-Request type
00795      */
00796     Mcps_t Type ;
00797 
00798     /*!
00799      * MCPS-Request parameters
00800      */
00801     union uMcpsParam 
00802     {
00803         /*!
00804          * MCPS-Request parameters for an unconfirmed frame
00805          */
00806         McpsReqUnconfirmed_t  Unconfirmed ;
00807         /*!
00808          * MCPS-Request parameters for a confirmed frame
00809          */
00810         McpsReqConfirmed_t  Confirmed ;
00811         /*!
00812          * MCPS-Request parameters for a proprietary frame
00813          */
00814         McpsReqProprietary_t  Proprietary ;
00815     }Req;
00816 }McpsReq_t ;
00817 
00818 /*!
00819  * LoRaMAC MCPS-Confirm
00820  */
00821 typedef struct sMcpsConfirm 
00822 {
00823     /*!
00824      * Holds the previously performed MCPS-Request
00825      */
00826     Mcps_t McpsRequest ;
00827     /*!
00828      * Status of the operation
00829      */
00830     LoRaMacEventInfoStatus_t  Status ;
00831     /*!
00832      * Uplink datarate
00833      */
00834     uint8_t Datarate ;
00835     /*!
00836      * Transmission power
00837      */
00838     int8_t TxPower ;
00839     /*!
00840      * Set if an acknowledgement was received
00841      */
00842     bool AckReceived ;
00843     /*!
00844      * Provides the number of retransmissions
00845      */
00846     uint8_t NbRetries ;
00847     /*!
00848      * The transmission time on air of the frame
00849      */
00850     TimerTime_t TxTimeOnAir ;
00851     /*!
00852      * The uplink counter value related to the frame
00853      */
00854     uint32_t UpLinkCounter ;
00855     /*!
00856      * The uplink frequency related to the frame
00857      */
00858     uint32_t UpLinkFrequency ;
00859 }McpsConfirm_t ;
00860 
00861 /*!
00862  * LoRaMAC MCPS-Indication primitive
00863  */
00864 typedef struct sMcpsIndication 
00865 {
00866     /*!
00867      * MCPS-Indication type
00868      */
00869     Mcps_t McpsIndication ;
00870     /*!
00871      * Status of the operation
00872      */
00873     LoRaMacEventInfoStatus_t  Status ;
00874     /*!
00875      * Multicast
00876      */
00877     uint8_t Multicast ;
00878     /*!
00879      * Application port
00880      */
00881     uint8_t Port ;
00882     /*!
00883      * Downlink datarate
00884      */
00885     uint8_t RxDatarate ;
00886     /*!
00887      * Frame pending status
00888      */
00889     uint8_t FramePending ;
00890     /*!
00891      * Pointer to the received data stream
00892      */
00893     uint8_t *Buffer ;
00894     /*!
00895      * Size of the received data stream
00896      */
00897     uint8_t BufferSize ;
00898     /*!
00899      * Indicates, if data is available
00900      */
00901     bool RxData ;
00902     /*!
00903      * Rssi of the received packet
00904      */
00905     int16_t Rssi ;
00906     /*!
00907      * Snr of the received packet
00908      */
00909     uint8_t Snr ;
00910     /*!
00911      * Receive window
00912      *
00913      * [0: Rx window 1, 1: Rx window 2]
00914      */
00915     uint8_t RxSlot ;
00916     /*!
00917      * Set if an acknowledgement was received
00918      */
00919     bool AckReceived ;
00920     /*!
00921      * The downlink counter value for the received frame
00922      */
00923     uint32_t DownLinkCounter ;
00924 }McpsIndication_t ;
00925 
00926 /*!
00927  * \brief LoRaMAC management services
00928  *
00929  * \details The following table list the primitives which are supported by the
00930  *          specific MAC management service:
00931  *
00932  * Name                  | Request | Indication | Response | Confirm
00933  * --------------------- | :-----: | :--------: | :------: | :-----:
00934  * \ref MLME_JOIN        | YES     | NO         | NO       | YES
00935  * \ref MLME_LINK_CHECK  | YES     | NO         | NO       | YES
00936  * \ref MLME_TXCW        | YES     | NO         | NO       | YES
00937  *
00938  * The following table provides links to the function implementations of the
00939  * related MLME primitives.
00940  *
00941  * Primitive        | Function
00942  * ---------------- | :---------------------:
00943  * MLME-Request     | \ref LoRaMacMlmeRequest
00944  * MLME-Confirm     | MacMlmeConfirm in \ref LoRaMacPrimitives_t
00945  */
00946 typedef enum eMlme
00947 {
00948     /*!
00949      * Initiates the Over-the-Air activation
00950      *
00951      * LoRaWAN Specification V1.0.1, chapter 6.2
00952      */
00953     MLME_JOIN ,
00954     /*!
00955      * LinkCheckReq - Connectivity validation
00956      *
00957      * LoRaWAN Specification V1.0.1, chapter 5, table 4
00958      */
00959     MLME_LINK_CHECK ,
00960     /*!
00961      * Sets Tx continuous wave mode
00962      *
00963      * LoRaWAN end-device certification
00964      */
00965     MLME_TXCW ,
00966     /*!
00967      * Sets Tx continuous wave mode (new LoRa-Alliance CC definition)
00968      *
00969      * LoRaWAN end-device certification
00970      */
00971     MLME_TXCW_1 ,
00972 }Mlme_t;
00973 
00974 /*!
00975  * LoRaMAC MLME-Request for the join service
00976  */
00977 typedef struct sMlmeReqJoin 
00978 {
00979     /*!
00980      * Globally unique end-device identifier
00981      *
00982      * LoRaWAN Specification V1.0.1, chapter 6.2.1
00983      */
00984     uint8_t *DevEui ;
00985     /*!
00986      * Application identifier
00987      *
00988      * LoRaWAN Specification V1.0.1, chapter 6.1.2
00989      */
00990     uint8_t *AppEui ;
00991     /*!
00992      * AES-128 application key
00993      *
00994      * LoRaWAN Specification V1.0.1, chapter 6.2.2
00995      */
00996     uint8_t *AppKey ;
00997     /*!
00998      * Number of trials for the join request.
00999      */
01000     uint8_t NbTrials ;
01001 }MlmeReqJoin_t ;
01002 
01003 /*!
01004  * LoRaMAC MLME-Request for Tx continuous wave mode
01005  */
01006 typedef struct sMlmeReqTxCw 
01007 {
01008     /*!
01009      * Time in seconds while the radio is kept in continuous wave mode
01010      */
01011     uint16_t Timeout ;
01012     /*!
01013      * RF frequency to set (Only used with new way)
01014      */
01015     uint32_t Frequency ;
01016     /*!
01017      * RF output power to set (Only used with new way)
01018      */
01019     uint8_t Power ;
01020 }MlmeReqTxCw_t ;
01021 
01022 /*!
01023  * LoRaMAC MLME-Request structure
01024  */
01025 typedef struct sMlmeReq 
01026 {
01027     /*!
01028      * MLME-Request type
01029      */
01030     Mlme_t Type ;
01031 
01032     /*!
01033      * MLME-Request parameters
01034      */
01035     union uMlmeParam 
01036     {
01037         /*!
01038          * MLME-Request parameters for a join request
01039          */
01040         MlmeReqJoin_t  Join ;
01041         /*!
01042          * MLME-Request parameters for Tx continuous mode request
01043          */
01044         MlmeReqTxCw_t  TxCw ;
01045     }Req;
01046 }MlmeReq_t ;
01047 
01048 /*!
01049  * LoRaMAC MLME-Confirm primitive
01050  */
01051 typedef struct sMlmeConfirm 
01052 {
01053     /*!
01054      * Holds the previously performed MLME-Request
01055      */
01056     Mlme_t MlmeRequest ;
01057     /*!
01058      * Status of the operation
01059      */
01060     LoRaMacEventInfoStatus_t  Status ;
01061     /*!
01062      * The transmission time on air of the frame
01063      */
01064     TimerTime_t TxTimeOnAir ;
01065     /*!
01066      * Demodulation margin. Contains the link margin [dB] of the last
01067      * successfully received LinkCheckReq
01068      */
01069     uint8_t DemodMargin ;
01070     /*!
01071      * Number of gateways which received the last LinkCheckReq
01072      */
01073     uint8_t NbGateways ;
01074     /*!
01075      * Provides the number of retransmissions
01076      */
01077     uint8_t NbRetries ;
01078 }MlmeConfirm_t ;
01079 
01080 /*!
01081  * LoRa Mac Information Base (MIB)
01082  *
01083  * The following table lists the MIB parameters and the related attributes:
01084  *
01085  * Attribute                         | Get | Set
01086  * --------------------------------- | :-: | :-:
01087  * \ref MIB_DEVICE_CLASS             | YES | YES
01088  * \ref MIB_NETWORK_JOINED           | YES | YES
01089  * \ref MIB_ADR                      | YES | YES
01090  * \ref MIB_NET_ID                   | YES | YES
01091  * \ref MIB_DEV_ADDR                 | YES | YES
01092  * \ref MIB_NWK_SKEY                 | YES | YES
01093  * \ref MIB_APP_SKEY                 | YES | YES
01094  * \ref MIB_PUBLIC_NETWORK           | YES | YES
01095  * \ref MIB_REPEATER_SUPPORT         | YES | YES
01096  * \ref MIB_CHANNELS                 | YES | NO
01097  * \ref MIB_RX2_CHANNEL              | YES | YES
01098  * \ref MIB_CHANNELS_MASK            | YES | YES
01099  * \ref MIB_CHANNELS_DEFAULT_MASK    | YES | YES
01100  * \ref MIB_CHANNELS_NB_REP          | YES | YES
01101  * \ref MIB_MAX_RX_WINDOW_DURATION   | YES | YES
01102  * \ref MIB_RECEIVE_DELAY_1          | YES | YES
01103  * \ref MIB_RECEIVE_DELAY_2          | YES | YES
01104  * \ref MIB_JOIN_ACCEPT_DELAY_1      | YES | YES
01105  * \ref MIB_JOIN_ACCEPT_DELAY_2      | YES | YES
01106  * \ref MIB_CHANNELS_DATARATE        | YES | YES
01107  * \ref MIB_CHANNELS_DEFAULT_DATARATE| YES | YES
01108  * \ref MIB_CHANNELS_TX_POWER        | YES | YES
01109  * \ref MIB_CHANNELS_DEFAULT_TX_POWER| YES | YES
01110  * \ref MIB_UPLINK_COUNTER           | YES | YES
01111  * \ref MIB_DOWNLINK_COUNTER         | YES | YES
01112  * \ref MIB_MULTICAST_CHANNEL        | YES | NO
01113  * \ref MIB_SYSTEM_MAX_RX_ERROR      | YES | YES
01114  * \ref MIB_MIN_RX_SYMBOLS           | YES | YES
01115  *
01116  * The following table provides links to the function implementations of the
01117  * related MIB primitives:
01118  *
01119  * Primitive        | Function
01120  * ---------------- | :---------------------:
01121  * MIB-Set          | \ref LoRaMacMibSetRequestConfirm
01122  * MIB-Get          | \ref LoRaMacMibGetRequestConfirm
01123  */
01124 typedef enum eMib 
01125 {
01126     /*!
01127      * LoRaWAN device class
01128      *
01129      * LoRaWAN Specification V1.0.1
01130      */
01131     MIB_DEVICE_CLASS ,
01132     /*!
01133      * LoRaWAN Network joined attribute
01134      *
01135      * LoRaWAN Specification V1.0.1
01136      */
01137     MIB_NETWORK_JOINED ,
01138     /*!
01139      * Adaptive data rate
01140      *
01141      * LoRaWAN Specification V1.0.1, chapter 4.3.1.1
01142      *
01143      * [true: ADR enabled, false: ADR disabled]
01144      */
01145     MIB_ADR ,
01146     /*!
01147      * Network identifier
01148      *
01149      * LoRaWAN Specification V1.0.1, chapter 6.1.1
01150      */
01151     MIB_NET_ID ,
01152     /*!
01153      * End-device address
01154      *
01155      * LoRaWAN Specification V1.0.1, chapter 6.1.1
01156      */
01157     MIB_DEV_ADDR ,
01158     /*!
01159      * Network session key
01160      *
01161      * LoRaWAN Specification V1.0.1, chapter 6.1.3
01162      */
01163     MIB_NWK_SKEY ,
01164     /*!
01165      * Application session key
01166      *
01167      * LoRaWAN Specification V1.0.1, chapter 6.1.4
01168      */
01169     MIB_APP_SKEY ,
01170     /*!
01171      * Set the network type to public or private
01172      *
01173      * LoRaWAN Specification V1.0.1, chapter 7
01174      *
01175      * [true: public network, false: private network]
01176      */
01177     MIB_PUBLIC_NETWORK ,
01178     /*!
01179      * Support the operation with repeaters
01180      *
01181      * LoRaWAN Specification V1.0.1, chapter 7
01182      *
01183      * [true: repeater support enabled, false: repeater support disabled]
01184      */
01185     MIB_REPEATER_SUPPORT ,
01186     /*!
01187      * Communication channels. A get request will return a
01188      * pointer which references the first entry of the channel list. The
01189      * list is of size LORA_MAX_NB_CHANNELS
01190      *
01191      * LoRaWAN Specification V1.0.1, chapter 7
01192      */
01193     MIB_CHANNELS ,
01194     /*!
01195      * Set receive window 2 channel
01196      *
01197      * LoRaWAN Specification V1.0.1, chapter 3.3.2
01198      */
01199     MIB_RX2_CHANNEL ,
01200     /*!
01201      * Set receive window 2 channel
01202      *
01203      * LoRaWAN Specification V1.0.1, chapter 3.3.2
01204      */
01205     MIB_RX2_DEFAULT_CHANNEL ,
01206     /*!
01207      * LoRaWAN channels mask
01208      *
01209      * LoRaWAN Specification V1.0.1, chapter 7
01210      */
01211     MIB_CHANNELS_MASK ,
01212     /*!
01213      * LoRaWAN default channels mask
01214      *
01215      * LoRaWAN Specification V1.0.1, chapter 7
01216      */
01217     MIB_CHANNELS_DEFAULT_MASK ,
01218     /*!
01219      * Set the number of repetitions on a channel
01220      *
01221      * LoRaWAN Specification V1.0.1, chapter 5.2
01222      */
01223     MIB_CHANNELS_NB_REP ,
01224     /*!
01225      * Maximum receive window duration in [ms]
01226      *
01227      * LoRaWAN Specification V1.0.1, chapter 3.3.3
01228      */
01229     MIB_MAX_RX_WINDOW_DURATION ,
01230     /*!
01231      * Receive delay 1 in [ms]
01232      *
01233      * LoRaWAN Specification V1.0.1, chapter 7
01234      */
01235     MIB_RECEIVE_DELAY_1 ,
01236     /*!
01237      * Receive delay 2 in [ms]
01238      *
01239      * LoRaWAN Specification V1.0.1, chapter 7
01240      */
01241     MIB_RECEIVE_DELAY_2 ,
01242     /*!
01243      * Join accept delay 1 in [ms]
01244      *
01245      * LoRaWAN Specification V1.0.1, chapter 7
01246      */
01247     MIB_JOIN_ACCEPT_DELAY_1 ,
01248     /*!
01249      * Join accept delay 2 in [ms]
01250      *
01251      * LoRaWAN Specification V1.0.1, chapter 7
01252      */
01253     MIB_JOIN_ACCEPT_DELAY_2 ,
01254     /*!
01255      * Default Data rate of a channel
01256      *
01257      * LoRaWAN Specification V1.0.1, chapter 7
01258      *
01259      * EU868 - [DR_0, DR_1, DR_2, DR_3, DR_4, DR_5, DR_6, DR_7]
01260      *
01261      * US915 - [DR_0, DR_1, DR_2, DR_3, DR_4, DR_8, DR_9, DR_10, DR_11, DR_12, DR_13]
01262      */
01263     MIB_CHANNELS_DEFAULT_DATARATE ,
01264     /*!
01265      * Data rate of a channel
01266      *
01267      * LoRaWAN Specification V1.0.1, chapter 7
01268      *
01269      * EU868 - [DR_0, DR_1, DR_2, DR_3, DR_4, DR_5, DR_6, DR_7]
01270      *
01271      * US915 - [DR_0, DR_1, DR_2, DR_3, DR_4, DR_8, DR_9, DR_10, DR_11, DR_12, DR_13]
01272      */
01273     MIB_CHANNELS_DATARATE ,
01274     /*!
01275      * Transmission power of a channel
01276      *
01277      * LoRaWAN Specification V1.0.1, chapter 7
01278      *
01279      * EU868 - [TX_POWER_20_DBM, TX_POWER_14_DBM, TX_POWER_11_DBM,
01280      *          TX_POWER_08_DBM, TX_POWER_05_DBM, TX_POWER_02_DBM]
01281      *
01282      * US915 - [TX_POWER_30_DBM, TX_POWER_28_DBM, TX_POWER_26_DBM,
01283      *          TX_POWER_24_DBM, TX_POWER_22_DBM, TX_POWER_20_DBM,
01284      *          TX_POWER_18_DBM, TX_POWER_14_DBM, TX_POWER_12_DBM,
01285      *          TX_POWER_10_DBM]
01286      */
01287     MIB_CHANNELS_TX_POWER ,
01288     /*!
01289      * Transmission power of a channel
01290      *
01291      * LoRaWAN Specification V1.0.1, chapter 7
01292      *
01293      * EU868 - [TX_POWER_20_DBM, TX_POWER_14_DBM, TX_POWER_11_DBM,
01294      *          TX_POWER_08_DBM, TX_POWER_05_DBM, TX_POWER_02_DBM]
01295      *
01296      * US915 - [TX_POWER_30_DBM, TX_POWER_28_DBM, TX_POWER_26_DBM,
01297      *          TX_POWER_24_DBM, TX_POWER_22_DBM, TX_POWER_20_DBM,
01298      *          TX_POWER_18_DBM, TX_POWER_14_DBM, TX_POWER_12_DBM,
01299      *          TX_POWER_10_DBM]
01300      */
01301     MIB_CHANNELS_DEFAULT_TX_POWER ,
01302     /*!
01303      * LoRaWAN Up-link counter
01304      *
01305      * LoRaWAN Specification V1.0.1, chapter 4.3.1.5
01306      */
01307     MIB_UPLINK_COUNTER ,
01308     /*!
01309      * LoRaWAN Down-link counter
01310      *
01311      * LoRaWAN Specification V1.0.1, chapter 4.3.1.5
01312      */
01313     MIB_DOWNLINK_COUNTER ,
01314     /*!
01315      * Multicast channels. A get request will return a pointer to the first
01316      * entry of the multicast channel linked list. If the pointer is equal to
01317      * NULL, the list is empty.
01318      */
01319     MIB_MULTICAST_CHANNEL ,
01320     /*!
01321      * System overall timing error in milliseconds. 
01322      * [-SystemMaxRxError : +SystemMaxRxError]
01323      * Default: +/-10 ms
01324      */
01325     MIB_SYSTEM_MAX_RX_ERROR ,
01326     /*!
01327      * Minimum required number of symbols to detect an Rx frame
01328      * Default: 6 symbols
01329      */
01330     MIB_MIN_RX_SYMBOLS ,
01331 }Mib_t ;
01332 
01333 /*!
01334  * LoRaMAC MIB parameters
01335  */
01336 typedef union uMibParam 
01337 {
01338     /*!
01339      * LoRaWAN device class
01340      *
01341      * Related MIB type: \ref MIB_DEVICE_CLASS
01342      */
01343     DeviceClass_t  Class ;
01344     /*!
01345      * LoRaWAN network joined attribute
01346      *
01347      * Related MIB type: \ref MIB_NETWORK_JOINED
01348      */
01349     bool IsNetworkJoined ;
01350     /*!
01351      * Activation state of ADR
01352      *
01353      * Related MIB type: \ref MIB_ADR
01354      */
01355     bool AdrEnable ;
01356     /*!
01357      * Network identifier
01358      *
01359      * Related MIB type: \ref MIB_NET_ID
01360      */
01361     uint32_t NetID ;
01362     /*!
01363      * End-device address
01364      *
01365      * Related MIB type: \ref MIB_DEV_ADDR
01366      */
01367     uint32_t DevAddr ;
01368     /*!
01369      * Network session key
01370      *
01371      * Related MIB type: \ref MIB_NWK_SKEY
01372      */
01373     uint8_t *NwkSKey ;
01374     /*!
01375      * Application session key
01376      *
01377      * Related MIB type: \ref MIB_APP_SKEY
01378      */
01379     uint8_t *AppSKey ;
01380     /*!
01381      * Enable or disable a public network
01382      *
01383      * Related MIB type: \ref MIB_PUBLIC_NETWORK
01384      */
01385     bool EnablePublicNetwork ;
01386     /*!
01387      * Enable or disable repeater support
01388      *
01389      * Related MIB type: \ref MIB_REPEATER_SUPPORT
01390      */
01391     bool EnableRepeaterSupport ;
01392     /*!
01393      * LoRaWAN Channel
01394      *
01395      * Related MIB type: \ref MIB_CHANNELS
01396      */
01397     ChannelParams_t * ChannelList ;
01398      /*!
01399      * Channel for the receive window 2
01400      *
01401      * Related MIB type: \ref MIB_RX2_CHANNEL
01402      */
01403     Rx2ChannelParams_t  Rx2Channel ;
01404      /*!
01405      * Channel for the receive window 2
01406      *
01407      * Related MIB type: \ref MIB_RX2_DEFAULT_CHANNEL
01408      */
01409     Rx2ChannelParams_t  Rx2DefaultChannel ;
01410     /*!
01411      * Channel mask
01412      *
01413      * Related MIB type: \ref MIB_CHANNELS_MASK
01414      */
01415     uint16_t* ChannelsMask ;
01416     /*!
01417      * Default channel mask
01418      *
01419      * Related MIB type: \ref MIB_CHANNELS_DEFAULT_MASK
01420      */
01421     uint16_t* ChannelsDefaultMask ;
01422     /*!
01423      * Number of frame repetitions
01424      *
01425      * Related MIB type: \ref MIB_CHANNELS_NB_REP
01426      */
01427     uint8_t ChannelNbRep ;
01428     /*!
01429      * Maximum receive window duration
01430      *
01431      * Related MIB type: \ref MIB_MAX_RX_WINDOW_DURATION
01432      */
01433     uint32_t MaxRxWindow ;
01434     /*!
01435      * Receive delay 1
01436      *
01437      * Related MIB type: \ref MIB_RECEIVE_DELAY_1
01438      */
01439     uint32_t ReceiveDelay1 ;
01440     /*!
01441      * Receive delay 2
01442      *
01443      * Related MIB type: \ref MIB_RECEIVE_DELAY_2
01444      */
01445     uint32_t ReceiveDelay2 ;
01446     /*!
01447      * Join accept delay 1
01448      *
01449      * Related MIB type: \ref MIB_JOIN_ACCEPT_DELAY_1
01450      */
01451     uint32_t JoinAcceptDelay1 ;
01452     /*!
01453      * Join accept delay 2
01454      *
01455      * Related MIB type: \ref MIB_JOIN_ACCEPT_DELAY_2
01456      */
01457     uint32_t JoinAcceptDelay2 ;
01458     /*!
01459      * Channels data rate
01460      *
01461      * Related MIB type: \ref MIB_CHANNELS_DEFAULT_DATARATE
01462      */
01463     int8_t ChannelsDefaultDatarate ;
01464     /*!
01465      * Channels data rate
01466      *
01467      * Related MIB type: \ref MIB_CHANNELS_DATARATE
01468      */
01469     int8_t ChannelsDatarate ;
01470     /*!
01471      * Channels TX power
01472      *
01473      * Related MIB type: \ref MIB_CHANNELS_DEFAULT_TX_POWER
01474      */
01475     int8_t ChannelsDefaultTxPower ;
01476     /*!
01477      * Channels TX power
01478      *
01479      * Related MIB type: \ref MIB_CHANNELS_TX_POWER
01480      */
01481     int8_t ChannelsTxPower ;
01482     /*!
01483      * LoRaWAN Up-link counter
01484      *
01485      * Related MIB type: \ref MIB_UPLINK_COUNTER
01486      */
01487     uint32_t UpLinkCounter ;
01488     /*!
01489      * LoRaWAN Down-link counter
01490      *
01491      * Related MIB type: \ref MIB_DOWNLINK_COUNTER
01492      */
01493     uint32_t DownLinkCounter ;
01494     /*!
01495      * Multicast channel
01496      *
01497      * Related MIB type: \ref MIB_MULTICAST_CHANNEL
01498      */
01499     MulticastParams_t * MulticastList ;
01500     /*!
01501      * System overall timing error in milliseconds. 
01502      *
01503      * Related MIB type: \ref MIB_SYSTEM_MAX_RX_ERROR
01504      */
01505     uint32_t SystemMaxRxError ;
01506     /*!
01507      * Minimum required number of symbols to detect an Rx frame
01508      *
01509      * Related MIB type: \ref MIB_MIN_RX_SYMBOLS
01510      */
01511     uint8_t MinRxSymbols ;
01512 }MibParam_t ;
01513 
01514 /*!
01515  * LoRaMAC MIB-RequestConfirm structure
01516  */
01517 typedef struct eMibRequestConfirm 
01518 {
01519     /*!
01520      * MIB-Request type
01521      */
01522     Mib_t  Type ;
01523 
01524     /*!
01525      * MLME-RequestConfirm parameters
01526      */
01527     MibParam_t  Param ;
01528 }MibRequestConfirm_t ;
01529 
01530 /*!
01531  * LoRaMAC tx information
01532  */
01533 typedef struct sLoRaMacTxInfo 
01534 {
01535     /*!
01536      * Defines the size of the applicative payload which can be processed
01537      */
01538     uint8_t MaxPossiblePayload ;
01539     /*!
01540      * The current payload size, dependent on the current datarate
01541      */
01542     uint8_t CurrentPayloadSize ;
01543 }LoRaMacTxInfo_t ;
01544 
01545 /*!
01546  * LoRaMAC Status
01547  */
01548 typedef enum eLoRaMacStatus 
01549 {
01550     /*!
01551      * Service started successfully
01552      */
01553     LORAMAC_STATUS_OK ,
01554     /*!
01555      * Service not started - LoRaMAC is busy
01556      */
01557     LORAMAC_STATUS_BUSY ,
01558     /*!
01559      * Service unknown
01560      */
01561     LORAMAC_STATUS_SERVICE_UNKNOWN ,
01562     /*!
01563      * Service not started - invalid parameter
01564      */
01565     LORAMAC_STATUS_PARAMETER_INVALID ,
01566     /*!
01567      * Service not started - invalid frequency
01568      */
01569     LORAMAC_STATUS_FREQUENCY_INVALID ,
01570     /*!
01571      * Service not started - invalid datarate
01572      */
01573     LORAMAC_STATUS_DATARATE_INVALID ,
01574     /*!
01575      * Service not started - invalid frequency and datarate
01576      */
01577     LORAMAC_STATUS_FREQ_AND_DR_INVALID ,
01578     /*!
01579      * Service not started - the device is not in a LoRaWAN
01580      */
01581     LORAMAC_STATUS_NO_NETWORK_JOINED ,
01582     /*!
01583      * Service not started - payload lenght error
01584      */
01585     LORAMAC_STATUS_LENGTH_ERROR ,
01586     /*!
01587      * Service not started - payload lenght error
01588      */
01589     LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR ,
01590     /*!
01591      * Service not started - the device is switched off
01592      */
01593     LORAMAC_STATUS_DEVICE_OFF ,
01594 }LoRaMacStatus_t ;
01595 
01596 /*!
01597  * LoRaMAC events structure
01598  * Used to notify upper layers of MAC events
01599  */
01600 typedef struct sLoRaMacPrimitives 
01601 {
01602     /*!
01603      * \brief   MCPS-Confirm primitive
01604      *
01605      * \param   [OUT] MCPS-Confirm parameters
01606      */
01607     void ( *MacMcpsConfirm )( McpsConfirm_t  *McpsConfirm );
01608     /*!
01609      * \brief   MCPS-Indication primitive
01610      *
01611      * \param   [OUT] MCPS-Indication parameters
01612      */
01613     void ( *MacMcpsIndication )( McpsIndication_t  *McpsIndication );
01614     /*!
01615      * \brief   MLME-Confirm primitive
01616      *
01617      * \param   [OUT] MLME-Confirm parameters
01618      */
01619     void ( *MacMlmeConfirm )( MlmeConfirm_t  *MlmeConfirm );
01620 }LoRaMacPrimitives_t ;
01621 
01622 typedef struct sLoRaMacCallback
01623 {
01624     /*!
01625      * \brief   Measures the battery level
01626      *
01627      * \retval  Battery level [0: node is connected to an external
01628      *          power source, 1..254: battery level, where 1 is the minimum
01629      *          and 254 is the maximum value, 255: the node was not able
01630      *          to measure the battery level]
01631      */
01632     uint8_t ( *GetBatteryLevel )( void );
01633 }LoRaMacCallback_t;
01634 
01635 /*!
01636  * \brief   LoRaMAC layer initialization
01637  *
01638  * \details In addition to the initialization of the LoRaMAC layer, this
01639  *          function initializes the callback primitives of the MCPS and
01640  *          MLME services. Every data field of \ref LoRaMacPrimitives_t must be
01641  *          set to a valid callback function.
01642  *
01643  * \param   [IN] events - Pointer to a structure defining the LoRaMAC
01644  *                        event functions. Refer to \ref LoRaMacPrimitives_t.
01645  *
01646  * \param   [IN] events - Pointer to a structure defining the LoRaMAC
01647  *                        callback functions. Refer to \ref LoRaMacCallback_t.
01648  *
01649  * \retval  LoRaMacStatus_t Status of the operation. Possible returns are:
01650  *          returns are:
01651  *          \ref LORAMAC_STATUS_OK,
01652  *          \ref LORAMAC_STATUS_PARAMETER_INVALID.
01653  */
01654 LoRaMacStatus_t  LoRaMacInitialization( LoRaMacPrimitives_t  *primitives, LoRaMacCallback_t *callbacks );
01655 
01656 /*!
01657  * \brief   Queries the LoRaMAC if it is possible to send the next frame with
01658  *          a given payload size. The LoRaMAC takes scheduled MAC commands into
01659  *          account and reports, when the frame can be send or not.
01660  *
01661  * \param   [IN] size - Size of applicative payload to be send next
01662  *
01663  * \param   [OUT] txInfo - The structure \ref LoRaMacTxInfo_t contains
01664  *                         information about the actual maximum payload possible
01665  *                         ( according to the configured datarate or the next
01666  *                         datarate according to ADR ), and the maximum frame
01667  *                         size, taking the scheduled MAC commands into account.
01668  *
01669  * \retval  LoRaMacStatus_t Status of the operation. When the parameters are
01670  *          not valid, the function returns \ref LORAMAC_STATUS_PARAMETER_INVALID.
01671  *          In case of a length error caused by the applicative payload size, the
01672  *          function returns LORAMAC_STATUS_LENGTH_ERROR. In case of a length error
01673  *          due to additional MAC commands in the queue, the function returns
01674  *          LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR. In case the query is valid, and
01675  *          the LoRaMAC is able to send the frame, the function returns LORAMAC_STATUS_OK. *
01676  */
01677 LoRaMacStatus_t  LoRaMacQueryTxPossible( uint8_t size, LoRaMacTxInfo_t * txInfo );
01678 
01679 /*!
01680  * \brief   LoRaMAC channel add service
01681  *
01682  * \details Adds a new channel to the channel list and activates the id in
01683  *          the channel mask. For the US915 band, all channels are enabled
01684  *          by default. It is not possible to activate less than 6 125 kHz
01685  *          channels.
01686  *
01687  * \param   [IN] id - Id of the channel. Possible values are:
01688  *
01689  *          0-15 for EU868
01690  *          0-72 for US915
01691  *
01692  * \param   [IN] params - Channel parameters to set.
01693  *
01694  * \retval  LoRaMacStatus_t Status of the operation. Possible returns are:
01695  *          \ref LORAMAC_STATUS_OK,
01696  *          \ref LORAMAC_STATUS_BUSY,
01697  *          \ref LORAMAC_STATUS_PARAMETER_INVALID.
01698  */
01699 LoRaMacStatus_t  LoRaMacChannelAdd( uint8_t id, ChannelParams_t  params );
01700 
01701 /*!
01702  * \brief   LoRaMAC channel remove service
01703  *
01704  * \details Deactivates the id in the channel mask.
01705  *
01706  * \param   [IN] id - Id of the channel.
01707  *
01708  * \retval  LoRaMacStatus_t Status of the operation. Possible returns are:
01709  *          \ref LORAMAC_STATUS_OK,
01710  *          \ref LORAMAC_STATUS_BUSY,
01711  *          \ref LORAMAC_STATUS_PARAMETER_INVALID.
01712  */
01713 LoRaMacStatus_t  LoRaMacChannelRemove( uint8_t id );
01714 
01715 /*!
01716  * \brief   LoRaMAC multicast channel link service
01717  *
01718  * \details Links a multicast channel into the linked list.
01719  *
01720  * \param   [IN] channelParam - Multicast channel parameters to link.
01721  *
01722  * \retval  LoRaMacStatus_t Status of the operation. Possible returns are:
01723  *          \ref LORAMAC_STATUS_OK,
01724  *          \ref LORAMAC_STATUS_BUSY,
01725  *          \ref LORAMAC_STATUS_PARAMETER_INVALID.
01726  */
01727 LoRaMacStatus_t  LoRaMacMulticastChannelLink( MulticastParams_t  *channelParam );
01728 
01729 /*!
01730  * \brief   LoRaMAC multicast channel unlink service
01731  *
01732  * \details Unlinks a multicast channel from the linked list.
01733  *
01734  * \param   [IN] channelParam - Multicast channel parameters to unlink.
01735  *
01736  * \retval  LoRaMacStatus_t Status of the operation. Possible returns are:
01737  *          \ref LORAMAC_STATUS_OK,
01738  *          \ref LORAMAC_STATUS_BUSY,
01739  *          \ref LORAMAC_STATUS_PARAMETER_INVALID.
01740  */
01741 LoRaMacStatus_t  LoRaMacMulticastChannelUnlink( MulticastParams_t  *channelParam );
01742 
01743 /*!
01744  * \brief   LoRaMAC MIB-Get
01745  *
01746  * \details The mac information base service to get attributes of the LoRaMac
01747  *          layer.
01748  *
01749  *          The following code-snippet shows how to use the API to get the
01750  *          parameter AdrEnable, defined by the enumeration type
01751  *          \ref MIB_ADR.
01752  * \code
01753  * MibRequestConfirm_t mibReq;
01754  * mibReq.Type = MIB_ADR;
01755  *
01756  * if( LoRaMacMibGetRequestConfirm( &mibReq ) == LORAMAC_STATUS_OK )
01757  * {
01758  *   // LoRaMAC updated the parameter mibParam.AdrEnable
01759  * }
01760  * \endcode
01761  *
01762  * \param   [IN] mibRequest - MIB-GET-Request to perform. Refer to \ref MibRequestConfirm_t.
01763  *
01764  * \retval  LoRaMacStatus_t Status of the operation. Possible returns are:
01765  *          \ref LORAMAC_STATUS_OK,
01766  *          \ref LORAMAC_STATUS_SERVICE_UNKNOWN,
01767  *          \ref LORAMAC_STATUS_PARAMETER_INVALID.
01768  */
01769 LoRaMacStatus_t  LoRaMacMibGetRequestConfirm( MibRequestConfirm_t  *mibGet );
01770 
01771 /*!
01772  * \brief   LoRaMAC MIB-Set
01773  *
01774  * \details The mac information base service to set attributes of the LoRaMac
01775  *          layer.
01776  *
01777  *          The following code-snippet shows how to use the API to set the
01778  *          parameter AdrEnable, defined by the enumeration type
01779  *          \ref MIB_ADR.
01780  *
01781  * \code
01782  * MibRequestConfirm_t mibReq;
01783  * mibReq.Type = MIB_ADR;
01784  * mibReq.Param.AdrEnable = true;
01785  *
01786  * if( LoRaMacMibGetRequestConfirm( &mibReq ) == LORAMAC_STATUS_OK )
01787  * {
01788  *   // LoRaMAC updated the parameter
01789  * }
01790  * \endcode
01791  *
01792  * \param   [IN] mibRequest - MIB-SET-Request to perform. Refer to \ref MibRequestConfirm_t.
01793  *
01794  * \retval  LoRaMacStatus_t Status of the operation. Possible returns are:
01795  *          \ref LORAMAC_STATUS_OK,
01796  *          \ref LORAMAC_STATUS_BUSY,
01797  *          \ref LORAMAC_STATUS_SERVICE_UNKNOWN,
01798  *          \ref LORAMAC_STATUS_PARAMETER_INVALID.
01799  */
01800 LoRaMacStatus_t  LoRaMacMibSetRequestConfirm( MibRequestConfirm_t  *mibSet );
01801 
01802 /*!
01803  * \brief   LoRaMAC MLME-Request
01804  *
01805  * \details The Mac layer management entity handles management services. The
01806  *          following code-snippet shows how to use the API to perform a
01807  *          network join request.
01808  *
01809  * \code
01810  * static uint8_t DevEui[] =
01811  * {
01812  *   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
01813  * };
01814  * static uint8_t AppEui[] =
01815  * {
01816  *   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
01817  * };
01818  * static uint8_t AppKey[] =
01819  * {
01820  *   0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
01821  *   0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
01822  * };
01823  *
01824  * MlmeReq_t mlmeReq;
01825  * mlmeReq.Type = MLME_JOIN;
01826  * mlmeReq.Req.Join.DevEui = DevEui;
01827  * mlmeReq.Req.Join.AppEui = AppEui;
01828  * mlmeReq.Req.Join.AppKey = AppKey;
01829  *
01830  * if( LoRaMacMlmeRequest( &mlmeReq ) == LORAMAC_STATUS_OK )
01831  * {
01832  *   // Service started successfully. Waiting for the Mlme-Confirm event
01833  * }
01834  * \endcode
01835  *
01836  * \param   [IN] mlmeRequest - MLME-Request to perform. Refer to \ref MlmeReq_t.
01837  *
01838  * \retval  LoRaMacStatus_t Status of the operation. Possible returns are:
01839  *          \ref LORAMAC_STATUS_OK,
01840  *          \ref LORAMAC_STATUS_BUSY,
01841  *          \ref LORAMAC_STATUS_SERVICE_UNKNOWN,
01842  *          \ref LORAMAC_STATUS_PARAMETER_INVALID,
01843  *          \ref LORAMAC_STATUS_NO_NETWORK_JOINED,
01844  *          \ref LORAMAC_STATUS_LENGTH_ERROR,
01845  *          \ref LORAMAC_STATUS_DEVICE_OFF.
01846  */
01847 LoRaMacStatus_t  LoRaMacMlmeRequest( MlmeReq_t  *mlmeRequest );
01848 
01849 /*!
01850  * \brief   LoRaMAC MCPS-Request
01851  *
01852  * \details The Mac Common Part Sublayer handles data services. The following
01853  *          code-snippet shows how to use the API to send an unconfirmed
01854  *          LoRaMAC frame.
01855  *
01856  * \code
01857  * uint8_t myBuffer[] = { 1, 2, 3 };
01858  *
01859  * McpsReq_t mcpsReq;
01860  * mcpsReq.Type = MCPS_UNCONFIRMED;
01861  * mcpsReq.Req.Unconfirmed.fPort = 1;
01862  * mcpsReq.Req.Unconfirmed.fBuffer = myBuffer;
01863  * mcpsReq.Req.Unconfirmed.fBufferSize = sizeof( myBuffer );
01864  *
01865  * if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK )
01866  * {
01867  *   // Service started successfully. Waiting for the MCPS-Confirm event
01868  * }
01869  * \endcode
01870  *
01871  * \param   [IN] mcpsRequest - MCPS-Request to perform. Refer to \ref McpsReq_t.
01872  *
01873  * \retval  LoRaMacStatus_t Status of the operation. Possible returns are:
01874  *          \ref LORAMAC_STATUS_OK,
01875  *          \ref LORAMAC_STATUS_BUSY,
01876  *          \ref LORAMAC_STATUS_SERVICE_UNKNOWN,
01877  *          \ref LORAMAC_STATUS_PARAMETER_INVALID,
01878  *          \ref LORAMAC_STATUS_NO_NETWORK_JOINED,
01879  *          \ref LORAMAC_STATUS_LENGTH_ERROR,
01880  *          \ref LORAMAC_STATUS_DEVICE_OFF.
01881  */
01882 LoRaMacStatus_t  LoRaMacMcpsRequest( McpsReq_t  *mcpsRequest );
01883 
01884 /*! \} defgroup LORAMAC */
01885 
01886 #endif // __LORAMAC_H__