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:
Wed May 10 10:17:16 2017 +0100
Revision:
27:0c99c4b33d56
Parent:
11:4e356c89ad66
Child:
39:ac224f69256b
Merge pull request #78 from ashok-rao/master

Using predefined macro for EVENT SIZE.
.
Commit copied from https://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 11:4e356c89ad66 17 #include <events/mbed_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 27:0c99c4b33d56 30 static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE);
mbed_official 2:cc8349878a7d 31
mbed_official 2:cc8349878a7d 32 /* Restart Advertising on disconnection*/
mbed_official 2:cc8349878a7d 33 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
mbed_official 2:cc8349878a7d 34 {
mbed_official 2:cc8349878a7d 35 BLE::Instance().gap().startAdvertising();
mbed_official 2:cc8349878a7d 36 }
mbed_official 2:cc8349878a7d 37
mbed_official 2:cc8349878a7d 38 void updateSensorValue(void) {
mbed_official 2:cc8349878a7d 39 /* Do blocking calls or whatever is necessary for sensor polling.
mbed_official 2:cc8349878a7d 40 In our case, we simply update the Temperature measurement. */
mbed_official 2:cc8349878a7d 41 currentTemperature = (currentTemperature + 0.1 > 43.0) ? 39.6 : currentTemperature + 0.1;
mbed_official 2:cc8349878a7d 42 thermometerServicePtr->updateTemperature(currentTemperature);
mbed_official 2:cc8349878a7d 43 }
mbed_official 2:cc8349878a7d 44
mbed_official 2:cc8349878a7d 45 void periodicCallback(void)
mbed_official 2:cc8349878a7d 46 {
mbed_official 2:cc8349878a7d 47 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
mbed_official 2:cc8349878a7d 48
mbed_official 2:cc8349878a7d 49 if (BLE::Instance().gap().getState().connected) {
mbed_official 11:4e356c89ad66 50 eventQueue.call(updateSensorValue);
mbed_official 2:cc8349878a7d 51 }
mbed_official 2:cc8349878a7d 52 }
mbed_official 2:cc8349878a7d 53
mbed_official 2:cc8349878a7d 54 void onBleInitError(BLE &ble, ble_error_t error)
mbed_official 2:cc8349878a7d 55 {
mbed_official 2:cc8349878a7d 56 /* Initialization error handling should go here */
mbed_official 2:cc8349878a7d 57 }
mbed_official 2:cc8349878a7d 58
mbed_official 2:cc8349878a7d 59 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
mbed_official 2:cc8349878a7d 60 {
mbed_official 2:cc8349878a7d 61 BLE& ble = params->ble;
mbed_official 2:cc8349878a7d 62 ble_error_t error = params->error;
mbed_official 2:cc8349878a7d 63
mbed_official 2:cc8349878a7d 64 if (error != BLE_ERROR_NONE) {
mbed_official 2:cc8349878a7d 65 onBleInitError(ble, error);
mbed_official 2:cc8349878a7d 66 return;
mbed_official 2:cc8349878a7d 67 }
mbed_official 2:cc8349878a7d 68
mbed_official 2:cc8349878a7d 69 if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
mbed_official 2:cc8349878a7d 70 return;
mbed_official 2:cc8349878a7d 71 }
mbed_official 2:cc8349878a7d 72
mbed_official 2:cc8349878a7d 73 ble.gap().onDisconnection(disconnectionCallback);
mbed_official 2:cc8349878a7d 74
mbed_official 2:cc8349878a7d 75 /* Setup primary service. */
mbed_official 2:cc8349878a7d 76 thermometerServicePtr = new HealthThermometerService(ble, currentTemperature, HealthThermometerService::LOCATION_EAR);
mbed_official 2:cc8349878a7d 77
mbed_official 2:cc8349878a7d 78 /* setup advertising */
mbed_official 2:cc8349878a7d 79 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
mbed_official 2:cc8349878a7d 80 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
mbed_official 2:cc8349878a7d 81 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::THERMOMETER_EAR);
mbed_official 2:cc8349878a7d 82 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
mbed_official 2:cc8349878a7d 83 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
mbed_official 2:cc8349878a7d 84 ble.gap().setAdvertisingInterval(1000); /* 1000ms */
mbed_official 2:cc8349878a7d 85 ble.gap().startAdvertising();
mbed_official 2:cc8349878a7d 86 }
mbed_official 2:cc8349878a7d 87
mbed_official 2:cc8349878a7d 88 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
mbed_official 2:cc8349878a7d 89 BLE &ble = BLE::Instance();
mbed_official 11:4e356c89ad66 90 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
mbed_official 2:cc8349878a7d 91 }
mbed_official 2:cc8349878a7d 92
mbed_official 2:cc8349878a7d 93 int main()
mbed_official 2:cc8349878a7d 94 {
mbed_official 11:4e356c89ad66 95 eventQueue.call_every(500, periodicCallback);
mbed_official 2:cc8349878a7d 96
mbed_official 2:cc8349878a7d 97 BLE &ble = BLE::Instance();
mbed_official 2:cc8349878a7d 98 ble.onEventsToProcess(scheduleBleEventsProcessing);
mbed_official 2:cc8349878a7d 99 ble.init(bleInitComplete);
mbed_official 2:cc8349878a7d 100
mbed_official 11:4e356c89ad66 101 eventQueue.dispatch_forever();
mbed_official 2:cc8349878a7d 102
mbed_official 2:cc8349878a7d 103 return 0;
mbed_official 2:cc8349878a7d 104 }