Microbug / BLE_API

Fork of BLE_API by Bluetooth Low Energy

Committer:
ktownsend
Date:
Fri Jan 17 14:25:29 2014 +0000
Revision:
30:9614522cf932
Parent:
29:011e95ce78b8
Added Gap and GattServer event definitions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ktownsend 29:011e95ce78b8 1 /* mbed Microcontroller Library
ktownsend 29:011e95ce78b8 2 * Copyright (c) 2006-2013 ARM Limited
ktownsend 29:011e95ce78b8 3 *
ktownsend 29:011e95ce78b8 4 * Licensed under the Apache License, Version 2.0 (the "License");
ktownsend 29:011e95ce78b8 5 * you may not use this file except in compliance with the License.
ktownsend 29:011e95ce78b8 6 * You may obtain a copy of the License at
ktownsend 29:011e95ce78b8 7 *
ktownsend 29:011e95ce78b8 8 * http://www.apache.org/licenses/LICENSE-2.0
ktownsend 29:011e95ce78b8 9 *
ktownsend 29:011e95ce78b8 10 * Unless required by applicable law or agreed to in writing, software
ktownsend 29:011e95ce78b8 11 * distributed under the License is distributed on an "AS IS" BASIS,
ktownsend 29:011e95ce78b8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ktownsend 29:011e95ce78b8 13 * See the License for the specific language governing permissions and
ktownsend 29:011e95ce78b8 14 * limitations under the License.
ktownsend 29:011e95ce78b8 15 */
ktownsend 29:011e95ce78b8 16
ktownsend 29:011e95ce78b8 17 #include "nRF51GattServer.h"
ktownsend 29:011e95ce78b8 18 #include "mbed.h"
ktownsend 29:011e95ce78b8 19
ktownsend 29:011e95ce78b8 20 /* ToDo: Convert to Singleton! */
ktownsend 29:011e95ce78b8 21
ktownsend 29:011e95ce78b8 22 /**************************************************************************/
ktownsend 29:011e95ce78b8 23 /*!
ktownsend 29:011e95ce78b8 24 @brief Constructor
ktownsend 29:011e95ce78b8 25 */
ktownsend 29:011e95ce78b8 26 /**************************************************************************/
ktownsend 29:011e95ce78b8 27 nRF51GattServer::nRF51GattServer(RawSerial &serial): GattServer(), uart(serial)
ktownsend 29:011e95ce78b8 28 {
ktownsend 29:011e95ce78b8 29 /* Reset the service and characteristic counters */
ktownsend 29:011e95ce78b8 30 serviceCount = 0;
ktownsend 29:011e95ce78b8 31 characteristicCount = 0;
ktownsend 29:011e95ce78b8 32 }
ktownsend 29:011e95ce78b8 33
ktownsend 29:011e95ce78b8 34 /**************************************************************************/
ktownsend 29:011e95ce78b8 35 /*!
ktownsend 29:011e95ce78b8 36 @brief Destructor
ktownsend 29:011e95ce78b8 37 */
ktownsend 29:011e95ce78b8 38 /**************************************************************************/
ktownsend 29:011e95ce78b8 39 nRF51GattServer::~nRF51GattServer(void)
ktownsend 29:011e95ce78b8 40 {
ktownsend 29:011e95ce78b8 41 }
ktownsend 29:011e95ce78b8 42
ktownsend 29:011e95ce78b8 43 /**************************************************************************/
ktownsend 29:011e95ce78b8 44 /*!
ktownsend 29:011e95ce78b8 45 @brief Adds a new service to the GATT table on the peripheral
ktownsend 29:011e95ce78b8 46
ktownsend 29:011e95ce78b8 47 @returns ble_error_t
ktownsend 29:011e95ce78b8 48
ktownsend 29:011e95ce78b8 49 @retval BLE_ERROR_NONE
ktownsend 29:011e95ce78b8 50 Everything executed properly
ktownsend 29:011e95ce78b8 51
ktownsend 29:011e95ce78b8 52 @section EXAMPLE
ktownsend 29:011e95ce78b8 53
ktownsend 29:011e95ce78b8 54 @code
ktownsend 29:011e95ce78b8 55
ktownsend 29:011e95ce78b8 56 @endcode
ktownsend 29:011e95ce78b8 57 */
ktownsend 29:011e95ce78b8 58 /**************************************************************************/
ktownsend 29:011e95ce78b8 59 ble_error_t nRF51GattServer::addService(GattService & service)
ktownsend 29:011e95ce78b8 60 {
ktownsend 29:011e95ce78b8 61 /* ToDo: Make sure we don't overflow the array, etc. */
ktownsend 29:011e95ce78b8 62 /* ToDo: Make sure this service UUID doesn't already exist (?) */
ktownsend 29:011e95ce78b8 63 /* ToDo: Basic validation */
ktownsend 29:011e95ce78b8 64
ktownsend 29:011e95ce78b8 65 /* Add the service to the nRF51 */
ktownsend 29:011e95ce78b8 66 if (service.primaryServiceID.type == UUID::UUID_TYPE_SHORT)
ktownsend 29:011e95ce78b8 67 {
ktownsend 29:011e95ce78b8 68 /* 16-bit BLE UUID */
ktownsend 29:011e95ce78b8 69 uart.printf("10 01 00 04 01 02 %02X %02X\r\n",
ktownsend 29:011e95ce78b8 70 service.primaryServiceID.value & 0xFF,
ktownsend 29:011e95ce78b8 71 service.primaryServiceID.value >> 8);
ktownsend 29:011e95ce78b8 72 }
ktownsend 29:011e95ce78b8 73 else
ktownsend 29:011e95ce78b8 74 {
ktownsend 29:011e95ce78b8 75 /* 128-bit Custom UUID */
ktownsend 29:011e95ce78b8 76 uart.printf("10 01 00 12 01 10 %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\r\n",
ktownsend 29:011e95ce78b8 77 service.primaryServiceID.base[0],
ktownsend 29:011e95ce78b8 78 service.primaryServiceID.base[1],
ktownsend 29:011e95ce78b8 79 service.primaryServiceID.base[2],
ktownsend 29:011e95ce78b8 80 service.primaryServiceID.base[3],
ktownsend 29:011e95ce78b8 81 service.primaryServiceID.base[4],
ktownsend 29:011e95ce78b8 82 service.primaryServiceID.base[5],
ktownsend 29:011e95ce78b8 83 service.primaryServiceID.base[6],
ktownsend 29:011e95ce78b8 84 service.primaryServiceID.base[7],
ktownsend 29:011e95ce78b8 85 service.primaryServiceID.base[8],
ktownsend 29:011e95ce78b8 86 service.primaryServiceID.base[9],
ktownsend 29:011e95ce78b8 87 service.primaryServiceID.base[10],
ktownsend 29:011e95ce78b8 88 service.primaryServiceID.base[11],
ktownsend 29:011e95ce78b8 89 service.primaryServiceID.base[12],
ktownsend 29:011e95ce78b8 90 service.primaryServiceID.base[13],
ktownsend 29:011e95ce78b8 91 service.primaryServiceID.base[14],
ktownsend 29:011e95ce78b8 92 service.primaryServiceID.base[15]);
ktownsend 29:011e95ce78b8 93 }
ktownsend 29:011e95ce78b8 94
ktownsend 29:011e95ce78b8 95 /* ToDo: Check response */
ktownsend 29:011e95ce78b8 96 wait(0.1);
ktownsend 29:011e95ce78b8 97
ktownsend 29:011e95ce78b8 98 /* Add characteristics to the service */
ktownsend 29:011e95ce78b8 99 for (uint8_t i = 0; i < service.characteristicCount; i++)
ktownsend 29:011e95ce78b8 100 {
ktownsend 29:011e95ce78b8 101 /* Command ID = 0x0002 */
ktownsend 29:011e95ce78b8 102 uart.printf("10 02 00 0F 01 02 %02X %02X 04 02 %02X %02X 05 02 %02X %02X 03 01 %02X\r\n",
ktownsend 29:011e95ce78b8 103 service.characteristics[i].uuid & 0xFF,
ktownsend 29:011e95ce78b8 104 service.characteristics[i].uuid >> 8,
ktownsend 29:011e95ce78b8 105 service.characteristics[i].lenMin & 0xFF,
ktownsend 29:011e95ce78b8 106 service.characteristics[i].lenMin >> 8,
ktownsend 29:011e95ce78b8 107 service.characteristics[i].lenMax & 0xFF,
ktownsend 29:011e95ce78b8 108 service.characteristics[i].lenMax >> 8,
ktownsend 29:011e95ce78b8 109 service.characteristics[i].properties);
ktownsend 29:011e95ce78b8 110
ktownsend 29:011e95ce78b8 111 /* ToDo: Check response */
ktownsend 29:011e95ce78b8 112 wait(0.1);
ktownsend 29:011e95ce78b8 113
ktownsend 29:011e95ce78b8 114 /* Update the characteristic handle */
ktownsend 29:011e95ce78b8 115 service.characteristics[i].handle = characteristicCount;
ktownsend 29:011e95ce78b8 116 characteristicCount++;
ktownsend 29:011e95ce78b8 117 }
ktownsend 29:011e95ce78b8 118
ktownsend 29:011e95ce78b8 119 /* Update the service handle */
ktownsend 29:011e95ce78b8 120 service.handle = serviceCount;
ktownsend 29:011e95ce78b8 121 serviceCount++;
ktownsend 29:011e95ce78b8 122
ktownsend 29:011e95ce78b8 123 return BLE_ERROR_NONE;
ktownsend 29:011e95ce78b8 124 }
ktownsend 29:011e95ce78b8 125
ktownsend 29:011e95ce78b8 126 /**************************************************************************/
ktownsend 29:011e95ce78b8 127 /*!
ktownsend 29:011e95ce78b8 128 @brief Reads the value of a characteristic, based on the service
ktownsend 29:011e95ce78b8 129 and characteristic index fields
ktownsend 29:011e95ce78b8 130
ktownsend 29:011e95ce78b8 131 @param[in] charHandle
ktownsend 29:011e95ce78b8 132 The handle of the GattCharacteristic to read from
ktownsend 29:011e95ce78b8 133 @param[in] buffer
ktownsend 29:011e95ce78b8 134 Buffer to hold the the characteristic's value
ktownsend 29:011e95ce78b8 135 (raw byte array in LSB format)
ktownsend 29:011e95ce78b8 136 @param[in] len
ktownsend 29:011e95ce78b8 137 The number of bytes read into the buffer
ktownsend 29:011e95ce78b8 138
ktownsend 29:011e95ce78b8 139 @returns ble_error_t
ktownsend 29:011e95ce78b8 140
ktownsend 29:011e95ce78b8 141 @retval BLE_ERROR_NONE
ktownsend 29:011e95ce78b8 142 Everything executed properly
ktownsend 29:011e95ce78b8 143
ktownsend 29:011e95ce78b8 144 @section EXAMPLE
ktownsend 29:011e95ce78b8 145
ktownsend 29:011e95ce78b8 146 @code
ktownsend 29:011e95ce78b8 147
ktownsend 29:011e95ce78b8 148 @endcode
ktownsend 29:011e95ce78b8 149 */
ktownsend 29:011e95ce78b8 150 /**************************************************************************/
ktownsend 29:011e95ce78b8 151 ble_error_t nRF51GattServer::readValue(uint8_t charHandle, uint8_t buffer[], uint16_t len)
ktownsend 29:011e95ce78b8 152 {
ktownsend 29:011e95ce78b8 153 /* ToDo */
ktownsend 29:011e95ce78b8 154
ktownsend 29:011e95ce78b8 155 return BLE_ERROR_NONE;
ktownsend 29:011e95ce78b8 156 }
ktownsend 29:011e95ce78b8 157
ktownsend 29:011e95ce78b8 158 /**************************************************************************/
ktownsend 29:011e95ce78b8 159 /*!
ktownsend 29:011e95ce78b8 160 @brief Updates the value of a characteristic, based on the service
ktownsend 29:011e95ce78b8 161 and characteristic index fields
ktownsend 29:011e95ce78b8 162
ktownsend 29:011e95ce78b8 163 @param[in] charHandle
ktownsend 29:011e95ce78b8 164 The handle of the GattCharacteristic to write to
ktownsend 29:011e95ce78b8 165 @param[in] buffer
ktownsend 29:011e95ce78b8 166 Data to use when updating the characteristic's value
ktownsend 29:011e95ce78b8 167 (raw byte array in LSB format)
ktownsend 29:011e95ce78b8 168 @param[in] len
ktownsend 29:011e95ce78b8 169 The number of bytes in buffer
ktownsend 29:011e95ce78b8 170
ktownsend 29:011e95ce78b8 171 @returns ble_error_t
ktownsend 29:011e95ce78b8 172
ktownsend 29:011e95ce78b8 173 @retval BLE_ERROR_NONE
ktownsend 29:011e95ce78b8 174 Everything executed properly
ktownsend 29:011e95ce78b8 175
ktownsend 29:011e95ce78b8 176 @section EXAMPLE
ktownsend 29:011e95ce78b8 177
ktownsend 29:011e95ce78b8 178 @code
ktownsend 29:011e95ce78b8 179
ktownsend 29:011e95ce78b8 180 @endcode
ktownsend 29:011e95ce78b8 181 */
ktownsend 29:011e95ce78b8 182 /**************************************************************************/
ktownsend 29:011e95ce78b8 183 ble_error_t nRF51GattServer::updateValue(uint8_t charHandle, uint8_t buffer[], uint16_t len)
ktownsend 29:011e95ce78b8 184 {
ktownsend 29:011e95ce78b8 185 /* Command ID = 0x0006, Payload = Characteristic ID, Value */
ktownsend 29:011e95ce78b8 186 uart.printf("10 06 00 %02X %02X", len + 1, charHandle);
ktownsend 29:011e95ce78b8 187 for (uint16_t i = 0; i<len; i++)
ktownsend 29:011e95ce78b8 188 {
ktownsend 29:011e95ce78b8 189 uart.printf(" %02X", buffer[i]);
ktownsend 29:011e95ce78b8 190 }
ktownsend 29:011e95ce78b8 191 uart.printf("\r\n");
ktownsend 29:011e95ce78b8 192
ktownsend 29:011e95ce78b8 193 /* ToDo: Check response */
ktownsend 29:011e95ce78b8 194 wait(0.1);
ktownsend 29:011e95ce78b8 195
ktownsend 29:011e95ce78b8 196 return BLE_ERROR_NONE;
ktownsend 29:011e95ce78b8 197 }