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