Dependencies:   BLE_API mbed nRF51822

Fork of SensorModulePIR by ModoSmart

Committer:
MisterGiet
Date:
Thu Jun 01 09:55:56 2017 +0000
Revision:
11:1186eb69af44
Parent:
10:29dbc6d316c3
Child:
12:92f008fe602c
Child:
22:88b6e11eb8d5
Rel. APP-2217 for Applica. ; Added Environmental Services; Removed red led blinking when lowbatt;

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 10:29dbc6d316c3 4 #include "ble/services/HealthThermometerService.h"
MisterGiet 10:29dbc6d316c3 5 #include "ble/services/BatteryService.h"
MisterGiet 10:29dbc6d316c3 6 #include "ble/services/EnvironmentalService.h"
MisterGiet 10:29dbc6d316c3 7 #include "HumidityMeasureService.h"
waltercolitti 0:eb280529b0ef 8 #include "PresenceDetectionService.h"
waltercolitti 0:eb280529b0ef 9 #include "ble_gatt.h"
waltercolitti 0:eb280529b0ef 10 #include "Si7020.h"
MisterGiet 3:53db6c57bb61 11 #include "UARTService.h"
MisterGiet 3:53db6c57bb61 12 #include <string.h>
waltercolitti 0:eb280529b0ef 13
MisterGiet 3:53db6c57bb61 14
MisterGiet 10:29dbc6d316c3 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 3:53db6c57bb61 21 #define NEED_SERIAL_CONSOLE_OUTPUT 0
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 10:29dbc6d316c3 29 #define NEED_BLE_OUTPUT 1 // 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 3:53db6c57bb61 36 I2C i2c(PIN_SDA, PIN_SCL);
waltercolitti 0:eb280529b0ef 37 Si7020 tempsensor(&i2c);
waltercolitti 0:eb280529b0ef 38
MisterGiet 6:80f2517965bb 39 InterruptIn motion_pin(PIN_PRESENCE_RIGHT);
MisterGiet 6:80f2517965bb 40 DigitalIn pinR(PIN_PRESENCE_RIGHT, PullNone);
MisterGiet 6:80f2517965bb 41 DigitalOut ledB(PIN_BLED_PCB, 1);
MisterGiet 6:80f2517965bb 42 DigitalOut ledR(PIN_RLED_PCB, 1);
MisterGiet 3:53db6c57bb61 43
MisterGiet 6:80f2517965bb 44 bool presenceState = false;
MisterGiet 6:80f2517965bb 45 int presenceCounter = 0;
MisterGiet 6:80f2517965bb 46 //uint8_t presenceCounterBLE = 0;
MisterGiet 9:97d8ea1feeed 47 bool installMode = 0;
MisterGiet 5:173ffbf84b3a 48 bool battNotify = 1;
MisterGiet 5:173ffbf84b3a 49 static volatile bool triggerPresencePolling = false;
MisterGiet 5:173ffbf84b3a 50
MisterGiet 5:173ffbf84b3a 51
MisterGiet 5:173ffbf84b3a 52 /* BLE CONFIGURATION */
MisterGiet 5:173ffbf84b3a 53
MisterGiet 5:173ffbf84b3a 54 BLE ble;
MisterGiet 10:29dbc6d316c3 55 static const char DEVICE_NAME[] = "SM02";
MisterGiet 5:173ffbf84b3a 56 static const uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE};
MisterGiet 5:173ffbf84b3a 57 static volatile bool triggerSensorPolling = false;
MisterGiet 11:1186eb69af44 58 static char fwversion[31] = "APP-2217";
MisterGiet 11:1186eb69af44 59 static uint8_t batteryLevel = 99;
MisterGiet 5:173ffbf84b3a 60 static int8_t TxPower = +4;
MisterGiet 10:29dbc6d316c3 61 //static uint8_t humidity = 99;
MisterGiet 10:29dbc6d316c3 62 const static uint8_t ManufData[] = {0x01,0x02,0x03,0x04,0x05}; // Set up to 26B of advertising data to use for the Manufacturer data.
MisterGiet 10:29dbc6d316c3 63
MisterGiet 5:173ffbf84b3a 64
MisterGiet 10:29dbc6d316c3 65 static HealthThermometerService *thermometerServicePtr = NULL;;
MisterGiet 10:29dbc6d316c3 66 static BatteryService* batteryServicePtr = NULL;;
MisterGiet 10:29dbc6d316c3 67 static EnvironmentalService* humidityTemperatureServicePtr = NULL;
MisterGiet 10:29dbc6d316c3 68 static HumidityMeasureService *humidityService = NULL;
MisterGiet 10:29dbc6d316c3 69 static PresenceDetectionService *presenceService = NULL;
MisterGiet 5:173ffbf84b3a 70 UARTService *uart;
MisterGiet 5:173ffbf84b3a 71
MisterGiet 5:173ffbf84b3a 72 // Firmware
MisterGiet 5:173ffbf84b3a 73 GattCharacteristic fwChars(GattCharacteristic::UUID_FIRMWARE_REVISION_STRING_CHAR, (uint8_t *)fwversion, sizeof(fwversion), sizeof(fwversion),GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
MisterGiet 5:173ffbf84b3a 74 GattCharacteristic *firmwareChars[] = {&fwChars };
MisterGiet 5:173ffbf84b3a 75 GattService firmwareService(GattService::UUID_DEVICE_INFORMATION_SERVICE, firmwareChars, sizeof(firmwareChars) / sizeof(GattCharacteristic *));
MisterGiet 5:173ffbf84b3a 76
MisterGiet 5:173ffbf84b3a 77 //Power
MisterGiet 5:173ffbf84b3a 78 GattCharacteristic TxPowerChar(GattCharacteristic::UUID_TX_POWER_LEVEL_CHAR, (uint8_t*)&TxPower, sizeof(TxPower), sizeof(TxPower), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
MisterGiet 5:173ffbf84b3a 79 GattCharacteristic *charTable[] = {&TxPowerChar};
MisterGiet 5:173ffbf84b3a 80 GattService TxPowerService(GattService::UUID_TX_POWER_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
MisterGiet 5:173ffbf84b3a 81
MisterGiet 3:53db6c57bb61 82 /* BATTERY MEASUREMENT */
MisterGiet 3:53db6c57bb61 83 void my_analogin_init(void)
MisterGiet 3:53db6c57bb61 84 {
MisterGiet 3:53db6c57bb61 85 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
MisterGiet 3:53db6c57bb61 86 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
MisterGiet 3:53db6c57bb61 87 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
MisterGiet 3:53db6c57bb61 88 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
MisterGiet 3:53db6c57bb61 89 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
MisterGiet 3:53db6c57bb61 90 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
MisterGiet 3:53db6c57bb61 91 }
MisterGiet 3:53db6c57bb61 92
MisterGiet 3:53db6c57bb61 93 uint16_t my_analogin_read_u16(void)
MisterGiet 3:53db6c57bb61 94 {
MisterGiet 3:53db6c57bb61 95 NRF_ADC->CONFIG &= ~ADC_CONFIG_PSEL_Msk;
MisterGiet 3:53db6c57bb61 96 NRF_ADC->CONFIG |= ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos;
MisterGiet 3:53db6c57bb61 97 NRF_ADC->TASKS_START = 1;
MisterGiet 3:53db6c57bb61 98 while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {};
MisterGiet 3:53db6c57bb61 99 return (uint16_t)NRF_ADC->RESULT; // 10 bit
MisterGiet 3:53db6c57bb61 100 }
waltercolitti 0:eb280529b0ef 101
MisterGiet 3:53db6c57bb61 102 float getBatteryVolt (void)
MisterGiet 3:53db6c57bb61 103 {
MisterGiet 3:53db6c57bb61 104 char Vpower[10];
MisterGiet 3:53db6c57bb61 105
MisterGiet 3:53db6c57bb61 106 float Vadc = (float)my_analogin_read_u16();
MisterGiet 3:53db6c57bb61 107 float Vref = 1.2; // Internal Vref
MisterGiet 3:53db6c57bb61 108 float Vcc = 3 * 4 * Vref * Vadc / 1024.0;
MisterGiet 3:53db6c57bb61 109
MisterGiet 3:53db6c57bb61 110 sprintf (Vpower, "Vcc=%.2fV, ", Vcc);
MisterGiet 3:53db6c57bb61 111 DEBUG(Vpower);
MisterGiet 3:53db6c57bb61 112 return Vcc;
MisterGiet 3:53db6c57bb61 113 }
MisterGiet 3:53db6c57bb61 114
MisterGiet 3:53db6c57bb61 115 int getBatteryPercent ()
MisterGiet 3:53db6c57bb61 116 {
MisterGiet 3:53db6c57bb61 117 char batt_mess[10];
MisterGiet 4:de22f0d73c12 118 float Vbat_min = 2; //2;
MisterGiet 3:53db6c57bb61 119 float Vbat_max = 3;
MisterGiet 3:53db6c57bb61 120 int battLevel = (int) ( ((getBatteryVolt()-Vbat_min) / (Vbat_max-Vbat_min)) *100);
MisterGiet 3:53db6c57bb61 121
MisterGiet 3:53db6c57bb61 122 sprintf (batt_mess, "Vbatt=%i, ", battLevel);
MisterGiet 3:53db6c57bb61 123 DEBUG(batt_mess);
MisterGiet 3:53db6c57bb61 124
MisterGiet 3:53db6c57bb61 125 // To avoid values bigger than 100%
MisterGiet 3:53db6c57bb61 126 if (battLevel > 100) {
MisterGiet 3:53db6c57bb61 127 battLevel = 100;
MisterGiet 3:53db6c57bb61 128 }
MisterGiet 3:53db6c57bb61 129
MisterGiet 4:de22f0d73c12 130 // To avoid overflow due to a value lower than Vbat_min
MisterGiet 4:de22f0d73c12 131 if (battLevel >= 250) {
MisterGiet 4:de22f0d73c12 132 battLevel = 0;
MisterGiet 4:de22f0d73c12 133 }
MisterGiet 4:de22f0d73c12 134
MisterGiet 3:53db6c57bb61 135 return battLevel;
MisterGiet 3:53db6c57bb61 136 }
MisterGiet 3:53db6c57bb61 137
MisterGiet 3:53db6c57bb61 138 void blinkLed (bool enable, int color)
MisterGiet 3:53db6c57bb61 139 {
MisterGiet 3:53db6c57bb61 140 if (enable) {
MisterGiet 3:53db6c57bb61 141 if (color == 1) {
MisterGiet 3:53db6c57bb61 142 ledB=0;
MisterGiet 3:53db6c57bb61 143 wait(0.2);
MisterGiet 3:53db6c57bb61 144 ledB=1;
MisterGiet 3:53db6c57bb61 145 wait(0.2);
MisterGiet 3:53db6c57bb61 146 }
MisterGiet 3:53db6c57bb61 147 if (color == 2) {
MisterGiet 3:53db6c57bb61 148 ledR=0;
MisterGiet 3:53db6c57bb61 149 wait(0.2);
MisterGiet 3:53db6c57bb61 150 ledR=1;
MisterGiet 3:53db6c57bb61 151 wait(0.2);
MisterGiet 3:53db6c57bb61 152 }
MisterGiet 3:53db6c57bb61 153 } else {
MisterGiet 3:53db6c57bb61 154 // do nothing if enable=0
MisterGiet 3:53db6c57bb61 155 }
MisterGiet 3:53db6c57bb61 156 }
waltercolitti 0:eb280529b0ef 157
MisterGiet 6:80f2517965bb 158 uint8_t updatePresenceCounter (int counts)
MisterGiet 6:80f2517965bb 159 {
MisterGiet 6:80f2517965bb 160 uint8_t uint8_counter;
MisterGiet 6:80f2517965bb 161
MisterGiet 6:80f2517965bb 162 if (counts>=255) {
MisterGiet 6:80f2517965bb 163 uint8_counter = 255;
MisterGiet 6:80f2517965bb 164
MisterGiet 6:80f2517965bb 165 } else {
MisterGiet 6:80f2517965bb 166 uint8_counter = uint8_t(counts);
MisterGiet 6:80f2517965bb 167 }
MisterGiet 6:80f2517965bb 168
MisterGiet 6:80f2517965bb 169 return uint8_counter;
MisterGiet 6:80f2517965bb 170 }
MisterGiet 6:80f2517965bb 171
MisterGiet 10:29dbc6d316c3 172 float getHumidity(void)
waltercolitti 0:eb280529b0ef 173 {
MisterGiet 10:29dbc6d316c3 174 float hum;
MisterGiet 10:29dbc6d316c3 175 if(tempsensor.getHumidity(&hum) != 0) {
MisterGiet 10:29dbc6d316c3 176 SERIAL_DEBUG("Error getting humidity");
MisterGiet 10:29dbc6d316c3 177 hum = -1;
MisterGiet 10:29dbc6d316c3 178 }
waltercolitti 0:eb280529b0ef 179
MisterGiet 10:29dbc6d316c3 180 // Debugging:
MisterGiet 10:29dbc6d316c3 181 SERIAL_DEBUG("\nHumidity = %f", hum);
MisterGiet 10:29dbc6d316c3 182 char message[50];
MisterGiet 10:29dbc6d316c3 183 sprintf (message, "RH=%.2f %i\n", hum, (uint16_t)hum);
MisterGiet 10:29dbc6d316c3 184 DEBUG(message);
MisterGiet 10:29dbc6d316c3 185
MisterGiet 10:29dbc6d316c3 186 //return uint8_t(hum);
MisterGiet 10:29dbc6d316c3 187 //return uint16_t(hum);
MisterGiet 10:29dbc6d316c3 188 return hum;
waltercolitti 0:eb280529b0ef 189 }
waltercolitti 0:eb280529b0ef 190
waltercolitti 0:eb280529b0ef 191 float getTemperature(void)
waltercolitti 0:eb280529b0ef 192 {
MisterGiet 3:53db6c57bb61 193 float temp;
MisterGiet 4:de22f0d73c12 194
MisterGiet 3:53db6c57bb61 195 if(tempsensor.getTemperature(&temp) != 0) {
MisterGiet 3:53db6c57bb61 196 DEBUG("Error getting temperature");
MisterGiet 3:53db6c57bb61 197 temp = -1;
MisterGiet 3:53db6c57bb61 198 }
waltercolitti 0:eb280529b0ef 199
MisterGiet 3:53db6c57bb61 200 // Debugging:
MisterGiet 3:53db6c57bb61 201 SERIAL_DEBUG("\nTemperature = %.2f", temp);
MisterGiet 3:53db6c57bb61 202 char message[50];
MisterGiet 3:53db6c57bb61 203 sprintf (message, "T=%.2fC\n", temp);
MisterGiet 3:53db6c57bb61 204 DEBUG(message);
MisterGiet 4:de22f0d73c12 205
MisterGiet 3:53db6c57bb61 206 // Adding offset:
MisterGiet 3:53db6c57bb61 207 temp = temp + OFFSET;
MisterGiet 3:53db6c57bb61 208
MisterGiet 3:53db6c57bb61 209 return temp;
waltercolitti 0:eb280529b0ef 210 }
waltercolitti 0:eb280529b0ef 211
MisterGiet 10:29dbc6d316c3 212 /* Restart Advertising on disconnection*/
MisterGiet 10:29dbc6d316c3 213 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
MisterGiet 3:53db6c57bb61 214 {
MisterGiet 10:29dbc6d316c3 215 SERIAL_DEBUG("Disconnected\r\n");
MisterGiet 10:29dbc6d316c3 216 BLE::Instance().gap().startAdvertising();
MisterGiet 10:29dbc6d316c3 217 }
MisterGiet 3:53db6c57bb61 218
MisterGiet 10:29dbc6d316c3 219 /**
MisterGiet 10:29dbc6d316c3 220 * This function is called when the ble initialization process has failed
MisterGiet 10:29dbc6d316c3 221 */
MisterGiet 10:29dbc6d316c3 222 void onBleInitError(BLE &ble, ble_error_t error)
MisterGiet 10:29dbc6d316c3 223 {
MisterGiet 10:29dbc6d316c3 224 /* Avoid compiler warnings */
MisterGiet 10:29dbc6d316c3 225 (void) ble;
MisterGiet 10:29dbc6d316c3 226 (void) error;
MisterGiet 10:29dbc6d316c3 227 /* Initialization error handling should go here */
MisterGiet 3:53db6c57bb61 228 }
MisterGiet 3:53db6c57bb61 229
MisterGiet 3:53db6c57bb61 230 void onDataWrittenCallback(const GattWriteCallbackParams *params)
waltercolitti 0:eb280529b0ef 231 {
MisterGiet 6:80f2517965bb 232 int var = params->data[0];
MisterGiet 6:80f2517965bb 233
MisterGiet 6:80f2517965bb 234 if (var == 1) {
MisterGiet 9:97d8ea1feeed 235 blinkLed(installMode,1);
MisterGiet 3:53db6c57bb61 236 SERIAL_DEBUG("BLE. Resetting presence\n");
MisterGiet 6:80f2517965bb 237 presenceCounter = 0;
MisterGiet 6:80f2517965bb 238 //presenceCounterBLE = 0;
MisterGiet 6:80f2517965bb 239 triggerSensorPolling = true; // force update of all BLE services
MisterGiet 3:53db6c57bb61 240 }
MisterGiet 3:53db6c57bb61 241
MisterGiet 6:80f2517965bb 242 if (var == 2) {
MisterGiet 3:53db6c57bb61 243 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 244 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 245 SERIAL_DEBUG("BLE. All LEDs ON/OFF\n");
MisterGiet 9:97d8ea1feeed 246 installMode = !installMode;
MisterGiet 3:53db6c57bb61 247 }
MisterGiet 3:53db6c57bb61 248
MisterGiet 3:53db6c57bb61 249 if (params->data[0] == 3) {
MisterGiet 3:53db6c57bb61 250 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 251 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 252 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 253 SERIAL_DEBUG("BLE. Rebooting sensor\n");
MisterGiet 3:53db6c57bb61 254 wait(3);
MisterGiet 3:53db6c57bb61 255 NVIC_SystemReset(); // SW Reset
MisterGiet 3:53db6c57bb61 256 }
waltercolitti 0:eb280529b0ef 257 }
waltercolitti 0:eb280529b0ef 258
waltercolitti 0:eb280529b0ef 259 /**
waltercolitti 0:eb280529b0ef 260 * Callback triggered when the ble initialization process has finished
waltercolitti 0:eb280529b0ef 261 */
waltercolitti 0:eb280529b0ef 262 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
waltercolitti 0:eb280529b0ef 263 {
MisterGiet 3:53db6c57bb61 264 SERIAL_DEBUG("BLE. Init \n");
MisterGiet 3:53db6c57bb61 265
MisterGiet 3:53db6c57bb61 266 BLE& ble = params->ble;
waltercolitti 0:eb280529b0ef 267 ble_error_t error = params->error;
waltercolitti 0:eb280529b0ef 268
waltercolitti 0:eb280529b0ef 269 if (error != BLE_ERROR_NONE) {
waltercolitti 0:eb280529b0ef 270 /* In case of error, forward the error handling to onBleInitError */
waltercolitti 0:eb280529b0ef 271 onBleInitError(ble, error);
waltercolitti 0:eb280529b0ef 272 return;
waltercolitti 0:eb280529b0ef 273 }
waltercolitti 0:eb280529b0ef 274
waltercolitti 0:eb280529b0ef 275 /* Ensure that it is the default instance of BLE */
waltercolitti 0:eb280529b0ef 276 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
waltercolitti 0:eb280529b0ef 277 return;
waltercolitti 0:eb280529b0ef 278 }
MisterGiet 3:53db6c57bb61 279
waltercolitti 0:eb280529b0ef 280 //ble.gap().onConnection(connectionCallback);
MisterGiet 3:53db6c57bb61 281 ble.gap().onDisconnection(disconnectionCallback);
waltercolitti 0:eb280529b0ef 282
MisterGiet 3:53db6c57bb61 283 // Set Transmission power:
MisterGiet 3:53db6c57bb61 284 ble.setTxPower(TxPower);
MisterGiet 3:53db6c57bb61 285
MisterGiet 3:53db6c57bb61 286 //ble.gap().setScanParams(500, 400);
waltercolitti 0:eb280529b0ef 287 //ble.gap().startScan(advertisementCallback);
MisterGiet 3:53db6c57bb61 288
waltercolitti 0:eb280529b0ef 289 //BLE server setup
waltercolitti 0:eb280529b0ef 290 ble.gattServer().onDataWritten(onDataWrittenCallback);
MisterGiet 3:53db6c57bb61 291
waltercolitti 0:eb280529b0ef 292 //Setup primary services
MisterGiet 6:80f2517965bb 293 presenceService = new PresenceDetectionService(ble, updatePresenceCounter(presenceCounter));
MisterGiet 10:29dbc6d316c3 294
MisterGiet 3:53db6c57bb61 295 thermometerServicePtr = new HealthThermometerService(ble, getTemperature(), HealthThermometerService::LOCATION_EAR);
MisterGiet 3:53db6c57bb61 296 humidityService = new HumidityMeasureService(ble, getHumidity());
MisterGiet 10:29dbc6d316c3 297
MisterGiet 10:29dbc6d316c3 298 humidityTemperatureServicePtr = new EnvironmentalService (ble);
MisterGiet 10:29dbc6d316c3 299 batteryServicePtr = new BatteryService(ble, batteryLevel);
MisterGiet 10:29dbc6d316c3 300
MisterGiet 3:53db6c57bb61 301 ble.addService(firmwareService);
MisterGiet 3:53db6c57bb61 302 uart = new UARTService(ble);
MisterGiet 10:29dbc6d316c3 303 //ble.addService(TxPowerService);
MisterGiet 3:53db6c57bb61 304
MisterGiet 3:53db6c57bb61 305 /* setup advertising */
MisterGiet 3:53db6c57bb61 306
MisterGiet 3:53db6c57bb61 307 /* Sacrifice 3B of 31B to Advertising Flags */
waltercolitti 0:eb280529b0ef 308 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
MisterGiet 3:53db6c57bb61 309 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
MisterGiet 3:53db6c57bb61 310
MisterGiet 3:53db6c57bb61 311 /* Sacrifice 2B of 31B to AdvType overhead, rest goes to AdvData array you define */
MisterGiet 3:53db6c57bb61 312 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, ManufData, sizeof(ManufData));
MisterGiet 3:53db6c57bb61 313 ble.gap().accumulateAdvertisingPayloadTxPower(TxPower);
waltercolitti 0:eb280529b0ef 314 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
waltercolitti 0:eb280529b0ef 315 //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::THERMOMETER_EAR);
MisterGiet 3:53db6c57bb61 316 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER);
MisterGiet 3:53db6c57bb61 317 //ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,(const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
MisterGiet 3:53db6c57bb61 318 //ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
waltercolitti 0:eb280529b0ef 319 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
waltercolitti 0:eb280529b0ef 320
MisterGiet 3:53db6c57bb61 321 ble.setAdvertisingInterval(1000); /* 1000ms */
MisterGiet 3:53db6c57bb61 322 ble.startAdvertising();
waltercolitti 0:eb280529b0ef 323 }
waltercolitti 0:eb280529b0ef 324
waltercolitti 0:eb280529b0ef 325 void periodicCallbackPresence(void)
waltercolitti 0:eb280529b0ef 326 {
MisterGiet 3:53db6c57bb61 327 triggerPresencePolling = true;
MisterGiet 6:80f2517965bb 328 presenceState = true;
waltercolitti 0:eb280529b0ef 329 }
waltercolitti 0:eb280529b0ef 330
MisterGiet 3:53db6c57bb61 331 void periodicCallbackSensor (void)
waltercolitti 0:eb280529b0ef 332 {
MisterGiet 3:53db6c57bb61 333 triggerSensorPolling = true;
waltercolitti 0:eb280529b0ef 334 }
waltercolitti 0:eb280529b0ef 335
MisterGiet 6:80f2517965bb 336 void updateBLEservices ()
MisterGiet 6:80f2517965bb 337 {
MisterGiet 6:80f2517965bb 338 thermometerServicePtr->updateTemperature(getTemperature());
MisterGiet 6:80f2517965bb 339 humidityService->updateHumidity(getHumidity());
MisterGiet 10:29dbc6d316c3 340
MisterGiet 10:29dbc6d316c3 341 humidityTemperatureServicePtr->updateTemperature (getTemperature());
MisterGiet 10:29dbc6d316c3 342 humidityTemperatureServicePtr->updateHumidity (getHumidity());
MisterGiet 10:29dbc6d316c3 343
MisterGiet 10:29dbc6d316c3 344 batteryServicePtr->updateBatteryLevel(getBatteryPercent());
MisterGiet 10:29dbc6d316c3 345
MisterGiet 6:80f2517965bb 346 presenceService->updatePresence(updatePresenceCounter (presenceCounter));
MisterGiet 10:29dbc6d316c3 347 //ble.updateCharacteristicValue(batteryPercentage.getValueAttribute().getHandle(), &batteryLevel, sizeof(batteryLevel));
MisterGiet 10:29dbc6d316c3 348 //ble.updateCharacteristicValue(TxPowerChar.getValueAttribute().getHandle(), (uint8_t*)&TxPower, 1);
MisterGiet 6:80f2517965bb 349 }
MisterGiet 6:80f2517965bb 350
waltercolitti 0:eb280529b0ef 351 int main(void)
MisterGiet 3:53db6c57bb61 352 {
MisterGiet 3:53db6c57bb61 353 SERIAL_DEBUG("Start \n");
MisterGiet 3:53db6c57bb61 354 char pres_message[20];
MisterGiet 3:53db6c57bb61 355
MisterGiet 3:53db6c57bb61 356 blinkLed(1,1);
MisterGiet 3:53db6c57bb61 357
MisterGiet 3:53db6c57bb61 358 //Ticker ticker_presence;
MisterGiet 3:53db6c57bb61 359 //ticker_presence.attach(periodicCallbackPresence, 0.5);
MisterGiet 3:53db6c57bb61 360
MisterGiet 3:53db6c57bb61 361 motion_pin.fall(&periodicCallbackPresence);
MisterGiet 3:53db6c57bb61 362
waltercolitti 0:eb280529b0ef 363 Ticker ticker_sensor;
MisterGiet 10:29dbc6d316c3 364 ticker_sensor.attach(periodicCallbackSensor, 3); // 5 min
MisterGiet 3:53db6c57bb61 365
waltercolitti 0:eb280529b0ef 366 //BLE instance setup
waltercolitti 0:eb280529b0ef 367 BLE &bleptr = BLE::Instance();
waltercolitti 0:eb280529b0ef 368 bleptr.init(bleInitComplete);
MisterGiet 3:53db6c57bb61 369
MisterGiet 3:53db6c57bb61 370 /*
MisterGiet 3:53db6c57bb61 371 //SpinWait for initialization to complete. This is necessary because the
MisterGiet 3:53db6c57bb61 372 //BLE object is used in the main loop below.
MisterGiet 3:53db6c57bb61 373 while (ble.hasInitialized() == false) { }
MisterGiet 3:53db6c57bb61 374 */
MisterGiet 3:53db6c57bb61 375
waltercolitti 0:eb280529b0ef 376 while (true) {
MisterGiet 3:53db6c57bb61 377
MisterGiet 3:53db6c57bb61 378 /* Get Presence data: */
MisterGiet 3:53db6c57bb61 379 if(triggerPresencePolling) {
MisterGiet 3:53db6c57bb61 380 triggerPresencePolling = false;
MisterGiet 3:53db6c57bb61 381
MisterGiet 6:80f2517965bb 382 // if presence is detected:
MisterGiet 6:80f2517965bb 383 if (presenceState) {
MisterGiet 10:29dbc6d316c3 384
MisterGiet 6:80f2517965bb 385 presenceCounter++;
MisterGiet 10:29dbc6d316c3 386
MisterGiet 6:80f2517965bb 387 // Update all BLE services for every presence detected:
MisterGiet 6:80f2517965bb 388 updateBLEservices();
MisterGiet 3:53db6c57bb61 389
MisterGiet 3:53db6c57bb61 390 // Debugging:
MisterGiet 9:97d8ea1feeed 391 blinkLed(installMode,1);
MisterGiet 6:80f2517965bb 392 SERIAL_DEBUG("Presence counter: %i\n", presenceCounter);
MisterGiet 6:80f2517965bb 393 sprintf (pres_message, "Pres=%i\n", presenceCounter);
MisterGiet 3:53db6c57bb61 394 DEBUG(pres_message);
MisterGiet 3:53db6c57bb61 395
MisterGiet 6:80f2517965bb 396 presenceState=0;
MisterGiet 3:53db6c57bb61 397 }
MisterGiet 3:53db6c57bb61 398
MisterGiet 6:80f2517965bb 399 // if no presence:
MisterGiet 3:53db6c57bb61 400 else {
MisterGiet 3:53db6c57bb61 401 SERIAL_DEBUG(".");
MisterGiet 3:53db6c57bb61 402 }
MisterGiet 3:53db6c57bb61 403 }
MisterGiet 3:53db6c57bb61 404
MisterGiet 10:29dbc6d316c3 405 /* Update BLE services if connected: */
waltercolitti 0:eb280529b0ef 406 if (triggerSensorPolling && ble.getGapState().connected) {
MisterGiet 10:29dbc6d316c3 407
MisterGiet 6:80f2517965bb 408 // Quanto consuma quando sta leggendo la temperatura?
waltercolitti 0:eb280529b0ef 409 triggerSensorPolling = false;
MisterGiet 6:80f2517965bb 410
MisterGiet 10:29dbc6d316c3 411 updateBLEservices();
MisterGiet 11:1186eb69af44 412
MisterGiet 11:1186eb69af44 413 /*
MisterGiet 4:de22f0d73c12 414 // Red LED blinks if low battery, at every connection
MisterGiet 4:de22f0d73c12 415 if (batteryLevel <= 10) {
MisterGiet 5:173ffbf84b3a 416 blinkLed(battNotify,2);
MisterGiet 4:de22f0d73c12 417 }
MisterGiet 11:1186eb69af44 418 */
MisterGiet 11:1186eb69af44 419
MisterGiet 3:53db6c57bb61 420 } else {
MisterGiet 3:53db6c57bb61 421 ble.waitForEvent();
waltercolitti 0:eb280529b0ef 422 }
waltercolitti 0:eb280529b0ef 423 }
MisterGiet 6:80f2517965bb 424 }