BTLE demo for MAXWSNENV.

Dependencies:   BLE_API BMP180 Si7020 mbed MaximBLE

Committer:
kgills
Date:
Fri Jul 10 21:28:56 2015 +0000
Revision:
0:f71931ae3db1
Child:
1:1876781d537e
Adding MAXWSNENV_demo.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kgills 0:f71931ae3db1 1 /*******************************************************************************
kgills 0:f71931ae3db1 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
kgills 0:f71931ae3db1 3 *
kgills 0:f71931ae3db1 4 * Permission is hereby granted, free of charge, to any person obtaining a
kgills 0:f71931ae3db1 5 * copy of this software and associated documentation files (the "Software"),
kgills 0:f71931ae3db1 6 * to deal in the Software without restriction, including without limitation
kgills 0:f71931ae3db1 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
kgills 0:f71931ae3db1 8 * and/or sell copies of the Software, and to permit persons to whom the
kgills 0:f71931ae3db1 9 * Software is furnished to do so, subject to the following conditions:
kgills 0:f71931ae3db1 10 *
kgills 0:f71931ae3db1 11 * The above copyright notice and this permission notice shall be included
kgills 0:f71931ae3db1 12 * in all copies or substantial portions of the Software.
kgills 0:f71931ae3db1 13 *
kgills 0:f71931ae3db1 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
kgills 0:f71931ae3db1 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kgills 0:f71931ae3db1 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
kgills 0:f71931ae3db1 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
kgills 0:f71931ae3db1 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
kgills 0:f71931ae3db1 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
kgills 0:f71931ae3db1 20 * OTHER DEALINGS IN THE SOFTWARE.
kgills 0:f71931ae3db1 21 *
kgills 0:f71931ae3db1 22 * Except as contained in this notice, the name of Maxim Integrated
kgills 0:f71931ae3db1 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
kgills 0:f71931ae3db1 24 * Products, Inc. Branding Policy.
kgills 0:f71931ae3db1 25 *
kgills 0:f71931ae3db1 26 * The mere transfer of this software does not imply any licenses
kgills 0:f71931ae3db1 27 * of trade secrets, proprietary technology, copyrights, patents,
kgills 0:f71931ae3db1 28 * trademarks, maskwork rights, or any other form of intellectual
kgills 0:f71931ae3db1 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
kgills 0:f71931ae3db1 30 * ownership rights.
kgills 0:f71931ae3db1 31 *******************************************************************************
kgills 0:f71931ae3db1 32 */
kgills 0:f71931ae3db1 33
kgills 0:f71931ae3db1 34 #include <string.h>
kgills 0:f71931ae3db1 35 #include "mbed.h"
kgills 0:f71931ae3db1 36 #include "btle_addr.h"
kgills 0:f71931ae3db1 37 #include "BLE.h"
kgills 0:f71931ae3db1 38 #include "DeviceInformationService.h"
kgills 0:f71931ae3db1 39 #include "EnvironmentalService.h"
kgills 0:f71931ae3db1 40 #include "CurrentTimeService.h"
kgills 0:f71931ae3db1 41 #include "BMP180.h"
kgills 0:f71931ae3db1 42 #include "Si7020.h"
kgills 0:f71931ae3db1 43 #include "LED.h"
kgills 0:f71931ae3db1 44 #include "pwrseq_regs.h"
kgills 0:f71931ae3db1 45 #include "pwrman_regs.h"
kgills 0:f71931ae3db1 46 #include "ioman_regs.h"
kgills 0:f71931ae3db1 47
kgills 0:f71931ae3db1 48 #define DEMO_DURATION 30 // sec
kgills 0:f71931ae3db1 49 #define SENSOR_DEMO_PERIOD 1 // sec
kgills 0:f71931ae3db1 50 #define NORMAL_SENSOR_PERIOD 60 // sec
kgills 0:f71931ae3db1 51 #define SENSOR_DELAY_US 30000 // usec
kgills 0:f71931ae3db1 52
kgills 0:f71931ae3db1 53 // in multiples of 0.625ms.
kgills 0:f71931ae3db1 54 #define ADVERT_HIGH_PERIOD 1600 // 1000ms
kgills 0:f71931ae3db1 55 #define ADVERT_LOW_PERIOD 8000 // 5000ms
kgills 0:f71931ae3db1 56 #define BLE_UPDATE_DURATION 20 // sec
kgills 0:f71931ae3db1 57
kgills 0:f71931ae3db1 58 #define PIN_NUMBER(pinname) ((PINNAME_TO_PORT(pinname) << 3) + PINNAME_TO_PIN(pinname))
kgills 0:f71931ae3db1 59 #define PIN_MASK(pinname) (1 << PIN_NUMBER(pinname))
kgills 0:f71931ae3db1 60
kgills 0:f71931ae3db1 61 #ifdef BTLE_PWR
kgills 0:f71931ae3db1 62 DigitalOut ble_pwr(BTLE_PWR, PWR_ON);
kgills 0:f71931ae3db1 63 #endif
kgills 0:f71931ae3db1 64
kgills 0:f71931ae3db1 65 // User I/O objects
kgills 0:f71931ae3db1 66 DigitalIn sw1(SW1);
kgills 0:f71931ae3db1 67 DigitalOut red(LED_RED, LED_OFF);
kgills 0:f71931ae3db1 68 DigitalOut blue(LED_BLUE, LED_OFF);
kgills 0:f71931ae3db1 69
kgills 0:f71931ae3db1 70 // BLE Objects
kgills 0:f71931ae3db1 71 static BLE ble;
kgills 0:f71931ae3db1 72 static DeviceInformationService *devInfoService;
kgills 0:f71931ae3db1 73 static EnvironmentalService *envService;
kgills 0:f71931ae3db1 74 static CurrentTimeService *timeService;
kgills 0:f71931ae3db1 75 static LowPowerTimeout bleUpdateTimeout;
kgills 0:f71931ae3db1 76 static const char DEVICE_NAME[] = "Environmental Board";
kgills 0:f71931ae3db1 77 static const uint16_t uuid16_list[] = {GattService::UUID_DEVICE_INFORMATION_SERVICE};
kgills 0:f71931ae3db1 78 static const Gap::ConnectionParams_t paramsLowPower = {
kgills 0:f71931ae3db1 79 400, /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
kgills 0:f71931ae3db1 80 400, /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
kgills 0:f71931ae3db1 81 60, /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
kgills 0:f71931ae3db1 82 3100 /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
kgills 0:f71931ae3db1 83 };
kgills 0:f71931ae3db1 84 static Gap::Handle_t connHandle = 0;
kgills 0:f71931ae3db1 85 static bool connUpdateRequested;
kgills 0:f71931ae3db1 86
kgills 0:f71931ae3db1 87 // Sensor objects
kgills 0:f71931ae3db1 88 I2C i2c(I2C_SDA, I2C_SCL);
kgills 0:f71931ae3db1 89 BMP180 bmp180(&i2c);
kgills 0:f71931ae3db1 90 Si7020 si7020(&i2c);
kgills 0:f71931ae3db1 91 static LowPowerTimeout sampleTimeout;
kgills 0:f71931ae3db1 92 static LowPowerTicker sampleTicker;
kgills 0:f71931ae3db1 93 static LowPowerTimeout demoTimeout;
kgills 0:f71931ae3db1 94 static bool demoMode;
kgills 0:f71931ae3db1 95
kgills 0:f71931ae3db1 96 static void bleUpdateCallback(void);
kgills 0:f71931ae3db1 97
kgills 0:f71931ae3db1 98 // *****************************************************************************
kgills 0:f71931ae3db1 99 static void sampleComplete(void)
kgills 0:f71931ae3db1 100 {
kgills 0:f71931ae3db1 101 int currentPressure;
kgills 0:f71931ae3db1 102 float currentHumidity;
kgills 0:f71931ae3db1 103 float currentTemperature;
kgills 0:f71931ae3db1 104 time_t currentTime;
kgills 0:f71931ae3db1 105
kgills 0:f71931ae3db1 106 red = LED_OFF;
kgills 0:f71931ae3db1 107 blue = LED_OFF;
kgills 0:f71931ae3db1 108
kgills 0:f71931ae3db1 109 // Update timestamp
kgills 0:f71931ae3db1 110 currentTime = time(NULL);
kgills 0:f71931ae3db1 111 if (demoMode) {
kgills 0:f71931ae3db1 112 printf("\n%s", ctime(&currentTime));
kgills 0:f71931ae3db1 113 }
kgills 0:f71931ae3db1 114
kgills 0:f71931ae3db1 115 /* Get next pressure reading, can be oversampled */
kgills 0:f71931ae3db1 116 if(bmp180.getPressure(&currentPressure) != 0) {
kgills 0:f71931ae3db1 117 printf("Error getting pressure\n");
kgills 0:f71931ae3db1 118 } else {
kgills 0:f71931ae3db1 119 envService->updatePressure((float)(currentPressure)/1000.0, currentTime);
kgills 0:f71931ae3db1 120 if (demoMode) {
kgills 0:f71931ae3db1 121 printf("Press = %0.1f kPa\n", (float)(currentPressure/1000.0));
kgills 0:f71931ae3db1 122 }
kgills 0:f71931ae3db1 123 }
kgills 0:f71931ae3db1 124
kgills 0:f71931ae3db1 125 // Get Humidity
kgills 0:f71931ae3db1 126 if(si7020.checkHumidity(&currentHumidity) != 0) {
kgills 0:f71931ae3db1 127 printf("Error getting humidity\n");
kgills 0:f71931ae3db1 128 } else {
kgills 0:f71931ae3db1 129 envService->updateHumidity(currentHumidity, currentTime);
kgills 0:f71931ae3db1 130 if (demoMode) {
kgills 0:f71931ae3db1 131 printf("Humid = %0.1f %%\n", currentHumidity);
kgills 0:f71931ae3db1 132 }
kgills 0:f71931ae3db1 133 }
kgills 0:f71931ae3db1 134
kgills 0:f71931ae3db1 135 // Get temperature
kgills 0:f71931ae3db1 136 if(si7020.getPrevTemperature(&currentTemperature) != 0) {
kgills 0:f71931ae3db1 137 printf("Error getting temperature\n");
kgills 0:f71931ae3db1 138 } else {
kgills 0:f71931ae3db1 139 envService->updateTemperature(currentTemperature, currentTime);
kgills 0:f71931ae3db1 140 if (demoMode) {
kgills 0:f71931ae3db1 141 printf("Temp = %0.1f C\n", currentTemperature);
kgills 0:f71931ae3db1 142 }
kgills 0:f71931ae3db1 143 }
kgills 0:f71931ae3db1 144
kgills 0:f71931ae3db1 145 // Update the CurrentTime characteristic value
kgills 0:f71931ae3db1 146 timeService->updateCurrentTimeValue();
kgills 0:f71931ae3db1 147 }
kgills 0:f71931ae3db1 148
kgills 0:f71931ae3db1 149 // *****************************************************************************
kgills 0:f71931ae3db1 150 static void sampleStart(void)
kgills 0:f71931ae3db1 151 {
kgills 0:f71931ae3db1 152 if (demoMode) {
kgills 0:f71931ae3db1 153 // Blink red LED if connected, blue if disconnected
kgills 0:f71931ae3db1 154 if (ble.getGapState().connected) {
kgills 0:f71931ae3db1 155 red = LED_ON;
kgills 0:f71931ae3db1 156 blue = LED_OFF;
kgills 0:f71931ae3db1 157 } else {
kgills 0:f71931ae3db1 158 blue = LED_ON;
kgills 0:f71931ae3db1 159 red = LED_OFF;
kgills 0:f71931ae3db1 160 }
kgills 0:f71931ae3db1 161 }
kgills 0:f71931ae3db1 162
kgills 0:f71931ae3db1 163 // Start pressure conversion
kgills 0:f71931ae3db1 164 bmp180.startPressure(BMP180::STANDARD);
kgills 0:f71931ae3db1 165
kgills 0:f71931ae3db1 166 /* Start taking measurement for next reading*/
kgills 0:f71931ae3db1 167 si7020.startHumidity();
kgills 0:f71931ae3db1 168
kgills 0:f71931ae3db1 169 // Set timeout to read sensors and sample
kgills 0:f71931ae3db1 170 sampleTimeout.attach_us(sampleComplete, SENSOR_DELAY_US);
kgills 0:f71931ae3db1 171 }
kgills 0:f71931ae3db1 172
kgills 0:f71931ae3db1 173 // *****************************************************************************
kgills 0:f71931ae3db1 174 static void setAdvertising(uint16_t interval)
kgills 0:f71931ae3db1 175 {
kgills 0:f71931ae3db1 176 static uint16_t currentInterval = 0;
kgills 0:f71931ae3db1 177
kgills 0:f71931ae3db1 178 if (interval == 0) {
kgills 0:f71931ae3db1 179 ble.gap().stopAdvertising();
kgills 0:f71931ae3db1 180 currentInterval = 0;
kgills 0:f71931ae3db1 181 } else if (!ble.getGapState().connected && (interval != currentInterval)) {
kgills 0:f71931ae3db1 182 if (interval > currentInterval) {
kgills 0:f71931ae3db1 183 bleUpdateTimeout.attach(bleUpdateCallback, BLE_UPDATE_DURATION);
kgills 0:f71931ae3db1 184 }
kgills 0:f71931ae3db1 185 ble.gap().stopAdvertising();
kgills 0:f71931ae3db1 186 ble.gap().setAdvertisingInterval(interval);
kgills 0:f71931ae3db1 187 ble.gap().startAdvertising();
kgills 0:f71931ae3db1 188 currentInterval = interval;
kgills 0:f71931ae3db1 189 }
kgills 0:f71931ae3db1 190 }
kgills 0:f71931ae3db1 191
kgills 0:f71931ae3db1 192 // *****************************************************************************
kgills 0:f71931ae3db1 193 static void bleUpdateCallback(void)
kgills 0:f71931ae3db1 194 {
kgills 0:f71931ae3db1 195 if (ble.getGapState().connected) {
kgills 0:f71931ae3db1 196 // Reduce connection interval
kgills 0:f71931ae3db1 197 ble.gap().updateConnectionParams(connHandle, &paramsLowPower);
kgills 0:f71931ae3db1 198 connUpdateRequested = true;
kgills 0:f71931ae3db1 199 } else {
kgills 0:f71931ae3db1 200 // Reduce advertising interval
kgills 0:f71931ae3db1 201 setAdvertising(ADVERT_LOW_PERIOD);
kgills 0:f71931ae3db1 202 }
kgills 0:f71931ae3db1 203 }
kgills 0:f71931ae3db1 204
kgills 0:f71931ae3db1 205 // *****************************************************************************
kgills 0:f71931ae3db1 206 static void demoTimeoutCallback(void)
kgills 0:f71931ae3db1 207 {
kgills 0:f71931ae3db1 208 sampleTicker.attach(sampleStart, NORMAL_SENSOR_PERIOD);
kgills 0:f71931ae3db1 209 demoMode = false;
kgills 0:f71931ae3db1 210 }
kgills 0:f71931ae3db1 211
kgills 0:f71931ae3db1 212 // *****************************************************************************
kgills 0:f71931ae3db1 213 static void demoStart(void)
kgills 0:f71931ae3db1 214 {
kgills 0:f71931ae3db1 215 sampleTicker.attach(sampleStart, SENSOR_DEMO_PERIOD);
kgills 0:f71931ae3db1 216 demoMode = true;
kgills 0:f71931ae3db1 217
kgills 0:f71931ae3db1 218 if (!ble.getGapState().connected) {
kgills 0:f71931ae3db1 219 // Increase advertising interval
kgills 0:f71931ae3db1 220 setAdvertising(ADVERT_HIGH_PERIOD);
kgills 0:f71931ae3db1 221 }
kgills 0:f71931ae3db1 222
kgills 0:f71931ae3db1 223 demoTimeout.attach(demoTimeoutCallback, DEMO_DURATION);
kgills 0:f71931ae3db1 224 }
kgills 0:f71931ae3db1 225
kgills 0:f71931ae3db1 226 // *****************************************************************************
kgills 0:f71931ae3db1 227 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
kgills 0:f71931ae3db1 228 {
kgills 0:f71931ae3db1 229 /* Record handle and connection settings */
kgills 0:f71931ae3db1 230 connHandle = params->handle;
kgills 0:f71931ae3db1 231 setAdvertising(0);
kgills 0:f71931ae3db1 232
kgills 0:f71931ae3db1 233 /* Prepare for a connection update */
kgills 0:f71931ae3db1 234 connUpdateRequested = false;
kgills 0:f71931ae3db1 235 bleUpdateTimeout.attach(bleUpdateCallback, BLE_UPDATE_DURATION);
kgills 0:f71931ae3db1 236
kgills 0:f71931ae3db1 237 printf("Connected\n");
kgills 0:f71931ae3db1 238 }
kgills 0:f71931ae3db1 239
kgills 0:f71931ae3db1 240 // *****************************************************************************
kgills 0:f71931ae3db1 241 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
kgills 0:f71931ae3db1 242 {
kgills 0:f71931ae3db1 243 /* Restart Advertising on disconnection */
kgills 0:f71931ae3db1 244 connHandle = 0;
kgills 0:f71931ae3db1 245 setAdvertising(ADVERT_HIGH_PERIOD);
kgills 0:f71931ae3db1 246 printf("Disconnected\n");
kgills 0:f71931ae3db1 247 }
kgills 0:f71931ae3db1 248
kgills 0:f71931ae3db1 249 // *****************************************************************************
kgills 0:f71931ae3db1 250 void dataReadCallback(const GattReadCallbackParams *eventDataP)
kgills 0:f71931ae3db1 251 {
kgills 0:f71931ae3db1 252 if (!connUpdateRequested) {
kgills 0:f71931ae3db1 253 /* Restart the connection update timeout */
kgills 0:f71931ae3db1 254 bleUpdateTimeout.attach(bleUpdateCallback, BLE_UPDATE_DURATION);
kgills 0:f71931ae3db1 255 }
kgills 0:f71931ae3db1 256 }
kgills 0:f71931ae3db1 257
kgills 0:f71931ae3db1 258 //******************************************************************************
kgills 0:f71931ae3db1 259 static int setGPIOWUD(PinName pinname, int act_high)
kgills 0:f71931ae3db1 260 {
kgills 0:f71931ae3db1 261 MXC_IOMAN->wud_req0 |= PIN_MASK(pinname);
kgills 0:f71931ae3db1 262 if (!(MXC_IOMAN->wud_ack0 & PIN_MASK(pinname))) {
kgills 0:f71931ae3db1 263 printf("setGPIOWUD() failed to set P%u.%u as a WUD\n", PINNAME_TO_PORT(pinname), PINNAME_TO_PIN(pinname));
kgills 0:f71931ae3db1 264 return -1;
kgills 0:f71931ae3db1 265 }
kgills 0:f71931ae3db1 266
kgills 0:f71931ae3db1 267 // Configure WUD for active high/low
kgills 0:f71931ae3db1 268 MXC_PWRMAN->wud_ctrl = (PIN_NUMBER(pinname) << MXC_F_PWRMAN_WUD_CTRL_PAD_SELECT_POS) |
kgills 0:f71931ae3db1 269 (MXC_E_PWRMAN_PAD_MODE_ACT_HI_LO << MXC_F_PWRMAN_WUD_CTRL_PAD_MODE_POS);
kgills 0:f71931ae3db1 270 if (act_high) {
kgills 0:f71931ae3db1 271 MXC_PWRMAN->wud_pulse0 = 1;
kgills 0:f71931ae3db1 272 } else {
kgills 0:f71931ae3db1 273 MXC_PWRMAN->wud_pulse1 = 1;
kgills 0:f71931ae3db1 274 }
kgills 0:f71931ae3db1 275
kgills 0:f71931ae3db1 276 // Activate WUD
kgills 0:f71931ae3db1 277 MXC_PWRMAN->wud_ctrl = (PIN_NUMBER(pinname) << MXC_F_PWRMAN_WUD_CTRL_PAD_SELECT_POS) |
kgills 0:f71931ae3db1 278 (MXC_E_PWRMAN_PAD_MODE_CLEAR_SET << MXC_F_PWRMAN_WUD_CTRL_PAD_MODE_POS);
kgills 0:f71931ae3db1 279 MXC_PWRMAN->wud_pulse1 = 1; // activate
kgills 0:f71931ae3db1 280
kgills 0:f71931ae3db1 281 // Try to clear I/O wakeup flag
kgills 0:f71931ae3db1 282 MXC_PWRSEQ->flags = MXC_F_PWRSEQ_FLAGS_PWR_IO_WAKEUP;
kgills 0:f71931ae3db1 283 if (MXC_PWRSEQ->flags & MXC_F_PWRSEQ_FLAGS_PWR_IO_WAKEUP) {
kgills 0:f71931ae3db1 284 return -1;
kgills 0:f71931ae3db1 285 }
kgills 0:f71931ae3db1 286
kgills 0:f71931ae3db1 287 return 0;
kgills 0:f71931ae3db1 288 }
kgills 0:f71931ae3db1 289
kgills 0:f71931ae3db1 290 //******************************************************************************
kgills 0:f71931ae3db1 291 static void clearGPIOWUD(PinName pinname)
kgills 0:f71931ae3db1 292 {
kgills 0:f71931ae3db1 293 // I/O must be a wakeup detect to clear
kgills 0:f71931ae3db1 294 MXC_IOMAN->wud_req0 |= PIN_MASK(pinname);
kgills 0:f71931ae3db1 295
kgills 0:f71931ae3db1 296 // Clear WUD
kgills 0:f71931ae3db1 297 MXC_PWRMAN->wud_ctrl = (PIN_NUMBER(pinname) << MXC_F_PWRMAN_WUD_CTRL_PAD_SELECT_POS) |
kgills 0:f71931ae3db1 298 (MXC_E_PWRMAN_PAD_MODE_CLEAR_SET << MXC_F_PWRMAN_WUD_CTRL_PAD_MODE_POS);
kgills 0:f71931ae3db1 299 MXC_PWRMAN->wud_pulse0 = 1; // clear
kgills 0:f71931ae3db1 300 MXC_PWRMAN->wud_pulse1 = 1; // activate
kgills 0:f71931ae3db1 301 MXC_PWRMAN->wud_pulse0 = 1; // clear
kgills 0:f71931ae3db1 302
kgills 0:f71931ae3db1 303 MXC_IOMAN->wud_req0 &= ~PIN_MASK(pinname);
kgills 0:f71931ae3db1 304 }
kgills 0:f71931ae3db1 305
kgills 0:f71931ae3db1 306 // *****************************************************************************
kgills 0:f71931ae3db1 307 int main(void)
kgills 0:f71931ae3db1 308 {
kgills 0:f71931ae3db1 309 printf("\n\nEnvironmental demo\n");
kgills 0:f71931ae3db1 310
kgills 0:f71931ae3db1 311 // This wait is needed to prevent the micro from entering DeepSleep before it can be halted by the debugger
kgills 0:f71931ae3db1 312 wait(1);
kgills 0:f71931ae3db1 313
kgills 0:f71931ae3db1 314 // Initialize the RTC
kgills 0:f71931ae3db1 315 time(NULL);
kgills 0:f71931ae3db1 316
kgills 0:f71931ae3db1 317 // clear wakeup detect requests, flags and mask all wakeups
kgills 0:f71931ae3db1 318 MXC_IOMAN->wud_req0 = 0;
kgills 0:f71931ae3db1 319 MXC_PWRSEQ->msk_flags = ~MXC_F_PWRSEQ_MSK_FLAGS_RTC_ROLLOVER;
kgills 0:f71931ae3db1 320
kgills 0:f71931ae3db1 321 /* Initialize BLE baselayer */
kgills 0:f71931ae3db1 322 ble.init();
kgills 0:f71931ae3db1 323
kgills 0:f71931ae3db1 324 /* Set MAC Address */
kgills 0:f71931ae3db1 325 Gap::addr_type_t typeP = Gap::ADDR_TYPE_RANDOM_STATIC;
kgills 0:f71931ae3db1 326 Gap::address_t address;
kgills 0:f71931ae3db1 327 getBtleAddress((uint8_t*)&address);
kgills 0:f71931ae3db1 328 ble.gap().setAddress(typeP, address);
kgills 0:f71931ae3db1 329 ble.gap().getAddress(&typeP, address);
kgills 0:f71931ae3db1 330 printf("BTLE Addr %02X:%02X:%02X:%02X:%02X:%02X\n", (unsigned int)address[5],
kgills 0:f71931ae3db1 331 (unsigned int)address[4],
kgills 0:f71931ae3db1 332 (unsigned int)address[3],
kgills 0:f71931ae3db1 333 (unsigned int)address[2],
kgills 0:f71931ae3db1 334 (unsigned int)address[1],
kgills 0:f71931ae3db1 335 (unsigned int)address[0]);
kgills 0:f71931ae3db1 336
kgills 0:f71931ae3db1 337 /* Setup Advertising */
kgills 0:f71931ae3db1 338 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
kgills 0:f71931ae3db1 339 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t*)DEVICE_NAME, sizeof(DEVICE_NAME));
kgills 0:f71931ae3db1 340
kgills 0:f71931ae3db1 341 ble.gap().accumulateScanResponse(GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list));
kgills 0:f71931ae3db1 342 ble.gap().accumulateScanResponse(GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS, envServiceUUID, sizeof(envServiceUUID));
kgills 0:f71931ae3db1 343
kgills 0:f71931ae3db1 344 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t*)DEVICE_NAME, sizeof(DEVICE_NAME));
kgills 0:f71931ae3db1 345 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
kgills 0:f71931ae3db1 346
kgills 0:f71931ae3db1 347 /* Prepare Services */
kgills 0:f71931ae3db1 348 devInfoService = new DeviceInformationService(ble, "Maxim Integrated",
kgills 0:f71931ae3db1 349 "WSNENV",
kgills 0:f71931ae3db1 350 "000001",
kgills 0:f71931ae3db1 351 "1",
kgills 0:f71931ae3db1 352 "1",
kgills 0:f71931ae3db1 353 "1");
kgills 0:f71931ae3db1 354
kgills 0:f71931ae3db1 355 envService = new EnvironmentalService(ble, PressureChar::PRES_UNIT_KPA, TemperatureChar::TEMP_UNIT_C);
kgills 0:f71931ae3db1 356
kgills 0:f71931ae3db1 357 timeService = new CurrentTimeService(ble);
kgills 0:f71931ae3db1 358
kgills 0:f71931ae3db1 359 /* Setup Callbacks */
kgills 0:f71931ae3db1 360 ble.gap().onDisconnection(disconnectionCallback);
kgills 0:f71931ae3db1 361 ble.gap().onConnection(connectionCallback);
kgills 0:f71931ae3db1 362 ble.gattServer().onDataRead(dataReadCallback);
kgills 0:f71931ae3db1 363
kgills 0:f71931ae3db1 364 /* Setup BMP180 */
kgills 0:f71931ae3db1 365 if (bmp180.init() != 0) {
kgills 0:f71931ae3db1 366 printf("Failed to initialize barometer\n");
kgills 0:f71931ae3db1 367 while(1);
kgills 0:f71931ae3db1 368 }
kgills 0:f71931ae3db1 369
kgills 0:f71931ae3db1 370 /* Start non-blocking pressure reading */
kgills 0:f71931ae3db1 371 bmp180.startPressure(BMP180::STANDARD);
kgills 0:f71931ae3db1 372 si7020.startHumidity();
kgills 0:f71931ae3db1 373
kgills 0:f71931ae3db1 374 /* Start Advertising */
kgills 0:f71931ae3db1 375 setAdvertising(ADVERT_HIGH_PERIOD);
kgills 0:f71931ae3db1 376
kgills 0:f71931ae3db1 377 // Setup reset sample, sample every second for first 10 seconds
kgills 0:f71931ae3db1 378 sampleTicker.attach(sampleStart, SENSOR_DEMO_PERIOD);
kgills 0:f71931ae3db1 379 demoTimeout.attach(demoTimeoutCallback, DEMO_DURATION);
kgills 0:f71931ae3db1 380 demoMode = true;
kgills 0:f71931ae3db1 381
kgills 0:f71931ae3db1 382 while (true) {
kgills 0:f71931ae3db1 383
kgills 0:f71931ae3db1 384 // Prepare to wakeup from SW1
kgills 0:f71931ae3db1 385 if (sw1) {
kgills 0:f71931ae3db1 386 setGPIOWUD(SW1, 0);
kgills 0:f71931ae3db1 387 MXC_PWRSEQ->msk_flags &= ~MXC_F_PWRSEQ_MSK_FLAGS_PWR_IO_WAKEUP;
kgills 0:f71931ae3db1 388 }
kgills 0:f71931ae3db1 389
kgills 0:f71931ae3db1 390 ble.waitForEvent();
kgills 0:f71931ae3db1 391
kgills 0:f71931ae3db1 392 // Check if the button was pressed
kgills 0:f71931ae3db1 393 if (MXC_PWRMAN->wud_seen0 & PIN_MASK(SW1)) {
kgills 0:f71931ae3db1 394 demoStart();
kgills 0:f71931ae3db1 395 }
kgills 0:f71931ae3db1 396
kgills 0:f71931ae3db1 397 // disable wakeup
kgills 0:f71931ae3db1 398 clearGPIOWUD(SW1);
kgills 0:f71931ae3db1 399 }
kgills 0:f71931ae3db1 400 }