Sample BLE thermometer profile for nRF51-DK with sensing from LM35

Dependencies:   BLE_API mbed nRF51822 X_NUCLEO_IDB0XA1

Fork of BLE_Thermometer by Bluetooth Low Energy

Committer:
rgrover1
Date:
Sat Jun 20 23:46:17 2015 +0000
Revision:
13:30f6f65629b5
Parent:
10:9a7e23066427
Child:
14:677ef88025b8
update to the latest of the 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 1:2deb859ed1a3 29 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
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 }