mbed-os
Dependents: cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more
Diff: features/FEATURE_BLE/targets/TARGET_CORDIO/CordioGattServer.h
- Revision:
- 0:b74591d5ab33
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/CordioGattServer.h Mon Dec 11 17:54:04 2017 +0000 @@ -0,0 +1,217 @@ +/* mbed Microcontroller Library + * Copyright (c) 2017-2017 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 CORDIO_GATT_SERVER_H_ +#define CORDIO_GATT_SERVER_H_ + +#include <stddef.h> +#include "ble/blecommon.h" +#include "ble/GattServer.h" +#include "ble/Gap.h" +#include "wsf_types.h" +#include "att_api.h" + +/*! client characteristic configuration descriptors settings */ +#define MAX_CCC_CNT 20 + +namespace ble { +namespace vendor { +namespace cordio { + +/** + * Cordio implementation of ::GattServer + */ +class GattServer : public ::GattServer +{ +public: + /** + * Return the singleton of the Cordio implementation of ::GattServer. + */ + static GattServer &getInstance(); + + /** + * Initialize the GattServer and add mandatory services (generic access and + * generic attribute service). + */ + void initialize(); + + /** + * @see ::GattServer::addService + */ + virtual ble_error_t addService(GattService &); + + /** + * @see ::GattServer::read + */ + virtual ble_error_t read( + GattAttribute::Handle_t attributeHandle, + uint8_t buffer[], + uint16_t *lengthP + ); + + /** + * @see ::GattServer::read + */ + virtual ble_error_t read( + Gap::Handle_t connectionHandle, + GattAttribute::Handle_t attributeHandle, + uint8_t buffer[], uint16_t *lengthP + ); + + /** + * @see ::GattServer::write + */ + virtual ble_error_t write( + GattAttribute::Handle_t, + const uint8_t[], uint16_t, + bool localOnly = false + ); + + /** + * @see ::GattServer::write + */ + virtual ble_error_t write( + Gap::Handle_t connectionHandle, + GattAttribute::Handle_t, + const uint8_t[], + uint16_t, + bool localOnly = false + ); + + /** + * @see ::GattServer::areUpdatesEnabled + */ + virtual ble_error_t areUpdatesEnabled( + const GattCharacteristic &characteristic, bool *enabledP + ); + + /** + * @see ::GattServer::areUpdatesEnabled + */ + virtual ble_error_t areUpdatesEnabled( + Gap::Handle_t connectionHandle, + const GattCharacteristic &characteristic, + bool *enabledP + ); + + /** + * @see ::GattServer::isOnDataReadAvailable + */ + virtual bool isOnDataReadAvailable() const; + + /** + * @see ::GattServer::getPreferredConnectionParams + */ + virtual ::Gap::ConnectionParams_t getPreferredConnectionParams(); + + /** + * @see ::GattServer::setPreferredConnectionParams + */ + virtual void setPreferredConnectionParams(const ::Gap::ConnectionParams_t& params); + + /** + * @see ::GattServer::setDeviceName + */ + virtual ble_error_t setDeviceName(const uint8_t *deviceName); + + /** + * @see ::GattServer::getDeviceName + */ + virtual void getDeviceName(const uint8_t*& name, uint16_t& length); + + /** + * @see ::GattServer::setAppearance + */ + virtual void setAppearance(GapAdvertisingData::Appearance appearance); + + /** + * @see ::GattServer::getAppearance + */ + virtual GapAdvertisingData::Appearance getAppearance(); + + /** + * @see ::GattServer::reset + */ + virtual ble_error_t reset(void); + +private: + static void cccCback(attsCccEvt_t *pEvt); + static void attCback(attEvt_t *pEvt); + static uint8_t attsReadCback(dmConnId_t connId, uint16_t handle, uint8_t operation, uint16_t offset, attsAttr_t *pAttr); + static uint8_t attsWriteCback(dmConnId_t connId, uint16_t handle, uint8_t operation, uint16_t offset, uint16_t len, uint8_t *pValue, attsAttr_t *pAttr); + void add_generic_access_service(); + void add_generic_attribute_service(); + void* alloc_block(size_t block_size); + + struct alloc_block_t { + alloc_block_t* next; + uint8_t data[1]; + }; + + struct internal_char_t { + uint16_t descLen; + }; + + struct internal_service_t { + uint16_t uuidLen; + internal_char_t *chars; + attsGroup_t *attGroup; + internal_service_t *next; + }; + + attsCccSet_t cccSet[MAX_CCC_CNT]; + uint16_t cccValues[MAX_CCC_CNT]; + uint16_t cccHandles[MAX_CCC_CNT]; + uint8_t cccCnt; + + struct { + attsGroup_t service; + attsAttr_t attributes[7]; + uint8_t device_name_declaration_value[5]; + uint16_t device_name_length; + uint8_t appearance_declaration_value[5]; + uint16_t appearance; + uint8_t ppcp_declaration_value[5]; + uint8_t ppcp[8]; + + uint8_t*& device_name_value() { + return attributes[2].pValue; + } + } generic_access_service; + + struct { + attsGroup_t service; + attsAttr_t attributes[4]; + uint8_t service_changed_declaration[5]; + } generic_attribute_service; + + internal_service_t* registered_service; + alloc_block_t* allocated_blocks; + + uint16_t currentHandle; + +private: + GattServer(); + + GattServer(const GattServer &); + const GattServer& operator=(const GattServer &); +}; + +} // namespace cordio +} // namespace vendor +} // namespace ble + +#endif /* CORDIO_GATT_SERVER_H_ */