1

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Thu Jul 02 09:08:45 2015 +0100
Revision:
367:baa35c3860e6
Parent:
362:6fa0d4d555f6
Child:
368:c272fec04dab
Synchronized with git rev 1682fb09
Author: Rohit Grover
fixes #20: addService initializes value attribute handles correctly. Previously these were getting confused with characteristicIndex.
Event handlers also return attribute handles correctly now; they were also previously returning characteristic indices.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rohit Grover 22:c6ee8136847e 1 /* mbed Microcontroller Library
Rohit Grover 22:c6ee8136847e 2 * Copyright (c) 2006-2013 ARM Limited
Rohit Grover 22:c6ee8136847e 3 *
Rohit Grover 22:c6ee8136847e 4 * Licensed under the Apache License, Version 2.0 (the "License");
Rohit Grover 22:c6ee8136847e 5 * you may not use this file except in compliance with the License.
Rohit Grover 22:c6ee8136847e 6 * You may obtain a copy of the License at
Rohit Grover 22:c6ee8136847e 7 *
Rohit Grover 22:c6ee8136847e 8 * http://www.apache.org/licenses/LICENSE-2.0
Rohit Grover 22:c6ee8136847e 9 *
Rohit Grover 22:c6ee8136847e 10 * Unless required by applicable law or agreed to in writing, software
Rohit Grover 22:c6ee8136847e 11 * distributed under the License is distributed on an "AS IS" BASIS,
Rohit Grover 22:c6ee8136847e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Rohit Grover 22:c6ee8136847e 13 * See the License for the specific language governing permissions and
Rohit Grover 22:c6ee8136847e 14 * limitations under the License.
Rohit Grover 22:c6ee8136847e 15 */
Rohit Grover 22:c6ee8136847e 16
Rohit Grover 22:c6ee8136847e 17 #ifndef __NRF51822_GATT_SERVER_H__
Rohit Grover 22:c6ee8136847e 18 #define __NRF51822_GATT_SERVER_H__
Rohit Grover 22:c6ee8136847e 19
rgrover1 76:ce629a504851 20 #include <stddef.h>
rgrover1 76:ce629a504851 21
rgrover1 362:6fa0d4d555f6 22 #include "ble/blecommon.h"
Rohit Grover 22:c6ee8136847e 23 #include "ble.h" /* nordic ble */
rgrover1 362:6fa0d4d555f6 24 #include "ble/Gap.h"
rgrover1 362:6fa0d4d555f6 25 #include "ble/GattServer.h"
Rohit Grover 22:c6ee8136847e 26
Rohit Grover 22:c6ee8136847e 27 class nRF51GattServer : public GattServer
Rohit Grover 22:c6ee8136847e 28 {
Rohit Grover 22:c6ee8136847e 29 public:
rgrover1 180:5082f66bb16e 30 static nRF51GattServer &getInstance();
Rohit Grover 22:c6ee8136847e 31
Rohit Grover 22:c6ee8136847e 32 /* Functions that must be implemented from GattServer */
Rohit Grover 22:c6ee8136847e 33 virtual ble_error_t addService(GattService &);
rgrover1 362:6fa0d4d555f6 34 virtual ble_error_t read(GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP);
rgrover1 362:6fa0d4d555f6 35 virtual ble_error_t read(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP);
rgrover1 362:6fa0d4d555f6 36 virtual ble_error_t write(GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly = false);
rgrover1 362:6fa0d4d555f6 37 virtual ble_error_t write(Gap::Handle_t connectionHandle, GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly = false);
Rohit Grover 22:c6ee8136847e 38
Rohit Grover 22:c6ee8136847e 39 /* nRF51 Functions */
Rohit Grover 22:c6ee8136847e 40 void eventCallback(void);
Rohit Grover 22:c6ee8136847e 41 void hwCallback(ble_evt_t *p_ble_evt);
Rohit Grover 22:c6ee8136847e 42
Rohit Grover 22:c6ee8136847e 43 private:
rgrover1 184:d51fa0c27bbb 44 const static unsigned BLE_TOTAL_CHARACTERISTICS = 20;
rgrover1 184:d51fa0c27bbb 45 const static unsigned BLE_TOTAL_DESCRIPTORS = 8;
rgrover1 75:95d732949d23 46
rgrover1 367:baa35c3860e6 47 private:
rgrover1 367:baa35c3860e6 48 /**
rgrover1 367:baa35c3860e6 49 * resolve a value attribute to its owning characteristic.
rgrover1 367:baa35c3860e6 50 * @param valueHandle the value handle to be resolved.
rgrover1 367:baa35c3860e6 51 * @return characteristic index if a resolution is found, else -1.
rgrover1 367:baa35c3860e6 52 */
rgrover1 367:baa35c3860e6 53 int resolveValueHandleToCharIndex(GattAttribute::Handle_t valueHandle) {
rgrover1 367:baa35c3860e6 54 unsigned charIndex;
rgrover1 367:baa35c3860e6 55 for (charIndex = 0; charIndex < characteristicCount; charIndex++) {
rgrover1 367:baa35c3860e6 56 if (nrfCharacteristicHandles[charIndex].value_handle == valueHandle) {
rgrover1 367:baa35c3860e6 57 return charIndex;
rgrover1 367:baa35c3860e6 58 }
rgrover1 367:baa35c3860e6 59 }
rgrover1 367:baa35c3860e6 60
rgrover1 367:baa35c3860e6 61 return -1;
rgrover1 367:baa35c3860e6 62 }
rgrover1 367:baa35c3860e6 63
rgrover1 367:baa35c3860e6 64 /**
rgrover1 367:baa35c3860e6 65 * resolve a CCCD attribute handle to its owning characteristic.
rgrover1 367:baa35c3860e6 66 * @param cccdHandle the CCCD handle to be resolved.
rgrover1 367:baa35c3860e6 67 * @return characteristic index if a resolution is found, else -1.
rgrover1 367:baa35c3860e6 68 */
rgrover1 367:baa35c3860e6 69 int resolveCCCDHandleToCharIndex(GattAttribute::Handle_t cccdHandle) {
rgrover1 367:baa35c3860e6 70 unsigned charIndex;
rgrover1 367:baa35c3860e6 71 for (charIndex = 0; charIndex < characteristicCount; charIndex++) {
rgrover1 367:baa35c3860e6 72 if (nrfCharacteristicHandles[charIndex].cccd_handle == cccdHandle) {
rgrover1 367:baa35c3860e6 73 return charIndex;
rgrover1 367:baa35c3860e6 74 }
rgrover1 367:baa35c3860e6 75 }
rgrover1 367:baa35c3860e6 76
rgrover1 367:baa35c3860e6 77 return -1;
rgrover1 367:baa35c3860e6 78 }
rgrover1 367:baa35c3860e6 79
rgrover1 367:baa35c3860e6 80 private:
rgrover1 74:d453d7969553 81 GattCharacteristic *p_characteristics[BLE_TOTAL_CHARACTERISTICS];
rgrover1 74:d453d7969553 82 ble_gatts_char_handles_t nrfCharacteristicHandles[BLE_TOTAL_CHARACTERISTICS];
rgrover1 74:d453d7969553 83 GattAttribute *p_descriptors[BLE_TOTAL_DESCRIPTORS];
rgrover1 74:d453d7969553 84 uint8_t descriptorCount;
rgrover1 74:d453d7969553 85 uint16_t nrfDescriptorHandles[BLE_TOTAL_DESCRIPTORS];
Rohit Grover 22:c6ee8136847e 86
rgrover1 72:46db8d5c65d1 87 nRF51GattServer() : GattServer(), p_characteristics(), nrfCharacteristicHandles(), p_descriptors(), descriptorCount(0), nrfDescriptorHandles() {
rgrover1 72:46db8d5c65d1 88 /* empty */
rgrover1 72:46db8d5c65d1 89 }
rgrover1 71:f11b3e313843 90
rgrover1 71:f11b3e313843 91 private:
rgrover1 71:f11b3e313843 92 nRF51GattServer(const nRF51GattServer &);
rgrover1 71:f11b3e313843 93 const nRF51GattServer& operator=(const nRF51GattServer &);
Rohit Grover 22:c6ee8136847e 94 };
Rohit Grover 22:c6ee8136847e 95
rgrover1 74:d453d7969553 96 #endif // ifndef __NRF51822_GATT_SERVER_H__