An example of creating and updating a simple GATT Service using the BLE_API

Dependencies:   BLE_API X_NUCLEO_IDB0XA1 mbed

Committer:
apalmieri
Date:
Fri Sep 16 10:41:37 2016 +0000
Revision:
10:49c15c461749
Parent:
7:15e13a8f1193
Sync w/ mbed (rev125) BLE_API (rev1208) and X_NUCLEO_IDB0XA1 (rev307) libs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:dbff48b4070b 1 /* mbed Microcontroller Library
screamer 0:dbff48b4070b 2 * Copyright (c) 2006-2014 ARM Limited
screamer 0:dbff48b4070b 3 *
screamer 0:dbff48b4070b 4 * Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:dbff48b4070b 5 * you may not use this file except in compliance with the License.
screamer 0:dbff48b4070b 6 * You may obtain a copy of the License at
screamer 0:dbff48b4070b 7 *
screamer 0:dbff48b4070b 8 * http://www.apache.org/licenses/LICENSE-2.0
screamer 0:dbff48b4070b 9 *
screamer 0:dbff48b4070b 10 * Unless required by applicable law or agreed to in writing, software
screamer 0:dbff48b4070b 11 * distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:dbff48b4070b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:dbff48b4070b 13 * See the License for the specific language governing permissions and
screamer 0:dbff48b4070b 14 * limitations under the License.
screamer 0:dbff48b4070b 15 */
screamer 0:dbff48b4070b 16
screamer 0:dbff48b4070b 17 #include "mbed.h"
screamer 0:dbff48b4070b 18 #include "BLE.h"
screamer 0:dbff48b4070b 19 #include "BatteryService.h"
screamer 0:dbff48b4070b 20
screamer 0:dbff48b4070b 21 DigitalOut led1(LED1, 1);
apalmieri 1:c81543a36d05 22
apalmieri 1:c81543a36d05 23 const static char DEVICE_NAME[] = "BATTERY";
apalmieri 1:c81543a36d05 24 static const uint16_t uuid16_list[] = {GattService::UUID_BATTERY_SERVICE};
apalmieri 1:c81543a36d05 25
apalmieri 1:c81543a36d05 26 static volatile bool triggerSensorPolling = false;
apalmieri 1:c81543a36d05 27
apalmieri 1:c81543a36d05 28 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
screamer 0:dbff48b4070b 29 {
apalmieri 7:15e13a8f1193 30 (void)params;
apalmieri 7:15e13a8f1193 31 BLE::Instance().gap().startAdvertising(); // restart advertising
screamer 0:dbff48b4070b 32 }
screamer 0:dbff48b4070b 33
screamer 0:dbff48b4070b 34 void blink(void)
screamer 0:dbff48b4070b 35 {
screamer 0:dbff48b4070b 36 led1 = !led1;
apalmieri 1:c81543a36d05 37 triggerSensorPolling = true;
screamer 0:dbff48b4070b 38 }
apalmieri 7:15e13a8f1193 39
apalmieri 7:15e13a8f1193 40 void onBleInitError(BLE &ble, ble_error_t error)
apalmieri 7:15e13a8f1193 41 {
apalmieri 7:15e13a8f1193 42 (void)ble;
apalmieri 7:15e13a8f1193 43 (void)error;
apalmieri 7:15e13a8f1193 44 /* Initialization error handling should go here */
apalmieri 7:15e13a8f1193 45 }
apalmieri 7:15e13a8f1193 46
apalmieri 7:15e13a8f1193 47 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
screamer 0:dbff48b4070b 48 {
apalmieri 7:15e13a8f1193 49 BLE& ble = params->ble;
apalmieri 7:15e13a8f1193 50 ble_error_t error = params->error;
apalmieri 7:15e13a8f1193 51
apalmieri 7:15e13a8f1193 52 if (error != BLE_ERROR_NONE) {
apalmieri 7:15e13a8f1193 53 onBleInitError(ble, error);
apalmieri 7:15e13a8f1193 54 return;
apalmieri 7:15e13a8f1193 55 }
apalmieri 7:15e13a8f1193 56
apalmieri 7:15e13a8f1193 57 if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
apalmieri 7:15e13a8f1193 58 return;
apalmieri 7:15e13a8f1193 59 }
apalmieri 7:15e13a8f1193 60
apalmieri 7:15e13a8f1193 61 ble.gap().onDisconnection(disconnectionCallback);
apalmieri 7:15e13a8f1193 62
screamer 0:dbff48b4070b 63 uint8_t batteryLevel = 50;
screamer 0:dbff48b4070b 64 BatteryService batteryService(ble, batteryLevel);
screamer 0:dbff48b4070b 65
screamer 0:dbff48b4070b 66 /* setup advertising */
screamer 0:dbff48b4070b 67 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
apalmieri 1:c81543a36d05 68 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *) uuid16_list, sizeof(uuid16_list));
apalmieri 1:c81543a36d05 69 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *) DEVICE_NAME, sizeof(DEVICE_NAME));
screamer 0:dbff48b4070b 70 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
screamer 0:dbff48b4070b 71 ble.setAdvertisingInterval(1000); /* 1000ms; in multiples of 0.625ms. */
screamer 0:dbff48b4070b 72 ble.startAdvertising();
screamer 0:dbff48b4070b 73
screamer 0:dbff48b4070b 74 while (true) {
apalmieri 1:c81543a36d05 75 // check for trigger from periodicCallback()
apalmieri 1:c81543a36d05 76 if (triggerSensorPolling && ble.getGapState().connected) {
apalmieri 1:c81543a36d05 77 triggerSensorPolling = false;
screamer 0:dbff48b4070b 78
apalmieri 1:c81543a36d05 79 // the magic battery processing
apalmieri 1:c81543a36d05 80 batteryLevel++;
apalmieri 1:c81543a36d05 81 if (batteryLevel > 100) {
apalmieri 1:c81543a36d05 82 batteryLevel = 20;
apalmieri 1:c81543a36d05 83 }
apalmieri 1:c81543a36d05 84
apalmieri 1:c81543a36d05 85 batteryService.updateBatteryLevel(batteryLevel);
apalmieri 1:c81543a36d05 86 } else {
apalmieri 1:c81543a36d05 87 ble.waitForEvent(); // low power wait for event
screamer 0:dbff48b4070b 88 }
screamer 0:dbff48b4070b 89 }
screamer 0:dbff48b4070b 90 }
apalmieri 7:15e13a8f1193 91
apalmieri 7:15e13a8f1193 92 int main(void)
apalmieri 7:15e13a8f1193 93 {
apalmieri 7:15e13a8f1193 94 Ticker t;
apalmieri 7:15e13a8f1193 95 t.attach(blink, 1.0f);
apalmieri 7:15e13a8f1193 96
apalmieri 7:15e13a8f1193 97 BLE::Instance().init(bleInitComplete);
apalmieri 7:15e13a8f1193 98 }
apalmieri 7:15e13a8f1193 99
screamer 0:dbff48b4070b 100