Dependencies: BLE_API mbed nRF51822
Fork of SensorModulePIR by
main.cpp@8:a0e1222bd768, 2017-05-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |