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:
falingtrea
Date:
Thu Oct 22 19:36:34 2015 +0000
Revision:
4:49d19abdfd04
Parent:
3:68e974f5f532
Child:
7:85445a8cc189
Child:
8:6bf4d69651b7
Rev 1.04 Fixed format error in temperature print to LCD. Corrected error in public netework setup. Swapped \n and \r in prinf calls because Windows seems to be picky about the order;

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);
falingtrea 2:75adc72aa6a0 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
falingtrea 4:49d19abdfd04 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
falingtrea 2:75adc72aa6a0 258 /*
falingtrea 2:75adc72aa6a0 259 * This call sets up private or public mode on the MTDOT. Set the function to true if
falingtrea 2:75adc72aa6a0 260 * connecting to a public network
falingtrea 2:75adc72aa6a0 261 */
falingtrea 2:75adc72aa6a0 262 printf("setting Private Network Mode\r\n");
falingtrea 2:75adc72aa6a0 263 if ((mdot_ret = mdot_radio->setPublicNetwork(false)) != mDot::MDOT_OK) {
falingtrea 2:75adc72aa6a0 264 log_error(mdot_radio, "failed to set Public Network Mode", mdot_ret);
falingtrea 2:75adc72aa6a0 265 }
falingtrea 2:75adc72aa6a0 266
falingtrea 2:75adc72aa6a0 267 /*
falingtrea 2:75adc72aa6a0 268 * Frequency sub-band is valid for NAM only and for Private networks should be set to a value
falingtrea 2:75adc72aa6a0 269 * between 1-8 that matches the the LoRa gateway setting. Public networks use sub-band 0 only.
falingtrea 2:75adc72aa6a0 270 * This function can be commented out for EU networks
falingtrea 2:75adc72aa6a0 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
falingtrea 2:75adc72aa6a0 277 /*
falingtrea 2:75adc72aa6a0 278 * setNetworkName is used for private networks.
falingtrea 2:75adc72aa6a0 279 * Use setNetworkID(AppID) for public networks
falingtrea 2:75adc72aa6a0 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
falingtrea 2:75adc72aa6a0 290 /*
falingtrea 2:75adc72aa6a0 291 * setNetworkPassphrase is used for private networks
falingtrea 2:75adc72aa6a0 292 * Use setNetworkKey for public networks
falingtrea 2:75adc72aa6a0 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);
falingtrea 0:bdd16076aaa5 307 if (mdot_radio->getFrequencyBand() == mDot::FB_868){
falingtrea 0:bdd16076aaa5 308 mdot_ret = mdot_radio->getNextTxMs();
falingtrea 0:bdd16076aaa5 309 }
falingtrea 0:bdd16076aaa5 310 else {
falingtrea 0:bdd16076aaa5 311 mdot_ret = 0;
falingtrea 2:75adc72aa6a0 312 }
falingtrea 0:bdd16076aaa5 313
falingtrea 4:49d19abdfd04 314 printf("delay = %lu\r\n",mdot_ret);
falingtrea 0:bdd16076aaa5 315 osDelay(mdot_ret + 1);
falingtrea 0:bdd16076aaa5 316 }
falingtrea 2:75adc72aa6a0 317
falingtrea 2:75adc72aa6a0 318 /*
falingtrea 2:75adc72aa6a0 319 * Check for PB1 press during network join attempt
falingtrea 2:75adc72aa6a0 320 */
falingtrea 2:75adc72aa6a0 321 if (exit_program) {
falingtrea 4:49d19abdfd04 322 printf("Exiting program\r\n");
falingtrea 2:75adc72aa6a0 323 evbLCD->clearBuffer();
falingtrea 2:75adc72aa6a0 324 sprintf(txtstr,"Exiting Program");
falingtrea 2:75adc72aa6a0 325 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 326 exit(1);
falingtrea 2:75adc72aa6a0 327 }
falingtrea 2:75adc72aa6a0 328
falingtrea 0:bdd16076aaa5 329 } else {
falingtrea 4:49d19abdfd04 330 printf("radio setup failed\r\n");
falingtrea 0:bdd16076aaa5 331 //exit(1);
falingtrea 0:bdd16076aaa5 332 }
falingtrea 0:bdd16076aaa5 333
falingtrea 0:bdd16076aaa5 334 osDelay(200);
falingtrea 0:bdd16076aaa5 335 evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
falingtrea 0:bdd16076aaa5 336
falingtrea 2:75adc72aa6a0 337 // sets LED2 to 50% max current
falingtrea 0:bdd16076aaa5 338 evbBackLight->setLEDCurrent(16);
falingtrea 0:bdd16076aaa5 339
falingtrea 4:49d19abdfd04 340 printf("Start of Test\r\n");
falingtrea 0:bdd16076aaa5 341
falingtrea 2:75adc72aa6a0 342 osDelay (500); // allows other threads to process
falingtrea 4:49d19abdfd04 343 printf("shutdown LED:\r\n");
falingtrea 2:75adc72aa6a0 344 evbBackLight->shutdown();
falingtrea 0:bdd16076aaa5 345
falingtrea 0:bdd16076aaa5 346 osDelay (500); // allows other threads to process
falingtrea 4:49d19abdfd04 347 printf("Turn on LED2\r\n");
falingtrea 0:bdd16076aaa5 348 evbBackLight->setLEDCurrent(16);
falingtrea 0:bdd16076aaa5 349
falingtrea 0:bdd16076aaa5 350 data = evbAccel->getWhoAmI();
falingtrea 4:49d19abdfd04 351 printf("Accelerometer who_am_i value = %x \r\n", data);
falingtrea 0:bdd16076aaa5 352
falingtrea 0:bdd16076aaa5 353 result = evbAccel->getStatus();
falingtrea 4:49d19abdfd04 354 printf("status byte = %x \r\n", result);
falingtrea 0:bdd16076aaa5 355
falingtrea 4:49d19abdfd04 356 printf("Barometer who_am_i check = %s \r\n", evbBaro->testWhoAmI() ? "TRUE" : "FALSE");
falingtrea 0:bdd16076aaa5 357
falingtrea 0:bdd16076aaa5 358 result = evbBaro->getStatus();
falingtrea 4:49d19abdfd04 359 printf("status byte = %x \r\n", result);
falingtrea 0:bdd16076aaa5 360
falingtrea 0:bdd16076aaa5 361 /*
falingtrea 0:bdd16076aaa5 362 * Setup the Accelerometer for 8g range, 14 bit resolution, Noise reduction off, sample rate 1.56 Hz
falingtrea 0:bdd16076aaa5 363 * normal oversample mode, High pass filter off
falingtrea 0:bdd16076aaa5 364 */
falingtrea 0:bdd16076aaa5 365 evbAccel->setCommonParameters(MMA845x::RANGE_8g,MMA845x::RES_MAX,MMA845x::LN_OFF,
falingtrea 0:bdd16076aaa5 366 MMA845x::DR_1_56,MMA845x::OS_NORMAL,MMA845x::HPF_OFF );
falingtrea 0:bdd16076aaa5 367
falingtrea 0:bdd16076aaa5 368 /*
falingtrea 0:bdd16076aaa5 369 * Setup the Barometric sensor for post processed Ambient pressure, 4 samples per data acquisition.
falingtrea 0:bdd16076aaa5 370 * and a sample taken every second when in active mode
falingtrea 0:bdd16076aaa5 371 */
falingtrea 0:bdd16076aaa5 372 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16,
falingtrea 0:bdd16076aaa5 373 MPL3115A2::AT_1);
falingtrea 0:bdd16076aaa5 374 /*
falingtrea 0:bdd16076aaa5 375 * Setup the Ambient Light Sensor for continuous Ambient Light Sensing, 16 bit resolution,
falingtrea 0:bdd16076aaa5 376 * and 16000 lux range
falingtrea 0:bdd16076aaa5 377 */
falingtrea 0:bdd16076aaa5 378
falingtrea 0:bdd16076aaa5 379 evbAmbLight->setMode(ISL29011::ALS_CONT);
falingtrea 0:bdd16076aaa5 380 evbAmbLight->setResolution(ISL29011::ADC_16BIT);
falingtrea 0:bdd16076aaa5 381 evbAmbLight->setRange(ISL29011::RNG_16000);
falingtrea 0:bdd16076aaa5 382
falingtrea 0:bdd16076aaa5 383 /*
falingtrea 0:bdd16076aaa5 384 * Set the accelerometer for active mode
falingtrea 0:bdd16076aaa5 385 */
falingtrea 0:bdd16076aaa5 386 evbAccel->activeMode();
falingtrea 0:bdd16076aaa5 387
falingtrea 0:bdd16076aaa5 388 /*
falingtrea 0:bdd16076aaa5 389 * Clear the min-max registers in the Barometric Sensor
falingtrea 0:bdd16076aaa5 390 */
falingtrea 0:bdd16076aaa5 391 evbBaro->clearMinMaxRegs();
falingtrea 0:bdd16076aaa5 392
falingtrea 0:bdd16076aaa5 393 evbBackLight->setLEDCurrent(0);
falingtrea 0:bdd16076aaa5 394
falingtrea 0:bdd16076aaa5 395 /*
falingtrea 2:75adc72aa6a0 396 * Check for PB1 press during network join attempt
falingtrea 2:75adc72aa6a0 397 */
falingtrea 2:75adc72aa6a0 398 if (exit_program) {
falingtrea 4:49d19abdfd04 399 printf("Exiting program\r\n");
falingtrea 2:75adc72aa6a0 400 evbLCD->clearBuffer();
falingtrea 2:75adc72aa6a0 401 sprintf(txtstr,"Exiting Program");
falingtrea 2:75adc72aa6a0 402 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 403 exit(1);
falingtrea 2:75adc72aa6a0 404 }
falingtrea 2:75adc72aa6a0 405
falingtrea 2:75adc72aa6a0 406 /*
falingtrea 0:bdd16076aaa5 407 * Main data acquisition loop
falingtrea 0:bdd16076aaa5 408 */
falingtrea 0:bdd16076aaa5 409 pckt_time = 10;
falingtrea 0:bdd16076aaa5 410 i = 0;
falingtrea 0:bdd16076aaa5 411
falingtrea 0:bdd16076aaa5 412 do {
falingtrea 0:bdd16076aaa5 413 evbLCD->startUpdate();
falingtrea 0:bdd16076aaa5 414 evbLCD->clearBuffer();
falingtrea 0:bdd16076aaa5 415
falingtrea 0:bdd16076aaa5 416 /*
falingtrea 0:bdd16076aaa5 417 * Test Accelerometer XYZ data ready bit to see if acquisition complete
falingtrea 0:bdd16076aaa5 418 */
falingtrea 0:bdd16076aaa5 419 do {
falingtrea 0:bdd16076aaa5 420 osDelay(100); // allows other threads to process
falingtrea 0:bdd16076aaa5 421 result = evbAccel->getStatus();
falingtrea 0:bdd16076aaa5 422 } while ((result & MMA845x::XYZDR) == 0 );
falingtrea 0:bdd16076aaa5 423
falingtrea 0:bdd16076aaa5 424 /*
falingtrea 0:bdd16076aaa5 425 * Retrieve and print out accelerometer data
falingtrea 0:bdd16076aaa5 426 */
falingtrea 0:bdd16076aaa5 427 accel_data = evbAccel->getXYZ();
falingtrea 0:bdd16076aaa5 428
falingtrea 0:bdd16076aaa5 429 sprintf(txtstr,"Accelerometer");
falingtrea 0:bdd16076aaa5 430 evbLCD->writeText(0,0,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 431 sprintf(txtstr, "x = %d", accel_data._x);
falingtrea 0:bdd16076aaa5 432 evbLCD->writeText(20,1,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 433 sprintf(txtstr, "y = %d", accel_data._y);
falingtrea 0:bdd16076aaa5 434 evbLCD->writeText(20,2,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 435 sprintf(txtstr, "z = %d", accel_data._z );
falingtrea 0:bdd16076aaa5 436 evbLCD->writeText(20,3,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 437
falingtrea 0:bdd16076aaa5 438 /*
falingtrea 0:bdd16076aaa5 439 * Trigger a Pressure reading
falingtrea 0:bdd16076aaa5 440 */
falingtrea 0:bdd16076aaa5 441 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16,
falingtrea 0:bdd16076aaa5 442 MPL3115A2::AT_1);
falingtrea 0:bdd16076aaa5 443 evbBaro->triggerOneShot();
falingtrea 0:bdd16076aaa5 444
falingtrea 0:bdd16076aaa5 445 /*
falingtrea 0:bdd16076aaa5 446 * Test barometer device status to see if acquisition is complete
falingtrea 0:bdd16076aaa5 447 */
falingtrea 0:bdd16076aaa5 448 do {
falingtrea 0:bdd16076aaa5 449 osDelay(100); // allows other threads to process
falingtrea 0:bdd16076aaa5 450 result = evbBaro->getStatus();
falingtrea 0:bdd16076aaa5 451 } while ((result & MPL3115A2::PTDR) == 0 );
falingtrea 0:bdd16076aaa5 452
falingtrea 0:bdd16076aaa5 453 /*
falingtrea 0:bdd16076aaa5 454 * Retrieve and print out barometric pressure
falingtrea 0:bdd16076aaa5 455 */
falingtrea 0:bdd16076aaa5 456 pressure = evbBaro->getBaroData() >> 12; // convert 32 bit signed to 20 bit unsigned value
falingtrea 0:bdd16076aaa5 457 num_whole = pressure >> 2; // 18 bit integer significant
falingtrea 0:bdd16076aaa5 458 num_frac = (pressure & 0x3) * 25; // 2 bit fractional 0.25 per bit
falingtrea 0:bdd16076aaa5 459 sprintf(txtstr,"Press=%ld.%02d Pa", num_whole, num_frac);
falingtrea 0:bdd16076aaa5 460 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 461
falingtrea 0:bdd16076aaa5 462 /*
falingtrea 0:bdd16076aaa5 463 * Trigger a Altitude reading
falingtrea 0:bdd16076aaa5 464 */
falingtrea 0:bdd16076aaa5 465 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_ALTIMETER, MPL3115A2::OR_16,
falingtrea 0:bdd16076aaa5 466 MPL3115A2::AT_1);
falingtrea 0:bdd16076aaa5 467 evbBaro->triggerOneShot();
falingtrea 0:bdd16076aaa5 468
falingtrea 0:bdd16076aaa5 469 /*
falingtrea 0:bdd16076aaa5 470 * Test barometer device status to see if acquisition is complete
falingtrea 0:bdd16076aaa5 471 */
falingtrea 0:bdd16076aaa5 472 do {
falingtrea 0:bdd16076aaa5 473 osDelay(100); // allows other threads to process
falingtrea 0:bdd16076aaa5 474 result = evbBaro->getStatus();
falingtrea 0:bdd16076aaa5 475 } while ((result & MPL3115A2::PTDR) == 0 );
falingtrea 0:bdd16076aaa5 476
falingtrea 0:bdd16076aaa5 477 /*
falingtrea 0:bdd16076aaa5 478 * Retrieve and print out altitude and temperature
falingtrea 0:bdd16076aaa5 479 */
falingtrea 0:bdd16076aaa5 480 baro_data = evbBaro->getAllData(false);
falingtrea 0:bdd16076aaa5 481 baro_data._baro /= 4096; // convert 32 bit signed to 20 bit signed value
falingtrea 0:bdd16076aaa5 482 num_whole = baro_data._baro / 16; // 18 bit signed significant integer
falingtrea 0:bdd16076aaa5 483 num_frac = (baro_data._baro & 0xF) * 625 / 100; // 4 bit fractional .0625 per bit
falingtrea 4:49d19abdfd04 484 sprintf(txtstr,"Alti=%ld.%02d m", num_whole, num_frac);
falingtrea 0:bdd16076aaa5 485 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 486 num_whole = baro_data._temp / 16; // 8 bit signed significant integer
falingtrea 0:bdd16076aaa5 487 num_frac = (baro_data._temp & 0x0F) * 625 / 100; // 4 bit fractional .0625 per bit
falingtrea 0:bdd16076aaa5 488 sprintf(txtstr,"Temp=%ld.%03d C", num_whole, num_frac);
falingtrea 0:bdd16076aaa5 489 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 490
falingtrea 0:bdd16076aaa5 491 /*
falingtrea 0:bdd16076aaa5 492 * retrieve and print out Ambient Light level
falingtrea 0:bdd16076aaa5 493 */
falingtrea 0:bdd16076aaa5 494 lux_data = evbAmbLight->getData();
falingtrea 0:bdd16076aaa5 495 num_whole = lux_data * 24 / 100; // 16000 lux full scale .24 lux per bit
falingtrea 0:bdd16076aaa5 496 num_frac = lux_data * 24 % 100;
falingtrea 0:bdd16076aaa5 497 sprintf(txtstr, "Light=%ld.%02d lux", num_whole, num_frac );
falingtrea 0:bdd16076aaa5 498 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
falingtrea 0:bdd16076aaa5 499
falingtrea 0:bdd16076aaa5 500 evbLCD->endUpdate();
falingtrea 4:49d19abdfd04 501 printf("finished iteration %d\r\n",(++i));
falingtrea 0:bdd16076aaa5 502
falingtrea 0:bdd16076aaa5 503 if (i % pckt_time == 0) { // check packet counter will send packet every 2-5-10 data collection loops
falingtrea 0:bdd16076aaa5 504 mdot_data.clear();
falingtrea 0:bdd16076aaa5 505 mdot_data.push_back(0x0E); // key for Current Acceleration 3-Axis Value
falingtrea 0:bdd16076aaa5 506 converts.f_s = accel_data._x *4; // shift data 2 bits while retaining sign
falingtrea 0:bdd16076aaa5 507 mdot_data.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
falingtrea 0:bdd16076aaa5 508 converts.f_s = accel_data._y * 4; // shift data 2 bits while retaining sign
falingtrea 0:bdd16076aaa5 509 mdot_data.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
falingtrea 0:bdd16076aaa5 510 converts.f_s = accel_data._z * 4; // shift data 2 bits while retaining sign
falingtrea 0:bdd16076aaa5 511 mdot_data.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
falingtrea 0:bdd16076aaa5 512 mdot_data.push_back(0x08); // key for Current Pressure Value
falingtrea 0:bdd16076aaa5 513 convertl.f_u = pressure; // pressure data is 20 bits unsigned
falingtrea 0:bdd16076aaa5 514 mdot_data.push_back(convertl.t_u[2]);
falingtrea 0:bdd16076aaa5 515 mdot_data.push_back(convertl.t_u[1]);
falingtrea 0:bdd16076aaa5 516 mdot_data.push_back(convertl.t_u[0]);
falingtrea 0:bdd16076aaa5 517 mdot_data.push_back(0x05); // key for Current Ambient Light Value
falingtrea 0:bdd16076aaa5 518 converts.f_u = lux_data; // data is 16 bits unsigned
falingtrea 0:bdd16076aaa5 519 mdot_data.push_back(converts.t_u[1]);
falingtrea 0:bdd16076aaa5 520 mdot_data.push_back(converts.t_u[0]);
falingtrea 0:bdd16076aaa5 521 mdot_data.push_back(0x0B); // key for Current Temperature Value
falingtrea 0:bdd16076aaa5 522 converts.f_s = baro_data._temp; // temperature is signed 12 bit
falingtrea 0:bdd16076aaa5 523 mdot_data.push_back(converts.t_u[1]);
falingtrea 0:bdd16076aaa5 524 mdot_data.push_back(converts.t_u[0]);
falingtrea 0:bdd16076aaa5 525
falingtrea 0:bdd16076aaa5 526 if ((mdot_ret = mdot_radio->send(mdot_data)) != mDot::MDOT_OK) {
falingtrea 0:bdd16076aaa5 527 log_error(mdot_radio, "failed to send", mdot_ret);
falingtrea 0:bdd16076aaa5 528 } else {
falingtrea 0:bdd16076aaa5 529 printf("successfully sent data to gateway\r\n");
falingtrea 0:bdd16076aaa5 530 }
falingtrea 0:bdd16076aaa5 531 }
falingtrea 2:75adc72aa6a0 532 } while(!exit_program && (i < 65000));
falingtrea 0:bdd16076aaa5 533
falingtrea 0:bdd16076aaa5 534 evbBaro->triggerOneShot();
falingtrea 0:bdd16076aaa5 535
falingtrea 0:bdd16076aaa5 536 do {
falingtrea 0:bdd16076aaa5 537 osDelay(200); // allows other threads to process
falingtrea 0:bdd16076aaa5 538 result = evbBaro->getStatus();
falingtrea 0:bdd16076aaa5 539 } while ((result & MPL3115A2::PTDR) == 0 );
falingtrea 0:bdd16076aaa5 540
falingtrea 0:bdd16076aaa5 541 baro_data = evbBaro->getAllData(true);
falingtrea 4:49d19abdfd04 542 printf ("minBaro=%ld maxBaro=%ld minTemp=%d maxTemp=%d\r\n", baro_data._minbaro, baro_data._maxbaro,
falingtrea 0:bdd16076aaa5 543 baro_data._mintemp, baro_data._maxtemp);
falingtrea 0:bdd16076aaa5 544
falingtrea 4:49d19abdfd04 545 printf("End of Test\r\n");
falingtrea 0:bdd16076aaa5 546
falingtrea 2:75adc72aa6a0 547 evbLCD->clearBuffer();
falingtrea 2:75adc72aa6a0 548 sprintf(txtstr,"Exiting Program");
falingtrea 2:75adc72aa6a0 549 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 550
falingtrea 0:bdd16076aaa5 551 }
falingtrea 0:bdd16076aaa5 552
falingtrea 0:bdd16076aaa5 553 /*
falingtrea 3:68e974f5f532 554 * Sets pb1_low flag. Slag is cleared in pb1_debounce thread
falingtrea 0:bdd16076aaa5 555 */
falingtrea 0:bdd16076aaa5 556 void pb1ISR(void)
falingtrea 0:bdd16076aaa5 557 {
falingtrea 3:68e974f5f532 558 if (!pb1_low)
falingtrea 3:68e974f5f532 559 pb1_low = true;
falingtrea 3:68e974f5f532 560 }
falingtrea 0:bdd16076aaa5 561
falingtrea 3:68e974f5f532 562 /*
falingtrea 3:68e974f5f532 563 * Debounces pb1. Also exits program if pushbutton 1 is pressed
falingtrea 3:68e974f5f532 564 */
falingtrea 3:68e974f5f532 565 void pb1_debounce(void const *args)
falingtrea 3:68e974f5f532 566 {
falingtrea 3:68e974f5f532 567
falingtrea 3:68e974f5f532 568 static uint8_t count = 0;
falingtrea 3:68e974f5f532 569
falingtrea 3:68e974f5f532 570 while (true) {
falingtrea 3:68e974f5f532 571
falingtrea 3:68e974f5f532 572 if (pb1_low && (mDot08 == 0))
falingtrea 3:68e974f5f532 573 count++;
falingtrea 3:68e974f5f532 574 else {
falingtrea 3:68e974f5f532 575 count = 0;
falingtrea 3:68e974f5f532 576 pb1_low = false;
falingtrea 3:68e974f5f532 577 }
falingtrea 3:68e974f5f532 578
falingtrea 3:68e974f5f532 579 if (count == 5)
falingtrea 3:68e974f5f532 580 exit_program = true;
falingtrea 3:68e974f5f532 581
falingtrea 3:68e974f5f532 582 Thread::wait(5);
falingtrea 3:68e974f5f532 583 }
falingtrea 0:bdd16076aaa5 584 }
falingtrea 0:bdd16076aaa5 585
falingtrea 0:bdd16076aaa5 586 /*
falingtrea 3:68e974f5f532 587 * Sets pb2_low flag. Flag is cleared in pb2_debounce thread
falingtrea 0:bdd16076aaa5 588 */
falingtrea 0:bdd16076aaa5 589 void pb2ISR(void)
falingtrea 0:bdd16076aaa5 590 {
falingtrea 3:68e974f5f532 591 if (!pb2_low)
falingtrea 3:68e974f5f532 592 pb2_low = true;
falingtrea 3:68e974f5f532 593 }
falingtrea 0:bdd16076aaa5 594
falingtrea 3:68e974f5f532 595 /*
falingtrea 3:68e974f5f532 596 * Debounces pb2. Also changes packet transmit time to every other,
falingtrea 3:68e974f5f532 597 * every fifth, or every tenth sample when SW2 pushed
falingtrea 3:68e974f5f532 598 * Also triggers a thread to transmit a configuration packet
falingtrea 3:68e974f5f532 599 */
falingtrea 3:68e974f5f532 600 void pb2_debounce(void const *args)
falingtrea 3:68e974f5f532 601 {
falingtrea 3:68e974f5f532 602
falingtrea 3:68e974f5f532 603 static uint8_t count = 0;
falingtrea 3:68e974f5f532 604
falingtrea 3:68e974f5f532 605 while (true) {
falingtrea 0:bdd16076aaa5 606
falingtrea 3:68e974f5f532 607 if (pb2_low && (mDot09 == 0))
falingtrea 3:68e974f5f532 608 count++;
falingtrea 3:68e974f5f532 609 else {
falingtrea 3:68e974f5f532 610 count = 0;
falingtrea 3:68e974f5f532 611 pb2_low = false;
falingtrea 3:68e974f5f532 612 }
falingtrea 3:68e974f5f532 613
falingtrea 3:68e974f5f532 614 if (count == 5){
falingtrea 0:bdd16076aaa5 615
falingtrea 3:68e974f5f532 616 if (pckt_time >= 5)
falingtrea 3:68e974f5f532 617 pckt_time /= 2;
falingtrea 3:68e974f5f532 618 else pckt_time = 20;
falingtrea 3:68e974f5f532 619
falingtrea 3:68e974f5f532 620 thread_3->signal_set(0x10); // signal config_pkt_xmit to send packet
falingtrea 3:68e974f5f532 621 }
falingtrea 3:68e974f5f532 622
falingtrea 3:68e974f5f532 623 Thread::wait(5);
falingtrea 3:68e974f5f532 624 }
falingtrea 3:68e974f5f532 625 }
falingtrea 0:bdd16076aaa5 626
falingtrea 2:75adc72aa6a0 627 /*
falingtrea 2:75adc72aa6a0 628 * Function that print clear text verion of mDot errors
falingtrea 2:75adc72aa6a0 629 */
falingtrea 0:bdd16076aaa5 630 void log_error(mDot* dot, const char* msg, int32_t retval)
falingtrea 0:bdd16076aaa5 631 {
falingtrea 0:bdd16076aaa5 632 printf("%s - %ld:%s, %s\r\n", msg, retval, mDot::getReturnCodeString(retval).c_str(), dot->getLastError().c_str());
falingtrea 0:bdd16076aaa5 633 }
falingtrea 0:bdd16076aaa5 634
falingtrea 2:75adc72aa6a0 635 /*
falingtrea 2:75adc72aa6a0 636 * Thread that is triggered by SW2 ISR. Sends a packet to the LoRa server with the new Packet Transmission time setting
falingtrea 2:75adc72aa6a0 637 */
falingtrea 0:bdd16076aaa5 638 void config_pkt_xmit (void const *args)
falingtrea 0:bdd16076aaa5 639 {
falingtrea 0:bdd16076aaa5 640
falingtrea 0:bdd16076aaa5 641 std::vector<uint8_t> data;
falingtrea 0:bdd16076aaa5 642
falingtrea 0:bdd16076aaa5 643 while (true) {
falingtrea 0:bdd16076aaa5 644 Thread::signal_wait(0x10); // wait for pb2ISR to signal send
falingtrea 0:bdd16076aaa5 645 data.clear();
falingtrea 0:bdd16076aaa5 646 data.push_back(0x0F); // key for Configuration data (packet transmission timer)
falingtrea 0:bdd16076aaa5 647 data.push_back(pckt_time);
falingtrea 0:bdd16076aaa5 648
falingtrea 0:bdd16076aaa5 649 if ((mdot_ret = mdot_radio->send(data)) != mDot::MDOT_OK) {
falingtrea 0:bdd16076aaa5 650 log_error(mdot_radio, "failed to send config data", mdot_ret);
falingtrea 0:bdd16076aaa5 651 } else {
falingtrea 0:bdd16076aaa5 652 printf("sent config data to gateway\r\n");
falingtrea 0:bdd16076aaa5 653 }
falingtrea 0:bdd16076aaa5 654 }
falingtrea 0:bdd16076aaa5 655 }