Dependencies:   BLE_API mbed nRF51822

Fork of SensorModulePIR by ModoSmart

Committer:
MisterGiet
Date:
Wed May 17 11:04:13 2017 +0000
Revision:
8:a0e1222bd768
Parent:
7:19fe55e82dd9
Switching to Mesh...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
waltercolitti 0:eb280529b0ef 1 #include "mbed.h"
MisterGiet 3:53db6c57bb61 2 #include "defineGPIOs.h"
waltercolitti 0:eb280529b0ef 3 #include "BLE.h"
MisterGiet 3:53db6c57bb61 4 //#include "HealthThermometerService.h"
MisterGiet 3:53db6c57bb61 5 #include "ble/services/HealthThermometerService.h" // added
waltercolitti 0:eb280529b0ef 6 #include "PresenceDetectionService.h"
MisterGiet 3:53db6c57bb61 7 #include "HumidityMeasureService.h"
waltercolitti 0:eb280529b0ef 8 #include "ble_gatt.h"
waltercolitti 0:eb280529b0ef 9 #include "Si7020.h"
MisterGiet 3:53db6c57bb61 10 #include "UARTService.h"
MisterGiet 3:53db6c57bb61 11 #include <string.h>
MisterGiet 8:a0e1222bd768 12 #include "DiscoveredCharacteristic.h"
MisterGiet 8:a0e1222bd768 13 #include "DiscoveredService.h"
waltercolitti 0:eb280529b0ef 14
MisterGiet 3:53db6c57bb61 15
MisterGiet 3:53db6c57bb61 16 // OFFSET TEMPERATURE CONFIGURATIONS:
MisterGiet 3:53db6c57bb61 17 #define STANDARD -1 // Squared radar sensor module: -1ºC
MisterGiet 3:53db6c57bb61 18 #define ZERO 0 // no offset
MisterGiet 3:53db6c57bb61 19 #define OFFSET STANDARD
MisterGiet 3:53db6c57bb61 20
MisterGiet 8:a0e1222bd768 21 #define NEED_SERIAL_CONSOLE_OUTPUT 1
MisterGiet 3:53db6c57bb61 22 #if NEED_SERIAL_CONSOLE_OUTPUT
MisterGiet 3:53db6c57bb61 23 Serial pc(PIN_TX, PIN_RX);
MisterGiet 3:53db6c57bb61 24 #define SERIAL_DEBUG(...) { printf(__VA_ARGS__); } //Defaults to stdio without having to wirte pcUart explicitly
MisterGiet 3:53db6c57bb61 25 #else
MisterGiet 3:53db6c57bb61 26 #define SERIAL_DEBUG(...) /* nothing */
MisterGiet 3:53db6c57bb61 27 #endif
MisterGiet 3:53db6c57bb61 28
MisterGiet 3:53db6c57bb61 29 #define NEED_BLE_OUTPUT 0 // Set this if you need debug messages on the console;
MisterGiet 3:53db6c57bb61 30 #if NEED_BLE_OUTPUT
MisterGiet 3:53db6c57bb61 31 #define DEBUG(STR) { if (uart) uart->write(STR, strlen(STR)); }
MisterGiet 3:53db6c57bb61 32 #else
MisterGiet 3:53db6c57bb61 33 #define DEBUG(...) /* nothing */
MisterGiet 3:53db6c57bb61 34 #endif /* #if NEED_CONSOLE_OUTPUT */
MisterGiet 3:53db6c57bb61 35
MisterGiet 8:a0e1222bd768 36 #define CHARACTERISTIC_PRES_UUID 0xA001
MisterGiet 8:a0e1222bd768 37 #define CHARACTERISTIC_TEMP_UUID 0x2A1C
MisterGiet 8:a0e1222bd768 38 #define CHARACTERISTIC_HUM_UUID 0xA005
MisterGiet 8:a0e1222bd768 39
MisterGiet 8:a0e1222bd768 40 #define SERVICE_PRES_UUID 0xA000
MisterGiet 8:a0e1222bd768 41 #define SERVICE_TEMP_UUID 0x1809
MisterGiet 8:a0e1222bd768 42 #define SERVICE_HUM_UUID 0xA004
MisterGiet 8:a0e1222bd768 43
MisterGiet 3:53db6c57bb61 44 I2C i2c(PIN_SDA, PIN_SCL);
waltercolitti 0:eb280529b0ef 45 Si7020 tempsensor(&i2c);
waltercolitti 0:eb280529b0ef 46
MisterGiet 6:80f2517965bb 47 InterruptIn motion_pin(PIN_PRESENCE_RIGHT);
MisterGiet 6:80f2517965bb 48 DigitalIn pinR(PIN_PRESENCE_RIGHT, PullNone);
MisterGiet 6:80f2517965bb 49 DigitalOut ledB(PIN_BLED_PCB, 1);
MisterGiet 6:80f2517965bb 50 DigitalOut ledR(PIN_RLED_PCB, 1);
MisterGiet 3:53db6c57bb61 51
MisterGiet 8:a0e1222bd768 52 //bool presenceState = false;
MisterGiet 6:80f2517965bb 53 int presenceCounter = 0;
MisterGiet 8:a0e1222bd768 54 bool installMode = 1; // to turn on leds and fast update of BLE services
MisterGiet 5:173ffbf84b3a 55 bool battNotify = 1;
MisterGiet 5:173ffbf84b3a 56 static volatile bool triggerPresencePolling = false;
MisterGiet 8:a0e1222bd768 57 static volatile bool triggerSensorPolling = false;
MisterGiet 5:173ffbf84b3a 58
MisterGiet 5:173ffbf84b3a 59
MisterGiet 8:a0e1222bd768 60 /* BLE VARS CONFIGURATION */
MisterGiet 5:173ffbf84b3a 61
MisterGiet 5:173ffbf84b3a 62 BLE ble;
MisterGiet 8:a0e1222bd768 63
MisterGiet 8:a0e1222bd768 64 bool foundPresenceCharacteristic = false;
MisterGiet 8:a0e1222bd768 65 bool foundTemperatureCharacteristic = false;
MisterGiet 8:a0e1222bd768 66 bool foundHumidityCharacteristic = false;
MisterGiet 5:173ffbf84b3a 67
MisterGiet 8:a0e1222bd768 68 DiscoveredCharacteristic presenceCharacteristic;
MisterGiet 8:a0e1222bd768 69 DiscoveredCharacteristic temperatureCharacteristic;
MisterGiet 8:a0e1222bd768 70 DiscoveredCharacteristic humidityCharacteristic;
MisterGiet 8:a0e1222bd768 71
MisterGiet 8:a0e1222bd768 72 PresenceDetectionService *presenceService = NULL;
MisterGiet 5:173ffbf84b3a 73 static HealthThermometerService *thermometerServicePtr;
MisterGiet 5:173ffbf84b3a 74 HumidityMeasureService *humidityService = NULL;
MisterGiet 5:173ffbf84b3a 75 UARTService *uart;
MisterGiet 8:a0e1222bd768 76
MisterGiet 8:a0e1222bd768 77 int neighborPresence = 0;
MisterGiet 8:a0e1222bd768 78 float neighborTemperature = 0;
MisterGiet 8:a0e1222bd768 79 int neighborHumidity = 0;
MisterGiet 8:a0e1222bd768 80
MisterGiet 8:a0e1222bd768 81 uint8_t PEER_DEV_NAME[4] = {0x53,0x4D,0x3F,0x3F}; // = SM??
MisterGiet 8:a0e1222bd768 82 static const char DEVICE_NAME[] = "SM01";
MisterGiet 8:a0e1222bd768 83 static const uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE};
MisterGiet 8:a0e1222bd768 84 static char fwversion[31] = "SON-2017";
MisterGiet 8:a0e1222bd768 85 static uint8_t batteryLevel = 100;
MisterGiet 8:a0e1222bd768 86 static int8_t TxPower = +4;
MisterGiet 8:a0e1222bd768 87 const static uint8_t ManufData[] = {0x01,0x02,0x03,0x04,0x05}; // Set up to 26B of advertising data to use for the Manufacturer data.
MisterGiet 5:173ffbf84b3a 88
MisterGiet 5:173ffbf84b3a 89 // Firmware
MisterGiet 5:173ffbf84b3a 90 GattCharacteristic fwChars(GattCharacteristic::UUID_FIRMWARE_REVISION_STRING_CHAR, (uint8_t *)fwversion, sizeof(fwversion), sizeof(fwversion),GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
MisterGiet 5:173ffbf84b3a 91 GattCharacteristic *firmwareChars[] = {&fwChars };
MisterGiet 5:173ffbf84b3a 92 GattService firmwareService(GattService::UUID_DEVICE_INFORMATION_SERVICE, firmwareChars, sizeof(firmwareChars) / sizeof(GattCharacteristic *));
MisterGiet 5:173ffbf84b3a 93
MisterGiet 5:173ffbf84b3a 94 //Battery
MisterGiet 5:173ffbf84b3a 95 GattCharacteristic batteryPercentage(GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, (uint8_t *)batteryLevel, sizeof(batteryLevel), sizeof(batteryLevel), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
MisterGiet 5:173ffbf84b3a 96 GattCharacteristic *batteryChars[] = {&batteryPercentage};
MisterGiet 5:173ffbf84b3a 97 GattService batteryService(GattService::UUID_BATTERY_SERVICE, batteryChars, sizeof(batteryChars) / sizeof(GattCharacteristic *));
MisterGiet 5:173ffbf84b3a 98
MisterGiet 5:173ffbf84b3a 99 //Power
MisterGiet 5:173ffbf84b3a 100 GattCharacteristic TxPowerChar(GattCharacteristic::UUID_TX_POWER_LEVEL_CHAR, (uint8_t*)&TxPower, sizeof(TxPower), sizeof(TxPower), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
MisterGiet 5:173ffbf84b3a 101 GattCharacteristic *charTable[] = {&TxPowerChar};
MisterGiet 5:173ffbf84b3a 102 GattService TxPowerService(GattService::UUID_TX_POWER_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
MisterGiet 5:173ffbf84b3a 103
MisterGiet 3:53db6c57bb61 104 /* BATTERY MEASUREMENT */
MisterGiet 3:53db6c57bb61 105 void my_analogin_init(void)
MisterGiet 3:53db6c57bb61 106 {
MisterGiet 3:53db6c57bb61 107 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
MisterGiet 3:53db6c57bb61 108 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
MisterGiet 3:53db6c57bb61 109 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
MisterGiet 3:53db6c57bb61 110 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
MisterGiet 3:53db6c57bb61 111 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
MisterGiet 3:53db6c57bb61 112 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
MisterGiet 3:53db6c57bb61 113 }
MisterGiet 3:53db6c57bb61 114
MisterGiet 3:53db6c57bb61 115 uint16_t my_analogin_read_u16(void)
MisterGiet 3:53db6c57bb61 116 {
MisterGiet 3:53db6c57bb61 117 NRF_ADC->CONFIG &= ~ADC_CONFIG_PSEL_Msk;
MisterGiet 3:53db6c57bb61 118 NRF_ADC->CONFIG |= ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos;
MisterGiet 3:53db6c57bb61 119 NRF_ADC->TASKS_START = 1;
MisterGiet 3:53db6c57bb61 120 while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {};
MisterGiet 3:53db6c57bb61 121 return (uint16_t)NRF_ADC->RESULT; // 10 bit
MisterGiet 3:53db6c57bb61 122 }
waltercolitti 0:eb280529b0ef 123
MisterGiet 3:53db6c57bb61 124 float getBatteryVolt (void)
MisterGiet 3:53db6c57bb61 125 {
MisterGiet 3:53db6c57bb61 126 char Vpower[10];
MisterGiet 3:53db6c57bb61 127
MisterGiet 3:53db6c57bb61 128 float Vadc = (float)my_analogin_read_u16();
MisterGiet 3:53db6c57bb61 129 float Vref = 1.2; // Internal Vref
MisterGiet 3:53db6c57bb61 130 float Vcc = 3 * 4 * Vref * Vadc / 1024.0;
MisterGiet 3:53db6c57bb61 131
MisterGiet 3:53db6c57bb61 132 sprintf (Vpower, "Vcc=%.2fV, ", Vcc);
MisterGiet 3:53db6c57bb61 133 DEBUG(Vpower);
MisterGiet 3:53db6c57bb61 134 return Vcc;
MisterGiet 3:53db6c57bb61 135 }
MisterGiet 3:53db6c57bb61 136
MisterGiet 3:53db6c57bb61 137 int getBatteryPercent ()
MisterGiet 3:53db6c57bb61 138 {
MisterGiet 3:53db6c57bb61 139 char batt_mess[10];
MisterGiet 4:de22f0d73c12 140 float Vbat_min = 2; //2;
MisterGiet 3:53db6c57bb61 141 float Vbat_max = 3;
MisterGiet 3:53db6c57bb61 142 int battLevel = (int) ( ((getBatteryVolt()-Vbat_min) / (Vbat_max-Vbat_min)) *100);
MisterGiet 3:53db6c57bb61 143
MisterGiet 3:53db6c57bb61 144 sprintf (batt_mess, "Vbatt=%i, ", battLevel);
MisterGiet 3:53db6c57bb61 145 DEBUG(batt_mess);
MisterGiet 3:53db6c57bb61 146
MisterGiet 3:53db6c57bb61 147 // To avoid values bigger than 100%
MisterGiet 3:53db6c57bb61 148 if (battLevel > 100) {
MisterGiet 3:53db6c57bb61 149 battLevel = 100;
MisterGiet 3:53db6c57bb61 150 }
MisterGiet 3:53db6c57bb61 151
MisterGiet 4:de22f0d73c12 152 // To avoid overflow due to a value lower than Vbat_min
MisterGiet 4:de22f0d73c12 153 if (battLevel >= 250) {
MisterGiet 4:de22f0d73c12 154 battLevel = 0;
MisterGiet 4:de22f0d73c12 155 }
MisterGiet 4:de22f0d73c12 156
MisterGiet 3:53db6c57bb61 157 return battLevel;
MisterGiet 3:53db6c57bb61 158 }
MisterGiet 3:53db6c57bb61 159
MisterGiet 3:53db6c57bb61 160 void blinkLed (bool enable, int color)
MisterGiet 3:53db6c57bb61 161 {
MisterGiet 3:53db6c57bb61 162 if (enable) {
MisterGiet 3:53db6c57bb61 163 if (color == 1) {
MisterGiet 3:53db6c57bb61 164 ledB=0;
MisterGiet 3:53db6c57bb61 165 wait(0.2);
MisterGiet 3:53db6c57bb61 166 ledB=1;
MisterGiet 3:53db6c57bb61 167 wait(0.2);
MisterGiet 3:53db6c57bb61 168 }
MisterGiet 3:53db6c57bb61 169 if (color == 2) {
MisterGiet 3:53db6c57bb61 170 ledR=0;
MisterGiet 3:53db6c57bb61 171 wait(0.2);
MisterGiet 3:53db6c57bb61 172 ledR=1;
MisterGiet 3:53db6c57bb61 173 wait(0.2);
MisterGiet 3:53db6c57bb61 174 }
MisterGiet 3:53db6c57bb61 175 } else {
MisterGiet 3:53db6c57bb61 176 // do nothing if enable=0
MisterGiet 3:53db6c57bb61 177 }
MisterGiet 3:53db6c57bb61 178 }
waltercolitti 0:eb280529b0ef 179
MisterGiet 6:80f2517965bb 180 uint8_t updatePresenceCounter (int counts)
MisterGiet 6:80f2517965bb 181 {
MisterGiet 6:80f2517965bb 182 uint8_t uint8_counter;
MisterGiet 6:80f2517965bb 183
MisterGiet 6:80f2517965bb 184 if (counts>=255) {
MisterGiet 6:80f2517965bb 185 uint8_counter = 255;
MisterGiet 6:80f2517965bb 186
MisterGiet 6:80f2517965bb 187 } else {
MisterGiet 6:80f2517965bb 188 uint8_counter = uint8_t(counts);
MisterGiet 6:80f2517965bb 189 }
MisterGiet 6:80f2517965bb 190
MisterGiet 6:80f2517965bb 191 return uint8_counter;
MisterGiet 6:80f2517965bb 192 }
waltercolitti 0:eb280529b0ef 193 float getTemperature(void)
waltercolitti 0:eb280529b0ef 194 {
MisterGiet 3:53db6c57bb61 195 float temp;
MisterGiet 4:de22f0d73c12 196
MisterGiet 3:53db6c57bb61 197 if(tempsensor.getTemperature(&temp) != 0) {
MisterGiet 3:53db6c57bb61 198 DEBUG("Error getting temperature");
MisterGiet 3:53db6c57bb61 199 temp = -1;
MisterGiet 3:53db6c57bb61 200 }
waltercolitti 0:eb280529b0ef 201
MisterGiet 3:53db6c57bb61 202 // Debugging:
MisterGiet 3:53db6c57bb61 203 SERIAL_DEBUG("\nTemperature = %.2f", temp);
MisterGiet 3:53db6c57bb61 204 char message[50];
MisterGiet 3:53db6c57bb61 205 sprintf (message, "T=%.2fC\n", temp);
MisterGiet 3:53db6c57bb61 206 DEBUG(message);
MisterGiet 4:de22f0d73c12 207
MisterGiet 3:53db6c57bb61 208 // Adding offset:
MisterGiet 3:53db6c57bb61 209 temp = temp + OFFSET;
MisterGiet 3:53db6c57bb61 210
MisterGiet 3:53db6c57bb61 211 return temp;
waltercolitti 0:eb280529b0ef 212 }
waltercolitti 0:eb280529b0ef 213
MisterGiet 3:53db6c57bb61 214 float getHumidity(void)
MisterGiet 3:53db6c57bb61 215 {
MisterGiet 3:53db6c57bb61 216 float hum;
MisterGiet 3:53db6c57bb61 217 if(tempsensor.getHumidity(&hum) != 0) {
MisterGiet 3:53db6c57bb61 218 SERIAL_DEBUG("Error getting humidity");
MisterGiet 3:53db6c57bb61 219 hum = -1;
MisterGiet 3:53db6c57bb61 220 }
MisterGiet 3:53db6c57bb61 221
MisterGiet 3:53db6c57bb61 222 // Debugging:
MisterGiet 3:53db6c57bb61 223 SERIAL_DEBUG("\nHumidity = %f", hum);
MisterGiet 3:53db6c57bb61 224 char message[50];
MisterGiet 3:53db6c57bb61 225 sprintf (message, "RH=%d\n", (int)hum);
MisterGiet 3:53db6c57bb61 226 DEBUG(message);
MisterGiet 3:53db6c57bb61 227
MisterGiet 3:53db6c57bb61 228 return hum;
MisterGiet 3:53db6c57bb61 229 }
MisterGiet 3:53db6c57bb61 230
MisterGiet 8:a0e1222bd768 231 /**
MisterGiet 8:a0e1222bd768 232 * This function is called when the ble initialization process has failed
MisterGiet 8:a0e1222bd768 233 */
MisterGiet 8:a0e1222bd768 234 void onBleInitError(BLE &ble, ble_error_t error)
MisterGiet 8:a0e1222bd768 235 {
MisterGiet 8:a0e1222bd768 236 /* Avoid compiler warnings */
MisterGiet 8:a0e1222bd768 237 (void) ble;
MisterGiet 8:a0e1222bd768 238 (void) error;
MisterGiet 8:a0e1222bd768 239 /* Initialization error handling should go here */
MisterGiet 8:a0e1222bd768 240 }
MisterGiet 8:a0e1222bd768 241
MisterGiet 8:a0e1222bd768 242 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params)
MisterGiet 8:a0e1222bd768 243 {
MisterGiet 8:a0e1222bd768 244 //ble.gap().getAdvertisingPayload(); // superfluo?
MisterGiet 8:a0e1222bd768 245 SERIAL_DEBUG("\n*****************************");
MisterGiet 8:a0e1222bd768 246 SERIAL_DEBUG("\n>>Start advertisementCallback");
MisterGiet 8:a0e1222bd768 247
MisterGiet 8:a0e1222bd768 248 // Some nice debugging:
MisterGiet 8:a0e1222bd768 249 SERIAL_DEBUG("\nLooking for devices in the neighbourhood....");
MisterGiet 8:a0e1222bd768 250 SERIAL_DEBUG("\nThe peer's BLE address: ");
MisterGiet 8:a0e1222bd768 251 for(uint8_t index=0; index<=5; index++) {
MisterGiet 8:a0e1222bd768 252 SERIAL_DEBUG("%02x ", params->peerAddr[5-index]); // for such a reason the address is reverse-ordered
MisterGiet 8:a0e1222bd768 253 }
MisterGiet 8:a0e1222bd768 254 SERIAL_DEBUG("\nThe peer's RSSI value: %i", params->rssi);
MisterGiet 8:a0e1222bd768 255 SERIAL_DEBUG("\nThe peer's is ScanResponse: %i", params->isScanResponse);
MisterGiet 8:a0e1222bd768 256 SERIAL_DEBUG("\nThe peer's Advertisement type: %i", params->type);
MisterGiet 8:a0e1222bd768 257 SERIAL_DEBUG("\nThe peer's advertisement Payload: ");
MisterGiet 8:a0e1222bd768 258 for(uint8_t index=0; index<=30; index++) {
MisterGiet 8:a0e1222bd768 259 SERIAL_DEBUG("%02x ", params->advertisingData[index]);
MisterGiet 8:a0e1222bd768 260 }
MisterGiet 8:a0e1222bd768 261 SERIAL_DEBUG("\nThe peer's DEVICE NAME: ");
MisterGiet 8:a0e1222bd768 262 for(uint8_t index=23; index<=26; index++) {
MisterGiet 8:a0e1222bd768 263 SERIAL_DEBUG("%c", params->advertisingData[index]);
MisterGiet 8:a0e1222bd768 264 }
MisterGiet 8:a0e1222bd768 265 SERIAL_DEBUG("(");
MisterGiet 8:a0e1222bd768 266 for(uint8_t index=23; index<=26; index++) {
MisterGiet 8:a0e1222bd768 267 SERIAL_DEBUG("%02x:", params->advertisingData[index]);
MisterGiet 8:a0e1222bd768 268 }
MisterGiet 8:a0e1222bd768 269 SERIAL_DEBUG(") ");
MisterGiet 8:a0e1222bd768 270
MisterGiet 8:a0e1222bd768 271 /* If the central device hasn't found yet the peripheral:*/
MisterGiet 8:a0e1222bd768 272 //if (!deviceFound) {
MisterGiet 8:a0e1222bd768 273
MisterGiet 8:a0e1222bd768 274 // If the peers peripheral does not correpond to the desired PEER_DEV_NAME: exit
MisterGiet 8:a0e1222bd768 275 if ( (params->advertisingData[23] != PEER_DEV_NAME[0]) || (params->advertisingData[24] != PEER_DEV_NAME[1])
MisterGiet 8:a0e1222bd768 276 || (params->advertisingData[25] != PEER_DEV_NAME[2]) || (params->advertisingData[26] != PEER_DEV_NAME[3]) ) {
MisterGiet 8:a0e1222bd768 277
MisterGiet 8:a0e1222bd768 278 SERIAL_DEBUG("\n>PEER DEVICE NOT FOUND\n");
MisterGiet 8:a0e1222bd768 279 return;
MisterGiet 8:a0e1222bd768 280
MisterGiet 8:a0e1222bd768 281 } else {
MisterGiet 8:a0e1222bd768 282 BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL);
MisterGiet 8:a0e1222bd768 283 //deviceFound = true;
MisterGiet 8:a0e1222bd768 284 SERIAL_DEBUG("\n CONNECTED!\n");
MisterGiet 8:a0e1222bd768 285 blinkLed(installMode,1);
MisterGiet 8:a0e1222bd768 286 blinkLed(installMode,1);
MisterGiet 8:a0e1222bd768 287 }
MisterGiet 8:a0e1222bd768 288 //}
MisterGiet 8:a0e1222bd768 289 SERIAL_DEBUG("\n> End advertisementCallback\n");
MisterGiet 8:a0e1222bd768 290 }
MisterGiet 8:a0e1222bd768 291
MisterGiet 8:a0e1222bd768 292 void serviceDiscoveryCallback(const DiscoveredService *service)
MisterGiet 8:a0e1222bd768 293 {
MisterGiet 8:a0e1222bd768 294 SERIAL_DEBUG("\n>>> SERVICE DISCOVERY \n");
MisterGiet 8:a0e1222bd768 295 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
MisterGiet 8:a0e1222bd768 296 SERIAL_DEBUG(" S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
MisterGiet 8:a0e1222bd768 297 } else {
MisterGiet 8:a0e1222bd768 298 printf(" S UUID-");
MisterGiet 8:a0e1222bd768 299 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
MisterGiet 8:a0e1222bd768 300 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
MisterGiet 8:a0e1222bd768 301 SERIAL_DEBUG("%02x", longUUIDBytes[i]);
MisterGiet 8:a0e1222bd768 302 }
MisterGiet 8:a0e1222bd768 303 SERIAL_DEBUG(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
MisterGiet 8:a0e1222bd768 304 }
MisterGiet 8:a0e1222bd768 305 SERIAL_DEBUG("<<< End Service discovery Callback\n\n");
MisterGiet 8:a0e1222bd768 306 }
MisterGiet 8:a0e1222bd768 307
MisterGiet 8:a0e1222bd768 308 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP)
MisterGiet 8:a0e1222bd768 309 {
MisterGiet 8:a0e1222bd768 310 SERIAL_DEBUG(" >> CHARACTERISTIC DISCOVERY \n");
MisterGiet 8:a0e1222bd768 311 SERIAL_DEBUG(" UUID %x\n", characteristicP->getUUID().getShortUUID());
MisterGiet 8:a0e1222bd768 312 SERIAL_DEBUG(" C UUID-%02x valueAttr[%02x] props[%02x] DEVICE_NAME[%02x]\n", characteristicP->getUUID(), characteristicP->getValueHandle(),
MisterGiet 8:a0e1222bd768 313 characteristicP->getProperties().broadcast());
MisterGiet 8:a0e1222bd768 314
MisterGiet 8:a0e1222bd768 315 if (characteristicP->getUUID().getShortUUID() == CHARACTERISTIC_PRES_UUID) {
MisterGiet 8:a0e1222bd768 316 SERIAL_DEBUG("-->Found presence characteristic! ** \n");
MisterGiet 8:a0e1222bd768 317 presenceCharacteristic = *characteristicP;
MisterGiet 8:a0e1222bd768 318 foundPresenceCharacteristic = true;
MisterGiet 8:a0e1222bd768 319 }
MisterGiet 8:a0e1222bd768 320
MisterGiet 8:a0e1222bd768 321 if (characteristicP->getUUID().getShortUUID() == CHARACTERISTIC_TEMP_UUID) {
MisterGiet 8:a0e1222bd768 322 SERIAL_DEBUG("-->Found temperature characteristic! ** \n");
MisterGiet 8:a0e1222bd768 323 temperatureCharacteristic = *characteristicP;
MisterGiet 8:a0e1222bd768 324 foundTemperatureCharacteristic = true;
MisterGiet 8:a0e1222bd768 325 }
MisterGiet 8:a0e1222bd768 326
MisterGiet 8:a0e1222bd768 327 if (characteristicP->getUUID().getShortUUID() == CHARACTERISTIC_HUM_UUID) {
MisterGiet 8:a0e1222bd768 328 SERIAL_DEBUG("-->Found humidity characteristic! ** \n");
MisterGiet 8:a0e1222bd768 329 humidityCharacteristic = *characteristicP;
MisterGiet 8:a0e1222bd768 330 foundHumidityCharacteristic = true;
MisterGiet 8:a0e1222bd768 331 }
MisterGiet 8:a0e1222bd768 332 SERIAL_DEBUG(" << End Characteristic discovery Callback\r\n");
MisterGiet 8:a0e1222bd768 333 }
MisterGiet 8:a0e1222bd768 334
MisterGiet 8:a0e1222bd768 335 void discoveryTerminationCallback(Gap::Handle_t connectionHandle)
MisterGiet 8:a0e1222bd768 336 {
MisterGiet 8:a0e1222bd768 337 SERIAL_DEBUG("Terminated Discovery for handle %u\r\n", connectionHandle);
MisterGiet 8:a0e1222bd768 338 blinkLed(installMode,1);
MisterGiet 8:a0e1222bd768 339 blinkLed(installMode,1);
MisterGiet 8:a0e1222bd768 340 blinkLed(installMode,1);
MisterGiet 8:a0e1222bd768 341 }
MisterGiet 8:a0e1222bd768 342
MisterGiet 8:a0e1222bd768 343 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
MisterGiet 8:a0e1222bd768 344 {
MisterGiet 8:a0e1222bd768 345 SERIAL_DEBUG(">> Connection Callback\r\n");
MisterGiet 8:a0e1222bd768 346 if (params->role == Gap::CENTRAL) {
MisterGiet 8:a0e1222bd768 347 SERIAL_DEBUG("Launching discovery of BLE services and characteristics...\n");
MisterGiet 8:a0e1222bd768 348 //connectionHandle = params->handle;
MisterGiet 8:a0e1222bd768 349 ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
MisterGiet 8:a0e1222bd768 350 ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback);
MisterGiet 8:a0e1222bd768 351 }
MisterGiet 8:a0e1222bd768 352
MisterGiet 8:a0e1222bd768 353 SERIAL_DEBUG("> End Connection Callback\r\n");
MisterGiet 8:a0e1222bd768 354 }
MisterGiet 8:a0e1222bd768 355
MisterGiet 8:a0e1222bd768 356 void sendRemoteValues(const GattWriteCallbackParams *response)
MisterGiet 8:a0e1222bd768 357 {
MisterGiet 8:a0e1222bd768 358 SERIAL_DEBUG("Presence resetted \n");
MisterGiet 8:a0e1222bd768 359 }
MisterGiet 8:a0e1222bd768 360
MisterGiet 8:a0e1222bd768 361 void getRemoteValues(const GattReadCallbackParams *response)
MisterGiet 8:a0e1222bd768 362 {
MisterGiet 8:a0e1222bd768 363 SERIAL_DEBUG("\nStart getRemote Values\n");
MisterGiet 8:a0e1222bd768 364 if (response->handle == presenceCharacteristic.getValueHandle()) {
MisterGiet 8:a0e1222bd768 365 #if DUMP_READ_DATA
MisterGiet 8:a0e1222bd768 366 printf("triggerToggledWrite: handle %u, offset %u, len %u\r\n", response->handle, response->offset, response->len);
MisterGiet 8:a0e1222bd768 367 for (unsigned index = 0; index < response->len; index++) {
MisterGiet 8:a0e1222bd768 368 printf("%c[%02x]", response->data[index], response->data[index]);
MisterGiet 8:a0e1222bd768 369 }
MisterGiet 8:a0e1222bd768 370 printf("\r\n");
MisterGiet 8:a0e1222bd768 371
MisterGiet 8:a0e1222bd768 372 #endif
MisterGiet 8:a0e1222bd768 373 neighborPresence = response->data[0];
MisterGiet 8:a0e1222bd768 374 SERIAL_DEBUG("Neighbour presence: %d", neighborPresence);
MisterGiet 8:a0e1222bd768 375 } else {
MisterGiet 8:a0e1222bd768 376 SERIAL_DEBUG("\nERROR while getting presence value\n");
MisterGiet 8:a0e1222bd768 377 }
MisterGiet 8:a0e1222bd768 378
MisterGiet 8:a0e1222bd768 379 if (response->handle == temperatureCharacteristic.getValueHandle()) {
MisterGiet 8:a0e1222bd768 380 #if DUMP_READ_DATA
MisterGiet 8:a0e1222bd768 381 SERIAL_DEBUG("triggerToggledWrite: handle %u, offset %u, len %u\r\n", response->handle, response->offset, response->len);
MisterGiet 8:a0e1222bd768 382 for (unsigned index = 0; index < response->len; index++) {
MisterGiet 8:a0e1222bd768 383 printf("%c[%02x]", response->data[index], response->data[index]);
MisterGiet 8:a0e1222bd768 384 }
MisterGiet 8:a0e1222bd768 385 SERIAL_DEBUG("\nERROR while getting temperature value\n");
MisterGiet 8:a0e1222bd768 386 printf("\r\n");
MisterGiet 8:a0e1222bd768 387 #endif
MisterGiet 8:a0e1222bd768 388 neighborTemperature = float( (response->data[1]) + (response->data[2] << 8) ) /100;
MisterGiet 8:a0e1222bd768 389 SERIAL_DEBUG("Neighbour temperature: %.2f (%x:%x:%x:%x\n)\n", float(neighborTemperature),response->data[0],response->data[1],response->data[2],response->data[3]);
MisterGiet 8:a0e1222bd768 390 //SERIAL_DEBUG("Neighbour temperature(HEX): %x:%x:%x:%x\n", response->data[0],response->data[1],response->data[2],response->data[3]);
MisterGiet 8:a0e1222bd768 391 }
MisterGiet 8:a0e1222bd768 392
MisterGiet 8:a0e1222bd768 393 if (response->handle == humidityCharacteristic.getValueHandle()) {
MisterGiet 8:a0e1222bd768 394 #if DUMP_READ_DATA
MisterGiet 8:a0e1222bd768 395 printf("triggerToggledWrite: handle %u, offset %u, len %u\r", response->handle, response->offset, response->len);
MisterGiet 8:a0e1222bd768 396 for (unsigned index = 0; index < response->len; index++) {
MisterGiet 8:a0e1222bd768 397 printf("%c[%02x]", response->data[index], response->data[index]);
MisterGiet 8:a0e1222bd768 398 }
MisterGiet 8:a0e1222bd768 399 printf("\r\n");
MisterGiet 8:a0e1222bd768 400 #endif
MisterGiet 8:a0e1222bd768 401 neighborHumidity = response->data[0];
MisterGiet 8:a0e1222bd768 402 SERIAL_DEBUG("Neighbour humidity: %f", neighborHumidity);
MisterGiet 8:a0e1222bd768 403 } else {
MisterGiet 8:a0e1222bd768 404 SERIAL_DEBUG("\nERROR while getting temperature value\n");
MisterGiet 8:a0e1222bd768 405 }
MisterGiet 8:a0e1222bd768 406 SERIAL_DEBUG("> End getRemote Values\r\n");
MisterGiet 8:a0e1222bd768 407 }
MisterGiet 8:a0e1222bd768 408
MisterGiet 8:a0e1222bd768 409 /* Restart Advertising on disconnection*/
MisterGiet 8:a0e1222bd768 410 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
MisterGiet 8:a0e1222bd768 411 {
MisterGiet 8:a0e1222bd768 412 SERIAL_DEBUG("> Disconnected\r\n");
MisterGiet 8:a0e1222bd768 413 BLE::Instance().gap().startAdvertising();
MisterGiet 8:a0e1222bd768 414 ble.gap().setScanParams(500, 100);
MisterGiet 8:a0e1222bd768 415 BLE::Instance().gap().startScan(advertisementCallback);
MisterGiet 8:a0e1222bd768 416 }
MisterGiet 8:a0e1222bd768 417
MisterGiet 3:53db6c57bb61 418 void onDataWrittenCallback(const GattWriteCallbackParams *params)
waltercolitti 0:eb280529b0ef 419 {
MisterGiet 8:a0e1222bd768 420 int sel = params->data[0];
MisterGiet 6:80f2517965bb 421
MisterGiet 8:a0e1222bd768 422 if (sel == 1) {
MisterGiet 8:a0e1222bd768 423 blinkLed(installMode,1);
MisterGiet 3:53db6c57bb61 424 SERIAL_DEBUG("BLE. Resetting presence\n");
MisterGiet 6:80f2517965bb 425 presenceCounter = 0;
MisterGiet 6:80f2517965bb 426 triggerSensorPolling = true; // force update of all BLE services
MisterGiet 3:53db6c57bb61 427 }
MisterGiet 3:53db6c57bb61 428
MisterGiet 8:a0e1222bd768 429 if (sel == 2) {
MisterGiet 3:53db6c57bb61 430 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 431 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 432 SERIAL_DEBUG("BLE. All LEDs ON/OFF\n");
MisterGiet 8:a0e1222bd768 433 installMode = !installMode;
MisterGiet 3:53db6c57bb61 434 }
MisterGiet 3:53db6c57bb61 435
MisterGiet 8:a0e1222bd768 436 if (sel == 3) {
MisterGiet 3:53db6c57bb61 437 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 438 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 439 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 440 SERIAL_DEBUG("BLE. Rebooting sensor\n");
MisterGiet 3:53db6c57bb61 441 wait(3);
MisterGiet 3:53db6c57bb61 442 NVIC_SystemReset(); // SW Reset
MisterGiet 3:53db6c57bb61 443 }
waltercolitti 0:eb280529b0ef 444 }
waltercolitti 0:eb280529b0ef 445
waltercolitti 0:eb280529b0ef 446 /**
waltercolitti 0:eb280529b0ef 447 * Callback triggered when the ble initialization process has finished
waltercolitti 0:eb280529b0ef 448 */
waltercolitti 0:eb280529b0ef 449 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
waltercolitti 0:eb280529b0ef 450 {
MisterGiet 3:53db6c57bb61 451 SERIAL_DEBUG("BLE. Init \n");
MisterGiet 3:53db6c57bb61 452
MisterGiet 3:53db6c57bb61 453 BLE& ble = params->ble;
waltercolitti 0:eb280529b0ef 454 ble_error_t error = params->error;
waltercolitti 0:eb280529b0ef 455
waltercolitti 0:eb280529b0ef 456 if (error != BLE_ERROR_NONE) {
waltercolitti 0:eb280529b0ef 457 /* In case of error, forward the error handling to onBleInitError */
waltercolitti 0:eb280529b0ef 458 onBleInitError(ble, error);
waltercolitti 0:eb280529b0ef 459 return;
waltercolitti 0:eb280529b0ef 460 }
waltercolitti 0:eb280529b0ef 461
waltercolitti 0:eb280529b0ef 462 /* Ensure that it is the default instance of BLE */
waltercolitti 0:eb280529b0ef 463 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
waltercolitti 0:eb280529b0ef 464 return;
waltercolitti 0:eb280529b0ef 465 }
MisterGiet 3:53db6c57bb61 466
waltercolitti 0:eb280529b0ef 467 //ble.gap().onConnection(connectionCallback);
MisterGiet 3:53db6c57bb61 468 ble.gap().onDisconnection(disconnectionCallback);
waltercolitti 0:eb280529b0ef 469
MisterGiet 3:53db6c57bb61 470 // Set Transmission power:
MisterGiet 3:53db6c57bb61 471 ble.setTxPower(TxPower);
MisterGiet 3:53db6c57bb61 472
MisterGiet 8:a0e1222bd768 473 //ble.gap().setScanParams(500, 100);
waltercolitti 0:eb280529b0ef 474 //ble.gap().startScan(advertisementCallback);
MisterGiet 3:53db6c57bb61 475
waltercolitti 0:eb280529b0ef 476 //BLE server setup
waltercolitti 0:eb280529b0ef 477 ble.gattServer().onDataWritten(onDataWrittenCallback);
MisterGiet 3:53db6c57bb61 478
waltercolitti 0:eb280529b0ef 479 //Setup primary services
MisterGiet 6:80f2517965bb 480 presenceService = new PresenceDetectionService(ble, updatePresenceCounter(presenceCounter));
MisterGiet 3:53db6c57bb61 481 thermometerServicePtr = new HealthThermometerService(ble, getTemperature(), HealthThermometerService::LOCATION_EAR);
MisterGiet 3:53db6c57bb61 482 humidityService = new HumidityMeasureService(ble, getHumidity());
MisterGiet 3:53db6c57bb61 483 ble.addService(batteryService);
MisterGiet 3:53db6c57bb61 484 ble.addService(firmwareService);
MisterGiet 3:53db6c57bb61 485 uart = new UARTService(ble);
MisterGiet 3:53db6c57bb61 486 ble.addService(TxPowerService);
MisterGiet 3:53db6c57bb61 487
MisterGiet 3:53db6c57bb61 488
MisterGiet 3:53db6c57bb61 489 /* setup advertising */
MisterGiet 3:53db6c57bb61 490
MisterGiet 3:53db6c57bb61 491 /* Sacrifice 3B of 31B to Advertising Flags */
waltercolitti 0:eb280529b0ef 492 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
MisterGiet 3:53db6c57bb61 493 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
MisterGiet 3:53db6c57bb61 494
MisterGiet 3:53db6c57bb61 495 /* Sacrifice 2B of 31B to AdvType overhead, rest goes to AdvData array you define */
MisterGiet 3:53db6c57bb61 496 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, ManufData, sizeof(ManufData));
MisterGiet 3:53db6c57bb61 497 ble.gap().accumulateAdvertisingPayloadTxPower(TxPower);
waltercolitti 0:eb280529b0ef 498 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
waltercolitti 0:eb280529b0ef 499 //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::THERMOMETER_EAR);
MisterGiet 3:53db6c57bb61 500 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER);
MisterGiet 3:53db6c57bb61 501 //ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,(const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
MisterGiet 3:53db6c57bb61 502 //ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
waltercolitti 0:eb280529b0ef 503 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
waltercolitti 0:eb280529b0ef 504
MisterGiet 3:53db6c57bb61 505 ble.setAdvertisingInterval(1000); /* 1000ms */
MisterGiet 3:53db6c57bb61 506 ble.startAdvertising();
MisterGiet 8:a0e1222bd768 507 SERIAL_DEBUG("\nBLE Init completed\n");
waltercolitti 0:eb280529b0ef 508 }
waltercolitti 0:eb280529b0ef 509
waltercolitti 0:eb280529b0ef 510 void periodicCallbackPresence(void)
waltercolitti 0:eb280529b0ef 511 {
MisterGiet 3:53db6c57bb61 512 triggerPresencePolling = true;
MisterGiet 8:a0e1222bd768 513 //presenceState = true;
waltercolitti 0:eb280529b0ef 514 }
waltercolitti 0:eb280529b0ef 515
MisterGiet 3:53db6c57bb61 516 void periodicCallbackSensor (void)
waltercolitti 0:eb280529b0ef 517 {
MisterGiet 3:53db6c57bb61 518 triggerSensorPolling = true;
waltercolitti 0:eb280529b0ef 519 }
waltercolitti 0:eb280529b0ef 520
MisterGiet 6:80f2517965bb 521 void updateBLEservices ()
MisterGiet 6:80f2517965bb 522 {
MisterGiet 6:80f2517965bb 523 thermometerServicePtr->updateTemperature(getTemperature());
MisterGiet 6:80f2517965bb 524 humidityService->updateHumidity(getHumidity());
MisterGiet 6:80f2517965bb 525 presenceService->updatePresence(updatePresenceCounter (presenceCounter));
MisterGiet 6:80f2517965bb 526 batteryLevel = getBatteryPercent();
MisterGiet 6:80f2517965bb 527 ble.updateCharacteristicValue(batteryPercentage.getValueAttribute().getHandle(), &batteryLevel, sizeof(batteryLevel));
MisterGiet 6:80f2517965bb 528 ble.updateCharacteristicValue(TxPowerChar.getValueAttribute().getHandle(), (uint8_t*)&TxPower, 1);
MisterGiet 6:80f2517965bb 529 }
MisterGiet 6:80f2517965bb 530
waltercolitti 0:eb280529b0ef 531 int main(void)
MisterGiet 3:53db6c57bb61 532 {
MisterGiet 3:53db6c57bb61 533 SERIAL_DEBUG("Start \n");
MisterGiet 3:53db6c57bb61 534 char pres_message[20];
MisterGiet 3:53db6c57bb61 535
MisterGiet 3:53db6c57bb61 536 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 537
MisterGiet 3:53db6c57bb61 538 motion_pin.fall(&periodicCallbackPresence);
MisterGiet 3:53db6c57bb61 539
waltercolitti 0:eb280529b0ef 540 Ticker ticker_sensor;
MisterGiet 6:80f2517965bb 541 ticker_sensor.attach(periodicCallbackSensor, 300); // 5 min
MisterGiet 3:53db6c57bb61 542
waltercolitti 0:eb280529b0ef 543 //BLE instance setup
waltercolitti 0:eb280529b0ef 544 BLE &bleptr = BLE::Instance();
waltercolitti 0:eb280529b0ef 545 bleptr.init(bleInitComplete);
MisterGiet 3:53db6c57bb61 546
MisterGiet 3:53db6c57bb61 547 /*
MisterGiet 3:53db6c57bb61 548 //SpinWait for initialization to complete. This is necessary because the
MisterGiet 3:53db6c57bb61 549 //BLE object is used in the main loop below.
MisterGiet 3:53db6c57bb61 550 while (ble.hasInitialized() == false) { }
MisterGiet 3:53db6c57bb61 551 */
MisterGiet 3:53db6c57bb61 552
waltercolitti 0:eb280529b0ef 553 while (true) {
MisterGiet 3:53db6c57bb61 554
MisterGiet 8:a0e1222bd768 555 /* Update presence data if presence is detected:*/
MisterGiet 3:53db6c57bb61 556 if(triggerPresencePolling) {
MisterGiet 3:53db6c57bb61 557 triggerPresencePolling = false;
MisterGiet 8:a0e1222bd768 558 presenceCounter++;
MisterGiet 3:53db6c57bb61 559
MisterGiet 8:a0e1222bd768 560 /* if in installMode, blinkleds and update BLE services continuosly */
MisterGiet 8:a0e1222bd768 561 if (installMode) {
MisterGiet 8:a0e1222bd768 562 updateBLEservices(); // Update BLE services
MisterGiet 8:a0e1222bd768 563 blinkLed(1,1); // blinkLed
MisterGiet 3:53db6c57bb61 564 }
MisterGiet 3:53db6c57bb61 565
MisterGiet 8:a0e1222bd768 566 // Debugging:
MisterGiet 8:a0e1222bd768 567 SERIAL_DEBUG("Presence counter: %i\n", presenceCounter);
MisterGiet 8:a0e1222bd768 568 sprintf (pres_message, "Pres=%i\n", presenceCounter);
MisterGiet 8:a0e1222bd768 569 DEBUG(pres_message);
MisterGiet 8:a0e1222bd768 570 }
MisterGiet 8:a0e1222bd768 571
MisterGiet 8:a0e1222bd768 572 // if no presence:
MisterGiet 8:a0e1222bd768 573 else {
MisterGiet 8:a0e1222bd768 574 SERIAL_DEBUG(".");
MisterGiet 3:53db6c57bb61 575 }
MisterGiet 3:53db6c57bb61 576
MisterGiet 8:a0e1222bd768 577 //if (triggerSensorPolling && ble.getGapState().connected) {
MisterGiet 8:a0e1222bd768 578 /* Update BLE services only every 300sec or if connected: */
MisterGiet 8:a0e1222bd768 579 //if (triggerSensorPolling || ble.getGapState().connected) {
MisterGiet 8:a0e1222bd768 580
MisterGiet 8:a0e1222bd768 581 /* Update BLE services only if connected: */
MisterGiet 8:a0e1222bd768 582 if (ble.getGapState().connected) {
MisterGiet 8:a0e1222bd768 583
MisterGiet 6:80f2517965bb 584 // Quanto consuma quando sta leggendo la temperatura?
MisterGiet 8:a0e1222bd768 585 //triggerSensorPolling = false;
MisterGiet 7:19fe55e82dd9 586 updateBLEservices();
MisterGiet 8:a0e1222bd768 587
MisterGiet 4:de22f0d73c12 588 // Red LED blinks if low battery, at every connection
MisterGiet 4:de22f0d73c12 589 if (batteryLevel <= 10) {
MisterGiet 5:173ffbf84b3a 590 blinkLed(battNotify,2);
MisterGiet 4:de22f0d73c12 591 }
MisterGiet 4:de22f0d73c12 592
MisterGiet 3:53db6c57bb61 593 } else {
MisterGiet 3:53db6c57bb61 594 ble.waitForEvent();
waltercolitti 0:eb280529b0ef 595 }
waltercolitti 0:eb280529b0ef 596 }
MisterGiet 6:80f2517965bb 597 }