mDot EVB to M2X demo.

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

Fork of MTDOT-EVBDemo by Multi-Hackers

Committer:
jamescmaki
Date:
Thu Jul 16 21:00:37 2015 +0000
Revision:
4:71e411fbd9ff
Parent:
3:68e974f5f532
Child:
5:72d4d95e1d42
Update to pass m2x device and key through to conduit. This is for demo only. In normal circumstances the Conduit would be configured with this information.

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