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

Committer:
rgrover1
Date:
Tue Sep 29 12:10:38 2015 +0000
Revision:
14:677ef88025b8
Parent:
13:30f6f65629b5
Child:
15:57860d1cd14d
updating underlying libraries.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:d01bde90471b 1 /* mbed Microcontroller Library
rgrover1 0:d01bde90471b 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 0:d01bde90471b 3 *
rgrover1 0:d01bde90471b 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 0:d01bde90471b 5 * you may not use this file except in compliance with the License.
rgrover1 0:d01bde90471b 6 * You may obtain a copy of the License at
rgrover1 0:d01bde90471b 7 *
rgrover1 0:d01bde90471b 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 0:d01bde90471b 9 *
rgrover1 0:d01bde90471b 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 0:d01bde90471b 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 0:d01bde90471b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 0:d01bde90471b 13 * See the License for the specific language governing permissions and
rgrover1 0:d01bde90471b 14 * limitations under the License.
rgrover1 0:d01bde90471b 15 */
rgrover1 0:d01bde90471b 16
rgrover1 0:d01bde90471b 17 #include "mbed.h"
rgrover1 13:30f6f65629b5 18 #include "BLE.h"
rgrover1 0:d01bde90471b 19 #include "HealthThermometerService.h"
rgrover1 0:d01bde90471b 20
rgrover1 13:30f6f65629b5 21 BLE ble;
rgrover1 4:83c07b0e93d6 22 DigitalOut led1(LED1);
rgrover1 0:d01bde90471b 23
rgrover1 0:d01bde90471b 24 const static char DEVICE_NAME[] = "Therm";
rgrover1 0:d01bde90471b 25 static const uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE};
rgrover1 0:d01bde90471b 26 static volatile bool triggerSensorPolling = false;
rgrover1 0:d01bde90471b 27
mbedAustin 8:63addc0221e7 28 /* Restart Advertising on disconnection*/
rgrover1 14:677ef88025b8 29 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
rgrover1 0:d01bde90471b 30 {
rgrover1 13:30f6f65629b5 31 ble.gap().startAdvertising();
rgrover1 0:d01bde90471b 32 }
rgrover1 0:d01bde90471b 33
rgrover1 10:9a7e23066427 34 void periodicCallback(void)
rgrover1 10:9a7e23066427 35 {
rgrover1 10:9a7e23066427 36 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
rgrover1 10:9a7e23066427 37
rgrover1 10:9a7e23066427 38 /* Note that the periodicCallback() executes in interrupt context, so it is safer to do
rgrover1 10:9a7e23066427 39 * heavy-weight sensor polling from the main thread. */
rgrover1 10:9a7e23066427 40 triggerSensorPolling = true;
rgrover1 10:9a7e23066427 41 }
rgrover1 10:9a7e23066427 42
rgrover1 0:d01bde90471b 43 int main(void)
rgrover1 0:d01bde90471b 44 {
rgrover1 4:83c07b0e93d6 45 led1 = 1;
rgrover1 10:9a7e23066427 46 Ticker ticker;
rgrover1 10:9a7e23066427 47 ticker.attach(periodicCallback, 1);
rgrover1 10:9a7e23066427 48
rgrover1 0:d01bde90471b 49 ble.init();
rgrover1 13:30f6f65629b5 50 ble.gap().onDisconnection(disconnectionCallback);
rgrover1 0:d01bde90471b 51
rgrover1 10:9a7e23066427 52 /* Setup primary service. */
rgrover1 10:9a7e23066427 53 float currentTemperature = 39.6;
rgrover1 10:9a7e23066427 54 HealthThermometerService thermometerService(ble, currentTemperature, HealthThermometerService::LOCATION_EAR);
rgrover1 10:9a7e23066427 55
rgrover1 0:d01bde90471b 56 /* setup advertising */
rgrover1 13:30f6f65629b5 57 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
rgrover1 13:30f6f65629b5 58 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
rgrover1 13:30f6f65629b5 59 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::THERMOMETER_EAR);
rgrover1 13:30f6f65629b5 60 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
rgrover1 13:30f6f65629b5 61 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
rgrover1 13:30f6f65629b5 62 ble.gap().setAdvertisingInterval(1000); /* 1000ms */
rgrover1 13:30f6f65629b5 63 ble.gap().startAdvertising();
rgrover1 0:d01bde90471b 64
mbedAustin 8:63addc0221e7 65 while (true) {
rgrover1 10:9a7e23066427 66 if (triggerSensorPolling && ble.getGapState().connected) {
rgrover1 10:9a7e23066427 67 triggerSensorPolling = false;
rgrover1 10:9a7e23066427 68
rgrover1 10:9a7e23066427 69 /* Do blocking calls or whatever is necessary for sensor polling. */
rgrover1 10:9a7e23066427 70 // error = sensor.readData();
rgrover1 10:9a7e23066427 71 // if (!error) {
rgrover1 10:9a7e23066427 72 // thermometerService.updateTemperature(c);
rgrover1 10:9a7e23066427 73 // }
rgrover1 10:9a7e23066427 74
rgrover1 10:9a7e23066427 75 /* In our case, we simply update the dummy temperature measurement. */
rgrover1 10:9a7e23066427 76 currentTemperature += 0.1;
rgrover1 10:9a7e23066427 77 thermometerService.updateTemperature(currentTemperature);
rgrover1 10:9a7e23066427 78 } else {
rgrover1 10:9a7e23066427 79 ble.waitForEvent();
rgrover1 10:9a7e23066427 80 }
rgrover1 0:d01bde90471b 81 }
rgrover1 0:d01bde90471b 82 }