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_PAL_ATT_CLIENT_
be_bryan 0:b74591d5ab33 18 #define CORDIO_PAL_ATT_CLIENT_
be_bryan 0:b74591d5ab33 19
be_bryan 0:b74591d5ab33 20 #include "ble/pal/AttClient.h"
be_bryan 0:b74591d5ab33 21 #include "ble/pal/SimpleAttServerMessage.h"
be_bryan 0:b74591d5ab33 22 #include "att_api.h"
be_bryan 0:b74591d5ab33 23 #include "att_defs.h"
be_bryan 0:b74591d5ab33 24
be_bryan 0:b74591d5ab33 25 namespace ble {
be_bryan 0:b74591d5ab33 26 namespace pal {
be_bryan 0:b74591d5ab33 27 namespace vendor {
be_bryan 0:b74591d5ab33 28 namespace cordio {
be_bryan 0:b74591d5ab33 29
be_bryan 0:b74591d5ab33 30 class CordioAttClient : public ::ble::pal::AttClient {
be_bryan 0:b74591d5ab33 31
be_bryan 0:b74591d5ab33 32 public:
be_bryan 0:b74591d5ab33 33 CordioAttClient() : ::ble::pal::AttClient() { }
be_bryan 0:b74591d5ab33 34 virtual ~CordioAttClient() { }
be_bryan 0:b74591d5ab33 35
be_bryan 0:b74591d5ab33 36 /**
be_bryan 0:b74591d5ab33 37 * @see ble::pal::AttClient::exchange_mtu_request
be_bryan 0:b74591d5ab33 38 */
be_bryan 0:b74591d5ab33 39 virtual ble_error_t exchange_mtu_request(connection_handle_t connection)
be_bryan 0:b74591d5ab33 40 {
be_bryan 0:b74591d5ab33 41 AttcMtuReq(connection, pAttCfg->mtu);
be_bryan 0:b74591d5ab33 42 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 43 }
be_bryan 0:b74591d5ab33 44
be_bryan 0:b74591d5ab33 45 /**
be_bryan 0:b74591d5ab33 46 * @see ble::pal::GattClient::get_mtu_size
be_bryan 0:b74591d5ab33 47 */
be_bryan 0:b74591d5ab33 48 virtual ble_error_t get_mtu_size(
be_bryan 0:b74591d5ab33 49 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 50 uint16_t& mtu_size
be_bryan 0:b74591d5ab33 51 ) {
be_bryan 0:b74591d5ab33 52 mtu_size = AttGetMtu(connection_handle);
be_bryan 0:b74591d5ab33 53 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 54 }
be_bryan 0:b74591d5ab33 55
be_bryan 0:b74591d5ab33 56 /**
be_bryan 0:b74591d5ab33 57 * @see ble::pal::AttClient::find_information_request
be_bryan 0:b74591d5ab33 58 */
be_bryan 0:b74591d5ab33 59 virtual ble_error_t find_information_request(
be_bryan 0:b74591d5ab33 60 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 61 attribute_handle_range_t discovery_range
be_bryan 0:b74591d5ab33 62 ) {
be_bryan 0:b74591d5ab33 63 AttcFindInfoReq(
be_bryan 0:b74591d5ab33 64 connection_handle,
be_bryan 0:b74591d5ab33 65 discovery_range.begin,
be_bryan 0:b74591d5ab33 66 discovery_range.end,
be_bryan 0:b74591d5ab33 67 false
be_bryan 0:b74591d5ab33 68 );
be_bryan 0:b74591d5ab33 69 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 70 }
be_bryan 0:b74591d5ab33 71
be_bryan 0:b74591d5ab33 72 /**
be_bryan 0:b74591d5ab33 73 * @see ble::pal::AttClient::find_by_type_value_request
be_bryan 0:b74591d5ab33 74 */
be_bryan 0:b74591d5ab33 75 virtual ble_error_t find_by_type_value_request(
be_bryan 0:b74591d5ab33 76 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 77 attribute_handle_range_t discovery_range,
be_bryan 0:b74591d5ab33 78 uint16_t type,
be_bryan 0:b74591d5ab33 79 const ArrayView<const uint8_t>& value
be_bryan 0:b74591d5ab33 80 ) {
be_bryan 0:b74591d5ab33 81 AttcFindByTypeValueReq(
be_bryan 0:b74591d5ab33 82 connection_handle,
be_bryan 0:b74591d5ab33 83 discovery_range.begin,
be_bryan 0:b74591d5ab33 84 discovery_range.end,
be_bryan 0:b74591d5ab33 85 type,
be_bryan 0:b74591d5ab33 86 value.size(),
be_bryan 0:b74591d5ab33 87 const_cast<uint8_t*>(value.data()),
be_bryan 0:b74591d5ab33 88 false
be_bryan 0:b74591d5ab33 89 );
be_bryan 0:b74591d5ab33 90 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 91 }
be_bryan 0:b74591d5ab33 92
be_bryan 0:b74591d5ab33 93 /**
be_bryan 0:b74591d5ab33 94 * @see ble::pal::AttClient::read_by_type_request
be_bryan 0:b74591d5ab33 95 */
be_bryan 0:b74591d5ab33 96 virtual ble_error_t read_by_type_request(
be_bryan 0:b74591d5ab33 97 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 98 attribute_handle_range_t read_range,
be_bryan 0:b74591d5ab33 99 const UUID& type
be_bryan 0:b74591d5ab33 100 ) {
be_bryan 0:b74591d5ab33 101 AttcReadByTypeReq(
be_bryan 0:b74591d5ab33 102 connection_handle,
be_bryan 0:b74591d5ab33 103 read_range.begin,
be_bryan 0:b74591d5ab33 104 read_range.end,
be_bryan 0:b74591d5ab33 105 type.getLen(),
be_bryan 0:b74591d5ab33 106 const_cast<uint8_t*>(type.getBaseUUID()),
be_bryan 0:b74591d5ab33 107 false
be_bryan 0:b74591d5ab33 108 );
be_bryan 0:b74591d5ab33 109 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 110 }
be_bryan 0:b74591d5ab33 111
be_bryan 0:b74591d5ab33 112 /**
be_bryan 0:b74591d5ab33 113 * @see ble::pal::AttClient::read_request
be_bryan 0:b74591d5ab33 114 */
be_bryan 0:b74591d5ab33 115 virtual ble_error_t read_request(
be_bryan 0:b74591d5ab33 116 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 117 attribute_handle_t attribute_handle
be_bryan 0:b74591d5ab33 118 ) {
be_bryan 0:b74591d5ab33 119 AttcReadReq(connection_handle, attribute_handle);
be_bryan 0:b74591d5ab33 120 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 121 }
be_bryan 0:b74591d5ab33 122
be_bryan 0:b74591d5ab33 123 /**
be_bryan 0:b74591d5ab33 124 * @see ble::pal::AttClient::read_blob_request
be_bryan 0:b74591d5ab33 125 */
be_bryan 0:b74591d5ab33 126 virtual ble_error_t read_blob_request(
be_bryan 0:b74591d5ab33 127 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 128 attribute_handle_t attribute_handle,
be_bryan 0:b74591d5ab33 129 uint16_t offset
be_bryan 0:b74591d5ab33 130 ) {
be_bryan 0:b74591d5ab33 131 AttcReadLongReq(
be_bryan 0:b74591d5ab33 132 connection_handle,
be_bryan 0:b74591d5ab33 133 attribute_handle,
be_bryan 0:b74591d5ab33 134 offset,
be_bryan 0:b74591d5ab33 135 false
be_bryan 0:b74591d5ab33 136 );
be_bryan 0:b74591d5ab33 137 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 138 }
be_bryan 0:b74591d5ab33 139
be_bryan 0:b74591d5ab33 140 /**
be_bryan 0:b74591d5ab33 141 * @see ble::pal::AttClient::read_multiple_request
be_bryan 0:b74591d5ab33 142 */
be_bryan 0:b74591d5ab33 143 virtual ble_error_t read_multiple_request(
be_bryan 0:b74591d5ab33 144 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 145 const ArrayView<const attribute_handle_t>& attribute_handles
be_bryan 0:b74591d5ab33 146 ) {
be_bryan 0:b74591d5ab33 147 AttcReadMultipleReq(
be_bryan 0:b74591d5ab33 148 connection_handle,
be_bryan 0:b74591d5ab33 149 attribute_handles.size(),
be_bryan 0:b74591d5ab33 150 const_cast<uint16_t*>(attribute_handles.data())
be_bryan 0:b74591d5ab33 151 );
be_bryan 0:b74591d5ab33 152 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 153 }
be_bryan 0:b74591d5ab33 154
be_bryan 0:b74591d5ab33 155 /**
be_bryan 0:b74591d5ab33 156 * @see ble::pal::AttClient::read_by_group_type_request
be_bryan 0:b74591d5ab33 157 */
be_bryan 0:b74591d5ab33 158 virtual ble_error_t read_by_group_type_request(
be_bryan 0:b74591d5ab33 159 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 160 attribute_handle_range_t read_range,
be_bryan 0:b74591d5ab33 161 const UUID& group_type
be_bryan 0:b74591d5ab33 162 ) {
be_bryan 0:b74591d5ab33 163 AttcReadByGroupTypeReq(
be_bryan 0:b74591d5ab33 164 connection_handle,
be_bryan 0:b74591d5ab33 165 read_range.begin,
be_bryan 0:b74591d5ab33 166 read_range.end,
be_bryan 0:b74591d5ab33 167 group_type.getLen(),
be_bryan 0:b74591d5ab33 168 const_cast<uint8_t*>(group_type.getBaseUUID()),
be_bryan 0:b74591d5ab33 169 false
be_bryan 0:b74591d5ab33 170 );
be_bryan 0:b74591d5ab33 171 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 172 }
be_bryan 0:b74591d5ab33 173
be_bryan 0:b74591d5ab33 174 /**
be_bryan 0:b74591d5ab33 175 * @see ble::pal::AttClient::write_request
be_bryan 0:b74591d5ab33 176 */
be_bryan 0:b74591d5ab33 177 virtual ble_error_t write_request(
be_bryan 0:b74591d5ab33 178 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 179 attribute_handle_t attribute_handle,
be_bryan 0:b74591d5ab33 180 const ArrayView<const uint8_t>& value
be_bryan 0:b74591d5ab33 181 ) {
be_bryan 0:b74591d5ab33 182 AttcWriteReq(
be_bryan 0:b74591d5ab33 183 connection_handle,
be_bryan 0:b74591d5ab33 184 attribute_handle,
be_bryan 0:b74591d5ab33 185 value.size(),
be_bryan 0:b74591d5ab33 186 const_cast<uint8_t*>(value.data())
be_bryan 0:b74591d5ab33 187 );
be_bryan 0:b74591d5ab33 188 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 189 }
be_bryan 0:b74591d5ab33 190
be_bryan 0:b74591d5ab33 191 /**
be_bryan 0:b74591d5ab33 192 * @see ble::pal::AttClient::write_command
be_bryan 0:b74591d5ab33 193 */
be_bryan 0:b74591d5ab33 194 virtual ble_error_t write_command(
be_bryan 0:b74591d5ab33 195 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 196 attribute_handle_t attribute_handle,
be_bryan 0:b74591d5ab33 197 const ArrayView<const uint8_t>& value
be_bryan 0:b74591d5ab33 198 ) {
be_bryan 0:b74591d5ab33 199 AttcWriteCmd(
be_bryan 0:b74591d5ab33 200 connection_handle,
be_bryan 0:b74591d5ab33 201 attribute_handle,
be_bryan 0:b74591d5ab33 202 value.size(),
be_bryan 0:b74591d5ab33 203 const_cast<uint8_t*>(value.data())
be_bryan 0:b74591d5ab33 204 );
be_bryan 0:b74591d5ab33 205 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 206 }
be_bryan 0:b74591d5ab33 207
be_bryan 0:b74591d5ab33 208 /**
be_bryan 0:b74591d5ab33 209 * @see ble::pal::AttClient::signed_write_command
be_bryan 0:b74591d5ab33 210 */
be_bryan 0:b74591d5ab33 211 virtual ble_error_t signed_write_command(
be_bryan 0:b74591d5ab33 212 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 213 attribute_handle_t attribute_handle,
be_bryan 0:b74591d5ab33 214 const ArrayView<const uint8_t>& value
be_bryan 0:b74591d5ab33 215 ) {
be_bryan 0:b74591d5ab33 216 AttcSignedWriteCmd(
be_bryan 0:b74591d5ab33 217 connection_handle,
be_bryan 0:b74591d5ab33 218 attribute_handle,
be_bryan 0:b74591d5ab33 219 /* sign counter from flash or AttsGetSignCounter() ? */ 0,
be_bryan 0:b74591d5ab33 220 value.size(),
be_bryan 0:b74591d5ab33 221 const_cast<uint8_t*>(value.data())
be_bryan 0:b74591d5ab33 222 );
be_bryan 0:b74591d5ab33 223 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 224 }
be_bryan 0:b74591d5ab33 225
be_bryan 0:b74591d5ab33 226 /**
be_bryan 0:b74591d5ab33 227 * @see ble::pal::AttClient::prepare_write_request
be_bryan 0:b74591d5ab33 228 */
be_bryan 0:b74591d5ab33 229 virtual ble_error_t prepare_write_request(
be_bryan 0:b74591d5ab33 230 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 231 attribute_handle_t attribute_handle,
be_bryan 0:b74591d5ab33 232 uint16_t offset,
be_bryan 0:b74591d5ab33 233 const ArrayView<const uint8_t>& value
be_bryan 0:b74591d5ab33 234 ) {
be_bryan 0:b74591d5ab33 235 AttcPrepareWriteReq(
be_bryan 0:b74591d5ab33 236 connection_handle,
be_bryan 0:b74591d5ab33 237 attribute_handle,
be_bryan 0:b74591d5ab33 238 offset,
be_bryan 0:b74591d5ab33 239 value.size(),
be_bryan 0:b74591d5ab33 240 const_cast<uint8_t*>(value.data()),
be_bryan 0:b74591d5ab33 241 false,
be_bryan 0:b74591d5ab33 242 false
be_bryan 0:b74591d5ab33 243 );
be_bryan 0:b74591d5ab33 244 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 245 }
be_bryan 0:b74591d5ab33 246
be_bryan 0:b74591d5ab33 247 /**
be_bryan 0:b74591d5ab33 248 * @see ble::pal::AttClient::execute_write_request
be_bryan 0:b74591d5ab33 249 */
be_bryan 0:b74591d5ab33 250 virtual ble_error_t execute_write_request(
be_bryan 0:b74591d5ab33 251 connection_handle_t connection_handle,
be_bryan 0:b74591d5ab33 252 bool execute
be_bryan 0:b74591d5ab33 253 ) {
be_bryan 0:b74591d5ab33 254 AttcExecuteWriteReq(
be_bryan 0:b74591d5ab33 255 connection_handle,
be_bryan 0:b74591d5ab33 256 execute
be_bryan 0:b74591d5ab33 257 );
be_bryan 0:b74591d5ab33 258 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 259 }
be_bryan 0:b74591d5ab33 260
be_bryan 0:b74591d5ab33 261 /**
be_bryan 0:b74591d5ab33 262 * @see ble::pal::AttClient::initialize
be_bryan 0:b74591d5ab33 263 */
be_bryan 0:b74591d5ab33 264 virtual ble_error_t initialize()
be_bryan 0:b74591d5ab33 265 {
be_bryan 0:b74591d5ab33 266 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 267 }
be_bryan 0:b74591d5ab33 268
be_bryan 0:b74591d5ab33 269 /**
be_bryan 0:b74591d5ab33 270 * @see ble::pal::AttClient::terminate
be_bryan 0:b74591d5ab33 271 */
be_bryan 0:b74591d5ab33 272 virtual ble_error_t terminate()
be_bryan 0:b74591d5ab33 273 {
be_bryan 0:b74591d5ab33 274 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 275 }
be_bryan 0:b74591d5ab33 276
be_bryan 0:b74591d5ab33 277 // singleton of the ARM Cordio client
be_bryan 0:b74591d5ab33 278 static CordioAttClient& get_client()
be_bryan 0:b74591d5ab33 279 {
be_bryan 0:b74591d5ab33 280 static CordioAttClient _client;
be_bryan 0:b74591d5ab33 281 return _client;
be_bryan 0:b74591d5ab33 282 }
be_bryan 0:b74591d5ab33 283
be_bryan 0:b74591d5ab33 284 private:
be_bryan 0:b74591d5ab33 285 // convert an array of byte to an uint16_t
be_bryan 0:b74591d5ab33 286 static uint16_t to_uint16_t(const uint8_t* array)
be_bryan 0:b74591d5ab33 287 {
be_bryan 0:b74591d5ab33 288 uint16_t result;
be_bryan 0:b74591d5ab33 289 memcpy(&result, array, sizeof(result));
be_bryan 0:b74591d5ab33 290 return result;
be_bryan 0:b74591d5ab33 291 }
be_bryan 0:b74591d5ab33 292
be_bryan 0:b74591d5ab33 293 /**
be_bryan 0:b74591d5ab33 294 * Type of an event handler.
be_bryan 0:b74591d5ab33 295 * @param The event to handle
be_bryan 0:b74591d5ab33 296 * @return true if the event has been handled and false otherwise.
be_bryan 0:b74591d5ab33 297 */
be_bryan 0:b74591d5ab33 298 typedef bool (*event_handler_t)(const attEvt_t*);
be_bryan 0:b74591d5ab33 299
be_bryan 0:b74591d5ab33 300 public:
be_bryan 0:b74591d5ab33 301 /**
be_bryan 0:b74591d5ab33 302 * Callback which handle attEvt_t and forward them to on_server_event.
be_bryan 0:b74591d5ab33 303 */
be_bryan 0:b74591d5ab33 304 static void att_client_handler(const attEvt_t* event)
be_bryan 0:b74591d5ab33 305 {
be_bryan 0:b74591d5ab33 306 // all handlers are stored in a static array
be_bryan 0:b74591d5ab33 307 static const event_handler_t handlers[] = {
be_bryan 0:b74591d5ab33 308 &timeout_event_handler,
be_bryan 0:b74591d5ab33 309 &event_handler<ErrorResponseConverter>,
be_bryan 0:b74591d5ab33 310 &event_handler<ExchangeMtuResponseConverter>,
be_bryan 0:b74591d5ab33 311 &event_handler<FindInformationResponseConverter>,
be_bryan 0:b74591d5ab33 312 &event_handler<FindByTypeValueResponseConverter>,
be_bryan 0:b74591d5ab33 313 &event_handler<ReadByTypeResponseConverter>,
be_bryan 0:b74591d5ab33 314 &event_handler<ReadResponseConverter>,
be_bryan 0:b74591d5ab33 315 &event_handler<ReadBlobResponseConverter>,
be_bryan 0:b74591d5ab33 316 &event_handler<ReadMultipleResponseConverter>,
be_bryan 0:b74591d5ab33 317 &event_handler<ReadBygroupTypeResponseConverter>,
be_bryan 0:b74591d5ab33 318 &event_handler<WriteResponseConverter>,
be_bryan 0:b74591d5ab33 319 &event_handler<PrepareWriteResponseConverter>,
be_bryan 0:b74591d5ab33 320 &event_handler<ExecuteWriteResponseConverter>,
be_bryan 0:b74591d5ab33 321 &event_handler<HandleValueIndicationConverter>,
be_bryan 0:b74591d5ab33 322 &event_handler<HandleValueNotificationConverter>
be_bryan 0:b74591d5ab33 323 };
be_bryan 0:b74591d5ab33 324
be_bryan 0:b74591d5ab33 325 // event->hdr.param: connection handle
be_bryan 0:b74591d5ab33 326 // event->header.event: opcode from the request
be_bryan 0:b74591d5ab33 327 // event->header.status: success or error code ...
be_bryan 0:b74591d5ab33 328 // event->pValue: starting after opcode for response; starting after opcode + handle for server initiated responses.
be_bryan 0:b74591d5ab33 329 // event->handle: handle for server initiated responses
be_bryan 0:b74591d5ab33 330
be_bryan 0:b74591d5ab33 331 // traverse all handlers and execute them with the event in input.
be_bryan 0:b74591d5ab33 332 // exit if an handler has handled the event.
be_bryan 0:b74591d5ab33 333 for(size_t i = 0; i < (sizeof(handlers)/sizeof(handlers[0])); ++i) {
be_bryan 0:b74591d5ab33 334 if (handlers[i](event)) {
be_bryan 0:b74591d5ab33 335 return;
be_bryan 0:b74591d5ab33 336 }
be_bryan 0:b74591d5ab33 337 }
be_bryan 0:b74591d5ab33 338 }
be_bryan 0:b74591d5ab33 339
be_bryan 0:b74591d5ab33 340 private:
be_bryan 0:b74591d5ab33 341 /**
be_bryan 0:b74591d5ab33 342 * Event handler generator.
be_bryan 0:b74591d5ab33 343 * @tparam Description of an event converter. It contains two static member
be_bryan 0:b74591d5ab33 344 * function:
be_bryan 0:b74591d5ab33 345 * - bool can_convert(const attEvt_t* event): return true if the event can
be_bryan 0:b74591d5ab33 346 * be converted by the converter
be_bryan 0:b74591d5ab33 347 * - <undefined> convert(const attEvt_t* event): return the
be_bryan 0:b74591d5ab33 348 * AttServerMessage converted from event.
be_bryan 0:b74591d5ab33 349 * @param event
be_bryan 0:b74591d5ab33 350 * @return
be_bryan 0:b74591d5ab33 351 */
be_bryan 0:b74591d5ab33 352 template<typename T>
be_bryan 0:b74591d5ab33 353 static bool event_handler(const attEvt_t* event)
be_bryan 0:b74591d5ab33 354 {
be_bryan 0:b74591d5ab33 355 if (T::can_convert(event)) {
be_bryan 0:b74591d5ab33 356 generated_handler(event, T::convert);
be_bryan 0:b74591d5ab33 357 return true;
be_bryan 0:b74591d5ab33 358 }
be_bryan 0:b74591d5ab33 359 return false;
be_bryan 0:b74591d5ab33 360 }
be_bryan 0:b74591d5ab33 361
be_bryan 0:b74591d5ab33 362 static bool timeout_event_handler(const attEvt_t* event)
be_bryan 0:b74591d5ab33 363 {
be_bryan 0:b74591d5ab33 364 if(event->hdr.status != ATT_ERR_TIMEOUT) {
be_bryan 0:b74591d5ab33 365 return false;
be_bryan 0:b74591d5ab33 366 }
be_bryan 0:b74591d5ab33 367
be_bryan 0:b74591d5ab33 368 get_client().on_transaction_timeout(event->hdr.param);
be_bryan 0:b74591d5ab33 369 return true;
be_bryan 0:b74591d5ab33 370 }
be_bryan 0:b74591d5ab33 371
be_bryan 0:b74591d5ab33 372 template<typename ResultType>
be_bryan 0:b74591d5ab33 373 static void generated_handler(
be_bryan 0:b74591d5ab33 374 const attEvt_t* event, ResultType (*convert)(const attEvt_t*)
be_bryan 0:b74591d5ab33 375 ) {
be_bryan 0:b74591d5ab33 376 get_client().on_server_event(
be_bryan 0:b74591d5ab33 377 event->hdr.param,
be_bryan 0:b74591d5ab33 378 convert(event)
be_bryan 0:b74591d5ab33 379 );
be_bryan 0:b74591d5ab33 380 }
be_bryan 0:b74591d5ab33 381
be_bryan 0:b74591d5ab33 382 /**
be_bryan 0:b74591d5ab33 383 * Traits defining can_convert for non ErrorResponse events.
be_bryan 0:b74591d5ab33 384 */
be_bryan 0:b74591d5ab33 385 template<uint8_t RequestID>
be_bryan 0:b74591d5ab33 386 struct ResponseConverter {
be_bryan 0:b74591d5ab33 387 static bool can_convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 388 {
be_bryan 0:b74591d5ab33 389 if(event->hdr.status == ATT_SUCCESS && event->hdr.event == RequestID) {
be_bryan 0:b74591d5ab33 390 return true;
be_bryan 0:b74591d5ab33 391 }
be_bryan 0:b74591d5ab33 392 return false;
be_bryan 0:b74591d5ab33 393 }
be_bryan 0:b74591d5ab33 394 };
be_bryan 0:b74591d5ab33 395
be_bryan 0:b74591d5ab33 396 /**
be_bryan 0:b74591d5ab33 397 * Converter for an AttErrorResponse.
be_bryan 0:b74591d5ab33 398 */
be_bryan 0:b74591d5ab33 399 struct ErrorResponseConverter {
be_bryan 0:b74591d5ab33 400 static bool can_convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 401 {
be_bryan 0:b74591d5ab33 402 if(event->hdr.status != ATT_SUCCESS) {
be_bryan 0:b74591d5ab33 403 return true;
be_bryan 0:b74591d5ab33 404 }
be_bryan 0:b74591d5ab33 405 return false;
be_bryan 0:b74591d5ab33 406 }
be_bryan 0:b74591d5ab33 407
be_bryan 0:b74591d5ab33 408 static AttErrorResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 409 {
be_bryan 0:b74591d5ab33 410 return AttErrorResponse(
be_bryan 0:b74591d5ab33 411 static_cast<AttributeOpcode::Code>(event->hdr.event * 2),
be_bryan 0:b74591d5ab33 412 event->handle,
be_bryan 0:b74591d5ab33 413 event->hdr.status
be_bryan 0:b74591d5ab33 414 );
be_bryan 0:b74591d5ab33 415 }
be_bryan 0:b74591d5ab33 416 };
be_bryan 0:b74591d5ab33 417
be_bryan 0:b74591d5ab33 418 /**
be_bryan 0:b74591d5ab33 419 * Converter for an AttExchangeMTUResponse.
be_bryan 0:b74591d5ab33 420 */
be_bryan 0:b74591d5ab33 421 struct ExchangeMtuResponseConverter {
be_bryan 0:b74591d5ab33 422 static bool can_convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 423 {
be_bryan 0:b74591d5ab33 424 if(event->hdr.status == ATT_SUCCESS &&
be_bryan 0:b74591d5ab33 425 event->hdr.event == ATT_MTU_UPDATE_IND) {
be_bryan 0:b74591d5ab33 426 return true;
be_bryan 0:b74591d5ab33 427 }
be_bryan 0:b74591d5ab33 428 return false;
be_bryan 0:b74591d5ab33 429 }
be_bryan 0:b74591d5ab33 430
be_bryan 0:b74591d5ab33 431 static AttExchangeMTUResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 432 {
be_bryan 0:b74591d5ab33 433 return AttExchangeMTUResponse(event->mtu);
be_bryan 0:b74591d5ab33 434 }
be_bryan 0:b74591d5ab33 435 };
be_bryan 0:b74591d5ab33 436
be_bryan 0:b74591d5ab33 437 /**
be_bryan 0:b74591d5ab33 438 * Converter for a SimpleAttFindInformationResponse.
be_bryan 0:b74591d5ab33 439 */
be_bryan 0:b74591d5ab33 440 struct FindInformationResponseConverter : ResponseConverter<ATTC_FIND_INFO_RSP> {
be_bryan 0:b74591d5ab33 441 static SimpleAttFindInformationResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 442 {
be_bryan 0:b74591d5ab33 443 return SimpleAttFindInformationResponse(
be_bryan 0:b74591d5ab33 444 static_cast<SimpleAttFindInformationResponse::Format>(event->pValue[0]),
be_bryan 0:b74591d5ab33 445 make_const_ArrayView(
be_bryan 0:b74591d5ab33 446 event->pValue + 1,
be_bryan 0:b74591d5ab33 447 event->valueLen - 1
be_bryan 0:b74591d5ab33 448 )
be_bryan 0:b74591d5ab33 449 );
be_bryan 0:b74591d5ab33 450 }
be_bryan 0:b74591d5ab33 451 };
be_bryan 0:b74591d5ab33 452
be_bryan 0:b74591d5ab33 453 /**
be_bryan 0:b74591d5ab33 454 * Converter for a SimpleAttFindByTypeValueResponse.
be_bryan 0:b74591d5ab33 455 */
be_bryan 0:b74591d5ab33 456 struct FindByTypeValueResponseConverter : ResponseConverter<ATTC_FIND_BY_TYPE_VALUE_RSP> {
be_bryan 0:b74591d5ab33 457 static SimpleAttFindByTypeValueResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 458 {
be_bryan 0:b74591d5ab33 459 return SimpleAttFindByTypeValueResponse(
be_bryan 0:b74591d5ab33 460 make_const_ArrayView(
be_bryan 0:b74591d5ab33 461 event->pValue,
be_bryan 0:b74591d5ab33 462 event->valueLen
be_bryan 0:b74591d5ab33 463 )
be_bryan 0:b74591d5ab33 464 );
be_bryan 0:b74591d5ab33 465 }
be_bryan 0:b74591d5ab33 466 };
be_bryan 0:b74591d5ab33 467
be_bryan 0:b74591d5ab33 468 /**
be_bryan 0:b74591d5ab33 469 * Converter for a SimpleAttReadByTypeResponse.
be_bryan 0:b74591d5ab33 470 */
be_bryan 0:b74591d5ab33 471 struct ReadByTypeResponseConverter : ResponseConverter<ATTC_READ_BY_TYPE_RSP> {
be_bryan 0:b74591d5ab33 472 static SimpleAttReadByTypeResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 473 {
be_bryan 0:b74591d5ab33 474 return SimpleAttReadByTypeResponse(
be_bryan 0:b74591d5ab33 475 event->pValue[0],
be_bryan 0:b74591d5ab33 476 make_const_ArrayView(
be_bryan 0:b74591d5ab33 477 event->pValue + 1,
be_bryan 0:b74591d5ab33 478 event->valueLen - 1
be_bryan 0:b74591d5ab33 479 )
be_bryan 0:b74591d5ab33 480 );
be_bryan 0:b74591d5ab33 481 }
be_bryan 0:b74591d5ab33 482 };
be_bryan 0:b74591d5ab33 483
be_bryan 0:b74591d5ab33 484 /**
be_bryan 0:b74591d5ab33 485 * Converter for a AttReadResponse.
be_bryan 0:b74591d5ab33 486 */
be_bryan 0:b74591d5ab33 487 struct ReadResponseConverter : ResponseConverter<ATTC_READ_RSP> {
be_bryan 0:b74591d5ab33 488 static AttReadResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 489 {
be_bryan 0:b74591d5ab33 490 return AttReadResponse(
be_bryan 0:b74591d5ab33 491 make_const_ArrayView(
be_bryan 0:b74591d5ab33 492 event->pValue,
be_bryan 0:b74591d5ab33 493 event->valueLen
be_bryan 0:b74591d5ab33 494 )
be_bryan 0:b74591d5ab33 495 );
be_bryan 0:b74591d5ab33 496 }
be_bryan 0:b74591d5ab33 497 };
be_bryan 0:b74591d5ab33 498
be_bryan 0:b74591d5ab33 499 /**
be_bryan 0:b74591d5ab33 500 * Converter for a AttReadBlobResponse.
be_bryan 0:b74591d5ab33 501 */
be_bryan 0:b74591d5ab33 502 struct ReadBlobResponseConverter : ResponseConverter<ATTC_READ_LONG_RSP> {
be_bryan 0:b74591d5ab33 503 static AttReadBlobResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 504 {
be_bryan 0:b74591d5ab33 505 return AttReadBlobResponse(
be_bryan 0:b74591d5ab33 506 make_const_ArrayView(
be_bryan 0:b74591d5ab33 507 event->pValue,
be_bryan 0:b74591d5ab33 508 event->valueLen
be_bryan 0:b74591d5ab33 509 )
be_bryan 0:b74591d5ab33 510 );
be_bryan 0:b74591d5ab33 511 }
be_bryan 0:b74591d5ab33 512 };
be_bryan 0:b74591d5ab33 513
be_bryan 0:b74591d5ab33 514 /**
be_bryan 0:b74591d5ab33 515 * Converter for a AttReadMultipleResponse.
be_bryan 0:b74591d5ab33 516 */
be_bryan 0:b74591d5ab33 517 struct ReadMultipleResponseConverter : ResponseConverter<ATTC_READ_MULTIPLE_RSP> {
be_bryan 0:b74591d5ab33 518 static AttReadMultipleResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 519 {
be_bryan 0:b74591d5ab33 520 return AttReadMultipleResponse(
be_bryan 0:b74591d5ab33 521 make_const_ArrayView(
be_bryan 0:b74591d5ab33 522 event->pValue,
be_bryan 0:b74591d5ab33 523 event->valueLen
be_bryan 0:b74591d5ab33 524 )
be_bryan 0:b74591d5ab33 525 );
be_bryan 0:b74591d5ab33 526 }
be_bryan 0:b74591d5ab33 527 };
be_bryan 0:b74591d5ab33 528
be_bryan 0:b74591d5ab33 529 /**
be_bryan 0:b74591d5ab33 530 * Converter for a SimpleAttReadByGroupTypeResponse.
be_bryan 0:b74591d5ab33 531 */
be_bryan 0:b74591d5ab33 532 struct ReadBygroupTypeResponseConverter : ResponseConverter<ATTC_READ_BY_GROUP_TYPE_RSP> {
be_bryan 0:b74591d5ab33 533 static SimpleAttReadByGroupTypeResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 534 {
be_bryan 0:b74591d5ab33 535 return SimpleAttReadByGroupTypeResponse(
be_bryan 0:b74591d5ab33 536 event->pValue[0],
be_bryan 0:b74591d5ab33 537 make_const_ArrayView(
be_bryan 0:b74591d5ab33 538 event->pValue + 1,
be_bryan 0:b74591d5ab33 539 event->valueLen - 1
be_bryan 0:b74591d5ab33 540 )
be_bryan 0:b74591d5ab33 541 );
be_bryan 0:b74591d5ab33 542 }
be_bryan 0:b74591d5ab33 543 };
be_bryan 0:b74591d5ab33 544
be_bryan 0:b74591d5ab33 545 /**
be_bryan 0:b74591d5ab33 546 * Converter for a AttWriteResponse.
be_bryan 0:b74591d5ab33 547 */
be_bryan 0:b74591d5ab33 548 struct WriteResponseConverter : ResponseConverter<ATTC_WRITE_RSP> {
be_bryan 0:b74591d5ab33 549 static AttWriteResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 550 {
be_bryan 0:b74591d5ab33 551 return AttWriteResponse();
be_bryan 0:b74591d5ab33 552 }
be_bryan 0:b74591d5ab33 553 };
be_bryan 0:b74591d5ab33 554
be_bryan 0:b74591d5ab33 555 /**
be_bryan 0:b74591d5ab33 556 * Converter for a AttPrepareWriteResponse.
be_bryan 0:b74591d5ab33 557 */
be_bryan 0:b74591d5ab33 558 struct PrepareWriteResponseConverter : ResponseConverter<ATTC_PREPARE_WRITE_RSP> {
be_bryan 0:b74591d5ab33 559 static AttPrepareWriteResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 560 {
be_bryan 0:b74591d5ab33 561 // WARNING: Not sure if correct, the stack erase the length parameter
be_bryan 0:b74591d5ab33 562 return AttPrepareWriteResponse(
be_bryan 0:b74591d5ab33 563 event->handle,
be_bryan 0:b74591d5ab33 564 to_uint16_t(event->pValue + 2),
be_bryan 0:b74591d5ab33 565 // FIXME: the stack set the lenght to 0, the data won't be seen ...
be_bryan 0:b74591d5ab33 566 make_const_ArrayView(
be_bryan 0:b74591d5ab33 567 event->pValue + 4,
be_bryan 0:b74591d5ab33 568 event->valueLen
be_bryan 0:b74591d5ab33 569 )
be_bryan 0:b74591d5ab33 570 );
be_bryan 0:b74591d5ab33 571 }
be_bryan 0:b74591d5ab33 572 };
be_bryan 0:b74591d5ab33 573
be_bryan 0:b74591d5ab33 574 /**
be_bryan 0:b74591d5ab33 575 * Converter for a AttExecuteWriteResponse.
be_bryan 0:b74591d5ab33 576 */
be_bryan 0:b74591d5ab33 577 struct ExecuteWriteResponseConverter : ResponseConverter<ATTC_EXECUTE_WRITE_RSP> {
be_bryan 0:b74591d5ab33 578 static AttExecuteWriteResponse convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 579 {
be_bryan 0:b74591d5ab33 580 return AttExecuteWriteResponse();
be_bryan 0:b74591d5ab33 581 }
be_bryan 0:b74591d5ab33 582 };
be_bryan 0:b74591d5ab33 583
be_bryan 0:b74591d5ab33 584 /**
be_bryan 0:b74591d5ab33 585 * Converter for a AttHandleValueNotification.
be_bryan 0:b74591d5ab33 586 */
be_bryan 0:b74591d5ab33 587 struct HandleValueNotificationConverter : ResponseConverter<ATTC_HANDLE_VALUE_NTF> {
be_bryan 0:b74591d5ab33 588 static AttHandleValueNotification convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 589 {
be_bryan 0:b74591d5ab33 590 return AttHandleValueNotification(
be_bryan 0:b74591d5ab33 591 event->handle,
be_bryan 0:b74591d5ab33 592 make_const_ArrayView(
be_bryan 0:b74591d5ab33 593 event->pValue,
be_bryan 0:b74591d5ab33 594 event->valueLen
be_bryan 0:b74591d5ab33 595 )
be_bryan 0:b74591d5ab33 596 );
be_bryan 0:b74591d5ab33 597 }
be_bryan 0:b74591d5ab33 598 };
be_bryan 0:b74591d5ab33 599
be_bryan 0:b74591d5ab33 600 /**
be_bryan 0:b74591d5ab33 601 * Converter for a AttHandleValueIndication.
be_bryan 0:b74591d5ab33 602 */
be_bryan 0:b74591d5ab33 603 struct HandleValueIndicationConverter : ResponseConverter<ATTC_HANDLE_VALUE_IND> {
be_bryan 0:b74591d5ab33 604 static AttHandleValueIndication convert(const attEvt_t* event)
be_bryan 0:b74591d5ab33 605 {
be_bryan 0:b74591d5ab33 606 return AttHandleValueIndication(
be_bryan 0:b74591d5ab33 607 event->handle,
be_bryan 0:b74591d5ab33 608 make_const_ArrayView(
be_bryan 0:b74591d5ab33 609 event->pValue,
be_bryan 0:b74591d5ab33 610 event->valueLen
be_bryan 0:b74591d5ab33 611 )
be_bryan 0:b74591d5ab33 612 );
be_bryan 0:b74591d5ab33 613 }
be_bryan 0:b74591d5ab33 614 };
be_bryan 0:b74591d5ab33 615 };
be_bryan 0:b74591d5ab33 616
be_bryan 0:b74591d5ab33 617 } // cordio
be_bryan 0:b74591d5ab33 618 } // vendor
be_bryan 0:b74591d5ab33 619 } // pal
be_bryan 0:b74591d5ab33 620 } // ble
be_bryan 0:b74591d5ab33 621
be_bryan 0:b74591d5ab33 622 #endif /* CORDIO_PAL_ATT_CLIENT_ */