BTLE demo for MAXWSNENV.

Dependencies:   BLE_API BMP180 Si7020 mbed MaximBLE

Committer:
enginerd
Date:
Thu Mar 03 14:48:57 2016 +0000
Revision:
1:1876781d537e
Parent:
0:f71931ae3db1
Child:
2:6f76d6160601
Updated BLE_API and MaximBLE support.

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 EnvironmentalService *envService;
kgills 0:f71931ae3db1 73 static CurrentTimeService *timeService;
kgills 0:f71931ae3db1 74 static LowPowerTimeout bleUpdateTimeout;
kgills 0:f71931ae3db1 75 static const char DEVICE_NAME[] = "Environmental Board";
kgills 0:f71931ae3db1 76 static const uint16_t uuid16_list[] = {GattService::UUID_DEVICE_INFORMATION_SERVICE};
kgills 0:f71931ae3db1 77 static const Gap::ConnectionParams_t paramsLowPower = {
kgills 0:f71931ae3db1 78 400, /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
kgills 0:f71931ae3db1 79 400, /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
kgills 0:f71931ae3db1 80 60, /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
kgills 0:f71931ae3db1 81 3100 /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
kgills 0:f71931ae3db1 82 };
kgills 0:f71931ae3db1 83 static Gap::Handle_t connHandle = 0;
kgills 0:f71931ae3db1 84 static bool connUpdateRequested;
kgills 0:f71931ae3db1 85
kgills 0:f71931ae3db1 86 // Sensor objects
kgills 0:f71931ae3db1 87 I2C i2c(I2C_SDA, I2C_SCL);
kgills 0:f71931ae3db1 88 BMP180 bmp180(&i2c);
kgills 0:f71931ae3db1 89 Si7020 si7020(&i2c);
kgills 0:f71931ae3db1 90 static LowPowerTimeout sampleTimeout;
kgills 0:f71931ae3db1 91 static LowPowerTicker sampleTicker;
kgills 0:f71931ae3db1 92 static LowPowerTimeout demoTimeout;
kgills 0:f71931ae3db1 93 static bool demoMode;
kgills 0:f71931ae3db1 94
kgills 0:f71931ae3db1 95 static void bleUpdateCallback(void);
kgills 0:f71931ae3db1 96
kgills 0:f71931ae3db1 97 // *****************************************************************************
kgills 0:f71931ae3db1 98 static void sampleComplete(void)
kgills 0:f71931ae3db1 99 {
kgills 0:f71931ae3db1 100 int currentPressure;
kgills 0:f71931ae3db1 101 float currentHumidity;
kgills 0:f71931ae3db1 102 float currentTemperature;
kgills 0:f71931ae3db1 103 time_t currentTime;
kgills 0:f71931ae3db1 104
kgills 0:f71931ae3db1 105 red = LED_OFF;
kgills 0:f71931ae3db1 106 blue = LED_OFF;
kgills 0:f71931ae3db1 107
kgills 0:f71931ae3db1 108 // Update timestamp
kgills 0:f71931ae3db1 109 currentTime = time(NULL);
kgills 0:f71931ae3db1 110 if (demoMode) {
kgills 0:f71931ae3db1 111 printf("\n%s", ctime(&currentTime));
kgills 0:f71931ae3db1 112 }
kgills 0:f71931ae3db1 113
kgills 0:f71931ae3db1 114 /* Get next pressure reading, can be oversampled */
kgills 0:f71931ae3db1 115 if(bmp180.getPressure(&currentPressure) != 0) {
kgills 0:f71931ae3db1 116 printf("Error getting pressure\n");
kgills 0:f71931ae3db1 117 } else {
kgills 0:f71931ae3db1 118 envService->updatePressure((float)(currentPressure)/1000.0, currentTime);
kgills 0:f71931ae3db1 119 if (demoMode) {
kgills 0:f71931ae3db1 120 printf("Press = %0.1f kPa\n", (float)(currentPressure/1000.0));
kgills 0:f71931ae3db1 121 }
kgills 0:f71931ae3db1 122 }
kgills 0:f71931ae3db1 123
kgills 0:f71931ae3db1 124 // Get Humidity
kgills 0:f71931ae3db1 125 if(si7020.checkHumidity(&currentHumidity) != 0) {
kgills 0:f71931ae3db1 126 printf("Error getting humidity\n");
kgills 0:f71931ae3db1 127 } else {
kgills 0:f71931ae3db1 128 envService->updateHumidity(currentHumidity, currentTime);
kgills 0:f71931ae3db1 129 if (demoMode) {
kgills 0:f71931ae3db1 130 printf("Humid = %0.1f %%\n", currentHumidity);
kgills 0:f71931ae3db1 131 }
kgills 0:f71931ae3db1 132 }
kgills 0:f71931ae3db1 133
kgills 0:f71931ae3db1 134 // Get temperature
kgills 0:f71931ae3db1 135 if(si7020.getPrevTemperature(&currentTemperature) != 0) {
kgills 0:f71931ae3db1 136 printf("Error getting temperature\n");
kgills 0:f71931ae3db1 137 } else {
kgills 0:f71931ae3db1 138 envService->updateTemperature(currentTemperature, currentTime);
kgills 0:f71931ae3db1 139 if (demoMode) {
kgills 0:f71931ae3db1 140 printf("Temp = %0.1f C\n", currentTemperature);
kgills 0:f71931ae3db1 141 }
kgills 0:f71931ae3db1 142 }
kgills 0:f71931ae3db1 143
kgills 0:f71931ae3db1 144 // Update the CurrentTime characteristic value
kgills 0:f71931ae3db1 145 timeService->updateCurrentTimeValue();
kgills 0:f71931ae3db1 146 }
kgills 0:f71931ae3db1 147
kgills 0:f71931ae3db1 148 // *****************************************************************************
kgills 0:f71931ae3db1 149 static void sampleStart(void)
kgills 0:f71931ae3db1 150 {
kgills 0:f71931ae3db1 151 if (demoMode) {
kgills 0:f71931ae3db1 152 // Blink red LED if connected, blue if disconnected
kgills 0:f71931ae3db1 153 if (ble.getGapState().connected) {
kgills 0:f71931ae3db1 154 red = LED_ON;
kgills 0:f71931ae3db1 155 blue = LED_OFF;
kgills 0:f71931ae3db1 156 } else {
kgills 0:f71931ae3db1 157 blue = LED_ON;
kgills 0:f71931ae3db1 158 red = LED_OFF;
kgills 0:f71931ae3db1 159 }
kgills 0:f71931ae3db1 160 }
kgills 0:f71931ae3db1 161
kgills 0:f71931ae3db1 162 // Start pressure conversion
kgills 0:f71931ae3db1 163 bmp180.startPressure(BMP180::STANDARD);
kgills 0:f71931ae3db1 164
kgills 0:f71931ae3db1 165 /* Start taking measurement for next reading*/
kgills 0:f71931ae3db1 166 si7020.startHumidity();
kgills 0:f71931ae3db1 167
kgills 0:f71931ae3db1 168 // Set timeout to read sensors and sample
kgills 0:f71931ae3db1 169 sampleTimeout.attach_us(sampleComplete, SENSOR_DELAY_US);
kgills 0:f71931ae3db1 170 }
kgills 0:f71931ae3db1 171
kgills 0:f71931ae3db1 172 // *****************************************************************************
kgills 0:f71931ae3db1 173 static void setAdvertising(uint16_t interval)
kgills 0:f71931ae3db1 174 {
kgills 0:f71931ae3db1 175 static uint16_t currentInterval = 0;
kgills 0:f71931ae3db1 176
kgills 0:f71931ae3db1 177 if (interval == 0) {
kgills 0:f71931ae3db1 178 ble.gap().stopAdvertising();
kgills 0:f71931ae3db1 179 currentInterval = 0;
kgills 0:f71931ae3db1 180 } else if (!ble.getGapState().connected && (interval != currentInterval)) {
kgills 0:f71931ae3db1 181 if (interval > currentInterval) {
kgills 0:f71931ae3db1 182 bleUpdateTimeout.attach(bleUpdateCallback, BLE_UPDATE_DURATION);
kgills 0:f71931ae3db1 183 }
kgills 0:f71931ae3db1 184 ble.gap().stopAdvertising();
kgills 0:f71931ae3db1 185 ble.gap().setAdvertisingInterval(interval);
kgills 0:f71931ae3db1 186 ble.gap().startAdvertising();
kgills 0:f71931ae3db1 187 currentInterval = interval;
kgills 0:f71931ae3db1 188 }
kgills 0:f71931ae3db1 189 }
kgills 0:f71931ae3db1 190
kgills 0:f71931ae3db1 191 // *****************************************************************************
kgills 0:f71931ae3db1 192 static void bleUpdateCallback(void)
kgills 0:f71931ae3db1 193 {
kgills 0:f71931ae3db1 194 if (ble.getGapState().connected) {
kgills 0:f71931ae3db1 195 // Reduce connection interval
kgills 0:f71931ae3db1 196 ble.gap().updateConnectionParams(connHandle, &paramsLowPower);
kgills 0:f71931ae3db1 197 connUpdateRequested = true;
kgills 0:f71931ae3db1 198 } else {
kgills 0:f71931ae3db1 199 // Reduce advertising interval
kgills 0:f71931ae3db1 200 setAdvertising(ADVERT_LOW_PERIOD);
kgills 0:f71931ae3db1 201 }
kgills 0:f71931ae3db1 202 }
kgills 0:f71931ae3db1 203
kgills 0:f71931ae3db1 204 // *****************************************************************************
kgills 0:f71931ae3db1 205 static void demoTimeoutCallback(void)
kgills 0:f71931ae3db1 206 {
kgills 0:f71931ae3db1 207 sampleTicker.attach(sampleStart, NORMAL_SENSOR_PERIOD);
kgills 0:f71931ae3db1 208 demoMode = false;
kgills 0:f71931ae3db1 209 }
kgills 0:f71931ae3db1 210
kgills 0:f71931ae3db1 211 // *****************************************************************************
kgills 0:f71931ae3db1 212 static void demoStart(void)
kgills 0:f71931ae3db1 213 {
kgills 0:f71931ae3db1 214 sampleTicker.attach(sampleStart, SENSOR_DEMO_PERIOD);
kgills 0:f71931ae3db1 215 demoMode = true;
kgills 0:f71931ae3db1 216
kgills 0:f71931ae3db1 217 if (!ble.getGapState().connected) {
kgills 0:f71931ae3db1 218 // Increase advertising interval
kgills 0:f71931ae3db1 219 setAdvertising(ADVERT_HIGH_PERIOD);
kgills 0:f71931ae3db1 220 }
kgills 0:f71931ae3db1 221
kgills 0:f71931ae3db1 222 demoTimeout.attach(demoTimeoutCallback, DEMO_DURATION);
kgills 0:f71931ae3db1 223 }
kgills 0:f71931ae3db1 224
kgills 0:f71931ae3db1 225 // *****************************************************************************
kgills 0:f71931ae3db1 226 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
kgills 0:f71931ae3db1 227 {
kgills 0:f71931ae3db1 228 /* Record handle and connection settings */
kgills 0:f71931ae3db1 229 connHandle = params->handle;
kgills 0:f71931ae3db1 230 setAdvertising(0);
kgills 0:f71931ae3db1 231
kgills 0:f71931ae3db1 232 /* Prepare for a connection update */
kgills 0:f71931ae3db1 233 connUpdateRequested = false;
kgills 0:f71931ae3db1 234 bleUpdateTimeout.attach(bleUpdateCallback, BLE_UPDATE_DURATION);
kgills 0:f71931ae3db1 235
kgills 0:f71931ae3db1 236 printf("Connected\n");
kgills 0:f71931ae3db1 237 }
kgills 0:f71931ae3db1 238
kgills 0:f71931ae3db1 239 // *****************************************************************************
enginerd 1:1876781d537e 240 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
kgills 0:f71931ae3db1 241 {
kgills 0:f71931ae3db1 242 /* Restart Advertising on disconnection */
kgills 0:f71931ae3db1 243 connHandle = 0;
kgills 0:f71931ae3db1 244 setAdvertising(ADVERT_HIGH_PERIOD);
kgills 0:f71931ae3db1 245 printf("Disconnected\n");
kgills 0:f71931ae3db1 246 }
kgills 0:f71931ae3db1 247
kgills 0:f71931ae3db1 248 // *****************************************************************************
kgills 0:f71931ae3db1 249 void dataReadCallback(const GattReadCallbackParams *eventDataP)
kgills 0:f71931ae3db1 250 {
kgills 0:f71931ae3db1 251 if (!connUpdateRequested) {
kgills 0:f71931ae3db1 252 /* Restart the connection update timeout */
kgills 0:f71931ae3db1 253 bleUpdateTimeout.attach(bleUpdateCallback, BLE_UPDATE_DURATION);
kgills 0:f71931ae3db1 254 }
kgills 0:f71931ae3db1 255 }
kgills 0:f71931ae3db1 256
kgills 0:f71931ae3db1 257 //******************************************************************************
kgills 0:f71931ae3db1 258 static int setGPIOWUD(PinName pinname, int act_high)
kgills 0:f71931ae3db1 259 {
kgills 0:f71931ae3db1 260 MXC_IOMAN->wud_req0 |= PIN_MASK(pinname);
kgills 0:f71931ae3db1 261 if (!(MXC_IOMAN->wud_ack0 & PIN_MASK(pinname))) {
kgills 0:f71931ae3db1 262 printf("setGPIOWUD() failed to set P%u.%u as a WUD\n", PINNAME_TO_PORT(pinname), PINNAME_TO_PIN(pinname));
kgills 0:f71931ae3db1 263 return -1;
kgills 0:f71931ae3db1 264 }
kgills 0:f71931ae3db1 265
kgills 0:f71931ae3db1 266 // Configure WUD for active high/low
kgills 0:f71931ae3db1 267 MXC_PWRMAN->wud_ctrl = (PIN_NUMBER(pinname) << MXC_F_PWRMAN_WUD_CTRL_PAD_SELECT_POS) |
kgills 0:f71931ae3db1 268 (MXC_E_PWRMAN_PAD_MODE_ACT_HI_LO << MXC_F_PWRMAN_WUD_CTRL_PAD_MODE_POS);
kgills 0:f71931ae3db1 269 if (act_high) {
kgills 0:f71931ae3db1 270 MXC_PWRMAN->wud_pulse0 = 1;
kgills 0:f71931ae3db1 271 } else {
kgills 0:f71931ae3db1 272 MXC_PWRMAN->wud_pulse1 = 1;
kgills 0:f71931ae3db1 273 }
kgills 0:f71931ae3db1 274
kgills 0:f71931ae3db1 275 // Activate WUD
kgills 0:f71931ae3db1 276 MXC_PWRMAN->wud_ctrl = (PIN_NUMBER(pinname) << MXC_F_PWRMAN_WUD_CTRL_PAD_SELECT_POS) |
kgills 0:f71931ae3db1 277 (MXC_E_PWRMAN_PAD_MODE_CLEAR_SET << MXC_F_PWRMAN_WUD_CTRL_PAD_MODE_POS);
kgills 0:f71931ae3db1 278 MXC_PWRMAN->wud_pulse1 = 1; // activate
kgills 0:f71931ae3db1 279
kgills 0:f71931ae3db1 280 // Try to clear I/O wakeup flag
kgills 0:f71931ae3db1 281 MXC_PWRSEQ->flags = MXC_F_PWRSEQ_FLAGS_PWR_IO_WAKEUP;
kgills 0:f71931ae3db1 282 if (MXC_PWRSEQ->flags & MXC_F_PWRSEQ_FLAGS_PWR_IO_WAKEUP) {
kgills 0:f71931ae3db1 283 return -1;
kgills 0:f71931ae3db1 284 }
kgills 0:f71931ae3db1 285
kgills 0:f71931ae3db1 286 return 0;
kgills 0:f71931ae3db1 287 }
kgills 0:f71931ae3db1 288
kgills 0:f71931ae3db1 289 //******************************************************************************
kgills 0:f71931ae3db1 290 static void clearGPIOWUD(PinName pinname)
kgills 0:f71931ae3db1 291 {
kgills 0:f71931ae3db1 292 // I/O must be a wakeup detect to clear
kgills 0:f71931ae3db1 293 MXC_IOMAN->wud_req0 |= PIN_MASK(pinname);
kgills 0:f71931ae3db1 294
kgills 0:f71931ae3db1 295 // Clear WUD
kgills 0:f71931ae3db1 296 MXC_PWRMAN->wud_ctrl = (PIN_NUMBER(pinname) << MXC_F_PWRMAN_WUD_CTRL_PAD_SELECT_POS) |
kgills 0:f71931ae3db1 297 (MXC_E_PWRMAN_PAD_MODE_CLEAR_SET << MXC_F_PWRMAN_WUD_CTRL_PAD_MODE_POS);
kgills 0:f71931ae3db1 298 MXC_PWRMAN->wud_pulse0 = 1; // clear
kgills 0:f71931ae3db1 299 MXC_PWRMAN->wud_pulse1 = 1; // activate
kgills 0:f71931ae3db1 300 MXC_PWRMAN->wud_pulse0 = 1; // clear
kgills 0:f71931ae3db1 301
kgills 0:f71931ae3db1 302 MXC_IOMAN->wud_req0 &= ~PIN_MASK(pinname);
kgills 0:f71931ae3db1 303 }
kgills 0:f71931ae3db1 304
kgills 0:f71931ae3db1 305 // *****************************************************************************
kgills 0:f71931ae3db1 306 int main(void)
kgills 0:f71931ae3db1 307 {
kgills 0:f71931ae3db1 308 printf("\n\nEnvironmental demo\n");
kgills 0:f71931ae3db1 309
kgills 0:f71931ae3db1 310 // This wait is needed to prevent the micro from entering DeepSleep before it can be halted by the debugger
kgills 0:f71931ae3db1 311 wait(1);
kgills 0:f71931ae3db1 312
kgills 0:f71931ae3db1 313 // Initialize the RTC
kgills 0:f71931ae3db1 314 time(NULL);
kgills 0:f71931ae3db1 315
kgills 0:f71931ae3db1 316 // clear wakeup detect requests, flags and mask all wakeups
kgills 0:f71931ae3db1 317 MXC_IOMAN->wud_req0 = 0;
kgills 0:f71931ae3db1 318 MXC_PWRSEQ->msk_flags = ~MXC_F_PWRSEQ_MSK_FLAGS_RTC_ROLLOVER;
kgills 0:f71931ae3db1 319
kgills 0:f71931ae3db1 320 /* Initialize BLE baselayer */
kgills 0:f71931ae3db1 321 ble.init();
kgills 0:f71931ae3db1 322
kgills 0:f71931ae3db1 323 /* Set MAC Address */
kgills 0:f71931ae3db1 324 Gap::addr_type_t typeP = Gap::ADDR_TYPE_RANDOM_STATIC;
kgills 0:f71931ae3db1 325 Gap::address_t address;
kgills 0:f71931ae3db1 326 getBtleAddress((uint8_t*)&address);
kgills 0:f71931ae3db1 327 ble.gap().setAddress(typeP, address);
kgills 0:f71931ae3db1 328 ble.gap().getAddress(&typeP, address);
kgills 0:f71931ae3db1 329 printf("BTLE Addr %02X:%02X:%02X:%02X:%02X:%02X\n", (unsigned int)address[5],
kgills 0:f71931ae3db1 330 (unsigned int)address[4],
kgills 0:f71931ae3db1 331 (unsigned int)address[3],
kgills 0:f71931ae3db1 332 (unsigned int)address[2],
kgills 0:f71931ae3db1 333 (unsigned int)address[1],
kgills 0:f71931ae3db1 334 (unsigned int)address[0]);
kgills 0:f71931ae3db1 335
kgills 0:f71931ae3db1 336 /* Setup Advertising */
kgills 0:f71931ae3db1 337 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
kgills 0:f71931ae3db1 338 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t*)DEVICE_NAME, sizeof(DEVICE_NAME));
kgills 0:f71931ae3db1 339
kgills 0:f71931ae3db1 340 ble.gap().accumulateScanResponse(GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list));
kgills 0:f71931ae3db1 341 ble.gap().accumulateScanResponse(GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS, envServiceUUID, sizeof(envServiceUUID));
kgills 0:f71931ae3db1 342
kgills 0:f71931ae3db1 343 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t*)DEVICE_NAME, sizeof(DEVICE_NAME));
kgills 0:f71931ae3db1 344 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
kgills 0:f71931ae3db1 345
kgills 0:f71931ae3db1 346 /* Prepare Services */
enginerd 1:1876781d537e 347 new DeviceInformationService(ble, "Maxim Integrated",
kgills 0:f71931ae3db1 348 "WSNENV",
kgills 0:f71931ae3db1 349 "000001",
kgills 0:f71931ae3db1 350 "1",
kgills 0:f71931ae3db1 351 "1",
kgills 0:f71931ae3db1 352 "1");
kgills 0:f71931ae3db1 353
kgills 0:f71931ae3db1 354 envService = new EnvironmentalService(ble, PressureChar::PRES_UNIT_KPA, TemperatureChar::TEMP_UNIT_C);
kgills 0:f71931ae3db1 355
kgills 0:f71931ae3db1 356 timeService = new CurrentTimeService(ble);
kgills 0:f71931ae3db1 357
kgills 0:f71931ae3db1 358 /* Setup Callbacks */
kgills 0:f71931ae3db1 359 ble.gap().onDisconnection(disconnectionCallback);
kgills 0:f71931ae3db1 360 ble.gap().onConnection(connectionCallback);
kgills 0:f71931ae3db1 361 ble.gattServer().onDataRead(dataReadCallback);
kgills 0:f71931ae3db1 362
kgills 0:f71931ae3db1 363 /* Setup BMP180 */
kgills 0:f71931ae3db1 364 if (bmp180.init() != 0) {
kgills 0:f71931ae3db1 365 printf("Failed to initialize barometer\n");
kgills 0:f71931ae3db1 366 while(1);
kgills 0:f71931ae3db1 367 }
kgills 0:f71931ae3db1 368
kgills 0:f71931ae3db1 369 /* Start non-blocking pressure reading */
kgills 0:f71931ae3db1 370 bmp180.startPressure(BMP180::STANDARD);
kgills 0:f71931ae3db1 371 si7020.startHumidity();
kgills 0:f71931ae3db1 372
kgills 0:f71931ae3db1 373 /* Start Advertising */
kgills 0:f71931ae3db1 374 setAdvertising(ADVERT_HIGH_PERIOD);
kgills 0:f71931ae3db1 375
kgills 0:f71931ae3db1 376 // Setup reset sample, sample every second for first 10 seconds
kgills 0:f71931ae3db1 377 sampleTicker.attach(sampleStart, SENSOR_DEMO_PERIOD);
kgills 0:f71931ae3db1 378 demoTimeout.attach(demoTimeoutCallback, DEMO_DURATION);
kgills 0:f71931ae3db1 379 demoMode = true;
kgills 0:f71931ae3db1 380
kgills 0:f71931ae3db1 381 while (true) {
kgills 0:f71931ae3db1 382
kgills 0:f71931ae3db1 383 // Prepare to wakeup from SW1
kgills 0:f71931ae3db1 384 if (sw1) {
kgills 0:f71931ae3db1 385 setGPIOWUD(SW1, 0);
kgills 0:f71931ae3db1 386 MXC_PWRSEQ->msk_flags &= ~MXC_F_PWRSEQ_MSK_FLAGS_PWR_IO_WAKEUP;
kgills 0:f71931ae3db1 387 }
kgills 0:f71931ae3db1 388
kgills 0:f71931ae3db1 389 ble.waitForEvent();
kgills 0:f71931ae3db1 390
kgills 0:f71931ae3db1 391 // Check if the button was pressed
kgills 0:f71931ae3db1 392 if (MXC_PWRMAN->wud_seen0 & PIN_MASK(SW1)) {
kgills 0:f71931ae3db1 393 demoStart();
kgills 0:f71931ae3db1 394 }
kgills 0:f71931ae3db1 395
kgills 0:f71931ae3db1 396 // disable wakeup
kgills 0:f71931ae3db1 397 clearGPIOWUD(SW1);
kgills 0:f71931ae3db1 398 }
kgills 0:f71931ae3db1 399 }