Provide working example for LoRa 'Sensor-to-Cloud' demonstration using MultiTech LoRa Starter Kit and Telit Data and Cloud Platform Services Offerings

Dependencies:   DOGS102 GpsParser ISL29011 MMA845x MPL3115A2 MTS-Serial NCP5623B mDot_X_NUCLEO_IKS01A1 libmDot-mbed5

Committer:
efersko
Date:
Thu Jul 13 19:07:48 2017 +0000
Revision:
1:a669573d5d36
Parent:
0:e516bb631931
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
efersko 0:e516bb631931 1 /*================================================================================
efersko 0:e516bb631931 2 *
efersko 0:e516bb631931 3 * CLASIFICATION: **** PUBLIC RELEASE AS-IS APPLICATION EXAMPLE ****
efersko 0:e516bb631931 4 *
efersko 0:e516bb631931 5 * SOURCE FILE NAME: main.cpp
efersko 0:e516bb631931 6 *
efersko 0:e516bb631931 7 * DESCRIPTIVE NAME: MBED Source for MultiTech mDot, EVB, and MDOT-BOX Devices
efersko 0:e516bb631931 8 *
efersko 0:e516bb631931 9 * COPYRIGHT: Copyright 2014-2017, Telit
efersko 0:e516bb631931 10 *
efersko 0:e516bb631931 11 * LICENSED MATERIAL - PROGRAM PROPERTY OF TELIT
efersko 0:e516bb631931 12 * REFER TO TELIT COPYRIGHT INSTRUCTION
efersko 0:e516bb631931 13 *
efersko 0:e516bb631931 14 ** WEB SITE: www.telit.com
efersko 0:e516bb631931 15 *
efersko 0:e516bb631931 16 * WRITTEN BY: Eliott Fersko and John Keever
efersko 0:e516bb631931 17 *
efersko 0:e516bb631931 18 * DATE: April 17, 2017
efersko 0:e516bb631931 19 *
efersko 0:e516bb631931 20 * VERSION: 1.04
efersko 0:e516bb631931 21 *
efersko 0:e516bb631931 22 * FUNCTION: Provide working example for LoRa 'Sensor-to-Cloud'
efersko 0:e516bb631931 23 * Demonstration using MultiTech LoRa Starter Kit and
efersko 0:e516bb631931 24 * Telit Data and Cloud Platform Services Offerings
efersko 0:e516bb631931 25 *
efersko 0:e516bb631931 26 * SOURCE FILE TYPE: MBED C++
efersko 0:e516bb631931 27 *
efersko 0:e516bb631931 28 * FUNCTIONS/ENTRY POINTS: main
efersko 0:e516bb631931 29 *
efersko 0:e516bb631931 30 * INPUT = None.
efersko 0:e516bb631931 31 * OUTPUT = None.
efersko 0:e516bb631931 32 *
efersko 0:e516bb631931 33 * EXIT-NORMAL = N/A
efersko 0:e516bb631931 34 * EXIT-ERROR = N/A
efersko 0:e516bb631931 35 *
efersko 0:e516bb631931 36 * EXTERNAL REFERENCES = None.
efersko 0:e516bb631931 37 *
efersko 0:e516bb631931 38 * EXTERNAL FUNCTIONS = None.
efersko 0:e516bb631931 39 *
efersko 0:e516bb631931 40 * CONTROL BLOCKS = None.
efersko 0:e516bb631931 41 *
efersko 0:e516bb631931 42 *================================================================================*/
efersko 0:e516bb631931 43 /* LEGAL DISCLAIMER */
efersko 0:e516bb631931 44 /*================================================================================
efersko 0:e516bb631931 45
efersko 0:e516bb631931 46 Redistribution and use in source and binary forms, with or without
efersko 0:e516bb631931 47 modification, are permitted provided that the following conditions
efersko 0:e516bb631931 48 are met:
efersko 0:e516bb631931 49
efersko 0:e516bb631931 50 Neither the name of ILS Technology nor Telit nor the names of its
efersko 0:e516bb631931 51 contributors may be used to endorse or promote products derived
efersko 0:e516bb631931 52 from this software without specific prior written permission.
efersko 0:e516bb631931 53
efersko 0:e516bb631931 54 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
efersko 0:e516bb631931 55 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
efersko 0:e516bb631931 56 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
efersko 0:e516bb631931 57 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
efersko 0:e516bb631931 58 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
efersko 0:e516bb631931 59 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
efersko 0:e516bb631931 60 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
efersko 0:e516bb631931 61 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
efersko 0:e516bb631931 62 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
efersko 0:e516bb631931 63 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
efersko 0:e516bb631931 64 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
efersko 0:e516bb631931 65
efersko 0:e516bb631931 66 *================================================================================*/
efersko 0:e516bb631931 67 /* CHANGE LOG */
efersko 0:e516bb631931 68 /*================================================================================*/
efersko 0:e516bb631931 69 /* |Changed | | */
efersko 0:e516bb631931 70 /* Date | by |Version ID| Comments */
efersko 0:e516bb631931 71 /*----------+--------+----------+-------------------------------------------------*/
efersko 0:e516bb631931 72 /*04-12-2017|JEK |V1.00 |Original Version - mDot, EVB, MDOT-BOX */
efersko 0:e516bb631931 73 /*04-14-2017|JEK |V1.01 |Added IRQ Handlers - SW1/SW2 (Threads?) */
efersko 0:e516bb631931 74 /*04-17-2017|JEK |V1.02 |Added Binary LoRa Payload Message Framing Type */
efersko 0:e516bb631931 75 /*04-24-2017|EMF |V1.03 |Updated Libraries */
efersko 0:e516bb631931 76 /*05-10-2017|EMF |V1.04 |Added support for ST-Micro MEMS Sensor Shield */
efersko 0:e516bb631931 77 /*05-30-2017|EMF |V1.05 |Added GPS support for MDOT-BOX */
efersko 0:e516bb631931 78 /*================================================================================*/
efersko 0:e516bb631931 79 /*NOTE: Please keep the change log up to date!!! */
efersko 0:e516bb631931 80 /*================================================================================*/
efersko 0:e516bb631931 81
efersko 0:e516bb631931 82 #include "mbed.h"
efersko 0:e516bb631931 83 #include "MMA845x.h"
efersko 0:e516bb631931 84 #include "MPL3115A2.h"
efersko 0:e516bb631931 85 #include "ISL29011.h"
efersko 0:e516bb631931 86 #include "NCP5623B.h"
efersko 0:e516bb631931 87 #include "DOGS102.h"
efersko 0:e516bb631931 88 #include "font_6x8.h"
efersko 0:e516bb631931 89 #include "MultiTech_Logo.h"
efersko 0:e516bb631931 90 #include "mDot.h"
efersko 0:e516bb631931 91 #include "rtos.h"
efersko 0:e516bb631931 92 #include "GPSPARSER.h"
efersko 0:e516bb631931 93 #include "MTSSerial.h"
efersko 0:e516bb631931 94 #include "x_nucleo_iks01a1.h"
efersko 0:e516bb631931 95
efersko 0:e516bb631931 96 #include <cmath>
efersko 0:e516bb631931 97 #include <string>
efersko 0:e516bb631931 98 #include <vector>
efersko 0:e516bb631931 99 #include <ctime>
efersko 0:e516bb631931 100 #include <Ticker.h>
efersko 0:e516bb631931 101
efersko 0:e516bb631931 102 #define CALL_METH(obj, meth, param, ret) ((obj == NULL) ? \
efersko 0:e516bb631931 103 ((*(param) = (ret)), 0) : \
efersko 0:e516bb631931 104 ((obj)->meth(param)) \
efersko 0:e516bb631931 105 )
efersko 0:e516bb631931 106
efersko 0:e516bb631931 107 //Length of time between data publishes
efersko 0:e516bb631931 108 const int CYCLE_TIME = 5000;
efersko 0:e516bb631931 109
efersko 0:e516bb631931 110 enum LED1_COLOR {
efersko 0:e516bb631931 111 RED = 0,
efersko 0:e516bb631931 112 GREEN = 1
efersko 0:e516bb631931 113 };
efersko 0:e516bb631931 114
efersko 0:e516bb631931 115 namespace {
efersko 0:e516bb631931 116 const int MS_INTERVALS = 1000;
efersko 0:e516bb631931 117 }
efersko 0:e516bb631931 118
efersko 0:e516bb631931 119 /*
efersko 0:e516bb631931 120 * union for converting from 32-bit to 4 8-bit values
efersko 0:e516bb631931 121 */
efersko 0:e516bb631931 122 union convert32 {
efersko 0:e516bb631931 123 int32_t f_s; // convert from signed 32 bit int
efersko 0:e516bb631931 124 uint32_t f_u; // convert from unsigned 32 bit int
efersko 0:e516bb631931 125 uint8_t t_u[4]; // convert to 8 bit unsigned array
efersko 0:e516bb631931 126 };
efersko 0:e516bb631931 127
efersko 0:e516bb631931 128 typedef struct {
efersko 0:e516bb631931 129 int32_t AXIS_X;
efersko 0:e516bb631931 130 int32_t AXIS_Y;
efersko 0:e516bb631931 131 int32_t AXIS_Z;
efersko 0:e516bb631931 132 } AxesRaw_TypeDef;
efersko 0:e516bb631931 133
efersko 0:e516bb631931 134
efersko 0:e516bb631931 135 /*
efersko 0:e516bb631931 136 * union for converting from 16- bit to 2 8-bit values
efersko 0:e516bb631931 137 */
efersko 0:e516bb631931 138 union convert16 {
efersko 0:e516bb631931 139 int16_t f_s; // convert from signed 16 bit int
efersko 0:e516bb631931 140 uint16_t f_u; // convert from unsigned 16 bit int
efersko 0:e516bb631931 141 uint8_t t_u[2]; // convert to 8 bit unsigned array
efersko 0:e516bb631931 142 };
efersko 0:e516bb631931 143
efersko 0:e516bb631931 144 //DigitalIn mDot02(PA_2); // GPIO/UART_TX
efersko 0:e516bb631931 145 //DigitalOut mDot03(PA_3); // GPIO/UART_RX
efersko 0:e516bb631931 146 //DigitalIn mDot04(PA_6); // GPIO/SPI_MISO
efersko 0:e516bb631931 147 //DigitalIn mDot06(PA_8); // GPIO/I2C_SCL
efersko 0:e516bb631931 148 //DigitalIn mDot07(PC_9); // GPIO/I2C_SDA
efersko 0:e516bb631931 149
efersko 0:e516bb631931 150 InterruptIn mDot08(PA_12); // GPIO/USB PB S1 on EVB
efersko 0:e516bb631931 151 InterruptIn mDot09(PA_11); // GPIO/USB PB S2 on EVB
efersko 0:e516bb631931 152
efersko 0:e516bb631931 153 //DigitalIn mDot11(PA_7); // GPIO/SPI_MOSI
efersko 0:e516bb631931 154
efersko 0:e516bb631931 155 InterruptIn mDot12(PA_0); // GPIO/UART_CTS PRESSURE_INT2 on EVB
efersko 0:e516bb631931 156 DigitalOut mDot13(PC_13,1); // GPIO LCD_C/D
efersko 0:e516bb631931 157 InterruptIn mDot15(PC_1); // GPIO LIGHT_PROX_INT on EVB
efersko 0:e516bb631931 158 InterruptIn mDot16(PA_1); // GPIO/UART_RTS ACCEL_INT2 on EVB
efersko 0:e516bb631931 159 DigitalOut mDot17(PA_4,1); // GPIO/SPI_NCS LCD_CS on EVB
efersko 0:e516bb631931 160
efersko 0:e516bb631931 161 // DigitalIn mDot18(PA_5); // GPIO/SPI_SCK
efersko 0:e516bb631931 162 // DigitalInOut mDot19(PB_0,PIN_INPUT,PullNone,0); // GPIO PushPull LED Low=Red High=Green set MODE=INPUT to turn off
efersko 0:e516bb631931 163 // AnalogIn mDot20(PB_1); // GPIO Current Sense Analog in on EVB
efersko 0:e516bb631931 164
efersko 0:e516bb631931 165 Serial debugUART(PA_9, PA_10); // mDot debug UART
efersko 0:e516bb631931 166 MTSSerial mDotUART(PA_2,PA_3); // mDot external UART mDot02 and mDot03
efersko 0:e516bb631931 167 I2C mDoti2c(PC_9,PA_8); // mDot External I2C mDot6 and mDot7
efersko 0:e516bb631931 168 SPI mDotspi(PA_7,PA_6,PA_5); // mDot external SPI mDot11, mDot4, and mDot18
efersko 0:e516bb631931 169 AnalogIn current_sensor(PB_1); // EVB - GPIO - Current Sensor Analog Input
efersko 0:e516bb631931 170
efersko 0:e516bb631931 171 /* **** replace these values with the proper public or private network settings ****
efersko 0:e516bb631931 172 * config_network_nameand config_network_pass are for private networks.
efersko 0:e516bb631931 173 */
efersko 0:e516bb631931 174
efersko 0:e516bb631931 175 //static std::string config_network_name = "telitlora";
efersko 0:e516bb631931 176 //static std::string config_network_pass = "telitpass";
efersko 0:e516bb631931 177 //static uint8_t config_frequency_sub_band = 7;
efersko 0:e516bb631931 178
efersko 0:e516bb631931 179
efersko 0:e516bb631931 180
efersko 0:e516bb631931 181 static volatile bool timer_irq_triggered = false;
efersko 0:e516bb631931 182 static volatile bool ff_irq_triggered = false;
efersko 0:e516bb631931 183
efersko 0:e516bb631931 184
efersko 0:e516bb631931 185 static std::string config_network_name = "MTCDT-19020718";
efersko 0:e516bb631931 186 static std::string config_network_pass = "MTCDT-19020718";
efersko 0:e516bb631931 187 static uint8_t config_frequency_sub_band = 1;
efersko 0:e516bb631931 188
efersko 0:e516bb631931 189
efersko 0:e516bb631931 190 /*
efersko 0:e516bb631931 191 static std::string config_network_name = "MTCDT-19186804";
efersko 0:e516bb631931 192 static std::string config_network_pass = "MTCDT-19186804";
efersko 0:e516bb631931 193 static uint8_t config_frequency_sub_band = 1;
efersko 0:e516bb631931 194 */
efersko 0:e516bb631931 195
efersko 0:e516bb631931 196 /* config_app_id and config_app_key are for public networks.
efersko 0:e516bb631931 197 static uint8_t app_id[8] = {0x00,0x01,0x02,0x03,0x0A,0x0B,0x0C,0x0D};
efersko 0:e516bb631931 198 std::vector<uint8_t> config_app_id;
efersko 0:e516bb631931 199 static uint8_t app_key[16] = {0x00,0x01,0x02,0x03,0x0A,0x0B,0x0C,0x0D};
efersko 0:e516bb631931 200 std::vector<uint8_t> config_app_key;
efersko 0:e516bb631931 201 */
efersko 0:e516bb631931 202
efersko 0:e516bb631931 203 uint8_t result;
efersko 0:e516bb631931 204 uint8_t data;
efersko 0:e516bb631931 205 uint8_t sf_val = mDot::SF_7;
efersko 0:e516bb631931 206 uint8_t pwr_val = 11; // dBm
efersko 0:e516bb631931 207 uint8_t swp_pwr;
efersko 0:e516bb631931 208 uint8_t swp_sf;
efersko 0:e516bb631931 209
efersko 0:e516bb631931 210 // max size of text string for 6x8 font. Set to 12 if using 8x8 font
efersko 0:e516bb631931 211 char txtstr[17];
efersko 0:e516bb631931 212
efersko 0:e516bb631931 213 int32_t mdot_ret;
efersko 0:e516bb631931 214 int32_t join_delay;
efersko 0:e516bb631931 215
efersko 0:e516bb631931 216 osThreadId mainThreadID;
efersko 0:e516bb631931 217
efersko 0:e516bb631931 218 // flags for push button debounce code
efersko 0:e516bb631931 219 bool pb1_low = false;
efersko 0:e516bb631931 220 bool pb2_low = false;
efersko 0:e516bb631931 221 bool toggle_text = false;
efersko 0:e516bb631931 222 bool sw1_state = false;
efersko 0:e516bb631931 223 bool sw2_state = false;
efersko 0:e516bb631931 224
efersko 0:e516bb631931 225 uint32_t num_whole;
efersko 0:e516bb631931 226 uint16_t num_frac;
efersko 0:e516bb631931 227
efersko 0:e516bb631931 228 uint32_t pressure;
efersko 0:e516bb631931 229 double current;
efersko 0:e516bb631931 230
efersko 0:e516bb631931 231 bool exit_program = false;
efersko 0:e516bb631931 232
efersko 0:e516bb631931 233 //EVB sensor variables
efersko 0:e516bb631931 234 MMA845x_DATA accel_data;
efersko 0:e516bb631931 235 MPL3115A2_DATA baro_data;
efersko 0:e516bb631931 236 uint16_t lux_data;
efersko 0:e516bb631931 237 MMA845x* evbAccel;
efersko 0:e516bb631931 238 MPL3115A2* evbBaro;
efersko 0:e516bb631931 239 ISL29011* evbAmbLight;
efersko 0:e516bb631931 240 NCP5623B* evbBackLight;
efersko 0:e516bb631931 241 DOGS102* evbLCD;
efersko 0:e516bb631931 242
efersko 0:e516bb631931 243 //MEMS sensor variables
efersko 0:e516bb631931 244 X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(I2C_SDA, I2C_SCL, PC_1);
efersko 0:e516bb631931 245 static Ticker ticker;
efersko 0:e516bb631931 246 GyroSensor *memsGyro;
efersko 0:e516bb631931 247 MotionSensor *memsAccel;
efersko 0:e516bb631931 248 MagneticSensor *memsMag;
efersko 0:e516bb631931 249 HumiditySensor *memsHumidity;
efersko 0:e516bb631931 250 PressureSensor *memsPressure;
efersko 0:e516bb631931 251 TempSensor *memsTemp1;
efersko 0:e516bb631931 252 TempSensor *memsTemp2;
efersko 0:e516bb631931 253 unsigned int ret = 0;
efersko 0:e516bb631931 254 char buffer1[32];
efersko 0:e516bb631931 255 char buffer2[32];
efersko 0:e516bb631931 256 char buffer3[32];
efersko 0:e516bb631931 257 char buffer4[32];
efersko 0:e516bb631931 258 float temp_value, humid_value, pressure_value;
efersko 0:e516bb631931 259 int16_t int_temp_value, int_humid_value, int_pressure_value;
efersko 0:e516bb631931 260 int32_t accel_vector[3];
efersko 0:e516bb631931 261 int32_t mag_vector[3];
efersko 0:e516bb631931 262 int32_t gyro_vector[3];
efersko 0:e516bb631931 263
efersko 0:e516bb631931 264 //MDOT-BOX sensor variables
efersko 0:e516bb631931 265 GPSPARSER::latitude lat_data;
efersko 0:e516bb631931 266 GPSPARSER::longitude lng_data;
efersko 0:e516bb631931 267 NCP5623B* led_cont;
efersko 0:e516bb631931 268 MTSSerial gps_serial(XBEE_DOUT, XBEE_DIN, 256, 2048);
efersko 0:e516bb631931 269 GPSPARSER* mdot_gps;
efersko 0:e516bb631931 270 float lat = 0;
efersko 0:e516bb631931 271 float lng = 0;
efersko 0:e516bb631931 272 bool sat_lock = 0;
efersko 0:e516bb631931 273
efersko 0:e516bb631931 274 mDot* mdot_radio;
efersko 0:e516bb631931 275 Mutex mdot_mutex;
efersko 0:e516bb631931 276
efersko 0:e516bb631931 277
efersko 0:e516bb631931 278
efersko 0:e516bb631931 279
efersko 0:e516bb631931 280
efersko 0:e516bb631931 281
efersko 0:e516bb631931 282
efersko 0:e516bb631931 283
efersko 0:e516bb631931 284
efersko 0:e516bb631931 285
efersko 0:e516bb631931 286 convert32 convertl;
efersko 0:e516bb631931 287 convert16 converts;
efersko 0:e516bb631931 288
efersko 0:e516bb631931 289 void pb1ISR(void);
efersko 0:e516bb631931 290 void pb2ISR(void);
efersko 0:e516bb631931 291 void pb1_debounce(void const *args);
efersko 0:e516bb631931 292 void pb2_debounce(void const *args);
efersko 0:e516bb631931 293
efersko 0:e516bb631931 294 MPL3115A2* resetBaro(const MPL3115A2* oldBaro);
efersko 0:e516bb631931 295 void log_error(mDot* dot, const char* msg, int32_t retval);
efersko 0:e516bb631931 296 int32_t sendString(const std::string text);
efersko 0:e516bb631931 297 bool writeValueOrError();
efersko 0:e516bb631931 298
efersko 0:e516bb631931 299 const int FAIL_MAX=15;
efersko 0:e516bb631931 300 int failtime=FAIL_MAX;
efersko 0:e516bb631931 301 int cycle_cnt = 0;
efersko 0:e516bb631931 302
efersko 0:e516bb631931 303 char sensor_text[64];
efersko 0:e516bb631931 304 char lora_temp_string[16];
efersko 0:e516bb631931 305 char lora_alt_string[16];
efersko 0:e516bb631931 306 char lora_press_string[16];
efersko 0:e516bb631931 307 char lora_light_string[16];
efersko 0:e516bb631931 308 char lora_current_string[16];
efersko 0:e516bb631931 309 char lora_humid_string[16];
efersko 0:e516bb631931 310 char lora_lat_string[16];
efersko 0:e516bb631931 311 char lora_lng_string[16];
efersko 0:e516bb631931 312
efersko 0:e516bb631931 313 bool bHasGPS = false;
efersko 0:e516bb631931 314 bool bHasACC = false;
efersko 0:e516bb631931 315 bool bHasLCD = false;
efersko 0:e516bb631931 316
efersko 0:e516bb631931 317 /*** Helper Functions ------------------------------------------------------------ ***/
efersko 0:e516bb631931 318 /* print floats & doubles */
efersko 0:e516bb631931 319 static char *printDouble(char* str, double v, int decimalDigits=2)
efersko 0:e516bb631931 320 {
efersko 0:e516bb631931 321 int i = 1;
efersko 0:e516bb631931 322 int intPart, fractPart;
efersko 0:e516bb631931 323 int len;
efersko 0:e516bb631931 324 char *ptr;
efersko 0:e516bb631931 325
efersko 0:e516bb631931 326 /* prepare decimal digits multiplicator */
efersko 0:e516bb631931 327 for (;decimalDigits!=0; i*=10, decimalDigits--);
efersko 0:e516bb631931 328
efersko 0:e516bb631931 329 /* calculate integer & fractinal parts */
efersko 0:e516bb631931 330 intPart = (int)v;
efersko 0:e516bb631931 331 fractPart = (int)((v-(double)(int)v)*i);
efersko 0:e516bb631931 332
efersko 0:e516bb631931 333 /* fill in integer part */
efersko 0:e516bb631931 334 sprintf(str, "%i.", intPart);
efersko 0:e516bb631931 335
efersko 0:e516bb631931 336 /* prepare fill in of fractional part */
efersko 0:e516bb631931 337 len = strlen(str);
efersko 0:e516bb631931 338 ptr = &str[len];
efersko 0:e516bb631931 339
efersko 0:e516bb631931 340 /* fill in leading fractional zeros */
efersko 0:e516bb631931 341 for (i/=10;i>1; i/=10, ptr++) {
efersko 0:e516bb631931 342 if(fractPart >= i) break;
efersko 0:e516bb631931 343 *ptr = '0';
efersko 0:e516bb631931 344 }
efersko 0:e516bb631931 345
efersko 0:e516bb631931 346 /* fill in (rest of) fractional part */
efersko 0:e516bb631931 347 sprintf(ptr, "%i", fractPart);
efersko 0:e516bb631931 348
efersko 0:e516bb631931 349 return str;
efersko 0:e516bb631931 350 }
efersko 0:e516bb631931 351 /*===================================================================================
efersko 0:e516bb631931 352 Main Program Logic - Entry
efersko 0:e516bb631931 353 ===================================================================================*/
efersko 0:e516bb631931 354 int main()
efersko 0:e516bb631931 355 {
efersko 0:e516bb631931 356 std::vector<uint8_t> mdot_data;
efersko 0:e516bb631931 357 std::vector<uint8_t> mdot_EUI;
efersko 0:e516bb631931 358 uint16_t i = 0;
efersko 0:e516bb631931 359 uint8_t id1 = 0;
efersko 0:e516bb631931 360
efersko 0:e516bb631931 361 debugUART.baud(9600);
efersko 0:e516bb631931 362
efersko 0:e516bb631931 363 printf ("Starting Application...\r\n");
efersko 0:e516bb631931 364
efersko 0:e516bb631931 365 mainThreadID = osThreadGetId();
efersko 0:e516bb631931 366
efersko 0:e516bb631931 367 printf("Begin I2C/SPI Device Initialization...\r\n");
efersko 0:e516bb631931 368
efersko 0:e516bb631931 369
efersko 0:e516bb631931 370 // Use Magnetometer As MEMS sensor shield Enumeration...
efersko 0:e516bb631931 371
efersko 0:e516bb631931 372 memsMag = mems_expansion_board->magnetometer;
efersko 0:e516bb631931 373 CALL_METH(memsMag, ReadID, &id1, 0x0);
efersko 0:e516bb631931 374 printf("Magnetometer ID value = %i \n\r", id1);
efersko 0:e516bb631931 375
efersko 0:e516bb631931 376 //chcek for default magnetomter ID 61...
efersko 0:e516bb631931 377 if(id1 == 61)
efersko 0:e516bb631931 378 {
efersko 0:e516bb631931 379 printf("Magnetometer Found - MEMS sensor shield detected...\r\n");
efersko 0:e516bb631931 380 bHasACC = true;
efersko 0:e516bb631931 381
efersko 0:e516bb631931 382 // Initialize Integrated Sensors...
efersko 0:e516bb631931 383 printf("Instantiate Magnetometer...\r\n");
efersko 0:e516bb631931 384 memsMag = mems_expansion_board->magnetometer;
efersko 0:e516bb631931 385
efersko 0:e516bb631931 386 printf("Instantiate Accelerometer...\r\n");
efersko 0:e516bb631931 387 memsAccel = mems_expansion_board->GetAccelerometer();
efersko 0:e516bb631931 388
efersko 0:e516bb631931 389 printf("Instantiate Gyroscope...\r\n");
efersko 0:e516bb631931 390 memsGyro = mems_expansion_board->GetGyroscope();
efersko 0:e516bb631931 391
efersko 0:e516bb631931 392 printf("Instantiate Barometric Pressure Sensor...\r\n");
efersko 0:e516bb631931 393 memsPressure = mems_expansion_board->pt_sensor;
efersko 0:e516bb631931 394
efersko 0:e516bb631931 395 printf("Instantiate Temperature Pressure Sensor...\r\n");
efersko 0:e516bb631931 396 memsTemp1 = mems_expansion_board->ht_sensor;
efersko 0:e516bb631931 397 memsTemp2 = mems_expansion_board->pt_sensor;
efersko 0:e516bb631931 398
efersko 0:e516bb631931 399 printf("Instantiate Humidity Sensor...\r\n");
efersko 0:e516bb631931 400 memsHumidity = mems_expansion_board->ht_sensor;
efersko 0:e516bb631931 401
efersko 0:e516bb631931 402 }
efersko 0:e516bb631931 403
efersko 0:e516bb631931 404
efersko 0:e516bb631931 405 else
efersko 0:e516bb631931 406 {
efersko 0:e516bb631931 407 printf("No Magnetometer Found...\r\n");
efersko 0:e516bb631931 408 // Use Accelerometer As MDOT-BOX/EVB Enumeration...
efersko 0:e516bb631931 409 printf("Instantiate Accelerometer...\r\n");
efersko 0:e516bb631931 410 evbAccel = new MMA845x(mDoti2c,MMA845x::SA0_VSS);
efersko 0:e516bb631931 411
efersko 0:e516bb631931 412 printf("Accelerometer Status = %d\r\n", evbAccel->getStatus());
efersko 0:e516bb631931 413 printf("Accelerometer who_am_i value = %x \n\r", evbAccel->getWhoAmI());
efersko 0:e516bb631931 414
efersko 0:e516bb631931 415 if( (evbAccel->getStatus() == 1) && (evbAccel->getWhoAmI() == 0) )
efersko 0:e516bb631931 416 {
efersko 0:e516bb631931 417 printf("No Accelerometer Found - Basic mDot, Not MDOT-BOX or EVB...\r\n");
efersko 0:e516bb631931 418 }
efersko 0:e516bb631931 419
efersko 0:e516bb631931 420 else
efersko 0:e516bb631931 421 {
efersko 0:e516bb631931 422 printf("Accelerometer Found - Either MDOT-BOX or EVB...\r\n");
efersko 0:e516bb631931 423 bHasACC = true;
efersko 0:e516bb631931 424
efersko 0:e516bb631931 425 // Initialize Integrated Sensors...
efersko 0:e516bb631931 426 printf("Instantiate Barometric Pressure Sensor...\r\n");
efersko 0:e516bb631931 427 evbBaro = new MPL3115A2(mDoti2c); // Setup Barometric Sensor
efersko 0:e516bb631931 428 printf("Barometric Sensor Status = %d\r\n", evbBaro->getStatus());
efersko 0:e516bb631931 429 printf("Barometer who_am_i check = %d\r\n", evbBaro->testWhoAmI());
efersko 0:e516bb631931 430 printf("Barometer who_am_i check = %s\r\n", evbBaro->testWhoAmI() ? "TRUE" : "FALSE");
efersko 0:e516bb631931 431
efersko 0:e516bb631931 432 if( evbBaro->getStatus() == 0 ) printf("No Barometric Sensor...\r\n");
efersko 0:e516bb631931 433
efersko 0:e516bb631931 434 printf("Instantiate Ambient Light Sensor...\r\n");
efersko 0:e516bb631931 435 evbAmbLight = new ISL29011(mDoti2c); // Setup Ambient Light Sensor
efersko 0:e516bb631931 436
efersko 0:e516bb631931 437 // Setup the Accelerometer for 8g range, 14 bit resolution, Noise reduction off, sample rate 1.56 Hz
efersko 0:e516bb631931 438 // Normal oversample mode, High pass filter off
efersko 0:e516bb631931 439 evbAccel->setCommonParameters(MMA845x::RANGE_8g,MMA845x::RES_MAX,MMA845x::LN_OFF, MMA845x::DR_1_56,MMA845x::OS_NORMAL,MMA845x::HPF_OFF );
efersko 0:e516bb631931 440
efersko 0:e516bb631931 441 // Setup the Barometric sensor for post processed Ambient pressure, 4 samples per data acquisition.
efersko 0:e516bb631931 442 // and a sample taken every second when in active mode
efersko 0:e516bb631931 443 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16, MPL3115A2::AT_1);
efersko 0:e516bb631931 444
efersko 0:e516bb631931 445 // Setup the Ambient Light Sensor for continuous Ambient Light Sensing, 16 bit resolution, and 16000 lux range
efersko 0:e516bb631931 446 evbAmbLight->setMode(ISL29011::ALS_CONT);
efersko 0:e516bb631931 447 evbAmbLight->setResolution(ISL29011::ADC_16BIT);
efersko 0:e516bb631931 448 evbAmbLight->setRange(ISL29011::RNG_16000);
efersko 0:e516bb631931 449
efersko 0:e516bb631931 450 // Set the accelerometer for active mode
efersko 0:e516bb631931 451 evbAccel->activeMode();
efersko 0:e516bb631931 452
efersko 0:e516bb631931 453 // Clear the min-max registers in the Barometric Sensor
efersko 0:e516bb631931 454 evbBaro->clearMinMaxRegs();
efersko 0:e516bb631931 455
efersko 0:e516bb631931 456 // Support Integrated LCD Display
efersko 0:e516bb631931 457 bHasLCD = true;
efersko 0:e516bb631931 458
efersko 0:e516bb631931 459 printf("Instantiate BackLight and LCD Display...\r\n");
efersko 0:e516bb631931 460 evbBackLight = new NCP5623B(mDoti2c); // setup backlight and LED 2 driver chip
efersko 0:e516bb631931 461
efersko 0:e516bb631931 462 evbLCD = new DOGS102(mDotspi, mDot17, mDot13); // setup LCD Display
efersko 0:e516bb631931 463
efersko 0:e516bb631931 464 printf("Font Table Address: %p\r\n",&font_6x8);
efersko 0:e516bb631931 465 printf("Bitmap Logo Address: %p\r\n",&MultiTech_Logo);
efersko 0:e516bb631931 466
efersko 0:e516bb631931 467 // Setup and display logo on LCD
efersko 0:e516bb631931 468 evbLCD->startUpdate();
efersko 0:e516bb631931 469 evbLCD->writeBitmap(0,0,MultiTech_Logo);
efersko 0:e516bb631931 470
efersko 0:e516bb631931 471 sprintf(txtstr,"MTDOT-EVB");
efersko 0:e516bb631931 472 evbLCD->writeText(24,3,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 473 sprintf(txtstr,"Sensor Demo");
efersko 0:e516bb631931 474 evbLCD->writeText(18,4,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 475
efersko 0:e516bb631931 476 evbLCD->endUpdate();
efersko 0:e516bb631931 477
efersko 0:e516bb631931 478 printf("Setup PushButton Interface Handlers...\r\n");
efersko 0:e516bb631931 479
efersko 0:e516bb631931 480 printf("Launching Debounce Threads...\r\n");
efersko 0:e516bb631931 481 Thread thread_1(pb1_debounce);
efersko 0:e516bb631931 482 Thread thread_2(pb2_debounce);
efersko 0:e516bb631931 483 printf("Debounce Threads Launched...\r\n");
efersko 0:e516bb631931 484
efersko 0:e516bb631931 485 printf("Set SW1/SW2 IRQs...\r\n");
efersko 0:e516bb631931 486 // Setup SW1 as Data rate and power out select
efersko 0:e516bb631931 487 mDot08.disable_irq();
efersko 0:e516bb631931 488 mDot08.fall(&pb1ISR);
efersko 0:e516bb631931 489
efersko 0:e516bb631931 490 // need to call this function after rise or fall because rise/fall sets mode to PullNone
efersko 0:e516bb631931 491 mDot08.mode(PullUp);
efersko 0:e516bb631931 492 mDot08.enable_irq();
efersko 0:e516bb631931 493
efersko 0:e516bb631931 494 // Setup SW2 as send PING
efersko 0:e516bb631931 495 mDot09.disable_irq();
efersko 0:e516bb631931 496 mDot09.fall(&pb2ISR);
efersko 0:e516bb631931 497
efersko 0:e516bb631931 498 // need to call this function after rise or fall because rise/fall sets mode to PullNone
efersko 0:e516bb631931 499 mDot09.mode(PullUp);
efersko 0:e516bb631931 500 mDot09.enable_irq();
efersko 0:e516bb631931 501
efersko 0:e516bb631931 502 // Setting other InterruptIn pins with Pull Ups
efersko 0:e516bb631931 503 mDot12.mode(PullUp);
efersko 0:e516bb631931 504 mDot15.mode(PullUp);
efersko 0:e516bb631931 505 mDot16.mode(PullUp);
efersko 0:e516bb631931 506
efersko 0:e516bb631931 507 printf("SW1/SW2 IRQs Set...\r\n");
efersko 0:e516bb631931 508 }
efersko 0:e516bb631931 509 }
efersko 0:e516bb631931 510
efersko 0:e516bb631931 511 printf("I2C/SPI Device Initialization Complete...\r\n");
efersko 0:e516bb631931 512
efersko 0:e516bb631931 513 printf("\r\nSetup mDot Radio Communications...\r\n");
efersko 0:e516bb631931 514
efersko 0:e516bb631931 515 // get a mDot handle
efersko 0:e516bb631931 516 mdot_radio = mDot::getInstance();
efersko 0:e516bb631931 517
efersko 0:e516bb631931 518 if (mdot_radio)
efersko 0:e516bb631931 519 {
efersko 0:e516bb631931 520 // reset to default config so we know what state we're in
efersko 0:e516bb631931 521 mdot_mutex.lock(); // lock mdot before setting configuration
efersko 0:e516bb631931 522 mdot_radio->resetConfig();
efersko 0:e516bb631931 523
efersko 0:e516bb631931 524 // Setting up LED1 as activity LED
efersko 0:e516bb631931 525 mdot_radio->setActivityLedPin(PB_0);
efersko 0:e516bb631931 526 mdot_radio->setActivityLedEnable(true);
efersko 0:e516bb631931 527
efersko 0:e516bb631931 528 // Read node ID
efersko 0:e516bb631931 529 mdot_EUI = mdot_radio->getDeviceId();
efersko 0:e516bb631931 530 printf("mDot EUI = ");
efersko 0:e516bb631931 531
efersko 0:e516bb631931 532 for(i=0; i<mdot_EUI.size(); i++) {
efersko 0:e516bb631931 533 printf("%02x ", mdot_EUI[i]);
efersko 0:e516bb631931 534 }
efersko 0:e516bb631931 535 printf("\r\n");
efersko 0:e516bb631931 536
efersko 0:e516bb631931 537 // Setting up the mDot with network information.
efersko 0:e516bb631931 538
efersko 0:e516bb631931 539 // This call sets up private or public mode on the MTDOT. Set the function to true if
efersko 0:e516bb631931 540 // connecting to a public network
efersko 0:e516bb631931 541 printf("Setting Private Network Mode...\r\n");
efersko 0:e516bb631931 542 if ((mdot_ret = mdot_radio->setPublicNetwork(false)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 543 log_error(mdot_radio, "ERROR: Failed to set Public Network Mode", mdot_ret);
efersko 0:e516bb631931 544 }
efersko 0:e516bb631931 545
efersko 0:e516bb631931 546 // Frequency sub-band is valid for NAM only and for Private networks should be set to a value
efersko 0:e516bb631931 547 // between 1-8 that matches the the LoRa gateway setting. Public networks use sub-band 0 only.
efersko 0:e516bb631931 548 // This function can be commented out for EU networks
efersko 0:e516bb631931 549 printf("Setting Frequency Sub-Band...\r\n");
efersko 0:e516bb631931 550 if ((mdot_ret = mdot_radio->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 551 log_error(mdot_radio, "ERROR: Failed to set Frequency Sub-Band", mdot_ret);
efersko 0:e516bb631931 552 }
efersko 0:e516bb631931 553
efersko 0:e516bb631931 554 // Setting TX power for radio. Max allowed is +14dBm for EU and +20 dBm for NAM. Default is +11 dBm
efersko 0:e516bb631931 555 printf("Setting TX Power Level to %2d dBm...\r\n", pwr_val);
efersko 0:e516bb631931 556 if ((mdot_ret = mdot_radio->setTxPower(pwr_val)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 557 log_error(mdot_radio, "ERROR: Failed to set TX Power Level", mdot_ret);
efersko 0:e516bb631931 558 }
efersko 0:e516bb631931 559
efersko 0:e516bb631931 560 // Setting TX data rate for radio. Max allowed is SF_12 for EU and SF10 dBm for NAM. Default is SF_10
efersko 0:e516bb631931 561 printf("Setting TX data rate to SF_7...\r\n");
efersko 0:e516bb631931 562 if ((mdot_ret = mdot_radio->setTxDataRate(sf_val)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 563 log_error(mdot_radio, "ERROR: Failed to set TX Data Rate", mdot_ret);
efersko 0:e516bb631931 564 }
efersko 0:e516bb631931 565
efersko 0:e516bb631931 566 // Configure Pushbutton Display Labels...
efersko 0:e516bb631931 567 sprintf(txtstr,"SF=%2d PWR=%2d",sf_val,pwr_val);
efersko 0:e516bb631931 568 if( bHasLCD ) evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 569 printf("%s\r\n",txtstr);
efersko 0:e516bb631931 570
efersko 0:e516bb631931 571
efersko 0:e516bb631931 572 // Setting Packet ACK to 1 try.
efersko 0:e516bb631931 573
efersko 0:e516bb631931 574 printf("Setting Packet Retry to 1...\r\n");
efersko 0:e516bb631931 575 if ((mdot_ret = mdot_radio->setAck(1)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 576 log_error(mdot_radio, "ERROR: Failed to set Packet Retry\r\n", mdot_ret);
efersko 0:e516bb631931 577 }
efersko 0:e516bb631931 578
efersko 0:e516bb631931 579
efersko 0:e516bb631931 580 // setNetworkName is used for private networks.
efersko 0:e516bb631931 581 // Use setNetworkID(AppID) for public networks
efersko 0:e516bb631931 582
efersko 0:e516bb631931 583 // config_app_id.assign(app_id,app_id+7);
efersko 0:e516bb631931 584
efersko 0:e516bb631931 585 printf("Setting Network Name...\r\n");
efersko 0:e516bb631931 586 if ((mdot_ret = mdot_radio->setNetworkName(config_network_name)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 587 // if ((mdot_ret = mdot_radio->setNetworkID(config_app_id)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 588 log_error(mdot_radio, "ERROR: Failed to set Network Name", mdot_ret);
efersko 0:e516bb631931 589 }
efersko 0:e516bb631931 590
efersko 0:e516bb631931 591 // setNetworkPassphrase is used for private networks
efersko 0:e516bb631931 592 // Use setNetworkKey for public networks
efersko 0:e516bb631931 593
efersko 0:e516bb631931 594 // config_app_key.assign(app_key,app_key+15);
efersko 0:e516bb631931 595
efersko 0:e516bb631931 596 printf("Setting Network Password...\r\n");
efersko 0:e516bb631931 597 if ((mdot_ret = mdot_radio->setNetworkPassphrase(config_network_pass)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 598 // if ((mdot_ret = mdot_radio->setNetworkKey(config_app_key)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 599 log_error(mdot_radio, "ERROR: Failed to set Network Password", mdot_ret);
efersko 0:e516bb631931 600 }
efersko 0:e516bb631931 601
efersko 0:e516bb631931 602 mdot_mutex.unlock(); // unlock mdot mutex before join attempt so SW1 can work
efersko 0:e516bb631931 603
efersko 0:e516bb631931 604 // attempt to join the network
efersko 0:e516bb631931 605 printf("Joining LoRa Network...\r\n");
efersko 0:e516bb631931 606 do {
efersko 0:e516bb631931 607 mdot_mutex.lock(); // lock mdot mutex before join attempt
efersko 0:e516bb631931 608 mdot_ret = mdot_radio->joinNetwork();
efersko 0:e516bb631931 609 mdot_mutex.unlock(); // unlock mdot mutex after join attempt so SW1 can work
efersko 0:e516bb631931 610
efersko 0:e516bb631931 611 if (mdot_ret != mDot::MDOT_OK)
efersko 0:e516bb631931 612 {
efersko 0:e516bb631931 613 log_error(mdot_radio,"ERROR: Failed to Join Network:", mdot_ret);
efersko 0:e516bb631931 614
efersko 0:e516bb631931 615 if (toggle_text)
efersko 0:e516bb631931 616 sprintf(txtstr," > Join Failed <");
efersko 0:e516bb631931 617 else
efersko 0:e516bb631931 618 sprintf(txtstr," < Join Failed >");
efersko 0:e516bb631931 619
efersko 0:e516bb631931 620 if( bHasLCD ) evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 621
efersko 0:e516bb631931 622 if (mdot_radio->getFrequencyBand() == mDot::FB_868)
efersko 0:e516bb631931 623 {
efersko 0:e516bb631931 624 join_delay = mdot_radio->getNextTxMs();
efersko 0:e516bb631931 625 }
efersko 0:e516bb631931 626 else
efersko 0:e516bb631931 627 {
efersko 0:e516bb631931 628 join_delay = 10;
efersko 0:e516bb631931 629 }
efersko 0:e516bb631931 630 printf("Join Delay = %lu\r\n",join_delay);
efersko 0:e516bb631931 631 osDelay(join_delay + 1);
efersko 0:e516bb631931 632 toggle_text = !toggle_text;
efersko 0:e516bb631931 633 }
efersko 0:e516bb631931 634
efersko 0:e516bb631931 635 /*
efersko 0:e516bb631931 636 * Setting TX power and Data Rate for radio just in case user requested by SW2
efersko 0:e516bb631931 637 */
efersko 0:e516bb631931 638 mdot_mutex.lock(); // lock mdot mutex before setting change
efersko 0:e516bb631931 639 mdot_radio->setTxPower(pwr_val);
efersko 0:e516bb631931 640 mdot_radio->setTxDataRate(sf_val);
efersko 0:e516bb631931 641 mdot_mutex.unlock(); // unlock mdot mutex after settings change so SW1 can work
efersko 0:e516bb631931 642
efersko 0:e516bb631931 643 } while (mdot_ret != mDot::MDOT_OK);
efersko 0:e516bb631931 644
efersko 0:e516bb631931 645 printf("Successfully Joined LoRa Network...\r\n");
efersko 0:e516bb631931 646
efersko 0:e516bb631931 647 sprintf(txtstr,"*Network Joined*");
efersko 0:e516bb631931 648 if( bHasLCD ) evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 649
efersko 0:e516bb631931 650 }
efersko 0:e516bb631931 651 else
efersko 0:e516bb631931 652 {
efersko 0:e516bb631931 653 printf("ERROR: Unable to Join LoRa Network...\r\n");
efersko 0:e516bb631931 654 sprintf(txtstr,"Radio Init Failed!");
efersko 0:e516bb631931 655 if( bHasLCD ) evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 656 printf("%s\r\n",txtstr);
efersko 0:e516bb631931 657 exit(1);
efersko 0:e516bb631931 658 }
efersko 0:e516bb631931 659
efersko 0:e516bb631931 660 // Check for MDOT-BOX Configuration (GPS)
efersko 0:e516bb631931 661
efersko 0:e516bb631931 662 if( bHasACC && bHasLCD )
efersko 0:e516bb631931 663 {
efersko 0:e516bb631931 664 printf("Instantiate GPS...\r\n");
efersko 0:e516bb631931 665 mdot_gps = new GPSPARSER(&gps_serial, led_cont);
efersko 0:e516bb631931 666 osDelay(1000);
efersko 0:e516bb631931 667 if(!mdot_gps->gpsDetected())
efersko 0:e516bb631931 668 {
efersko 0:e516bb631931 669 printf(">>>> No GPS Detected... Not an MDOT-BOX, EVB Identified\r\n");
efersko 0:e516bb631931 670
efersko 0:e516bb631931 671 sprintf(txtstr,"*No GPS Detected*");
efersko 0:e516bb631931 672 if( bHasLCD ) evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 673 }
efersko 0:e516bb631931 674 else
efersko 0:e516bb631931 675 {
efersko 0:e516bb631931 676 // main_single = main_sweep = false;
efersko 0:e516bb631931 677 printf(">>>> GPS Detected... MDOT-BOX Identified\r\n");
efersko 0:e516bb631931 678 sprintf(txtstr,"*GPS Detected*");
efersko 0:e516bb631931 679 if( bHasLCD ) evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 680 bHasGPS = true;
efersko 0:e516bb631931 681 }
efersko 0:e516bb631931 682 }
efersko 0:e516bb631931 683
efersko 0:e516bb631931 684 printf("Initialization/Configuration Completed...\r\n");
efersko 0:e516bb631931 685
efersko 0:e516bb631931 686 osDelay(1500);
efersko 0:e516bb631931 687 if( bHasLCD ) evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
efersko 0:e516bb631931 688
efersko 0:e516bb631931 689 // sets LED2 to 50% max current
efersko 0:e516bb631931 690 if( bHasLCD ) evbBackLight->setLEDCurrent(16);
efersko 0:e516bb631931 691
efersko 0:e516bb631931 692
efersko 0:e516bb631931 693 // Check for PB1 press during network join attempt
efersko 0:e516bb631931 694 /*
efersko 0:e516bb631931 695 if (exit_program)
efersko 0:e516bb631931 696 {
efersko 0:e516bb631931 697 printf("PB1 Pressed, Exiting Program...\r\n");
efersko 0:e516bb631931 698 if( bHasLCD ) evbLCD->clearBuffer();
efersko 0:e516bb631931 699 sprintf(txtstr,"Exiting Program");
efersko 0:e516bb631931 700 if( bHasLCD ) evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 701 exit(1);
efersko 0:e516bb631931 702 }
efersko 0:e516bb631931 703 */
efersko 0:e516bb631931 704
efersko 0:e516bb631931 705 // Enter Main Data Acquisition Loop...
efersko 0:e516bb631931 706 printf("Processing Data Acquisition Scan Loop...\r\n");
efersko 0:e516bb631931 707
efersko 0:e516bb631931 708 i = 0;
efersko 0:e516bb631931 709 cycle_cnt = 100;
efersko 0:e516bb631931 710
efersko 0:e516bb631931 711 if( bHasLCD ) evbLCD->clearBuffer();
efersko 0:e516bb631931 712
efersko 0:e516bb631931 713 do
efersko 0:e516bb631931 714 {
efersko 0:e516bb631931 715 //BOX
efersko 0:e516bb631931 716 if(bHasGPS)
efersko 0:e516bb631931 717 {
efersko 0:e516bb631931 718 //GPS code
efersko 0:e516bb631931 719 if (mdot_gps->getLockStatus())
efersko 0:e516bb631931 720 {
efersko 0:e516bb631931 721
efersko 0:e516bb631931 722 //Retrieve and print out Latitude data
efersko 0:e516bb631931 723 lat_data = mdot_gps->getLatitude();
efersko 0:e516bb631931 724 sat_lock = 1;
efersko 0:e516bb631931 725 //Conversion from DMS to decimal
efersko 0:e516bb631931 726 if(lat_data.degrees>0)
efersko 0:e516bb631931 727 {
efersko 0:e516bb631931 728 lat = (lat_data.degrees + lat_data.minutes/60.0 + lat_data.seconds/600000.0);
efersko 0:e516bb631931 729 }
efersko 0:e516bb631931 730 else
efersko 0:e516bb631931 731 {
efersko 0:e516bb631931 732 lat = (lat_data.degrees - lat_data.minutes/60.0 - lat_data.seconds/600000.0);
efersko 0:e516bb631931 733 }
efersko 0:e516bb631931 734 sprintf(txtstr, "Lat = %.7f",lat);
efersko 0:e516bb631931 735 sprintf(lora_lat_string,"%.7f",lat);
efersko 0:e516bb631931 736 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 737
efersko 0:e516bb631931 738 //Retrieve and print out Longitude data
efersko 0:e516bb631931 739 lng_data = mdot_gps->getLongitude();
efersko 0:e516bb631931 740 //Conversion from DMS to decimal
efersko 0:e516bb631931 741 if(lng_data.degrees>0)
efersko 0:e516bb631931 742 {
efersko 0:e516bb631931 743 lng = (lng_data.degrees + lng_data.minutes/60.0 + lng_data.seconds/600000.0);
efersko 0:e516bb631931 744 }
efersko 0:e516bb631931 745 else
efersko 0:e516bb631931 746 {
efersko 0:e516bb631931 747 lng = (lng_data.degrees - lng_data.minutes/60.0 - lng_data.seconds/600000.0);
efersko 0:e516bb631931 748 }
efersko 0:e516bb631931 749 sprintf(txtstr, "Lng = %.7f",lng);
efersko 0:e516bb631931 750 sprintf(lora_lng_string,"%.7f",lng);
efersko 0:e516bb631931 751 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 752 }
efersko 0:e516bb631931 753 else
efersko 0:e516bb631931 754 {
efersko 0:e516bb631931 755 //reset sat_lock, lat, and lng while device doesn't have lock
efersko 0:e516bb631931 756 sprintf(txtstr," > no GPS lock < ");
efersko 0:e516bb631931 757 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 758 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 759 printf("%s \r\n",txtstr);
efersko 0:e516bb631931 760 sat_lock = 0;
efersko 0:e516bb631931 761 lat = 0;
efersko 0:e516bb631931 762 lng = 0;
efersko 0:e516bb631931 763 sprintf(lora_lat_string, "%f",lat);
efersko 0:e516bb631931 764 sprintf(lora_lng_string, "%f",lng);
efersko 0:e516bb631931 765
efersko 0:e516bb631931 766
efersko 0:e516bb631931 767 }
efersko 0:e516bb631931 768
efersko 0:e516bb631931 769 // Check Accelerometer XYZ data ready bit to see if acquisition complete
efersko 0:e516bb631931 770 failtime = FAIL_MAX;
efersko 0:e516bb631931 771 do
efersko 0:e516bb631931 772 {
efersko 0:e516bb631931 773 osDelay(100); // allows other threads to process
efersko 0:e516bb631931 774 result = evbAccel->getStatus();
efersko 0:e516bb631931 775 failtime--;
efersko 0:e516bb631931 776 } while ((result & MMA845x::XYZDR) == 0 && failtime > 0);
efersko 0:e516bb631931 777
efersko 0:e516bb631931 778 if (failtime==0)
efersko 0:e516bb631931 779 {
efersko 0:e516bb631931 780 evbBaro=resetBaro(evbBaro);
efersko 0:e516bb631931 781 continue;
efersko 0:e516bb631931 782 }
efersko 0:e516bb631931 783
efersko 0:e516bb631931 784 // Retrieve and print out accelerometer data
efersko 0:e516bb631931 785
efersko 0:e516bb631931 786 accel_data = evbAccel->getXYZ();
efersko 0:e516bb631931 787 sprintf(txtstr, "Accel-X = %d", accel_data._x);
efersko 0:e516bb631931 788 evbLCD->writeText(0,0,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 789 sprintf(txtstr, "Accel-Y = %d", accel_data._y);
efersko 0:e516bb631931 790 evbLCD->writeText(0,1,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 791 sprintf(txtstr, "Accel-Z = %d", accel_data._z );
efersko 0:e516bb631931 792 evbLCD->writeText(0,2,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 793
efersko 0:e516bb631931 794 // Trigger a Barometric Pressure Reading
efersko 0:e516bb631931 795 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16, MPL3115A2::AT_1);
efersko 0:e516bb631931 796 evbBaro->triggerOneShot();
efersko 0:e516bb631931 797
efersko 0:e516bb631931 798 // Test Barometer Device, Check to see if acquisition is complete
efersko 0:e516bb631931 799 failtime=FAIL_MAX;
efersko 0:e516bb631931 800 do
efersko 0:e516bb631931 801 {
efersko 0:e516bb631931 802 osDelay(100); // allows other threads to process
efersko 0:e516bb631931 803 result = evbBaro->getStatus();
efersko 0:e516bb631931 804 failtime--;
efersko 0:e516bb631931 805 } while ((result & MPL3115A2::PTDR) == 0 && failtime > 0 );
efersko 0:e516bb631931 806
efersko 0:e516bb631931 807 if(failtime==0)
efersko 0:e516bb631931 808 {
efersko 0:e516bb631931 809 evbBaro=resetBaro(evbBaro);
efersko 0:e516bb631931 810 continue;
efersko 0:e516bb631931 811 }
efersko 0:e516bb631931 812
efersko 0:e516bb631931 813 // Retrieve and Display Barometric Pressure
efersko 0:e516bb631931 814 pressure = evbBaro->getBaroData() >> 12; // convert 32 bit signed to 20 bit unsigned value
efersko 0:e516bb631931 815 num_whole = pressure >> 2; // 18 bit integer significant
efersko 0:e516bb631931 816 num_frac = (pressure & 0x3) * 25; // 2 bit fractional 0.25 per bit
efersko 0:e516bb631931 817
efersko 0:e516bb631931 818 // If failtime reached 0 , indicates that the result might be junk.
efersko 0:e516bb631931 819 sprintf(txtstr,"Press=%ld.%01d Pa", num_whole, num_frac/10);
efersko 0:e516bb631931 820
efersko 0:e516bb631931 821 pressure = evbBaro->getBaroData() >> 12; // convert 32 bit signed to 20 bit unsigned value
efersko 0:e516bb631931 822 num_whole = pressure >> 2; // 18 bit integer significant
efersko 0:e516bb631931 823 num_frac = (pressure & 0x3) * 25; // 2 bit fractional 0.25 per bit
efersko 0:e516bb631931 824
efersko 0:e516bb631931 825 writeValueOrError(); // will write to lorapresstring and txtstr
efersko 0:e516bb631931 826
efersko 0:e516bb631931 827 // Trigger a Altitude reading
efersko 0:e516bb631931 828 // evbBaro->setAltitudeCalib(101);
efersko 0:e516bb631931 829 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_ALTIMETER, MPL3115A2::OR_16, MPL3115A2::AT_1);
efersko 0:e516bb631931 830 // evbBaro->setAltitudeCalib(101);
efersko 0:e516bb631931 831 evbBaro->triggerOneShot();
efersko 0:e516bb631931 832
efersko 0:e516bb631931 833 // Test barometer device status to see if acquisition is complete
efersko 0:e516bb631931 834 failtime=FAIL_MAX;
efersko 0:e516bb631931 835 do
efersko 0:e516bb631931 836 {
efersko 0:e516bb631931 837 osDelay(100); // allows other threads to process
efersko 0:e516bb631931 838 result = evbBaro->getStatus();
efersko 0:e516bb631931 839 failtime--;
efersko 0:e516bb631931 840 } while ((result & MPL3115A2::PTDR) == 0 && failtime > 0 );
efersko 0:e516bb631931 841
efersko 0:e516bb631931 842 if (failtime==0)
efersko 0:e516bb631931 843 {
efersko 0:e516bb631931 844 evbBaro=resetBaro(evbBaro);
efersko 0:e516bb631931 845 continue;
efersko 0:e516bb631931 846 }
efersko 0:e516bb631931 847
efersko 0:e516bb631931 848 // Retrieve and Display Altimeter Reading
efersko 0:e516bb631931 849 baro_data = evbBaro->getAllData(false);
efersko 0:e516bb631931 850 baro_data._baro /= 4096; // convert 32 bit signed to 20 bit signed value
efersko 0:e516bb631931 851 num_whole = baro_data._baro / 16; // 18 bit signed significant integer (JEK Added 60 as SWAG Offset for Boca)
efersko 0:e516bb631931 852 num_frac = (baro_data._baro & 0xF) * 625 / 100; // 4 bit fractional .0625 per bit
efersko 0:e516bb631931 853 sprintf(txtstr,"Alti=%ld.%03d m", num_whole, num_frac);
efersko 0:e516bb631931 854 sprintf(lora_alt_string,"%ld.%03d", num_whole, num_frac);
efersko 0:e516bb631931 855 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 856
efersko 0:e516bb631931 857 // Retrieve and Display Temperature Reading
efersko 0:e516bb631931 858 num_whole = baro_data._temp / 16; // 8 bit signed significant integer
efersko 0:e516bb631931 859 num_frac = (baro_data._temp & 0x0F) * 625 / 100; // 4 bit fractional .0625 per bit
efersko 0:e516bb631931 860 sprintf(txtstr,"Temp=%ld.%03d C", num_whole, num_frac);
efersko 0:e516bb631931 861 sprintf(lora_temp_string,"%ld.%03d", num_whole, num_frac);
efersko 0:e516bb631931 862 //evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 863
efersko 0:e516bb631931 864 // Retrieve and Display Ambient Light Level
efersko 0:e516bb631931 865 lux_data = evbAmbLight->getData();
efersko 0:e516bb631931 866 num_whole = lux_data * 24 / 100; // 16000 lux full scale .24 lux per bit
efersko 0:e516bb631931 867 num_frac = lux_data * 24 % 100;
efersko 0:e516bb631931 868 sprintf(txtstr, "Light=%ld.%02d lux", num_whole, num_frac );
efersko 0:e516bb631931 869 sprintf(lora_light_string, "%ld.%02d", num_whole, num_frac );
efersko 0:e516bb631931 870 //evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 871
efersko 0:e516bb631931 872 // Retrieve and Display Current Sensor Level (EVB Analog Input)
efersko 0:e516bb631931 873 current = (double) current_sensor * 65535.0;
efersko 0:e516bb631931 874 sprintf(lora_current_string, "%d", (int) current);
efersko 0:e516bb631931 875
efersko 0:e516bb631931 876 // Handle Pushbutton #1 (SW1) - This should be handled by the 'pb1_debounce' thread.
efersko 0:e516bb631931 877 if( pb1_low )
efersko 0:e516bb631931 878 {
efersko 0:e516bb631931 879 sw1_state = !sw1_state;
efersko 0:e516bb631931 880 if( bHasLCD ) evbBackLight->setPWM(NCP5623B::LED_3,0); // enable LED2 on EVB and set to 0% PWM
efersko 0:e516bb631931 881
efersko 0:e516bb631931 882 sprintf(txtstr,"PB1 Press-SW1: %d", sw1_state);
efersko 0:e516bb631931 883 if( bHasLCD ) evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 884 printf("%s \r\n",txtstr);
efersko 0:e516bb631931 885
efersko 0:e516bb631931 886 pb1_low = false;
efersko 0:e516bb631931 887 }
efersko 0:e516bb631931 888
efersko 0:e516bb631931 889 // Handle Pushbutton #2 (SW2) - This should be handled by the 'pb2_debounce' thread.
efersko 0:e516bb631931 890 if( pb2_low )
efersko 0:e516bb631931 891 {
efersko 0:e516bb631931 892 sw2_state = !sw2_state;
efersko 0:e516bb631931 893 if( bHasLCD ) evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
efersko 0:e516bb631931 894
efersko 0:e516bb631931 895 sprintf(txtstr,"PB2 Press-SW2: %d", sw2_state);
efersko 0:e516bb631931 896 if( bHasLCD ) evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 897 printf("%s \r\n",txtstr);
efersko 0:e516bb631931 898
efersko 0:e516bb631931 899 pb2_low = false;
efersko 0:e516bb631931 900 }
efersko 0:e516bb631931 901 }
efersko 0:e516bb631931 902
efersko 0:e516bb631931 903 //EVB
efersko 0:e516bb631931 904 else if( bHasACC && bHasLCD )
efersko 0:e516bb631931 905 {
efersko 0:e516bb631931 906 // Check Accelerometer XYZ data ready bit to see if acquisition complete
efersko 0:e516bb631931 907 failtime = FAIL_MAX;
efersko 0:e516bb631931 908 do
efersko 0:e516bb631931 909 {
efersko 0:e516bb631931 910 osDelay(100); // allows other threads to process
efersko 0:e516bb631931 911 result = evbAccel->getStatus();
efersko 0:e516bb631931 912 failtime--;
efersko 0:e516bb631931 913 } while ((result & MMA845x::XYZDR) == 0 && failtime > 0);
efersko 0:e516bb631931 914
efersko 0:e516bb631931 915 if (failtime==0)
efersko 0:e516bb631931 916 {
efersko 0:e516bb631931 917 evbBaro=resetBaro(evbBaro);
efersko 0:e516bb631931 918 continue;
efersko 0:e516bb631931 919 }
efersko 0:e516bb631931 920
efersko 0:e516bb631931 921 // Retrieve and print out accelerometer data
efersko 0:e516bb631931 922 accel_data = evbAccel->getXYZ();
efersko 0:e516bb631931 923 sprintf(txtstr, "Accel-X = %d", accel_data._x);
efersko 0:e516bb631931 924 evbLCD->writeText(0,0,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 925 sprintf(txtstr, "Accel-Y = %d", accel_data._y);
efersko 0:e516bb631931 926 evbLCD->writeText(0,1,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 927 sprintf(txtstr, "Accel-Z = %d", accel_data._z );
efersko 0:e516bb631931 928 evbLCD->writeText(0,2,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 929
efersko 0:e516bb631931 930 // Trigger a Barometric Pressure Reading
efersko 0:e516bb631931 931 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16, MPL3115A2::AT_1);
efersko 0:e516bb631931 932 evbBaro->triggerOneShot();
efersko 0:e516bb631931 933
efersko 0:e516bb631931 934 // Test Barometer Device, Check to see if acquisition is complete
efersko 0:e516bb631931 935 failtime=FAIL_MAX;
efersko 0:e516bb631931 936 do
efersko 0:e516bb631931 937 {
efersko 0:e516bb631931 938 osDelay(100); // allows other threads to process
efersko 0:e516bb631931 939 result = evbBaro->getStatus();
efersko 0:e516bb631931 940 failtime--;
efersko 0:e516bb631931 941 } while ((result & MPL3115A2::PTDR) == 0 && failtime > 0 );
efersko 0:e516bb631931 942
efersko 0:e516bb631931 943 if(failtime==0)
efersko 0:e516bb631931 944 {
efersko 0:e516bb631931 945 evbBaro=resetBaro(evbBaro);
efersko 0:e516bb631931 946 continue;
efersko 0:e516bb631931 947 }
efersko 0:e516bb631931 948
efersko 0:e516bb631931 949 // Retrieve and Display Barometric Pressure
efersko 0:e516bb631931 950 pressure = evbBaro->getBaroData() >> 12; // convert 32 bit signed to 20 bit unsigned value
efersko 0:e516bb631931 951 num_whole = pressure >> 2; // 18 bit integer significant
efersko 0:e516bb631931 952 num_frac = (pressure & 0x3) * 25; // 2 bit fractional 0.25 per bit
efersko 0:e516bb631931 953
efersko 0:e516bb631931 954 // If failtime reached 0 , indicates that the result might be junk.
efersko 0:e516bb631931 955 sprintf(txtstr,"Press=%ld.%01d Pa", num_whole, num_frac/10);
efersko 0:e516bb631931 956
efersko 0:e516bb631931 957 pressure = evbBaro->getBaroData() >> 12; // convert 32 bit signed to 20 bit unsigned value
efersko 0:e516bb631931 958 num_whole = pressure >> 2; // 18 bit integer significant
efersko 0:e516bb631931 959 num_frac = (pressure & 0x3) * 25; // 2 bit fractional 0.25 per bit
efersko 0:e516bb631931 960
efersko 0:e516bb631931 961 writeValueOrError(); // will write to lorapresstring and txtstr
efersko 0:e516bb631931 962
efersko 0:e516bb631931 963 // Trigger an Altitude reading
efersko 0:e516bb631931 964 // evbBaro->setAltitudeCalib(101);
efersko 0:e516bb631931 965 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_ALTIMETER, MPL3115A2::OR_16, MPL3115A2::AT_1);
efersko 0:e516bb631931 966 // evbBaro->setAltitudeCalib(101);
efersko 0:e516bb631931 967 evbBaro->triggerOneShot();
efersko 0:e516bb631931 968
efersko 0:e516bb631931 969 // Test barometer device status to see if acquisition is complete
efersko 0:e516bb631931 970 failtime=FAIL_MAX;
efersko 0:e516bb631931 971 do
efersko 0:e516bb631931 972 {
efersko 0:e516bb631931 973 osDelay(100); // allows other threads to process
efersko 0:e516bb631931 974 result = evbBaro->getStatus();
efersko 0:e516bb631931 975 failtime--;
efersko 0:e516bb631931 976 } while ((result & MPL3115A2::PTDR) == 0 && failtime > 0 );
efersko 0:e516bb631931 977
efersko 0:e516bb631931 978 if (failtime==0)
efersko 0:e516bb631931 979 {
efersko 0:e516bb631931 980 evbBaro=resetBaro(evbBaro);
efersko 0:e516bb631931 981 continue;
efersko 0:e516bb631931 982 }
efersko 0:e516bb631931 983
efersko 0:e516bb631931 984 // Retrieve and Display Altimeter Reading
efersko 0:e516bb631931 985 baro_data = evbBaro->getAllData(false);
efersko 0:e516bb631931 986 baro_data._baro /= 4096; // convert 32 bit signed to 20 bit signed value
efersko 0:e516bb631931 987 num_whole = baro_data._baro / 16; // 18 bit signed significant integer (JEK Added 60 as SWAG Offset for Boca)
efersko 0:e516bb631931 988 num_frac = (baro_data._baro & 0xF) * 625 / 100; // 4 bit fractional .0625 per bit
efersko 0:e516bb631931 989 sprintf(txtstr,"Alti=%ld.%03d m", num_whole, num_frac);
efersko 0:e516bb631931 990 sprintf(lora_alt_string,"%ld.%03d", num_whole, num_frac);
efersko 0:e516bb631931 991 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 992
efersko 0:e516bb631931 993 // Retrieve and Display Temperature Reading
efersko 0:e516bb631931 994 num_whole = baro_data._temp / 16; // 8 bit signed significant integer
efersko 0:e516bb631931 995 num_frac = (baro_data._temp & 0x0F) * 625 / 100; // 4 bit fractional .0625 per bit
efersko 0:e516bb631931 996 sprintf(txtstr,"Temp=%ld.%03d C", num_whole, num_frac);
efersko 0:e516bb631931 997 sprintf(lora_temp_string,"%ld.%03d", num_whole, num_frac);
efersko 0:e516bb631931 998 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 999
efersko 0:e516bb631931 1000 // Retrieve and Display Ambient Light Level
efersko 0:e516bb631931 1001 lux_data = evbAmbLight->getData();
efersko 0:e516bb631931 1002 num_whole = lux_data * 24 / 100; // 16000 lux full scale .24 lux per bit
efersko 0:e516bb631931 1003 num_frac = lux_data * 24 % 100;
efersko 0:e516bb631931 1004 sprintf(txtstr, "Light=%ld.%02d lux", num_whole, num_frac );
efersko 0:e516bb631931 1005 sprintf(lora_light_string, "%ld.%02d", num_whole, num_frac );
efersko 0:e516bb631931 1006 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 1007
efersko 0:e516bb631931 1008 // Retrieve and Display Current Sensor Level (EVB Analog Input)
efersko 0:e516bb631931 1009 current = (double) current_sensor * 65535.0;
efersko 0:e516bb631931 1010 sprintf(lora_current_string, "%d", (int) current);
efersko 0:e516bb631931 1011
efersko 0:e516bb631931 1012 // Handle Pushbutton #1 (SW1) - This should be handled by the 'pb1_debounce' thread.
efersko 0:e516bb631931 1013 if( pb1_low )
efersko 0:e516bb631931 1014 {
efersko 0:e516bb631931 1015 sw1_state = !sw1_state;
efersko 0:e516bb631931 1016 if( bHasLCD ) evbBackLight->setPWM(NCP5623B::LED_3,0); // enable LED2 on EVB and set to 0% PWM
efersko 0:e516bb631931 1017
efersko 0:e516bb631931 1018 sprintf(txtstr,"PB1 Press-SW1: %d", sw1_state);
efersko 0:e516bb631931 1019 if( bHasLCD ) evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 1020 printf("%s \r\n",txtstr);
efersko 0:e516bb631931 1021
efersko 0:e516bb631931 1022 pb1_low = false;
efersko 0:e516bb631931 1023 }
efersko 0:e516bb631931 1024
efersko 0:e516bb631931 1025 // Handle Pushbutton #2 (SW2) - This should be handled by the 'pb2_debounce' thread.
efersko 0:e516bb631931 1026 if( pb2_low )
efersko 0:e516bb631931 1027 {
efersko 0:e516bb631931 1028 sw2_state = !sw2_state;
efersko 0:e516bb631931 1029 if( bHasLCD ) evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
efersko 0:e516bb631931 1030
efersko 0:e516bb631931 1031 sprintf(txtstr,"PB2 Press-SW2: %d", sw2_state);
efersko 0:e516bb631931 1032 if( bHasLCD ) evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 1033 printf("%s \r\n",txtstr);
efersko 0:e516bb631931 1034
efersko 0:e516bb631931 1035 pb2_low = false;
efersko 0:e516bb631931 1036 }
efersko 0:e516bb631931 1037 }
efersko 0:e516bb631931 1038 //MEMS
efersko 0:e516bb631931 1039 else if(!bHasLCD && bHasACC)
efersko 0:e516bb631931 1040 {
efersko 0:e516bb631931 1041
efersko 0:e516bb631931 1042 std::vector<uint8_t> tx_data;
efersko 0:e516bb631931 1043
efersko 0:e516bb631931 1044
efersko 0:e516bb631931 1045 // Payload structure for mydevices cayenne:
efersko 0:e516bb631931 1046 // 1 byte Data1 ID
efersko 0:e516bb631931 1047 // 1 Byte Data1 Type
efersko 0:e516bb631931 1048 // N Bytes Data1
efersko 0:e516bb631931 1049 // 1 byte data 2 ID
efersko 0:e516bb631931 1050 // 1 byte data 2 type
efersko 0:e516bb631931 1051 // n Bytes data 2
efersko 0:e516bb631931 1052 // ...
efersko 0:e516bb631931 1053
efersko 0:e516bb631931 1054 // formats:
efersko 0:e516bb631931 1055 // Temperature sensor:
efersko 0:e516bb631931 1056 /*
efersko 0:e516bb631931 1057 * IPSO: 3303
efersko 0:e516bb631931 1058 * LPP 103
efersko 0:e516bb631931 1059 * HEX: 67
efersko 0:e516bb631931 1060 * Data size: 2
efersko 0:e516bb631931 1061 * Resolution: 0.1 degres C
efersko 0:e516bb631931 1062
efersko 0:e516bb631931 1063 * Humidity sensor
efersko 0:e516bb631931 1064 * IPSO: 3304
efersko 0:e516bb631931 1065 * LPP: 104
efersko 0:e516bb631931 1066 * Hex: 68
efersko 0:e516bb631931 1067 * Datasize: 1
efersko 0:e516bb631931 1068 * Resolution: 0.5% unsigned
efersko 0:e516bb631931 1069
efersko 0:e516bb631931 1070 * Barometer/pressure sensor
efersko 0:e516bb631931 1071 * IPSO: 3315
efersko 0:e516bb631931 1072 * LPP: 115
efersko 0:e516bb631931 1073 * Hex: 73
efersko 0:e516bb631931 1074 * Datasize: 2
efersko 0:e516bb631931 1075 * Resolution 0.1hPa unsigned MSB
efersko 0:e516bb631931 1076
efersko 0:e516bb631931 1077 * Accelerometer
efersko 0:e516bb631931 1078 * IPSO: 3313
efersko 0:e516bb631931 1079 * LPP: 113
efersko 0:e516bb631931 1080 * Hex: 71
efersko 0:e516bb631931 1081 * Data size: 6
efersko 0:e516bb631931 1082 * Resolution: 0.001G signed MSB per axis
efersko 0:e516bb631931 1083
efersko 0:e516bb631931 1084 * Gyrometer
efersko 0:e516bb631931 1085 * IPSO: 3334
efersko 0:e516bb631931 1086 * LPP: 134
efersko 0:e516bb631931 1087 * Hex: 86
efersko 0:e516bb631931 1088 * Data size: 6
efersko 0:e516bb631931 1089 * Resolution: 0.01 degrees/s signed msb per axis
efersko 0:e516bb631931 1090 */
efersko 0:e516bb631931 1091
efersko 0:e516bb631931 1092 // HTS221 Humidity sensor
efersko 0:e516bb631931 1093 ret |= (!CALL_METH(memsTemp1, GetTemperature, &temp_value, 0.0f) ? 0x0 : 0x1);
efersko 0:e516bb631931 1094 ret |= (!CALL_METH(memsHumidity, GetHumidity, &humid_value, 0.0f) ? 0x0 : 0x2);;
efersko 0:e516bb631931 1095
efersko 0:e516bb631931 1096 /*
efersko 0:e516bb631931 1097 //serialize data and append to packet
efersko 0:e516bb631931 1098 // Cayenne data: temperature; tag is 0x67, 2 bytes signed, 0.1 C/bit
efersko 0:e516bb631931 1099 tx_data.push_back(uint8_t(1)); // data id
efersko 0:e516bb631931 1100 tx_data.push_back(uint8_t(0x67)); // data type - temp
efersko 0:e516bb631931 1101 int_temp_value = floor(temp_value*10 + 0.5f);
efersko 0:e516bb631931 1102 tx_data.push_back(uint8_t( 0xFF & (int_temp_value >> 8)));
efersko 0:e516bb631931 1103 tx_data.push_back(uint8_t(0xFF & int_temp_value));
efersko 0:e516bb631931 1104
efersko 0:e516bb631931 1105
efersko 0:e516bb631931 1106 tx_data.push_back(uint8_t(2)); // data id
efersko 0:e516bb631931 1107 tx_data.push_back(uint8_t(0x68)); // data type - humidity
efersko 0:e516bb631931 1108 int_humid_value = floor(humid_value * 2.0f + 0.5f);
efersko 0:e516bb631931 1109 tx_data.push_back(uint8_t(0xFF & int_humid_value ));
efersko 0:e516bb631931 1110 */
efersko 0:e516bb631931 1111
efersko 0:e516bb631931 1112 ret |= (!CALL_METH(memsPressure, GetPressure, &pressure_value, 0.0f) ? 0x0 : 0x4);;
efersko 0:e516bb631931 1113
efersko 0:e516bb631931 1114 /*
efersko 0:e516bb631931 1115 // pressure is reported in mbar
efersko 0:e516bb631931 1116 // 1mbar = 1 hPa
efersko 0:e516bb631931 1117 int_pressure_value = floor(pressure_value * 100.0f + 0.5f);
efersko 0:e516bb631931 1118
efersko 0:e516bb631931 1119 tx_data.push_back(uint8_t(3)); // data id
efersko 0:e516bb631931 1120 tx_data.push_back(uint8_t(0x73)); // data type - pressure
efersko 0:e516bb631931 1121 int_pressure_value = floor(pressure_value / 0.1f + 0.5f);
efersko 0:e516bb631931 1122 tx_data.push_back(uint8_t(0xFF & (int_pressure_value >> 8)));
efersko 0:e516bb631931 1123 tx_data.push_back(uint8_t(0xFF & int_pressure_value));
efersko 0:e516bb631931 1124 */
efersko 0:e516bb631931 1125
efersko 0:e516bb631931 1126 // Get accelerometer data
efersko 0:e516bb631931 1127 // returns in mG
efersko 0:e516bb631931 1128 memsAccel->Get_X_Axes(accel_vector);
efersko 0:e516bb631931 1129
efersko 0:e516bb631931 1130 /*
efersko 0:e516bb631931 1131 tx_data.push_back(uint8_t(4)); // data id
efersko 0:e516bb631931 1132 tx_data.push_back(uint8_t(0x71)); // data type - accelerometer
efersko 0:e516bb631931 1133 for(int i=0; i<3; i++) {
efersko 0:e516bb631931 1134 tx_data.push_back(uint8_t(0xFF & accel_vector[i]) >> 8);
efersko 0:e516bb631931 1135 tx_data.push_back(uint8_t(0xFF & accel_vector[i]));
efersko 0:e516bb631931 1136 }
efersko 0:e516bb631931 1137 */
efersko 0:e516bb631931 1138
efersko 0:e516bb631931 1139 // Get gyro data
efersko 0:e516bb631931 1140 memsGyro->Get_G_Axes(gyro_vector);
efersko 0:e516bb631931 1141
efersko 0:e516bb631931 1142 /*
efersko 0:e516bb631931 1143 tx_data.push_back(uint8_t(5)); //data id
efersko 0:e516bb631931 1144 tx_data.push_back(uint8_t(0x86)); // data type - gyrometer
efersko 0:e516bb631931 1145 for(int i=0; i<3; i++) {
efersko 0:e516bb631931 1146 gyro_vector[i] /= 10;
efersko 0:e516bb631931 1147 tx_data.push_back(uint8_t(0xFF & (gyro_vector[i] >> 8)));
efersko 0:e516bb631931 1148 tx_data.push_back(uint8_t(0xFF & gyro_vector[i]));
efersko 0:e516bb631931 1149 }
efersko 0:e516bb631931 1150 */
efersko 0:e516bb631931 1151
efersko 0:e516bb631931 1152 // Get magnetometer data
efersko 0:e516bb631931 1153 memsMag->Get_M_Axes(mag_vector);
efersko 0:e516bb631931 1154
efersko 0:e516bb631931 1155 /*
efersko 0:e516bb631931 1156 tx_data.push_back(uint8_t(5)); //data id
efersko 0:e516bb631931 1157 tx_data.push_back(uint8_t(0x99)); // data type - mangetometer
efersko 0:e516bb631931 1158 for(int i=0; i<3; i++) {
efersko 0:e516bb631931 1159 mag_vector[i] /= 10;
efersko 0:e516bb631931 1160 tx_data.push_back(uint8_t(0xFF & (mag_vector[i] >> 8)));
efersko 0:e516bb631931 1161 tx_data.push_back(uint8_t(0xFF & mag_vector[i]));
efersko 0:e516bb631931 1162 }
efersko 0:e516bb631931 1163 */
efersko 0:e516bb631931 1164
efersko 0:e516bb631931 1165 }
efersko 0:e516bb631931 1166 else
efersko 0:e516bb631931 1167 {
efersko 0:e516bb631931 1168 //Basic mDot... fabricated data
efersko 0:e516bb631931 1169 sprintf(lora_press_string, "%ld.%02d", 101967, 33 );
efersko 0:e516bb631931 1170 sprintf(lora_alt_string, "%ld.%02d", 53, 22 );
efersko 0:e516bb631931 1171 sprintf(lora_temp_string, "%ld.%03d", 22, 123 );
efersko 0:e516bb631931 1172 sprintf(lora_light_string, "%ld.%02d", 399, 62 );
efersko 0:e516bb631931 1173 sprintf(lora_current_string, "%ld.%01d", 88, 62 );
efersko 0:e516bb631931 1174 }
efersko 0:e516bb631931 1175
efersko 0:e516bb631931 1176
efersko 0:e516bb631931 1177 //send_data(tx_data);
efersko 0:e516bb631931 1178
efersko 0:e516bb631931 1179 //---------------------------------------------------------------------------
efersko 0:e516bb631931 1180 // Verbose Text Format: Least Data Payload, Most Human Readible
efersko 0:e516bb631931 1181 //---------------------------------------------------------------------------
efersko 0:e516bb631931 1182
efersko 0:e516bb631931 1183 /*
efersko 0:e516bb631931 1184 if(!bHasLCD && bHasACC)
efersko 0:e516bb631931 1185 {
efersko 0:e516bb631931 1186
efersko 0:e516bb631931 1187 sprintf(sensor_text, "accel-x:%d|accel-y:%d|accel-z:%d|gyro-x:%d|gyro-y:%d|gyro-z:%d|mag-x:%d|mag-y:%d|mag-x:%d|press:%s|temp:%s|humid:%s",
efersko 0:e516bb631931 1188 accel_vector[0],
efersko 0:e516bb631931 1189 accel_vector[1],
efersko 0:e516bb631931 1190 accel_vector[2],
efersko 0:e516bb631931 1191 gyro_vector[0],
efersko 0:e516bb631931 1192 gyro_vector[1],
efersko 0:e516bb631931 1193 gyro_vector[2],
efersko 0:e516bb631931 1194 mag_vector[0],
efersko 0:e516bb631931 1195 mag_vector[1],
efersko 0:e516bb631931 1196 mag_vector[2],
efersko 0:e516bb631931 1197 printDouble(buffer3, pressure_value),
efersko 0:e516bb631931 1198 printDouble(buffer1, temp_value),
efersko 0:e516bb631931 1199 printDouble(buffer2, humid_value));
efersko 0:e516bb631931 1200 }
efersko 0:e516bb631931 1201 else
efersko 0:e516bb631931 1202 {
efersko 0:e516bb631931 1203 sprintf(sensor_text, "accel-x:%d|accel-y:%d|accel-z:%d|press:%s|alti:%s|temp:%s|light:%s|moist:%s",
efersko 0:e516bb631931 1204 accel_data._x,
efersko 0:e516bb631931 1205 accel_data._y,
efersko 0:e516bb631931 1206 accel_data._z,
efersko 0:e516bb631931 1207 lora_press_string,
efersko 0:e516bb631931 1208 lora_alt_string,
efersko 0:e516bb631931 1209 lora_temp_string,
efersko 0:e516bb631931 1210 lora_light_string,
efersko 0:e516bb631931 1211 lora_current_string);
efersko 0:e516bb631931 1212
efersko 0:e516bb631931 1213 }
efersko 0:e516bb631931 1214
efersko 0:e516bb631931 1215
efersko 0:e516bb631931 1216 if ((mdot_ret = sendString((const std::string)sensor_text)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 1217 log_error(mdot_radio, "ERROR: Failed to Send Data", mdot_ret);
efersko 0:e516bb631931 1218 } else {
efersko 0:e516bb631931 1219 printf("Ok, Successfully Sent Data to Gateway...\r\n");
efersko 0:e516bb631931 1220 }
efersko 0:e516bb631931 1221 */
efersko 0:e516bb631931 1222
efersko 0:e516bb631931 1223 //---------------------------------------------------------------------------
efersko 0:e516bb631931 1224 // Byte Vector Format: More Data Payload, Less Human Readible
efersko 0:e516bb631931 1225 //---------------------------------------------------------------------------
efersko 0:e516bb631931 1226
efersko 0:e516bb631931 1227 //MDOT-BOX
efersko 0:e516bb631931 1228 if (bHasGPS) {
efersko 0:e516bb631931 1229 sprintf(sensor_text, "ax:%d,ay:%d,az:%d,ll:%d,la:%s,lg:%s,p:%s,a:%s,t:%s,l:%s,c:%s",
efersko 0:e516bb631931 1230 accel_data._x,
efersko 0:e516bb631931 1231 accel_data._y,
efersko 0:e516bb631931 1232 accel_data._z,
efersko 0:e516bb631931 1233 sat_lock,
efersko 0:e516bb631931 1234 lora_lat_string,
efersko 0:e516bb631931 1235 lora_lng_string,
efersko 0:e516bb631931 1236 lora_press_string,
efersko 0:e516bb631931 1237 lora_alt_string,
efersko 0:e516bb631931 1238 lora_temp_string,
efersko 0:e516bb631931 1239 lora_light_string,
efersko 0:e516bb631931 1240 lora_current_string);
efersko 0:e516bb631931 1241 //EVB
efersko 0:e516bb631931 1242 } else if(bHasLCD && bHasACC) {
efersko 0:e516bb631931 1243 sprintf(sensor_text, "ax:%d,ay:%d,az:%d,p:%s,a:%s,t:%s,l:%s,c:%s",
efersko 0:e516bb631931 1244 accel_data._x,
efersko 0:e516bb631931 1245 accel_data._y,
efersko 0:e516bb631931 1246 accel_data._z,
efersko 0:e516bb631931 1247 lora_press_string,
efersko 0:e516bb631931 1248 lora_alt_string,
efersko 0:e516bb631931 1249 lora_temp_string,
efersko 0:e516bb631931 1250 lora_light_string,
efersko 0:e516bb631931 1251 lora_current_string);
efersko 0:e516bb631931 1252 }
efersko 0:e516bb631931 1253
efersko 0:e516bb631931 1254 //MEMS
efersko 0:e516bb631931 1255 else if(!bHasLCD && bHasACC){
efersko 0:e516bb631931 1256
efersko 0:e516bb631931 1257 sprintf(sensor_text, "ax:%d,ay:%d,az:%d,gx:%d,gy:%d,gz:%d,mx:%d,my:%d,mz:%d,p:%s,t:%s,h:%s",
efersko 0:e516bb631931 1258 accel_vector[0],
efersko 0:e516bb631931 1259 accel_vector[1],
efersko 0:e516bb631931 1260 accel_vector[2],
efersko 0:e516bb631931 1261 gyro_vector[0],
efersko 0:e516bb631931 1262 gyro_vector[1],
efersko 0:e516bb631931 1263 gyro_vector[2],
efersko 0:e516bb631931 1264 mag_vector[0],
efersko 0:e516bb631931 1265 mag_vector[1],
efersko 0:e516bb631931 1266 mag_vector[2],
efersko 0:e516bb631931 1267 printDouble(buffer3, pressure_value),
efersko 0:e516bb631931 1268 printDouble(buffer1, temp_value),
efersko 0:e516bb631931 1269 printDouble(buffer2, humid_value));
efersko 0:e516bb631931 1270 }
efersko 0:e516bb631931 1271
efersko 0:e516bb631931 1272 //Basic mDot
efersko 0:e516bb631931 1273 else{
efersko 0:e516bb631931 1274
efersko 0:e516bb631931 1275 sprintf(sensor_text, "p:%s,a:%s,t:%s,l:%s,c:%s",
efersko 0:e516bb631931 1276 lora_press_string,
efersko 0:e516bb631931 1277 lora_alt_string,
efersko 0:e516bb631931 1278 lora_temp_string,
efersko 0:e516bb631931 1279 lora_light_string,
efersko 0:e516bb631931 1280 lora_current_string);
efersko 0:e516bb631931 1281 }
efersko 0:e516bb631931 1282
efersko 0:e516bb631931 1283 if ((mdot_ret = sendString((const std::string)sensor_text)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 1284 log_error(mdot_radio, "ERROR: Failed to Send Data", mdot_ret);
efersko 0:e516bb631931 1285 } else {
efersko 0:e516bb631931 1286 printf("Ok, Successfully Sent Data to Gateway...\r\n");
efersko 0:e516bb631931 1287 }
efersko 0:e516bb631931 1288
efersko 0:e516bb631931 1289 /*
efersko 0:e516bb631931 1290 //---------------------------------------------------------------------------
efersko 0:e516bb631931 1291 // Binary Encoded Format: Most Data Payload, Not Human Readible
efersko 0:e516bb631931 1292 //---------------------------------------------------------------------------
efersko 0:e516bb631931 1293 mdot_data.clear();
efersko 0:e516bb631931 1294 mdot_data.push_back(0x0E); // key for Current Acceleration 3-Axis Value
efersko 0:e516bb631931 1295 converts.f_s = accel_data._x *4; // shift data 2 bits while retaining sign
efersko 0:e516bb631931 1296 mdot_data.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
efersko 0:e516bb631931 1297 converts.f_s = accel_data._y * 4; // shift data 2 bits while retaining sign
efersko 0:e516bb631931 1298 mdot_data.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
efersko 0:e516bb631931 1299 converts.f_s = accel_data._z * 4; // shift data 2 bits while retaining sign
efersko 0:e516bb631931 1300 mdot_data.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
efersko 0:e516bb631931 1301 mdot_data.push_back(0x08); // key for Current Pressure Value
efersko 0:e516bb631931 1302 convertl.f_u = pressure; // pressure data is 20 bits unsigned
efersko 0:e516bb631931 1303 mdot_data.push_back(convertl.t_u[2]);
efersko 0:e516bb631931 1304 mdot_data.push_back(convertl.t_u[1]);
efersko 0:e516bb631931 1305 mdot_data.push_back(convertl.t_u[0]);
efersko 0:e516bb631931 1306 mdot_data.push_back(0x05); // key for Current Ambient Light Value
efersko 0:e516bb631931 1307 converts.f_u = lux_data; // data is 16 bits unsigned
efersko 0:e516bb631931 1308 mdot_data.push_back(converts.t_u[1]);
efersko 0:e516bb631931 1309 mdot_data.push_back(converts.t_u[0]);
efersko 0:e516bb631931 1310 mdot_data.push_back(0x0B); // key for Current Temperature Value
efersko 0:e516bb631931 1311 converts.f_s = baro_data._temp; // temperature is signed 12 bit
efersko 0:e516bb631931 1312 mdot_data.push_back(converts.t_u[1]);
efersko 0:e516bb631931 1313 mdot_data.push_back(converts.t_u[0]);
efersko 0:e516bb631931 1314
efersko 0:e516bb631931 1315 if ((mdot_ret = mdot_radio->send(mdot_data)) != mDot::MDOT_OK) {
efersko 0:e516bb631931 1316 log_error(mdot_radio, "ERROR: Failed to Send Data", mdot_ret);
efersko 0:e516bb631931 1317 } else {
efersko 0:e516bb631931 1318 printf("Ok, Successfully Sent Data to Gateway...\r\n");
efersko 0:e516bb631931 1319 }
efersko 0:e516bb631931 1320
efersko 0:e516bb631931 1321 */
efersko 0:e516bb631931 1322
efersko 0:e516bb631931 1323 osDelay(CYCLE_TIME);
efersko 0:e516bb631931 1324 sprintf(txtstr,"Scanning... ");
efersko 0:e516bb631931 1325 if( bHasLCD ) evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 1326
efersko 0:e516bb631931 1327
efersko 0:e516bb631931 1328 // Put Thread to Sleep for 30 Seconds...
efersko 0:e516bb631931 1329 // osDelay(30000);
efersko 0:e516bb631931 1330
efersko 0:e516bb631931 1331 } while(i < 86400);
efersko 0:e516bb631931 1332
efersko 0:e516bb631931 1333 printf("End of Data Collection Cycle (24 Hours) - Ending Application, GoodBye...\r\n");
efersko 0:e516bb631931 1334
efersko 0:e516bb631931 1335 if( bHasLCD ) evbLCD->clearBuffer();
efersko 0:e516bb631931 1336 sprintf(txtstr,"Exiting Program");
efersko 0:e516bb631931 1337 if( bHasLCD ) evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 1338 }
efersko 0:e516bb631931 1339
efersko 0:e516bb631931 1340 /*** Interrupt Handler Top-Halves ------------------------------------------------------ ***/
efersko 0:e516bb631931 1341 /* Called in interrupt context, therefore just set a trigger variable */
efersko 0:e516bb631931 1342 static void timer_irq(void) {
efersko 0:e516bb631931 1343 timer_irq_triggered = true;
efersko 0:e516bb631931 1344 }
efersko 0:e516bb631931 1345
efersko 0:e516bb631931 1346 /* Called in interrupt context, therefore just set a trigger variable */
efersko 0:e516bb631931 1347 static void ff_irq(void) {
efersko 0:e516bb631931 1348 ff_irq_triggered = true;
efersko 0:e516bb631931 1349
efersko 0:e516bb631931 1350 /* Disable IRQ until handled */
efersko 0:e516bb631931 1351 mems_expansion_board->gyro_lsm6ds3->Disable_Free_Fall_Detection_IRQ();
efersko 0:e516bb631931 1352 }
efersko 0:e516bb631931 1353
efersko 0:e516bb631931 1354
efersko 0:e516bb631931 1355 /*** Interrupt Handler Bottom-Halves ------------------------------------------------- ***/
efersko 0:e516bb631931 1356 /* Handle Free Fall Interrupt
efersko 0:e516bb631931 1357 (here we are in "normal" context, i.e. not in IRQ context)
efersko 0:e516bb631931 1358 */
efersko 0:e516bb631931 1359 static void handle_ff_irq(void) {
efersko 0:e516bb631931 1360 printf("\nFree Fall Detected!\n\n");
efersko 0:e516bb631931 1361
efersko 0:e516bb631931 1362 /* Re-enable IRQ */
efersko 0:e516bb631931 1363 mems_expansion_board->gyro_lsm6ds3->Enable_Free_Fall_Detection_IRQ();
efersko 0:e516bb631931 1364 }
efersko 0:e516bb631931 1365
efersko 0:e516bb631931 1366 /*===================================================================================
efersko 0:e516bb631931 1367 Send String Payload to Conduit Gateway
efersko 0:e516bb631931 1368 ===================================================================================*/
efersko 0:e516bb631931 1369 int32_t sendString(const std::string text)
efersko 0:e516bb631931 1370 {
efersko 0:e516bb631931 1371 int32_t ret;
efersko 0:e516bb631931 1372 if (mdot_radio->getNextTxMs() != 0)
efersko 0:e516bb631931 1373 {
efersko 0:e516bb631931 1374 printf("Sending in %lu ms...\r\n", mdot_radio->getNextTxMs());
efersko 0:e516bb631931 1375 return false;
efersko 0:e516bb631931 1376 }
efersko 0:e516bb631931 1377
efersko 0:e516bb631931 1378 printf("Sending: '%s'\r\n", text.c_str());
efersko 0:e516bb631931 1379 std::vector<uint8_t> data(text.begin(), text.end());
efersko 0:e516bb631931 1380 if ((ret = mdot_radio->send(data, 1)) != mDot::MDOT_OK)
efersko 0:e516bb631931 1381 {
efersko 0:e516bb631931 1382 log_error(mdot_radio, "ERROR: Failed to Send Data", ret);
efersko 0:e516bb631931 1383 }
efersko 0:e516bb631931 1384
efersko 0:e516bb631931 1385 return ret;
efersko 0:e516bb631931 1386 }
efersko 0:e516bb631931 1387
efersko 0:e516bb631931 1388 /*===================================================================================
efersko 0:e516bb631931 1389 Interrupt Service Request Handler - Sets pb1_low flag. Flag is cleared in pb1_debounce thread
efersko 0:e516bb631931 1390 ===================================================================================*/
efersko 0:e516bb631931 1391 void pb1ISR(void)
efersko 0:e516bb631931 1392 {
efersko 0:e516bb631931 1393 pb1_low = true;
efersko 0:e516bb631931 1394 }
efersko 0:e516bb631931 1395
efersko 0:e516bb631931 1396 /*===================================================================================
efersko 0:e516bb631931 1397 Pushbutton Debounce - Debounces pb1 PB1 changes SW1 State Value (Sets LED Off)
efersko 0:e516bb631931 1398 ===================================================================================*/
efersko 0:e516bb631931 1399 void pb1_debounce(void const *args)
efersko 0:e516bb631931 1400 {
efersko 0:e516bb631931 1401 printf("Thread pb1_debounce started...\r\n");
efersko 0:e516bb631931 1402
efersko 0:e516bb631931 1403 while(true)
efersko 0:e516bb631931 1404 {
efersko 0:e516bb631931 1405 // if( pb1_low && (mDot08 == 0))
efersko 0:e516bb631931 1406 if( pb1_low )
efersko 0:e516bb631931 1407 {
efersko 0:e516bb631931 1408 sprintf(txtstr,"PB1 Pressed...");
efersko 0:e516bb631931 1409 if( bHasLCD ) evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 1410 printf("%s\r\n",txtstr);
efersko 0:e516bb631931 1411
efersko 0:e516bb631931 1412 pb1_low = false;
efersko 0:e516bb631931 1413 }
efersko 0:e516bb631931 1414
efersko 0:e516bb631931 1415 Thread::wait(50);
efersko 0:e516bb631931 1416 }
efersko 0:e516bb631931 1417 }
efersko 0:e516bb631931 1418
efersko 0:e516bb631931 1419 /*===================================================================================
efersko 0:e516bb631931 1420 Interrupt Service Request Handler - Sets pb1_low flag. Flag is cleared in pb1_debounce thread
efersko 0:e516bb631931 1421 ===================================================================================*/
efersko 0:e516bb631931 1422 void pb2ISR(void)
efersko 0:e516bb631931 1423 {
efersko 0:e516bb631931 1424 pb2_low = true;
efersko 0:e516bb631931 1425 }
efersko 0:e516bb631931 1426
efersko 0:e516bb631931 1427 /*===================================================================================
efersko 0:e516bb631931 1428 Pushbutton Debounce - Debounces pb2 PB2 changes SW2 State Value (Sets LED On)
efersko 0:e516bb631931 1429 ===================================================================================*/
efersko 0:e516bb631931 1430 void pb2_debounce(void const *args)
efersko 0:e516bb631931 1431 {
efersko 0:e516bb631931 1432 printf("Thread pb2_debounce started...\r\n");
efersko 0:e516bb631931 1433
efersko 0:e516bb631931 1434 while(true)
efersko 0:e516bb631931 1435 {
efersko 0:e516bb631931 1436 // if( pb2_low && (mDot09 == 1))
efersko 0:e516bb631931 1437 if( pb2_low )
efersko 0:e516bb631931 1438 {
efersko 0:e516bb631931 1439 sprintf(txtstr,"PB2 Pressed...");
efersko 0:e516bb631931 1440 if( bHasLCD ) evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 1441 printf("%s \r\n",txtstr);
efersko 0:e516bb631931 1442
efersko 0:e516bb631931 1443 pb2_low = false;
efersko 0:e516bb631931 1444 }
efersko 0:e516bb631931 1445
efersko 0:e516bb631931 1446 Thread::wait(50);
efersko 0:e516bb631931 1447 }
efersko 0:e516bb631931 1448 }
efersko 0:e516bb631931 1449
efersko 0:e516bb631931 1450 /*===================================================================================
efersko 0:e516bb631931 1451 Display Value/Error String of Barometric Pressure Sensor
efersko 0:e516bb631931 1452 ===================================================================================*/
efersko 0:e516bb631931 1453 bool writeValueOrError()
efersko 0:e516bb631931 1454 {
efersko 0:e516bb631931 1455 bool res;
efersko 0:e516bb631931 1456
efersko 0:e516bb631931 1457 if (failtime==0)
efersko 0:e516bb631931 1458 {
efersko 0:e516bb631931 1459 sprintf(lora_press_string, "%s", "--.--");
efersko 0:e516bb631931 1460 sprintf(txtstr, "%s", "--.--");
efersko 0:e516bb631931 1461 if( bHasLCD ) evbLCD->writeText(0,4,font_6x8,txtstr, strlen(txtstr));
efersko 0:e516bb631931 1462 res=false;
efersko 0:e516bb631931 1463 }
efersko 0:e516bb631931 1464 else
efersko 0:e516bb631931 1465 {
efersko 0:e516bb631931 1466 sprintf(lora_press_string, "%ld.%02d", num_whole, num_frac);
efersko 0:e516bb631931 1467 if( bHasLCD ) evbLCD->writeText(0,3,font_6x8,txtstr,strlen(txtstr));
efersko 0:e516bb631931 1468 res=true;
efersko 0:e516bb631931 1469 }
efersko 0:e516bb631931 1470
efersko 0:e516bb631931 1471 return res;
efersko 0:e516bb631931 1472 }
efersko 0:e516bb631931 1473
efersko 0:e516bb631931 1474 /*===================================================================================
efersko 0:e516bb631931 1475 Resets Barometric Pressure Sensor
efersko 0:e516bb631931 1476 ===================================================================================*/
efersko 0:e516bb631931 1477 MPL3115A2* resetBaro(const MPL3115A2* oldBaro)
efersko 0:e516bb631931 1478 {
efersko 0:e516bb631931 1479 delete oldBaro;
efersko 0:e516bb631931 1480 MPL3115A2* baro = new MPL3115A2(mDoti2c);
efersko 0:e516bb631931 1481 baro->testWhoAmI();
efersko 0:e516bb631931 1482
efersko 0:e516bb631931 1483 printf("Resetting barometer.. %x \n\r", baro->getStatus() );
efersko 0:e516bb631931 1484 baro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16, MPL3115A2::AT_1);
efersko 0:e516bb631931 1485 evbBaro->clearMinMaxRegs();
efersko 0:e516bb631931 1486
efersko 0:e516bb631931 1487 return baro;
efersko 0:e516bb631931 1488 }
efersko 0:e516bb631931 1489
efersko 0:e516bb631931 1490 /*===================================================================================
efersko 0:e516bb631931 1491 Print clear text verion of mDot/EVB errors
efersko 0:e516bb631931 1492 ===================================================================================*/
efersko 0:e516bb631931 1493 void log_error(mDot* dot, const char* msg, int32_t retval)
efersko 0:e516bb631931 1494 {
efersko 0:e516bb631931 1495 printf("%s - %ld:%s, %s\r\n", msg, retval, mDot::getReturnCodeString(retval).c_str(), dot->getLastError().c_str());
efersko 0:e516bb631931 1496 }