BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:55:34 2018 +0000
Revision:
2:798925c9e4a8
Parent:
1:9c5af431a1f1
bluetooth

Who changed what in which revision?

UserRevisionLine numberNew 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 }