mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
be_bryan 0:b74591d5ab33 1 /* mbed Microcontroller Library
be_bryan 0:b74591d5ab33 2 * Copyright (c) 2017-2017 ARM Limited
be_bryan 0:b74591d5ab33 3 *
be_bryan 0:b74591d5ab33 4 * Licensed under the Apache License, Version 2.0 (the "License");
be_bryan 0:b74591d5ab33 5 * you may not use this file except in compliance with the License.
be_bryan 0:b74591d5ab33 6 * You may obtain a copy of the License at
be_bryan 0:b74591d5ab33 7 *
be_bryan 0:b74591d5ab33 8 * http://www.apache.org/licenses/LICENSE-2.0
be_bryan 0:b74591d5ab33 9 *
be_bryan 0:b74591d5ab33 10 * Unless required by applicable law or agreed to in writing, software
be_bryan 0:b74591d5ab33 11 * distributed under the License is distributed on an "AS IS" BASIS,
be_bryan 0:b74591d5ab33 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
be_bryan 0:b74591d5ab33 13 * See the License for the specific language governing permissions and
be_bryan 0:b74591d5ab33 14 * limitations under the License.
be_bryan 0:b74591d5ab33 15 */
be_bryan 0:b74591d5ab33 16
be_bryan 0:b74591d5ab33 17 #ifndef CORDIO_GATT_SERVER_H_
be_bryan 0:b74591d5ab33 18 #define CORDIO_GATT_SERVER_H_
be_bryan 0:b74591d5ab33 19
be_bryan 0:b74591d5ab33 20 #include <stddef.h>
be_bryan 0:b74591d5ab33 21 #include "ble/blecommon.h"
be_bryan 0:b74591d5ab33 22 #include "ble/GattServer.h"
be_bryan 0:b74591d5ab33 23 #include "ble/Gap.h"
be_bryan 0:b74591d5ab33 24 #include "wsf_types.h"
be_bryan 0:b74591d5ab33 25 #include "att_api.h"
be_bryan 0:b74591d5ab33 26
be_bryan 0:b74591d5ab33 27 /*! client characteristic configuration descriptors settings */
be_bryan 0:b74591d5ab33 28 #define MAX_CCC_CNT 20
be_bryan 0:b74591d5ab33 29
be_bryan 0:b74591d5ab33 30 namespace ble {
be_bryan 0:b74591d5ab33 31 namespace vendor {
be_bryan 0:b74591d5ab33 32 namespace cordio {
be_bryan 0:b74591d5ab33 33
be_bryan 0:b74591d5ab33 34 /**
be_bryan 0:b74591d5ab33 35 * Cordio implementation of ::GattServer
be_bryan 0:b74591d5ab33 36 */
be_bryan 0:b74591d5ab33 37 class GattServer : public ::GattServer
be_bryan 0:b74591d5ab33 38 {
be_bryan 0:b74591d5ab33 39 public:
be_bryan 0:b74591d5ab33 40 /**
be_bryan 0:b74591d5ab33 41 * Return the singleton of the Cordio implementation of ::GattServer.
be_bryan 0:b74591d5ab33 42 */
be_bryan 0:b74591d5ab33 43 static GattServer &getInstance();
be_bryan 0:b74591d5ab33 44
be_bryan 0:b74591d5ab33 45 /**
be_bryan 0:b74591d5ab33 46 * Initialize the GattServer and add mandatory services (generic access and
be_bryan 0:b74591d5ab33 47 * generic attribute service).
be_bryan 0:b74591d5ab33 48 */
be_bryan 0:b74591d5ab33 49 void initialize();
be_bryan 0:b74591d5ab33 50
be_bryan 0:b74591d5ab33 51 /**
be_bryan 0:b74591d5ab33 52 * @see ::GattServer::addService
be_bryan 0:b74591d5ab33 53 */
be_bryan 0:b74591d5ab33 54 virtual ble_error_t addService(GattService &);
be_bryan 0:b74591d5ab33 55
be_bryan 0:b74591d5ab33 56 /**
be_bryan 0:b74591d5ab33 57 * @see ::GattServer::read
be_bryan 0:b74591d5ab33 58 */
be_bryan 0:b74591d5ab33 59 virtual ble_error_t read(
be_bryan 0:b74591d5ab33 60 GattAttribute::Handle_t attributeHandle,
be_bryan 0:b74591d5ab33 61 uint8_t buffer[],
be_bryan 0:b74591d5ab33 62 uint16_t *lengthP
be_bryan 0:b74591d5ab33 63 );
be_bryan 0:b74591d5ab33 64
be_bryan 0:b74591d5ab33 65 /**
be_bryan 0:b74591d5ab33 66 * @see ::GattServer::read
be_bryan 0:b74591d5ab33 67 */
be_bryan 0:b74591d5ab33 68 virtual ble_error_t read(
be_bryan 0:b74591d5ab33 69 Gap::Handle_t connectionHandle,
be_bryan 0:b74591d5ab33 70 GattAttribute::Handle_t attributeHandle,
be_bryan 0:b74591d5ab33 71 uint8_t buffer[], uint16_t *lengthP
be_bryan 0:b74591d5ab33 72 );
be_bryan 0:b74591d5ab33 73
be_bryan 0:b74591d5ab33 74 /**
be_bryan 0:b74591d5ab33 75 * @see ::GattServer::write
be_bryan 0:b74591d5ab33 76 */
be_bryan 0:b74591d5ab33 77 virtual ble_error_t write(
be_bryan 0:b74591d5ab33 78 GattAttribute::Handle_t,
be_bryan 0:b74591d5ab33 79 const uint8_t[], uint16_t,
be_bryan 0:b74591d5ab33 80 bool localOnly = false
be_bryan 0:b74591d5ab33 81 );
be_bryan 0:b74591d5ab33 82
be_bryan 0:b74591d5ab33 83 /**
be_bryan 0:b74591d5ab33 84 * @see ::GattServer::write
be_bryan 0:b74591d5ab33 85 */
be_bryan 0:b74591d5ab33 86 virtual ble_error_t write(
be_bryan 0:b74591d5ab33 87 Gap::Handle_t connectionHandle,
be_bryan 0:b74591d5ab33 88 GattAttribute::Handle_t,
be_bryan 0:b74591d5ab33 89 const uint8_t[],
be_bryan 0:b74591d5ab33 90 uint16_t,
be_bryan 0:b74591d5ab33 91 bool localOnly = false
be_bryan 0:b74591d5ab33 92 );
be_bryan 0:b74591d5ab33 93
be_bryan 0:b74591d5ab33 94 /**
be_bryan 0:b74591d5ab33 95 * @see ::GattServer::areUpdatesEnabled
be_bryan 0:b74591d5ab33 96 */
be_bryan 0:b74591d5ab33 97 virtual ble_error_t areUpdatesEnabled(
be_bryan 0:b74591d5ab33 98 const GattCharacteristic &characteristic, bool *enabledP
be_bryan 0:b74591d5ab33 99 );
be_bryan 0:b74591d5ab33 100
be_bryan 0:b74591d5ab33 101 /**
be_bryan 0:b74591d5ab33 102 * @see ::GattServer::areUpdatesEnabled
be_bryan 0:b74591d5ab33 103 */
be_bryan 0:b74591d5ab33 104 virtual ble_error_t areUpdatesEnabled(
be_bryan 0:b74591d5ab33 105 Gap::Handle_t connectionHandle,
be_bryan 0:b74591d5ab33 106 const GattCharacteristic &characteristic,
be_bryan 0:b74591d5ab33 107 bool *enabledP
be_bryan 0:b74591d5ab33 108 );
be_bryan 0:b74591d5ab33 109
be_bryan 0:b74591d5ab33 110 /**
be_bryan 0:b74591d5ab33 111 * @see ::GattServer::isOnDataReadAvailable
be_bryan 0:b74591d5ab33 112 */
be_bryan 0:b74591d5ab33 113 virtual bool isOnDataReadAvailable() const;
be_bryan 0:b74591d5ab33 114
be_bryan 0:b74591d5ab33 115 /**
be_bryan 0:b74591d5ab33 116 * @see ::GattServer::getPreferredConnectionParams
be_bryan 0:b74591d5ab33 117 */
be_bryan 0:b74591d5ab33 118 virtual ::Gap::ConnectionParams_t getPreferredConnectionParams();
be_bryan 0:b74591d5ab33 119
be_bryan 0:b74591d5ab33 120 /**
be_bryan 0:b74591d5ab33 121 * @see ::GattServer::setPreferredConnectionParams
be_bryan 0:b74591d5ab33 122 */
be_bryan 0:b74591d5ab33 123 virtual void setPreferredConnectionParams(const ::Gap::ConnectionParams_t& params);
be_bryan 0:b74591d5ab33 124
be_bryan 0:b74591d5ab33 125 /**
be_bryan 0:b74591d5ab33 126 * @see ::GattServer::setDeviceName
be_bryan 0:b74591d5ab33 127 */
be_bryan 0:b74591d5ab33 128 virtual ble_error_t setDeviceName(const uint8_t *deviceName);
be_bryan 0:b74591d5ab33 129
be_bryan 0:b74591d5ab33 130 /**
be_bryan 0:b74591d5ab33 131 * @see ::GattServer::getDeviceName
be_bryan 0:b74591d5ab33 132 */
be_bryan 0:b74591d5ab33 133 virtual void getDeviceName(const uint8_t*& name, uint16_t& length);
be_bryan 0:b74591d5ab33 134
be_bryan 0:b74591d5ab33 135 /**
be_bryan 0:b74591d5ab33 136 * @see ::GattServer::setAppearance
be_bryan 0:b74591d5ab33 137 */
be_bryan 0:b74591d5ab33 138 virtual void setAppearance(GapAdvertisingData::Appearance appearance);
be_bryan 0:b74591d5ab33 139
be_bryan 0:b74591d5ab33 140 /**
be_bryan 0:b74591d5ab33 141 * @see ::GattServer::getAppearance
be_bryan 0:b74591d5ab33 142 */
be_bryan 0:b74591d5ab33 143 virtual GapAdvertisingData::Appearance getAppearance();
be_bryan 0:b74591d5ab33 144
be_bryan 0:b74591d5ab33 145 /**
be_bryan 0:b74591d5ab33 146 * @see ::GattServer::reset
be_bryan 0:b74591d5ab33 147 */
be_bryan 0:b74591d5ab33 148 virtual ble_error_t reset(void);
be_bryan 0:b74591d5ab33 149
be_bryan 0:b74591d5ab33 150 private:
be_bryan 0:b74591d5ab33 151 static void cccCback(attsCccEvt_t *pEvt);
be_bryan 0:b74591d5ab33 152 static void attCback(attEvt_t *pEvt);
be_bryan 0:b74591d5ab33 153 static uint8_t attsReadCback(dmConnId_t connId, uint16_t handle, uint8_t operation, uint16_t offset, attsAttr_t *pAttr);
be_bryan 0:b74591d5ab33 154 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);
be_bryan 0:b74591d5ab33 155 void add_generic_access_service();
be_bryan 0:b74591d5ab33 156 void add_generic_attribute_service();
be_bryan 0:b74591d5ab33 157 void* alloc_block(size_t block_size);
be_bryan 0:b74591d5ab33 158
be_bryan 0:b74591d5ab33 159 struct alloc_block_t {
be_bryan 0:b74591d5ab33 160 alloc_block_t* next;
be_bryan 0:b74591d5ab33 161 uint8_t data[1];
be_bryan 0:b74591d5ab33 162 };
be_bryan 0:b74591d5ab33 163
be_bryan 0:b74591d5ab33 164 struct internal_char_t {
be_bryan 0:b74591d5ab33 165 uint16_t descLen;
be_bryan 0:b74591d5ab33 166 };
be_bryan 0:b74591d5ab33 167
be_bryan 0:b74591d5ab33 168 struct internal_service_t {
be_bryan 0:b74591d5ab33 169 uint16_t uuidLen;
be_bryan 0:b74591d5ab33 170 internal_char_t *chars;
be_bryan 0:b74591d5ab33 171 attsGroup_t *attGroup;
be_bryan 0:b74591d5ab33 172 internal_service_t *next;
be_bryan 0:b74591d5ab33 173 };
be_bryan 0:b74591d5ab33 174
be_bryan 0:b74591d5ab33 175 attsCccSet_t cccSet[MAX_CCC_CNT];
be_bryan 0:b74591d5ab33 176 uint16_t cccValues[MAX_CCC_CNT];
be_bryan 0:b74591d5ab33 177 uint16_t cccHandles[MAX_CCC_CNT];
be_bryan 0:b74591d5ab33 178 uint8_t cccCnt;
be_bryan 0:b74591d5ab33 179
be_bryan 0:b74591d5ab33 180 struct {
be_bryan 0:b74591d5ab33 181 attsGroup_t service;
be_bryan 0:b74591d5ab33 182 attsAttr_t attributes[7];
be_bryan 0:b74591d5ab33 183 uint8_t device_name_declaration_value[5];
be_bryan 0:b74591d5ab33 184 uint16_t device_name_length;
be_bryan 0:b74591d5ab33 185 uint8_t appearance_declaration_value[5];
be_bryan 0:b74591d5ab33 186 uint16_t appearance;
be_bryan 0:b74591d5ab33 187 uint8_t ppcp_declaration_value[5];
be_bryan 0:b74591d5ab33 188 uint8_t ppcp[8];
be_bryan 0:b74591d5ab33 189
be_bryan 0:b74591d5ab33 190 uint8_t*& device_name_value() {
be_bryan 0:b74591d5ab33 191 return attributes[2].pValue;
be_bryan 0:b74591d5ab33 192 }
be_bryan 0:b74591d5ab33 193 } generic_access_service;
be_bryan 0:b74591d5ab33 194
be_bryan 0:b74591d5ab33 195 struct {
be_bryan 0:b74591d5ab33 196 attsGroup_t service;
be_bryan 0:b74591d5ab33 197 attsAttr_t attributes[4];
be_bryan 0:b74591d5ab33 198 uint8_t service_changed_declaration[5];
be_bryan 0:b74591d5ab33 199 } generic_attribute_service;
be_bryan 0:b74591d5ab33 200
be_bryan 0:b74591d5ab33 201 internal_service_t* registered_service;
be_bryan 0:b74591d5ab33 202 alloc_block_t* allocated_blocks;
be_bryan 0:b74591d5ab33 203
be_bryan 0:b74591d5ab33 204 uint16_t currentHandle;
be_bryan 0:b74591d5ab33 205
be_bryan 0:b74591d5ab33 206 private:
be_bryan 0:b74591d5ab33 207 GattServer();
be_bryan 0:b74591d5ab33 208
be_bryan 0:b74591d5ab33 209 GattServer(const GattServer &);
be_bryan 0:b74591d5ab33 210 const GattServer& operator=(const GattServer &);
be_bryan 0:b74591d5ab33 211 };
be_bryan 0:b74591d5ab33 212
be_bryan 0:b74591d5ab33 213 } // namespace cordio
be_bryan 0:b74591d5ab33 214 } // namespace vendor
be_bryan 0:b74591d5ab33 215 } // namespace ble
be_bryan 0:b74591d5ab33 216
be_bryan 0:b74591d5ab33 217 #endif /* CORDIO_GATT_SERVER_H_ */