BLE Thermometer example

Dependencies:   BSP_B-L475E-IOT01

This example is a fork of the following mbed-os example:

https://developer.mbed.org/teams/mbed-os-examples/code/mbed-os-example-ble-Thermometer/

Please read the documentation in this page.

Committer:
mbed_official
Date:
Thu Jul 28 23:14:56 2016 +0100
Revision:
2:cc8349878a7d
Parent:
1:0802a5f8c9d3
Child:
11:4e356c89ad66
Merge branch 'master' of https://github.com/ARMmbed/mbed-os-example-ble


Commit copied from ./src/github.com/ARMmbed/mbed-os-example-ble

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 2:cc8349878a7d 1 /* mbed Microcontroller Library
mbed_official 2:cc8349878a7d 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 2:cc8349878a7d 3 *
mbed_official 2:cc8349878a7d 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 2:cc8349878a7d 5 * you may not use this file except in compliance with the License.
mbed_official 2:cc8349878a7d 6 * You may obtain a copy of the License at
mbed_official 2:cc8349878a7d 7 *
mbed_official 2:cc8349878a7d 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 2:cc8349878a7d 9 *
mbed_official 2:cc8349878a7d 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 2:cc8349878a7d 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 2:cc8349878a7d 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 2:cc8349878a7d 13 * See the License for the specific language governing permissions and
mbed_official 2:cc8349878a7d 14 * limitations under the License.
mbed_official 2:cc8349878a7d 15 */
mbed_official 2:cc8349878a7d 16
mbed_official 2:cc8349878a7d 17 #include <mbed-events/events.h>
mbed_official 2:cc8349878a7d 18 #include "mbed.h"
mbed_official 2:cc8349878a7d 19 #include "ble/BLE.h"
mbed_official 2:cc8349878a7d 20 #include "ble/services/HealthThermometerService.h"
mbed_official 2:cc8349878a7d 21
mbed_official 2:cc8349878a7d 22 DigitalOut led1(LED1, 1);
mbed_official 2:cc8349878a7d 23
mbed_official 2:cc8349878a7d 24 const static char DEVICE_NAME[] = "Therm";
mbed_official 2:cc8349878a7d 25 static const uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE};
mbed_official 2:cc8349878a7d 26
mbed_official 2:cc8349878a7d 27 static float currentTemperature = 39.6;
mbed_official 2:cc8349878a7d 28 static HealthThermometerService *thermometerServicePtr;
mbed_official 2:cc8349878a7d 29
mbed_official 2:cc8349878a7d 30 static EventQueue eventQueue(
mbed_official 2:cc8349878a7d 31 /* event count */ 16 * /* event size */ 32
mbed_official 2:cc8349878a7d 32 );
mbed_official 2:cc8349878a7d 33
mbed_official 2:cc8349878a7d 34 /* Restart Advertising on disconnection*/
mbed_official 2:cc8349878a7d 35 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
mbed_official 2:cc8349878a7d 36 {
mbed_official 2:cc8349878a7d 37 BLE::Instance().gap().startAdvertising();
mbed_official 2:cc8349878a7d 38 }
mbed_official 2:cc8349878a7d 39
mbed_official 2:cc8349878a7d 40 void updateSensorValue(void) {
mbed_official 2:cc8349878a7d 41 /* Do blocking calls or whatever is necessary for sensor polling.
mbed_official 2:cc8349878a7d 42 In our case, we simply update the Temperature measurement. */
mbed_official 2:cc8349878a7d 43 currentTemperature = (currentTemperature + 0.1 > 43.0) ? 39.6 : currentTemperature + 0.1;
mbed_official 2:cc8349878a7d 44 thermometerServicePtr->updateTemperature(currentTemperature);
mbed_official 2:cc8349878a7d 45 }
mbed_official 2:cc8349878a7d 46
mbed_official 2:cc8349878a7d 47 void periodicCallback(void)
mbed_official 2:cc8349878a7d 48 {
mbed_official 2:cc8349878a7d 49 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
mbed_official 2:cc8349878a7d 50
mbed_official 2:cc8349878a7d 51 if (BLE::Instance().gap().getState().connected) {
mbed_official 2:cc8349878a7d 52 eventQueue.post(updateSensorValue);
mbed_official 2:cc8349878a7d 53 }
mbed_official 2:cc8349878a7d 54 }
mbed_official 2:cc8349878a7d 55
mbed_official 2:cc8349878a7d 56 void onBleInitError(BLE &ble, ble_error_t error)
mbed_official 2:cc8349878a7d 57 {
mbed_official 2:cc8349878a7d 58 /* Initialization error handling should go here */
mbed_official 2:cc8349878a7d 59 }
mbed_official 2:cc8349878a7d 60
mbed_official 2:cc8349878a7d 61 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
mbed_official 2:cc8349878a7d 62 {
mbed_official 2:cc8349878a7d 63 BLE& ble = params->ble;
mbed_official 2:cc8349878a7d 64 ble_error_t error = params->error;
mbed_official 2:cc8349878a7d 65
mbed_official 2:cc8349878a7d 66 if (error != BLE_ERROR_NONE) {
mbed_official 2:cc8349878a7d 67 onBleInitError(ble, error);
mbed_official 2:cc8349878a7d 68 return;
mbed_official 2:cc8349878a7d 69 }
mbed_official 2:cc8349878a7d 70
mbed_official 2:cc8349878a7d 71 if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
mbed_official 2:cc8349878a7d 72 return;
mbed_official 2:cc8349878a7d 73 }
mbed_official 2:cc8349878a7d 74
mbed_official 2:cc8349878a7d 75 ble.gap().onDisconnection(disconnectionCallback);
mbed_official 2:cc8349878a7d 76
mbed_official 2:cc8349878a7d 77 /* Setup primary service. */
mbed_official 2:cc8349878a7d 78 thermometerServicePtr = new HealthThermometerService(ble, currentTemperature, HealthThermometerService::LOCATION_EAR);
mbed_official 2:cc8349878a7d 79
mbed_official 2:cc8349878a7d 80 /* setup advertising */
mbed_official 2:cc8349878a7d 81 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
mbed_official 2:cc8349878a7d 82 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
mbed_official 2:cc8349878a7d 83 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::THERMOMETER_EAR);
mbed_official 2:cc8349878a7d 84 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
mbed_official 2:cc8349878a7d 85 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
mbed_official 2:cc8349878a7d 86 ble.gap().setAdvertisingInterval(1000); /* 1000ms */
mbed_official 2:cc8349878a7d 87 ble.gap().startAdvertising();
mbed_official 2:cc8349878a7d 88 }
mbed_official 2:cc8349878a7d 89
mbed_official 2:cc8349878a7d 90 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
mbed_official 2:cc8349878a7d 91 BLE &ble = BLE::Instance();
mbed_official 2:cc8349878a7d 92 eventQueue.post(Callback<void()>(&ble, &BLE::processEvents));
mbed_official 2:cc8349878a7d 93 }
mbed_official 2:cc8349878a7d 94
mbed_official 2:cc8349878a7d 95 int main()
mbed_official 2:cc8349878a7d 96 {
mbed_official 2:cc8349878a7d 97 eventQueue.post_every(500, periodicCallback);
mbed_official 2:cc8349878a7d 98
mbed_official 2:cc8349878a7d 99 BLE &ble = BLE::Instance();
mbed_official 2:cc8349878a7d 100 ble.onEventsToProcess(scheduleBleEventsProcessing);
mbed_official 2:cc8349878a7d 101 ble.init(bleInitComplete);
mbed_official 2:cc8349878a7d 102
mbed_official 2:cc8349878a7d 103 while (true) {
mbed_official 2:cc8349878a7d 104 eventQueue.dispatch();
mbed_official 2:cc8349878a7d 105 }
mbed_official 2:cc8349878a7d 106
mbed_official 2:cc8349878a7d 107 return 0;
mbed_official 2:cc8349878a7d 108 }