Senet / Mbed OS MTDOT-UDKDemo

Dependencies:   libmDot-mbed5 DOGS102 ISL29011 MMA845x MPL3115A2 NCP5623B X_NUCLEO_IKS01A1 Senet_Packet

Fork of MTDOT-UDKDemo_Senet by canuck lehead

Committer:
shaunkrnelson
Date:
Thu Aug 25 18:32:28 2016 +0000
Revision:
25:a5860d250e79
Parent:
24:6f78c00a9e9c
Child:
26:752359e19a97
Configure 8-channel mode, DR2.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
falingtrea 0:bdd16076aaa5 1 /**
falingtrea 0:bdd16076aaa5 2 * @file main.cpp
falingtrea 0:bdd16076aaa5 3 * @brief Main application for mDot-EVB demo
falingtrea 0:bdd16076aaa5 4 * @author Tim Barr MultiTech Systems Inc.
falingtrea 3:68e974f5f532 5 * @version 1.03
falingtrea 0:bdd16076aaa5 6 * @see
falingtrea 0:bdd16076aaa5 7 *
falingtrea 0:bdd16076aaa5 8 * Copyright (c) 2015
falingtrea 0:bdd16076aaa5 9 *
falingtrea 0:bdd16076aaa5 10 * Licensed under the Apache License, Version 2.0 (the "License");
falingtrea 0:bdd16076aaa5 11 * you may not use this file except in compliance with the License.
falingtrea 0:bdd16076aaa5 12 * You may obtain a copy of the License at
falingtrea 0:bdd16076aaa5 13 *
falingtrea 0:bdd16076aaa5 14 * http://www.apache.org/licenses/LICENSE-2.0
falingtrea 0:bdd16076aaa5 15 *
falingtrea 0:bdd16076aaa5 16 * Unless required by applicable law or agreed to in writing, software
falingtrea 0:bdd16076aaa5 17 * distributed under the License is distributed on an "AS IS" BASIS,
falingtrea 0:bdd16076aaa5 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
falingtrea 0:bdd16076aaa5 19 * See the License for the specific language governing permissions and
falingtrea 0:bdd16076aaa5 20 * limitations under the License.
falingtrea 1:ac9595d0f0e7 21 *
falingtrea 1:ac9595d0f0e7 22 * 1.01 TAB 7/6/15 Removed NULL pointer from evbAmbientLight creation call.
falingtrea 2:75adc72aa6a0 23 *
falingtrea 3:68e974f5f532 24 * 1.02 TAB 7/8/15 Send logo to LCD before attempting connection to LoRa network. Added
falingtrea 2:75adc72aa6a0 25 * information on setting up for public LoRa network. Moved SW setup to
falingtrea 2:75adc72aa6a0 26 * beginning of main. Removed printf call from ISR functions. Added
falingtrea 2:75adc72aa6a0 27 * additional checks for exit_program.
falingtrea 3:68e974f5f532 28 *
falingtrea 3:68e974f5f532 29 * 1.03 TAB 7/15/15 Added threads for push button switch debounce.
falingtrea 3:68e974f5f532 30 *
falingtrea 0:bdd16076aaa5 31 */
falingtrea 0:bdd16076aaa5 32
falingtrea 0:bdd16076aaa5 33 #include "mbed.h"
Shaun Nelson 10:658720d51610 34 #include "senet_packet.h"
Shaun Nelson 10:658720d51610 35
shaunkrnelson 24:6f78c00a9e9c 36 #if !defined(MTDOT_EVB) && !defined(MTDOT_UDK)
shaunkrnelson 24:6f78c00a9e9c 37 #define MTDOT_UDK
shaunkrnelson 24:6f78c00a9e9c 38 #define REFLECT_FAST_TX
shaunkrnelson 24:6f78c00a9e9c 39 #endif
shaunkrnelson 24:6f78c00a9e9c 40
Shaun Nelson 10:658720d51610 41 // EVB Sensors
Shaun Nelson 10:658720d51610 42 #ifdef MTDOT_EVB
Shaun Nelson 12:ad92bbb6312f 43
falingtrea 0:bdd16076aaa5 44 #include "MMA845x.h"
falingtrea 0:bdd16076aaa5 45 #include "MPL3115A2.h"
falingtrea 0:bdd16076aaa5 46 #include "ISL29011.h"
falingtrea 0:bdd16076aaa5 47 #include "NCP5623B.h"
falingtrea 0:bdd16076aaa5 48 #include "DOGS102.h"
falingtrea 0:bdd16076aaa5 49 #include "font_6x8.h"
falingtrea 0:bdd16076aaa5 50 #include "MultiTech_Logo.h"
Shaun Nelson 12:ad92bbb6312f 51
Shaun Nelson 17:162e42587b4d 52 // Added period delay
Shaun Nelson 17:162e42587b4d 53 #define PERIOD_DELAY 0
Shaun Nelson 14:07ff01da6bbf 54
Shaun Nelson 17:162e42587b4d 55 // Fast send period
Shaun Nelson 17:162e42587b4d 56 #define FAST_SEND_PERIOD pckt_time
Shaun Nelson 14:07ff01da6bbf 57
Shaun Nelson 17:162e42587b4d 58 // Send frame period
Shaun Nelson 17:162e42587b4d 59 #define SEND_PERIOD 100
Shaun Nelson 14:07ff01da6bbf 60
Shaun Nelson 10:658720d51610 61 #elif defined(MTDOT_UDK)
Shaun Nelson 12:ad92bbb6312f 62
Shaun Nelson 10:658720d51610 63 #include "x_nucleo_iks01a1.h"
Shaun Nelson 12:ad92bbb6312f 64
Shaun Nelson 17:162e42587b4d 65 // Added period delay
Shaun Nelson 17:162e42587b4d 66 #define PERIOD_DELAY 3000
Shaun Nelson 14:07ff01da6bbf 67
Shaun Nelson 17:162e42587b4d 68 // Fast send period
Shaun Nelson 17:162e42587b4d 69 #define FAST_SEND_PERIOD 1
Shaun Nelson 14:07ff01da6bbf 70
Shaun Nelson 17:162e42587b4d 71 // Send frame period
Shaun Nelson 19:62f4a6bae943 72 #define SEND_PERIOD 10
Shaun Nelson 14:07ff01da6bbf 73
Shaun Nelson 10:658720d51610 74 #endif
Shaun Nelson 10:658720d51610 75
falingtrea 0:bdd16076aaa5 76 #include "mDot.h"
falingtrea 0:bdd16076aaa5 77 #include "rtos.h"
falingtrea 0:bdd16076aaa5 78 #include <string>
falingtrea 0:bdd16076aaa5 79 #include <vector>
falingtrea 0:bdd16076aaa5 80
Shaun Nelson 12:ad92bbb6312f 81 /*
Shaun Nelson 12:ad92bbb6312f 82 * Board sensor data
falingtrea 0:bdd16076aaa5 83 */
Shaun Nelson 10:658720d51610 84 struct BoardSensorData
Shaun Nelson 10:658720d51610 85 {
Shaun Nelson 10:658720d51610 86 float temperature;
Shaun Nelson 10:658720d51610 87 float pressure;
Shaun Nelson 10:658720d51610 88 int32_t accel_x;
Shaun Nelson 10:658720d51610 89 int32_t accel_y;
Shaun Nelson 10:658720d51610 90 int32_t accel_z;
Shaun Nelson 10:658720d51610 91
Shaun Nelson 10:658720d51610 92 inline void init()
Shaun Nelson 10:658720d51610 93 {
Shaun Nelson 10:658720d51610 94 temperature= 0;
Shaun Nelson 10:658720d51610 95 pressure = 0;
Shaun Nelson 10:658720d51610 96 accel_x = 0;
Shaun Nelson 10:658720d51610 97 accel_y = 0;
Shaun Nelson 10:658720d51610 98 accel_z = 0;
Shaun Nelson 10:658720d51610 99 }
Shaun Nelson 10:658720d51610 100
Shaun Nelson 10:658720d51610 101 BoardSensorData() { init(); }
Shaun Nelson 10:658720d51610 102 };
Shaun Nelson 10:658720d51610 103
shaunkrnelson 16:7b3cc3221db1 104 #ifdef MTDOT_EVB
falingtrea 0:bdd16076aaa5 105
Shaun Nelson 12:ad92bbb6312f 106 //DigitalIn mDot02(PA_2); // GPIO/UART_TX
Shaun Nelson 12:ad92bbb6312f 107 //DigitalOut mDot03(PA_3); // GPIO/UART_RX
Shaun Nelson 12:ad92bbb6312f 108 //DigitalIn mDot04(PA_6); // GPIO/SPI_MISO
Shaun Nelson 12:ad92bbb6312f 109 //DigitalIn mDot06(PA_8); // GPIO/I2C_SCL
Shaun Nelson 12:ad92bbb6312f 110 //DigitalIn mDot07(PC_9); // GPIO/I2C_SDA
falingtrea 0:bdd16076aaa5 111
Shaun Nelson 12:ad92bbb6312f 112 InterruptIn mDot08(PA_12); // GPIO/USB PB S1 on EVB
Shaun Nelson 12:ad92bbb6312f 113 InterruptIn mDot09(PA_11); // GPIO/USB PB S2 on EVB
Shaun Nelson 12:ad92bbb6312f 114
Shaun Nelson 12:ad92bbb6312f 115 //DigitalIn mDot11(PA_7); // GPIO/SPI_MOSI
falingtrea 0:bdd16076aaa5 116
Shaun Nelson 12:ad92bbb6312f 117 InterruptIn mDot12(PA_0); // GPIO/UART_CTS PRESSURE_INT2 on EVB
Shaun Nelson 12:ad92bbb6312f 118 DigitalOut mDot13(PC_13,1); // GPIO LCD_C/D
Shaun Nelson 12:ad92bbb6312f 119 InterruptIn mDot15(PC_1); // GPIO LIGHT_PROX_INT on EVB
Shaun Nelson 12:ad92bbb6312f 120 InterruptIn mDot16(PA_1); // GPIO/UART_RTS ACCEL_INT2 on EVB
Shaun Nelson 12:ad92bbb6312f 121 DigitalOut mDot17(PA_4,1); // GPIO/SPI_NCS LCD_CS on EVB
falingtrea 0:bdd16076aaa5 122
Shaun Nelson 12:ad92bbb6312f 123 //DigitalIn mDot18(PA_5); // GPIO/SPI_SCK
falingtrea 0:bdd16076aaa5 124
falingtrea 0:bdd16076aaa5 125 //DigitalInOut mDot19(PB_0,PIN_INPUT,PullNone,0); // GPIO PushPull LED Low=Red High=Green set MODE=INPUT to turn off
Shaun Nelson 12:ad92bbb6312f 126 AnalogIn mDot20(PB_1); // GPIO Current Sense Analog in on EVB
Shaun Nelson 12:ad92bbb6312f 127 Serial debugUART(PA_9, PA_10); // mDot debug UART
Shaun Nelson 12:ad92bbb6312f 128 //Serial mDotUART(PA_2, PA_3); // mDot external UART mDot02 and mDot03
Shaun Nelson 12:ad92bbb6312f 129 I2C mDoti2c(PC_9,PA_8); // mDot External I2C mDot6 and mDot7
falingtrea 0:bdd16076aaa5 130
Shaun Nelson 12:ad92bbb6312f 131 SPI mDotspi(PA_7,PA_6,PA_5); // mDot external SPI mDot11, mDot4, and mDot18
Shaun Nelson 10:658720d51610 132 #elif defined(MTDOT_UDK)
Shaun Nelson 10:658720d51610 133
Shaun Nelson 12:ad92bbb6312f 134 Serial debugUART(USBTX, USBRX); // mDot debug UART
Shaun Nelson 10:658720d51610 135
Shaun Nelson 10:658720d51610 136 #endif
falingtrea 0:bdd16076aaa5 137
Shaun Nelson 12:ad92bbb6312f 138 /*
Shaun Nelson 12:ad92bbb6312f 139 * LoRaWAN Configuration
falingtrea 2:75adc72aa6a0 140 */
shaunkrnelson 24:6f78c00a9e9c 141
shaunkrnelson 24:6f78c00a9e9c 142 // Senet Developer Portal Application EUI
Shaun Nelson 12:ad92bbb6312f 143 static uint8_t app_id[8] = {0x00,0x25,0x0C,0x00,0x00,0x01,0x00,0x01};
shaunkrnelson 24:6f78c00a9e9c 144
shaunkrnelson 24:6f78c00a9e9c 145 // Get Application Key from Senet Developer Portal Device Edit page
shaunkrnelson 21:12d2527f0437 146 static uint8_t app_key[16] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};
shaunkrnelson 24:6f78c00a9e9c 147
Shaun Nelson 12:ad92bbb6312f 148 static std::vector<uint8_t> config_app_id(app_id,app_id+sizeof(app_id)/sizeof(uint8_t));
Shaun Nelson 12:ad92bbb6312f 149 static std::vector<uint8_t> config_app_key(app_key,app_key+sizeof(app_key)/sizeof(uint8_t));
shaunkrnelson 25:a5860d250e79 150 static uint8_t config_frequency_sub_band = 1;
Shaun Nelson 12:ad92bbb6312f 151 static bool config_adr_on = true;
shaunkrnelson 25:a5860d250e79 152 #define DATARATE mDot::DR2
falingtrea 0:bdd16076aaa5 153
Shaun Nelson 14:07ff01da6bbf 154 bool position_changed = true;
Shaun Nelson 14:07ff01da6bbf 155 uint32_t sample_period = 0;
Shaun Nelson 14:07ff01da6bbf 156
Shaun Nelson 10:658720d51610 157 #ifdef MTDOT_EVB
falingtrea 0:bdd16076aaa5 158 MMA845x_DATA accel_data;
falingtrea 0:bdd16076aaa5 159 MPL3115A2_DATA baro_data;
falingtrea 0:bdd16076aaa5 160 uint16_t lux_data;
Shaun Nelson 12:ad92bbb6312f 161 MMA845x* evbAccel;
Shaun Nelson 12:ad92bbb6312f 162 MPL3115A2* evbBaro;
Shaun Nelson 12:ad92bbb6312f 163 ISL29011* evbAmbLight;
Shaun Nelson 12:ad92bbb6312f 164 NCP5623B* evbBackLight;
Shaun Nelson 12:ad92bbb6312f 165 DOGS102* evbLCD;
Shaun Nelson 10:658720d51610 166
Shaun Nelson 12:ad92bbb6312f 167 /*
Shaun Nelson 12:ad92bbb6312f 168 * EVB Application state
Shaun Nelson 12:ad92bbb6312f 169 */
Shaun Nelson 12:ad92bbb6312f 170 uint8_t position_value = 0xFF; // 00 unknown, 01 is flat, 02 is vertical
Shaun Nelson 12:ad92bbb6312f 171 uint8_t reflected_value = 0xFE;
Shaun Nelson 10:658720d51610 172
Shaun Nelson 12:ad92bbb6312f 173 unsigned char test;
Shaun Nelson 12:ad92bbb6312f 174 char txtstr[17];
Shaun Nelson 12:ad92bbb6312f 175 int32_t num_whole;
Shaun Nelson 12:ad92bbb6312f 176 uint32_t pressure;
Shaun Nelson 12:ad92bbb6312f 177 int16_t num_frac;
Shaun Nelson 12:ad92bbb6312f 178 uint8_t result, pckt_time=100;
Shaun Nelson 12:ad92bbb6312f 179 char data;
falingtrea 3:68e974f5f532 180 // flags for pushbutton debounce code
falingtrea 3:68e974f5f532 181 bool pb1_low = false;
falingtrea 3:68e974f5f532 182 bool pb2_low = false;
falingtrea 3:68e974f5f532 183
falingtrea 0:bdd16076aaa5 184 void pb1ISR(void);
falingtrea 0:bdd16076aaa5 185 void pb2ISR(void);
falingtrea 3:68e974f5f532 186 void pb1_debounce(void const *args);
falingtrea 3:68e974f5f532 187 void pb2_debounce(void const *args);
falingtrea 3:68e974f5f532 188 Thread* thread_3;
falingtrea 0:bdd16076aaa5 189
falingtrea 0:bdd16076aaa5 190 void config_pkt_xmit (void const *args);
falingtrea 0:bdd16076aaa5 191
Shaun Nelson 12:ad92bbb6312f 192 #elif defined(MTDOT_UDK)
Shaun Nelson 12:ad92bbb6312f 193
Shaun Nelson 14:07ff01da6bbf 194 uint16_t position_value = 0;
Shaun Nelson 14:07ff01da6bbf 195 uint16_t reflected_value = 0;
Shaun Nelson 14:07ff01da6bbf 196
Shaun Nelson 12:ad92bbb6312f 197 static X_NUCLEO_IKS01A1 *mems_shield;
Shaun Nelson 12:ad92bbb6312f 198
Shaun Nelson 12:ad92bbb6312f 199 #endif
Shaun Nelson 12:ad92bbb6312f 200
Shaun Nelson 12:ad92bbb6312f 201 mDot* mdot_radio;
Shaun Nelson 12:ad92bbb6312f 202 bool exit_program = false;
Shaun Nelson 14:07ff01da6bbf 203 Ticker joinTicker;
Shaun Nelson 19:62f4a6bae943 204 DigitalOut APP_LED(PA_0);
Shaun Nelson 19:62f4a6bae943 205
Shaun Nelson 19:62f4a6bae943 206 // join status
Shaun Nelson 19:62f4a6bae943 207 #define JOIN_LED APP_LED
Shaun Nelson 19:62f4a6bae943 208
Shaun Nelson 19:62f4a6bae943 209 // server sync status
Shaun Nelson 19:62f4a6bae943 210 #define SYNC_LED APP_LED
Shaun Nelson 19:62f4a6bae943 211
Shaun Nelson 19:62f4a6bae943 212 #define SYNC_LED_OK 0 // synced
Shaun Nelson 19:62f4a6bae943 213 #define SYNC_LED_OOS 1 // out of sync
Shaun Nelson 19:62f4a6bae943 214
Shaun Nelson 12:ad92bbb6312f 215
Shaun Nelson 12:ad92bbb6312f 216 /*
Shaun Nelson 12:ad92bbb6312f 217 * Process downlink
Shaun Nelson 12:ad92bbb6312f 218 */
Shaun Nelson 12:ad92bbb6312f 219 static void ReceiveData(std::vector<uint8_t> frame);
Shaun Nelson 12:ad92bbb6312f 220
Shaun Nelson 12:ad92bbb6312f 221 static bool checkForExit(bool exit);
Shaun Nelson 12:ad92bbb6312f 222
Shaun Nelson 12:ad92bbb6312f 223 /*
Shaun Nelson 12:ad92bbb6312f 224 * prints of mDot error
Shaun Nelson 12:ad92bbb6312f 225 */
Shaun Nelson 12:ad92bbb6312f 226 void log_error(mDot* dot, const char* msg, int32_t retval)
Shaun Nelson 12:ad92bbb6312f 227 {
Shaun Nelson 12:ad92bbb6312f 228 printf("%s - %ld:%s, %s\r\n", msg, retval, mDot::getReturnCodeString(retval).c_str(), dot->getLastError().c_str());
Shaun Nelson 12:ad92bbb6312f 229 }
Shaun Nelson 12:ad92bbb6312f 230
Shaun Nelson 12:ad92bbb6312f 231 /*
Shaun Nelson 12:ad92bbb6312f 232 * Send frame
Shaun Nelson 12:ad92bbb6312f 233 */
Shaun Nelson 10:658720d51610 234 void SendFrame(std::vector<uint8_t> frame)
falingtrea 0:bdd16076aaa5 235 {
Shaun Nelson 14:07ff01da6bbf 236 int32_t mdot_ret;
Shaun Nelson 12:ad92bbb6312f 237
Shaun Nelson 10:658720d51610 238 if ((mdot_ret = mdot_radio->send(frame)) != mDot::MDOT_OK) {
Shaun Nelson 10:658720d51610 239 log_error(mdot_radio, "failed to send", mdot_ret);
Shaun Nelson 10:658720d51610 240 }
Shaun Nelson 10:658720d51610 241 else {
Shaun Nelson 14:07ff01da6bbf 242 printf("successfully sent data\r\n");
Shaun Nelson 10:658720d51610 243 frame.clear();
Shaun Nelson 14:07ff01da6bbf 244 if ((mdot_ret = mdot_radio->recv(frame)) == mDot::MDOT_OK) {
Shaun Nelson 10:658720d51610 245 printf("recv data: ");
Shaun Nelson 10:658720d51610 246 for(uint32_t i = 0;i < frame.size();i++)
Shaun Nelson 10:658720d51610 247 printf("%02X",frame[i]);
Shaun Nelson 10:658720d51610 248 printf("\r\n");
Shaun Nelson 12:ad92bbb6312f 249
Shaun Nelson 12:ad92bbb6312f 250 ReceiveData(frame);
Shaun Nelson 10:658720d51610 251 }
Shaun Nelson 14:07ff01da6bbf 252 position_changed = false;
Shaun Nelson 10:658720d51610 253 }
Shaun Nelson 10:658720d51610 254 }
falingtrea 0:bdd16076aaa5 255
shaunkrnelson 16:7b3cc3221db1 256 #ifdef MTDOT_EVB
Shaun Nelson 12:ad92bbb6312f 257
Shaun Nelson 12:ad92bbb6312f 258 void ReceiveData(std::vector<uint8_t> frame)
Shaun Nelson 12:ad92bbb6312f 259 {
Shaun Nelson 12:ad92bbb6312f 260 reflected_value = frame[0];
Shaun Nelson 12:ad92bbb6312f 261
Shaun Nelson 12:ad92bbb6312f 262 if(reflected_value == position_value)
Shaun Nelson 12:ad92bbb6312f 263 {
Shaun Nelson 12:ad92bbb6312f 264 evbBackLight->setLEDCurrent(16);
Shaun Nelson 19:62f4a6bae943 265 // Set LED to indicate server in agreement
Shaun Nelson 19:62f4a6bae943 266 SYNC_LED=SYNC_LED_OK;
Shaun Nelson 12:ad92bbb6312f 267 }
Shaun Nelson 12:ad92bbb6312f 268 else
Shaun Nelson 12:ad92bbb6312f 269 {
Shaun Nelson 12:ad92bbb6312f 270 evbBackLight->setLEDCurrent(0);
Shaun Nelson 12:ad92bbb6312f 271 }
Shaun Nelson 12:ad92bbb6312f 272 }
Shaun Nelson 12:ad92bbb6312f 273
Shaun Nelson 10:658720d51610 274 void BoardInit()
Shaun Nelson 10:658720d51610 275 {
Shaun Nelson 10:658720d51610 276 static Thread thread_1(pb1_debounce); // threads for de-bouncing pushbutton switches
Shaun Nelson 10:658720d51610 277 static Thread thread_2(pb2_debounce);
falingtrea 0:bdd16076aaa5 278
dkjendal 4:9ea6ae34157c 279 debugUART.baud(115200);
Shaun Nelson 12:ad92bbb6312f 280 // mDotUART.baud(9600); // mdot UART unused but available on external connector
falingtrea 0:bdd16076aaa5 281
Shaun Nelson 12:ad92bbb6312f 282 thread_3 = new Thread(config_pkt_xmit); // start thread that sends LoRa packet when SW2 pressed
falingtrea 2:75adc72aa6a0 283
Shaun Nelson 12:ad92bbb6312f 284 evbAccel = new MMA845x(mDoti2c,MMA845x::SA0_VSS); // setup Accelerometer
Shaun Nelson 12:ad92bbb6312f 285 evbBaro = new MPL3115A2(mDoti2c); // setup Barometric sensor
Shaun Nelson 12:ad92bbb6312f 286 evbAmbLight = new ISL29011(mDoti2c); // Setup Ambient Light Sensor
Shaun Nelson 12:ad92bbb6312f 287 evbBackLight = new NCP5623B(mDoti2c); // setup backlight and LED 2 driver chip
Shaun Nelson 12:ad92bbb6312f 288 evbLCD = new DOGS102(mDotspi, mDot17, mDot13); // setup LCD
falingtrea 0:bdd16076aaa5 289
falingtrea 2:75adc72aa6a0 290 /*
falingtrea 2:75adc72aa6a0 291 * Setup SW1 as program stop function
falingtrea 2:75adc72aa6a0 292 */
falingtrea 2:75adc72aa6a0 293 mDot08.disable_irq();
falingtrea 2:75adc72aa6a0 294 mDot08.fall(&pb1ISR);
falingtrea 2:75adc72aa6a0 295
falingtrea 2:75adc72aa6a0 296 /*
falingtrea 2:75adc72aa6a0 297 * need to call this function after rise or fall because rise/fall sets
falingtrea 2:75adc72aa6a0 298 * mode to PullNone
falingtrea 2:75adc72aa6a0 299 */
falingtrea 2:75adc72aa6a0 300 mDot08.mode(PullUp);
falingtrea 2:75adc72aa6a0 301
falingtrea 2:75adc72aa6a0 302 mDot08.enable_irq();
falingtrea 2:75adc72aa6a0 303
falingtrea 2:75adc72aa6a0 304 /*
falingtrea 2:75adc72aa6a0 305 * Setup SW2 as packet time change
falingtrea 2:75adc72aa6a0 306 */
falingtrea 2:75adc72aa6a0 307 mDot09.disable_irq();
falingtrea 2:75adc72aa6a0 308 mDot09.fall(&pb2ISR);
falingtrea 2:75adc72aa6a0 309
falingtrea 2:75adc72aa6a0 310 /*
falingtrea 2:75adc72aa6a0 311 * need to call this function after rise or fall because rise/fall sets
falingtrea 2:75adc72aa6a0 312 * mode to PullNone
falingtrea 2:75adc72aa6a0 313 */
falingtrea 2:75adc72aa6a0 314 mDot09.mode(PullUp);
falingtrea 2:75adc72aa6a0 315
falingtrea 2:75adc72aa6a0 316 mDot09.enable_irq();
falingtrea 2:75adc72aa6a0 317
falingtrea 2:75adc72aa6a0 318 /*
falingtrea 2:75adc72aa6a0 319 * Setting other InterruptIn pins with Pull Ups
falingtrea 2:75adc72aa6a0 320 */
falingtrea 2:75adc72aa6a0 321 mDot12.mode(PullUp);
falingtrea 2:75adc72aa6a0 322 mDot15.mode(PullUp);
falingtrea 2:75adc72aa6a0 323 mDot16.mode(PullUp);
falingtrea 2:75adc72aa6a0 324
falingtrea 2:75adc72aa6a0 325 printf("font table address %p\n\r",&font_6x8);
falingtrea 2:75adc72aa6a0 326 printf("bitmap address %p\n\r",&MultiTech_Logo);
falingtrea 2:75adc72aa6a0 327
falingtrea 2:75adc72aa6a0 328 // Setup and display logo on LCD
falingtrea 2:75adc72aa6a0 329 evbLCD->startUpdate();
falingtrea 2:75adc72aa6a0 330
falingtrea 2:75adc72aa6a0 331 evbLCD->writeBitmap(0,0,MultiTech_Logo);
falingtrea 2:75adc72aa6a0 332
falingtrea 2:75adc72aa6a0 333 sprintf(txtstr,"MTDOT");
falingtrea 2:75adc72aa6a0 334 evbLCD->writeText(24,3,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 335 sprintf(txtstr,"Evaluation");
falingtrea 2:75adc72aa6a0 336 evbLCD->writeText(24,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 337 sprintf(txtstr,"Board");
falingtrea 2:75adc72aa6a0 338 evbLCD->writeText(24,5,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 339
falingtrea 2:75adc72aa6a0 340 evbLCD->endUpdate();
falingtrea 2:75adc72aa6a0 341
Shaun Nelson 10:658720d51610 342 pckt_time = 10;
Shaun Nelson 10:658720d51610 343 }
falingtrea 2:75adc72aa6a0 344
Shaun Nelson 10:658720d51610 345 void PostJoinInit()
Shaun Nelson 10:658720d51610 346 {
falingtrea 0:bdd16076aaa5 347 osDelay(200);
falingtrea 0:bdd16076aaa5 348 evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
falingtrea 0:bdd16076aaa5 349
falingtrea 2:75adc72aa6a0 350 // sets LED2 to 50% max current
falingtrea 0:bdd16076aaa5 351 evbBackLight->setLEDCurrent(16);
falingtrea 0:bdd16076aaa5 352
falingtrea 0:bdd16076aaa5 353 printf("Start of Test\n\r");
falingtrea 0:bdd16076aaa5 354
Shaun Nelson 12:ad92bbb6312f 355 osDelay (500); // allows other threads to process
falingtrea 2:75adc72aa6a0 356 printf("shutdown LED:\n\r");
falingtrea 2:75adc72aa6a0 357 evbBackLight->shutdown();
falingtrea 0:bdd16076aaa5 358
Shaun Nelson 12:ad92bbb6312f 359 osDelay (500); // allows other threads to process
falingtrea 0:bdd16076aaa5 360 printf("Turn on LED2\n\r");
falingtrea 0:bdd16076aaa5 361 evbBackLight->setLEDCurrent(16);
falingtrea 0:bdd16076aaa5 362
falingtrea 0:bdd16076aaa5 363 data = evbAccel->getWhoAmI();
falingtrea 0:bdd16076aaa5 364 printf("Accelerometer who_am_i value = %x \n\r", data);
falingtrea 0:bdd16076aaa5 365
falingtrea 0:bdd16076aaa5 366 result = evbAccel->getStatus();
falingtrea 0:bdd16076aaa5 367 printf("status byte = %x \n\r", result);
falingtrea 0:bdd16076aaa5 368
falingtrea 0:bdd16076aaa5 369 printf("Barometer who_am_i check = %s \n\r", evbBaro->testWhoAmI() ? "TRUE" : "FALSE");
falingtrea 0:bdd16076aaa5 370
falingtrea 0:bdd16076aaa5 371 result = evbBaro->getStatus();
falingtrea 0:bdd16076aaa5 372 printf("status byte = %x \n\r", result);
falingtrea 0:bdd16076aaa5 373
falingtrea 0:bdd16076aaa5 374 /*
falingtrea 0:bdd16076aaa5 375 * Setup the Accelerometer for 8g range, 14 bit resolution, Noise reduction off, sample rate 1.56 Hz
falingtrea 0:bdd16076aaa5 376 * normal oversample mode, High pass filter off
falingtrea 0:bdd16076aaa5 377 */
falingtrea 0:bdd16076aaa5 378 evbAccel->setCommonParameters(MMA845x::RANGE_8g,MMA845x::RES_MAX,MMA845x::LN_OFF,
falingtrea 0:bdd16076aaa5 379 MMA845x::DR_1_56,MMA845x::OS_NORMAL,MMA845x::HPF_OFF );
falingtrea 0:bdd16076aaa5 380
falingtrea 0:bdd16076aaa5 381 /*
falingtrea 0:bdd16076aaa5 382 * Setup the Barometric sensor for post processed Ambient pressure, 4 samples per data acquisition.
falingtrea 0:bdd16076aaa5 383 * and a sample taken every second when in active mode
falingtrea 0:bdd16076aaa5 384 */
falingtrea 0:bdd16076aaa5 385 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16,
falingtrea 0:bdd16076aaa5 386 MPL3115A2::AT_1);
falingtrea 0:bdd16076aaa5 387 /*
falingtrea 0:bdd16076aaa5 388 * Setup the Ambient Light Sensor for continuous Ambient Light Sensing, 16 bit resolution,
falingtrea 0:bdd16076aaa5 389 * and 16000 lux range
falingtrea 0:bdd16076aaa5 390 */
falingtrea 0:bdd16076aaa5 391
falingtrea 0:bdd16076aaa5 392 evbAmbLight->setMode(ISL29011::ALS_CONT);
falingtrea 0:bdd16076aaa5 393 evbAmbLight->setResolution(ISL29011::ADC_16BIT);
falingtrea 0:bdd16076aaa5 394 evbAmbLight->setRange(ISL29011::RNG_16000);
falingtrea 0:bdd16076aaa5 395
falingtrea 0:bdd16076aaa5 396 /*
falingtrea 0:bdd16076aaa5 397 * Set the accelerometer for active mode
falingtrea 0:bdd16076aaa5 398 */
falingtrea 0:bdd16076aaa5 399 evbAccel->activeMode();
falingtrea 0:bdd16076aaa5 400
falingtrea 0:bdd16076aaa5 401 /*
falingtrea 0:bdd16076aaa5 402 * Clear the min-max registers in the Barometric Sensor
falingtrea 0:bdd16076aaa5 403 */
falingtrea 0:bdd16076aaa5 404 evbBaro->clearMinMaxRegs();
falingtrea 0:bdd16076aaa5 405
falingtrea 0:bdd16076aaa5 406 evbBackLight->setLEDCurrent(0);
falingtrea 0:bdd16076aaa5 407
falingtrea 0:bdd16076aaa5 408 /*
falingtrea 2:75adc72aa6a0 409 * Check for PB1 press during network join attempt
falingtrea 2:75adc72aa6a0 410 */
falingtrea 2:75adc72aa6a0 411 if (exit_program) {
falingtrea 2:75adc72aa6a0 412 printf("Exiting program\n\r");
falingtrea 2:75adc72aa6a0 413 evbLCD->clearBuffer();
falingtrea 2:75adc72aa6a0 414 sprintf(txtstr,"Exiting Program");
falingtrea 2:75adc72aa6a0 415 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
falingtrea 2:75adc72aa6a0 416 exit(1);
falingtrea 2:75adc72aa6a0 417 }
Shaun Nelson 10:658720d51610 418 }
Shaun Nelson 10:658720d51610 419
Shaun Nelson 10:658720d51610 420 void ReadSensors(BoardSensorData &sensorData)
Shaun Nelson 10:658720d51610 421 {
Shaun Nelson 10:658720d51610 422 MMA845x_DATA accel_data;
Shaun Nelson 10:658720d51610 423 /*
Shaun Nelson 10:658720d51610 424 * Test Accelerometer XYZ data ready bit to see if acquisition complete
Shaun Nelson 10:658720d51610 425 */
Shaun Nelson 10:658720d51610 426 do {
Shaun Nelson 12:ad92bbb6312f 427 osDelay(100); // allows other threads to process
Shaun Nelson 10:658720d51610 428 result = evbAccel->getStatus();
Shaun Nelson 10:658720d51610 429 } while ((result & MMA845x::XYZDR) == 0 );
Shaun Nelson 10:658720d51610 430
Shaun Nelson 10:658720d51610 431 /*
Shaun Nelson 10:658720d51610 432 * Retrieve and print out accelerometer data
Shaun Nelson 10:658720d51610 433 */
Shaun Nelson 10:658720d51610 434 accel_data = evbAccel->getXYZ();
Shaun Nelson 10:658720d51610 435
Shaun Nelson 10:658720d51610 436 sprintf(txtstr,"Accelerometer");
Shaun Nelson 10:658720d51610 437 evbLCD->writeText(0,0,font_6x8,txtstr,strlen(txtstr));
Shaun Nelson 10:658720d51610 438 sprintf(txtstr, "x = %d", accel_data._x);
Shaun Nelson 10:658720d51610 439 evbLCD->writeText(20,1,font_6x8,txtstr,strlen(txtstr));
Shaun Nelson 10:658720d51610 440 sprintf(txtstr, "y = %d", accel_data._y);
Shaun Nelson 10:658720d51610 441 evbLCD->writeText(20,2,font_6x8,txtstr,strlen(txtstr));
Shaun Nelson 10:658720d51610 442 sprintf(txtstr, "z = %d", accel_data._z );
Shaun Nelson 10:658720d51610 443 evbLCD->writeText(20,3,font_6x8,txtstr,strlen(txtstr));
Shaun Nelson 10:658720d51610 444
shaunkrnelson 16:7b3cc3221db1 445 sensorData.accel_x = accel_data._x;
shaunkrnelson 16:7b3cc3221db1 446 sensorData.accel_y = accel_data._y;
shaunkrnelson 16:7b3cc3221db1 447 sensorData.accel_z = accel_data._z;
Shaun Nelson 10:658720d51610 448
Shaun Nelson 10:658720d51610 449 // Update accelerometer state
Shaun Nelson 10:658720d51610 450 evbLCD->startUpdate();
Shaun Nelson 10:658720d51610 451 evbLCD->clearBuffer();
Shaun Nelson 10:658720d51610 452
Shaun Nelson 10:658720d51610 453 // convert to simple position value for use in send/recv
Shaun Nelson 10:658720d51610 454 if((accel_data._x > 500)&&(accel_data._z < 500))
Shaun Nelson 10:658720d51610 455 {
Shaun Nelson 10:658720d51610 456 if(position_value != 0x02)
Shaun Nelson 10:658720d51610 457 position_changed = true;
Shaun Nelson 10:658720d51610 458 position_value = 0x02;
Shaun Nelson 10:658720d51610 459 }
Shaun Nelson 10:658720d51610 460 else if((accel_data._x < 500)&&(accel_data._z > 500))
Shaun Nelson 10:658720d51610 461 {
Shaun Nelson 10:658720d51610 462 if(position_value != 0x01)
Shaun Nelson 10:658720d51610 463 position_changed = true;
Shaun Nelson 10:658720d51610 464 position_value = 0x01;
Shaun Nelson 10:658720d51610 465 }
Shaun Nelson 10:658720d51610 466 else
Shaun Nelson 10:658720d51610 467 {
Shaun Nelson 10:658720d51610 468 if(position_value != 0x00)
Shaun Nelson 10:658720d51610 469 position_changed = true;
Shaun Nelson 10:658720d51610 470 position_value= 0x00;
Shaun Nelson 10:658720d51610 471 }
Shaun Nelson 10:658720d51610 472
Shaun Nelson 19:62f4a6bae943 473 if(position_changed){
Shaun Nelson 10:658720d51610 474 evbBackLight->setLEDCurrent(0);
Shaun Nelson 19:62f4a6bae943 475 // Turn LED off to indicate server not in agreement
Shaun Nelson 19:62f4a6bae943 476 SYNC_LED=SYNC_LED_OOS;
Shaun Nelson 22:d3a56f5a949c 477 // Set reflected_value to an out of range value to stay
Shaun Nelson 22:d3a56f5a949c 478 // in fast transmit mode until server responds
Shaun Nelson 22:d3a56f5a949c 479 reflected_value = 0;
Shaun Nelson 19:62f4a6bae943 480 }
Shaun Nelson 19:62f4a6bae943 481
Shaun Nelson 10:658720d51610 482 /*
Shaun Nelson 10:658720d51610 483 * Trigger a Pressure reading
Shaun Nelson 10:658720d51610 484 */
Shaun Nelson 10:658720d51610 485 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16,
Shaun Nelson 10:658720d51610 486 MPL3115A2::AT_1);
Shaun Nelson 10:658720d51610 487 evbBaro->triggerOneShot();
Shaun Nelson 10:658720d51610 488
Shaun Nelson 10:658720d51610 489 /*
Shaun Nelson 10:658720d51610 490 * Test barometer device status to see if acquisition is complete
Shaun Nelson 10:658720d51610 491 */
Shaun Nelson 10:658720d51610 492 do {
Shaun Nelson 10:658720d51610 493 osDelay(100); // allows other threads to process
Shaun Nelson 10:658720d51610 494 result = evbBaro->getStatus();
Shaun Nelson 10:658720d51610 495 } while ((result & MPL3115A2::PTDR) == 0 );
Shaun Nelson 10:658720d51610 496
Shaun Nelson 10:658720d51610 497 /*
Shaun Nelson 10:658720d51610 498 * Retrieve and print out barometric pressure
Shaun Nelson 10:658720d51610 499 */
Shaun Nelson 10:658720d51610 500 pressure = evbBaro->getBaroData() >> 12; // convert 32 bit signed to 20 bit unsigned value
Shaun Nelson 10:658720d51610 501 num_whole = pressure >> 2; // 18 bit integer significant
Shaun Nelson 10:658720d51610 502 num_frac = (pressure & 0x3) * 25; // 2 bit fractional 0.25 per bit
Shaun Nelson 10:658720d51610 503 sensorData.pressure = pressure + (.25 * num_frac);
Shaun Nelson 10:658720d51610 504
Shaun Nelson 10:658720d51610 505 sprintf(txtstr,"Press=%ld.%02d Pa", num_whole, num_frac);
Shaun Nelson 10:658720d51610 506 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
Shaun Nelson 10:658720d51610 507
Shaun Nelson 10:658720d51610 508 /*
Shaun Nelson 10:658720d51610 509 * Trigger a Altitude reading
Shaun Nelson 10:658720d51610 510 */
Shaun Nelson 10:658720d51610 511 evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_ALTIMETER, MPL3115A2::OR_16,
Shaun Nelson 10:658720d51610 512 MPL3115A2::AT_1);
Shaun Nelson 10:658720d51610 513 evbBaro->triggerOneShot();
Shaun Nelson 10:658720d51610 514
Shaun Nelson 10:658720d51610 515 /*
Shaun Nelson 10:658720d51610 516 * Test barometer device status to see if acquisition is complete
Shaun Nelson 10:658720d51610 517 */
Shaun Nelson 10:658720d51610 518 do {
Shaun Nelson 10:658720d51610 519 osDelay(100); // allows other threads to process
Shaun Nelson 10:658720d51610 520 result = evbBaro->getStatus();
Shaun Nelson 10:658720d51610 521 } while ((result & MPL3115A2::PTDR) == 0 );
Shaun Nelson 10:658720d51610 522
Shaun Nelson 10:658720d51610 523 /*
Shaun Nelson 10:658720d51610 524 * Retrieve and print out altitude and temperature
Shaun Nelson 10:658720d51610 525 */
Shaun Nelson 10:658720d51610 526 baro_data = evbBaro->getAllData(false);
Shaun Nelson 10:658720d51610 527 baro_data._baro /= 4096; // convert 32 bit signed to 20 bit signed value
Shaun Nelson 10:658720d51610 528 num_whole = baro_data._baro / 16; // 18 bit signed significant integer
Shaun Nelson 10:658720d51610 529 num_frac = (baro_data._baro & 0xF) * 625 / 100; // 4 bit fractional .0625 per bit
Shaun Nelson 10:658720d51610 530 sprintf(txtstr,"Alti=%ld.%03d m", num_whole, num_frac);
Shaun Nelson 10:658720d51610 531 evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
Shaun Nelson 10:658720d51610 532 num_whole = baro_data._temp / 16; // 8 bit signed significant integer
Shaun Nelson 10:658720d51610 533 num_frac = (baro_data._temp & 0x0F) * 625 / 100; // 4 bit fractional .0625 per bit
shaunkrnelson 16:7b3cc3221db1 534 sensorData.temperature = num_whole + ((float)num_frac / 100);
Shaun Nelson 10:658720d51610 535 sprintf(txtstr,"Temp=%ld.%03d C", num_whole, num_frac);
Shaun Nelson 10:658720d51610 536 evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
Shaun Nelson 10:658720d51610 537
Shaun Nelson 10:658720d51610 538 /*
Shaun Nelson 10:658720d51610 539 * retrieve and print out Ambient Light level
Shaun Nelson 10:658720d51610 540 */
Shaun Nelson 10:658720d51610 541 lux_data = evbAmbLight->getData();
Shaun Nelson 10:658720d51610 542 num_whole = lux_data * 24 / 100; // 16000 lux full scale .24 lux per bit
Shaun Nelson 10:658720d51610 543 num_frac = lux_data * 24 % 100;
Shaun Nelson 10:658720d51610 544 sprintf(txtstr, "Light=%ld.%02d lux", num_whole, num_frac );
Shaun Nelson 10:658720d51610 545 evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
Shaun Nelson 10:658720d51610 546
Shaun Nelson 10:658720d51610 547 evbLCD->endUpdate();
Shaun Nelson 10:658720d51610 548 }
Shaun Nelson 10:658720d51610 549
Shaun Nelson 12:ad92bbb6312f 550 uint32_t PrepareFrame(std::vector<uint8_t> &frame, BoardSensorData &data)
Shaun Nelson 12:ad92bbb6312f 551 {
Shaun Nelson 14:07ff01da6bbf 552 frame.clear();
Shaun Nelson 14:07ff01da6bbf 553
Shaun Nelson 17:162e42587b4d 554 #ifdef REFLECT_FAST_TX
Shaun Nelson 17:162e42587b4d 555 if((reflected_value != position_value)|| position_changed || ( ( sample_period % SEND_PERIOD ) == 0 ) )
Shaun Nelson 17:162e42587b4d 556 #else
Shaun Nelson 17:162e42587b4d 557 if( position_changed || ( ( sample_period % SEND_PERIOD ) == 0 ) )
Shaun Nelson 17:162e42587b4d 558 #endif
Shaun Nelson 12:ad92bbb6312f 559 {
Shaun Nelson 12:ad92bbb6312f 560 // we will send a simple byte descriptor of the current position of the device: 01 is laying flat, 02 is vertically oriented
Shaun Nelson 12:ad92bbb6312f 561 frame.push_back(0x00);
Shaun Nelson 12:ad92bbb6312f 562 frame.push_back(position_value);
Shaun Nelson 12:ad92bbb6312f 563 }
Shaun Nelson 12:ad92bbb6312f 564
Shaun Nelson 14:07ff01da6bbf 565 return frame.size();
Shaun Nelson 12:ad92bbb6312f 566 }
Shaun Nelson 12:ad92bbb6312f 567
Shaun Nelson 12:ad92bbb6312f 568 bool checkForExit(bool _exit)
Shaun Nelson 12:ad92bbb6312f 569 {
Shaun Nelson 12:ad92bbb6312f 570 // Check for PB1 press during network join attempt
Shaun Nelson 12:ad92bbb6312f 571 if (exit_program) {
Shaun Nelson 14:07ff01da6bbf 572 printf("Exiting program\n\r");
Shaun Nelson 12:ad92bbb6312f 573 evbLCD->clearBuffer();
Shaun Nelson 12:ad92bbb6312f 574 sprintf(txtstr,"Exiting Program");
Shaun Nelson 12:ad92bbb6312f 575 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
Shaun Nelson 12:ad92bbb6312f 576 if(_exit)
Shaun Nelson 12:ad92bbb6312f 577 exit(1);
Shaun Nelson 12:ad92bbb6312f 578 }
Shaun Nelson 12:ad92bbb6312f 579
Shaun Nelson 12:ad92bbb6312f 580 return false;
Shaun Nelson 12:ad92bbb6312f 581 }
Shaun Nelson 12:ad92bbb6312f 582
Shaun Nelson 12:ad92bbb6312f 583 void ExitingProgram()
Shaun Nelson 10:658720d51610 584 {
Shaun Nelson 12:ad92bbb6312f 585 evbBaro->triggerOneShot();
Shaun Nelson 12:ad92bbb6312f 586 do {
Shaun Nelson 12:ad92bbb6312f 587 osDelay(200); // allows other threads to process
Shaun Nelson 12:ad92bbb6312f 588 result = evbBaro->getStatus();
Shaun Nelson 12:ad92bbb6312f 589 } while ((result & MPL3115A2::PTDR) == 0 );
Shaun Nelson 12:ad92bbb6312f 590
Shaun Nelson 12:ad92bbb6312f 591 baro_data = evbBaro->getAllData(true);
Shaun Nelson 12:ad92bbb6312f 592 printf ("minBaro=%ld maxBaro=%ld minTemp=%d maxTemp=%d\n\r", baro_data._minbaro, baro_data._maxbaro,
Shaun Nelson 12:ad92bbb6312f 593 baro_data._mintemp, baro_data._maxtemp);
Shaun Nelson 12:ad92bbb6312f 594 evbLCD->clearBuffer();
Shaun Nelson 12:ad92bbb6312f 595 sprintf(txtstr,"Exiting Program");
Shaun Nelson 12:ad92bbb6312f 596 evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
Shaun Nelson 12:ad92bbb6312f 597 printf("End of Test\n\r");
Shaun Nelson 12:ad92bbb6312f 598 }
Shaun Nelson 12:ad92bbb6312f 599
Shaun Nelson 10:658720d51610 600
Shaun Nelson 12:ad92bbb6312f 601 /*
Shaun Nelson 12:ad92bbb6312f 602 * Sets pb1_low flag. Slag is cleared in pb1_debounce thread
Shaun Nelson 12:ad92bbb6312f 603 */
Shaun Nelson 12:ad92bbb6312f 604 void pb1ISR(void)
Shaun Nelson 12:ad92bbb6312f 605 {
Shaun Nelson 12:ad92bbb6312f 606 if (!pb1_low)
Shaun Nelson 12:ad92bbb6312f 607 pb1_low = true;
Shaun Nelson 12:ad92bbb6312f 608 }
Shaun Nelson 12:ad92bbb6312f 609
Shaun Nelson 12:ad92bbb6312f 610 /*
Shaun Nelson 12:ad92bbb6312f 611 * Debounces pb1. Also exits program if pushbutton 1 is pressed
Shaun Nelson 12:ad92bbb6312f 612 */
Shaun Nelson 12:ad92bbb6312f 613 void pb1_debounce(void const *args)
Shaun Nelson 12:ad92bbb6312f 614 {
Shaun Nelson 12:ad92bbb6312f 615 static uint8_t count = 0;
Shaun Nelson 10:658720d51610 616
Shaun Nelson 12:ad92bbb6312f 617 while (true) {
Shaun Nelson 12:ad92bbb6312f 618 if (pb1_low && (mDot08 == 0))
Shaun Nelson 12:ad92bbb6312f 619 count++;
Shaun Nelson 12:ad92bbb6312f 620 else {
Shaun Nelson 12:ad92bbb6312f 621 count = 0;
Shaun Nelson 12:ad92bbb6312f 622 pb1_low = false;
Shaun Nelson 12:ad92bbb6312f 623 }
Shaun Nelson 12:ad92bbb6312f 624
Shaun Nelson 12:ad92bbb6312f 625 if (count == 5)
Shaun Nelson 12:ad92bbb6312f 626 exit_program = true;
Shaun Nelson 12:ad92bbb6312f 627
Shaun Nelson 12:ad92bbb6312f 628 Thread::wait(5);
Shaun Nelson 12:ad92bbb6312f 629 }
Shaun Nelson 12:ad92bbb6312f 630 }
Shaun Nelson 12:ad92bbb6312f 631
Shaun Nelson 12:ad92bbb6312f 632 /*
Shaun Nelson 12:ad92bbb6312f 633 * Sets pb2_low flag. Flag is cleared in pb2_debounce thread
Shaun Nelson 12:ad92bbb6312f 634 */
Shaun Nelson 12:ad92bbb6312f 635 void pb2ISR(void)
Shaun Nelson 12:ad92bbb6312f 636 {
Shaun Nelson 12:ad92bbb6312f 637 if (!pb2_low)
Shaun Nelson 12:ad92bbb6312f 638 pb2_low = true;
Shaun Nelson 12:ad92bbb6312f 639 }
Shaun Nelson 12:ad92bbb6312f 640
Shaun Nelson 12:ad92bbb6312f 641 /*
Shaun Nelson 12:ad92bbb6312f 642 * Debounces pb2. Also changes packet transmit time to every other,
Shaun Nelson 12:ad92bbb6312f 643 * every fifth, or every tenth sample when SW2 pushed
Shaun Nelson 12:ad92bbb6312f 644 * Also triggers a thread to transmit a configuration packet
Shaun Nelson 12:ad92bbb6312f 645 */
Shaun Nelson 12:ad92bbb6312f 646 void pb2_debounce(void const *args)
Shaun Nelson 12:ad92bbb6312f 647 {
Shaun Nelson 12:ad92bbb6312f 648 static uint8_t count = 0;
Shaun Nelson 12:ad92bbb6312f 649
Shaun Nelson 12:ad92bbb6312f 650 while (true) {
Shaun Nelson 10:658720d51610 651
Shaun Nelson 12:ad92bbb6312f 652 if (pb2_low && (mDot09 == 0))
Shaun Nelson 12:ad92bbb6312f 653 count++;
Shaun Nelson 12:ad92bbb6312f 654 else {
Shaun Nelson 12:ad92bbb6312f 655 count = 0;
Shaun Nelson 12:ad92bbb6312f 656 pb2_low = false;
Shaun Nelson 12:ad92bbb6312f 657 }
Shaun Nelson 12:ad92bbb6312f 658
Shaun Nelson 12:ad92bbb6312f 659 if (count == 5){
Shaun Nelson 12:ad92bbb6312f 660 if (pckt_time >= 5)
Shaun Nelson 12:ad92bbb6312f 661 pckt_time /= 2;
Shaun Nelson 12:ad92bbb6312f 662 else
Shaun Nelson 12:ad92bbb6312f 663 pckt_time = 20;
Shaun Nelson 12:ad92bbb6312f 664
Shaun Nelson 12:ad92bbb6312f 665 //thread_3->signal_set(0x10); // signal config_pkt_xmit to send packet
Shaun Nelson 12:ad92bbb6312f 666 position_changed = true;
Shaun Nelson 12:ad92bbb6312f 667 }
Shaun Nelson 12:ad92bbb6312f 668 Thread::wait(5);
Shaun Nelson 12:ad92bbb6312f 669 }
Shaun Nelson 12:ad92bbb6312f 670 }
Shaun Nelson 12:ad92bbb6312f 671
Shaun Nelson 12:ad92bbb6312f 672 /*
Shaun Nelson 12:ad92bbb6312f 673 * Thread that is triggered by SW2 ISR. Sends a packet to the LoRa server with the new Packet Transmission time setting
Shaun Nelson 12:ad92bbb6312f 674 */
Shaun Nelson 12:ad92bbb6312f 675 void config_pkt_xmit (void const *args)
Shaun Nelson 12:ad92bbb6312f 676 {
Shaun Nelson 12:ad92bbb6312f 677 int32_t mdot_ret;
Shaun Nelson 12:ad92bbb6312f 678
Shaun Nelson 12:ad92bbb6312f 679 std::vector<uint8_t> data;
Shaun Nelson 12:ad92bbb6312f 680
Shaun Nelson 12:ad92bbb6312f 681 while (true) {
Shaun Nelson 12:ad92bbb6312f 682 Thread::signal_wait(0x10); // wait for pb2ISR to signal send
Shaun Nelson 12:ad92bbb6312f 683 data.clear();
Shaun Nelson 12:ad92bbb6312f 684 data.push_back(0x0F); // key for Configuration data (packet transmission timer)
Shaun Nelson 12:ad92bbb6312f 685 data.push_back(pckt_time);
Shaun Nelson 12:ad92bbb6312f 686
Shaun Nelson 12:ad92bbb6312f 687 if ((mdot_ret = mdot_radio->send(data)) != mDot::MDOT_OK) {
Shaun Nelson 12:ad92bbb6312f 688 log_error(mdot_radio, "failed to send config data", mdot_ret);
Shaun Nelson 12:ad92bbb6312f 689 } else {
Shaun Nelson 12:ad92bbb6312f 690 printf("sent config data to gateway\r\n");
Shaun Nelson 12:ad92bbb6312f 691 }
Shaun Nelson 10:658720d51610 692 }
Shaun Nelson 10:658720d51610 693 }
Shaun Nelson 10:658720d51610 694
Shaun Nelson 10:658720d51610 695 #elif defined(MTDOT_UDK)
Shaun Nelson 10:658720d51610 696
Shaun Nelson 12:ad92bbb6312f 697 void ReceiveData(std::vector<uint8_t> frame)
Shaun Nelson 12:ad92bbb6312f 698 {
Shaun Nelson 14:07ff01da6bbf 699 uint16_t value;
Shaun Nelson 14:07ff01da6bbf 700
Shaun Nelson 14:07ff01da6bbf 701 if(frame.size() >= 2)
Shaun Nelson 14:07ff01da6bbf 702 {
Shaun Nelson 14:07ff01da6bbf 703 value = frame[0] << 8 | frame[1];
Shaun Nelson 14:07ff01da6bbf 704 if(value == position_value)
Shaun Nelson 14:07ff01da6bbf 705 {
Shaun Nelson 14:07ff01da6bbf 706 reflected_value = value;
Shaun Nelson 19:62f4a6bae943 707 // Turn LED on to indicate server in agreement
Shaun Nelson 19:62f4a6bae943 708 SYNC_LED=SYNC_LED_OK;
Shaun Nelson 14:07ff01da6bbf 709 }
Shaun Nelson 14:07ff01da6bbf 710 }
Shaun Nelson 12:ad92bbb6312f 711 }
Shaun Nelson 12:ad92bbb6312f 712
Shaun Nelson 10:658720d51610 713 void BoardInit()
Shaun Nelson 10:658720d51610 714 {
Shaun Nelson 10:658720d51610 715 debugUART.baud(115200);
Shaun Nelson 10:658720d51610 716
Shaun Nelson 10:658720d51610 717 // ST X-NUCLEO-IKS01A1 MEMS Shield
Shaun Nelson 12:ad92bbb6312f 718 mems_shield = X_NUCLEO_IKS01A1::Instance(NULL, NC);
Shaun Nelson 12:ad92bbb6312f 719 // mems_shield = X_NUCLEO_IKS01A1::Instance();
Shaun Nelson 10:658720d51610 720 }
Shaun Nelson 10:658720d51610 721
Shaun Nelson 10:658720d51610 722 void PostJoinInit() { }
Shaun Nelson 10:658720d51610 723
Shaun Nelson 10:658720d51610 724
Shaun Nelson 10:658720d51610 725 void ReadSensors(BoardSensorData &data)
Shaun Nelson 10:658720d51610 726 {
Shaun Nelson 10:658720d51610 727 uint32_t ret = 0;
Shaun Nelson 10:658720d51610 728 int32_t accel_data[3];
Shaun Nelson 10:658720d51610 729
Shaun Nelson 10:658720d51610 730 // Temperature
Shaun Nelson 10:658720d51610 731 ret |= (!CALL_METH(mems_shield->pt_sensor, GetTemperature, &data.temperature, 0.0f) ? 0x0 : 0x1);
Shaun Nelson 10:658720d51610 732
Shaun Nelson 10:658720d51610 733 // Pressure
Shaun Nelson 10:658720d51610 734 ret |= (!CALL_METH(mems_shield->pt_sensor, GetPressure, &data.pressure, 0.0f) ? 0x0 : 0x1);
Shaun Nelson 10:658720d51610 735
Shaun Nelson 10:658720d51610 736 // Accelerometer
Shaun Nelson 10:658720d51610 737 MotionSensor *motionSensor = mems_shield->GetAccelerometer();
Shaun Nelson 10:658720d51610 738 if( motionSensor != NULL)
Shaun Nelson 10:658720d51610 739 {
Shaun Nelson 10:658720d51610 740 motionSensor->Get_X_Axes(accel_data);
Shaun Nelson 10:658720d51610 741
Shaun Nelson 10:658720d51610 742 data.accel_x = accel_data[0];
Shaun Nelson 10:658720d51610 743 data.accel_y = accel_data[1];
Shaun Nelson 10:658720d51610 744 data.accel_z = accel_data[2];
Shaun Nelson 14:07ff01da6bbf 745 /* z-axis : > 0 = rightside up, < 0 upside down
Shaun Nelson 14:07ff01da6bbf 746 * x-axis: com LED to the left x < 0, x > 0 on the right
Shaun Nelson 14:07ff01da6bbf 747 * y-axis: y > 0 COM LED down, y < 0 COM LED up
Shaun Nelson 14:07ff01da6bbf 748 */
Shaun Nelson 14:07ff01da6bbf 749 bool up = false;
Shaun Nelson 14:07ff01da6bbf 750 bool down = false;
Shaun Nelson 14:07ff01da6bbf 751 bool right = false;
Shaun Nelson 14:07ff01da6bbf 752 bool left = false;
Shaun Nelson 14:07ff01da6bbf 753 bool horizontal = false;
Shaun Nelson 14:07ff01da6bbf 754 bool upsidedown = false;
Shaun Nelson 14:07ff01da6bbf 755 uint16_t next_value = 0;
Shaun Nelson 14:07ff01da6bbf 756
Shaun Nelson 14:07ff01da6bbf 757 // rightside up
Shaun Nelson 14:07ff01da6bbf 758 if(data.accel_z >= 750)
Shaun Nelson 14:07ff01da6bbf 759 {
Shaun Nelson 14:07ff01da6bbf 760 horizontal = true;
Shaun Nelson 14:07ff01da6bbf 761 }
Shaun Nelson 14:07ff01da6bbf 762 // upside down
Shaun Nelson 14:07ff01da6bbf 763 else if(data.accel_z <= -750)
Shaun Nelson 14:07ff01da6bbf 764 {
Shaun Nelson 14:07ff01da6bbf 765 horizontal = true;
Shaun Nelson 14:07ff01da6bbf 766 upsidedown = true;
Shaun Nelson 14:07ff01da6bbf 767 position_value = (2 << 12) | (1 << 8);
Shaun Nelson 14:07ff01da6bbf 768 }
Shaun Nelson 14:07ff01da6bbf 769 // vertical down
Shaun Nelson 14:07ff01da6bbf 770 else if(data.accel_y >= 900 )
Shaun Nelson 14:07ff01da6bbf 771 {
Shaun Nelson 14:07ff01da6bbf 772 down = true;
Shaun Nelson 14:07ff01da6bbf 773 }
Shaun Nelson 14:07ff01da6bbf 774 // vertical up
Shaun Nelson 14:07ff01da6bbf 775 else if(data.accel_y <= -900 )
Shaun Nelson 14:07ff01da6bbf 776 {
Shaun Nelson 14:07ff01da6bbf 777 up = true;
Shaun Nelson 14:07ff01da6bbf 778 }
Shaun Nelson 14:07ff01da6bbf 779 // side right
Shaun Nelson 14:07ff01da6bbf 780 else if(data.accel_x > 900)
Shaun Nelson 14:07ff01da6bbf 781 {
Shaun Nelson 14:07ff01da6bbf 782 right = true;
Shaun Nelson 14:07ff01da6bbf 783 }
Shaun Nelson 14:07ff01da6bbf 784 // side left
Shaun Nelson 14:07ff01da6bbf 785 else
Shaun Nelson 14:07ff01da6bbf 786 {
Shaun Nelson 14:07ff01da6bbf 787 left = true;
Shaun Nelson 14:07ff01da6bbf 788 }
Shaun Nelson 14:07ff01da6bbf 789
Shaun Nelson 14:07ff01da6bbf 790 if(horizontal)
Shaun Nelson 14:07ff01da6bbf 791 {
Shaun Nelson 14:07ff01da6bbf 792 next_value = (2 << 12) | (upsidedown << 8);
Shaun Nelson 14:07ff01da6bbf 793 }
Shaun Nelson 14:07ff01da6bbf 794 else
Shaun Nelson 14:07ff01da6bbf 795 {
Shaun Nelson 14:07ff01da6bbf 796 next_value = (up << 12) | (left << 8) | (down << 4) | right;
Shaun Nelson 14:07ff01da6bbf 797 }
Shaun Nelson 14:07ff01da6bbf 798
Shaun Nelson 14:07ff01da6bbf 799 if(next_value != position_value)
Shaun Nelson 14:07ff01da6bbf 800 {
Shaun Nelson 14:07ff01da6bbf 801 position_value = next_value;
Shaun Nelson 14:07ff01da6bbf 802 position_changed = true;
Shaun Nelson 22:d3a56f5a949c 803
Shaun Nelson 22:d3a56f5a949c 804 // Set reflected_value to an out of range value to stay
Shaun Nelson 22:d3a56f5a949c 805 // in fast transmit mode until server responds
Shaun Nelson 22:d3a56f5a949c 806 reflected_value = 0;
Shaun Nelson 19:62f4a6bae943 807
Shaun Nelson 19:62f4a6bae943 808 // Turn LED off to indicate server is not in agreement
Shaun Nelson 19:62f4a6bae943 809 SYNC_LED=SYNC_LED_OOS;
Shaun Nelson 14:07ff01da6bbf 810 }
Shaun Nelson 10:658720d51610 811 }
Shaun Nelson 10:658720d51610 812
Shaun Nelson 14:07ff01da6bbf 813 printf("%s: position_value=%04x, reflected_value=%04x\r\n",__func__, position_value, reflected_value);
Shaun Nelson 10:658720d51610 814 }
Shaun Nelson 10:658720d51610 815
Shaun Nelson 12:ad92bbb6312f 816 uint32_t PrepareFrame(std::vector<uint8_t> &frame, BoardSensorData &data)
Shaun Nelson 10:658720d51610 817 {
Shaun Nelson 14:07ff01da6bbf 818 static uint8_t buffer[64];
Shaun Nelson 14:07ff01da6bbf 819
Shaun Nelson 14:07ff01da6bbf 820 frame.clear();
Shaun Nelson 10:658720d51610 821
Shaun Nelson 10:658720d51610 822 // Sensor packet type serialized to the LMIC frame buffer
Shaun Nelson 14:07ff01da6bbf 823 SensorPacket packet(buffer, sizeof(buffer));
Shaun Nelson 10:658720d51610 824
Shaun Nelson 17:162e42587b4d 825 #ifdef REFLECT_FAST_TX
Shaun Nelson 17:162e42587b4d 826 if( position_changed || (reflected_value != position_value) || ( ( sample_period % SEND_PERIOD ) == 0 ) )
Shaun Nelson 17:162e42587b4d 827 #else
Shaun Nelson 17:162e42587b4d 828 if( position_changed || ( ( sample_period % SEND_PERIOD ) == 0 ) )
Shaun Nelson 17:162e42587b4d 829 #endif
Shaun Nelson 14:07ff01da6bbf 830 {
Shaun Nelson 14:07ff01da6bbf 831 packet.setPrimarySensor(position_value);
Shaun Nelson 14:07ff01da6bbf 832 packet.setTemperature(data.temperature);
Shaun Nelson 14:07ff01da6bbf 833 packet.setPressure(data.pressure);
Shaun Nelson 14:07ff01da6bbf 834
Shaun Nelson 14:07ff01da6bbf 835 // Serialize packet
Shaun Nelson 14:07ff01da6bbf 836 packet.serialize();
Shaun Nelson 10:658720d51610 837
Shaun Nelson 14:07ff01da6bbf 838 frame.assign(packet.payload(), packet.payload() + packet.length());
Shaun Nelson 14:07ff01da6bbf 839 }
Shaun Nelson 10:658720d51610 840
Shaun Nelson 10:658720d51610 841 return frame.size();
Shaun Nelson 10:658720d51610 842 }
Shaun Nelson 10:658720d51610 843
Shaun Nelson 12:ad92bbb6312f 844 bool checkForExit(bool _exit) { return false;}
Shaun Nelson 12:ad92bbb6312f 845
Shaun Nelson 12:ad92bbb6312f 846
Shaun Nelson 12:ad92bbb6312f 847 void ExitingProgram()
Shaun Nelson 12:ad92bbb6312f 848 {
Shaun Nelson 12:ad92bbb6312f 849 printf("Exiting\n\r");
Shaun Nelson 12:ad92bbb6312f 850 }
Shaun Nelson 12:ad92bbb6312f 851
Shaun Nelson 10:658720d51610 852 #else
Shaun Nelson 10:658720d51610 853 #error Board type not defined!
Shaun Nelson 10:658720d51610 854 #endif
Shaun Nelson 10:658720d51610 855
Shaun Nelson 14:07ff01da6bbf 856 void joinLedToggle()
Shaun Nelson 14:07ff01da6bbf 857 {
Shaun Nelson 19:62f4a6bae943 858 JOIN_LED = !JOIN_LED;
Shaun Nelson 14:07ff01da6bbf 859 }
Shaun Nelson 14:07ff01da6bbf 860
Shaun Nelson 10:658720d51610 861 void mDotConfigureAndJoin()
Shaun Nelson 10:658720d51610 862 {
Shaun Nelson 12:ad92bbb6312f 863 bool ok;
Shaun Nelson 12:ad92bbb6312f 864 int32_t mdot_ret;
Shaun Nelson 12:ad92bbb6312f 865
Shaun Nelson 12:ad92bbb6312f 866 printf("Configuring mDot\r\n");
Shaun Nelson 10:658720d51610 867
Shaun Nelson 10:658720d51610 868 // get mDot handle
Shaun Nelson 10:658720d51610 869 mdot_radio = mDot::getInstance();
Shaun Nelson 10:658720d51610 870 if(mdot_radio == NULL)
Shaun Nelson 10:658720d51610 871 {
Shaun Nelson 10:658720d51610 872 while(1) {
Shaun Nelson 10:658720d51610 873 printf("radio setup failed\n\r");
Shaun Nelson 10:658720d51610 874 osDelay(1000);
Shaun Nelson 10:658720d51610 875 }
Shaun Nelson 10:658720d51610 876 }
Shaun Nelson 10:658720d51610 877
Shaun Nelson 10:658720d51610 878 do{
Shaun Nelson 10:658720d51610 879 ok = true;
Shaun Nelson 10:658720d51610 880
Shaun Nelson 10:658720d51610 881 printf("\n\r setup mdot\n\r");
Shaun Nelson 10:658720d51610 882
Shaun Nelson 10:658720d51610 883 // reset to default config so we know what state we're in
Shaun Nelson 10:658720d51610 884 mdot_radio->resetConfig();
Shaun Nelson 14:07ff01da6bbf 885 //mdot_radio->setLogLevel(6);
Shaun Nelson 10:658720d51610 886
Shaun Nelson 10:658720d51610 887 mdot_radio->setAntennaGain(-3);
Shaun Nelson 10:658720d51610 888
Shaun Nelson 10:658720d51610 889 // Setting up LED1 as activity LED
shaunkrnelson 16:7b3cc3221db1 890 #ifdef MTDOT_EVB
Shaun Nelson 10:658720d51610 891 mdot_radio->setActivityLedPin(PB_0);
Shaun Nelson 10:658720d51610 892 mdot_radio->setActivityLedEnable(true);
Shaun Nelson 10:658720d51610 893 #endif
Shaun Nelson 10:658720d51610 894
Shaun Nelson 10:658720d51610 895 // Read node ID
Shaun Nelson 10:658720d51610 896 std::vector<uint8_t> mdot_EUI;
Shaun Nelson 10:658720d51610 897 mdot_EUI = mdot_radio->getDeviceId();
Shaun Nelson 10:658720d51610 898 printf("mDot EUI = ");
Shaun Nelson 10:658720d51610 899
Shaun Nelson 10:658720d51610 900 for (uint8_t i=0; i<mdot_EUI.size(); i++) {
Shaun Nelson 10:658720d51610 901 printf("%02x ", mdot_EUI[i]);
Shaun Nelson 10:658720d51610 902 }
Shaun Nelson 12:ad92bbb6312f 903 printf("\n\r");
Shaun Nelson 12:ad92bbb6312f 904
Shaun Nelson 10:658720d51610 905
Shaun Nelson 12:ad92bbb6312f 906 /*
Shaun Nelson 12:ad92bbb6312f 907 * This call sets up private or public mode on the MTDOT. Set the function to true if
Shaun Nelson 12:ad92bbb6312f 908 * connecting to a public network
Shaun Nelson 12:ad92bbb6312f 909 */
Shaun Nelson 10:658720d51610 910 printf("setting Public Network Mode\r\n");
Shaun Nelson 10:658720d51610 911 if ((mdot_ret = mdot_radio->setPublicNetwork(true)) != mDot::MDOT_OK) {
Shaun Nelson 10:658720d51610 912 log_error(mdot_radio, "failed to set Public Network Mode", mdot_ret);
Shaun Nelson 10:658720d51610 913 }
shaunkrnelson 25:a5860d250e79 914 mdot_radio->setTxDataRate(DATARATE);
Shaun Nelson 10:658720d51610 915 mdot_radio->setTxPower(14);
Shaun Nelson 10:658720d51610 916 mdot_radio->setJoinRetries(1);
Shaun Nelson 12:ad92bbb6312f 917 mdot_radio->setJoinMode(mDot::OTA);
Shaun Nelson 10:658720d51610 918
Shaun Nelson 12:ad92bbb6312f 919 /*
Shaun Nelson 12:ad92bbb6312f 920 * Frequency sub-band is valid for NAM only and for Private networks should be set to a value
Shaun Nelson 12:ad92bbb6312f 921 * between 1-8 that matches the the LoRa gateway setting. Public networks use sub-band 0 only.
Shaun Nelson 12:ad92bbb6312f 922 * This function can be commented out for EU networks
Shaun Nelson 12:ad92bbb6312f 923 */
Shaun Nelson 10:658720d51610 924 printf("setting frequency sub band\r\n");
Shaun Nelson 12:ad92bbb6312f 925 if ((mdot_ret = mdot_radio->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
Shaun Nelson 10:658720d51610 926 log_error(mdot_radio, "failed to set frequency sub band", mdot_ret);
Shaun Nelson 10:658720d51610 927 ok = false;
Shaun Nelson 10:658720d51610 928 }
Shaun Nelson 10:658720d51610 929
Shaun Nelson 10:658720d51610 930 printf("setting ADR\r\n");
Shaun Nelson 10:658720d51610 931 if ((mdot_ret = mdot_radio->setAdr(config_adr_on)) != mDot::MDOT_OK) {
Shaun Nelson 10:658720d51610 932 log_error(mdot_radio, "failed to set ADR", mdot_ret);
Shaun Nelson 10:658720d51610 933 ok = false;
Shaun Nelson 10:658720d51610 934 }
Shaun Nelson 12:ad92bbb6312f 935
Shaun Nelson 12:ad92bbb6312f 936 /*
Shaun Nelson 12:ad92bbb6312f 937 * setNetworkName is used for private networks.
Shaun Nelson 12:ad92bbb6312f 938 * Use setNetworkID(AppID) for public networks
Shaun Nelson 12:ad92bbb6312f 939 */
Shaun Nelson 10:658720d51610 940 printf("setting network name\r\n");
Shaun Nelson 10:658720d51610 941 if ((mdot_ret = mdot_radio->setNetworkId(config_app_id)) != mDot::MDOT_OK) {
Shaun Nelson 10:658720d51610 942 log_error(mdot_radio, "failed to set network name", mdot_ret);
Shaun Nelson 10:658720d51610 943 ok = false;
Shaun Nelson 10:658720d51610 944 }
Shaun Nelson 10:658720d51610 945
Shaun Nelson 12:ad92bbb6312f 946 /*
Shaun Nelson 12:ad92bbb6312f 947 * setNetworkPassphrase is used for private networks
Shaun Nelson 12:ad92bbb6312f 948 * Use setNetworkKey for public networks
Shaun Nelson 12:ad92bbb6312f 949 */
Shaun Nelson 12:ad92bbb6312f 950 printf("setting network key\r\n");
Shaun Nelson 10:658720d51610 951 if ((mdot_ret = mdot_radio->setNetworkKey(config_app_key)) != mDot::MDOT_OK) {
Shaun Nelson 10:658720d51610 952 log_error(mdot_radio, "failed to set network password", mdot_ret);
Shaun Nelson 10:658720d51610 953 ok = false;
Shaun Nelson 10:658720d51610 954 }
Shaun Nelson 12:ad92bbb6312f 955
Shaun Nelson 12:ad92bbb6312f 956 checkForExit(true);
Shaun Nelson 12:ad92bbb6312f 957
Shaun Nelson 10:658720d51610 958 }while(ok == false);
Shaun Nelson 12:ad92bbb6312f 959
Shaun Nelson 14:07ff01da6bbf 960 joinTicker.attach(joinLedToggle,1);
Shaun Nelson 14:07ff01da6bbf 961
Shaun Nelson 14:07ff01da6bbf 962 // attempt to join the network
Shaun Nelson 14:07ff01da6bbf 963 printf("joining network\r\n");
Shaun Nelson 14:07ff01da6bbf 964 while ((mdot_ret = mdot_radio->joinNetwork()) != mDot::MDOT_OK) {
Shaun Nelson 14:07ff01da6bbf 965 log_error(mdot_radio,"failed to join network:", mdot_ret);
Shaun Nelson 14:07ff01da6bbf 966 if (mdot_radio->getFrequencyBand() == mDot::FB_868){
Shaun Nelson 14:07ff01da6bbf 967 mdot_ret = mdot_radio->getNextTxMs();
Shaun Nelson 14:07ff01da6bbf 968 }
Shaun Nelson 14:07ff01da6bbf 969 else {
Shaun Nelson 14:07ff01da6bbf 970 mdot_ret = 0;
Shaun Nelson 14:07ff01da6bbf 971 }
Shaun Nelson 14:07ff01da6bbf 972 checkForExit(true);
Shaun Nelson 14:07ff01da6bbf 973 printf("delay = %lu\n\r",mdot_ret);
Shaun Nelson 14:07ff01da6bbf 974 osDelay(mdot_ret + 10000);
Shaun Nelson 14:07ff01da6bbf 975 }
Shaun Nelson 14:07ff01da6bbf 976 printf("network joined\r\n");
Shaun Nelson 10:658720d51610 977
Shaun Nelson 14:07ff01da6bbf 978 joinTicker.detach();
Shaun Nelson 19:62f4a6bae943 979 JOIN_LED=1;
Shaun Nelson 10:658720d51610 980 }
Shaun Nelson 10:658720d51610 981
Shaun Nelson 12:ad92bbb6312f 982
Shaun Nelson 10:658720d51610 983 int main()
Shaun Nelson 10:658720d51610 984 {
Shaun Nelson 10:658720d51610 985 BoardSensorData sensorData;
Shaun Nelson 12:ad92bbb6312f 986 std::vector<uint8_t> frame;
Shaun Nelson 10:658720d51610 987
Shaun Nelson 10:658720d51610 988 // Board specific initialization
Shaun Nelson 10:658720d51610 989 BoardInit();
Shaun Nelson 10:658720d51610 990
Shaun Nelson 12:ad92bbb6312f 991 // Configure mDot and join
Shaun Nelson 12:ad92bbb6312f 992 mDotConfigureAndJoin();
Shaun Nelson 10:658720d51610 993
Shaun Nelson 12:ad92bbb6312f 994 // Do board specific post join configuration
Shaun Nelson 12:ad92bbb6312f 995 PostJoinInit();
falingtrea 2:75adc72aa6a0 996
falingtrea 2:75adc72aa6a0 997 /*
falingtrea 0:bdd16076aaa5 998 * Main data acquisition loop
falingtrea 0:bdd16076aaa5 999 */
Shaun Nelson 14:07ff01da6bbf 1000 while(!checkForExit(false))
Shaun Nelson 14:07ff01da6bbf 1001 {
Shaun Nelson 17:162e42587b4d 1002 if( PERIOD_DELAY > 0 )
Shaun Nelson 17:162e42587b4d 1003 osDelay( PERIOD_DELAY );
Shaun Nelson 12:ad92bbb6312f 1004
Shaun Nelson 14:07ff01da6bbf 1005 // Minimum delay between sampling
Shaun Nelson 17:162e42587b4d 1006 if( ( sample_period % FAST_SEND_PERIOD ) == 0 )
Shaun Nelson 14:07ff01da6bbf 1007 {
Shaun Nelson 14:07ff01da6bbf 1008 // Acquire sensor values
Shaun Nelson 14:07ff01da6bbf 1009 ReadSensors(sensorData);
Shaun Nelson 14:07ff01da6bbf 1010
Shaun Nelson 14:07ff01da6bbf 1011 // Generate frame if send conditions are satisified
Shaun Nelson 14:07ff01da6bbf 1012 if( PrepareFrame(frame, sensorData) > 0 )
Shaun Nelson 14:07ff01da6bbf 1013 {
Shaun Nelson 14:07ff01da6bbf 1014 // Send sensor packets
Shaun Nelson 14:07ff01da6bbf 1015 SendFrame( frame );
Shaun Nelson 14:07ff01da6bbf 1016 }
Shaun Nelson 10:658720d51610 1017 }
Shaun Nelson 14:07ff01da6bbf 1018 sample_period++;
Shaun Nelson 14:07ff01da6bbf 1019 }
falingtrea 3:68e974f5f532 1020
Shaun Nelson 12:ad92bbb6312f 1021 ExitingProgram();
falingtrea 3:68e974f5f532 1022 }