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
main_mems.cpp@0:e516bb631931, 2017-07-13 (annotated)
- Committer:
- efersko
- Date:
- Thu Jul 13 19:03:50 2017 +0000
- Revision:
- 0:e516bb631931
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |