Lee Kai Xuan / mbed-os

Fork of mbed-os by erkin yucel

Committer:
elessair
Date:
Sun Oct 23 15:10:02 2016 +0000
Revision:
0:f269e3021894
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elessair 0:f269e3021894 1 /* mbed Microcontroller Library
elessair 0:f269e3021894 2 * Copyright (c) 2006-2013 ARM Limited
elessair 0:f269e3021894 3 *
elessair 0:f269e3021894 4 * Licensed under the Apache License, Version 2.0 (the "License");
elessair 0:f269e3021894 5 * you may not use this file except in compliance with the License.
elessair 0:f269e3021894 6 * You may obtain a copy of the License at
elessair 0:f269e3021894 7 *
elessair 0:f269e3021894 8 * http://www.apache.org/licenses/LICENSE-2.0
elessair 0:f269e3021894 9 *
elessair 0:f269e3021894 10 * Unless required by applicable law or agreed to in writing, software
elessair 0:f269e3021894 11 * distributed under the License is distributed on an "AS IS" BASIS,
elessair 0:f269e3021894 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
elessair 0:f269e3021894 13 * See the License for the specific language governing permissions and
elessair 0:f269e3021894 14 * limitations under the License.
elessair 0:f269e3021894 15 */
elessair 0:f269e3021894 16
elessair 0:f269e3021894 17 #ifndef __BLE_LINK_LOSS_SERVICE_H__
elessair 0:f269e3021894 18 #define __BLE_LINK_LOSS_SERVICE_H__
elessair 0:f269e3021894 19
elessair 0:f269e3021894 20 #include "ble/Gap.h"
elessair 0:f269e3021894 21
elessair 0:f269e3021894 22 /**
elessair 0:f269e3021894 23 * @class LinkLossService
elessair 0:f269e3021894 24 * @brief This service defines behavior when a link is lost between two devices.
elessair 0:f269e3021894 25 * Service: https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.link_loss.xml
elessair 0:f269e3021894 26 * Alertness Level Char: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.alert_level.xml
elessair 0:f269e3021894 27 */
elessair 0:f269e3021894 28 class LinkLossService {
elessair 0:f269e3021894 29 public:
elessair 0:f269e3021894 30 enum AlertLevel_t {
elessair 0:f269e3021894 31 NO_ALERT = 0,
elessair 0:f269e3021894 32 MILD_ALERT = 1,
elessair 0:f269e3021894 33 HIGH_ALERT = 2
elessair 0:f269e3021894 34 };
elessair 0:f269e3021894 35
elessair 0:f269e3021894 36 typedef void (* callback_t)(AlertLevel_t level);
elessair 0:f269e3021894 37
elessair 0:f269e3021894 38 /**
elessair 0:f269e3021894 39 * @param[ref] ble
elessair 0:f269e3021894 40 * BLE object for the underlying controller.
elessair 0:f269e3021894 41 */
elessair 0:f269e3021894 42 LinkLossService(BLE &bleIn, callback_t callbackIn, AlertLevel_t levelIn = NO_ALERT) :
elessair 0:f269e3021894 43 ble(bleIn),
elessair 0:f269e3021894 44 alertLevel(levelIn),
elessair 0:f269e3021894 45 callback(callbackIn),
elessair 0:f269e3021894 46 alertLevelChar(GattCharacteristic::UUID_ALERT_LEVEL_CHAR, reinterpret_cast<uint8_t *>(&alertLevel)) {
elessair 0:f269e3021894 47 static bool serviceAdded = false; /* We should only ever add one LinkLoss service. */
elessair 0:f269e3021894 48 if (serviceAdded) {
elessair 0:f269e3021894 49 return;
elessair 0:f269e3021894 50 }
elessair 0:f269e3021894 51
elessair 0:f269e3021894 52 GattCharacteristic *charTable[] = {&alertLevelChar};
elessair 0:f269e3021894 53 GattService linkLossService(GattService::UUID_LINK_LOSS_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
elessair 0:f269e3021894 54
elessair 0:f269e3021894 55 ble.gattServer().addService(linkLossService);
elessair 0:f269e3021894 56 serviceAdded = true;
elessair 0:f269e3021894 57
elessair 0:f269e3021894 58 ble.gap().onDisconnection(this, &LinkLossService::onDisconnectionFilter);
elessair 0:f269e3021894 59 ble.gattServer().onDataWritten(this, &LinkLossService::onDataWritten);
elessair 0:f269e3021894 60 }
elessair 0:f269e3021894 61
elessair 0:f269e3021894 62 /**
elessair 0:f269e3021894 63 * Update the callback.
elessair 0:f269e3021894 64 */
elessair 0:f269e3021894 65 void setCallback(callback_t newCallback) {
elessair 0:f269e3021894 66 callback = newCallback;
elessair 0:f269e3021894 67 }
elessair 0:f269e3021894 68
elessair 0:f269e3021894 69 /**
elessair 0:f269e3021894 70 * Update alertness level.
elessair 0:f269e3021894 71 */
elessair 0:f269e3021894 72 void setAlertLevel(AlertLevel_t newLevel) {
elessair 0:f269e3021894 73 alertLevel = newLevel;
elessair 0:f269e3021894 74 }
elessair 0:f269e3021894 75
elessair 0:f269e3021894 76 protected:
elessair 0:f269e3021894 77 /**
elessair 0:f269e3021894 78 * This callback allows receiving updates to the AlertLevel characteristic.
elessair 0:f269e3021894 79 *
elessair 0:f269e3021894 80 * @param[in] params
elessair 0:f269e3021894 81 * Information about the characterisitc being updated.
elessair 0:f269e3021894 82 */
elessair 0:f269e3021894 83 virtual void onDataWritten(const GattWriteCallbackParams *params) {
elessair 0:f269e3021894 84 if (params->handle == alertLevelChar.getValueHandle()) {
elessair 0:f269e3021894 85 alertLevel = *reinterpret_cast<const AlertLevel_t *>(params->data);
elessair 0:f269e3021894 86 }
elessair 0:f269e3021894 87 }
elessair 0:f269e3021894 88
elessair 0:f269e3021894 89 void onDisconnectionFilter(const Gap::DisconnectionCallbackParams_t *params) {
elessair 0:f269e3021894 90 if (alertLevel != NO_ALERT) {
elessair 0:f269e3021894 91 callback(alertLevel);
elessair 0:f269e3021894 92 }
elessair 0:f269e3021894 93 }
elessair 0:f269e3021894 94
elessair 0:f269e3021894 95 protected:
elessair 0:f269e3021894 96 BLE &ble;
elessair 0:f269e3021894 97 AlertLevel_t alertLevel;
elessair 0:f269e3021894 98 callback_t callback;
elessair 0:f269e3021894 99
elessair 0:f269e3021894 100 ReadWriteGattCharacteristic<uint8_t> alertLevelChar;
elessair 0:f269e3021894 101 };
elessair 0:f269e3021894 102
elessair 0:f269e3021894 103 #endif /* __BLE_LINK_LOSS_SERVICE_H__ */