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.
main.cpp
00001 /** 00002 * Copyright (c) 2017, Arm Limited and affiliates. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 */ 00017 #include <stdio.h> 00018 00019 #include "lorawan/LoRaWANInterface.h" 00020 #include "lorawan/system/lorawan_data_structures.h" 00021 #include "events/EventQueue.h" 00022 00023 // Application helpers 00024 #include "trace_helper.h" 00025 #include "lora_radio_helper.h" 00026 00027 using namespace events; 00028 00029 // Max payload size can be LORAMAC_PHY_MAXPAYLOAD. 00030 // This example only communicates with much shorter messages (<30 bytes). 00031 // If longer messages are used, these buffers must be changed accordingly. 00032 uint8_t tx_buffer[30]; 00033 uint8_t rx_buffer[30]; 00034 00035 /* 00036 * Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for testing 00037 */ 00038 #define TX_TIMER 10000 00039 00040 /** 00041 * Maximum number of events for the event queue. 00042 * 10 is the safe number for the stack events, however, if application 00043 * also uses the queue for whatever purposes, this number should be increased. 00044 */ 00045 #define MAX_NUMBER_OF_EVENTS 10 00046 00047 /** 00048 * Maximum number of retries for CONFIRMED messages before giving up 00049 */ 00050 #define CONFIRMED_MSG_RETRY_COUNTER 3 00051 00052 00053 /** 00054 * This event queue is the global event queue for both the 00055 * application and stack. To conserve memory, the stack is designed to run 00056 * in the same thread as the application and the application is responsible for 00057 * providing an event queue to the stack that will be used for ISR deferment as 00058 * well as application information event queuing. 00059 */ 00060 static EventQueue ev_queue(MAX_NUMBER_OF_EVENTS *EVENTS_EVENT_SIZE); 00061 00062 /** 00063 * Event handler. 00064 * 00065 * This will be passed to the LoRaWAN stack to queue events for the 00066 * application which in turn drive the application. 00067 */ 00068 static void lora_event_handler(lorawan_event_t event); 00069 00070 /** 00071 * Constructing Mbed LoRaWANInterface and passing it the radio object from lora_radio_helper. 00072 */ 00073 static LoRaWANInterface lorawan(radio); 00074 00075 /** 00076 * Application specific callbacks 00077 */ 00078 static lorawan_app_callbacks_t callbacks; 00079 00080 /** 00081 * Entry point for application 00082 */ 00083 int main(void) 00084 { 00085 // setup tracing 00086 setup_trace(); 00087 00088 // stores the status of a call to LoRaWAN protocol 00089 lorawan_status_t retcode; 00090 00091 // Initialize LoRaWAN stack 00092 if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { 00093 printf("\r\n LoRa initialization failed! \r\n"); 00094 return -1; 00095 } 00096 00097 printf("\r\n Mbed LoRaWANStack initialized \r\n"); 00098 00099 // prepare application callbacks 00100 callbacks.events = mbed::callback(lora_event_handler); 00101 lorawan.add_app_callbacks(&callbacks); 00102 00103 // Set number of retries in case of CONFIRMED messages 00104 if (lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER) 00105 != LORAWAN_STATUS_OK) { 00106 printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n"); 00107 return -1; 00108 } 00109 00110 printf("\r\n CONFIRMED message retries : %d \r\n", 00111 CONFIRMED_MSG_RETRY_COUNTER); 00112 00113 // Enable adaptive data rate 00114 if (lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) { 00115 printf("\r\n enable_adaptive_datarate failed! \r\n"); 00116 return -1; 00117 } 00118 00119 printf("\r\n Adaptive data rate (ADR) - Enabled \r\n"); 00120 00121 retcode = lorawan.connect(); 00122 00123 if (retcode == LORAWAN_STATUS_OK || 00124 retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { 00125 } else { 00126 printf("\r\n Connection error, code = %d \r\n", retcode); 00127 return -1; 00128 } 00129 00130 printf("\r\n Connection - In Progress ...\r\n"); 00131 00132 // make your event queue dispatching events forever 00133 ev_queue.dispatch_forever(); 00134 00135 return 0; 00136 } 00137 00138 /** 00139 * Sends a message to the Network Server 00140 */ 00141 static void send_message() 00142 { 00143 uint16_t packet_len; 00144 int16_t retcode; 00145 printf("\n\rHello world"); 00146 00147 packet_len = sprintf((char *) tx_buffer, "Hello world"); 00148 00149 retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, 00150 MSG_UNCONFIRMED_FLAG); 00151 00152 if (retcode < 0) { 00153 retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n") 00154 : printf("\r\n send() - Error code %d \r\n", retcode); 00155 00156 if (retcode == LORAWAN_STATUS_WOULD_BLOCK) { 00157 //retry in 3 seconds 00158 if (MBED_CONF_LORA_DUTY_CYCLE_ON) { 00159 ev_queue.call_in(3000, send_message); 00160 } 00161 } 00162 return; 00163 } 00164 00165 printf("\r\n %d bytes scheduled for transmission \r\n", retcode); 00166 memset(tx_buffer, 0, sizeof(tx_buffer)); 00167 } 00168 00169 /** 00170 * Event handler 00171 */ 00172 static void lora_event_handler(lorawan_event_t event) 00173 { 00174 switch (event) { 00175 case CONNECTED: 00176 printf("\r\n Connection - Successful \r\n"); 00177 if (MBED_CONF_LORA_DUTY_CYCLE_ON) { 00178 send_message(); 00179 } else { 00180 ev_queue.call_every(TX_TIMER, send_message); 00181 } 00182 00183 break; 00184 case DISCONNECTED: 00185 ev_queue.break_dispatch(); 00186 printf("\r\n Disconnected Successfully \r\n"); 00187 break; 00188 case TX_DONE: 00189 printf("\r\n Message Sent to Network Server \r\n"); 00190 if (MBED_CONF_LORA_DUTY_CYCLE_ON) { 00191 send_message(); 00192 } 00193 break; 00194 case TX_TIMEOUT: 00195 case TX_ERROR: 00196 case TX_CRYPTO_ERROR: 00197 case TX_SCHEDULING_ERROR: 00198 printf("\r\n Transmission Error - EventCode = %d \r\n", event); 00199 // try again 00200 if (MBED_CONF_LORA_DUTY_CYCLE_ON) { 00201 send_message(); 00202 } 00203 break; 00204 case RX_DONE: 00205 printf("\r\n Received message from Network Server \r\n"); 00206 break; 00207 case RX_TIMEOUT: 00208 case RX_ERROR: 00209 printf("\r\n Error in reception - Code = %d \r\n", event); 00210 break; 00211 case JOIN_FAILURE: 00212 printf("\r\n OTAA Failed - Check Keys \r\n"); 00213 break; 00214 case UPLINK_REQUIRED: 00215 printf("\r\n Uplink required by NS \r\n"); 00216 if (MBED_CONF_LORA_DUTY_CYCLE_ON) { 00217 send_message(); 00218 } 00219 break; 00220 default: 00221 MBED_ASSERT("Unknown Event"); 00222 } 00223 } 00224 00225 // EOF
Generated on Fri Jul 22 2022 23:22:00 by
1.7.2