Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /**
kenjiArai 0:5b88d5760320 2 * \file LoRaMacCommand.h
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * \brief LoRa MAC layer implementation
kenjiArai 0:5b88d5760320 5 *
kenjiArai 0:5b88d5760320 6 * \copyright Revised BSD License, see LICENSE.TXT file include in the project
kenjiArai 0:5b88d5760320 7 *
kenjiArai 0:5b88d5760320 8 * \code
kenjiArai 0:5b88d5760320 9 * ______ _
kenjiArai 0:5b88d5760320 10 * / _____) _ | |
kenjiArai 0:5b88d5760320 11 * ( (____ _____ ____ _| |_ _____ ____| |__
kenjiArai 0:5b88d5760320 12 * \____ \| ___ | (_ _) ___ |/ ___) _ \
kenjiArai 0:5b88d5760320 13 * _____) ) ____| | | || |_| ____( (___| | | |
kenjiArai 0:5b88d5760320 14 * (______/|_____)_|_|_| \__)_____)\____)_| |_|
kenjiArai 0:5b88d5760320 15 * (C)2013 Semtech
kenjiArai 0:5b88d5760320 16 *
kenjiArai 0:5b88d5760320 17 * ___ _____ _ ___ _ _____ ___ ___ ___ ___
kenjiArai 0:5b88d5760320 18 * / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
kenjiArai 0:5b88d5760320 19 * \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
kenjiArai 0:5b88d5760320 20 * |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
kenjiArai 0:5b88d5760320 21 * embedded.connectivity.solutions===============
kenjiArai 0:5b88d5760320 22 *
kenjiArai 0:5b88d5760320 23 * \endcode
kenjiArai 0:5b88d5760320 24 *
kenjiArai 0:5b88d5760320 25 * \author Miguel Luis ( Semtech )
kenjiArai 0:5b88d5760320 26 *
kenjiArai 0:5b88d5760320 27 * \author Gregory Cristian ( Semtech )
kenjiArai 0:5b88d5760320 28 *
kenjiArai 0:5b88d5760320 29 * \author Daniel Jaeckle ( STACKFORCE )
kenjiArai 0:5b88d5760320 30 *
kenjiArai 0:5b88d5760320 31 * \defgroup LORAMAC LoRa MAC layer implementation
kenjiArai 0:5b88d5760320 32 * This module specifies the API implementation of the LoRaMAC layer.
kenjiArai 0:5b88d5760320 33 * This is a placeholder for a detailed description of the LoRaMac
kenjiArai 0:5b88d5760320 34 * layer and the supported features.
kenjiArai 0:5b88d5760320 35 *
kenjiArai 0:5b88d5760320 36 * Copyright (c) 2017, Arm Limited and affiliates.
kenjiArai 0:5b88d5760320 37 * SPDX-License-Identifier: BSD-3-Clause
kenjiArai 0:5b88d5760320 38 *
kenjiArai 0:5b88d5760320 39 */
kenjiArai 0:5b88d5760320 40 #ifndef __LORAMACCOMMAND_H__
kenjiArai 0:5b88d5760320 41 #define __LORAMACCOMMAND_H__
kenjiArai 0:5b88d5760320 42
kenjiArai 0:5b88d5760320 43 #include <stdint.h>
kenjiArai 0:5b88d5760320 44 #include "system/lorawan_data_structures.h"
kenjiArai 0:5b88d5760320 45 #include "lorastack/phy/LoRaPHY.h"
kenjiArai 0:5b88d5760320 46
kenjiArai 0:5b88d5760320 47 /*!
kenjiArai 0:5b88d5760320 48 * Maximum MAC commands buffer size
kenjiArai 0:5b88d5760320 49 */
kenjiArai 0:5b88d5760320 50 #define LORA_MAC_COMMAND_MAX_LENGTH 128
kenjiArai 0:5b88d5760320 51
kenjiArai 0:5b88d5760320 52 class LoRaMac;
kenjiArai 0:5b88d5760320 53
kenjiArai 0:5b88d5760320 54 /** LoRaMacCommand Class
kenjiArai 0:5b88d5760320 55 * Helper class for LoRaMac layer to handle any MAC commands
kenjiArai 0:5b88d5760320 56 */
kenjiArai 0:5b88d5760320 57 class LoRaMacCommand {
kenjiArai 0:5b88d5760320 58
kenjiArai 0:5b88d5760320 59 public:
kenjiArai 0:5b88d5760320 60 LoRaMacCommand();
kenjiArai 0:5b88d5760320 61
kenjiArai 0:5b88d5760320 62 /**
kenjiArai 0:5b88d5760320 63 * @brief Clear MAC command buffer.
kenjiArai 0:5b88d5760320 64 */
kenjiArai 0:5b88d5760320 65 void clear_command_buffer(void);
kenjiArai 0:5b88d5760320 66
kenjiArai 0:5b88d5760320 67 /**
kenjiArai 0:5b88d5760320 68 * @brief Get the length of MAC commands
kenjiArai 0:5b88d5760320 69 *
kenjiArai 0:5b88d5760320 70 * @return status Length of used MAC buffer (bytes)
kenjiArai 0:5b88d5760320 71 */
kenjiArai 0:5b88d5760320 72 uint8_t get_mac_cmd_length() const;
kenjiArai 0:5b88d5760320 73
kenjiArai 0:5b88d5760320 74 /**
kenjiArai 0:5b88d5760320 75 * @brief Get MAC command buffer
kenjiArai 0:5b88d5760320 76 *
kenjiArai 0:5b88d5760320 77 * @return Pointer to MAC command buffer
kenjiArai 0:5b88d5760320 78 */
kenjiArai 0:5b88d5760320 79 uint8_t *get_mac_commands_buffer();
kenjiArai 0:5b88d5760320 80
kenjiArai 0:5b88d5760320 81 /**
kenjiArai 0:5b88d5760320 82 * @brief Parses the MAC commands which must be re-sent.
kenjiArai 0:5b88d5760320 83 */
kenjiArai 0:5b88d5760320 84 void parse_mac_commands_to_repeat();
kenjiArai 0:5b88d5760320 85
kenjiArai 0:5b88d5760320 86 /**
kenjiArai 0:5b88d5760320 87 * @brief Clear MAC command repeat buffer.
kenjiArai 0:5b88d5760320 88 */
kenjiArai 0:5b88d5760320 89 void clear_repeat_buffer();
kenjiArai 0:5b88d5760320 90
kenjiArai 0:5b88d5760320 91 /**
kenjiArai 0:5b88d5760320 92 * @brief Copy MAC commands from repeat buffer to actual MAC command buffer.
kenjiArai 0:5b88d5760320 93 */
kenjiArai 0:5b88d5760320 94 void copy_repeat_commands_to_buffer();
kenjiArai 0:5b88d5760320 95
kenjiArai 0:5b88d5760320 96 /**
kenjiArai 0:5b88d5760320 97 * @brief Get the length of MAC commands in repeat buffer
kenjiArai 0:5b88d5760320 98 *
kenjiArai 0:5b88d5760320 99 * @return status Length of used MAC Repeat buffer (bytes)
kenjiArai 0:5b88d5760320 100 */
kenjiArai 0:5b88d5760320 101 uint8_t get_repeat_commands_length() const;
kenjiArai 0:5b88d5760320 102
kenjiArai 0:5b88d5760320 103 /**
kenjiArai 0:5b88d5760320 104 * @brief Clear sticky MAC commands.
kenjiArai 0:5b88d5760320 105 */
kenjiArai 0:5b88d5760320 106 void clear_sticky_mac_cmd();
kenjiArai 0:5b88d5760320 107
kenjiArai 0:5b88d5760320 108 /**
kenjiArai 0:5b88d5760320 109 * @brief Check if MAC command buffer contains sticky commands
kenjiArai 0:5b88d5760320 110 *
kenjiArai 0:5b88d5760320 111 * @return status True: buffer has sticky MAC commands in it, false: no sticky commands in buffer
kenjiArai 0:5b88d5760320 112 */
kenjiArai 0:5b88d5760320 113 bool has_sticky_mac_cmd() const;
kenjiArai 0:5b88d5760320 114
kenjiArai 0:5b88d5760320 115 /**
kenjiArai 0:5b88d5760320 116 * @brief Decodes MAC commands in the fOpts field and in the payload
kenjiArai 0:5b88d5760320 117 *
kenjiArai 0:5b88d5760320 118 * @return status Function status. LORAWAN_STATUS_OK if command successful.
kenjiArai 0:5b88d5760320 119 */
kenjiArai 0:5b88d5760320 120 lorawan_status_t process_mac_commands(const uint8_t *payload, uint8_t mac_index,
kenjiArai 0:5b88d5760320 121 uint8_t commands_size, uint8_t snr,
kenjiArai 0:5b88d5760320 122 loramac_mlme_confirm_t &mlme_conf,
kenjiArai 0:5b88d5760320 123 lora_mac_system_params_t &mac_params,
kenjiArai 0:5b88d5760320 124 LoRaPHY &lora_phy);
kenjiArai 0:5b88d5760320 125
kenjiArai 0:5b88d5760320 126 /**
kenjiArai 0:5b88d5760320 127 * @brief Adds a new LinkCheckReq MAC command to be sent.
kenjiArai 0:5b88d5760320 128 *
kenjiArai 0:5b88d5760320 129 * @return status Function status: LORAWAN_STATUS_OK: OK,
kenjiArai 0:5b88d5760320 130 * LORAWAN_STATUS_LENGTH_ERROR: Buffer full
kenjiArai 0:5b88d5760320 131 */
kenjiArai 0:5b88d5760320 132 lorawan_status_t add_link_check_req();
kenjiArai 0:5b88d5760320 133
kenjiArai 0:5b88d5760320 134 /**
kenjiArai 0:5b88d5760320 135 * @brief Set battery level query callback method
kenjiArai 0:5b88d5760320 136 * If callback is not set, BAT_LEVEL_NO_MEASURE is returned.
kenjiArai 0:5b88d5760320 137 */
kenjiArai 0:5b88d5760320 138 void set_batterylevel_callback(mbed::Callback<uint8_t(void)> battery_level);
kenjiArai 0:5b88d5760320 139
kenjiArai 0:5b88d5760320 140 private:
kenjiArai 0:5b88d5760320 141 /**
kenjiArai 0:5b88d5760320 142 * @brief Get the remaining size of the MAC command buffer
kenjiArai 0:5b88d5760320 143 *
kenjiArai 0:5b88d5760320 144 * @return Remaining free space in buffer (bytes).
kenjiArai 0:5b88d5760320 145 */
kenjiArai 0:5b88d5760320 146 int32_t cmd_buffer_remaining() const;
kenjiArai 0:5b88d5760320 147
kenjiArai 0:5b88d5760320 148 /**
kenjiArai 0:5b88d5760320 149 * @brief Adds a new LinkAdrAns MAC command to be sent.
kenjiArai 0:5b88d5760320 150 *
kenjiArai 0:5b88d5760320 151 * @param [in] status Status bits
kenjiArai 0:5b88d5760320 152 *
kenjiArai 0:5b88d5760320 153 * @return status Function status: LORAWAN_STATUS_OK: OK,
kenjiArai 0:5b88d5760320 154 * LORAWAN_STATUS_LENGTH_ERROR: Buffer full
kenjiArai 0:5b88d5760320 155 */
kenjiArai 0:5b88d5760320 156 lorawan_status_t add_link_adr_ans(uint8_t status);
kenjiArai 0:5b88d5760320 157
kenjiArai 0:5b88d5760320 158 /**
kenjiArai 0:5b88d5760320 159 * @brief Adds a new DutyCycleAns MAC command to be sent.
kenjiArai 0:5b88d5760320 160 *
kenjiArai 0:5b88d5760320 161 * @return status Function status: LORAWAN_STATUS_OK: OK,
kenjiArai 0:5b88d5760320 162 * LORAWAN_STATUS_LENGTH_ERROR: Buffer full
kenjiArai 0:5b88d5760320 163 */
kenjiArai 0:5b88d5760320 164 lorawan_status_t add_duty_cycle_ans();
kenjiArai 0:5b88d5760320 165
kenjiArai 0:5b88d5760320 166 /**
kenjiArai 0:5b88d5760320 167 * @brief Adds a new RXParamSetupAns MAC command to be sent.
kenjiArai 0:5b88d5760320 168 *
kenjiArai 0:5b88d5760320 169 * @param [in] status Status bits
kenjiArai 0:5b88d5760320 170 *
kenjiArai 0:5b88d5760320 171 * @return status Function status: LORAWAN_STATUS_OK: OK,
kenjiArai 0:5b88d5760320 172 * LORAWAN_STATUS_LENGTH_ERROR: Buffer full
kenjiArai 0:5b88d5760320 173 */
kenjiArai 0:5b88d5760320 174 lorawan_status_t add_rx_param_setup_ans(uint8_t status);
kenjiArai 0:5b88d5760320 175
kenjiArai 0:5b88d5760320 176 /**
kenjiArai 0:5b88d5760320 177 * @brief Adds a new DevStatusAns MAC command to be sent.
kenjiArai 0:5b88d5760320 178 *
kenjiArai 0:5b88d5760320 179 * @param [in] battery Battery level
kenjiArai 0:5b88d5760320 180 * @param [in] margin Demodulation signal-to-noise ratio (dB)
kenjiArai 0:5b88d5760320 181 *
kenjiArai 0:5b88d5760320 182 * @return status Function status: LORAWAN_STATUS_OK: OK,
kenjiArai 0:5b88d5760320 183 * LORAWAN_STATUS_LENGTH_ERROR: Buffer full
kenjiArai 0:5b88d5760320 184 */
kenjiArai 0:5b88d5760320 185 lorawan_status_t add_dev_status_ans(uint8_t battery, uint8_t margin);
kenjiArai 0:5b88d5760320 186
kenjiArai 0:5b88d5760320 187 /**
kenjiArai 0:5b88d5760320 188 * @brief Adds a new NewChannelAns MAC command to be sent.
kenjiArai 0:5b88d5760320 189 *
kenjiArai 0:5b88d5760320 190 * @param [in] status Status bits
kenjiArai 0:5b88d5760320 191 *
kenjiArai 0:5b88d5760320 192 * @return status Function status: LORAWAN_STATUS_OK: OK,
kenjiArai 0:5b88d5760320 193 * LORAWAN_STATUS_LENGTH_ERROR: Buffer full
kenjiArai 0:5b88d5760320 194 */
kenjiArai 0:5b88d5760320 195 lorawan_status_t add_new_channel_ans(uint8_t status);
kenjiArai 0:5b88d5760320 196
kenjiArai 0:5b88d5760320 197 /**
kenjiArai 0:5b88d5760320 198 * @brief Adds a new RXTimingSetupAns MAC command to be sent.
kenjiArai 0:5b88d5760320 199 *
kenjiArai 0:5b88d5760320 200 * @return status Function status: LORAWAN_STATUS_OK: OK,
kenjiArai 0:5b88d5760320 201 * LORAWAN_STATUS_LENGTH_ERROR: Buffer full
kenjiArai 0:5b88d5760320 202 */
kenjiArai 0:5b88d5760320 203 lorawan_status_t add_rx_timing_setup_ans();
kenjiArai 0:5b88d5760320 204
kenjiArai 0:5b88d5760320 205 /**
kenjiArai 0:5b88d5760320 206 * @brief Adds a new TXParamSetupAns MAC command to be sent.
kenjiArai 0:5b88d5760320 207 *
kenjiArai 0:5b88d5760320 208 * @return status Function status: LORAWAN_STATUS_OK: OK,
kenjiArai 0:5b88d5760320 209 * LORAWAN_STATUS_LENGTH_ERROR: Buffer full
kenjiArai 0:5b88d5760320 210 */
kenjiArai 0:5b88d5760320 211 lorawan_status_t add_tx_param_setup_ans();
kenjiArai 0:5b88d5760320 212
kenjiArai 0:5b88d5760320 213 /**
kenjiArai 0:5b88d5760320 214 * @brief Adds a new DlChannelAns MAC command to be sent.
kenjiArai 0:5b88d5760320 215 *
kenjiArai 0:5b88d5760320 216 * @param [in] status Status bits
kenjiArai 0:5b88d5760320 217 *
kenjiArai 0:5b88d5760320 218 * @return status Function status: LORAWAN_STATUS_OK: OK,
kenjiArai 0:5b88d5760320 219 * LORAWAN_STATUS_LENGTH_ERROR: Buffer full
kenjiArai 0:5b88d5760320 220 */
kenjiArai 0:5b88d5760320 221 lorawan_status_t add_dl_channel_ans(uint8_t status);
kenjiArai 0:5b88d5760320 222
kenjiArai 0:5b88d5760320 223 private:
kenjiArai 0:5b88d5760320 224 /**
kenjiArai 0:5b88d5760320 225 * Indicates if there are any pending sticky MAC commands
kenjiArai 0:5b88d5760320 226 */
kenjiArai 0:5b88d5760320 227 bool sticky_mac_cmd;
kenjiArai 0:5b88d5760320 228
kenjiArai 0:5b88d5760320 229 /**
kenjiArai 0:5b88d5760320 230 * Contains the current Mac command buffer index in 'mac_cmd_buffer'
kenjiArai 0:5b88d5760320 231 */
kenjiArai 0:5b88d5760320 232 uint8_t mac_cmd_buf_idx;
kenjiArai 0:5b88d5760320 233
kenjiArai 0:5b88d5760320 234 /**
kenjiArai 0:5b88d5760320 235 * Contains the current Mac command buffer index for MAC commands to repeat in
kenjiArai 0:5b88d5760320 236 * 'mac_cmd_buffer_to_repeat'
kenjiArai 0:5b88d5760320 237 */
kenjiArai 0:5b88d5760320 238 uint8_t mac_cmd_buf_idx_to_repeat;
kenjiArai 0:5b88d5760320 239
kenjiArai 0:5b88d5760320 240 /**
kenjiArai 0:5b88d5760320 241 * Buffer containing the MAC layer commands
kenjiArai 0:5b88d5760320 242 */
kenjiArai 0:5b88d5760320 243 uint8_t mac_cmd_buffer[LORA_MAC_COMMAND_MAX_LENGTH];
kenjiArai 0:5b88d5760320 244
kenjiArai 0:5b88d5760320 245 /**
kenjiArai 0:5b88d5760320 246 * Buffer containing the MAC layer commands which must be repeated
kenjiArai 0:5b88d5760320 247 */
kenjiArai 0:5b88d5760320 248 uint8_t mac_cmd_buffer_to_repeat[LORA_MAC_COMMAND_MAX_LENGTH];
kenjiArai 0:5b88d5760320 249
kenjiArai 0:5b88d5760320 250 mbed::Callback<uint8_t(void)> _battery_level_cb;
kenjiArai 0:5b88d5760320 251 };
kenjiArai 0:5b88d5760320 252
kenjiArai 0:5b88d5760320 253 #endif //__LORAMACCOMMAND_H__