BLE demo for the Health-Thermometer service.
Dependencies: BLE_API mbed nRF51822 X_NUCLEO_IDB0XA1
This example demonstrates how to use the Health Thermometer Service. The Health Thermometer service reports two pieces of information, Temperature and Sensor Location.
API
Import library
Public Types |
|
enum |
SensorLocation_t
{
LOCATION_ARMPIT = 1, LOCATION_BODY , LOCATION_EAR , LOCATION_FINGER , LOCATION_GI_TRACT , LOCATION_MOUTH , LOCATION_RECTUM , LOCATION_TOE , LOCATION_EAR_DRUM } |
Public Member Functions |
|
HealthThermometerService ( BLE &_ble, float initialTemp, uint8_t _location) | |
Add the Health Thermometer Service to an existing
BLE
object, initialize with temperature and location.
|
|
void | updateTemperature (float temperature) |
Update the temperature being broadcast.
|
|
void | updateLocation ( SensorLocation_t loc) |
Update the location.
|
Technical Details
Further Technical Details can be found at the following links
- Temperature Service : Gatt profile details from bluetooth.org
- Temperature Measurement : Gatt Characteristic details
- Temperature Type : Gatt Characteristic details
Diff: main.cpp
- Revision:
- 10:9a7e23066427
- Parent:
- 8:63addc0221e7
- Child:
- 13:30f6f65629b5
--- a/main.cpp Tue Mar 24 08:16:30 2015 +0000 +++ b/main.cpp Wed Apr 01 08:39:00 2015 +0000 @@ -31,33 +31,52 @@ ble.startAdvertising(); } +void periodicCallback(void) +{ + led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ + + /* Note that the periodicCallback() executes in interrupt context, so it is safer to do + * heavy-weight sensor polling from the main thread. */ + triggerSensorPolling = true; +} + int main(void) { led1 = 1; - - /* Initialize BLE baselayer*/ + Ticker ticker; + ticker.attach(periodicCallback, 1); + ble.init(); ble.onDisconnection(disconnectionCallback); + /* Setup primary service. */ + float currentTemperature = 39.6; + HealthThermometerService thermometerService(ble, currentTemperature, HealthThermometerService::LOCATION_EAR); + /* setup advertising */ ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); ble.accumulateAdvertisingPayload(GapAdvertisingData::THERMOMETER_EAR); ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); - ble.setAdvertisingInterval(1600); /* 1000ms; in multiples of 0.625ms. */ - - /* setup Thermometer*/ - float initialTemperature = 39.6; - HealthThermometerService thermometerService(ble, initialTemperature, HealthThermometerService::LOCATION_EAR); - - /* Start Advertising*/ + ble.setAdvertisingInterval(1000); /* 1000ms */ ble.startAdvertising(); - /* incriment temperature by 1 degree every second*/ while (true) { - thermometerService.updateTemperature((initialTemperature++)); - wait(2); - led1 = !led1; /* Flash LED*/ + if (triggerSensorPolling && ble.getGapState().connected) { + triggerSensorPolling = false; + + /* Do blocking calls or whatever is necessary for sensor polling. */ + // error = sensor.readData(); + // if (!error) { + // thermometerService.updateTemperature(c); + // } + + /* In our case, we simply update the dummy temperature measurement. */ + currentTemperature += 0.1; + thermometerService.updateTemperature(currentTemperature); + } else { + ble.waitForEvent(); + } } }