Preliminary main mbed library for nexpaq development
features/FEATURE_BLE/ble/services/LinkLossService.h
- Committer:
- nexpaq
- Date:
- 2016-11-04
- Revision:
- 0:6c56fb4bc5f0
File content as of revision 0:6c56fb4bc5f0:
/* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __BLE_LINK_LOSS_SERVICE_H__ #define __BLE_LINK_LOSS_SERVICE_H__ #include "ble/Gap.h" /** * @class LinkLossService * @brief This service defines behavior when a link is lost between two devices. * Service: https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.link_loss.xml * Alertness Level Char: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.alert_level.xml */ class LinkLossService { public: enum AlertLevel_t { NO_ALERT = 0, MILD_ALERT = 1, HIGH_ALERT = 2 }; typedef void (* callback_t)(AlertLevel_t level); /** * @param[ref] ble * BLE object for the underlying controller. */ LinkLossService(BLE &bleIn, callback_t callbackIn, AlertLevel_t levelIn = NO_ALERT) : ble(bleIn), alertLevel(levelIn), callback(callbackIn), alertLevelChar(GattCharacteristic::UUID_ALERT_LEVEL_CHAR, reinterpret_cast<uint8_t *>(&alertLevel)) { static bool serviceAdded = false; /* We should only ever add one LinkLoss service. */ if (serviceAdded) { return; } GattCharacteristic *charTable[] = {&alertLevelChar}; GattService linkLossService(GattService::UUID_LINK_LOSS_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *)); ble.gattServer().addService(linkLossService); serviceAdded = true; ble.gap().onDisconnection(this, &LinkLossService::onDisconnectionFilter); ble.gattServer().onDataWritten(this, &LinkLossService::onDataWritten); } /** * Update the callback. */ void setCallback(callback_t newCallback) { callback = newCallback; } /** * Update alertness level. */ void setAlertLevel(AlertLevel_t newLevel) { alertLevel = newLevel; } protected: /** * This callback allows receiving updates to the AlertLevel characteristic. * * @param[in] params * Information about the characterisitc being updated. */ virtual void onDataWritten(const GattWriteCallbackParams *params) { if (params->handle == alertLevelChar.getValueHandle()) { alertLevel = *reinterpret_cast<const AlertLevel_t *>(params->data); } } void onDisconnectionFilter(const Gap::DisconnectionCallbackParams_t *params) { if (alertLevel != NO_ALERT) { callback(alertLevel); } } protected: BLE &ble; AlertLevel_t alertLevel; callback_t callback; ReadWriteGattCharacteristic<uint8_t> alertLevelChar; }; #endif /* __BLE_LINK_LOSS_SERVICE_H__ */