aconno acnsensa project for iOS devices with iBeacon packets support.

Dependencies:   LSM9DS1 Si7006A20 aconno_SEGGER_RTT aconno_bsp adc52832_common

Committer:
dbartolovic
Date:
Fri Aug 17 10:45:24 2018 +0000
Branch:
sensaformatfix
Revision:
38:c90e1670ffb3
Parent:
36:9e40cdef6bd6
Added service advertisement to telemetry data

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jurica238814 16:e86a91db0b72 1 /*
jurica238814 16:e86a91db0b72 2 * aconno.de
jurica238814 16:e86a91db0b72 3 * Made by Jurica Resetar
jurica238814 16:e86a91db0b72 4 * Edited by Karlo Milicevic
jurica238814 16:e86a91db0b72 5 * Edited by Dominik Bartolovic
jurica238814 16:e86a91db0b72 6 * All right reserved
jurica238814 16:e86a91db0b72 7 *
jurica238814 16:e86a91db0b72 8 */
jurica238814 16:e86a91db0b72 9
jurica238814 16:e86a91db0b72 10 #include "mbed.h"
jurica238814 16:e86a91db0b72 11 #include "ble/BLE.h"
jurica238814 16:e86a91db0b72 12 #include "acd52832_bsp.h"
jurica238814 16:e86a91db0b72 13 #include "GapAdvertisingData.h"
jurica238814 16:e86a91db0b72 14 #include "Si7006A20.h"
jurica238814 16:e86a91db0b72 15 #include "LSM9DS1.h"
jurica238814 16:e86a91db0b72 16 #include "math.h"
jurica238814 16:e86a91db0b72 17 #include "nrf52_digital.h"
jurica238814 16:e86a91db0b72 18 #include "adc52832_common/utilities.h"
jurica238814 16:e86a91db0b72 19 #include "MPL115A1.h"
jurica238814 16:e86a91db0b72 20 #include "acd_nrf52_saadc.h"
jurica238814 16:e86a91db0b72 21 #include "service.h"
jurica238814 16:e86a91db0b72 22 #include <events/mbed_events.h>
jurica238814 21:71f2f1b314f2 23 #include "aconnoConfig.h"
jurica238814 16:e86a91db0b72 24
jurica238814 16:e86a91db0b72 25 uint8_t gConnected = 0;
jurica238814 16:e86a91db0b72 26
jurica238814 16:e86a91db0b72 27 static NRF52_SAADC analogIn;
jurica238814 16:e86a91db0b72 28 static NRF52_DigitalOut lightPower(p28);
jurica238814 16:e86a91db0b72 29 static NRF52_DigitalOut temperaturePower(p31);
jurica238814 16:e86a91db0b72 30 static NRF52_DigitalOut shdn(p6);
jurica238814 16:e86a91db0b72 31 static NRF52_DigitalOut power(p2);
jurica238814 16:e86a91db0b72 32 static NRF52_DigitalOut cs(p7);
jurica238814 16:e86a91db0b72 33 static Si7006 *si;
jurica238814 16:e86a91db0b72 34 static LSM9DS1 *mems;
jurica238814 16:e86a91db0b72 35 static SPI *spi;
jurica238814 16:e86a91db0b72 36 static MPL115A1 *mpl115a1;
jurica238814 16:e86a91db0b72 37
jurica238814 16:e86a91db0b72 38 static EventQueue eventQueue(32 * EVENTS_EVENT_SIZE);
jurica238814 16:e86a91db0b72 39 uint8_t myMacAddress[6] = {};
jurica238814 16:e86a91db0b72 40 MACService *macServicePtr;
jurica238814 16:e86a91db0b72 41
jurica238814 16:e86a91db0b72 42 #if DEBUG_PRINT
jurica238814 16:e86a91db0b72 43 #include "SEGGER_RTT.h"
jurica238814 16:e86a91db0b72 44 #define printf(...) SEGGER_RTT_printf(0, __VA_ARGS__)
jurica238814 16:e86a91db0b72 45 #else
jurica238814 16:e86a91db0b72 46 #define printf(...)
jurica238814 16:e86a91db0b72 47 #endif
jurica238814 16:e86a91db0b72 48
jurica238814 16:e86a91db0b72 49 static vector3_s memsAccelerometerInit;
jurica238814 16:e86a91db0b72 50 static vector3_s memsGyroscopeInit;
jurica238814 16:e86a91db0b72 51 static vector3_s memsMagnetometerInit;
jurica238814 16:e86a91db0b72 52
jurica238814 16:e86a91db0b72 53 static GapAdvertisingData adv_data = GapAdvertisingData();
jurica238814 16:e86a91db0b72 54
jurica238814 26:834af521af0a 55 struct __attribute__((packed, aligned(1))) iBeaconMSD_t
jurica238814 16:e86a91db0b72 56 {
jurica238814 21:71f2f1b314f2 57 // AppleID is constant
jurica238814 26:834af521af0a 58 uint16_t appleID;
jurica238814 21:71f2f1b314f2 59 // secondID is constant
jurica238814 26:834af521af0a 60 uint8_t secondID;
jurica238814 21:71f2f1b314f2 61 // DataSize is constant
jurica238814 26:834af521af0a 62 uint8_t dataSize;
jurica238814 26:834af521af0a 63 uint8_t UUID[16];
jurica238814 26:834af521af0a 64 uint16_t major;
jurica238814 26:834af521af0a 65 uint16_t minor;
jurica238814 26:834af521af0a 66 int8_t RSSI;
jurica238814 27:67467a7a56b3 67 }static iBeaconMSD = {.appleID = 0x004C,
jurica238814 26:834af521af0a 68 .secondID = 0x02,
jurica238814 26:834af521af0a 69 .dataSize = 0x15,
jurica238814 26:834af521af0a 70 .UUID = {UUID_INIT},
jurica238814 26:834af521af0a 71 .major = MAJOR,
jurica238814 26:834af521af0a 72 .minor = MINOR,
jurica238814 26:834af521af0a 73 .RSSI = RSSI_INIT};
jurica238814 16:e86a91db0b72 74
jurica238814 16:e86a91db0b72 75 struct __attribute__((packed, aligned(1))) advertising_packet
jurica238814 16:e86a91db0b72 76 {
jurica238814 16:e86a91db0b72 77 uint32_t header;
jurica238814 16:e86a91db0b72 78 uint8_t type;
jurica238814 16:e86a91db0b72 79 union{
jurica238814 16:e86a91db0b72 80 struct{
jurica238814 16:e86a91db0b72 81 int16_t gyroscope[3];
jurica238814 16:e86a91db0b72 82 int16_t accelerometer[3];
jurica238814 16:e86a91db0b72 83 int16_t magnetometer[3];
jurica238814 16:e86a91db0b72 84 uint16_t acc_lsb_value;
jurica238814 16:e86a91db0b72 85 };
jurica238814 16:e86a91db0b72 86 struct{
jurica238814 16:e86a91db0b72 87 float temperature;
jurica238814 16:e86a91db0b72 88 float humidity;
jurica238814 16:e86a91db0b72 89 float pressure;
jurica238814 16:e86a91db0b72 90 float light;
jurica238814 16:e86a91db0b72 91 uint8_t battery;
jurica238814 16:e86a91db0b72 92 };
jurica238814 16:e86a91db0b72 93 };
jurica238814 16:e86a91db0b72 94 };
jurica238814 16:e86a91db0b72 95
jurica238814 16:e86a91db0b72 96 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context)
jurica238814 16:e86a91db0b72 97 {
jurica238814 16:e86a91db0b72 98 BLE &ble = context->ble;
jurica238814 16:e86a91db0b72 99 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
jurica238814 16:e86a91db0b72 100 }
jurica238814 16:e86a91db0b72 101
jurica238814 16:e86a91db0b72 102 static advertising_packet advertisementPacket;
dbartolovic 36:9e40cdef6bd6 103 const int advDataSize = sizeof(advertising_packet);
jurica238814 16:e86a91db0b72 104
jurica238814 16:e86a91db0b72 105 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
jurica238814 16:e86a91db0b72 106 {
jurica238814 16:e86a91db0b72 107 // Restart Advertising on disconnection
jurica238814 16:e86a91db0b72 108 gConnected = 0;
jurica238814 16:e86a91db0b72 109 BLE::Instance().gap().startAdvertising();
jurica238814 16:e86a91db0b72 110 }
jurica238814 16:e86a91db0b72 111
jurica238814 16:e86a91db0b72 112 void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params)
jurica238814 16:e86a91db0b72 113 {
jurica238814 16:e86a91db0b72 114 printf("Connection callback.\n");
jurica238814 16:e86a91db0b72 115 gConnected = 1;
jurica238814 16:e86a91db0b72 116 }
jurica238814 16:e86a91db0b72 117
jurica238814 16:e86a91db0b72 118 /**
jurica238814 16:e86a91db0b72 119 * Callback triggered when the ble initialization process has finished
jurica238814 16:e86a91db0b72 120 */
jurica238814 16:e86a91db0b72 121 void bleInitCompleteSensors(BLE::InitializationCompleteCallbackContext *params)
jurica238814 16:e86a91db0b72 122 {
jurica238814 16:e86a91db0b72 123 BLE& ble = params->ble;
jurica238814 16:e86a91db0b72 124 ble_error_t error = params->error;
jurica238814 16:e86a91db0b72 125
jurica238814 16:e86a91db0b72 126 if (error != BLE_ERROR_NONE){
jurica238814 16:e86a91db0b72 127 return;
jurica238814 16:e86a91db0b72 128 }
jurica238814 16:e86a91db0b72 129
jurica238814 16:e86a91db0b72 130 /* Ensure that it is the default instance of BLE */
jurica238814 16:e86a91db0b72 131 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE){
jurica238814 16:e86a91db0b72 132 return;
jurica238814 16:e86a91db0b72 133 }
jurica238814 16:e86a91db0b72 134
jurica238814 18:442bc914996b 135 uint8_t mac[6] = {0,0,0,0,0,0};
dbartolovic 36:9e40cdef6bd6 136 uint8_t initAdvData[] = {0};
jurica238814 16:e86a91db0b72 137 BLEProtocol::AddressType_t temp_address_type;
jurica238814 16:e86a91db0b72 138 ble.gap().getAddress(&temp_address_type, myMacAddress);
dbartolovic 36:9e40cdef6bd6 139 macServicePtr = new MACService(ble, mac, initAdvData);
jurica238814 16:e86a91db0b72 140 macServicePtr->updateMacAddress(myMacAddress); // Update MAC address
jurica238814 16:e86a91db0b72 141
jurica238814 16:e86a91db0b72 142 ble.gap().onConnection(onConnectionCallback);
jurica238814 16:e86a91db0b72 143 ble.gap().onDisconnection(disconnectionCallback);
jurica238814 16:e86a91db0b72 144
jurica238814 16:e86a91db0b72 145 /* setup advertising */
jurica238814 16:e86a91db0b72 146 ble.gap().accumulateAdvertisingPayload(
jurica238814 16:e86a91db0b72 147 GapAdvertisingData::BREDR_NOT_SUPPORTED);
jurica238814 16:e86a91db0b72 148 ble.gap().accumulateAdvertisingPayload(
jurica238814 16:e86a91db0b72 149 GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
jurica238814 16:e86a91db0b72 150 (uint8_t *)&advertisementPacket, sizeof(advertisementPacket));
jurica238814 16:e86a91db0b72 151 ble.gap().setAdvertisingType(
jurica238814 16:e86a91db0b72 152 GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jurica238814 16:e86a91db0b72 153 ble.gap().setAdvertisingInterval(ADV_INTERVAL);
jurica238814 18:442bc914996b 154 printf("Init started....\t\t");
jurica238814 17:18f4bf2a368a 155 ble.gap().setTxPower(TX_POWER_DB); // Set TX power to TX_POWER_DB
jurica238814 16:e86a91db0b72 156 ble.gap().startAdvertising();
jurica238814 18:442bc914996b 157 printf("Init done.\n");
jurica238814 16:e86a91db0b72 158 }
jurica238814 16:e86a91db0b72 159
jurica238814 16:e86a91db0b72 160 float getLight()
jurica238814 16:e86a91db0b72 161 {
jurica238814 16:e86a91db0b72 162 return ((float)analogIn.getData()[1])/ADC_RESOLUTION * VALUE_TO_PERCENTAGE;
jurica238814 16:e86a91db0b72 163 }
jurica238814 16:e86a91db0b72 164
jurica238814 16:e86a91db0b72 165 float voltage2temp(float vOut)
jurica238814 16:e86a91db0b72 166 {
jurica238814 16:e86a91db0b72 167 return ((float)vOut - (float)V0)/((float)TC);
jurica238814 16:e86a91db0b72 168 }
jurica238814 16:e86a91db0b72 169
jurica238814 16:e86a91db0b72 170 float getTemperature()
jurica238814 16:e86a91db0b72 171 {
jurica238814 16:e86a91db0b72 172 return voltage2temp(((float)analogIn.getData()[2])/ADC_RESOLUTION * (float)VCC);
jurica238814 16:e86a91db0b72 173 }
jurica238814 16:e86a91db0b72 174
jurica238814 16:e86a91db0b72 175 uint8_t getBattery()
jurica238814 16:e86a91db0b72 176 {
jurica238814 16:e86a91db0b72 177 uint16_t batteryVoltage = analogIn.getData()[0];
jurica238814 16:e86a91db0b72 178 const uint16_t zero_percent_limit = 739;
jurica238814 16:e86a91db0b72 179 const uint16_t onehundred_percent_limit = 810;
jurica238814 16:e86a91db0b72 180 const uint16_t percentage_increments = 5;
jurica238814 16:e86a91db0b72 181 uint8_t percentage;
jurica238814 16:e86a91db0b72 182
jurica238814 16:e86a91db0b72 183 if (batteryVoltage < zero_percent_limit)
jurica238814 16:e86a91db0b72 184 {
jurica238814 16:e86a91db0b72 185 percentage = 0;
jurica238814 16:e86a91db0b72 186 }
jurica238814 16:e86a91db0b72 187 else if(batteryVoltage > onehundred_percent_limit)
jurica238814 16:e86a91db0b72 188 {
jurica238814 16:e86a91db0b72 189 percentage = 100;
jurica238814 16:e86a91db0b72 190 }
jurica238814 16:e86a91db0b72 191 else
jurica238814 16:e86a91db0b72 192 {
jurica238814 16:e86a91db0b72 193 batteryVoltage -= zero_percent_limit;
jurica238814 16:e86a91db0b72 194 percentage = (batteryVoltage*100)/(onehundred_percent_limit - zero_percent_limit);
jurica238814 16:e86a91db0b72 195 percentage = percentage/percentage_increments*percentage_increments;
jurica238814 16:e86a91db0b72 196 }
jurica238814 16:e86a91db0b72 197
jurica238814 16:e86a91db0b72 198 return percentage;
jurica238814 16:e86a91db0b72 199 }
jurica238814 16:e86a91db0b72 200
jurica238814 16:e86a91db0b72 201 float getHumidity()
jurica238814 16:e86a91db0b72 202 {
jurica238814 16:e86a91db0b72 203 float result;
jurica238814 16:e86a91db0b72 204 si->getHumidity(&result);
jurica238814 16:e86a91db0b72 205 return result;
jurica238814 16:e86a91db0b72 206 }
jurica238814 16:e86a91db0b72 207
jurica238814 16:e86a91db0b72 208 void readGyroscope(vector3_s *gyroscopeData)
jurica238814 16:e86a91db0b72 209 {
jurica238814 16:e86a91db0b72 210 mems->readGyroscope((int16_t *)gyroscopeData);
jurica238814 16:e86a91db0b72 211 *gyroscopeData -= memsGyroscopeInit;
jurica238814 16:e86a91db0b72 212 }
jurica238814 16:e86a91db0b72 213
jurica238814 16:e86a91db0b72 214 void readAccelerometer(vector3_s *accelerometerData)
jurica238814 16:e86a91db0b72 215 {
jurica238814 16:e86a91db0b72 216 mems->readAccelerometer((int16_t *)accelerometerData);
jurica238814 16:e86a91db0b72 217 *accelerometerData -= memsAccelerometerInit;
jurica238814 16:e86a91db0b72 218 }
jurica238814 16:e86a91db0b72 219
jurica238814 16:e86a91db0b72 220 void readMagnetometer(vector3_s *magnetometerData){
jurica238814 16:e86a91db0b72 221 mems->readMagnetometer((int16_t *)magnetometerData);
jurica238814 16:e86a91db0b72 222 *magnetometerData -= memsMagnetometerInit;
jurica238814 16:e86a91db0b72 223 }
jurica238814 16:e86a91db0b72 224
jurica238814 16:e86a91db0b72 225 void calibrateAccelerometer(){
jurica238814 16:e86a91db0b72 226 vector3_s accelerometerData;
jurica238814 16:e86a91db0b72 227 for(uint8_t counter = 0; counter < CALIBRATION_STEPS; ++counter)
jurica238814 16:e86a91db0b72 228 {
jurica238814 16:e86a91db0b72 229 readAccelerometer(&accelerometerData);
jurica238814 16:e86a91db0b72 230 memsAccelerometerInit += accelerometerData;
jurica238814 16:e86a91db0b72 231 }
jurica238814 16:e86a91db0b72 232 memsAccelerometerInit /= CALIBRATION_STEPS;
jurica238814 16:e86a91db0b72 233 }
jurica238814 16:e86a91db0b72 234
jurica238814 16:e86a91db0b72 235 void calibrateGyroscope(){
jurica238814 16:e86a91db0b72 236 vector3_s gyroscopeData;
jurica238814 16:e86a91db0b72 237 for(uint8_t counter = 0; counter < CALIBRATION_STEPS; ++counter)
jurica238814 16:e86a91db0b72 238 {
jurica238814 16:e86a91db0b72 239 readGyroscope(&gyroscopeData);
jurica238814 16:e86a91db0b72 240 memsGyroscopeInit += gyroscopeData;
jurica238814 16:e86a91db0b72 241 }
jurica238814 16:e86a91db0b72 242 memsGyroscopeInit /= CALIBRATION_STEPS;
jurica238814 16:e86a91db0b72 243 }
jurica238814 16:e86a91db0b72 244
jurica238814 16:e86a91db0b72 245 void calibrateMag(){
jurica238814 16:e86a91db0b72 246 vector3_s magnetometerData;
jurica238814 16:e86a91db0b72 247 for(uint8_t counter = 0; counter < CALIBRATION_STEPS; ++counter)
jurica238814 16:e86a91db0b72 248 {
jurica238814 16:e86a91db0b72 249 readMagnetometer(&magnetometerData);
jurica238814 16:e86a91db0b72 250 memsMagnetometerInit += magnetometerData;
jurica238814 16:e86a91db0b72 251 }
jurica238814 16:e86a91db0b72 252 memsMagnetometerInit /= CALIBRATION_STEPS;
jurica238814 16:e86a91db0b72 253 }
jurica238814 16:e86a91db0b72 254
jurica238814 16:e86a91db0b72 255 void updateData(){
dbartolovic 36:9e40cdef6bd6 256 static uint16_t serviceUuid = macServicePtr->SERVICE_UUID;
jurica238814 16:e86a91db0b72 257 static uint8_t advertisementType = 0;
jurica238814 16:e86a91db0b72 258 int16_t temp_acc[3];
jurica238814 16:e86a91db0b72 259 BLE &ble = BLE::Instance();
jurica238814 16:e86a91db0b72 260
jurica238814 16:e86a91db0b72 261 if(!advertisementType && !gConnected)
jurica238814 16:e86a91db0b72 262 {
jurica238814 34:714dfddf2cd9 263 power = 1;
jurica238814 34:714dfddf2cd9 264 wait_ms(WAKEUP_TIME_DELAY_MS);
jurica238814 34:714dfddf2cd9 265 mems->startAccelerometer();
jurica238814 34:714dfddf2cd9 266 mems->startGyroscope();
jurica238814 34:714dfddf2cd9 267 mems->startMagnetometer();
jurica238814 34:714dfddf2cd9 268
jurica238814 16:e86a91db0b72 269 printf("Sensor format 1.\n");
jurica238814 18:442bc914996b 270 ble.gap().clearAdvertisingPayload();
jurica238814 18:442bc914996b 271 /* setup advertising */
dbartolovic 36:9e40cdef6bd6 272 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)&(serviceUuid), sizeof(serviceUuid));
jurica238814 18:442bc914996b 273 ble.gap().accumulateAdvertisingPayload(
jurica238814 18:442bc914996b 274 GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
jurica238814 18:442bc914996b 275 (uint8_t *)&advertisementPacket, sizeof(advertisementPacket));
jurica238814 18:442bc914996b 276 ble.gap().setAdvertisingType(
jurica238814 18:442bc914996b 277 GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jurica238814 18:442bc914996b 278
jurica238814 16:e86a91db0b72 279 adv_data = ble.getAdvertisingData();
jurica238814 16:e86a91db0b72 280 advertisementPacket.type = 0x00;
dbartolovic 36:9e40cdef6bd6 281
dbartolovic 36:9e40cdef6bd6 282 wait_ms(WAKEUP_TIME_DELAY_MS);
dbartolovic 36:9e40cdef6bd6 283
jurica238814 16:e86a91db0b72 284 readGyroscope((vector3_s *)advertisementPacket.gyroscope);
jurica238814 16:e86a91db0b72 285 readAccelerometer((vector3_s *)temp_acc);
jurica238814 16:e86a91db0b72 286 readMagnetometer((vector3_s *)advertisementPacket.magnetometer);
jurica238814 16:e86a91db0b72 287 advertisementPacket.acc_lsb_value = (0xF9E);
jurica238814 16:e86a91db0b72 288 // ^--- That's in ug cuz MSB is 1
jurica238814 16:e86a91db0b72 289 #if INVERT_AXES
jurica238814 16:e86a91db0b72 290 advertisementPacket.accelerometer[0] = temp_acc[1];
jurica238814 16:e86a91db0b72 291 advertisementPacket.accelerometer[1] = temp_acc[0];
jurica238814 16:e86a91db0b72 292 advertisementPacket.accelerometer[2] = temp_acc[2];
jurica238814 16:e86a91db0b72 293 #endif
jurica238814 16:e86a91db0b72 294
jurica238814 16:e86a91db0b72 295 adv_data.updateData(adv_data.MANUFACTURER_SPECIFIC_DATA,
jurica238814 16:e86a91db0b72 296 (uint8_t *)&advertisementPacket, sizeof(advertisementPacket));
jurica238814 16:e86a91db0b72 297 ble.setAdvertisingData(adv_data);
jurica238814 34:714dfddf2cd9 298
jurica238814 34:714dfddf2cd9 299 power = 0;
jurica238814 34:714dfddf2cd9 300 wait_ms(WAKEUP_TIME_DELAY_MS);
jurica238814 16:e86a91db0b72 301 }
jurica238814 16:e86a91db0b72 302 else if (advertisementType == 1 && !gConnected)
jurica238814 16:e86a91db0b72 303 {
jurica238814 34:714dfddf2cd9 304 power = 1;
jurica238814 34:714dfddf2cd9 305 wait_ms(WAKEUP_TIME_DELAY_MS);
jurica238814 34:714dfddf2cd9 306 temperaturePower = 1;
jurica238814 34:714dfddf2cd9 307 lightPower = 1;
jurica238814 34:714dfddf2cd9 308 shdn = 1; // Wake up the pressure sensor
dbartolovic 36:9e40cdef6bd6 309
dbartolovic 36:9e40cdef6bd6 310 wait_ms(WAKEUP_TIME_DELAY_MS);
jurica238814 34:714dfddf2cd9 311
jurica238814 16:e86a91db0b72 312 printf("Sensor format 2.\n");
jurica238814 16:e86a91db0b72 313 analogIn.updateData();
jurica238814 16:e86a91db0b72 314 adv_data = ble.getAdvertisingData();
jurica238814 16:e86a91db0b72 315 advertisementPacket.type = 0x01;
jurica238814 16:e86a91db0b72 316 advertisementPacket.temperature = getTemperature();
jurica238814 16:e86a91db0b72 317 advertisementPacket.light = getLight();
jurica238814 16:e86a91db0b72 318 advertisementPacket.humidity = getHumidity();
jurica238814 16:e86a91db0b72 319 advertisementPacket.pressure = mpl115a1->getPressure();
jurica238814 16:e86a91db0b72 320 advertisementPacket.battery = getBattery();
jurica238814 16:e86a91db0b72 321
jurica238814 16:e86a91db0b72 322 adv_data.updateData(adv_data.MANUFACTURER_SPECIFIC_DATA,
jurica238814 16:e86a91db0b72 323 (uint8_t *)&advertisementPacket, sizeof(advertisementPacket));
jurica238814 16:e86a91db0b72 324 ble.setAdvertisingData(adv_data);
jurica238814 34:714dfddf2cd9 325
jurica238814 34:714dfddf2cd9 326 power = 0;
jurica238814 34:714dfddf2cd9 327 wait_ms(WAKEUP_TIME_DELAY_MS);
jurica238814 34:714dfddf2cd9 328 temperaturePower = 0;
jurica238814 34:714dfddf2cd9 329 lightPower = 0;
jurica238814 34:714dfddf2cd9 330 shdn = 0; // Wake up the pressure sensor
jurica238814 16:e86a91db0b72 331 }
jurica238814 16:e86a91db0b72 332
jurica238814 16:e86a91db0b72 333 else if (!gConnected)
jurica238814 16:e86a91db0b72 334 {
jurica238814 16:e86a91db0b72 335 printf("Beacon format!\n");
jurica238814 18:442bc914996b 336 ble.gap().clearAdvertisingPayload();
jurica238814 18:442bc914996b 337 ble.gap().accumulateAdvertisingPayload(
jurica238814 18:442bc914996b 338 GapAdvertisingData::BREDR_NOT_SUPPORTED);
jurica238814 18:442bc914996b 339 ble.gap().accumulateAdvertisingPayload(
jurica238814 18:442bc914996b 340 GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
jurica238814 26:834af521af0a 341 (uint8_t*)&iBeaconMSD, sizeof(iBeaconMSD_t));
jurica238814 18:442bc914996b 342 ble.gap().startAdvertising();
jurica238814 16:e86a91db0b72 343 }
jurica238814 16:e86a91db0b72 344 if(++advertisementType > 2) advertisementType = 0;
dbartolovic 36:9e40cdef6bd6 345
dbartolovic 36:9e40cdef6bd6 346 macServicePtr->setAdvData((uint8_t*)&advertisementPacket);
jurica238814 16:e86a91db0b72 347 }
jurica238814 16:e86a91db0b72 348
jurica238814 16:e86a91db0b72 349 int main()
jurica238814 16:e86a91db0b72 350 {
jurica238814 16:e86a91db0b72 351 Thread bleT;
jurica238814 16:e86a91db0b72 352
jurica238814 16:e86a91db0b72 353 power = 1;
jurica238814 16:e86a91db0b72 354 wait_ms(WAKEUP_TIME_DELAY_MS);
jurica238814 16:e86a91db0b72 355 temperaturePower = 1;
jurica238814 16:e86a91db0b72 356 lightPower = 1;
jurica238814 16:e86a91db0b72 357 shdn = 1; // Wake up the pressure sensor
jurica238814 34:714dfddf2cd9 358
jurica238814 16:e86a91db0b72 359 analogIn.addChannel(9); // Set VDD as source to SAADC
jurica238814 16:e86a91db0b72 360 analogIn.addChannel(6); // Light
jurica238814 16:e86a91db0b72 361 analogIn.addChannel(7); // Temp
jurica238814 16:e86a91db0b72 362 analogIn.calibrate();
jurica238814 16:e86a91db0b72 363
jurica238814 16:e86a91db0b72 364 BLE &ble = BLE::Instance();
jurica238814 16:e86a91db0b72 365 ble.init(bleInitCompleteSensors);
jurica238814 16:e86a91db0b72 366 while(ble.hasInitialized() == false){
jurica238814 16:e86a91db0b72 367 /* spin loop */
jurica238814 16:e86a91db0b72 368 }
jurica238814 16:e86a91db0b72 369 ble.onEventsToProcess(scheduleBleEventsProcessing);
jurica238814 32:168317e16c69 370 advertisementPacket.header = APPLICATION_ID;
jurica238814 16:e86a91db0b72 371
jurica238814 16:e86a91db0b72 372 I2C i2c(I2C_DATA, I2C_CLK);
jurica238814 16:e86a91db0b72 373 si = new Si7006(&i2c);
jurica238814 16:e86a91db0b72 374 mems = new LSM9DS1(&i2c);
jurica238814 16:e86a91db0b72 375 spi = new SPI(SPI_MOSI, SPI_MISO, SPI_SCLK);
jurica238814 16:e86a91db0b72 376 mpl115a1 = new MPL115A1(*spi, cs);
jurica238814 16:e86a91db0b72 377
jurica238814 34:714dfddf2cd9 378 eventQueue.call_every(UPDATE_SENSORS_TIME_MS, updateData);
jurica238814 16:e86a91db0b72 379
jurica238814 16:e86a91db0b72 380 // This call stops main thread
jurica238814 16:e86a91db0b72 381 eventQueue.dispatch_forever();
jurica238814 16:e86a91db0b72 382 }