Demonstration program for Multitech System MTDOT-EVB an evaluation board for the mDot LoRa module

Dependencies:   DOGS102 ISL29011 MMA845x MPL3115A2 NCP5623B libmDot mbed-rtos mbed

Committer:
mfiore
Date:
Wed Oct 28 17:58:55 2015 +0000
Revision:
7:85445a8cc189
Parent:
4:49d19abdfd04
Child:
9:ed86d5ae29cc
<CTRL><SHIFT><f> for formatting in main.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
falingtrea 0:bdd16076aaa5 1 /**
falingtrea 0:bdd16076aaa5 2 * @file main.cpp
falingtrea 0:bdd16076aaa5 3 * @brief Main application for mDot-EVB demo
falingtrea 0:bdd16076aaa5 4 * @author Tim Barr MultiTech Systems Inc.
falingtrea 3:68e974f5f532 5 * @version 1.03
falingtrea 0:bdd16076aaa5 6 * @see
falingtrea 0:bdd16076aaa5 7 *
falingtrea 0:bdd16076aaa5 8 * Copyright (c) 2015
falingtrea 0:bdd16076aaa5 9 *
falingtrea 0:bdd16076aaa5 10 * Licensed under the Apache License, Version 2.0 (the "License");
falingtrea 0:bdd16076aaa5 11 * you may not use this file except in compliance with the License.
falingtrea 0:bdd16076aaa5 12 * You may obtain a copy of the License at
falingtrea 0:bdd16076aaa5 13 *
falingtrea 0:bdd16076aaa5 14 * http://www.apache.org/licenses/LICENSE-2.0
falingtrea 0:bdd16076aaa5 15 *
falingtrea 0:bdd16076aaa5 16 * Unless required by applicable law or agreed to in writing, software
falingtrea 0:bdd16076aaa5 17 * distributed under the License is distributed on an "AS IS" BASIS,
falingtrea 0:bdd16076aaa5 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
falingtrea 0:bdd16076aaa5 19 * See the License for the specific language governing permissions and
falingtrea 0:bdd16076aaa5 20 * limitations under the License.
falingtrea 1:ac9595d0f0e7 21 *
falingtrea 1:ac9595d0f0e7 22 * 1.01 TAB 7/6/15 Removed NULL pointer from evbAmbientLight creation call.
falingtrea 2:75adc72aa6a0 23 *
falingtrea 3:68e974f5f532 24 * 1.02 TAB 7/8/15 Send logo to LCD before attempting connection to LoRa network. Added
falingtrea 2:75adc72aa6a0 25 * information on setting up for public LoRa network. Moved SW setup to
falingtrea 2:75adc72aa6a0 26 * beginning of main. Removed printf call from ISR functions. Added
falingtrea 2:75adc72aa6a0 27 * additional checks for exit_program.
falingtrea 3:68e974f5f532 28 *
falingtrea 3:68e974f5f532 29 * 1.03 TAB 7/15/15 Added threads for push button switch debounce.
falingtrea 3:68e974f5f532 30 *
falingtrea 4:49d19abdfd04 31 * 1.04 TAB 10/22/15 Fixed format error in temperature print to LCD. Corrected error in
falingtrea 4:49d19abdfd04 32 * public netework setup. Swapped \n and \r in prinf calls because
falingtrea 4:49d19abdfd04 33 * Windows seems to be picky about the order
falingtrea 4:49d19abdfd04 34 *
falingtrea 0:bdd16076aaa5 35 */
falingtrea 0:bdd16076aaa5 36
falingtrea 0:bdd16076aaa5 37 #include "mbed.h"
falingtrea 0:bdd16076aaa5 38 #include "MMA845x.h"
falingtrea 0:bdd16076aaa5 39 #include "MPL3115A2.h"
falingtrea 0:bdd16076aaa5 40 #include "ISL29011.h"
falingtrea 0:bdd16076aaa5 41 #include "NCP5623B.h"
falingtrea 0:bdd16076aaa5 42 #include "DOGS102.h"
falingtrea 0:bdd16076aaa5 43 #include "font_6x8.h"
falingtrea 0:bdd16076aaa5 44 #include "MultiTech_Logo.h"
falingtrea 0:bdd16076aaa5 45 #include "mDot.h"
falingtrea 0:bdd16076aaa5 46 #include "rtos.h"
falingtrea 0:bdd16076aaa5 47 #include <string>
falingtrea 0:bdd16076aaa5 48 #include <vector>
falingtrea 0:bdd16076aaa5 49
falingtrea 0:bdd16076aaa5 50 enum LED1_COLOR {
falingtrea 0:bdd16076aaa5 51 RED = 0,
falingtrea 0:bdd16076aaa5 52 GREEN = 1
falingtrea 0:bdd16076aaa5 53 };
falingtrea 0:bdd16076aaa5 54
falingtrea 0:bdd16076aaa5 55 /*
falingtrea 0:bdd16076aaa5 56 * union for converting from 32-bit to 4 8-bit values
falingtrea 0:bdd16076aaa5 57 */
falingtrea 0:bdd16076aaa5 58 union convert32 {
falingtrea 0:bdd16076aaa5 59 int32_t f_s; // convert from signed 32 bit int
falingtrea 0:bdd16076aaa5 60 uint32_t f_u; // convert from unsigned 32 bit int
falingtrea 0:bdd16076aaa5 61 uint8_t t_u[4]; // convert to 8 bit unsigned array
falingtrea 0:bdd16076aaa5 62 };
falingtrea 0:bdd16076aaa5 63
falingtrea 0:bdd16076aaa5 64 /*
falingtrea 0:bdd16076aaa5 65 * union for converting from 16- bit to 2 8-bit values
falingtrea 0:bdd16076aaa5 66 */
falingtrea 0:bdd16076aaa5 67 union convert16 {
falingtrea 0:bdd16076aaa5 68 int16_t f_s; // convert from signed 16 bit int
falingtrea 0:bdd16076aaa5 69 uint16_t f_u; // convert from unsigned 16 bit int
falingtrea 0:bdd16076aaa5 70 uint8_t t_u[2]; // convert to 8 bit unsigned array
falingtrea 0:bdd16076aaa5 71 };
falingtrea 0:bdd16076aaa5 72
falingtrea 0:bdd16076aaa5 73 //DigitalIn mDot02(PA_2); // GPIO/UART_TX
falingtrea 0:bdd16076aaa5 74 //DigitalOut mDot03(PA_3); // GPIO/UART_RX
falingtrea 0:bdd16076aaa5 75 //DigitalIn mDot04(PA_6); // GPIO/SPI_MISO
falingtrea 0:bdd16076aaa5 76 //DigitalIn mDot06(PA_8); // GPIO/I2C_SCL
falingtrea 0:bdd16076aaa5 77 //DigitalIn mDot07(PC_9); // GPIO/I2C_SDA
falingtrea 0:bdd16076aaa5 78
falingtrea 0:bdd16076aaa5 79 InterruptIn mDot08(PA_12); // GPIO/USB PB S1 on EVB
falingtrea 0:bdd16076aaa5 80 InterruptIn mDot09(PA_11); // GPIO/USB PB S2 on EVB
falingtrea 0:bdd16076aaa5 81
falingtrea 0:bdd16076aaa5 82 //DigitalIn mDot11(PA_7); // GPIO/SPI_MOSI
falingtrea 0:bdd16076aaa5 83
falingtrea 0:bdd16076aaa5 84 InterruptIn mDot12(PA_0); // GPIO/UART_CTS PRESSURE_INT2 on EVB
falingtrea 0:bdd16076aaa5 85 DigitalOut mDot13(PC_13,1); // GPIO LCD_C/D
falingtrea 0:bdd16076aaa5 86 InterruptIn mDot15(PC_1); // GPIO LIGHT_PROX_INT on EVB
falingtrea 0:bdd16076aaa5 87 InterruptIn mDot16(PA_1); // GPIO/UART_RTS ACCEL_INT2 on EVB
falingtrea 0:bdd16076aaa5 88 DigitalOut mDot17(PA_4,1); // GPIO/SPI_NCS LCD_CS on EVB
falingtrea 0:bdd16076aaa5 89
falingtrea 0:bdd16076aaa5 90 //DigitalIn mDot18(PA_5); // GPIO/SPI_SCK
falingtrea 0:bdd16076aaa5 91
falingtrea 0:bdd16076aaa5 92 //DigitalInOut mDot19(PB_0,PIN_INPUT,PullNone,0); // GPIO PushPull LED Low=Red High=Green set MODE=INPUT to turn off
falingtrea 0:bdd16076aaa5 93 AnalogIn mDot20(PB_1); // GPIO Current Sense Analog in on EVB
falingtrea 0:bdd16076aaa5 94
falingtrea 0:bdd16076aaa5 95 Serial debugUART(PA_9, PA_10); // mDot debug UART
falingtrea 0:bdd16076aaa5 96
falingtrea 0:bdd16076aaa5 97 //Serial mDotUART(PA_2, PA_3); // mDot external UART mDot02 and mDot03
falingtrea 0:bdd16076aaa5 98
falingtrea 0:bdd16076aaa5 99 I2C mDoti2c(PC_9,PA_8); // mDot External I2C mDot6 and mDot7
falingtrea 0:bdd16076aaa5 100
falingtrea 0:bdd16076aaa5 101 SPI mDotspi(PA_7,PA_6,PA_5); // mDot external SPI mDot11, mDot4, and mDot18
falingtrea 0:bdd16076aaa5 102
falingtrea 2:75adc72aa6a0 103 /* **** replace these values with the proper public or private network settings ****
falingtrea 2:75adc72aa6a0 104 * config_network_nameand config_network_pass are for private networks.
falingtrea 2:75adc72aa6a0 105 */
falingtrea 4:49d19abdfd04 106 //settings for my bench
falingtrea 0:bdd16076aaa5 107 static std::string config_network_name = "TAB-CubeNet";
falingtrea 0:bdd16076aaa5 108 static std::string config_network_pass = "1nt3gral";
falingtrea 0:bdd16076aaa5 109 static uint8_t config_frequency_sub_band = 5;
falingtrea 0:bdd16076aaa5 110
falingtrea 4:49d19abdfd04 111 //Default network server settings
falingtrea 4:49d19abdfd04 112 //static std::string config_network_name = "YOUR-NETWORK-NAME";
falingtrea 4:49d19abdfd04 113 //static std::string config_network_pass = "YOUR-NETWORK-PASSPHRASE";
falingtrea 4:49d19abdfd04 114 //static uint8_t config_frequency_sub_band = 3;
falingtrea 4:49d19abdfd04 115
falingtrea 2:75adc72aa6a0 116 /* config_app_id and config_app_key are for public networks.
falingtrea 2:75adc72aa6a0 117 static uint8_t app_id[8] = {0x00,0x01,0x02,0x03,0x0A,0x0B,0x0C,0x0D};
falingtrea 2:75adc72aa6a0 118 std::vector<uint8_t> config_app_id;
falingtrea 2:75adc72aa6a0 119 static uint8_t app_key[16] = {0x00,0x01,0x02,0x03,0x0A,0x0B,0x0C,0x0D};
falingtrea 2:75adc72aa6a0 120 std::vector<uint8_t> config_app_key;
falingtrea 2:75adc72aa6a0 121 */
falingtrea 2:75adc72aa6a0 122
falingtrea 0:bdd16076aaa5 123 uint8_t result, pckt_time=10;
falingtrea 0:bdd16076aaa5 124 char data;
falingtrea 0:bdd16076aaa5 125 unsigned char test;
falingtrea 0:bdd16076aaa5 126 char txtstr[17];
falingtrea 0:bdd16076aaa5 127 int32_t num_whole, mdot_ret;
falingtrea 0:bdd16076aaa5 128 uint32_t pressure;
falingtrea 0:bdd16076aaa5 129 int16_t num_frac;
falingtrea 0:bdd16076aaa5 130
falingtrea 0:bdd16076aaa5 131 bool exit_program = false;
falingtrea 0:bdd16076aaa5 132
falingtrea 0:bdd16076aaa5 133 MMA845x_DATA accel_data;
falingtrea 0:bdd16076aaa5 134 MPL3115A2_DATA baro_data;
falingtrea 0:bdd16076aaa5 135 uint16_t lux_data;
falingtrea 0:bdd16076aaa5 136 MMA845x* evbAccel;
falingtrea 0:bdd16076aaa5 137 MPL3115A2* evbBaro;
falingtrea 0:bdd16076aaa5 138 ISL29011* evbAmbLight;
falingtrea 0:bdd16076aaa5 139 NCP5623B* evbBackLight;
falingtrea 0:bdd16076aaa5 140 DOGS102* evbLCD;
falingtrea 0:bdd16076aaa5 141 mDot* mdot_radio;
falingtrea 0:bdd16076aaa5 142
falingtrea 0:bdd16076aaa5 143 convert32 convertl;
falingtrea 0:bdd16076aaa5 144 convert16 converts;
falingtrea 0:bdd16076aaa5 145
falingtrea 3:68e974f5f532 146 // flags for pushbutton debounce code
falingtrea 3:68e974f5f532 147 bool pb1_low = false;
falingtrea 3:68e974f5f532 148 bool pb2_low = false;
falingtrea 3:68e974f5f532 149
falingtrea 0:bdd16076aaa5 150 void pb1ISR(void);
falingtrea 0:bdd16076aaa5 151 void pb2ISR(void);
falingtrea 3:68e974f5f532 152 void pb1_debounce(void const *args);
falingtrea 3:68e974f5f532 153 void pb2_debounce(void const *args);
falingtrea 3:68e974f5f532 154 Thread* thread_3;
falingtrea 0:bdd16076aaa5 155
falingtrea 0:bdd16076aaa5 156 void log_error(mDot* dot, const char* msg, int32_t retval);
falingtrea 0:bdd16076aaa5 157
falingtrea 0:bdd16076aaa5 158 void config_pkt_xmit (void const *args);
falingtrea 0:bdd16076aaa5 159
falingtrea 0:bdd16076aaa5 160 int main()
falingtrea 0:bdd16076aaa5 161 {
falingtrea 0:bdd16076aaa5 162
falingtrea 0:bdd16076aaa5 163 std::vector<uint8_t> mdot_data;
falingtrea 0:bdd16076aaa5 164 std::vector<uint8_t> mdot_EUI;
falingtrea 0:bdd16076aaa5 165 uint16_t i = 0;
falingtrea 0:bdd16076aaa5 166
falingtrea 0:bdd16076aaa5 167 debugUART.baud(921600);
falingtrea 0:bdd16076aaa5 168 // mDotUART.baud(9600); // mdot UART unused but available on external connector
falingtrea 0:bdd16076aaa5 169
falingtrea 3:68e974f5f532 170 Thread thread_1(pb1_debounce); // threads for de-bouncing pushbutton switches
falingtrea 3:68e974f5f532 171 Thread thread_2(pb2_debounce);
falingtrea 3:68e974f5f532 172
falingtrea 3:68e974f5f532 173 thread_3 = new Thread(config_pkt_xmit); // start thread that sends LoRa packet when SW2 pressed
falingtrea 2:75adc72aa6a0 174
falingtrea 1:ac9595d0f0e7 175 evbAccel = new MMA845x(mDoti2c,MMA845x::SA0_VSS); // setup Accelerometer
falingtrea 0:bdd16076aaa5 176 evbBaro = new MPL3115A2(mDoti2c); // setup Barometric sensor
falingtrea 1:ac9595d0f0e7 177 evbAmbLight = new ISL29011(mDoti2c); // Setup Ambient Light Sensor
falingtrea 0:bdd16076aaa5 178 evbBackLight = new NCP5623B(mDoti2c); // setup backlight and LED 2 driver chip
falingtrea 1:ac9595d0f0e7 179 evbLCD = new DOGS102(mDotspi, mDot17, mDot13); // setup LCD
falingtrea 0:bdd16076aaa5 180
falingtrea 2:75adc72aa6a0 181 /*
falingtrea 2:75adc72aa6a0 182 * Setup SW1 as program stop function
falingtrea 2:75adc72aa6a0 183 */
falingtrea 2:75adc72aa6a0 184 mDot08.disable_irq();
falingtrea 2:75adc72aa6a0 185 mDot08.fall(&pb1ISR);
falingtrea 2:75adc72aa6a0 186
falingtrea 2:75adc72aa6a0 187 /*
falingtrea 2:75adc72aa6a0 188 * need to call this function after rise or fall because rise/fall sets
falingtrea 2:75adc72aa6a0 189 * mode to PullNone
falingtrea 2:75adc72aa6a0 190 */
falingtrea 2:75adc72aa6a0 191 mDot08.mode(PullUp);
falingtrea 2:75adc72aa6a0 192
falingtrea 2:75adc72aa6a0 193 mDot08.enable_irq();
falingtrea 2:75adc72aa6a0 194
falingtrea 2:75adc72aa6a0 195 /*
falingtrea 2:75adc72aa6a0 196 * Setup SW2 as packet time change
falingtrea 2:75adc72aa6a0 197 */
falingtrea 2:75adc72aa6a0 198 mDot09.disable_irq();
falingtrea 2:75adc72aa6a0 199 mDot09.fall(&pb2ISR);
falingtrea 2:75adc72aa6a0 200
falingtrea 2:75adc72aa6a0 201 /*
falingtrea 2:75adc72aa6a0 202 * need to call this function after rise or fall because rise/fall sets
falingtrea 2:75adc72aa6a0 203 * mode to PullNone
falingtrea 2:75adc72aa6a0 204 */
falingtrea 2:75adc72aa6a0 205 mDot09.mode(PullUp);
mfiore 7:85445a8cc189 206
falingtrea 2:75adc72aa6a0 207 mDot09.enable_irq();
falingtrea 2:75adc72aa6a0 208
falingtrea 2:75adc72aa6a0 209 /*
falingtrea 2:75adc72aa6a0 210 * Setting other InterruptIn pins with Pull Ups
falingtrea 2:75adc72aa6a0 211 */
falingtrea 2:75adc72aa6a0 212 mDot12.mode(PullUp);
falingtrea 2:75adc72aa6a0 213 mDot15.mode(PullUp);
falingtrea 2:75adc72aa6a0 214 mDot16.mode(PullUp);
falingtrea 2:75adc72aa6a0 215
falingtrea 4:49d19abdfd04 216 printf("font table address %p\r\n",&font_6x8);
falingtrea 4:49d19abdfd04 217 printf("bitmap address %p\r\n",&MultiTech_Logo);
falingtrea 2:75adc72aa6a0 218
falingtrea 2:75adc72aa6a0 219 // Setup and display logo on LCD
falingtrea 2:75adc72aa6a0 220 evbLCD->startUpdate();
falingtrea 2:75adc72aa6a0 221
falingtrea 2:75adc72aa6a0 222 evbLCD->writeBitmap(0,0,MultiTech_Logo);
falingtrea 2:75adc72aa6a0 223
falingtrea 2:75adc72aa6a0 224 sprintf(txtstr,"MTDOT");
falingtrea 2:75adc72aa6a0 225 evbLCD->writeText(24,3,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 226 sprintf(txtstr,"Evaluation");
falingtrea 2:75adc72aa6a0 227 evbLCD->writeText(24,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 228 sprintf(txtstr,"Board");
falingtrea 2:75adc72aa6a0 229 evbLCD->writeText(24,5,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 230
falingtrea 2:75adc72aa6a0 231 evbLCD->endUpdate();
falingtrea 2:75adc72aa6a0 232
mfiore 7:85445a8cc189 233 printf("\r\n setup mdot\r\n");
falingtrea 0:bdd16076aaa5 234
falingtrea 0:bdd16076aaa5 235 // get a mDot handle
falingtrea 0:bdd16076aaa5 236 mdot_radio = mDot::getInstance();
falingtrea 0:bdd16076aaa5 237
falingtrea 0:bdd16076aaa5 238 if (mdot_radio) {
falingtrea 0:bdd16076aaa5 239 // reset to default config so we know what state we're in
falingtrea 0:bdd16076aaa5 240 mdot_radio->resetConfig();
falingtrea 0:bdd16076aaa5 241
falingtrea 0:bdd16076aaa5 242 // Setting up LED1 as activity LED
falingtrea 0:bdd16076aaa5 243 mdot_radio->setActivityLedPin(PB_0);
falingtrea 0:bdd16076aaa5 244 mdot_radio->setActivityLedEnable(true);
falingtrea 0:bdd16076aaa5 245
falingtrea 0:bdd16076aaa5 246 // Read node ID
falingtrea 0:bdd16076aaa5 247 mdot_EUI = mdot_radio->getDeviceId();
falingtrea 0:bdd16076aaa5 248 printf("mDot EUI = ");
falingtrea 0:bdd16076aaa5 249
falingtrea 0:bdd16076aaa5 250 for (i=0; i<mdot_EUI.size(); i++) {
falingtrea 0:bdd16076aaa5 251 printf("%02x ", mdot_EUI[i]);
falingtrea 0:bdd16076aaa5 252 }
falingtrea 4:49d19abdfd04 253 printf("\r\n");
falingtrea 0:bdd16076aaa5 254
falingtrea 0:bdd16076aaa5 255
falingtrea 2:75adc72aa6a0 256 // Setting up the mDot with network information.
falingtrea 2:75adc72aa6a0 257
mfiore 7:85445a8cc189 258 /*
mfiore 7:85445a8cc189 259 * This call sets up private or public mode on the MTDOT. Set the function to true if
mfiore 7:85445a8cc189 260 * connecting to a public network
mfiore 7:85445a8cc189 261 */
mfiore 7:85445a8cc189 262 printf("setting Private Network Mode\r\n");
mfiore 7:85445a8cc189 263 if ((mdot_ret = mdot_radio->setPublicNetwork(false)) != mDot::MDOT_OK) {
mfiore 7:85445a8cc189 264 log_error(mdot_radio, "failed to set Public Network Mode", mdot_ret);
mfiore 7:85445a8cc189 265 }
falingtrea 2:75adc72aa6a0 266
mfiore 7:85445a8cc189 267 /*
mfiore 7:85445a8cc189 268 * Frequency sub-band is valid for NAM only and for Private networks should be set to a value
mfiore 7:85445a8cc189 269 * between 1-8 that matches the the LoRa gateway setting. Public networks use sub-band 0 only.
mfiore 7:85445a8cc189 270 * This function can be commented out for EU networks
mfiore 7:85445a8cc189 271 */
falingtrea 0:bdd16076aaa5 272 printf("setting frequency sub band\r\n");
falingtrea 0:bdd16076aaa5 273 if ((mdot_ret = mdot_radio->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
falingtrea 0:bdd16076aaa5 274 log_error(mdot_radio, "failed to set frequency sub band", mdot_ret);
falingtrea 0:bdd16076aaa5 275 }
falingtrea 0:bdd16076aaa5 276
mfiore 7:85445a8cc189 277 /*
mfiore 7:85445a8cc189 278 * setNetworkName is used for private networks.
mfiore 7:85445a8cc189 279 * Use setNetworkID(AppID) for public networks
mfiore 7:85445a8cc189 280 */
falingtrea 2:75adc72aa6a0 281
falingtrea 2:75adc72aa6a0 282 // config_app_id.assign(app_id,app_id+7);
falingtrea 2:75adc72aa6a0 283
falingtrea 0:bdd16076aaa5 284 printf("setting network name\r\n");
falingtrea 0:bdd16076aaa5 285 if ((mdot_ret = mdot_radio->setNetworkName(config_network_name)) != mDot::MDOT_OK) {
falingtrea 4:49d19abdfd04 286 // if ((mdot_ret = mdot_radio->setNetworkId(config_app_id)) != mDot::MDOT_OK) {
falingtrea 0:bdd16076aaa5 287 log_error(mdot_radio, "failed to set network name", mdot_ret);
falingtrea 0:bdd16076aaa5 288 }
falingtrea 0:bdd16076aaa5 289
mfiore 7:85445a8cc189 290 /*
mfiore 7:85445a8cc189 291 * setNetworkPassphrase is used for private networks
mfiore 7:85445a8cc189 292 * Use setNetworkKey for public networks
mfiore 7:85445a8cc189 293 */
falingtrea 2:75adc72aa6a0 294
falingtrea 2:75adc72aa6a0 295 // config_app_key.assign(app_key,app_key+15);
falingtrea 2:75adc72aa6a0 296
falingtrea 0:bdd16076aaa5 297 printf("setting network password\r\n");
falingtrea 0:bdd16076aaa5 298 if ((mdot_ret = mdot_radio->setNetworkPassphrase(config_network_pass)) != mDot::MDOT_OK) {
falingtrea 2:75adc72aa6a0 299 // if ((mdot_ret = mdot_radio->setNetworkKey(config_app_key)) != mDot::MDOT_OK) {
falingtrea 0:bdd16076aaa5 300 log_error(mdot_radio, "failed to set network password", mdot_ret);
falingtrea 0:bdd16076aaa5 301 }
falingtrea 0:bdd16076aaa5 302
falingtrea 0:bdd16076aaa5 303 // attempt to join the network
falingtrea 0:bdd16076aaa5 304 printf("joining network\r\n");
falingtrea 2:75adc72aa6a0 305 while (((mdot_ret = mdot_radio->joinNetwork()) != mDot::MDOT_OK) && (!exit_program)) {
falingtrea 0:bdd16076aaa5 306 log_error(mdot_radio,"failed to join network:", mdot_ret);
mfiore 7:85445a8cc189 307 if (mdot_radio->getFrequencyBand() == mDot::FB_868) {
mfiore 7:85445a8cc189 308 mdot_ret = mdot_radio->getNextTxMs();
mfiore 7:85445a8cc189 309 } else {
mfiore 7:85445a8cc189 310 mdot_ret = 0;
falingtrea 0:bdd16076aaa5 311 }
mfiore 7:85445a8cc189 312
falingtrea 4:49d19abdfd04 313 printf("delay = %lu\r\n",mdot_ret);
falingtrea 0:bdd16076aaa5 314 osDelay(mdot_ret + 1);
falingtrea 0:bdd16076aaa5 315 }
falingtrea 2:75adc72aa6a0 316
falingtrea 2:75adc72aa6a0 317 /*
falingtrea 2:75adc72aa6a0 318 * Check for PB1 press during network join attempt
falingtrea 2:75adc72aa6a0 319 */
falingtrea 2:75adc72aa6a0 320 if (exit_program) {
falingtrea 4:49d19abdfd04 321 printf("Exiting program\r\n");
falingtrea 2:75adc72aa6a0 322 evbLCD->clearBuffer();
falingtrea 2:75adc72aa6a0 323 sprintf(txtstr,"Exiting Program");
falingtrea 2:75adc72aa6a0 324 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 325 exit(1);
falingtrea 2:75adc72aa6a0 326 }
falingtrea 2:75adc72aa6a0 327
falingtrea 0:bdd16076aaa5 328 } else {
falingtrea 4:49d19abdfd04 329 printf("radio setup failed\r\n");
falingtrea 0:bdd16076aaa5 330 //exit(1);
falingtrea 0:bdd16076aaa5 331 }
falingtrea 0:bdd16076aaa5 332
falingtrea 0:bdd16076aaa5 333 osDelay(200);
falingtrea 0:bdd16076aaa5 334 evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
falingtrea 0:bdd16076aaa5 335
falingtrea 2:75adc72aa6a0 336 // sets LED2 to 50% max current
falingtrea 0:bdd16076aaa5 337 evbBackLight->setLEDCurrent(16);
falingtrea 0:bdd16076aaa5 338
falingtrea 4:49d19abdfd04 339 printf("Start of Test\r\n");
falingtrea 0:bdd16076aaa5 340
falingtrea 2:75adc72aa6a0 341 osDelay (500); // allows other threads to process
falingtrea 4:49d19abdfd04 342 printf("shutdown LED:\r\n");
falingtrea 2:75adc72aa6a0 343 evbBackLight->shutdown();
falingtrea 0:bdd16076aaa5 344
falingtrea 0:bdd16076aaa5 345 osDelay (500); // allows other threads to process
falingtrea 4:49d19abdfd04 346 printf("Turn on LED2\r\n");
falingtrea 0:bdd16076aaa5 347 evbBackLight->setLEDCurrent(16);
falingtrea 0:bdd16076aaa5 348
falingtrea 0:bdd16076aaa5 349 data = evbAccel->getWhoAmI();
falingtrea 4:49d19abdfd04 350 printf("Accelerometer who_am_i value = %x \r\n", data);
falingtrea 0:bdd16076aaa5 351
falingtrea 0:bdd16076aaa5 352 result = evbAccel->getStatus();
falingtrea 4:49d19abdfd04 353 printf("status byte = %x \r\n", result);
falingtrea 0:bdd16076aaa5 354
falingtrea 4:49d19abdfd04 355 printf("Barometer who_am_i check = %s \r\n", evbBaro->testWhoAmI() ? "TRUE" : "FALSE");
falingtrea 0:bdd16076aaa5 356
falingtrea 0:bdd16076aaa5 357 result = evbBaro->getStatus();
falingtrea 4:49d19abdfd04 358 printf("status byte = %x \r\n", result);
falingtrea 0:bdd16076aaa5 359
falingtrea 0:bdd16076aaa5 360 /*
falingtrea 0:bdd16076aaa5 361 * Setup the Accelerometer for 8g range, 14 bit resolution, Noise reduction off, sample rate 1.56 Hz
falingtrea 0:bdd16076aaa5 362 * normal oversample mode, High pass filter off
falingtrea 0:bdd16076aaa5 363 */
falingtrea 0:bdd16076aaa5 364 evbAccel->setCommonParameters(MMA845x::RANGE_8g,MMA845x::RES_MAX,MMA845x::LN_OFF,
falingtrea 0:bdd16076aaa5 365 MMA845x::DR_1_56,MMA845x::OS_NORMAL,MMA845x::HPF_OFF );
falingtrea 0:bdd16076aaa5 366
falingtrea 0:bdd16076aaa5 367 /*
falingtrea 0:bdd16076aaa5 368 * Setup the Barometric sensor for post processed Ambient pressure, 4 samples per data acquisition.
falingtrea 0:bdd16076aaa5 369 * and a sample taken every second when in active mode
falingtrea 0:bdd16076aaa5 370 */
falingtrea 0:bdd16076aaa5 371 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16,
falingtrea 0:bdd16076aaa5 372 MPL3115A2::AT_1);
falingtrea 0:bdd16076aaa5 373 /*
falingtrea 0:bdd16076aaa5 374 * Setup the Ambient Light Sensor for continuous Ambient Light Sensing, 16 bit resolution,
falingtrea 0:bdd16076aaa5 375 * and 16000 lux range
falingtrea 0:bdd16076aaa5 376 */
falingtrea 0:bdd16076aaa5 377
falingtrea 0:bdd16076aaa5 378 evbAmbLight->setMode(ISL29011::ALS_CONT);
falingtrea 0:bdd16076aaa5 379 evbAmbLight->setResolution(ISL29011::ADC_16BIT);
falingtrea 0:bdd16076aaa5 380 evbAmbLight->setRange(ISL29011::RNG_16000);
falingtrea 0:bdd16076aaa5 381
falingtrea 0:bdd16076aaa5 382 /*
falingtrea 0:bdd16076aaa5 383 * Set the accelerometer for active mode
falingtrea 0:bdd16076aaa5 384 */
falingtrea 0:bdd16076aaa5 385 evbAccel->activeMode();
falingtrea 0:bdd16076aaa5 386
falingtrea 0:bdd16076aaa5 387 /*
falingtrea 0:bdd16076aaa5 388 * Clear the min-max registers in the Barometric Sensor
falingtrea 0:bdd16076aaa5 389 */
falingtrea 0:bdd16076aaa5 390 evbBaro->clearMinMaxRegs();
falingtrea 0:bdd16076aaa5 391
falingtrea 0:bdd16076aaa5 392 evbBackLight->setLEDCurrent(0);
falingtrea 0:bdd16076aaa5 393
falingtrea 0:bdd16076aaa5 394 /*
falingtrea 2:75adc72aa6a0 395 * Check for PB1 press during network join attempt
falingtrea 2:75adc72aa6a0 396 */
falingtrea 2:75adc72aa6a0 397 if (exit_program) {
falingtrea 4:49d19abdfd04 398 printf("Exiting program\r\n");
falingtrea 2:75adc72aa6a0 399 evbLCD->clearBuffer();
falingtrea 2:75adc72aa6a0 400 sprintf(txtstr,"Exiting Program");
falingtrea 2:75adc72aa6a0 401 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 402 exit(1);
falingtrea 2:75adc72aa6a0 403 }
falingtrea 2:75adc72aa6a0 404
falingtrea 2:75adc72aa6a0 405 /*
falingtrea 0:bdd16076aaa5 406 * Main data acquisition loop
falingtrea 0:bdd16076aaa5 407 */
falingtrea 0:bdd16076aaa5 408 pckt_time = 10;
falingtrea 0:bdd16076aaa5 409 i = 0;
falingtrea 0:bdd16076aaa5 410
falingtrea 0:bdd16076aaa5 411 do {
falingtrea 0:bdd16076aaa5 412 evbLCD->startUpdate();
falingtrea 0:bdd16076aaa5 413 evbLCD->clearBuffer();
falingtrea 0:bdd16076aaa5 414
falingtrea 0:bdd16076aaa5 415 /*
falingtrea 0:bdd16076aaa5 416 * Test Accelerometer XYZ data ready bit to see if acquisition complete
falingtrea 0:bdd16076aaa5 417 */
falingtrea 0:bdd16076aaa5 418 do {
falingtrea 0:bdd16076aaa5 419 osDelay(100); // allows other threads to process
falingtrea 0:bdd16076aaa5 420 result = evbAccel->getStatus();
falingtrea 0:bdd16076aaa5 421 } while ((result & MMA845x::XYZDR) == 0 );
falingtrea 0:bdd16076aaa5 422
falingtrea 0:bdd16076aaa5 423 /*
falingtrea 0:bdd16076aaa5 424 * Retrieve and print out accelerometer data
falingtrea 0:bdd16076aaa5 425 */
falingtrea 0:bdd16076aaa5 426 accel_data = evbAccel->getXYZ();
falingtrea 0:bdd16076aaa5 427
falingtrea 0:bdd16076aaa5 428 sprintf(txtstr,"Accelerometer");
falingtrea 0:bdd16076aaa5 429 evbLCD->writeText(0,0,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 430 sprintf(txtstr, "x = %d", accel_data._x);
falingtrea 0:bdd16076aaa5 431 evbLCD->writeText(20,1,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 432 sprintf(txtstr, "y = %d", accel_data._y);
falingtrea 0:bdd16076aaa5 433 evbLCD->writeText(20,2,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 434 sprintf(txtstr, "z = %d", accel_data._z );
falingtrea 0:bdd16076aaa5 435 evbLCD->writeText(20,3,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 436
falingtrea 0:bdd16076aaa5 437 /*
falingtrea 0:bdd16076aaa5 438 * Trigger a Pressure reading
falingtrea 0:bdd16076aaa5 439 */
falingtrea 0:bdd16076aaa5 440 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16,
falingtrea 0:bdd16076aaa5 441 MPL3115A2::AT_1);
falingtrea 0:bdd16076aaa5 442 evbBaro->triggerOneShot();
falingtrea 0:bdd16076aaa5 443
falingtrea 0:bdd16076aaa5 444 /*
falingtrea 0:bdd16076aaa5 445 * Test barometer device status to see if acquisition is complete
falingtrea 0:bdd16076aaa5 446 */
falingtrea 0:bdd16076aaa5 447 do {
falingtrea 0:bdd16076aaa5 448 osDelay(100); // allows other threads to process
falingtrea 0:bdd16076aaa5 449 result = evbBaro->getStatus();
falingtrea 0:bdd16076aaa5 450 } while ((result & MPL3115A2::PTDR) == 0 );
falingtrea 0:bdd16076aaa5 451
falingtrea 0:bdd16076aaa5 452 /*
falingtrea 0:bdd16076aaa5 453 * Retrieve and print out barometric pressure
falingtrea 0:bdd16076aaa5 454 */
falingtrea 0:bdd16076aaa5 455 pressure = evbBaro->getBaroData() >> 12; // convert 32 bit signed to 20 bit unsigned value
falingtrea 0:bdd16076aaa5 456 num_whole = pressure >> 2; // 18 bit integer significant
falingtrea 0:bdd16076aaa5 457 num_frac = (pressure & 0x3) * 25; // 2 bit fractional 0.25 per bit
falingtrea 0:bdd16076aaa5 458 sprintf(txtstr,"Press=%ld.%02d Pa", num_whole, num_frac);
falingtrea 0:bdd16076aaa5 459 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 460
falingtrea 0:bdd16076aaa5 461 /*
falingtrea 0:bdd16076aaa5 462 * Trigger a Altitude reading
falingtrea 0:bdd16076aaa5 463 */
falingtrea 0:bdd16076aaa5 464 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_ALTIMETER, MPL3115A2::OR_16,
falingtrea 0:bdd16076aaa5 465 MPL3115A2::AT_1);
falingtrea 0:bdd16076aaa5 466 evbBaro->triggerOneShot();
falingtrea 0:bdd16076aaa5 467
falingtrea 0:bdd16076aaa5 468 /*
falingtrea 0:bdd16076aaa5 469 * Test barometer device status to see if acquisition is complete
falingtrea 0:bdd16076aaa5 470 */
falingtrea 0:bdd16076aaa5 471 do {
falingtrea 0:bdd16076aaa5 472 osDelay(100); // allows other threads to process
falingtrea 0:bdd16076aaa5 473 result = evbBaro->getStatus();
falingtrea 0:bdd16076aaa5 474 } while ((result & MPL3115A2::PTDR) == 0 );
falingtrea 0:bdd16076aaa5 475
falingtrea 0:bdd16076aaa5 476 /*
falingtrea 0:bdd16076aaa5 477 * Retrieve and print out altitude and temperature
falingtrea 0:bdd16076aaa5 478 */
falingtrea 0:bdd16076aaa5 479 baro_data = evbBaro->getAllData(false);
falingtrea 0:bdd16076aaa5 480 baro_data._baro /= 4096; // convert 32 bit signed to 20 bit signed value
falingtrea 0:bdd16076aaa5 481 num_whole = baro_data._baro / 16; // 18 bit signed significant integer
falingtrea 0:bdd16076aaa5 482 num_frac = (baro_data._baro & 0xF) * 625 / 100; // 4 bit fractional .0625 per bit
falingtrea 4:49d19abdfd04 483 sprintf(txtstr,"Alti=%ld.%02d m", num_whole, num_frac);
falingtrea 0:bdd16076aaa5 484 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 485 num_whole = baro_data._temp / 16; // 8 bit signed significant integer
falingtrea 0:bdd16076aaa5 486 num_frac = (baro_data._temp & 0x0F) * 625 / 100; // 4 bit fractional .0625 per bit
falingtrea 0:bdd16076aaa5 487 sprintf(txtstr,"Temp=%ld.%03d C", num_whole, num_frac);
falingtrea 0:bdd16076aaa5 488 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 489
falingtrea 0:bdd16076aaa5 490 /*
falingtrea 0:bdd16076aaa5 491 * retrieve and print out Ambient Light level
falingtrea 0:bdd16076aaa5 492 */
falingtrea 0:bdd16076aaa5 493 lux_data = evbAmbLight->getData();
falingtrea 0:bdd16076aaa5 494 num_whole = lux_data * 24 / 100; // 16000 lux full scale .24 lux per bit
falingtrea 0:bdd16076aaa5 495 num_frac = lux_data * 24 % 100;
falingtrea 0:bdd16076aaa5 496 sprintf(txtstr, "Light=%ld.%02d lux", num_whole, num_frac );
falingtrea 0:bdd16076aaa5 497 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 498
falingtrea 0:bdd16076aaa5 499 evbLCD->endUpdate();
falingtrea 4:49d19abdfd04 500 printf("finished iteration %d\r\n",(++i));
falingtrea 0:bdd16076aaa5 501
falingtrea 0:bdd16076aaa5 502 if (i % pckt_time == 0) { // check packet counter will send packet every 2-5-10 data collection loops
falingtrea 0:bdd16076aaa5 503 mdot_data.clear();
falingtrea 0:bdd16076aaa5 504 mdot_data.push_back(0x0E); // key for Current Acceleration 3-Axis Value
falingtrea 0:bdd16076aaa5 505 converts.f_s = accel_data._x *4; // shift data 2 bits while retaining sign
falingtrea 0:bdd16076aaa5 506 mdot_data.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
falingtrea 0:bdd16076aaa5 507 converts.f_s = accel_data._y * 4; // shift data 2 bits while retaining sign
falingtrea 0:bdd16076aaa5 508 mdot_data.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
falingtrea 0:bdd16076aaa5 509 converts.f_s = accel_data._z * 4; // shift data 2 bits while retaining sign
falingtrea 0:bdd16076aaa5 510 mdot_data.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
falingtrea 0:bdd16076aaa5 511 mdot_data.push_back(0x08); // key for Current Pressure Value
falingtrea 0:bdd16076aaa5 512 convertl.f_u = pressure; // pressure data is 20 bits unsigned
falingtrea 0:bdd16076aaa5 513 mdot_data.push_back(convertl.t_u[2]);
falingtrea 0:bdd16076aaa5 514 mdot_data.push_back(convertl.t_u[1]);
falingtrea 0:bdd16076aaa5 515 mdot_data.push_back(convertl.t_u[0]);
falingtrea 0:bdd16076aaa5 516 mdot_data.push_back(0x05); // key for Current Ambient Light Value
falingtrea 0:bdd16076aaa5 517 converts.f_u = lux_data; // data is 16 bits unsigned
falingtrea 0:bdd16076aaa5 518 mdot_data.push_back(converts.t_u[1]);
falingtrea 0:bdd16076aaa5 519 mdot_data.push_back(converts.t_u[0]);
falingtrea 0:bdd16076aaa5 520 mdot_data.push_back(0x0B); // key for Current Temperature Value
falingtrea 0:bdd16076aaa5 521 converts.f_s = baro_data._temp; // temperature is signed 12 bit
falingtrea 0:bdd16076aaa5 522 mdot_data.push_back(converts.t_u[1]);
falingtrea 0:bdd16076aaa5 523 mdot_data.push_back(converts.t_u[0]);
falingtrea 0:bdd16076aaa5 524
falingtrea 0:bdd16076aaa5 525 if ((mdot_ret = mdot_radio->send(mdot_data)) != mDot::MDOT_OK) {
falingtrea 0:bdd16076aaa5 526 log_error(mdot_radio, "failed to send", mdot_ret);
falingtrea 0:bdd16076aaa5 527 } else {
falingtrea 0:bdd16076aaa5 528 printf("successfully sent data to gateway\r\n");
falingtrea 0:bdd16076aaa5 529 }
falingtrea 0:bdd16076aaa5 530 }
falingtrea 2:75adc72aa6a0 531 } while(!exit_program && (i < 65000));
falingtrea 0:bdd16076aaa5 532
falingtrea 0:bdd16076aaa5 533 evbBaro->triggerOneShot();
falingtrea 0:bdd16076aaa5 534
falingtrea 0:bdd16076aaa5 535 do {
falingtrea 0:bdd16076aaa5 536 osDelay(200); // allows other threads to process
falingtrea 0:bdd16076aaa5 537 result = evbBaro->getStatus();
falingtrea 0:bdd16076aaa5 538 } while ((result & MPL3115A2::PTDR) == 0 );
falingtrea 0:bdd16076aaa5 539
falingtrea 0:bdd16076aaa5 540 baro_data = evbBaro->getAllData(true);
falingtrea 4:49d19abdfd04 541 printf ("minBaro=%ld maxBaro=%ld minTemp=%d maxTemp=%d\r\n", baro_data._minbaro, baro_data._maxbaro,
falingtrea 0:bdd16076aaa5 542 baro_data._mintemp, baro_data._maxtemp);
falingtrea 0:bdd16076aaa5 543
falingtrea 4:49d19abdfd04 544 printf("End of Test\r\n");
falingtrea 0:bdd16076aaa5 545
falingtrea 2:75adc72aa6a0 546 evbLCD->clearBuffer();
falingtrea 2:75adc72aa6a0 547 sprintf(txtstr,"Exiting Program");
falingtrea 2:75adc72aa6a0 548 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 549
falingtrea 0:bdd16076aaa5 550 }
falingtrea 0:bdd16076aaa5 551
falingtrea 0:bdd16076aaa5 552 /*
falingtrea 3:68e974f5f532 553 * Sets pb1_low flag. Slag is cleared in pb1_debounce thread
falingtrea 0:bdd16076aaa5 554 */
falingtrea 0:bdd16076aaa5 555 void pb1ISR(void)
falingtrea 0:bdd16076aaa5 556 {
mfiore 7:85445a8cc189 557 if (!pb1_low)
mfiore 7:85445a8cc189 558 pb1_low = true;
falingtrea 3:68e974f5f532 559 }
falingtrea 0:bdd16076aaa5 560
falingtrea 3:68e974f5f532 561 /*
falingtrea 3:68e974f5f532 562 * Debounces pb1. Also exits program if pushbutton 1 is pressed
falingtrea 3:68e974f5f532 563 */
falingtrea 3:68e974f5f532 564 void pb1_debounce(void const *args)
falingtrea 3:68e974f5f532 565 {
falingtrea 3:68e974f5f532 566
falingtrea 3:68e974f5f532 567 static uint8_t count = 0;
falingtrea 3:68e974f5f532 568
falingtrea 3:68e974f5f532 569 while (true) {
falingtrea 3:68e974f5f532 570
falingtrea 3:68e974f5f532 571 if (pb1_low && (mDot08 == 0))
mfiore 7:85445a8cc189 572 count++;
falingtrea 3:68e974f5f532 573 else {
mfiore 7:85445a8cc189 574 count = 0;
mfiore 7:85445a8cc189 575 pb1_low = false;
falingtrea 3:68e974f5f532 576 }
mfiore 7:85445a8cc189 577
mfiore 7:85445a8cc189 578 if (count == 5)
mfiore 7:85445a8cc189 579 exit_program = true;
mfiore 7:85445a8cc189 580
falingtrea 3:68e974f5f532 581 Thread::wait(5);
falingtrea 3:68e974f5f532 582 }
falingtrea 0:bdd16076aaa5 583 }
falingtrea 0:bdd16076aaa5 584
falingtrea 0:bdd16076aaa5 585 /*
falingtrea 3:68e974f5f532 586 * Sets pb2_low flag. Flag is cleared in pb2_debounce thread
falingtrea 0:bdd16076aaa5 587 */
falingtrea 0:bdd16076aaa5 588 void pb2ISR(void)
falingtrea 0:bdd16076aaa5 589 {
mfiore 7:85445a8cc189 590 if (!pb2_low)
mfiore 7:85445a8cc189 591 pb2_low = true;
falingtrea 3:68e974f5f532 592 }
falingtrea 0:bdd16076aaa5 593
falingtrea 3:68e974f5f532 594 /*
falingtrea 3:68e974f5f532 595 * Debounces pb2. Also changes packet transmit time to every other,
falingtrea 3:68e974f5f532 596 * every fifth, or every tenth sample when SW2 pushed
falingtrea 3:68e974f5f532 597 * Also triggers a thread to transmit a configuration packet
falingtrea 3:68e974f5f532 598 */
falingtrea 3:68e974f5f532 599 void pb2_debounce(void const *args)
falingtrea 3:68e974f5f532 600 {
falingtrea 3:68e974f5f532 601
falingtrea 3:68e974f5f532 602 static uint8_t count = 0;
falingtrea 3:68e974f5f532 603
falingtrea 3:68e974f5f532 604 while (true) {
falingtrea 0:bdd16076aaa5 605
falingtrea 3:68e974f5f532 606 if (pb2_low && (mDot09 == 0))
mfiore 7:85445a8cc189 607 count++;
falingtrea 3:68e974f5f532 608 else {
mfiore 7:85445a8cc189 609 count = 0;
mfiore 7:85445a8cc189 610 pb2_low = false;
falingtrea 3:68e974f5f532 611 }
mfiore 7:85445a8cc189 612
mfiore 7:85445a8cc189 613 if (count == 5) {
falingtrea 0:bdd16076aaa5 614
mfiore 7:85445a8cc189 615 if (pckt_time >= 5)
mfiore 7:85445a8cc189 616 pckt_time /= 2;
mfiore 7:85445a8cc189 617 else pckt_time = 20;
falingtrea 3:68e974f5f532 618
mfiore 7:85445a8cc189 619 thread_3->signal_set(0x10); // signal config_pkt_xmit to send packet
mfiore 7:85445a8cc189 620 }
mfiore 7:85445a8cc189 621
falingtrea 3:68e974f5f532 622 Thread::wait(5);
mfiore 7:85445a8cc189 623 }
mfiore 7:85445a8cc189 624 }
falingtrea 0:bdd16076aaa5 625
falingtrea 2:75adc72aa6a0 626 /*
falingtrea 2:75adc72aa6a0 627 * Function that print clear text verion of mDot errors
falingtrea 2:75adc72aa6a0 628 */
falingtrea 0:bdd16076aaa5 629 void log_error(mDot* dot, const char* msg, int32_t retval)
falingtrea 0:bdd16076aaa5 630 {
falingtrea 0:bdd16076aaa5 631 printf("%s - %ld:%s, %s\r\n", msg, retval, mDot::getReturnCodeString(retval).c_str(), dot->getLastError().c_str());
falingtrea 0:bdd16076aaa5 632 }
falingtrea 0:bdd16076aaa5 633
falingtrea 2:75adc72aa6a0 634 /*
falingtrea 2:75adc72aa6a0 635 * Thread that is triggered by SW2 ISR. Sends a packet to the LoRa server with the new Packet Transmission time setting
falingtrea 2:75adc72aa6a0 636 */
falingtrea 0:bdd16076aaa5 637 void config_pkt_xmit (void const *args)
falingtrea 0:bdd16076aaa5 638 {
falingtrea 0:bdd16076aaa5 639
falingtrea 0:bdd16076aaa5 640 std::vector<uint8_t> data;
falingtrea 0:bdd16076aaa5 641
falingtrea 0:bdd16076aaa5 642 while (true) {
falingtrea 0:bdd16076aaa5 643 Thread::signal_wait(0x10); // wait for pb2ISR to signal send
falingtrea 0:bdd16076aaa5 644 data.clear();
falingtrea 0:bdd16076aaa5 645 data.push_back(0x0F); // key for Configuration data (packet transmission timer)
falingtrea 0:bdd16076aaa5 646 data.push_back(pckt_time);
falingtrea 0:bdd16076aaa5 647
falingtrea 0:bdd16076aaa5 648 if ((mdot_ret = mdot_radio->send(data)) != mDot::MDOT_OK) {
falingtrea 0:bdd16076aaa5 649 log_error(mdot_radio, "failed to send config data", mdot_ret);
falingtrea 0:bdd16076aaa5 650 } else {
falingtrea 0:bdd16076aaa5 651 printf("sent config data to gateway\r\n");
falingtrea 0:bdd16076aaa5 652 }
falingtrea 0:bdd16076aaa5 653 }
falingtrea 0:bdd16076aaa5 654 }