MTDOT-EVB link check code for site survey

Dependencies:   DOGS102 GpsParser MTS-Serial NCP5623B libmDot mbed-rtos mbed

Committer:
mfiore
Date:
Tue Oct 27 20:06:51 2015 +0000
Revision:
2:b197488a50dc
Parent:
1:4e3ee9c860e3
update mbed-rtos to latest, replace mbed-src with mbed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
falingtrea 0:dba397ff987f 1 /**
falingtrea 0:dba397ff987f 2 * @file main.cpp
falingtrea 0:dba397ff987f 3 * @brief Main application for mDot-EVB Automated Link Check demo
falingtrea 0:dba397ff987f 4 * @author Tim Barr MultiTech Systems Inc.
falingtrea 0:dba397ff987f 5 * @version 1.02
falingtrea 0:dba397ff987f 6 * @see
falingtrea 0:dba397ff987f 7 *
falingtrea 0:dba397ff987f 8 * Copyright (c) 2015
falingtrea 0:dba397ff987f 9 *
falingtrea 0:dba397ff987f 10 * Licensed under the Apache License, Version 2.0 (the "License");
falingtrea 0:dba397ff987f 11 * you may not use this file except in compliance with the License.
falingtrea 0:dba397ff987f 12 * You may obtain a copy of the License at
falingtrea 0:dba397ff987f 13 *
falingtrea 0:dba397ff987f 14 * http://www.apache.org/licenses/LICENSE-2.0
falingtrea 0:dba397ff987f 15 *
falingtrea 0:dba397ff987f 16 * Unless required by applicable law or agreed to in writing, software
falingtrea 0:dba397ff987f 17 * distributed under the License is distributed on an "AS IS" BASIS,
falingtrea 0:dba397ff987f 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
falingtrea 0:dba397ff987f 19 * See the License for the specific language governing permissions and
falingtrea 0:dba397ff987f 20 * limitations under the License.
falingtrea 0:dba397ff987f 21 *
mfiore 1:4e3ee9c860e3 22 * 1.00 TAB 10/22/15 Copied from MDOT-EVB-LinkCheck version 1.02.
falingtrea 0:dba397ff987f 23 * Added mutex around certain mDot radio commands.
falingtrea 0:dba397ff987f 24 * Moved ping check code to callable function. Added sweep
falingtrea 0:dba397ff987f 25 * mode, re-wrote join code, and modified button operation
falingtrea 0:dba397ff987f 26 * Fixed error in Downlink QOS SNR display.
falingtrea 0:dba397ff987f 27 */
falingtrea 0:dba397ff987f 28
falingtrea 0:dba397ff987f 29 #include "mbed.h"
falingtrea 0:dba397ff987f 30 #include "NCP5623B.h"
falingtrea 0:dba397ff987f 31 #include "DOGS102.h"
falingtrea 0:dba397ff987f 32 #include "font_6x8.h"
falingtrea 0:dba397ff987f 33 #include "MultiTech_Logo.h"
falingtrea 0:dba397ff987f 34 #include "mDot.h"
falingtrea 0:dba397ff987f 35 #include "rtos.h"
falingtrea 0:dba397ff987f 36 #include "GPSPARSER.h"
falingtrea 0:dba397ff987f 37 #include "MTSSerial.h"
falingtrea 0:dba397ff987f 38 #include <string>
falingtrea 0:dba397ff987f 39 #include <vector>
falingtrea 0:dba397ff987f 40 #include <ctime>
falingtrea 0:dba397ff987f 41
falingtrea 0:dba397ff987f 42 enum LED1_COLOR {
falingtrea 0:dba397ff987f 43 RED = 0,
falingtrea 0:dba397ff987f 44 GREEN = 1
falingtrea 0:dba397ff987f 45 };
falingtrea 0:dba397ff987f 46
falingtrea 0:dba397ff987f 47 /*
falingtrea 0:dba397ff987f 48 * union for converting from 32-bit to 4 8-bit values
falingtrea 0:dba397ff987f 49 */
falingtrea 0:dba397ff987f 50 union convert32 {
falingtrea 0:dba397ff987f 51 int32_t f_s; // convert from signed 32 bit int
falingtrea 0:dba397ff987f 52 uint32_t f_u; // convert from unsigned 32 bit int
falingtrea 0:dba397ff987f 53 uint8_t t_u[4]; // convert to 8 bit unsigned array
falingtrea 0:dba397ff987f 54 };
falingtrea 0:dba397ff987f 55
falingtrea 0:dba397ff987f 56 /*
falingtrea 0:dba397ff987f 57 * union for converting from 16- bit to 2 8-bit values
falingtrea 0:dba397ff987f 58 */
falingtrea 0:dba397ff987f 59 union convert16 {
falingtrea 0:dba397ff987f 60 int16_t f_s; // convert from signed 16 bit int
falingtrea 0:dba397ff987f 61 uint16_t f_u; // convert from unsigned 16 bit int
falingtrea 0:dba397ff987f 62 uint8_t t_u[2]; // convert to 8 bit unsigned array
falingtrea 0:dba397ff987f 63 };
falingtrea 0:dba397ff987f 64
falingtrea 0:dba397ff987f 65 //DigitalIn mDot02(PA_2); // GPIO/UART_TX
falingtrea 0:dba397ff987f 66 //DigitalOut mDot03(PA_3); // GPIO/UART_RX
falingtrea 0:dba397ff987f 67 //DigitalIn mDot04(PA_6); // GPIO/SPI_MISO
falingtrea 0:dba397ff987f 68 //DigitalIn mDot06(PA_8); // GPIO/I2C_SCL
falingtrea 0:dba397ff987f 69 //DigitalIn mDot07(PC_9); // GPIO/I2C_SDA
falingtrea 0:dba397ff987f 70
falingtrea 0:dba397ff987f 71 InterruptIn mDot08(PA_12); // GPIO/USB PB S1 on EVB
falingtrea 0:dba397ff987f 72 InterruptIn mDot09(PA_11); // GPIO/USB PB S2 on EVB
falingtrea 0:dba397ff987f 73
falingtrea 0:dba397ff987f 74 //DigitalIn mDot11(PA_7); // GPIO/SPI_MOSI
falingtrea 0:dba397ff987f 75
falingtrea 0:dba397ff987f 76 InterruptIn mDot12(PA_0); // GPIO/UART_CTS PRESSURE_INT2 on EVB
falingtrea 0:dba397ff987f 77 DigitalOut mDot13(PC_13,1); // GPIO LCD_C/D
falingtrea 0:dba397ff987f 78 InterruptIn mDot15(PC_1); // GPIO LIGHT_PROX_INT on EVB
falingtrea 0:dba397ff987f 79 InterruptIn mDot16(PA_1); // GPIO/UART_RTS ACCEL_INT2 on EVB
falingtrea 0:dba397ff987f 80 DigitalOut mDot17(PA_4,1); // GPIO/SPI_NCS LCD_CS on EVB
falingtrea 0:dba397ff987f 81
falingtrea 0:dba397ff987f 82 //DigitalIn mDot18(PA_5); // GPIO/SPI_SCK
falingtrea 0:dba397ff987f 83
falingtrea 0:dba397ff987f 84 //DigitalInOut mDot19(PB_0,PIN_INPUT,PullNone,0); // GPIO PushPull LED Low=Red High=Green set MODE=INPUT to turn off
falingtrea 0:dba397ff987f 85 AnalogIn mDot20(PB_1); // GPIO Current Sense Analog in on EVB
falingtrea 0:dba397ff987f 86
falingtrea 0:dba397ff987f 87 Serial debugUART(PA_9, PA_10); // mDot debug UART
falingtrea 0:dba397ff987f 88
falingtrea 0:dba397ff987f 89 MTSSerial mDotUART(PA_2,PA_3); // mDot external UART mDot02 and mDot03
falingtrea 0:dba397ff987f 90
falingtrea 0:dba397ff987f 91 I2C mDoti2c(PC_9,PA_8); // mDot External I2C mDot6 and mDot7
falingtrea 0:dba397ff987f 92
falingtrea 0:dba397ff987f 93 SPI mDotspi(PA_7,PA_6,PA_5); // mDot external SPI mDot11, mDot4, and mDot18
falingtrea 0:dba397ff987f 94
falingtrea 0:dba397ff987f 95 /* **** replace these values with the proper public or private network settings ****
falingtrea 0:dba397ff987f 96 * config_network_nameand config_network_pass are for private networks.
falingtrea 0:dba397ff987f 97 */
falingtrea 0:dba397ff987f 98 static std::string config_network_name = "TAB-CubeNet";
falingtrea 0:dba397ff987f 99 static std::string config_network_pass = "1nt3gral";
falingtrea 0:dba397ff987f 100 //static std::string config_network_name = "Arclight";
falingtrea 0:dba397ff987f 101 //static std::string config_network_pass = "default1";
falingtrea 0:dba397ff987f 102 static uint8_t config_frequency_sub_band = 5;
falingtrea 0:dba397ff987f 103
falingtrea 0:dba397ff987f 104 //static std::string config_network_name = "GregCDT8";
falingtrea 0:dba397ff987f 105 //static std::string config_network_pass = "myAEP8chars";
falingtrea 0:dba397ff987f 106 //static uint8_t config_frequency_sub_band = 1;
falingtrea 0:dba397ff987f 107
falingtrea 0:dba397ff987f 108 /* config_app_id and config_app_key are for public networks.
falingtrea 0:dba397ff987f 109 static uint8_t app_id[8] = {0x00,0x01,0x02,0x03,0x0A,0x0B,0x0C,0x0D};
falingtrea 0:dba397ff987f 110 std::vector<uint8_t> config_app_id;
falingtrea 0:dba397ff987f 111 static uint8_t app_key[16] = {0x00,0x01,0x02,0x03,0x0A,0x0B,0x0C,0x0D};
falingtrea 0:dba397ff987f 112 std::vector<uint8_t> config_app_key;
falingtrea 0:dba397ff987f 113 */
falingtrea 0:dba397ff987f 114
falingtrea 0:dba397ff987f 115 uint8_t result;
falingtrea 0:dba397ff987f 116 uint8_t data;
falingtrea 0:dba397ff987f 117 uint8_t sf_val = mDot::SF_7;
falingtrea 0:dba397ff987f 118 uint8_t pwr_val = 11; // dBm
falingtrea 0:dba397ff987f 119 uint8_t swp_pwr;
falingtrea 0:dba397ff987f 120 uint8_t swp_sf;
falingtrea 0:dba397ff987f 121
falingtrea 0:dba397ff987f 122 const uint8_t sweep_table [2][4] = {
mfiore 1:4e3ee9c860e3 123 { 11, 14, 18, 20},
mfiore 1:4e3ee9c860e3 124 {mDot::SF_7, mDot::SF_8, mDot::SF_9, mDot::SF_10}
mfiore 1:4e3ee9c860e3 125 };
falingtrea 0:dba397ff987f 126
falingtrea 0:dba397ff987f 127 // max size of text string for 6x8 font. Set to 12 if using 8x8 font
falingtrea 0:dba397ff987f 128 char txtstr[17];
falingtrea 0:dba397ff987f 129
falingtrea 0:dba397ff987f 130 int32_t mdot_ret;
falingtrea 0:dba397ff987f 131 int32_t join_delay;
falingtrea 0:dba397ff987f 132
falingtrea 0:dba397ff987f 133 osThreadId mainThreadID;
falingtrea 0:dba397ff987f 134
falingtrea 0:dba397ff987f 135 // flags for push button debounce code
falingtrea 0:dba397ff987f 136 bool pb1_low = false;
falingtrea 0:dba397ff987f 137 bool pb2_low = false;
falingtrea 0:dba397ff987f 138 bool toggle_text = false;
falingtrea 0:dba397ff987f 139 bool main_single = false;
falingtrea 0:dba397ff987f 140 bool main_sweep = false;
falingtrea 0:dba397ff987f 141
falingtrea 0:dba397ff987f 142 NCP5623B* evbBackLight;
falingtrea 0:dba397ff987f 143 DOGS102* evbLCD;
falingtrea 0:dba397ff987f 144
falingtrea 0:dba397ff987f 145 mDot* mdot_radio;
falingtrea 0:dba397ff987f 146 Mutex mdot_mutex;
falingtrea 0:dba397ff987f 147
falingtrea 0:dba397ff987f 148 GPSPARSER* mdot_gps;
falingtrea 0:dba397ff987f 149
falingtrea 0:dba397ff987f 150 convert32 convertL;
falingtrea 0:dba397ff987f 151 convert16 convertS;
falingtrea 0:dba397ff987f 152
falingtrea 0:dba397ff987f 153 void pb1ISR(void);
falingtrea 0:dba397ff987f 154 void pb2ISR(void);
falingtrea 0:dba397ff987f 155 void pb1_debounce(void const *args);
falingtrea 0:dba397ff987f 156 void pb2_debounce(void const *args);
falingtrea 0:dba397ff987f 157
falingtrea 0:dba397ff987f 158 void log_error(mDot* dot, const char* msg, int32_t retval);
falingtrea 0:dba397ff987f 159
falingtrea 0:dba397ff987f 160 uint8_t ping_check(uint8_t set_pwr, uint8_t set_sf, uint8_t pings_per_check = 1);
falingtrea 0:dba397ff987f 161
falingtrea 0:dba397ff987f 162 int main()
falingtrea 0:dba397ff987f 163 {
falingtrea 0:dba397ff987f 164 std::vector<uint8_t> mdot_EUI;
falingtrea 0:dba397ff987f 165 uint16_t i = 0;
falingtrea 0:dba397ff987f 166
falingtrea 0:dba397ff987f 167 // Number of ping attempts per Radio setting set here
falingtrea 0:dba397ff987f 168 uint8_t number_of_pings = 5;
falingtrea 0:dba397ff987f 169
falingtrea 0:dba397ff987f 170 debugUART.baud(115200);
falingtrea 0:dba397ff987f 171
mfiore 1:4e3ee9c860e3 172 printf ("Start program \r\n");
falingtrea 0:dba397ff987f 173
falingtrea 0:dba397ff987f 174 Thread thread_1(pb1_debounce);
falingtrea 0:dba397ff987f 175 Thread thread_2(pb2_debounce);
falingtrea 0:dba397ff987f 176
mfiore 1:4e3ee9c860e3 177 printf("Thread init done\r\n");
falingtrea 0:dba397ff987f 178
falingtrea 0:dba397ff987f 179 mainThreadID = osThreadGetId();
falingtrea 0:dba397ff987f 180
mfiore 1:4e3ee9c860e3 181 printf("Device init start\r\n");
falingtrea 0:dba397ff987f 182
falingtrea 0:dba397ff987f 183 evbBackLight = new NCP5623B(mDoti2c); // setup backlight and LED 2 driver chip
falingtrea 0:dba397ff987f 184 evbLCD = new DOGS102(mDotspi, mDot17, mDot13); // setup LCD
falingtrea 0:dba397ff987f 185
falingtrea 0:dba397ff987f 186 printf ("Devices init done\r\n");
falingtrea 0:dba397ff987f 187 /*
falingtrea 0:dba397ff987f 188 * Setup SW1 as Data rate and power out select
falingtrea 0:dba397ff987f 189 */
falingtrea 0:dba397ff987f 190 mDot08.disable_irq();
falingtrea 0:dba397ff987f 191 mDot08.fall(&pb1ISR);
falingtrea 0:dba397ff987f 192
falingtrea 0:dba397ff987f 193 /*
falingtrea 0:dba397ff987f 194 * need to call this function after rise or fall because rise/fall sets
falingtrea 0:dba397ff987f 195 * mode to PullNone
falingtrea 0:dba397ff987f 196 */
falingtrea 0:dba397ff987f 197 mDot08.mode(PullUp);
falingtrea 0:dba397ff987f 198
falingtrea 0:dba397ff987f 199 mDot08.enable_irq();
falingtrea 0:dba397ff987f 200
falingtrea 0:dba397ff987f 201 /*
falingtrea 0:dba397ff987f 202 * Setup SW2 as send PING
falingtrea 0:dba397ff987f 203 */
falingtrea 0:dba397ff987f 204 mDot09.disable_irq();
falingtrea 0:dba397ff987f 205 mDot09.fall(&pb2ISR);
falingtrea 0:dba397ff987f 206
falingtrea 0:dba397ff987f 207 /*
falingtrea 0:dba397ff987f 208 * need to call this function after rise or fall because rise/fall sets
falingtrea 0:dba397ff987f 209 * mode to PullNone
falingtrea 0:dba397ff987f 210 */
falingtrea 0:dba397ff987f 211 mDot09.mode(PullUp);
falingtrea 0:dba397ff987f 212
falingtrea 0:dba397ff987f 213 mDot09.enable_irq();
falingtrea 0:dba397ff987f 214
falingtrea 0:dba397ff987f 215 /*
falingtrea 0:dba397ff987f 216 * Setting other InterruptIn pins with Pull Ups
falingtrea 0:dba397ff987f 217 */
falingtrea 0:dba397ff987f 218 mDot12.mode(PullUp);
falingtrea 0:dba397ff987f 219 mDot15.mode(PullUp);
falingtrea 0:dba397ff987f 220 mDot16.mode(PullUp);
falingtrea 0:dba397ff987f 221
mfiore 1:4e3ee9c860e3 222 printf("Switch IRQs set\r\n");
mfiore 1:4e3ee9c860e3 223
falingtrea 0:dba397ff987f 224 printf("font table address %p\r\n",&font_6x8);
falingtrea 0:dba397ff987f 225 printf("bitmap address %p\r\n",&MultiTech_Logo);
falingtrea 0:dba397ff987f 226
falingtrea 0:dba397ff987f 227 // Setup and display logo on LCD
falingtrea 0:dba397ff987f 228 evbLCD->startUpdate();
falingtrea 0:dba397ff987f 229
falingtrea 0:dba397ff987f 230 evbLCD->writeBitmap(0,0,MultiTech_Logo);
falingtrea 0:dba397ff987f 231
falingtrea 0:dba397ff987f 232 sprintf(txtstr,"MTDOT-EVB");
falingtrea 0:dba397ff987f 233 evbLCD->writeText(24,3,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 234 sprintf(txtstr,"Link Check Demo");
falingtrea 0:dba397ff987f 235 evbLCD->writeText(6,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 236
falingtrea 0:dba397ff987f 237 evbLCD->endUpdate();
falingtrea 0:dba397ff987f 238
falingtrea 0:dba397ff987f 239 printf("\r\n setup mdot\r\n");
falingtrea 0:dba397ff987f 240
falingtrea 0:dba397ff987f 241 // get a mDot handle
falingtrea 0:dba397ff987f 242 mdot_radio = mDot::getInstance();
falingtrea 0:dba397ff987f 243
falingtrea 0:dba397ff987f 244 if (mdot_radio) {
falingtrea 0:dba397ff987f 245 // reset to default config so we know what state we're in
mfiore 1:4e3ee9c860e3 246 mdot_mutex.lock(); // lock mdot before setting configuration
falingtrea 0:dba397ff987f 247 mdot_radio->resetConfig();
falingtrea 0:dba397ff987f 248
falingtrea 0:dba397ff987f 249 // Setting up LED1 as activity LED
falingtrea 0:dba397ff987f 250 mdot_radio->setActivityLedPin(PB_0);
falingtrea 0:dba397ff987f 251 mdot_radio->setActivityLedEnable(true);
falingtrea 0:dba397ff987f 252
falingtrea 0:dba397ff987f 253 // Read node ID
falingtrea 0:dba397ff987f 254 mdot_EUI = mdot_radio->getDeviceId();
falingtrea 0:dba397ff987f 255 printf("mDot EUI = ");
falingtrea 0:dba397ff987f 256
falingtrea 0:dba397ff987f 257 for (i=0; i<mdot_EUI.size(); i++) {
falingtrea 0:dba397ff987f 258 printf("%02x ", mdot_EUI[i]);
falingtrea 0:dba397ff987f 259 }
falingtrea 0:dba397ff987f 260 printf("\r\n");
falingtrea 0:dba397ff987f 261
falingtrea 0:dba397ff987f 262 // Setting up the mDot with network information.
falingtrea 0:dba397ff987f 263
falingtrea 0:dba397ff987f 264 /*
falingtrea 0:dba397ff987f 265 * This call sets up private or public mode on the MTDOT. Set the function to true if
falingtrea 0:dba397ff987f 266 * connecting to a public network
falingtrea 0:dba397ff987f 267 */
falingtrea 0:dba397ff987f 268 printf("setting Private Network Mode\r\n");
falingtrea 0:dba397ff987f 269 if ((mdot_ret = mdot_radio->setPublicNetwork(false)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 270 log_error(mdot_radio, "failed to set Public Network Mode", mdot_ret);
falingtrea 0:dba397ff987f 271 }
falingtrea 0:dba397ff987f 272
falingtrea 0:dba397ff987f 273 /*
falingtrea 0:dba397ff987f 274 * Frequency sub-band is valid for NAM only and for Private networks should be set to a value
falingtrea 0:dba397ff987f 275 * between 1-8 that matches the the LoRa gateway setting. Public networks use sub-band 0 only.
falingtrea 0:dba397ff987f 276 * This function can be commented out for EU networks
falingtrea 0:dba397ff987f 277 */
falingtrea 0:dba397ff987f 278 printf("setting frequency sub band\r\n");
falingtrea 0:dba397ff987f 279 if ((mdot_ret = mdot_radio->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 280 log_error(mdot_radio, "failed to set frequency sub band", mdot_ret);
falingtrea 0:dba397ff987f 281 }
falingtrea 0:dba397ff987f 282
falingtrea 0:dba397ff987f 283 /*
falingtrea 0:dba397ff987f 284 * Setting TX power for radio. Max allowed is +14dBm for EU and +20 dBm for NAM. Default is +11 dBm
falingtrea 0:dba397ff987f 285 */
falingtrea 0:dba397ff987f 286 printf("setting TX Power Level to %2d dBm\r\n", pwr_val);
falingtrea 0:dba397ff987f 287 if ((mdot_ret = mdot_radio->setTxPower(pwr_val)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 288 log_error(mdot_radio, "failed to set TX power level", mdot_ret);
falingtrea 0:dba397ff987f 289 }
falingtrea 0:dba397ff987f 290
falingtrea 0:dba397ff987f 291 /*
falingtrea 0:dba397ff987f 292 * Setting TX data rate for radio. Max allowed is SF_12 for EU and SF10 dBm for NAM. Default is SF_10
falingtrea 0:dba397ff987f 293 */
falingtrea 0:dba397ff987f 294 printf("setting TX data rate to SF_7\r\n");
falingtrea 0:dba397ff987f 295 if ((mdot_ret = mdot_radio->setTxDataRate(sf_val)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 296 log_error(mdot_radio, "failed to set TX data rate", mdot_ret);
falingtrea 0:dba397ff987f 297 }
falingtrea 0:dba397ff987f 298
mfiore 1:4e3ee9c860e3 299 sprintf(txtstr,"DR=%2d Pwr=%2d",(12 - sf_val),pwr_val);
falingtrea 0:dba397ff987f 300 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 301 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 302
falingtrea 0:dba397ff987f 303 /*
falingtrea 0:dba397ff987f 304 * Setting packet ACK to 1 try.
falingtrea 0:dba397ff987f 305 */
falingtrea 0:dba397ff987f 306 printf("setting Packet retry to 1\r\n");
falingtrea 0:dba397ff987f 307 if ((mdot_ret = mdot_radio->setAck(1)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 308 log_error(mdot_radio, "failed to set packet retry\r\n", mdot_ret);
falingtrea 0:dba397ff987f 309 }
falingtrea 0:dba397ff987f 310
falingtrea 0:dba397ff987f 311 /*
falingtrea 0:dba397ff987f 312 * setNetworkName is used for private networks.
falingtrea 0:dba397ff987f 313 * Use setNetworkID(AppID) for public networks
falingtrea 0:dba397ff987f 314 */
falingtrea 0:dba397ff987f 315
falingtrea 0:dba397ff987f 316 // config_app_id.assign(app_id,app_id+7);
falingtrea 0:dba397ff987f 317
falingtrea 0:dba397ff987f 318 printf("setting network name\r\n");
falingtrea 0:dba397ff987f 319 if ((mdot_ret = mdot_radio->setNetworkName(config_network_name)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 320 // if ((mdot_ret = mdot_radio->setNetworkID(config_app_id)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 321 log_error(mdot_radio, "failed to set network name", mdot_ret);
falingtrea 0:dba397ff987f 322 }
falingtrea 0:dba397ff987f 323
falingtrea 0:dba397ff987f 324 /*
falingtrea 0:dba397ff987f 325 * setNetworkPassphrase is used for private networks
falingtrea 0:dba397ff987f 326 * Use setNetworkKey for public networks
falingtrea 0:dba397ff987f 327 */
falingtrea 0:dba397ff987f 328
falingtrea 0:dba397ff987f 329 // config_app_key.assign(app_key,app_key+15);
falingtrea 0:dba397ff987f 330
falingtrea 0:dba397ff987f 331 printf("setting network password\r\n");
falingtrea 0:dba397ff987f 332 if ((mdot_ret = mdot_radio->setNetworkPassphrase(config_network_pass)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 333 // if ((mdot_ret = mdot_radio->setNetworkKey(config_app_key)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 334 log_error(mdot_radio, "failed to set network password", mdot_ret);
falingtrea 0:dba397ff987f 335 }
falingtrea 0:dba397ff987f 336
falingtrea 0:dba397ff987f 337 mdot_mutex.unlock(); // unlock mdot mutex before join attempt so SW1 can work
falingtrea 0:dba397ff987f 338
falingtrea 0:dba397ff987f 339 // attempt to join the network
falingtrea 0:dba397ff987f 340 printf("joining network\r\n");
falingtrea 0:dba397ff987f 341 do {
mfiore 1:4e3ee9c860e3 342 mdot_mutex.lock(); // lock mdot mutex before join attempt
falingtrea 0:dba397ff987f 343 mdot_ret = mdot_radio->joinNetwork();
mfiore 1:4e3ee9c860e3 344 mdot_mutex.unlock(); // unlock mdot mutex after join attempt so SW1 can work
falingtrea 0:dba397ff987f 345
falingtrea 0:dba397ff987f 346 if (mdot_ret != mDot::MDOT_OK) {
mfiore 1:4e3ee9c860e3 347 log_error(mdot_radio,"failed to join network:", mdot_ret);
falingtrea 0:dba397ff987f 348
mfiore 1:4e3ee9c860e3 349 if (toggle_text)
mfiore 1:4e3ee9c860e3 350 sprintf(txtstr," > Join Failed <");
mfiore 1:4e3ee9c860e3 351 else
mfiore 1:4e3ee9c860e3 352 sprintf(txtstr," < Join Failed >");
falingtrea 0:dba397ff987f 353
mfiore 1:4e3ee9c860e3 354 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 355
mfiore 1:4e3ee9c860e3 356 if (mdot_radio->getFrequencyBand() == mDot::FB_868) {
mfiore 1:4e3ee9c860e3 357 join_delay = mdot_radio->getNextTxMs();
mfiore 1:4e3ee9c860e3 358 } else {
mfiore 1:4e3ee9c860e3 359 join_delay = 10;
mfiore 1:4e3ee9c860e3 360 }
mfiore 1:4e3ee9c860e3 361 printf("delay = %lu\r\n",join_delay);
mfiore 1:4e3ee9c860e3 362 osDelay(join_delay + 1);
mfiore 1:4e3ee9c860e3 363 toggle_text = !toggle_text;
mfiore 1:4e3ee9c860e3 364 }
mfiore 1:4e3ee9c860e3 365
mfiore 1:4e3ee9c860e3 366 /*
mfiore 1:4e3ee9c860e3 367 * Setting TX power and Data Rate for radio just in case user requested by SW2
mfiore 1:4e3ee9c860e3 368 */
mfiore 1:4e3ee9c860e3 369 mdot_mutex.lock(); // lock mdot mutex before setting change
mfiore 1:4e3ee9c860e3 370 mdot_radio->setTxPower(pwr_val);
mfiore 1:4e3ee9c860e3 371 mdot_radio->setTxDataRate(sf_val);
mfiore 1:4e3ee9c860e3 372 mdot_mutex.unlock(); // unlock mdot mutex after settings change so SW1 can work
falingtrea 0:dba397ff987f 373
falingtrea 0:dba397ff987f 374 } while (mdot_ret != mDot::MDOT_OK);
mfiore 1:4e3ee9c860e3 375
mfiore 1:4e3ee9c860e3 376 sprintf(txtstr,"*Network Joined*");
mfiore 1:4e3ee9c860e3 377 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 378
falingtrea 0:dba397ff987f 379 } else {
mfiore 1:4e3ee9c860e3 380 sprintf(txtstr,"Radio Init Failed!");
mfiore 1:4e3ee9c860e3 381 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 382 printf("%s\r\n",txtstr);
falingtrea 0:dba397ff987f 383 exit(1);
falingtrea 0:dba397ff987f 384 }
falingtrea 0:dba397ff987f 385
mfiore 1:4e3ee9c860e3 386 mdot_gps = new GPSPARSER(&mDotUART);
mfiore 1:4e3ee9c860e3 387
mfiore 1:4e3ee9c860e3 388 if (!mdot_gps->gpsDetected()) {
mfiore 1:4e3ee9c860e3 389 sprintf(txtstr,"*No GPS Detected*");
mfiore 1:4e3ee9c860e3 390 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 391 printf ("%s\r\n", txtstr);
mfiore 1:4e3ee9c860e3 392 } else {
mfiore 1:4e3ee9c860e3 393 main_single = main_sweep = false;
mfiore 1:4e3ee9c860e3 394 do {
mfiore 1:4e3ee9c860e3 395 osSignalWait(0x10, 2000);
mfiore 1:4e3ee9c860e3 396 if (mdot_gps->getLockStatus()) {
mfiore 1:4e3ee9c860e3 397 sprintf(txtstr,"!!GPS locked!!");
mfiore 1:4e3ee9c860e3 398 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 399 printf("%s \r\n",txtstr);
mfiore 1:4e3ee9c860e3 400 } else {
mfiore 1:4e3ee9c860e3 401 if (toggle_text)
mfiore 1:4e3ee9c860e3 402 sprintf(txtstr," > no GPS lock <");
mfiore 1:4e3ee9c860e3 403 else
mfiore 1:4e3ee9c860e3 404 sprintf(txtstr," < no GPS lock >");
mfiore 1:4e3ee9c860e3 405
mfiore 1:4e3ee9c860e3 406 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 407 printf("%s \r\n",txtstr);
mfiore 1:4e3ee9c860e3 408 toggle_text = !toggle_text;
mfiore 1:4e3ee9c860e3 409 }
mfiore 1:4e3ee9c860e3 410 } while ( !(mdot_gps->getLockStatus()) && (!main_single && !main_sweep));
falingtrea 0:dba397ff987f 411 }
falingtrea 0:dba397ff987f 412 osDelay(200);
falingtrea 0:dba397ff987f 413 evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
falingtrea 0:dba397ff987f 414
falingtrea 0:dba397ff987f 415 // sets LED2 to 50% max current
falingtrea 0:dba397ff987f 416 evbBackLight->setLEDCurrent(16);
falingtrea 0:dba397ff987f 417
falingtrea 0:dba397ff987f 418 osDelay (500); // allows other threads to process
falingtrea 0:dba397ff987f 419 printf("shutdown LED:\r\n");
falingtrea 0:dba397ff987f 420 evbBackLight->shutdown();
mfiore 1:4e3ee9c860e3 421 osDelay(500);
mfiore 1:4e3ee9c860e3 422 /*
falingtrea 0:dba397ff987f 423 * Main data acquisition loop
falingtrea 0:dba397ff987f 424 */
falingtrea 0:dba397ff987f 425 i = 0;
falingtrea 0:dba397ff987f 426
falingtrea 0:dba397ff987f 427 do {
falingtrea 0:dba397ff987f 428
falingtrea 0:dba397ff987f 429 // Main program waits until SW2 is pressed.
mfiore 1:4e3ee9c860e3 430 main_single = main_sweep = false;
falingtrea 0:dba397ff987f 431
mfiore 1:4e3ee9c860e3 432 sprintf(txtstr,"Ready for Trigger");
mfiore 1:4e3ee9c860e3 433 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 434 printf ("%s\r\n", txtstr);
falingtrea 0:dba397ff987f 435
falingtrea 0:dba397ff987f 436 osSignalWait(0x10, osWaitForever);
falingtrea 0:dba397ff987f 437
mfiore 1:4e3ee9c860e3 438 if (main_single) {
mfiore 1:4e3ee9c860e3 439 evbLCD->clearBuffer();
mfiore 1:4e3ee9c860e3 440 sprintf(txtstr,"**Single Ping**");
mfiore 1:4e3ee9c860e3 441 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 442
mfiore 1:4e3ee9c860e3 443 result = ping_check(pwr_val, sf_val);
falingtrea 0:dba397ff987f 444
mfiore 1:4e3ee9c860e3 445 if (result != 0)
mfiore 1:4e3ee9c860e3 446 printf("Ping check completed\r\n");
mfiore 1:4e3ee9c860e3 447 else
mfiore 1:4e3ee9c860e3 448 printf("Ping check failed \r\n");
mfiore 1:4e3ee9c860e3 449 } else if (main_sweep) {
falingtrea 0:dba397ff987f 450
mfiore 1:4e3ee9c860e3 451 evbLCD->clearBuffer();
mfiore 1:4e3ee9c860e3 452 sprintf(txtstr,"**Ping Sweep**");
mfiore 1:4e3ee9c860e3 453 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 454
mfiore 1:4e3ee9c860e3 455 printf("start sweep and shutdown LED:\r\n");
mfiore 1:4e3ee9c860e3 456 evbBackLight->shutdown();
falingtrea 0:dba397ff987f 457
mfiore 1:4e3ee9c860e3 458 for (swp_pwr = 0; swp_pwr < 4; swp_pwr++) {
mfiore 1:4e3ee9c860e3 459 for (swp_sf = 0; swp_sf < 4; swp_sf++) {
mfiore 1:4e3ee9c860e3 460 result = ping_check(sweep_table[0][swp_pwr], sweep_table[1][swp_sf], number_of_pings);
falingtrea 0:dba397ff987f 461
mfiore 1:4e3ee9c860e3 462 if (result != 0)
mfiore 1:4e3ee9c860e3 463 printf("Ping check completed %d attempts\r\n", result);
mfiore 1:4e3ee9c860e3 464 else
mfiore 1:4e3ee9c860e3 465 printf("Ping check failed all attempts\r\n");
falingtrea 0:dba397ff987f 466
mfiore 1:4e3ee9c860e3 467 osDelay(1000);
mfiore 1:4e3ee9c860e3 468 }
mfiore 1:4e3ee9c860e3 469 }
mfiore 1:4e3ee9c860e3 470 } else {
mfiore 1:4e3ee9c860e3 471 printf("Got here because of code error.\r\n");
mfiore 1:4e3ee9c860e3 472 osDelay(1000);
mfiore 1:4e3ee9c860e3 473 }
falingtrea 0:dba397ff987f 474
falingtrea 0:dba397ff987f 475 } while(i < 1000);
falingtrea 0:dba397ff987f 476
mfiore 1:4e3ee9c860e3 477 printf("End of Test\r\n");
mfiore 1:4e3ee9c860e3 478
mfiore 1:4e3ee9c860e3 479 evbLCD->clearBuffer();
mfiore 1:4e3ee9c860e3 480 sprintf(txtstr,"Exiting Program");
mfiore 1:4e3ee9c860e3 481 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 482 }
falingtrea 0:dba397ff987f 483
falingtrea 0:dba397ff987f 484 /*
falingtrea 0:dba397ff987f 485 * Sets pb1_low flag. Flag is cleared in pb1_debounce thread
falingtrea 0:dba397ff987f 486 */
falingtrea 0:dba397ff987f 487 void pb1ISR(void)
falingtrea 0:dba397ff987f 488 {
mfiore 1:4e3ee9c860e3 489 if (!pb1_low)
mfiore 1:4e3ee9c860e3 490 pb1_low = true;
falingtrea 0:dba397ff987f 491 }
falingtrea 0:dba397ff987f 492
falingtrea 0:dba397ff987f 493 /*
falingtrea 0:dba397ff987f 494 * Debounces pb1 PB1 changes spreading factor and output power
falingtrea 0:dba397ff987f 495 * Cycles through SF_7-SF_10 for 4 power levels
falingtrea 0:dba397ff987f 496 */
falingtrea 0:dba397ff987f 497 void pb1_debounce(void const *args)
falingtrea 0:dba397ff987f 498 {
falingtrea 0:dba397ff987f 499 static uint8_t count = 0;
falingtrea 0:dba397ff987f 500 static uint8_t test_now = 0;
falingtrea 0:dba397ff987f 501
falingtrea 0:dba397ff987f 502 while (true) {
falingtrea 0:dba397ff987f 503
falingtrea 0:dba397ff987f 504 if (pb1_low && (mDot08 == 0))
mfiore 1:4e3ee9c860e3 505 count++;
falingtrea 0:dba397ff987f 506 else {
mfiore 1:4e3ee9c860e3 507 count = 0;
mfiore 1:4e3ee9c860e3 508 pb1_low = false;
falingtrea 0:dba397ff987f 509 }
mfiore 1:4e3ee9c860e3 510
mfiore 1:4e3ee9c860e3 511 if (count == 5) {
mfiore 1:4e3ee9c860e3 512 test_now++;
mfiore 1:4e3ee9c860e3 513
mfiore 1:4e3ee9c860e3 514 if (test_now > 15) // resets test_now
mfiore 1:4e3ee9c860e3 515 test_now = 0;
falingtrea 0:dba397ff987f 516
mfiore 1:4e3ee9c860e3 517 // selects power output level using upper bits for select
mfiore 1:4e3ee9c860e3 518 switch(test_now >> 2) {
mfiore 1:4e3ee9c860e3 519 case 0:
mfiore 1:4e3ee9c860e3 520 pwr_val = 11;
mfiore 1:4e3ee9c860e3 521 break;
mfiore 1:4e3ee9c860e3 522 case 1:
mfiore 1:4e3ee9c860e3 523 pwr_val = 14;
mfiore 1:4e3ee9c860e3 524 break;
mfiore 1:4e3ee9c860e3 525 case 2:
mfiore 1:4e3ee9c860e3 526 pwr_val = 18;
mfiore 1:4e3ee9c860e3 527 break;
mfiore 1:4e3ee9c860e3 528 case 3:
mfiore 1:4e3ee9c860e3 529 pwr_val = 20;
mfiore 1:4e3ee9c860e3 530 }
mfiore 1:4e3ee9c860e3 531
mfiore 1:4e3ee9c860e3 532 // sets data rate based on lower bits
mfiore 1:4e3ee9c860e3 533 sf_val = mDot::SF_7 - (test_now & 0x03);
mfiore 1:4e3ee9c860e3 534
mfiore 1:4e3ee9c860e3 535 sprintf(txtstr,"DR=%2d Pwr=%2d ",(12 - sf_val),pwr_val);
falingtrea 0:dba397ff987f 536 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 537 printf("%s \r\n",txtstr);
mfiore 1:4e3ee9c860e3 538 }
mfiore 1:4e3ee9c860e3 539
falingtrea 0:dba397ff987f 540 Thread::wait(5);
falingtrea 0:dba397ff987f 541 }
falingtrea 0:dba397ff987f 542 }
falingtrea 0:dba397ff987f 543
falingtrea 0:dba397ff987f 544 /*
falingtrea 0:dba397ff987f 545 * Sets pb2_low flag. Flag is cleared in pb2_debounce thread
falingtrea 0:dba397ff987f 546 */
falingtrea 0:dba397ff987f 547 void pb2ISR(void)
falingtrea 0:dba397ff987f 548 {
mfiore 1:4e3ee9c860e3 549 if (!pb2_low)
mfiore 1:4e3ee9c860e3 550 pb2_low = true;
falingtrea 0:dba397ff987f 551 }
falingtrea 0:dba397ff987f 552
falingtrea 0:dba397ff987f 553 /*
falingtrea 0:dba397ff987f 554 * Debounces pb2 PB2 forces main program out of thread wait mode
falingtrea 0:dba397ff987f 555 */
falingtrea 0:dba397ff987f 556 void pb2_debounce(void const *args)
falingtrea 0:dba397ff987f 557 {
falingtrea 0:dba397ff987f 558
falingtrea 0:dba397ff987f 559 static uint8_t count = 0;
falingtrea 0:dba397ff987f 560
falingtrea 0:dba397ff987f 561 while (true) {
falingtrea 0:dba397ff987f 562
mfiore 1:4e3ee9c860e3 563 if (pb2_low && (mDot09 == 0)) {
mfiore 1:4e3ee9c860e3 564 count++;
mfiore 1:4e3ee9c860e3 565 if (count == 100) {
mfiore 1:4e3ee9c860e3 566 // sets LED2 to 50% max current
mfiore 1:4e3ee9c860e3 567 evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
mfiore 1:4e3ee9c860e3 568 evbBackLight->setLEDCurrent(16);
mfiore 1:4e3ee9c860e3 569 }
mfiore 1:4e3ee9c860e3 570 } else {
mfiore 1:4e3ee9c860e3 571 if ((count > 5) && (count <= 100)) {
mfiore 1:4e3ee9c860e3 572 main_single = true;
mfiore 1:4e3ee9c860e3 573 osSignalSet(mainThreadID, 0x10);
mfiore 1:4e3ee9c860e3 574 } else if (count > 100) {
mfiore 1:4e3ee9c860e3 575 main_sweep = true;
mfiore 1:4e3ee9c860e3 576 osSignalSet(mainThreadID, 0x10);
mfiore 1:4e3ee9c860e3 577 }
falingtrea 0:dba397ff987f 578
mfiore 1:4e3ee9c860e3 579 count = 0;
mfiore 1:4e3ee9c860e3 580 pb2_low = false;
falingtrea 0:dba397ff987f 581 }
mfiore 1:4e3ee9c860e3 582
falingtrea 0:dba397ff987f 583 Thread::wait(5);
mfiore 1:4e3ee9c860e3 584 }
mfiore 1:4e3ee9c860e3 585 }
falingtrea 0:dba397ff987f 586
falingtrea 0:dba397ff987f 587 /*
falingtrea 0:dba397ff987f 588 * Function that print clear text verion of mDot errors
falingtrea 0:dba397ff987f 589 */
falingtrea 0:dba397ff987f 590 void log_error(mDot* dot, const char* msg, int32_t retval)
falingtrea 0:dba397ff987f 591 {
falingtrea 0:dba397ff987f 592 printf("%s - %ld:%s, %s\r\n", msg, retval, mDot::getReturnCodeString(retval).c_str(), dot->getLastError().c_str());
falingtrea 0:dba397ff987f 593 }
falingtrea 0:dba397ff987f 594
falingtrea 0:dba397ff987f 595 // return = number of ping checks that passed
mfiore 1:4e3ee9c860e3 596 uint8_t ping_check(uint8_t set_pwr, uint8_t set_sf, uint8_t pings_per_check)
falingtrea 0:dba397ff987f 597 {
falingtrea 0:dba397ff987f 598
mfiore 1:4e3ee9c860e3 599 uint8_t result = 0;
mfiore 1:4e3ee9c860e3 600 uint8_t ping_cnt;
mfiore 1:4e3ee9c860e3 601 mDot::ping_response ping_data;
mfiore 1:4e3ee9c860e3 602 mDot::rssi_stats rssi_data;
mfiore 1:4e3ee9c860e3 603 mDot::snr_stats snr_data;
mfiore 1:4e3ee9c860e3 604 struct tm gps_timestamp;
mfiore 1:4e3ee9c860e3 605 GPSPARSER::longitude evb_longitude;
mfiore 1:4e3ee9c860e3 606 GPSPARSER::latitude evb_latitude;
mfiore 1:4e3ee9c860e3 607 GPSPARSER::satellite_prn gps_sat_prn;
mfiore 1:4e3ee9c860e3 608 uint8_t gps_fix_quality;
mfiore 1:4e3ee9c860e3 609 int16_t evb_altitude;
mfiore 1:4e3ee9c860e3 610 uint8_t gps_num_satellites;
mfiore 1:4e3ee9c860e3 611 uint8_t gps_fix_status;
falingtrea 0:dba397ff987f 612 std::vector<uint8_t> mdot_data;
falingtrea 0:dba397ff987f 613
mfiore 1:4e3ee9c860e3 614 mdot_mutex.lock(); // lock mdot mutex before changing radio parameters
falingtrea 0:dba397ff987f 615 if ((mdot_ret = mdot_radio->setTxPower(set_pwr)) != mDot::MDOT_OK) {
mfiore 1:4e3ee9c860e3 616 log_error(mdot_radio, "failed to set TX power level", mdot_ret);
falingtrea 0:dba397ff987f 617 }
mfiore 1:4e3ee9c860e3 618 if ((mdot_ret = mdot_radio->setTxDataRate(set_sf)) != mDot::MDOT_OK) {
mfiore 1:4e3ee9c860e3 619 log_error(mdot_radio, "failed to set DataRate value", mdot_ret);
falingtrea 0:dba397ff987f 620 }
mfiore 1:4e3ee9c860e3 621 mdot_mutex.unlock(); // unlock mdot mutex after changing radio parameters
falingtrea 0:dba397ff987f 622
mfiore 1:4e3ee9c860e3 623 for (ping_cnt = 0; ping_cnt < pings_per_check; ping_cnt++) {
mfiore 1:4e3ee9c860e3 624 evbLCD->startUpdate();
mfiore 1:4e3ee9c860e3 625 evbLCD->clearBuffer();
falingtrea 0:dba397ff987f 626
mfiore 1:4e3ee9c860e3 627 mdot_mutex.lock(); // lock mdot mutex before ping
mfiore 1:4e3ee9c860e3 628 ping_data = mdot_radio->ping();
mfiore 1:4e3ee9c860e3 629 mdot_mutex.unlock(); // unlock mdot mutex after ping
falingtrea 0:dba397ff987f 630
mfiore 1:4e3ee9c860e3 631 if (ping_data.status == mDot::MDOT_OK) {
mfiore 1:4e3ee9c860e3 632 rssi_data = mdot_radio->getRssiStats();
mfiore 1:4e3ee9c860e3 633 snr_data = mdot_radio->getSnrStats();
mfiore 1:4e3ee9c860e3 634 gps_fix_status = mdot_gps->getFixStatus();
mfiore 1:4e3ee9c860e3 635 gps_fix_quality = mdot_gps->getFixQuality();
mfiore 1:4e3ee9c860e3 636 gps_num_satellites = mdot_gps->getNumSatellites();
mfiore 1:4e3ee9c860e3 637
mfiore 1:4e3ee9c860e3 638 printf ("\r\n GPS Fix Status= %d num of sats = %d\r\n", gps_fix_status, gps_num_satellites);
falingtrea 0:dba397ff987f 639
mfiore 1:4e3ee9c860e3 640 sprintf(txtstr,"PGOOD DR=%2d P=%2d",(12 - set_sf),set_pwr);
mfiore 1:4e3ee9c860e3 641 evbLCD->writeText(0,0,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 642 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 643
mfiore 1:4e3ee9c860e3 644 sprintf(txtstr,"UP %3d dBm %2d.%1d",ping_data.rssi, ping_data.snr/10, abs(ping_data.snr)%10);
mfiore 1:4e3ee9c860e3 645 evbLCD->writeText(0,1,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 646 printf("Link Quality %s \r\n",txtstr);
falingtrea 0:dba397ff987f 647
mfiore 1:4e3ee9c860e3 648 sprintf(txtstr,"DWN %3d dBm %2d.%02d",rssi_data.last, snr_data.last/4, abs(snr_data.last)%4*25);
mfiore 1:4e3ee9c860e3 649 evbLCD->writeText(0,2,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 650 printf("Link Quality %s \r\n",txtstr);
falingtrea 0:dba397ff987f 651
mfiore 1:4e3ee9c860e3 652 mdot_data.clear();
mfiore 1:4e3ee9c860e3 653 mdot_data.push_back(0x1D); // key for start of data structure
mfiore 1:4e3ee9c860e3 654 mdot_data.push_back(0x1A); // key for uplink QOS + RF Pwr
mfiore 1:4e3ee9c860e3 655 convertS.f_s = ping_data.rssi;
mfiore 1:4e3ee9c860e3 656 mdot_data.push_back(convertS.t_u[1]);
mfiore 1:4e3ee9c860e3 657 mdot_data.push_back(convertS.t_u[0]);
mfiore 1:4e3ee9c860e3 658 mdot_data.push_back((ping_data.snr/10) & 0xFF);
mfiore 1:4e3ee9c860e3 659 mdot_data.push_back(set_pwr);
falingtrea 0:dba397ff987f 660
mfiore 1:4e3ee9c860e3 661 mdot_data.push_back(0x1B); // key for downlink QOS
mfiore 1:4e3ee9c860e3 662 convertS.f_s=rssi_data.last;
mfiore 1:4e3ee9c860e3 663 mdot_data.push_back(convertS.t_u[1]);
mfiore 1:4e3ee9c860e3 664 mdot_data.push_back(convertS.t_u[0]);
mfiore 1:4e3ee9c860e3 665 mdot_data.push_back(snr_data.last);
falingtrea 0:dba397ff987f 666
mfiore 1:4e3ee9c860e3 667 // collect GPS data if GPS device detected
mfiore 1:4e3ee9c860e3 668 if (mdot_gps->gpsDetected() && (set_sf != mDot::SF_10)) {
falingtrea 0:dba397ff987f 669
mfiore 1:4e3ee9c860e3 670 mdot_data.push_back(0x19); // key for GPS Lock Status
mfiore 1:4e3ee9c860e3 671 data = ( gps_num_satellites << 4 ) | ( gps_fix_status & 0x0F );
mfiore 1:4e3ee9c860e3 672 mdot_data.push_back(data);
falingtrea 0:dba397ff987f 673
mfiore 1:4e3ee9c860e3 674 if (mdot_gps->getLockStatus()) { // if gps has a lock
mfiore 1:4e3ee9c860e3 675 evb_longitude = mdot_gps->getLongitude();
mfiore 1:4e3ee9c860e3 676 evb_latitude = mdot_gps->getLatitude();
mfiore 1:4e3ee9c860e3 677 evb_altitude = mdot_gps->getAltitude();
mfiore 1:4e3ee9c860e3 678 gps_timestamp = mdot_gps->getTimestamp();
falingtrea 0:dba397ff987f 679
mfiore 1:4e3ee9c860e3 680 sprintf(txtstr,"%3d %2d %2d.%03d",abs(evb_longitude.degrees),evb_longitude.minutes,(evb_longitude.seconds*6)/1000,(evb_longitude.seconds*6)%1000);
falingtrea 0:dba397ff987f 681
mfiore 1:4e3ee9c860e3 682 if (evb_longitude.degrees < 0)
mfiore 1:4e3ee9c860e3 683 strncat(txtstr," W",2);
mfiore 1:4e3ee9c860e3 684 else
mfiore 1:4e3ee9c860e3 685 strncat(txtstr," E",2);
falingtrea 0:dba397ff987f 686
mfiore 1:4e3ee9c860e3 687 evbLCD->writeText(0,3,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 688 printf("Longitude: %s \r\n",txtstr);
falingtrea 0:dba397ff987f 689
mfiore 1:4e3ee9c860e3 690 sprintf(txtstr,"%3d %2d %2d.%03d",abs(evb_latitude.degrees),evb_latitude.minutes,(evb_latitude.seconds*6)/1000,(evb_latitude.seconds*6)%1000);
mfiore 1:4e3ee9c860e3 691
mfiore 1:4e3ee9c860e3 692 if (evb_latitude.degrees < 0)
mfiore 1:4e3ee9c860e3 693 strncat(txtstr," S",2);
mfiore 1:4e3ee9c860e3 694 else
mfiore 1:4e3ee9c860e3 695 strncat(txtstr," N",2);
falingtrea 0:dba397ff987f 696
mfiore 1:4e3ee9c860e3 697 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 698 printf("Latitude: %s \r\n",txtstr);
falingtrea 0:dba397ff987f 699
mfiore 1:4e3ee9c860e3 700 sprintf(txtstr,"Time %02d:%02d:%02d ",gps_timestamp.tm_hour,gps_timestamp.tm_min,gps_timestamp.tm_sec);
mfiore 1:4e3ee9c860e3 701 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 702 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 703
mfiore 1:4e3ee9c860e3 704 sprintf(txtstr,"Date %02d/%02d/%04d",gps_timestamp.tm_mon + 1,gps_timestamp.tm_mday,gps_timestamp.tm_year +1900);
mfiore 1:4e3ee9c860e3 705 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 706 printf("%s \r\n\r\n",txtstr);
falingtrea 0:dba397ff987f 707
mfiore 1:4e3ee9c860e3 708 // Send GPS data if GSP device locked
mfiore 1:4e3ee9c860e3 709 mdot_data.push_back(0x15); // key for GPS Latitude
mfiore 1:4e3ee9c860e3 710 mdot_data.push_back(evb_latitude.degrees);
mfiore 1:4e3ee9c860e3 711 mdot_data.push_back(evb_latitude.minutes);
mfiore 1:4e3ee9c860e3 712 convertS.f_s = evb_latitude.seconds;
mfiore 1:4e3ee9c860e3 713 mdot_data.push_back(convertS.t_u[1]);
mfiore 1:4e3ee9c860e3 714 mdot_data.push_back(convertS.t_u[0]);
falingtrea 0:dba397ff987f 715
mfiore 1:4e3ee9c860e3 716 mdot_data.push_back(0x16); // key for GPS Longitude
mfiore 1:4e3ee9c860e3 717 convertS.f_s = evb_longitude.degrees;
mfiore 1:4e3ee9c860e3 718 mdot_data.push_back(convertS.t_u[1]);
mfiore 1:4e3ee9c860e3 719 mdot_data.push_back(convertS.t_u[0]);
falingtrea 0:dba397ff987f 720
mfiore 1:4e3ee9c860e3 721 mdot_data.push_back(evb_longitude.minutes);
mfiore 1:4e3ee9c860e3 722 convertS.f_s = evb_longitude.seconds;
mfiore 1:4e3ee9c860e3 723 mdot_data.push_back(convertS.t_u[1]);
mfiore 1:4e3ee9c860e3 724 mdot_data.push_back(convertS.t_u[0]);
mfiore 1:4e3ee9c860e3 725 } else {
mfiore 1:4e3ee9c860e3 726 sprintf(txtstr,"no GPS lock");
mfiore 1:4e3ee9c860e3 727 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 728 printf("%s \r\n",txtstr);
mfiore 1:4e3ee9c860e3 729 }
mfiore 1:4e3ee9c860e3 730 }
mfiore 1:4e3ee9c860e3 731 // key for end of data structure
mfiore 1:4e3ee9c860e3 732 mdot_data.push_back(0x1D);
mfiore 1:4e3ee9c860e3 733
mfiore 1:4e3ee9c860e3 734 // if SF_10 this sends 11 bytes of data, otherwise sends full data packet
mfiore 1:4e3ee9c860e3 735 mdot_mutex.lock(); // lock mdot mutex before packet send
mfiore 1:4e3ee9c860e3 736 mdot_ret = mdot_radio->send(mdot_data);
mfiore 1:4e3ee9c860e3 737 mdot_mutex.unlock(); // unlock mdot mutex after packet send
falingtrea 0:dba397ff987f 738
mfiore 1:4e3ee9c860e3 739 if (mdot_ret != mDot::MDOT_OK) {
mfiore 1:4e3ee9c860e3 740 sprintf(txtstr,"mDot Send failed");
mfiore 1:4e3ee9c860e3 741 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 742 log_error(mdot_radio, txtstr, mdot_ret);
mfiore 1:4e3ee9c860e3 743 } else {
mfiore 1:4e3ee9c860e3 744 sprintf(txtstr,"mDot Send success");
mfiore 1:4e3ee9c860e3 745 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 746 printf("successfully sent data to gateway\r\n");
mfiore 1:4e3ee9c860e3 747 result++;
mfiore 1:4e3ee9c860e3 748 }
mfiore 1:4e3ee9c860e3 749 } else {
mfiore 1:4e3ee9c860e3 750 sprintf(txtstr,"Ping Check Failed");
mfiore 1:4e3ee9c860e3 751 evbLCD->writeText(0,2,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 752 printf("%s \r\n",txtstr);
mfiore 1:4e3ee9c860e3 753 sprintf(txtstr,"DR=%2d P=%2d",(12 - set_sf),set_pwr);
mfiore 1:4e3ee9c860e3 754 evbLCD->writeText(0,3,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 755 printf("%s \r\n",txtstr);
mfiore 1:4e3ee9c860e3 756 strncpy(txtstr,mDot::getReturnCodeString(ping_data.status).c_str(),17);
mfiore 1:4e3ee9c860e3 757 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
mfiore 1:4e3ee9c860e3 758 printf("%s \r\n",txtstr);
mfiore 1:4e3ee9c860e3 759 }
falingtrea 0:dba397ff987f 760
mfiore 1:4e3ee9c860e3 761 evbLCD->endUpdate();
mfiore 1:4e3ee9c860e3 762 osDelay(1000);
mfiore 1:4e3ee9c860e3 763 }
mfiore 1:4e3ee9c860e3 764 return result;
falingtrea 0:dba397ff987f 765 }