MTDOT-EVB link check code for site survey
Dependencies: DOGS102 GpsParser MTS-Serial NCP5623B libmDot mbed-rtos mbed
main.cpp@0:dba397ff987f, 2015-10-22 (annotated)
- 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?
User | Revision | Line number | New 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 | } |