MTDOT-EVB link check code for site survey

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

Committer:
falingtrea
Date:
Thu Oct 22 19:45:01 2015 +0000
Revision:
0:dba397ff987f
Child:
1:4e3ee9c860e3
Copied from MDOT-EVB-LinkCheck. Added mutex around certain mDot radio commands. Moved ping check code to callable function. Added sweep mode, re-wrote join code, and modified button operation. Fixed error in Downlink QOS SNR display.

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 *
falingtrea 0:dba397ff987f 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] = {
falingtrea 0:dba397ff987f 123 { 11, 14, 18, 20},
falingtrea 0:dba397ff987f 124 {mDot::SF_7, mDot::SF_8, mDot::SF_9, mDot::SF_10}
falingtrea 0:dba397ff987f 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
falingtrea 0:dba397ff987f 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
falingtrea 0:dba397ff987f 177 printf("Thread init done\r\n");
falingtrea 0:dba397ff987f 178
falingtrea 0:dba397ff987f 179 mainThreadID = osThreadGetId();
falingtrea 0:dba397ff987f 180
falingtrea 0:dba397ff987f 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
falingtrea 0:dba397ff987f 222 printf("Switch IRQs set\r\n");
falingtrea 0:dba397ff987f 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
falingtrea 0:dba397ff987f 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
falingtrea 0:dba397ff987f 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));
falingtrea 0:dba397ff987f 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 {
falingtrea 0:dba397ff987f 342 mdot_mutex.lock(); // lock mdot mutex before join attempt
falingtrea 0:dba397ff987f 343 mdot_ret = mdot_radio->joinNetwork();
falingtrea 0:dba397ff987f 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) {
falingtrea 0:dba397ff987f 347 log_error(mdot_radio,"failed to join network:", mdot_ret);
falingtrea 0:dba397ff987f 348
falingtrea 0:dba397ff987f 349 if (toggle_text)
falingtrea 0:dba397ff987f 350 sprintf(txtstr," > Join Failed <");
falingtrea 0:dba397ff987f 351 else
falingtrea 0:dba397ff987f 352 sprintf(txtstr," < Join Failed >");
falingtrea 0:dba397ff987f 353
falingtrea 0:dba397ff987f 354 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 355
falingtrea 0:dba397ff987f 356 if (mdot_radio->getFrequencyBand() == mDot::FB_868) {
falingtrea 0:dba397ff987f 357 join_delay = mdot_radio->getNextTxMs();
falingtrea 0:dba397ff987f 358 } else {
falingtrea 0:dba397ff987f 359 join_delay = 10;
falingtrea 0:dba397ff987f 360 }
falingtrea 0:dba397ff987f 361 printf("delay = %lu\r\n",join_delay);
falingtrea 0:dba397ff987f 362 osDelay(join_delay + 1);
falingtrea 0:dba397ff987f 363 toggle_text = !toggle_text;
falingtrea 0:dba397ff987f 364 }
falingtrea 0:dba397ff987f 365
falingtrea 0:dba397ff987f 366 /*
falingtrea 0:dba397ff987f 367 * Setting TX power and Data Rate for radio just in case user requested by SW2
falingtrea 0:dba397ff987f 368 */
falingtrea 0:dba397ff987f 369 mdot_mutex.lock(); // lock mdot mutex before setting change
falingtrea 0:dba397ff987f 370 mdot_radio->setTxPower(pwr_val);
falingtrea 0:dba397ff987f 371 mdot_radio->setTxDataRate(sf_val);
falingtrea 0:dba397ff987f 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);
falingtrea 0:dba397ff987f 375
falingtrea 0:dba397ff987f 376 sprintf(txtstr,"*Network Joined*");
falingtrea 0:dba397ff987f 377 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 378
falingtrea 0:dba397ff987f 379 } else {
falingtrea 0:dba397ff987f 380 sprintf(txtstr,"Radio Init Failed!");
falingtrea 0:dba397ff987f 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
falingtrea 0:dba397ff987f 386 mdot_gps = new GPSPARSER(&mDotUART);
falingtrea 0:dba397ff987f 387
falingtrea 0:dba397ff987f 388 if (!mdot_gps->gpsDetected()){
falingtrea 0:dba397ff987f 389 sprintf(txtstr,"*No GPS Detected*");
falingtrea 0:dba397ff987f 390 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 391 printf ("%s\r\n", txtstr);
falingtrea 0:dba397ff987f 392 }
falingtrea 0:dba397ff987f 393 else {
falingtrea 0:dba397ff987f 394 main_single = main_sweep = false;
falingtrea 0:dba397ff987f 395 do {
falingtrea 0:dba397ff987f 396 osSignalWait(0x10, 2000);
falingtrea 0:dba397ff987f 397 if (mdot_gps->getLockStatus()){
falingtrea 0:dba397ff987f 398 sprintf(txtstr,"!!GPS locked!!");
falingtrea 0:dba397ff987f 399 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 400 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 401 }
falingtrea 0:dba397ff987f 402 else {
falingtrea 0:dba397ff987f 403 if (toggle_text)
falingtrea 0:dba397ff987f 404 sprintf(txtstr," > no GPS lock <");
falingtrea 0:dba397ff987f 405 else
falingtrea 0:dba397ff987f 406 sprintf(txtstr," < no GPS lock >");
falingtrea 0:dba397ff987f 407
falingtrea 0:dba397ff987f 408 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 409 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 410 toggle_text = !toggle_text;
falingtrea 0:dba397ff987f 411 }
falingtrea 0:dba397ff987f 412 } while ( !(mdot_gps->getLockStatus()) && (!main_single && !main_sweep));
falingtrea 0:dba397ff987f 413 }
falingtrea 0:dba397ff987f 414 osDelay(200);
falingtrea 0:dba397ff987f 415 evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
falingtrea 0:dba397ff987f 416
falingtrea 0:dba397ff987f 417 // sets LED2 to 50% max current
falingtrea 0:dba397ff987f 418 evbBackLight->setLEDCurrent(16);
falingtrea 0:dba397ff987f 419
falingtrea 0:dba397ff987f 420 osDelay (500); // allows other threads to process
falingtrea 0:dba397ff987f 421 printf("shutdown LED:\r\n");
falingtrea 0:dba397ff987f 422 evbBackLight->shutdown();
falingtrea 0:dba397ff987f 423 osDelay(500);
falingtrea 0:dba397ff987f 424 /*
falingtrea 0:dba397ff987f 425 * Main data acquisition loop
falingtrea 0:dba397ff987f 426 */
falingtrea 0:dba397ff987f 427 i = 0;
falingtrea 0:dba397ff987f 428
falingtrea 0:dba397ff987f 429 do {
falingtrea 0:dba397ff987f 430
falingtrea 0:dba397ff987f 431 // Main program waits until SW2 is pressed.
falingtrea 0:dba397ff987f 432 main_single = main_sweep = false;
falingtrea 0:dba397ff987f 433
falingtrea 0:dba397ff987f 434 sprintf(txtstr,"Ready for Trigger");
falingtrea 0:dba397ff987f 435 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 436 printf ("%s\r\n", txtstr);
falingtrea 0:dba397ff987f 437
falingtrea 0:dba397ff987f 438 osSignalWait(0x10, osWaitForever);
falingtrea 0:dba397ff987f 439
falingtrea 0:dba397ff987f 440 if (main_single) {
falingtrea 0:dba397ff987f 441 evbLCD->clearBuffer();
falingtrea 0:dba397ff987f 442 sprintf(txtstr,"**Single Ping**");
falingtrea 0:dba397ff987f 443 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 444
falingtrea 0:dba397ff987f 445 result = ping_check(pwr_val, sf_val);
falingtrea 0:dba397ff987f 446
falingtrea 0:dba397ff987f 447 if (result != 0)
falingtrea 0:dba397ff987f 448 printf("Ping check completed\r\n");
falingtrea 0:dba397ff987f 449 else
falingtrea 0:dba397ff987f 450 printf("Ping check failed \r\n");
falingtrea 0:dba397ff987f 451 }
falingtrea 0:dba397ff987f 452 else if (main_sweep) {
falingtrea 0:dba397ff987f 453
falingtrea 0:dba397ff987f 454 evbLCD->clearBuffer();
falingtrea 0:dba397ff987f 455 sprintf(txtstr,"**Ping Sweep**");
falingtrea 0:dba397ff987f 456 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 457
falingtrea 0:dba397ff987f 458 printf("start sweep and shutdown LED:\r\n");
falingtrea 0:dba397ff987f 459 evbBackLight->shutdown();
falingtrea 0:dba397ff987f 460
falingtrea 0:dba397ff987f 461 for (swp_pwr = 0; swp_pwr < 4; swp_pwr++)
falingtrea 0:dba397ff987f 462 {
falingtrea 0:dba397ff987f 463 for (swp_sf = 0; swp_sf < 4; swp_sf++)
falingtrea 0:dba397ff987f 464 {
falingtrea 0:dba397ff987f 465 result = ping_check(sweep_table[0][swp_pwr], sweep_table[1][swp_sf], number_of_pings);
falingtrea 0:dba397ff987f 466
falingtrea 0:dba397ff987f 467 if (result != 0)
falingtrea 0:dba397ff987f 468 printf("Ping check completed %d attempts\r\n", result);
falingtrea 0:dba397ff987f 469 else
falingtrea 0:dba397ff987f 470 printf("Ping check failed all attempts\r\n");
falingtrea 0:dba397ff987f 471
falingtrea 0:dba397ff987f 472 osDelay(1000);
falingtrea 0:dba397ff987f 473 }
falingtrea 0:dba397ff987f 474 }
falingtrea 0:dba397ff987f 475 }
falingtrea 0:dba397ff987f 476 else {
falingtrea 0:dba397ff987f 477 printf("Got here because of code error.\r\n");
falingtrea 0:dba397ff987f 478 osDelay(1000);
falingtrea 0:dba397ff987f 479 }
falingtrea 0:dba397ff987f 480
falingtrea 0:dba397ff987f 481 } while(i < 1000);
falingtrea 0:dba397ff987f 482
falingtrea 0:dba397ff987f 483 printf("End of Test\r\n");
falingtrea 0:dba397ff987f 484
falingtrea 0:dba397ff987f 485 evbLCD->clearBuffer();
falingtrea 0:dba397ff987f 486 sprintf(txtstr,"Exiting Program");
falingtrea 0:dba397ff987f 487 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 488 }
falingtrea 0:dba397ff987f 489
falingtrea 0:dba397ff987f 490 /*
falingtrea 0:dba397ff987f 491 * Sets pb1_low flag. Flag is cleared in pb1_debounce thread
falingtrea 0:dba397ff987f 492 */
falingtrea 0:dba397ff987f 493 void pb1ISR(void)
falingtrea 0:dba397ff987f 494 {
falingtrea 0:dba397ff987f 495 if (!pb1_low)
falingtrea 0:dba397ff987f 496 pb1_low = true;
falingtrea 0:dba397ff987f 497 }
falingtrea 0:dba397ff987f 498
falingtrea 0:dba397ff987f 499 /*
falingtrea 0:dba397ff987f 500 * Debounces pb1 PB1 changes spreading factor and output power
falingtrea 0:dba397ff987f 501 * Cycles through SF_7-SF_10 for 4 power levels
falingtrea 0:dba397ff987f 502 */
falingtrea 0:dba397ff987f 503 void pb1_debounce(void const *args)
falingtrea 0:dba397ff987f 504 {
falingtrea 0:dba397ff987f 505 static uint8_t count = 0;
falingtrea 0:dba397ff987f 506 static uint8_t test_now = 0;
falingtrea 0:dba397ff987f 507
falingtrea 0:dba397ff987f 508 while (true) {
falingtrea 0:dba397ff987f 509
falingtrea 0:dba397ff987f 510 if (pb1_low && (mDot08 == 0))
falingtrea 0:dba397ff987f 511 count++;
falingtrea 0:dba397ff987f 512 else {
falingtrea 0:dba397ff987f 513 count = 0;
falingtrea 0:dba397ff987f 514 pb1_low = false;
falingtrea 0:dba397ff987f 515 }
falingtrea 0:dba397ff987f 516
falingtrea 0:dba397ff987f 517 if (count == 5) {
falingtrea 0:dba397ff987f 518 test_now++;
falingtrea 0:dba397ff987f 519
falingtrea 0:dba397ff987f 520 if (test_now > 15) // resets test_now
falingtrea 0:dba397ff987f 521 test_now = 0;
falingtrea 0:dba397ff987f 522
falingtrea 0:dba397ff987f 523 // selects power output level using upper bits for select
falingtrea 0:dba397ff987f 524 switch(test_now >> 2){
falingtrea 0:dba397ff987f 525 case 0:
falingtrea 0:dba397ff987f 526 pwr_val = 11;
falingtrea 0:dba397ff987f 527 break;
falingtrea 0:dba397ff987f 528 case 1:
falingtrea 0:dba397ff987f 529 pwr_val = 14;
falingtrea 0:dba397ff987f 530 break;
falingtrea 0:dba397ff987f 531 case 2:
falingtrea 0:dba397ff987f 532 pwr_val = 18;
falingtrea 0:dba397ff987f 533 break;
falingtrea 0:dba397ff987f 534 case 3:
falingtrea 0:dba397ff987f 535 pwr_val = 20;
falingtrea 0:dba397ff987f 536 }
falingtrea 0:dba397ff987f 537
falingtrea 0:dba397ff987f 538 // sets data rate based on lower bits
falingtrea 0:dba397ff987f 539 sf_val = mDot::SF_7 - (test_now & 0x03);
falingtrea 0:dba397ff987f 540
falingtrea 0:dba397ff987f 541 sprintf(txtstr,"DR=%2d Pwr=%2d ",(12 - sf_val),pwr_val);
falingtrea 0:dba397ff987f 542 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 543 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 544 }
falingtrea 0:dba397ff987f 545
falingtrea 0:dba397ff987f 546 Thread::wait(5);
falingtrea 0:dba397ff987f 547 }
falingtrea 0:dba397ff987f 548 }
falingtrea 0:dba397ff987f 549
falingtrea 0:dba397ff987f 550 /*
falingtrea 0:dba397ff987f 551 * Sets pb2_low flag. Flag is cleared in pb2_debounce thread
falingtrea 0:dba397ff987f 552 */
falingtrea 0:dba397ff987f 553 void pb2ISR(void)
falingtrea 0:dba397ff987f 554 {
falingtrea 0:dba397ff987f 555 if (!pb2_low)
falingtrea 0:dba397ff987f 556 pb2_low = true;
falingtrea 0:dba397ff987f 557 }
falingtrea 0:dba397ff987f 558
falingtrea 0:dba397ff987f 559 /*
falingtrea 0:dba397ff987f 560 * Debounces pb2 PB2 forces main program out of thread wait mode
falingtrea 0:dba397ff987f 561 */
falingtrea 0:dba397ff987f 562 void pb2_debounce(void const *args)
falingtrea 0:dba397ff987f 563 {
falingtrea 0:dba397ff987f 564
falingtrea 0:dba397ff987f 565 static uint8_t count = 0;
falingtrea 0:dba397ff987f 566
falingtrea 0:dba397ff987f 567 while (true) {
falingtrea 0:dba397ff987f 568
falingtrea 0:dba397ff987f 569 if (pb2_low && (mDot09 == 0)){
falingtrea 0:dba397ff987f 570 count++;
falingtrea 0:dba397ff987f 571 if (count == 100){
falingtrea 0:dba397ff987f 572 // sets LED2 to 50% max current
falingtrea 0:dba397ff987f 573 evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
falingtrea 0:dba397ff987f 574 evbBackLight->setLEDCurrent(16);
falingtrea 0:dba397ff987f 575 }
falingtrea 0:dba397ff987f 576 }
falingtrea 0:dba397ff987f 577 else {
falingtrea 0:dba397ff987f 578 if ((count > 5) && (count <= 100)) {
falingtrea 0:dba397ff987f 579 main_single = true;
falingtrea 0:dba397ff987f 580 osSignalSet(mainThreadID, 0x10);
falingtrea 0:dba397ff987f 581 } else if (count > 100) {
falingtrea 0:dba397ff987f 582 main_sweep = true;
falingtrea 0:dba397ff987f 583 osSignalSet(mainThreadID, 0x10);
falingtrea 0:dba397ff987f 584 }
falingtrea 0:dba397ff987f 585
falingtrea 0:dba397ff987f 586 count = 0;
falingtrea 0:dba397ff987f 587 pb2_low = false;
falingtrea 0:dba397ff987f 588 }
falingtrea 0:dba397ff987f 589
falingtrea 0:dba397ff987f 590 Thread::wait(5);
falingtrea 0:dba397ff987f 591 }
falingtrea 0:dba397ff987f 592 }
falingtrea 0:dba397ff987f 593
falingtrea 0:dba397ff987f 594 /*
falingtrea 0:dba397ff987f 595 * Function that print clear text verion of mDot errors
falingtrea 0:dba397ff987f 596 */
falingtrea 0:dba397ff987f 597 void log_error(mDot* dot, const char* msg, int32_t retval)
falingtrea 0:dba397ff987f 598 {
falingtrea 0:dba397ff987f 599 printf("%s - %ld:%s, %s\r\n", msg, retval, mDot::getReturnCodeString(retval).c_str(), dot->getLastError().c_str());
falingtrea 0:dba397ff987f 600 }
falingtrea 0:dba397ff987f 601
falingtrea 0:dba397ff987f 602 // return = number of ping checks that passed
falingtrea 0:dba397ff987f 603 uint8_t ping_check(uint8_t set_pwr, uint8_t set_sf, uint8_t pings_per_check)
falingtrea 0:dba397ff987f 604 {
falingtrea 0:dba397ff987f 605
falingtrea 0:dba397ff987f 606 uint8_t result = 0;
falingtrea 0:dba397ff987f 607 uint8_t ping_cnt;
falingtrea 0:dba397ff987f 608 mDot::ping_response ping_data;
falingtrea 0:dba397ff987f 609 mDot::rssi_stats rssi_data;
falingtrea 0:dba397ff987f 610 mDot::snr_stats snr_data;
falingtrea 0:dba397ff987f 611 struct tm gps_timestamp;
falingtrea 0:dba397ff987f 612 GPSPARSER::longitude evb_longitude;
falingtrea 0:dba397ff987f 613 GPSPARSER::latitude evb_latitude;
falingtrea 0:dba397ff987f 614 GPSPARSER::satellite_prn gps_sat_prn;
falingtrea 0:dba397ff987f 615 uint8_t gps_fix_quality;
falingtrea 0:dba397ff987f 616 int16_t evb_altitude;
falingtrea 0:dba397ff987f 617 uint8_t gps_num_satellites;
falingtrea 0:dba397ff987f 618 uint8_t gps_fix_status;
falingtrea 0:dba397ff987f 619 std::vector<uint8_t> mdot_data;
falingtrea 0:dba397ff987f 620
falingtrea 0:dba397ff987f 621 mdot_mutex.lock(); // lock mdot mutex before changing radio parameters
falingtrea 0:dba397ff987f 622 if ((mdot_ret = mdot_radio->setTxPower(set_pwr)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 623 log_error(mdot_radio, "failed to set TX power level", mdot_ret);
falingtrea 0:dba397ff987f 624 }
falingtrea 0:dba397ff987f 625 if ((mdot_ret = mdot_radio->setTxDataRate(set_sf)) != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 626 log_error(mdot_radio, "failed to set DataRate value", mdot_ret);
falingtrea 0:dba397ff987f 627 }
falingtrea 0:dba397ff987f 628 mdot_mutex.unlock(); // unlock mdot mutex after changing radio parameters
falingtrea 0:dba397ff987f 629
falingtrea 0:dba397ff987f 630 for (ping_cnt = 0; ping_cnt < pings_per_check; ping_cnt++) {
falingtrea 0:dba397ff987f 631 evbLCD->startUpdate();
falingtrea 0:dba397ff987f 632 evbLCD->clearBuffer();
falingtrea 0:dba397ff987f 633
falingtrea 0:dba397ff987f 634 mdot_mutex.lock(); // lock mdot mutex before ping
falingtrea 0:dba397ff987f 635 ping_data = mdot_radio->ping();
falingtrea 0:dba397ff987f 636 mdot_mutex.unlock(); // unlock mdot mutex after ping
falingtrea 0:dba397ff987f 637
falingtrea 0:dba397ff987f 638 if (ping_data.status == mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 639 rssi_data = mdot_radio->getRssiStats();
falingtrea 0:dba397ff987f 640 snr_data = mdot_radio->getSnrStats();
falingtrea 0:dba397ff987f 641 gps_fix_status = mdot_gps->getFixStatus();
falingtrea 0:dba397ff987f 642 gps_fix_quality = mdot_gps->getFixQuality();
falingtrea 0:dba397ff987f 643 gps_num_satellites = mdot_gps->getNumSatellites();
falingtrea 0:dba397ff987f 644
falingtrea 0:dba397ff987f 645 printf ("\r\n GPS Fix Status= %d num of sats = %d\r\n", gps_fix_status, gps_num_satellites);
falingtrea 0:dba397ff987f 646
falingtrea 0:dba397ff987f 647 sprintf(txtstr,"PGOOD DR=%2d P=%2d",(12 - set_sf),set_pwr);
falingtrea 0:dba397ff987f 648 evbLCD->writeText(0,0,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 649 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 650
falingtrea 0:dba397ff987f 651 sprintf(txtstr,"UP %3d dBm %2d.%1d",ping_data.rssi, ping_data.snr/10, abs(ping_data.snr)%10);
falingtrea 0:dba397ff987f 652 evbLCD->writeText(0,1,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 653 printf("Link Quality %s \r\n",txtstr);
falingtrea 0:dba397ff987f 654
falingtrea 0:dba397ff987f 655 sprintf(txtstr,"DWN %3d dBm %2d.%02d",rssi_data.last, snr_data.last/4, abs(snr_data.last)%4*25);
falingtrea 0:dba397ff987f 656 evbLCD->writeText(0,2,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 657 printf("Link Quality %s \r\n",txtstr);
falingtrea 0:dba397ff987f 658
falingtrea 0:dba397ff987f 659 mdot_data.clear();
falingtrea 0:dba397ff987f 660 mdot_data.push_back(0x1D); // key for start of data structure
falingtrea 0:dba397ff987f 661 mdot_data.push_back(0x1A); // key for uplink QOS + RF Pwr
falingtrea 0:dba397ff987f 662 convertS.f_s = ping_data.rssi;
falingtrea 0:dba397ff987f 663 mdot_data.push_back(convertS.t_u[1]);
falingtrea 0:dba397ff987f 664 mdot_data.push_back(convertS.t_u[0]);
falingtrea 0:dba397ff987f 665 mdot_data.push_back((ping_data.snr/10) & 0xFF);
falingtrea 0:dba397ff987f 666 mdot_data.push_back(set_pwr);
falingtrea 0:dba397ff987f 667
falingtrea 0:dba397ff987f 668 mdot_data.push_back(0x1B); // key for downlink QOS
falingtrea 0:dba397ff987f 669 convertS.f_s=rssi_data.last;
falingtrea 0:dba397ff987f 670 mdot_data.push_back(convertS.t_u[1]);
falingtrea 0:dba397ff987f 671 mdot_data.push_back(convertS.t_u[0]);
falingtrea 0:dba397ff987f 672 mdot_data.push_back(snr_data.last);
falingtrea 0:dba397ff987f 673
falingtrea 0:dba397ff987f 674 // collect GPS data if GPS device detected
falingtrea 0:dba397ff987f 675 if (mdot_gps->gpsDetected() && (set_sf != mDot::SF_10)){
falingtrea 0:dba397ff987f 676
falingtrea 0:dba397ff987f 677 mdot_data.push_back(0x19); // key for GPS Lock Status
falingtrea 0:dba397ff987f 678 data = ( gps_num_satellites << 4 ) | ( gps_fix_status & 0x0F );
falingtrea 0:dba397ff987f 679 mdot_data.push_back(data);
falingtrea 0:dba397ff987f 680
falingtrea 0:dba397ff987f 681 if (mdot_gps->getLockStatus()){ // if gps has a lock
falingtrea 0:dba397ff987f 682 evb_longitude = mdot_gps->getLongitude();
falingtrea 0:dba397ff987f 683 evb_latitude = mdot_gps->getLatitude();
falingtrea 0:dba397ff987f 684 evb_altitude = mdot_gps->getAltitude();
falingtrea 0:dba397ff987f 685 gps_timestamp = mdot_gps->getTimestamp();
falingtrea 0:dba397ff987f 686
falingtrea 0:dba397ff987f 687 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 688
falingtrea 0:dba397ff987f 689 if (evb_longitude.degrees < 0)
falingtrea 0:dba397ff987f 690 strncat(txtstr," W",2);
falingtrea 0:dba397ff987f 691 else
falingtrea 0:dba397ff987f 692 strncat(txtstr," E",2);
falingtrea 0:dba397ff987f 693
falingtrea 0:dba397ff987f 694 evbLCD->writeText(0,3,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 695 printf("Longitude: %s \r\n",txtstr);
falingtrea 0:dba397ff987f 696
falingtrea 0:dba397ff987f 697 sprintf(txtstr,"%3d %2d %2d.%03d",abs(evb_latitude.degrees),evb_latitude.minutes,(evb_latitude.seconds*6)/1000,(evb_latitude.seconds*6)%1000);
falingtrea 0:dba397ff987f 698
falingtrea 0:dba397ff987f 699 if (evb_latitude.degrees < 0)
falingtrea 0:dba397ff987f 700 strncat(txtstr," S",2);
falingtrea 0:dba397ff987f 701 else
falingtrea 0:dba397ff987f 702 strncat(txtstr," N",2);
falingtrea 0:dba397ff987f 703
falingtrea 0:dba397ff987f 704 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 705 printf("Latitude: %s \r\n",txtstr);
falingtrea 0:dba397ff987f 706
falingtrea 0:dba397ff987f 707 sprintf(txtstr,"Time %02d:%02d:%02d ",gps_timestamp.tm_hour,gps_timestamp.tm_min,gps_timestamp.tm_sec);
falingtrea 0:dba397ff987f 708 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 709 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 710
falingtrea 0:dba397ff987f 711 sprintf(txtstr,"Date %02d/%02d/%04d",gps_timestamp.tm_mon + 1,gps_timestamp.tm_mday,gps_timestamp.tm_year +1900);
falingtrea 0:dba397ff987f 712 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 713 printf("%s \r\n\r\n",txtstr);
falingtrea 0:dba397ff987f 714
falingtrea 0:dba397ff987f 715 // Send GPS data if GSP device locked
falingtrea 0:dba397ff987f 716 mdot_data.push_back(0x15); // key for GPS Latitude
falingtrea 0:dba397ff987f 717 mdot_data.push_back(evb_latitude.degrees);
falingtrea 0:dba397ff987f 718 mdot_data.push_back(evb_latitude.minutes);
falingtrea 0:dba397ff987f 719 convertS.f_s = evb_latitude.seconds;
falingtrea 0:dba397ff987f 720 mdot_data.push_back(convertS.t_u[1]);
falingtrea 0:dba397ff987f 721 mdot_data.push_back(convertS.t_u[0]);
falingtrea 0:dba397ff987f 722
falingtrea 0:dba397ff987f 723 mdot_data.push_back(0x16); // key for GPS Longitude
falingtrea 0:dba397ff987f 724 convertS.f_s = evb_longitude.degrees;
falingtrea 0:dba397ff987f 725 mdot_data.push_back(convertS.t_u[1]);
falingtrea 0:dba397ff987f 726 mdot_data.push_back(convertS.t_u[0]);
falingtrea 0:dba397ff987f 727
falingtrea 0:dba397ff987f 728 mdot_data.push_back(evb_longitude.minutes);
falingtrea 0:dba397ff987f 729 convertS.f_s = evb_longitude.seconds;
falingtrea 0:dba397ff987f 730 mdot_data.push_back(convertS.t_u[1]);
falingtrea 0:dba397ff987f 731 mdot_data.push_back(convertS.t_u[0]);
falingtrea 0:dba397ff987f 732 }
falingtrea 0:dba397ff987f 733 else {
falingtrea 0:dba397ff987f 734 sprintf(txtstr,"no GPS lock");
falingtrea 0:dba397ff987f 735 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 736 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 737 }
falingtrea 0:dba397ff987f 738 }
falingtrea 0:dba397ff987f 739 // key for end of data structure
falingtrea 0:dba397ff987f 740 mdot_data.push_back(0x1D);
falingtrea 0:dba397ff987f 741
falingtrea 0:dba397ff987f 742 // if SF_10 this sends 11 bytes of data, otherwise sends full data packet
falingtrea 0:dba397ff987f 743 mdot_mutex.lock(); // lock mdot mutex before packet send
falingtrea 0:dba397ff987f 744 mdot_ret = mdot_radio->send(mdot_data);
falingtrea 0:dba397ff987f 745 mdot_mutex.unlock(); // unlock mdot mutex after packet send
falingtrea 0:dba397ff987f 746
falingtrea 0:dba397ff987f 747 if (mdot_ret != mDot::MDOT_OK) {
falingtrea 0:dba397ff987f 748 sprintf(txtstr,"mDot Send failed");
falingtrea 0:dba397ff987f 749 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 750 log_error(mdot_radio, txtstr, mdot_ret);
falingtrea 0:dba397ff987f 751 }
falingtrea 0:dba397ff987f 752 else {
falingtrea 0:dba397ff987f 753 sprintf(txtstr,"mDot Send success");
falingtrea 0:dba397ff987f 754 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 755 printf("successfully sent data to gateway\r\n");
falingtrea 0:dba397ff987f 756 result++;
falingtrea 0:dba397ff987f 757 }
falingtrea 0:dba397ff987f 758 }
falingtrea 0:dba397ff987f 759 else {
falingtrea 0:dba397ff987f 760 sprintf(txtstr,"Ping Check Failed");
falingtrea 0:dba397ff987f 761 evbLCD->writeText(0,2,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 762 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 763 sprintf(txtstr,"DR=%2d P=%2d",(12 - set_sf),set_pwr);
falingtrea 0:dba397ff987f 764 evbLCD->writeText(0,3,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 765 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 766 strncpy(txtstr,mDot::getReturnCodeString(ping_data.status).c_str(),17);
falingtrea 0:dba397ff987f 767 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:dba397ff987f 768 printf("%s \r\n",txtstr);
falingtrea 0:dba397ff987f 769 }
falingtrea 0:dba397ff987f 770
falingtrea 0:dba397ff987f 771 evbLCD->endUpdate();
falingtrea 0:dba397ff987f 772 osDelay(1000);
falingtrea 0:dba397ff987f 773 }
falingtrea 0:dba397ff987f 774 return result;
falingtrea 0:dba397ff987f 775 }