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.
Fork of OmniWheels by
mbed-os/features/lorawan/LoRaWANInterface.cpp@2:798925c9e4a8, 2018-05-01 (annotated)
- Committer:
- gustavatmel
- Date:
- Tue May 01 15:55:34 2018 +0000
- Revision:
- 2:798925c9e4a8
- Parent:
- 1:9c5af431a1f1
bluetooth
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gustavatmel | 1:9c5af431a1f1 | 1 | /** |
gustavatmel | 1:9c5af431a1f1 | 2 | * @file |
gustavatmel | 1:9c5af431a1f1 | 3 | * |
gustavatmel | 1:9c5af431a1f1 | 4 | * @brief Implementation of LoRaWANBase |
gustavatmel | 1:9c5af431a1f1 | 5 | * |
gustavatmel | 1:9c5af431a1f1 | 6 | * Copyright (c) 2017, Arm Limited and affiliates. |
gustavatmel | 1:9c5af431a1f1 | 7 | * SPDX-License-Identifier: Apache-2.0 |
gustavatmel | 1:9c5af431a1f1 | 8 | * |
gustavatmel | 1:9c5af431a1f1 | 9 | * Licensed under the Apache License, Version 2.0 (the "License"); |
gustavatmel | 1:9c5af431a1f1 | 10 | * you may not use this file except in compliance with the License. |
gustavatmel | 1:9c5af431a1f1 | 11 | * You may obtain a copy of the License at |
gustavatmel | 1:9c5af431a1f1 | 12 | * |
gustavatmel | 1:9c5af431a1f1 | 13 | * http://www.apache.org/licenses/LICENSE-2.0 |
gustavatmel | 1:9c5af431a1f1 | 14 | * |
gustavatmel | 1:9c5af431a1f1 | 15 | * Unless required by applicable law or agreed to in writing, software |
gustavatmel | 1:9c5af431a1f1 | 16 | * distributed under the License is distributed on an "AS IS" BASIS, |
gustavatmel | 1:9c5af431a1f1 | 17 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
gustavatmel | 1:9c5af431a1f1 | 18 | * See the License for the specific language governing permissions and |
gustavatmel | 1:9c5af431a1f1 | 19 | * limitations under the License. |
gustavatmel | 1:9c5af431a1f1 | 20 | */ |
gustavatmel | 1:9c5af431a1f1 | 21 | |
gustavatmel | 1:9c5af431a1f1 | 22 | #include "lorawan/LoRaWANInterface.h" |
gustavatmel | 1:9c5af431a1f1 | 23 | |
gustavatmel | 1:9c5af431a1f1 | 24 | using namespace events; |
gustavatmel | 1:9c5af431a1f1 | 25 | |
gustavatmel | 1:9c5af431a1f1 | 26 | inline LoRaWANStack& stk_obj() |
gustavatmel | 1:9c5af431a1f1 | 27 | { |
gustavatmel | 1:9c5af431a1f1 | 28 | return LoRaWANStack::get_lorawan_stack(); |
gustavatmel | 1:9c5af431a1f1 | 29 | } |
gustavatmel | 1:9c5af431a1f1 | 30 | |
gustavatmel | 1:9c5af431a1f1 | 31 | LoRaWANInterface::LoRaWANInterface(LoRaRadio& radio) : _link_check_requested(false) |
gustavatmel | 1:9c5af431a1f1 | 32 | { |
gustavatmel | 1:9c5af431a1f1 | 33 | // Pass mac_handlers to radio to the radio driver after |
gustavatmel | 1:9c5af431a1f1 | 34 | // binding radio driver to PHY layer |
gustavatmel | 1:9c5af431a1f1 | 35 | radio_events_t *events = stk_obj().bind_radio_driver(radio); |
gustavatmel | 1:9c5af431a1f1 | 36 | radio.lock(); |
gustavatmel | 1:9c5af431a1f1 | 37 | radio.init_radio(events); |
gustavatmel | 1:9c5af431a1f1 | 38 | radio.unlock(); |
gustavatmel | 1:9c5af431a1f1 | 39 | } |
gustavatmel | 1:9c5af431a1f1 | 40 | |
gustavatmel | 1:9c5af431a1f1 | 41 | LoRaWANInterface::~LoRaWANInterface() |
gustavatmel | 1:9c5af431a1f1 | 42 | { |
gustavatmel | 1:9c5af431a1f1 | 43 | } |
gustavatmel | 1:9c5af431a1f1 | 44 | |
gustavatmel | 1:9c5af431a1f1 | 45 | lorawan_status_t LoRaWANInterface::initialize(EventQueue *queue) |
gustavatmel | 1:9c5af431a1f1 | 46 | { |
gustavatmel | 1:9c5af431a1f1 | 47 | if(!queue) { |
gustavatmel | 1:9c5af431a1f1 | 48 | return LORAWAN_STATUS_PARAMETER_INVALID; |
gustavatmel | 1:9c5af431a1f1 | 49 | } |
gustavatmel | 1:9c5af431a1f1 | 50 | |
gustavatmel | 1:9c5af431a1f1 | 51 | return stk_obj().initialize_mac_layer(queue); |
gustavatmel | 1:9c5af431a1f1 | 52 | } |
gustavatmel | 1:9c5af431a1f1 | 53 | |
gustavatmel | 1:9c5af431a1f1 | 54 | lorawan_status_t LoRaWANInterface::connect() |
gustavatmel | 1:9c5af431a1f1 | 55 | { |
gustavatmel | 1:9c5af431a1f1 | 56 | // connection attempt without parameters. |
gustavatmel | 1:9c5af431a1f1 | 57 | // System tries to look for configuration in mbed_lib.json that can be |
gustavatmel | 1:9c5af431a1f1 | 58 | // overridden by mbed_app.json. However, if none of the json files are |
gustavatmel | 1:9c5af431a1f1 | 59 | // available (highly unlikely), we still fallback to some default parameters. |
gustavatmel | 1:9c5af431a1f1 | 60 | // Check lorawan_data_structure for fallback defaults. |
gustavatmel | 1:9c5af431a1f1 | 61 | |
gustavatmel | 1:9c5af431a1f1 | 62 | lorawan_connect_t connection_params; |
gustavatmel | 1:9c5af431a1f1 | 63 | |
gustavatmel | 1:9c5af431a1f1 | 64 | if (MBED_CONF_LORA_OVER_THE_AIR_ACTIVATION) { |
gustavatmel | 1:9c5af431a1f1 | 65 | static uint8_t dev_eui[] = MBED_CONF_LORA_DEVICE_EUI; |
gustavatmel | 1:9c5af431a1f1 | 66 | static uint8_t app_eui[] = MBED_CONF_LORA_APPLICATION_EUI; |
gustavatmel | 1:9c5af431a1f1 | 67 | static uint8_t app_key[] = MBED_CONF_LORA_APPLICATION_KEY; |
gustavatmel | 1:9c5af431a1f1 | 68 | /** |
gustavatmel | 1:9c5af431a1f1 | 69 | * |
gustavatmel | 1:9c5af431a1f1 | 70 | * OTAA join |
gustavatmel | 1:9c5af431a1f1 | 71 | */ |
gustavatmel | 1:9c5af431a1f1 | 72 | connection_params.connect_type = LORAWAN_CONNECTION_OTAA; |
gustavatmel | 1:9c5af431a1f1 | 73 | connection_params.connection_u.otaa.app_eui = app_eui; |
gustavatmel | 1:9c5af431a1f1 | 74 | connection_params.connection_u.otaa.dev_eui = dev_eui; |
gustavatmel | 1:9c5af431a1f1 | 75 | connection_params.connection_u.otaa.app_key = app_key; |
gustavatmel | 1:9c5af431a1f1 | 76 | connection_params.connection_u.otaa.nb_trials = MBED_CONF_LORA_NB_TRIALS; |
gustavatmel | 1:9c5af431a1f1 | 77 | |
gustavatmel | 1:9c5af431a1f1 | 78 | return connect(connection_params); |
gustavatmel | 1:9c5af431a1f1 | 79 | } else { |
gustavatmel | 1:9c5af431a1f1 | 80 | static uint8_t nwk_skey[] = MBED_CONF_LORA_NWKSKEY; |
gustavatmel | 1:9c5af431a1f1 | 81 | static uint8_t app_skey[] = MBED_CONF_LORA_APPSKEY; |
gustavatmel | 1:9c5af431a1f1 | 82 | static uint32_t dev_addr = MBED_CONF_LORA_DEVICE_ADDRESS; |
gustavatmel | 1:9c5af431a1f1 | 83 | static uint32_t nwk_id = (MBED_CONF_LORA_DEVICE_ADDRESS & LORAWAN_NETWORK_ID_MASK); |
gustavatmel | 1:9c5af431a1f1 | 84 | |
gustavatmel | 1:9c5af431a1f1 | 85 | /** |
gustavatmel | 1:9c5af431a1f1 | 86 | * |
gustavatmel | 1:9c5af431a1f1 | 87 | * ABP connection |
gustavatmel | 1:9c5af431a1f1 | 88 | */ |
gustavatmel | 1:9c5af431a1f1 | 89 | connection_params.connect_type = LORAWAN_CONNECTION_ABP; |
gustavatmel | 1:9c5af431a1f1 | 90 | connection_params.connection_u.abp.nwk_id = nwk_id; |
gustavatmel | 1:9c5af431a1f1 | 91 | connection_params.connection_u.abp.dev_addr = dev_addr; |
gustavatmel | 1:9c5af431a1f1 | 92 | connection_params.connection_u.abp.nwk_skey = nwk_skey; |
gustavatmel | 1:9c5af431a1f1 | 93 | connection_params.connection_u.abp.app_skey = app_skey; |
gustavatmel | 1:9c5af431a1f1 | 94 | |
gustavatmel | 1:9c5af431a1f1 | 95 | return connect(connection_params); |
gustavatmel | 1:9c5af431a1f1 | 96 | } |
gustavatmel | 1:9c5af431a1f1 | 97 | } |
gustavatmel | 1:9c5af431a1f1 | 98 | |
gustavatmel | 1:9c5af431a1f1 | 99 | lorawan_status_t LoRaWANInterface::connect(const lorawan_connect_t &connect) |
gustavatmel | 1:9c5af431a1f1 | 100 | { |
gustavatmel | 1:9c5af431a1f1 | 101 | lorawan_status_t mac_status; |
gustavatmel | 1:9c5af431a1f1 | 102 | |
gustavatmel | 1:9c5af431a1f1 | 103 | if (connect.connect_type == LORAWAN_CONNECTION_OTAA) { |
gustavatmel | 1:9c5af431a1f1 | 104 | mac_status = stk_obj().join_request_by_otaa(connect); |
gustavatmel | 1:9c5af431a1f1 | 105 | } else if (connect.connect_type == LORAWAN_CONNECTION_ABP) { |
gustavatmel | 1:9c5af431a1f1 | 106 | mac_status = stk_obj().activation_by_personalization(connect); |
gustavatmel | 1:9c5af431a1f1 | 107 | } else { |
gustavatmel | 1:9c5af431a1f1 | 108 | return LORAWAN_STATUS_PARAMETER_INVALID; |
gustavatmel | 1:9c5af431a1f1 | 109 | } |
gustavatmel | 1:9c5af431a1f1 | 110 | |
gustavatmel | 1:9c5af431a1f1 | 111 | return mac_status; |
gustavatmel | 1:9c5af431a1f1 | 112 | } |
gustavatmel | 1:9c5af431a1f1 | 113 | |
gustavatmel | 1:9c5af431a1f1 | 114 | lorawan_status_t LoRaWANInterface::disconnect() |
gustavatmel | 1:9c5af431a1f1 | 115 | { |
gustavatmel | 1:9c5af431a1f1 | 116 | return stk_obj().shutdown(); |
gustavatmel | 1:9c5af431a1f1 | 117 | } |
gustavatmel | 1:9c5af431a1f1 | 118 | |
gustavatmel | 1:9c5af431a1f1 | 119 | lorawan_status_t LoRaWANInterface::add_link_check_request() |
gustavatmel | 1:9c5af431a1f1 | 120 | { |
gustavatmel | 1:9c5af431a1f1 | 121 | _link_check_requested = true; |
gustavatmel | 1:9c5af431a1f1 | 122 | return stk_obj().set_link_check_request(); |
gustavatmel | 1:9c5af431a1f1 | 123 | } |
gustavatmel | 1:9c5af431a1f1 | 124 | |
gustavatmel | 1:9c5af431a1f1 | 125 | void LoRaWANInterface::remove_link_check_request() |
gustavatmel | 1:9c5af431a1f1 | 126 | { |
gustavatmel | 1:9c5af431a1f1 | 127 | _link_check_requested = false; |
gustavatmel | 1:9c5af431a1f1 | 128 | } |
gustavatmel | 1:9c5af431a1f1 | 129 | |
gustavatmel | 1:9c5af431a1f1 | 130 | lorawan_status_t LoRaWANInterface::set_datarate(uint8_t data_rate) |
gustavatmel | 1:9c5af431a1f1 | 131 | { |
gustavatmel | 1:9c5af431a1f1 | 132 | return stk_obj().set_channel_data_rate(data_rate); |
gustavatmel | 1:9c5af431a1f1 | 133 | } |
gustavatmel | 1:9c5af431a1f1 | 134 | |
gustavatmel | 1:9c5af431a1f1 | 135 | lorawan_status_t LoRaWANInterface::set_confirmed_msg_retries(uint8_t count) |
gustavatmel | 1:9c5af431a1f1 | 136 | { |
gustavatmel | 1:9c5af431a1f1 | 137 | return stk_obj().set_confirmed_msg_retry(count); |
gustavatmel | 1:9c5af431a1f1 | 138 | } |
gustavatmel | 1:9c5af431a1f1 | 139 | |
gustavatmel | 1:9c5af431a1f1 | 140 | lorawan_status_t LoRaWANInterface::enable_adaptive_datarate() |
gustavatmel | 1:9c5af431a1f1 | 141 | { |
gustavatmel | 1:9c5af431a1f1 | 142 | return stk_obj().enable_adaptive_datarate(true); |
gustavatmel | 1:9c5af431a1f1 | 143 | } |
gustavatmel | 1:9c5af431a1f1 | 144 | |
gustavatmel | 1:9c5af431a1f1 | 145 | lorawan_status_t LoRaWANInterface::disable_adaptive_datarate() |
gustavatmel | 1:9c5af431a1f1 | 146 | { |
gustavatmel | 1:9c5af431a1f1 | 147 | return stk_obj().enable_adaptive_datarate(false); |
gustavatmel | 1:9c5af431a1f1 | 148 | } |
gustavatmel | 1:9c5af431a1f1 | 149 | |
gustavatmel | 1:9c5af431a1f1 | 150 | lorawan_status_t LoRaWANInterface::set_channel_plan(const lorawan_channelplan_t &channel_plan) |
gustavatmel | 1:9c5af431a1f1 | 151 | { |
gustavatmel | 1:9c5af431a1f1 | 152 | return stk_obj().add_channels(channel_plan); |
gustavatmel | 1:9c5af431a1f1 | 153 | } |
gustavatmel | 1:9c5af431a1f1 | 154 | |
gustavatmel | 1:9c5af431a1f1 | 155 | lorawan_status_t LoRaWANInterface::get_channel_plan(lorawan_channelplan_t &channel_plan) |
gustavatmel | 1:9c5af431a1f1 | 156 | { |
gustavatmel | 1:9c5af431a1f1 | 157 | return stk_obj().get_enabled_channels(channel_plan); |
gustavatmel | 1:9c5af431a1f1 | 158 | } |
gustavatmel | 1:9c5af431a1f1 | 159 | |
gustavatmel | 1:9c5af431a1f1 | 160 | lorawan_status_t LoRaWANInterface::remove_channel(uint8_t id) |
gustavatmel | 1:9c5af431a1f1 | 161 | { |
gustavatmel | 1:9c5af431a1f1 | 162 | return stk_obj().remove_a_channel(id); |
gustavatmel | 1:9c5af431a1f1 | 163 | } |
gustavatmel | 1:9c5af431a1f1 | 164 | |
gustavatmel | 1:9c5af431a1f1 | 165 | lorawan_status_t LoRaWANInterface::remove_channel_plan() |
gustavatmel | 1:9c5af431a1f1 | 166 | { |
gustavatmel | 1:9c5af431a1f1 | 167 | return stk_obj().drop_channel_list(); |
gustavatmel | 1:9c5af431a1f1 | 168 | } |
gustavatmel | 1:9c5af431a1f1 | 169 | |
gustavatmel | 1:9c5af431a1f1 | 170 | int16_t LoRaWANInterface::send(uint8_t port, const uint8_t* data, |
gustavatmel | 1:9c5af431a1f1 | 171 | uint16_t length, int flags) |
gustavatmel | 1:9c5af431a1f1 | 172 | { |
gustavatmel | 1:9c5af431a1f1 | 173 | if (_link_check_requested) { |
gustavatmel | 1:9c5af431a1f1 | 174 | // add a link check request with normal data, until the application |
gustavatmel | 1:9c5af431a1f1 | 175 | // explicitly removes it. |
gustavatmel | 1:9c5af431a1f1 | 176 | add_link_check_request(); |
gustavatmel | 1:9c5af431a1f1 | 177 | } |
gustavatmel | 1:9c5af431a1f1 | 178 | |
gustavatmel | 1:9c5af431a1f1 | 179 | if (data) { |
gustavatmel | 1:9c5af431a1f1 | 180 | return stk_obj().handle_tx(port, data, length, flags); |
gustavatmel | 1:9c5af431a1f1 | 181 | } else { |
gustavatmel | 1:9c5af431a1f1 | 182 | return LORAWAN_STATUS_PARAMETER_INVALID; |
gustavatmel | 1:9c5af431a1f1 | 183 | } |
gustavatmel | 1:9c5af431a1f1 | 184 | } |
gustavatmel | 1:9c5af431a1f1 | 185 | |
gustavatmel | 1:9c5af431a1f1 | 186 | int16_t LoRaWANInterface::receive(uint8_t port, uint8_t* data, uint16_t length, |
gustavatmel | 1:9c5af431a1f1 | 187 | int flags) |
gustavatmel | 1:9c5af431a1f1 | 188 | { |
gustavatmel | 1:9c5af431a1f1 | 189 | if (data && length > 0) { |
gustavatmel | 1:9c5af431a1f1 | 190 | return stk_obj().handle_rx(port, data, length, flags); |
gustavatmel | 1:9c5af431a1f1 | 191 | } else { |
gustavatmel | 1:9c5af431a1f1 | 192 | return LORAWAN_STATUS_PARAMETER_INVALID; |
gustavatmel | 1:9c5af431a1f1 | 193 | } |
gustavatmel | 1:9c5af431a1f1 | 194 | } |
gustavatmel | 1:9c5af431a1f1 | 195 | |
gustavatmel | 1:9c5af431a1f1 | 196 | lorawan_status_t LoRaWANInterface::add_app_callbacks(lorawan_app_callbacks_t *callbacks) |
gustavatmel | 1:9c5af431a1f1 | 197 | { |
gustavatmel | 1:9c5af431a1f1 | 198 | |
gustavatmel | 1:9c5af431a1f1 | 199 | if (!callbacks || !callbacks->events) { |
gustavatmel | 1:9c5af431a1f1 | 200 | // Event Callback is mandatory |
gustavatmel | 1:9c5af431a1f1 | 201 | return LORAWAN_STATUS_PARAMETER_INVALID; |
gustavatmel | 1:9c5af431a1f1 | 202 | } |
gustavatmel | 1:9c5af431a1f1 | 203 | |
gustavatmel | 1:9c5af431a1f1 | 204 | stk_obj().set_lora_callbacks(callbacks); |
gustavatmel | 1:9c5af431a1f1 | 205 | return LORAWAN_STATUS_OK; |
gustavatmel | 1:9c5af431a1f1 | 206 | } |