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.
mbed-os/features/lorawan/LoRaWANStack.h@0:e056ac8fecf8, 2018-03-13 (annotated)
- Committer:
- valeyev
- Date:
- Tue Mar 13 07:17:50 2018 +0000
- Revision:
- 0:e056ac8fecf8
looking for...
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
valeyev | 0:e056ac8fecf8 | 1 | /** |
valeyev | 0:e056ac8fecf8 | 2 | / _____) _ | | |
valeyev | 0:e056ac8fecf8 | 3 | ( (____ _____ ____ _| |_ _____ ____| |__ |
valeyev | 0:e056ac8fecf8 | 4 | \____ \| ___ | (_ _) ___ |/ ___) _ \ |
valeyev | 0:e056ac8fecf8 | 5 | _____) ) ____| | | || |_| ____( (___| | | | |
valeyev | 0:e056ac8fecf8 | 6 | (______/|_____)_|_|_| \__)_____)\____)_| |_| |
valeyev | 0:e056ac8fecf8 | 7 | (C)2013 Semtech |
valeyev | 0:e056ac8fecf8 | 8 | ___ _____ _ ___ _ _____ ___ ___ ___ ___ |
valeyev | 0:e056ac8fecf8 | 9 | / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __| |
valeyev | 0:e056ac8fecf8 | 10 | \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _| |
valeyev | 0:e056ac8fecf8 | 11 | |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___| |
valeyev | 0:e056ac8fecf8 | 12 | embedded.connectivity.solutions=============== |
valeyev | 0:e056ac8fecf8 | 13 | |
valeyev | 0:e056ac8fecf8 | 14 | Description: LoRaWAN stack layer that controls both MAC and PHY underneath |
valeyev | 0:e056ac8fecf8 | 15 | |
valeyev | 0:e056ac8fecf8 | 16 | License: Revised BSD License, see LICENSE.TXT file include in the project |
valeyev | 0:e056ac8fecf8 | 17 | |
valeyev | 0:e056ac8fecf8 | 18 | Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jaeckle ( STACKFORCE ) |
valeyev | 0:e056ac8fecf8 | 19 | |
valeyev | 0:e056ac8fecf8 | 20 | |
valeyev | 0:e056ac8fecf8 | 21 | Copyright (c) 2017, Arm Limited and affiliates. |
valeyev | 0:e056ac8fecf8 | 22 | |
valeyev | 0:e056ac8fecf8 | 23 | SPDX-License-Identifier: BSD-3-Clause |
valeyev | 0:e056ac8fecf8 | 24 | */ |
valeyev | 0:e056ac8fecf8 | 25 | |
valeyev | 0:e056ac8fecf8 | 26 | #ifndef LORAWANSTACK_H_ |
valeyev | 0:e056ac8fecf8 | 27 | #define LORAWANSTACK_H_ |
valeyev | 0:e056ac8fecf8 | 28 | |
valeyev | 0:e056ac8fecf8 | 29 | #include <stdint.h> |
valeyev | 0:e056ac8fecf8 | 30 | #include "events/EventQueue.h" |
valeyev | 0:e056ac8fecf8 | 31 | #include "platform/Callback.h" |
valeyev | 0:e056ac8fecf8 | 32 | #include "platform/NonCopyable.h" |
valeyev | 0:e056ac8fecf8 | 33 | #include "lorawan/system/LoRaWANTimer.h" |
valeyev | 0:e056ac8fecf8 | 34 | #include "lorastack/mac/LoRaMac.h" |
valeyev | 0:e056ac8fecf8 | 35 | #include "lorawan/system/lorawan_data_structures.h" |
valeyev | 0:e056ac8fecf8 | 36 | #include "LoRaRadio.h" |
valeyev | 0:e056ac8fecf8 | 37 | |
valeyev | 0:e056ac8fecf8 | 38 | #ifdef MBED_CONF_LORA_PHY |
valeyev | 0:e056ac8fecf8 | 39 | #if MBED_CONF_LORA_PHY == 0 |
valeyev | 0:e056ac8fecf8 | 40 | #include "lorawan/lorastack/phy/LoRaPHYEU868.h" |
valeyev | 0:e056ac8fecf8 | 41 | #define LoRaPHY_region LoRaPHYEU868 |
valeyev | 0:e056ac8fecf8 | 42 | #elif MBED_CONF_LORA_PHY == 1 |
valeyev | 0:e056ac8fecf8 | 43 | #include "lorawan/lorastack/phy/LoRaPHYAS923.h" |
valeyev | 0:e056ac8fecf8 | 44 | #define LoRaPHY_region LoRaPHYAS923 |
valeyev | 0:e056ac8fecf8 | 45 | #elif MBED_CONF_LORA_PHY == 2 |
valeyev | 0:e056ac8fecf8 | 46 | #include "lorawan/lorastack/phy/LoRaPHYAU915.h" |
valeyev | 0:e056ac8fecf8 | 47 | #define LoRaPHY_region LoRaPHYAU915; |
valeyev | 0:e056ac8fecf8 | 48 | #elif MBED_CONF_LORA_PHY == 3 |
valeyev | 0:e056ac8fecf8 | 49 | #include "lorawan/lorastack/phy/LoRaPHYCN470.h" |
valeyev | 0:e056ac8fecf8 | 50 | #define LoRaPHY_region LoRaPHYCN470 |
valeyev | 0:e056ac8fecf8 | 51 | #elif MBED_CONF_LORA_PHY == 4 |
valeyev | 0:e056ac8fecf8 | 52 | #include "lorawan/lorastack/phy/LoRaPHYCN779.h" |
valeyev | 0:e056ac8fecf8 | 53 | #define LoRaPHY_region LoRaPHYCN779 |
valeyev | 0:e056ac8fecf8 | 54 | #elif MBED_CONF_LORA_PHY == 5 |
valeyev | 0:e056ac8fecf8 | 55 | #include "lorawan/lorastack/phy/LoRaPHYEU433.h" |
valeyev | 0:e056ac8fecf8 | 56 | #define LoRaPHY_region LoRaPHYEU433 |
valeyev | 0:e056ac8fecf8 | 57 | #elif MBED_CONF_LORA_PHY == 6 |
valeyev | 0:e056ac8fecf8 | 58 | #include "lorawan/lorastack/phy/LoRaPHYIN865.h" |
valeyev | 0:e056ac8fecf8 | 59 | #define LoRaPHY_region LoRaPHYIN865 |
valeyev | 0:e056ac8fecf8 | 60 | #elif MBED_CONF_LORA_PHY == 7 |
valeyev | 0:e056ac8fecf8 | 61 | #include "lorawan/lorastack/phy/LoRaPHYKR920.h" |
valeyev | 0:e056ac8fecf8 | 62 | #define LoRaPHY_region LoRaPHYKR920 |
valeyev | 0:e056ac8fecf8 | 63 | #elif MBED_CONF_LORA_PHY == 8 |
valeyev | 0:e056ac8fecf8 | 64 | #include "lorawan/lorastack/phy/LoRaPHYUS915.h" |
valeyev | 0:e056ac8fecf8 | 65 | #define LoRaPHY_region LoRaPHYUS915 |
valeyev | 0:e056ac8fecf8 | 66 | #elif MBED_CONF_LORA_PHY == 9 |
valeyev | 0:e056ac8fecf8 | 67 | #include "lorawan/lorastack/phy/LoRaPHYUS915Hybrid.h" |
valeyev | 0:e056ac8fecf8 | 68 | #define LoRaPHY_region LoRaPHYUS915Hybrid |
valeyev | 0:e056ac8fecf8 | 69 | #endif //MBED_CONF_LORA_PHY == VALUE |
valeyev | 0:e056ac8fecf8 | 70 | #else |
valeyev | 0:e056ac8fecf8 | 71 | #error "Must set LoRa PHY layer parameters." |
valeyev | 0:e056ac8fecf8 | 72 | #endif //MBED_CONF_LORA_PHY |
valeyev | 0:e056ac8fecf8 | 73 | |
valeyev | 0:e056ac8fecf8 | 74 | /** |
valeyev | 0:e056ac8fecf8 | 75 | * A mask for the network ID. |
valeyev | 0:e056ac8fecf8 | 76 | */ |
valeyev | 0:e056ac8fecf8 | 77 | #define LORAWAN_NETWORK_ID_MASK ( uint32_t )0xFE000000 |
valeyev | 0:e056ac8fecf8 | 78 | |
valeyev | 0:e056ac8fecf8 | 79 | class LoRaWANStack: private mbed::NonCopyable<LoRaWANStack> { |
valeyev | 0:e056ac8fecf8 | 80 | public: |
valeyev | 0:e056ac8fecf8 | 81 | static LoRaWANStack& get_lorawan_stack(); |
valeyev | 0:e056ac8fecf8 | 82 | |
valeyev | 0:e056ac8fecf8 | 83 | /** Binds radio driver to PHY layer. |
valeyev | 0:e056ac8fecf8 | 84 | * |
valeyev | 0:e056ac8fecf8 | 85 | * MAC layer is totally detached from the PHY layer so the stack layer |
valeyev | 0:e056ac8fecf8 | 86 | * needs to play the role of an arbitrator. This API gets a radio driver |
valeyev | 0:e056ac8fecf8 | 87 | * object from the application (via LoRaWANInterface), binds it to the PHY |
valeyev | 0:e056ac8fecf8 | 88 | * layer and returns MAC layer callback handles which the radio driver will |
valeyev | 0:e056ac8fecf8 | 89 | * use in order to report events. |
valeyev | 0:e056ac8fecf8 | 90 | * |
valeyev | 0:e056ac8fecf8 | 91 | * @param radio LoRaRadio object, i.e., the radio driver |
valeyev | 0:e056ac8fecf8 | 92 | * |
valeyev | 0:e056ac8fecf8 | 93 | * @return A list of callbacks from MAC layer that needs to |
valeyev | 0:e056ac8fecf8 | 94 | * be passed to radio driver |
valeyev | 0:e056ac8fecf8 | 95 | */ |
valeyev | 0:e056ac8fecf8 | 96 | radio_events_t *bind_radio_driver(LoRaRadio& radio); |
valeyev | 0:e056ac8fecf8 | 97 | |
valeyev | 0:e056ac8fecf8 | 98 | /** End device initialization. |
valeyev | 0:e056ac8fecf8 | 99 | * @param queue A pointer to an EventQueue passed from the application. |
valeyev | 0:e056ac8fecf8 | 100 | * @return LORAWAN_STATUS_OK on success, a negative error code on failure. |
valeyev | 0:e056ac8fecf8 | 101 | */ |
valeyev | 0:e056ac8fecf8 | 102 | lorawan_status_t initialize_mac_layer(events::EventQueue *queue); |
valeyev | 0:e056ac8fecf8 | 103 | |
valeyev | 0:e056ac8fecf8 | 104 | /** Sets all callbacks for the application. |
valeyev | 0:e056ac8fecf8 | 105 | * |
valeyev | 0:e056ac8fecf8 | 106 | * @param callbacks A pointer to the structure carrying callbacks. |
valeyev | 0:e056ac8fecf8 | 107 | */ |
valeyev | 0:e056ac8fecf8 | 108 | void set_lora_callbacks(lorawan_app_callbacks_t *callbacks); |
valeyev | 0:e056ac8fecf8 | 109 | |
valeyev | 0:e056ac8fecf8 | 110 | /** Adds channels to use. |
valeyev | 0:e056ac8fecf8 | 111 | * |
valeyev | 0:e056ac8fecf8 | 112 | * You can provide a list of channels with appropriate parameters filled |
valeyev | 0:e056ac8fecf8 | 113 | * in. However, this list is not absolute. In some regions, a CF |
valeyev | 0:e056ac8fecf8 | 114 | * list gets implemented by default, which means that the network can overwrite your channel |
valeyev | 0:e056ac8fecf8 | 115 | * frequency settings right after receiving a Join Accept. You may try |
valeyev | 0:e056ac8fecf8 | 116 | * to set up any channel or channels after that and if the channel requested |
valeyev | 0:e056ac8fecf8 | 117 | * is already active, the request is silently ignored. A negative error |
valeyev | 0:e056ac8fecf8 | 118 | * code is returned if there is any problem with parameters. |
valeyev | 0:e056ac8fecf8 | 119 | * |
valeyev | 0:e056ac8fecf8 | 120 | * You need to ensure that the base station nearby supports the channel or channels being added. |
valeyev | 0:e056ac8fecf8 | 121 | * |
valeyev | 0:e056ac8fecf8 | 122 | * If your list includes a default channel (a channel where Join Requests |
valeyev | 0:e056ac8fecf8 | 123 | * are received) you cannot fully configure the channel parameters. |
valeyev | 0:e056ac8fecf8 | 124 | * Either leave the channel settings to default or check your |
valeyev | 0:e056ac8fecf8 | 125 | * corresponding PHY layer implementation. For example, LoRaPHYE868. |
valeyev | 0:e056ac8fecf8 | 126 | * |
valeyev | 0:e056ac8fecf8 | 127 | * @param channel_plan A list of channels or a single channel. |
valeyev | 0:e056ac8fecf8 | 128 | * |
valeyev | 0:e056ac8fecf8 | 129 | * @return LORAWAN_STATUS_OK on success, a negative error |
valeyev | 0:e056ac8fecf8 | 130 | * code on failure. |
valeyev | 0:e056ac8fecf8 | 131 | */ |
valeyev | 0:e056ac8fecf8 | 132 | lorawan_status_t add_channels(const lorawan_channelplan_t &channel_plan); |
valeyev | 0:e056ac8fecf8 | 133 | |
valeyev | 0:e056ac8fecf8 | 134 | /** Removes a channel from the list. |
valeyev | 0:e056ac8fecf8 | 135 | * |
valeyev | 0:e056ac8fecf8 | 136 | * @param channel_id Index of the channel being removed |
valeyev | 0:e056ac8fecf8 | 137 | * |
valeyev | 0:e056ac8fecf8 | 138 | * @return LORAWAN_STATUS_OK on success, a negative error |
valeyev | 0:e056ac8fecf8 | 139 | * code on failure. |
valeyev | 0:e056ac8fecf8 | 140 | */ |
valeyev | 0:e056ac8fecf8 | 141 | lorawan_status_t remove_a_channel(uint8_t channel_id); |
valeyev | 0:e056ac8fecf8 | 142 | |
valeyev | 0:e056ac8fecf8 | 143 | /** Removes a previously set channel plan. |
valeyev | 0:e056ac8fecf8 | 144 | * |
valeyev | 0:e056ac8fecf8 | 145 | * @return LORAWAN_STATUS_OK on success, a negative error |
valeyev | 0:e056ac8fecf8 | 146 | * code on failure. |
valeyev | 0:e056ac8fecf8 | 147 | */ |
valeyev | 0:e056ac8fecf8 | 148 | lorawan_status_t drop_channel_list(); |
valeyev | 0:e056ac8fecf8 | 149 | |
valeyev | 0:e056ac8fecf8 | 150 | /** Gets a list of currently enabled channels . |
valeyev | 0:e056ac8fecf8 | 151 | * |
valeyev | 0:e056ac8fecf8 | 152 | * @param channel_plan The channel plan structure to store final result. |
valeyev | 0:e056ac8fecf8 | 153 | * |
valeyev | 0:e056ac8fecf8 | 154 | * @return LORAWAN_STATUS_OK on success, a negative error |
valeyev | 0:e056ac8fecf8 | 155 | * code on failure. |
valeyev | 0:e056ac8fecf8 | 156 | */ |
valeyev | 0:e056ac8fecf8 | 157 | lorawan_status_t get_enabled_channels(lorawan_channelplan_t &channel_plan); |
valeyev | 0:e056ac8fecf8 | 158 | |
valeyev | 0:e056ac8fecf8 | 159 | /** Sets up a retry counter for confirmed messages. |
valeyev | 0:e056ac8fecf8 | 160 | * |
valeyev | 0:e056ac8fecf8 | 161 | * Valid only for confirmed messages. This API sets the number of times the |
valeyev | 0:e056ac8fecf8 | 162 | * stack will retry a CONFIRMED message before giving up and reporting an |
valeyev | 0:e056ac8fecf8 | 163 | * error. |
valeyev | 0:e056ac8fecf8 | 164 | * |
valeyev | 0:e056ac8fecf8 | 165 | * @param count The number of retries for confirmed messages. |
valeyev | 0:e056ac8fecf8 | 166 | * |
valeyev | 0:e056ac8fecf8 | 167 | * @return LORAWAN_STATUS_OK or a negative error code. |
valeyev | 0:e056ac8fecf8 | 168 | */ |
valeyev | 0:e056ac8fecf8 | 169 | lorawan_status_t set_confirmed_msg_retry(uint8_t count); |
valeyev | 0:e056ac8fecf8 | 170 | |
valeyev | 0:e056ac8fecf8 | 171 | /** Sets up the data rate. |
valeyev | 0:e056ac8fecf8 | 172 | * |
valeyev | 0:e056ac8fecf8 | 173 | * `set_datarate()` first verifies whether the data rate given is valid or not. |
valeyev | 0:e056ac8fecf8 | 174 | * If it is valid, the system sets the given data rate to the channel. |
valeyev | 0:e056ac8fecf8 | 175 | * |
valeyev | 0:e056ac8fecf8 | 176 | * @param data_rate The intended data rate, for example DR_0 or DR_1. |
valeyev | 0:e056ac8fecf8 | 177 | * Note that the macro DR_* can mean different |
valeyev | 0:e056ac8fecf8 | 178 | * things in different regions. |
valeyev | 0:e056ac8fecf8 | 179 | * |
valeyev | 0:e056ac8fecf8 | 180 | * @return LORAWAN_STATUS_OK if everything goes well, otherwise |
valeyev | 0:e056ac8fecf8 | 181 | * a negative error code. |
valeyev | 0:e056ac8fecf8 | 182 | */ |
valeyev | 0:e056ac8fecf8 | 183 | lorawan_status_t set_channel_data_rate(uint8_t data_rate); |
valeyev | 0:e056ac8fecf8 | 184 | |
valeyev | 0:e056ac8fecf8 | 185 | /** Enables ADR. |
valeyev | 0:e056ac8fecf8 | 186 | * |
valeyev | 0:e056ac8fecf8 | 187 | * @param adr_enabled 0 ADR disabled, 1 ADR enabled. |
valeyev | 0:e056ac8fecf8 | 188 | * |
valeyev | 0:e056ac8fecf8 | 189 | * @return LORAWAN_STATUS_OK on success, a negative error |
valeyev | 0:e056ac8fecf8 | 190 | * code on failure. |
valeyev | 0:e056ac8fecf8 | 191 | */ |
valeyev | 0:e056ac8fecf8 | 192 | lorawan_status_t enable_adaptive_datarate(bool adr_enabled); |
valeyev | 0:e056ac8fecf8 | 193 | |
valeyev | 0:e056ac8fecf8 | 194 | /** Commissions a LoRa device. |
valeyev | 0:e056ac8fecf8 | 195 | * |
valeyev | 0:e056ac8fecf8 | 196 | * @param commission_data A structure representing all the commission |
valeyev | 0:e056ac8fecf8 | 197 | * information. |
valeyev | 0:e056ac8fecf8 | 198 | */ |
valeyev | 0:e056ac8fecf8 | 199 | void commission_device(const lorawan_dev_commission_t &commission_data); |
valeyev | 0:e056ac8fecf8 | 200 | |
valeyev | 0:e056ac8fecf8 | 201 | /** End device OTAA join. |
valeyev | 0:e056ac8fecf8 | 202 | * |
valeyev | 0:e056ac8fecf8 | 203 | * Based on the LoRaWAN standard 1.0.2. |
valeyev | 0:e056ac8fecf8 | 204 | * Join the network using the Over The Air Activation (OTAA) procedure. |
valeyev | 0:e056ac8fecf8 | 205 | * |
valeyev | 0:e056ac8fecf8 | 206 | * @param params The `lorawan_connect_t` type structure. |
valeyev | 0:e056ac8fecf8 | 207 | * |
valeyev | 0:e056ac8fecf8 | 208 | * @return LORAWAN_STATUS_OK or |
valeyev | 0:e056ac8fecf8 | 209 | * LORAWAN_STATUS_CONNECT_IN_PROGRESS on success, |
valeyev | 0:e056ac8fecf8 | 210 | * or a negative error code on failure. |
valeyev | 0:e056ac8fecf8 | 211 | */ |
valeyev | 0:e056ac8fecf8 | 212 | lorawan_status_t join_request_by_otaa(const lorawan_connect_t ¶ms); |
valeyev | 0:e056ac8fecf8 | 213 | |
valeyev | 0:e056ac8fecf8 | 214 | /** End device ABP join. |
valeyev | 0:e056ac8fecf8 | 215 | * |
valeyev | 0:e056ac8fecf8 | 216 | * Based on the LoRaWAN standard 1.0.2. |
valeyev | 0:e056ac8fecf8 | 217 | * Join the network using the Activation By Personalization (ABP) procedure. |
valeyev | 0:e056ac8fecf8 | 218 | * |
valeyev | 0:e056ac8fecf8 | 219 | * @param params The `lorawan_connect_t` type structure. |
valeyev | 0:e056ac8fecf8 | 220 | * |
valeyev | 0:e056ac8fecf8 | 221 | * @return LORAWAN_STATUS_OK or |
valeyev | 0:e056ac8fecf8 | 222 | * LORAWAN_STATUS_CONNECT_IN_PROGRESS on success, |
valeyev | 0:e056ac8fecf8 | 223 | * or a negative error code on failure. |
valeyev | 0:e056ac8fecf8 | 224 | */ |
valeyev | 0:e056ac8fecf8 | 225 | lorawan_status_t activation_by_personalization(const lorawan_connect_t ¶ms); |
valeyev | 0:e056ac8fecf8 | 226 | |
valeyev | 0:e056ac8fecf8 | 227 | /** Send message to gateway |
valeyev | 0:e056ac8fecf8 | 228 | * |
valeyev | 0:e056ac8fecf8 | 229 | * @param port The application port number. Port numbers 0 and 224 |
valeyev | 0:e056ac8fecf8 | 230 | * are reserved, whereas port numbers from 1 to 223 |
valeyev | 0:e056ac8fecf8 | 231 | * (0x01 to 0xDF) are valid port numbers. |
valeyev | 0:e056ac8fecf8 | 232 | * Anything out of this range is illegal. |
valeyev | 0:e056ac8fecf8 | 233 | * |
valeyev | 0:e056ac8fecf8 | 234 | * @param data A pointer to the data being sent. The ownership of the |
valeyev | 0:e056ac8fecf8 | 235 | * buffer is not transferred. The data is copied to the |
valeyev | 0:e056ac8fecf8 | 236 | * internal buffers. |
valeyev | 0:e056ac8fecf8 | 237 | * |
valeyev | 0:e056ac8fecf8 | 238 | * @param length The size of data in bytes. |
valeyev | 0:e056ac8fecf8 | 239 | * |
valeyev | 0:e056ac8fecf8 | 240 | * @param flags A flag used to determine what type of |
valeyev | 0:e056ac8fecf8 | 241 | * message is being sent, for example: |
valeyev | 0:e056ac8fecf8 | 242 | * |
valeyev | 0:e056ac8fecf8 | 243 | * MSG_UNCONFIRMED_FLAG = 0x01 |
valeyev | 0:e056ac8fecf8 | 244 | * MSG_CONFIRMED_FLAG = 0x02 |
valeyev | 0:e056ac8fecf8 | 245 | * MSG_MULTICAST_FLAG = 0x04 |
valeyev | 0:e056ac8fecf8 | 246 | * MSG_PROPRIETARY_FLAG = 0x08 |
valeyev | 0:e056ac8fecf8 | 247 | * MSG_MULTICAST_FLAG and MSG_PROPRIETARY_FLAG can be |
valeyev | 0:e056ac8fecf8 | 248 | * used in conjunction with MSG_UNCONFIRMED_FLAG and |
valeyev | 0:e056ac8fecf8 | 249 | * MSG_CONFIRMED_FLAG depending on the intended use. |
valeyev | 0:e056ac8fecf8 | 250 | * |
valeyev | 0:e056ac8fecf8 | 251 | * MSG_PROPRIETARY_FLAG|MSG_CONFIRMED_FLAG mask will set |
valeyev | 0:e056ac8fecf8 | 252 | * a confirmed message flag for a proprietary message. |
valeyev | 0:e056ac8fecf8 | 253 | * MSG_CONFIRMED_FLAG and MSG_UNCONFIRMED_FLAG are |
valeyev | 0:e056ac8fecf8 | 254 | * mutually exclusive. |
valeyev | 0:e056ac8fecf8 | 255 | * |
valeyev | 0:e056ac8fecf8 | 256 | * |
valeyev | 0:e056ac8fecf8 | 257 | * @return The number of bytes sent, or |
valeyev | 0:e056ac8fecf8 | 258 | * LORAWAN_STATUS_WOULD_BLOCK if another TX is |
valeyev | 0:e056ac8fecf8 | 259 | * ongoing, or a negative error code on failure. |
valeyev | 0:e056ac8fecf8 | 260 | */ |
valeyev | 0:e056ac8fecf8 | 261 | int16_t handle_tx(uint8_t port, const uint8_t* data, |
valeyev | 0:e056ac8fecf8 | 262 | uint16_t length, uint8_t flags); |
valeyev | 0:e056ac8fecf8 | 263 | |
valeyev | 0:e056ac8fecf8 | 264 | /** Receives a message from the Network Server. |
valeyev | 0:e056ac8fecf8 | 265 | * |
valeyev | 0:e056ac8fecf8 | 266 | * @param port The application port number. Port numbers 0 and 224 |
valeyev | 0:e056ac8fecf8 | 267 | * are reserved, whereas port numbers from 1 to 223 |
valeyev | 0:e056ac8fecf8 | 268 | * (0x01 to 0xDF) are valid port numbers. |
valeyev | 0:e056ac8fecf8 | 269 | * Anything out of this range is illegal. |
valeyev | 0:e056ac8fecf8 | 270 | * |
valeyev | 0:e056ac8fecf8 | 271 | * @param data A pointer to buffer where the received data will be |
valeyev | 0:e056ac8fecf8 | 272 | * stored. |
valeyev | 0:e056ac8fecf8 | 273 | * |
valeyev | 0:e056ac8fecf8 | 274 | * @param length The size of data in bytes |
valeyev | 0:e056ac8fecf8 | 275 | * |
valeyev | 0:e056ac8fecf8 | 276 | * @param flags A flag is used to determine what type of |
valeyev | 0:e056ac8fecf8 | 277 | * message is being received, for example: |
valeyev | 0:e056ac8fecf8 | 278 | * |
valeyev | 0:e056ac8fecf8 | 279 | * MSG_UNCONFIRMED_FLAG = 0x01, |
valeyev | 0:e056ac8fecf8 | 280 | * MSG_CONFIRMED_FLAG = 0x02 |
valeyev | 0:e056ac8fecf8 | 281 | * MSG_MULTICAST_FLAG = 0x04, |
valeyev | 0:e056ac8fecf8 | 282 | * MSG_PROPRIETARY_FLAG = 0x08 |
valeyev | 0:e056ac8fecf8 | 283 | * |
valeyev | 0:e056ac8fecf8 | 284 | * MSG_MULTICAST_FLAG and MSG_PROPRIETARY_FLAG can be |
valeyev | 0:e056ac8fecf8 | 285 | * used in conjunction with MSG_UNCONFIRMED_FLAG and |
valeyev | 0:e056ac8fecf8 | 286 | * MSG_CONFIRMED_FLAG depending on the intended use. |
valeyev | 0:e056ac8fecf8 | 287 | * |
valeyev | 0:e056ac8fecf8 | 288 | * MSG_PROPRIETARY_FLAG|MSG_CONFIRMED_FLAG mask will set |
valeyev | 0:e056ac8fecf8 | 289 | * a confirmed message flag for a proprietary message. |
valeyev | 0:e056ac8fecf8 | 290 | * |
valeyev | 0:e056ac8fecf8 | 291 | * MSG_CONFIRMED_FLAG and MSG_UNCONFIRMED_FLAG are |
valeyev | 0:e056ac8fecf8 | 292 | * not mutually exclusive, i.e., the user can subscribe to |
valeyev | 0:e056ac8fecf8 | 293 | * receive both CONFIRMED AND UNCONFIRMED messages at |
valeyev | 0:e056ac8fecf8 | 294 | * the same time. |
valeyev | 0:e056ac8fecf8 | 295 | * |
valeyev | 0:e056ac8fecf8 | 296 | * @return It could be one of these: |
valeyev | 0:e056ac8fecf8 | 297 | * i) 0 if there is nothing else to read. |
valeyev | 0:e056ac8fecf8 | 298 | * ii) Number of bytes written to user buffer. |
valeyev | 0:e056ac8fecf8 | 299 | * iii) LORAWAN_STATUS_WOULD_BLOCK if there is |
valeyev | 0:e056ac8fecf8 | 300 | * nothing available to read at the moment. |
valeyev | 0:e056ac8fecf8 | 301 | * iv) A negative error code on failure. |
valeyev | 0:e056ac8fecf8 | 302 | */ |
valeyev | 0:e056ac8fecf8 | 303 | int16_t handle_rx(const uint8_t port, uint8_t* data, |
valeyev | 0:e056ac8fecf8 | 304 | uint16_t length, uint8_t flags); |
valeyev | 0:e056ac8fecf8 | 305 | |
valeyev | 0:e056ac8fecf8 | 306 | /** Send Link Check Request MAC command. |
valeyev | 0:e056ac8fecf8 | 307 | * |
valeyev | 0:e056ac8fecf8 | 308 | * |
valeyev | 0:e056ac8fecf8 | 309 | * This API schedules a Link Check Request command (LinkCheckReq) for the network |
valeyev | 0:e056ac8fecf8 | 310 | * server and once the response, i.e., LinkCheckAns MAC command is received |
valeyev | 0:e056ac8fecf8 | 311 | * from the Network Server, an event is generated. |
valeyev | 0:e056ac8fecf8 | 312 | * |
valeyev | 0:e056ac8fecf8 | 313 | * A callback function for the link check response must be set prior to using |
valeyev | 0:e056ac8fecf8 | 314 | * this API, otherwise a LORAWAN_STATUS_PARAMETER_INVALID error is thrown. |
valeyev | 0:e056ac8fecf8 | 315 | * |
valeyev | 0:e056ac8fecf8 | 316 | * @return LORAWAN_STATUS_OK on successfully queuing a request, or |
valeyev | 0:e056ac8fecf8 | 317 | * a negative error code on failure. |
valeyev | 0:e056ac8fecf8 | 318 | * |
valeyev | 0:e056ac8fecf8 | 319 | */ |
valeyev | 0:e056ac8fecf8 | 320 | lorawan_status_t set_link_check_request(); |
valeyev | 0:e056ac8fecf8 | 321 | |
valeyev | 0:e056ac8fecf8 | 322 | /** Shuts down the LoRaWAN protocol. |
valeyev | 0:e056ac8fecf8 | 323 | * |
valeyev | 0:e056ac8fecf8 | 324 | * In response to the user call for disconnection, the stack shuts down itself. |
valeyev | 0:e056ac8fecf8 | 325 | * |
valeyev | 0:e056ac8fecf8 | 326 | * @return LORAWAN_STATUS_DEVICE_OFF on successfully shutdown. |
valeyev | 0:e056ac8fecf8 | 327 | */ |
valeyev | 0:e056ac8fecf8 | 328 | lorawan_status_t shutdown(); |
valeyev | 0:e056ac8fecf8 | 329 | |
valeyev | 0:e056ac8fecf8 | 330 | private: |
valeyev | 0:e056ac8fecf8 | 331 | LoRaWANStack(); |
valeyev | 0:e056ac8fecf8 | 332 | ~LoRaWANStack(); |
valeyev | 0:e056ac8fecf8 | 333 | |
valeyev | 0:e056ac8fecf8 | 334 | /** |
valeyev | 0:e056ac8fecf8 | 335 | * Checks if the user provided port is valid or not |
valeyev | 0:e056ac8fecf8 | 336 | */ |
valeyev | 0:e056ac8fecf8 | 337 | bool is_port_valid(uint8_t port); |
valeyev | 0:e056ac8fecf8 | 338 | |
valeyev | 0:e056ac8fecf8 | 339 | /** |
valeyev | 0:e056ac8fecf8 | 340 | * State machine for stack controller layer. |
valeyev | 0:e056ac8fecf8 | 341 | * Needs to be wriggled for every state change |
valeyev | 0:e056ac8fecf8 | 342 | */ |
valeyev | 0:e056ac8fecf8 | 343 | lorawan_status_t lora_state_machine(); |
valeyev | 0:e056ac8fecf8 | 344 | |
valeyev | 0:e056ac8fecf8 | 345 | /** |
valeyev | 0:e056ac8fecf8 | 346 | * Sets the current state of the device. |
valeyev | 0:e056ac8fecf8 | 347 | * Every call to set_device_state() should precede with |
valeyev | 0:e056ac8fecf8 | 348 | * a call to lora_state_machine() in order to take the state change |
valeyev | 0:e056ac8fecf8 | 349 | * in effect. |
valeyev | 0:e056ac8fecf8 | 350 | */ |
valeyev | 0:e056ac8fecf8 | 351 | void set_device_state(device_states_t new_state); |
valeyev | 0:e056ac8fecf8 | 352 | |
valeyev | 0:e056ac8fecf8 | 353 | /** |
valeyev | 0:e056ac8fecf8 | 354 | * Hands over the packet to Mac layer by posting an MCPS request. |
valeyev | 0:e056ac8fecf8 | 355 | */ |
valeyev | 0:e056ac8fecf8 | 356 | lorawan_status_t send_frame_to_mac(); |
valeyev | 0:e056ac8fecf8 | 357 | |
valeyev | 0:e056ac8fecf8 | 358 | /** |
valeyev | 0:e056ac8fecf8 | 359 | * Callback function for MLME indication. Mac layer calls this function once |
valeyev | 0:e056ac8fecf8 | 360 | * an MLME indication is received. This method translates Mac layer data |
valeyev | 0:e056ac8fecf8 | 361 | * structure into stack layer data structure. |
valeyev | 0:e056ac8fecf8 | 362 | */ |
valeyev | 0:e056ac8fecf8 | 363 | void mlme_indication_handler(loramac_mlme_indication_t *mlmeIndication); |
valeyev | 0:e056ac8fecf8 | 364 | |
valeyev | 0:e056ac8fecf8 | 365 | /** |
valeyev | 0:e056ac8fecf8 | 366 | * Handles an MLME request coming from the upper layers and delegates |
valeyev | 0:e056ac8fecf8 | 367 | * it to the Mac layer, for example, a Join request goes as an MLME request |
valeyev | 0:e056ac8fecf8 | 368 | * to the Mac layer. |
valeyev | 0:e056ac8fecf8 | 369 | */ |
valeyev | 0:e056ac8fecf8 | 370 | lorawan_status_t mlme_request_handler(loramac_mlme_req_t *mlme_request); |
valeyev | 0:e056ac8fecf8 | 371 | |
valeyev | 0:e056ac8fecf8 | 372 | /** |
valeyev | 0:e056ac8fecf8 | 373 | * Handles an MLME confirmation coming from the Mac layer and uses it to |
valeyev | 0:e056ac8fecf8 | 374 | * update the state for example, a Join Accept triggers an MLME confirmation, |
valeyev | 0:e056ac8fecf8 | 375 | * that eventually comes here and we take necessary steps accordingly. |
valeyev | 0:e056ac8fecf8 | 376 | */ |
valeyev | 0:e056ac8fecf8 | 377 | void mlme_confirm_handler(loramac_mlme_confirm_t *mlme_confirm); |
valeyev | 0:e056ac8fecf8 | 378 | |
valeyev | 0:e056ac8fecf8 | 379 | /** |
valeyev | 0:e056ac8fecf8 | 380 | * Handles an MCPS request while attempting to hand over a packet from |
valeyev | 0:e056ac8fecf8 | 381 | * upper layers to Mac layer. For example in response to send_frame_to_mac(), |
valeyev | 0:e056ac8fecf8 | 382 | * an MCPS request is generated. |
valeyev | 0:e056ac8fecf8 | 383 | */ |
valeyev | 0:e056ac8fecf8 | 384 | lorawan_status_t mcps_request_handler(loramac_mcps_req_t *mcps_request); |
valeyev | 0:e056ac8fecf8 | 385 | |
valeyev | 0:e056ac8fecf8 | 386 | /** |
valeyev | 0:e056ac8fecf8 | 387 | * Handles an MCPS confirmation coming from the Mac layer in response to an |
valeyev | 0:e056ac8fecf8 | 388 | * MCPS request. We take appropriate actions in response to the confirmation, |
valeyev | 0:e056ac8fecf8 | 389 | * e.g., letting the application know that ack was not received in case of |
valeyev | 0:e056ac8fecf8 | 390 | * a CONFIRMED message or scheduling error etc. |
valeyev | 0:e056ac8fecf8 | 391 | */ |
valeyev | 0:e056ac8fecf8 | 392 | void mcps_confirm_handler(loramac_mcps_confirm_t *mcps_confirm); |
valeyev | 0:e056ac8fecf8 | 393 | |
valeyev | 0:e056ac8fecf8 | 394 | /** |
valeyev | 0:e056ac8fecf8 | 395 | * Handles an MCPS indication coming from the Mac layer, e.g., once we |
valeyev | 0:e056ac8fecf8 | 396 | * receive a packet from the Network Server, it is indicated to this handler |
valeyev | 0:e056ac8fecf8 | 397 | * and consequently this handler posts an event to the application that |
valeyev | 0:e056ac8fecf8 | 398 | * there is something available to read. |
valeyev | 0:e056ac8fecf8 | 399 | */ |
valeyev | 0:e056ac8fecf8 | 400 | void mcps_indication_handler(loramac_mcps_indication_t *mcps_indication); |
valeyev | 0:e056ac8fecf8 | 401 | |
valeyev | 0:e056ac8fecf8 | 402 | /** |
valeyev | 0:e056ac8fecf8 | 403 | * Sets a MIB request, i.e., update a particular parameter etc. |
valeyev | 0:e056ac8fecf8 | 404 | */ |
valeyev | 0:e056ac8fecf8 | 405 | lorawan_status_t mib_set_request(loramac_mib_req_confirm_t *mib_set_params); |
valeyev | 0:e056ac8fecf8 | 406 | |
valeyev | 0:e056ac8fecf8 | 407 | /** |
valeyev | 0:e056ac8fecf8 | 408 | * Requests the MIB to inquire about a particular parameter. |
valeyev | 0:e056ac8fecf8 | 409 | */ |
valeyev | 0:e056ac8fecf8 | 410 | lorawan_status_t mib_get_request(loramac_mib_req_confirm_t *mib_get_params); |
valeyev | 0:e056ac8fecf8 | 411 | |
valeyev | 0:e056ac8fecf8 | 412 | /** |
valeyev | 0:e056ac8fecf8 | 413 | * Sets up user application port |
valeyev | 0:e056ac8fecf8 | 414 | */ |
valeyev | 0:e056ac8fecf8 | 415 | lorawan_status_t set_application_port(uint8_t port); |
valeyev | 0:e056ac8fecf8 | 416 | |
valeyev | 0:e056ac8fecf8 | 417 | /** |
valeyev | 0:e056ac8fecf8 | 418 | * Helper function to figure out if the user defined data size is possible |
valeyev | 0:e056ac8fecf8 | 419 | * to send or not. The allowed size for transmission depends on the current |
valeyev | 0:e056ac8fecf8 | 420 | * data rate set for the channel. If its not possible to send user defined |
valeyev | 0:e056ac8fecf8 | 421 | * packet size, this method returns the maximum possible size at the moment, |
valeyev | 0:e056ac8fecf8 | 422 | * otherwise the user defined size is returned which means all of user data |
valeyev | 0:e056ac8fecf8 | 423 | * can be sent. |
valeyev | 0:e056ac8fecf8 | 424 | */ |
valeyev | 0:e056ac8fecf8 | 425 | uint16_t check_possible_tx_size(uint16_t size); |
valeyev | 0:e056ac8fecf8 | 426 | |
valeyev | 0:e056ac8fecf8 | 427 | #if defined(LORAWAN_COMPLIANCE_TEST) |
valeyev | 0:e056ac8fecf8 | 428 | /** |
valeyev | 0:e056ac8fecf8 | 429 | * This function is used only for compliance testing |
valeyev | 0:e056ac8fecf8 | 430 | */ |
valeyev | 0:e056ac8fecf8 | 431 | void prepare_special_tx_frame(uint8_t port); |
valeyev | 0:e056ac8fecf8 | 432 | |
valeyev | 0:e056ac8fecf8 | 433 | /** |
valeyev | 0:e056ac8fecf8 | 434 | * Used only for compliance testing |
valeyev | 0:e056ac8fecf8 | 435 | */ |
valeyev | 0:e056ac8fecf8 | 436 | void compliance_test_handler(loramac_mcps_indication_t *mcps_indication); |
valeyev | 0:e056ac8fecf8 | 437 | |
valeyev | 0:e056ac8fecf8 | 438 | /** |
valeyev | 0:e056ac8fecf8 | 439 | * Used only for compliance testing |
valeyev | 0:e056ac8fecf8 | 440 | */ |
valeyev | 0:e056ac8fecf8 | 441 | lorawan_status_t send_compliance_test_frame_to_mac(); |
valeyev | 0:e056ac8fecf8 | 442 | #endif |
valeyev | 0:e056ac8fecf8 | 443 | |
valeyev | 0:e056ac8fecf8 | 444 | LoRaWANTimeHandler _lora_time; |
valeyev | 0:e056ac8fecf8 | 445 | LoRaMac _loramac; |
valeyev | 0:e056ac8fecf8 | 446 | LoRaPHY_region _lora_phy; |
valeyev | 0:e056ac8fecf8 | 447 | loramac_primitives_t LoRaMacPrimitives; |
valeyev | 0:e056ac8fecf8 | 448 | |
valeyev | 0:e056ac8fecf8 | 449 | #if defined(LORAWAN_COMPLIANCE_TEST) |
valeyev | 0:e056ac8fecf8 | 450 | uint8_t compliance_test_buffer[MBED_CONF_LORA_TX_MAX_SIZE]; |
valeyev | 0:e056ac8fecf8 | 451 | compliance_test_t _compliance_test; |
valeyev | 0:e056ac8fecf8 | 452 | #endif |
valeyev | 0:e056ac8fecf8 | 453 | |
valeyev | 0:e056ac8fecf8 | 454 | device_states_t _device_current_state; |
valeyev | 0:e056ac8fecf8 | 455 | lorawan_app_callbacks_t _callbacks; |
valeyev | 0:e056ac8fecf8 | 456 | radio_events_t *_mac_handlers; |
valeyev | 0:e056ac8fecf8 | 457 | lorawan_session_t _lw_session; |
valeyev | 0:e056ac8fecf8 | 458 | loramac_tx_message_t _tx_msg; |
valeyev | 0:e056ac8fecf8 | 459 | loramac_rx_message_t _rx_msg; |
valeyev | 0:e056ac8fecf8 | 460 | uint8_t _app_port; |
valeyev | 0:e056ac8fecf8 | 461 | uint8_t _num_retry; |
valeyev | 0:e056ac8fecf8 | 462 | events::EventQueue *_queue; |
valeyev | 0:e056ac8fecf8 | 463 | bool _duty_cycle_on; |
valeyev | 0:e056ac8fecf8 | 464 | }; |
valeyev | 0:e056ac8fecf8 | 465 | |
valeyev | 0:e056ac8fecf8 | 466 | #endif /* LORAWANSTACK_H_ */ |