Denislam Valeev / Mbed OS Nucleo_rtos_basic
Committer:
valeyev
Date:
Tue Mar 13 07:17:50 2018 +0000
Revision:
0:e056ac8fecf8
looking for...

Who changed what in which revision?

UserRevisionLine numberNew 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 &params);
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 &params);
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_ */