BLE_API wrapper library for STMicroelectronics' BlueNRG Bluetooth Low Energy expansion board shield (Component)

Dependents:   Nucleo_Zumo_BLE_IDB04A1 contest_IOT5 contest_IOT6 contest_IOT_10 ... more

Fork of X_NUCLEO_IDB0XA1 by ST Expansion SW Team

Arduino Connector Compatibility Warning

X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 are Arduino compatible with an exception: instead of using pin D13 for the SPI clock, they use pin D3. The default configuration for this library is having the SPI clock on pin D3.

To be fully Arduino compatible, X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 need a small HW patch.

For X-NUCLEO-IDB04A1 this patch consists in removing zero resistor R10 and instead soldering zero resistor R11. For X-NUCLEO-IDB05A1 this patch consists in removing zero resistor R4 and instead soldering zero resistor R6.

In case you patch your board, then you also have to configure this library to use pin D13 to drive the SPI clock (see macro IDB0XA1_D13_PATCH in file x_nucleo_idb0xa1_targets.h).

If you use pin D13 for the SPI clock, please be aware that on STM32 Nucleo boards you may not drive the LED, otherwise you will get a conflict: the LED on STM32 Nucleo boards is connected to pin D13.

Referring to the current list of tested platforms (see X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 pages), the patch is required by ST-Nucleo-F103RB; ST-Nucleo-F302R8; ST-Nucleo-F411RE; and ST-Nucleo-F446RE.

Committer:
Wolfgang Betz
Date:
Wed Oct 07 08:39:04 2015 +0200
Revision:
132:51056160fa4a
Child:
133:1bb8df697f7f
Andrea's version as of mail from 10/06/2015 05:56 PM

From: Andrea PALMIERI <andrea.palmieri@st.com>
To: Wolfgang BETZ <wolfgang.betz@st.com>, Rohit Grover <rohit.grover@arm.com>,
Antonio VILEI <antonio.vilei@st.com>, Mihail Stoyanov
<Mihail.Stoyanov@arm.com>
CC: Nicola CAPOVILLA <nicola.capovilla@st.com>, Silvio Lucio OLIVA
<silvio.oliva@st.com>, "jonathan.austin@arm.com" <jonathan.austin@arm.com>
Content-Class: urn:content-classes:message
Date: Tue, 6 Oct 2015 17:56:34 +0200
Subject: RE: Arduino Compatibility of X-NUCLEO-IDB04A1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 132:51056160fa4a 1 /* mbed Microcontroller Library
Wolfgang Betz 132:51056160fa4a 2 * Copyright (c) 2006-2013 ARM Limited
Wolfgang Betz 132:51056160fa4a 3 *
Wolfgang Betz 132:51056160fa4a 4 * Licensed under the Apache License, Version 2.0 (the "License");
Wolfgang Betz 132:51056160fa4a 5 * you may not use this file except in compliance with the License.
Wolfgang Betz 132:51056160fa4a 6 * You may obtain a copy of the License at
Wolfgang Betz 132:51056160fa4a 7 *
Wolfgang Betz 132:51056160fa4a 8 * http://www.apache.org/licenses/LICENSE-2.0
Wolfgang Betz 132:51056160fa4a 9 *
Wolfgang Betz 132:51056160fa4a 10 * Unless required by applicable law or agreed to in writing, software
Wolfgang Betz 132:51056160fa4a 11 * distributed under the License is distributed on an "AS IS" BASIS,
Wolfgang Betz 132:51056160fa4a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Wolfgang Betz 132:51056160fa4a 13 * See the License for the specific language governing permissions and
Wolfgang Betz 132:51056160fa4a 14 * limitations under the License.
Wolfgang Betz 132:51056160fa4a 15 */
Wolfgang Betz 132:51056160fa4a 16
Wolfgang Betz 132:51056160fa4a 17
Wolfgang Betz 132:51056160fa4a 18 /**
Wolfgang Betz 132:51056160fa4a 19 ******************************************************************************
Wolfgang Betz 132:51056160fa4a 20 * @file btle.cpp
Wolfgang Betz 132:51056160fa4a 21 * @author STMicroelectronics
Wolfgang Betz 132:51056160fa4a 22 * @brief Implementation BlueNRG Init and helper functions.
Wolfgang Betz 132:51056160fa4a 23 ******************************************************************************
Wolfgang Betz 132:51056160fa4a 24 * @copy
Wolfgang Betz 132:51056160fa4a 25 *
Wolfgang Betz 132:51056160fa4a 26 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
Wolfgang Betz 132:51056160fa4a 27 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
Wolfgang Betz 132:51056160fa4a 28 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
Wolfgang Betz 132:51056160fa4a 29 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
Wolfgang Betz 132:51056160fa4a 30 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
Wolfgang Betz 132:51056160fa4a 31 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
Wolfgang Betz 132:51056160fa4a 32 *
Wolfgang Betz 132:51056160fa4a 33 * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
Wolfgang Betz 132:51056160fa4a 34 */
Wolfgang Betz 132:51056160fa4a 35
Wolfgang Betz 132:51056160fa4a 36
Wolfgang Betz 132:51056160fa4a 37 #include "btle.h"
Wolfgang Betz 132:51056160fa4a 38 #include "ble/Gap.h"
Wolfgang Betz 132:51056160fa4a 39 #include "ble/GapEvents.h"
Wolfgang Betz 132:51056160fa4a 40 #include "BlueNRGGap.h"
Wolfgang Betz 132:51056160fa4a 41 #include "BlueNRGGattServer.h"
Wolfgang Betz 132:51056160fa4a 42 #include "BlueNRGGattClient.h"
Wolfgang Betz 132:51056160fa4a 43 #include "Utils.h"
Wolfgang Betz 132:51056160fa4a 44
Wolfgang Betz 132:51056160fa4a 45 #ifdef __cplusplus
Wolfgang Betz 132:51056160fa4a 46 extern "C" {
Wolfgang Betz 132:51056160fa4a 47 #endif
Wolfgang Betz 132:51056160fa4a 48
Wolfgang Betz 132:51056160fa4a 49
Wolfgang Betz 132:51056160fa4a 50 /* C File Includes ------------------------------------------------------------------*/
Wolfgang Betz 132:51056160fa4a 51 // ANDREA: Updated includes and changed some types (e.g., tHalUint8 --> uint8_t)
Wolfgang Betz 132:51056160fa4a 52 #include <stdio.h>
Wolfgang Betz 132:51056160fa4a 53 #include <string.h>
Wolfgang Betz 132:51056160fa4a 54 #include "hci.h"
Wolfgang Betz 132:51056160fa4a 55 #include "hci_const.h"
Wolfgang Betz 132:51056160fa4a 56 #include "bluenrg_aci.h"
Wolfgang Betz 132:51056160fa4a 57 #include "bluenrg_hal_aci.h"
Wolfgang Betz 132:51056160fa4a 58 #include "bluenrg_gap.h"
Wolfgang Betz 132:51056160fa4a 59 #include "bluenrg_utils.h"
Wolfgang Betz 132:51056160fa4a 60
Wolfgang Betz 132:51056160fa4a 61 #include "hal_types.h"
Wolfgang Betz 132:51056160fa4a 62 #include "hal.h"
Wolfgang Betz 132:51056160fa4a 63 #include "gp_timer.h"
Wolfgang Betz 132:51056160fa4a 64 #include "osal.h"
Wolfgang Betz 132:51056160fa4a 65 #include "sm.h"
Wolfgang Betz 132:51056160fa4a 66 #include "debug.h"
Wolfgang Betz 132:51056160fa4a 67
Wolfgang Betz 132:51056160fa4a 68 #ifdef __cplusplus
Wolfgang Betz 132:51056160fa4a 69 }
Wolfgang Betz 132:51056160fa4a 70 #endif
Wolfgang Betz 132:51056160fa4a 71
Wolfgang Betz 132:51056160fa4a 72 #define IDB04A1 0
Wolfgang Betz 132:51056160fa4a 73 #define IDB05A1 1
Wolfgang Betz 132:51056160fa4a 74
Wolfgang Betz 132:51056160fa4a 75 #ifdef YOTTA_CFG
Wolfgang Betz 132:51056160fa4a 76 static void btle_handler(void);
Wolfgang Betz 132:51056160fa4a 77 #endif
Wolfgang Betz 132:51056160fa4a 78
Wolfgang Betz 132:51056160fa4a 79 void HCI_Input(tHciDataPacket * hciReadPacket);
Wolfgang Betz 132:51056160fa4a 80
Wolfgang Betz 132:51056160fa4a 81 //#define BDADDR_SIZE 6
Wolfgang Betz 132:51056160fa4a 82 //tHalUint8 bdaddr[BDADDR_SIZE]= {0xaa, 0x00, 0x00, 0xE1, 0x80, 0x02};
Wolfgang Betz 132:51056160fa4a 83
Wolfgang Betz 132:51056160fa4a 84 uint16_t g_gap_service_handle = 0;
Wolfgang Betz 132:51056160fa4a 85 uint16_t g_appearance_char_handle = 0;
Wolfgang Betz 132:51056160fa4a 86 uint16_t g_device_name_char_handle = 0;
Wolfgang Betz 132:51056160fa4a 87
Wolfgang Betz 132:51056160fa4a 88 /* Private variables ---------------------------------------------------------*/
Wolfgang Betz 132:51056160fa4a 89 volatile uint8_t set_connectable = 1;
Wolfgang Betz 132:51056160fa4a 90 // ANDREA
Wolfgang Betz 132:51056160fa4a 91 uint8_t bnrg_expansion_board = IDB04A1; /* at startup, suppose the X-NUCLEO-IDB04A1 is used */
Wolfgang Betz 132:51056160fa4a 92
Wolfgang Betz 132:51056160fa4a 93 Gap::Address_t bleAddr;
Wolfgang Betz 132:51056160fa4a 94 Gap::AddressType_t addr_type = Gap::ADDR_TYPE_PUBLIC;
Wolfgang Betz 132:51056160fa4a 95
Wolfgang Betz 132:51056160fa4a 96 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 97 /*!
Wolfgang Betz 132:51056160fa4a 98 @brief Initialises BTLE and the underlying HW/Device
Wolfgang Betz 132:51056160fa4a 99 @param isSetAddress boolean if address has been set
Wolfgang Betz 132:51056160fa4a 100 @param mosi MOSI Pin
Wolfgang Betz 132:51056160fa4a 101 @param miso MISO Pin
Wolfgang Betz 132:51056160fa4a 102 @param sclk clock Pin
Wolfgang Betz 132:51056160fa4a 103 @returns void
Wolfgang Betz 132:51056160fa4a 104 */
Wolfgang Betz 132:51056160fa4a 105 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 106 void btle_init(bool isSetAddress, uint8_t role)
Wolfgang Betz 132:51056160fa4a 107 {
Wolfgang Betz 132:51056160fa4a 108 PRINTF("btle_init>>\n\r");
Wolfgang Betz 132:51056160fa4a 109
Wolfgang Betz 132:51056160fa4a 110 int ret;
Wolfgang Betz 132:51056160fa4a 111 uint8_t hwVersion;
Wolfgang Betz 132:51056160fa4a 112 uint16_t fwVersion;
Wolfgang Betz 132:51056160fa4a 113 uint16_t service_handle, dev_name_char_handle, appearance_char_handle;
Wolfgang Betz 132:51056160fa4a 114
Wolfgang Betz 132:51056160fa4a 115 /* Delay needed only to be able to acces the JTAG interface after reset
Wolfgang Betz 132:51056160fa4a 116 if it will be disabled later. */
Wolfgang Betz 132:51056160fa4a 117 Clock_Wait(500);
Wolfgang Betz 132:51056160fa4a 118
Wolfgang Betz 132:51056160fa4a 119 /* Initialize the BlueNRG HCI */
Wolfgang Betz 132:51056160fa4a 120 HCI_Init();
Wolfgang Betz 132:51056160fa4a 121
Wolfgang Betz 132:51056160fa4a 122 /* Reset BlueNRG SPI interface */
Wolfgang Betz 132:51056160fa4a 123 BlueNRG_RST();
Wolfgang Betz 132:51056160fa4a 124
Wolfgang Betz 132:51056160fa4a 125 /* get the BlueNRG HW and FW versions */
Wolfgang Betz 132:51056160fa4a 126 getBlueNRGVersion(&hwVersion, &fwVersion);
Wolfgang Betz 132:51056160fa4a 127
Wolfgang Betz 132:51056160fa4a 128 /*
Wolfgang Betz 132:51056160fa4a 129 * Reset BlueNRG again otherwise we won't
Wolfgang Betz 132:51056160fa4a 130 * be able to change its MAC address.
Wolfgang Betz 132:51056160fa4a 131 * aci_hal_write_config_data() must be the first
Wolfgang Betz 132:51056160fa4a 132 * command after reset otherwise it will fail.
Wolfgang Betz 132:51056160fa4a 133 */
Wolfgang Betz 132:51056160fa4a 134 BlueNRG_RST();
Wolfgang Betz 132:51056160fa4a 135
Wolfgang Betz 132:51056160fa4a 136 if (hwVersion > 0x30) { /* X-NUCLEO-IDB05A1 expansion board is used */
Wolfgang Betz 132:51056160fa4a 137 bnrg_expansion_board = IDB05A1;
Wolfgang Betz 132:51056160fa4a 138 }
Wolfgang Betz 132:51056160fa4a 139
Wolfgang Betz 132:51056160fa4a 140 /* The Nucleo board must be configured as SERVER */
Wolfgang Betz 132:51056160fa4a 141 //check if isSetAddress is set than set address.
Wolfgang Betz 132:51056160fa4a 142 // ANDREA
Wolfgang Betz 132:51056160fa4a 143 if(isSetAddress)
Wolfgang Betz 132:51056160fa4a 144 {
Wolfgang Betz 132:51056160fa4a 145 BlueNRGGap::getInstance().getAddress(&addr_type, bleAddr);
Wolfgang Betz 132:51056160fa4a 146
Wolfgang Betz 132:51056160fa4a 147 Gap::Address_t bdaddr;
Wolfgang Betz 132:51056160fa4a 148 Osal_MemCpy(bdaddr, bleAddr, BDADDR_SIZE);
Wolfgang Betz 132:51056160fa4a 149
Wolfgang Betz 132:51056160fa4a 150 ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
Wolfgang Betz 132:51056160fa4a 151 CONFIG_DATA_PUBADDR_LEN,
Wolfgang Betz 132:51056160fa4a 152 bdaddr);
Wolfgang Betz 132:51056160fa4a 153 } else {
Wolfgang Betz 132:51056160fa4a 154
Wolfgang Betz 132:51056160fa4a 155 const Gap::Address_t BLE_address_BE = {0xFD,0x00,0x25,0xAA,0x02,0x04};
Wolfgang Betz 132:51056160fa4a 156 BlueNRGGap::getInstance().setAddress(Gap::ADDR_TYPE_PUBLIC, BLE_address_BE);
Wolfgang Betz 132:51056160fa4a 157
Wolfgang Betz 132:51056160fa4a 158 ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
Wolfgang Betz 132:51056160fa4a 159 CONFIG_DATA_PUBADDR_LEN,
Wolfgang Betz 132:51056160fa4a 160 BLE_address_BE);
Wolfgang Betz 132:51056160fa4a 161 }
Wolfgang Betz 132:51056160fa4a 162
Wolfgang Betz 132:51056160fa4a 163 ret = aci_gatt_init();
Wolfgang Betz 132:51056160fa4a 164 if(ret){
Wolfgang Betz 132:51056160fa4a 165 PRINTF("GATT_Init failed.\n");
Wolfgang Betz 132:51056160fa4a 166 }
Wolfgang Betz 132:51056160fa4a 167 if (bnrg_expansion_board == IDB05A1) {
Wolfgang Betz 132:51056160fa4a 168 ret = aci_gap_init_IDB05A1(GAP_PERIPHERAL_ROLE_IDB05A1|GAP_CENTRAL_ROLE_IDB05A1, 0, 0x07, &service_handle, &dev_name_char_handle, &appearance_char_handle);
Wolfgang Betz 132:51056160fa4a 169 } else {
Wolfgang Betz 132:51056160fa4a 170 ret = aci_gap_init_IDB04A1(role, &service_handle, &dev_name_char_handle, &appearance_char_handle);
Wolfgang Betz 132:51056160fa4a 171 }
Wolfgang Betz 132:51056160fa4a 172
Wolfgang Betz 132:51056160fa4a 173 if(ret != BLE_STATUS_SUCCESS){
Wolfgang Betz 132:51056160fa4a 174 PRINTF("GAP_Init failed.\n");
Wolfgang Betz 132:51056160fa4a 175 }
Wolfgang Betz 132:51056160fa4a 176
Wolfgang Betz 132:51056160fa4a 177 //ANDREA -- FIXME: Security and passkey set by default
Wolfgang Betz 132:51056160fa4a 178 ret = aci_gap_set_auth_requirement(MITM_PROTECTION_REQUIRED,
Wolfgang Betz 132:51056160fa4a 179 OOB_AUTH_DATA_ABSENT,
Wolfgang Betz 132:51056160fa4a 180 NULL,
Wolfgang Betz 132:51056160fa4a 181 7,
Wolfgang Betz 132:51056160fa4a 182 16,
Wolfgang Betz 132:51056160fa4a 183 USE_FIXED_PIN_FOR_PAIRING,
Wolfgang Betz 132:51056160fa4a 184 123456,
Wolfgang Betz 132:51056160fa4a 185 BONDING);
Wolfgang Betz 132:51056160fa4a 186 if (ret == BLE_STATUS_SUCCESS) {
Wolfgang Betz 132:51056160fa4a 187 PRINTF("Auth Req set successfully.\n");
Wolfgang Betz 132:51056160fa4a 188 }
Wolfgang Betz 132:51056160fa4a 189
Wolfgang Betz 132:51056160fa4a 190 aci_hal_set_tx_power_level(1,4);
Wolfgang Betz 132:51056160fa4a 191
Wolfgang Betz 132:51056160fa4a 192 g_gap_service_handle = service_handle;
Wolfgang Betz 132:51056160fa4a 193 g_appearance_char_handle = appearance_char_handle;
Wolfgang Betz 132:51056160fa4a 194 g_device_name_char_handle = dev_name_char_handle;
Wolfgang Betz 132:51056160fa4a 195 //Device Name is set from Accumulate Adv Data Payload or through setDeviceName API
Wolfgang Betz 132:51056160fa4a 196 /*ret = aci_gatt_update_char_value(service_handle, dev_name_char_handle, 0,
Wolfgang Betz 132:51056160fa4a 197 strlen(name), (tHalUint8 *)name);*/
Wolfgang Betz 132:51056160fa4a 198
Wolfgang Betz 132:51056160fa4a 199 // Andrea: mbedOS
Wolfgang Betz 132:51056160fa4a 200 #ifdef YOTTA_CFG
Wolfgang Betz 132:51056160fa4a 201 minar::Scheduler::postCallback(btle_handler);
Wolfgang Betz 132:51056160fa4a 202 #endif
Wolfgang Betz 132:51056160fa4a 203 return;
Wolfgang Betz 132:51056160fa4a 204 }
Wolfgang Betz 132:51056160fa4a 205
Wolfgang Betz 132:51056160fa4a 206 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 207 /*!
Wolfgang Betz 132:51056160fa4a 208 @brief Andrea: mbedOS
Wolfgang Betz 132:51056160fa4a 209
Wolfgang Betz 132:51056160fa4a 210 @param[in] void
Wolfgang Betz 132:51056160fa4a 211
Wolfgang Betz 132:51056160fa4a 212 @returns
Wolfgang Betz 132:51056160fa4a 213 */
Wolfgang Betz 132:51056160fa4a 214 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 215 #ifdef YOTTA_CFG
Wolfgang Betz 132:51056160fa4a 216 static void btle_handler(void)
Wolfgang Betz 132:51056160fa4a 217 {
Wolfgang Betz 132:51056160fa4a 218 HCI_Process();
Wolfgang Betz 132:51056160fa4a 219
Wolfgang Betz 132:51056160fa4a 220 // reschedule myself
Wolfgang Betz 132:51056160fa4a 221 minar::Scheduler::postCallback(btle_handler);
Wolfgang Betz 132:51056160fa4a 222 }
Wolfgang Betz 132:51056160fa4a 223 #endif
Wolfgang Betz 132:51056160fa4a 224
Wolfgang Betz 132:51056160fa4a 225
Wolfgang Betz 132:51056160fa4a 226 /*!
Wolfgang Betz 132:51056160fa4a 227 @brief Not Used
Wolfgang Betz 132:51056160fa4a 228
Wolfgang Betz 132:51056160fa4a 229 @param[in] void
Wolfgang Betz 132:51056160fa4a 230
Wolfgang Betz 132:51056160fa4a 231 @returns
Wolfgang Betz 132:51056160fa4a 232 */
Wolfgang Betz 132:51056160fa4a 233 void SPI_Poll(void)
Wolfgang Betz 132:51056160fa4a 234 {
Wolfgang Betz 132:51056160fa4a 235 //HAL_GPIO_EXTI_Callback_Poll(BNRG_SPI_EXTI_PIN);
Wolfgang Betz 132:51056160fa4a 236 return;
Wolfgang Betz 132:51056160fa4a 237 }
Wolfgang Betz 132:51056160fa4a 238
Wolfgang Betz 132:51056160fa4a 239 void Attribute_Modified_CB(uint16_t attr_handle, uint8_t data_length, uint8_t *att_data, uint8_t offset)
Wolfgang Betz 132:51056160fa4a 240 {
Wolfgang Betz 132:51056160fa4a 241 //Extract the GattCharacteristic from p_characteristics[] and find the properties mask
Wolfgang Betz 132:51056160fa4a 242 GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(attr_handle);
Wolfgang Betz 132:51056160fa4a 243 if(p_char!=NULL) {
Wolfgang Betz 132:51056160fa4a 244 GattAttribute::Handle_t charHandle = p_char->getValueAttribute().getHandle();
Wolfgang Betz 132:51056160fa4a 245 BlueNRGGattServer::HandleEnum_t currentHandle = BlueNRGGattServer::CHAR_HANDLE;
Wolfgang Betz 132:51056160fa4a 246 PRINTF("CharHandle %d, length: %d, Data: %d\n\r", charHandle, data_length, (uint16_t)att_data[0]);
Wolfgang Betz 132:51056160fa4a 247 PRINTF("getProperties 0x%x\n\r",p_char->getProperties());
Wolfgang Betz 132:51056160fa4a 248 if(attr_handle == charHandle+CHAR_VALUE_OFFSET) {
Wolfgang Betz 132:51056160fa4a 249 currentHandle = BlueNRGGattServer::CHAR_VALUE_HANDLE;
Wolfgang Betz 132:51056160fa4a 250 }
Wolfgang Betz 132:51056160fa4a 251
Wolfgang Betz 132:51056160fa4a 252 if(attr_handle == charHandle+CHAR_DESC_OFFSET) {
Wolfgang Betz 132:51056160fa4a 253 currentHandle = BlueNRGGattServer::CHAR_DESC_HANDLE;
Wolfgang Betz 132:51056160fa4a 254 }
Wolfgang Betz 132:51056160fa4a 255 PRINTF("currentHandle %d\n\r", currentHandle);
Wolfgang Betz 132:51056160fa4a 256 if((p_char->getProperties() &
Wolfgang Betz 132:51056160fa4a 257 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) &&
Wolfgang Betz 132:51056160fa4a 258 currentHandle == BlueNRGGattServer::CHAR_DESC_HANDLE) {
Wolfgang Betz 132:51056160fa4a 259
Wolfgang Betz 132:51056160fa4a 260 PRINTF("*****NOTIFICATION CASE\n\r");
Wolfgang Betz 132:51056160fa4a 261 //Now Check if data written in Enable or Disable
Wolfgang Betz 132:51056160fa4a 262 if((uint16_t)att_data[0]==1) {
Wolfgang Betz 132:51056160fa4a 263 //PRINTF("Notify ENABLED\n\r");
Wolfgang Betz 132:51056160fa4a 264 BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_ENABLED, p_char->getValueAttribute().getHandle());
Wolfgang Betz 132:51056160fa4a 265 } else {
Wolfgang Betz 132:51056160fa4a 266 //PRINTF("Notify DISABLED\n\r");
Wolfgang Betz 132:51056160fa4a 267 BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_DISABLED, p_char->getValueAttribute().getHandle());
Wolfgang Betz 132:51056160fa4a 268 }
Wolfgang Betz 132:51056160fa4a 269 }
Wolfgang Betz 132:51056160fa4a 270
Wolfgang Betz 132:51056160fa4a 271 //Check is attr handle property is WRITEABLE, if yes, generate GATT_EVENT_DATA_WRITTEN Event
Wolfgang Betz 132:51056160fa4a 272 if((p_char->getProperties() &
Wolfgang Betz 132:51056160fa4a 273 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE)) &&
Wolfgang Betz 132:51056160fa4a 274 currentHandle == BlueNRGGattServer::CHAR_VALUE_HANDLE) {
Wolfgang Betz 132:51056160fa4a 275
Wolfgang Betz 132:51056160fa4a 276 PRINTF("*****WRITE CASE\n\r");
Wolfgang Betz 132:51056160fa4a 277
Wolfgang Betz 132:51056160fa4a 278 GattWriteCallbackParams writeParams;
Wolfgang Betz 132:51056160fa4a 279 writeParams.handle = p_char->getValueAttribute().getHandle();
Wolfgang Betz 132:51056160fa4a 280 writeParams.writeOp = GattWriteCallbackParams::OP_WRITE_REQ;//Where to find this property in BLUENRG?
Wolfgang Betz 132:51056160fa4a 281 writeParams.len = data_length;
Wolfgang Betz 132:51056160fa4a 282 writeParams.data = att_data;
Wolfgang Betz 132:51056160fa4a 283 if (bnrg_expansion_board == IDB05A1) {
Wolfgang Betz 132:51056160fa4a 284 writeParams.offset = offset;
Wolfgang Betz 132:51056160fa4a 285 } else {
Wolfgang Betz 132:51056160fa4a 286 writeParams.offset = 0;
Wolfgang Betz 132:51056160fa4a 287 }
Wolfgang Betz 132:51056160fa4a 288 BlueNRGGattServer::getInstance().HCIDataWrittenEvent(&writeParams);
Wolfgang Betz 132:51056160fa4a 289
Wolfgang Betz 132:51056160fa4a 290 //BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_WRITTEN, evt->attr_handle);
Wolfgang Betz 132:51056160fa4a 291 //Write the actual Data to the Attr Handle? (uint8_1[])att_data contains the data
Wolfgang Betz 132:51056160fa4a 292 if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) {
Wolfgang Betz 132:51056160fa4a 293 BlueNRGGattServer::getInstance().write(p_char->getValueAttribute().getHandle(), (uint8_t*)att_data, data_length, false);
Wolfgang Betz 132:51056160fa4a 294 }
Wolfgang Betz 132:51056160fa4a 295 }
Wolfgang Betz 132:51056160fa4a 296 }
Wolfgang Betz 132:51056160fa4a 297
Wolfgang Betz 132:51056160fa4a 298 }
Wolfgang Betz 132:51056160fa4a 299
Wolfgang Betz 132:51056160fa4a 300 #ifdef __cplusplus
Wolfgang Betz 132:51056160fa4a 301 extern "C" {
Wolfgang Betz 132:51056160fa4a 302 #endif
Wolfgang Betz 132:51056160fa4a 303
Wolfgang Betz 132:51056160fa4a 304 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 305 /*!
Wolfgang Betz 132:51056160fa4a 306 @brief Handle HCI Stack Event
Wolfgang Betz 132:51056160fa4a 307
Wolfgang Betz 132:51056160fa4a 308 @param[in] pckt
Wolfgang Betz 132:51056160fa4a 309 Event Packet sent by the stack to be decoded
Wolfgang Betz 132:51056160fa4a 310
Wolfgang Betz 132:51056160fa4a 311 @returns
Wolfgang Betz 132:51056160fa4a 312 */
Wolfgang Betz 132:51056160fa4a 313 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 314 extern void HCI_Event_CB(void *pckt) {
Wolfgang Betz 132:51056160fa4a 315 hci_uart_pckt *hci_pckt = (hci_uart_pckt*)pckt;
Wolfgang Betz 132:51056160fa4a 316 hci_event_pckt *event_pckt = (hci_event_pckt*)hci_pckt->data;
Wolfgang Betz 132:51056160fa4a 317
Wolfgang Betz 132:51056160fa4a 318 if(hci_pckt->type != HCI_EVENT_PKT)
Wolfgang Betz 132:51056160fa4a 319 return;
Wolfgang Betz 132:51056160fa4a 320
Wolfgang Betz 132:51056160fa4a 321 switch(event_pckt->evt){
Wolfgang Betz 132:51056160fa4a 322
Wolfgang Betz 132:51056160fa4a 323 case EVT_DISCONN_COMPLETE:
Wolfgang Betz 132:51056160fa4a 324 {
Wolfgang Betz 132:51056160fa4a 325 PRINTF("EVT_DISCONN_COMPLETE\n");
Wolfgang Betz 132:51056160fa4a 326
Wolfgang Betz 132:51056160fa4a 327 evt_disconn_complete *evt = (evt_disconn_complete*)event_pckt;
Wolfgang Betz 132:51056160fa4a 328
Wolfgang Betz 132:51056160fa4a 329 BlueNRGGap::getInstance().processDisconnectionEvent(evt->handle, BlueNRGGap::REMOTE_USER_TERMINATED_CONNECTION);
Wolfgang Betz 132:51056160fa4a 330 }
Wolfgang Betz 132:51056160fa4a 331 break;
Wolfgang Betz 132:51056160fa4a 332
Wolfgang Betz 132:51056160fa4a 333 case EVT_LE_META_EVENT:
Wolfgang Betz 132:51056160fa4a 334 {
Wolfgang Betz 132:51056160fa4a 335 PRINTF("EVT_LE_META_EVENT\n");
Wolfgang Betz 132:51056160fa4a 336
Wolfgang Betz 132:51056160fa4a 337 evt_le_meta_event *evt = (evt_le_meta_event *)event_pckt->data;
Wolfgang Betz 132:51056160fa4a 338
Wolfgang Betz 132:51056160fa4a 339 switch(evt->subevent){
Wolfgang Betz 132:51056160fa4a 340 // ANDREA
Wolfgang Betz 132:51056160fa4a 341 case EVT_LE_CONN_COMPLETE:
Wolfgang Betz 132:51056160fa4a 342 {
Wolfgang Betz 132:51056160fa4a 343 PRINTF("EVT_LE_CONN_COMPLETE\n");
Wolfgang Betz 132:51056160fa4a 344 Gap::AddressType_t peerAddrType = Gap::ADDR_TYPE_PUBLIC;
Wolfgang Betz 132:51056160fa4a 345 Gap::Role_t role;
Wolfgang Betz 132:51056160fa4a 346
Wolfgang Betz 132:51056160fa4a 347 evt_le_connection_complete *cc = (evt_le_connection_complete *)evt->data;
Wolfgang Betz 132:51056160fa4a 348
Wolfgang Betz 132:51056160fa4a 349 BlueNRGGap::getInstance().setConnectionHandle(cc->handle);
Wolfgang Betz 132:51056160fa4a 350 BlueNRGGap::ConnectionParams_t connectionParams;
Wolfgang Betz 132:51056160fa4a 351 BlueNRGGap::getInstance().getPreferredConnectionParams(&connectionParams);
Wolfgang Betz 132:51056160fa4a 352 switch (cc->peer_bdaddr_type) {
Wolfgang Betz 132:51056160fa4a 353 case PUBLIC_ADDR:
Wolfgang Betz 132:51056160fa4a 354 peerAddrType = Gap::ADDR_TYPE_PUBLIC;
Wolfgang Betz 132:51056160fa4a 355 break;
Wolfgang Betz 132:51056160fa4a 356 case STATIC_RANDOM_ADDR:
Wolfgang Betz 132:51056160fa4a 357 peerAddrType = Gap::ADDR_TYPE_RANDOM_STATIC;
Wolfgang Betz 132:51056160fa4a 358 break;
Wolfgang Betz 132:51056160fa4a 359 case RESOLVABLE_PRIVATE_ADDR:
Wolfgang Betz 132:51056160fa4a 360 peerAddrType = Gap::ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE;
Wolfgang Betz 132:51056160fa4a 361 break;
Wolfgang Betz 132:51056160fa4a 362 case NON_RESOLVABLE_PRIVATE_ADDR:
Wolfgang Betz 132:51056160fa4a 363 peerAddrType = Gap::ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE;
Wolfgang Betz 132:51056160fa4a 364 break;
Wolfgang Betz 132:51056160fa4a 365 }
Wolfgang Betz 132:51056160fa4a 366 //PRINTF("EVT_LE_CONN_COMPLETE LL role=%d\n", cc->role);
Wolfgang Betz 132:51056160fa4a 367 switch (cc->role) {
Wolfgang Betz 132:51056160fa4a 368 case 0: //master
Wolfgang Betz 132:51056160fa4a 369 role = Gap::CENTRAL;
Wolfgang Betz 132:51056160fa4a 370 break;
Wolfgang Betz 132:51056160fa4a 371 case 1:
Wolfgang Betz 132:51056160fa4a 372 role = Gap::PERIPHERAL;
Wolfgang Betz 132:51056160fa4a 373 break;
Wolfgang Betz 132:51056160fa4a 374 }
Wolfgang Betz 132:51056160fa4a 375 //PRINTF("EVT_LE_CONN_COMPLETE GAP role=%d\n", role);
Wolfgang Betz 132:51056160fa4a 376 BlueNRGGap::getInstance().processConnectionEvent(cc->handle, role/*Gap::PERIPHERAL*/, peerAddrType, cc->peer_bdaddr, addr_type, bleAddr, (const BlueNRGGap::ConnectionParams_t *)&connectionParams);
Wolfgang Betz 132:51056160fa4a 377 }
Wolfgang Betz 132:51056160fa4a 378 break;
Wolfgang Betz 132:51056160fa4a 379
Wolfgang Betz 132:51056160fa4a 380 case EVT_LE_ADVERTISING_REPORT:
Wolfgang Betz 132:51056160fa4a 381 PRINTF("EVT_LE_ADVERTISING_REPORT\n\r");
Wolfgang Betz 132:51056160fa4a 382 /* FIXME: comment this otherwise it will be obscure and error prone if BlueNRG FW will be updated */
Wolfgang Betz 132:51056160fa4a 383 // This event is generated only by X-NUCLEO-IDB05A1 version but not by X-NUCLEO-IDB04A1 (which generates DEVICE_FOUND EVT)
Wolfgang Betz 132:51056160fa4a 384 // Formally the structure related to both events are identical except that for the ADV REPORT
Wolfgang Betz 132:51056160fa4a 385 // there is one more field (number of reports) which is not forwarded to upper layer.
Wolfgang Betz 132:51056160fa4a 386 // Thus we need to move one byte over (((uint8_t*)evt->data)+1) before persing the ADV REPORT.
Wolfgang Betz 132:51056160fa4a 387 le_advertising_info *pr = (le_advertising_info*) (((uint8_t*)evt->data)+1);
Wolfgang Betz 132:51056160fa4a 388 PRINTF("EVT_LE_ADVERTISING_REPORT evt_type=%d\n\r", pr->evt_type);
Wolfgang Betz 132:51056160fa4a 389
Wolfgang Betz 132:51056160fa4a 390 BlueNRGGap::getInstance().Discovery_CB(BlueNRGGap::DEVICE_FOUND,
Wolfgang Betz 132:51056160fa4a 391 pr->evt_type,
Wolfgang Betz 132:51056160fa4a 392 &pr->bdaddr_type,
Wolfgang Betz 132:51056160fa4a 393 pr->bdaddr,
Wolfgang Betz 132:51056160fa4a 394 &pr->data_length,
Wolfgang Betz 132:51056160fa4a 395 &pr->data_RSSI[0],
Wolfgang Betz 132:51056160fa4a 396 &pr->data_RSSI[pr->data_length]);
Wolfgang Betz 132:51056160fa4a 397 break;
Wolfgang Betz 132:51056160fa4a 398 }
Wolfgang Betz 132:51056160fa4a 399 }
Wolfgang Betz 132:51056160fa4a 400 break;
Wolfgang Betz 132:51056160fa4a 401
Wolfgang Betz 132:51056160fa4a 402 case EVT_VENDOR:
Wolfgang Betz 132:51056160fa4a 403 {
Wolfgang Betz 132:51056160fa4a 404 evt_blue_aci *blue_evt = (evt_blue_aci*)event_pckt->data;
Wolfgang Betz 132:51056160fa4a 405 //PRINTF("EVT_VENDOR %d\n", blue_evt->ecode);
Wolfgang Betz 132:51056160fa4a 406
Wolfgang Betz 132:51056160fa4a 407 switch(blue_evt->ecode){
Wolfgang Betz 132:51056160fa4a 408
Wolfgang Betz 132:51056160fa4a 409 case EVT_BLUE_GATT_READ_PERMIT_REQ:
Wolfgang Betz 132:51056160fa4a 410 {
Wolfgang Betz 132:51056160fa4a 411 PRINTF("EVT_BLUE_GATT_READ_PERMIT_REQ_OK\n\r");
Wolfgang Betz 132:51056160fa4a 412 evt_gatt_read_permit_req *pr = (evt_gatt_read_permit_req*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 413 BlueNRGGattServer::getInstance().Read_Request_CB(pr->attr_handle-CHAR_VALUE_OFFSET);
Wolfgang Betz 132:51056160fa4a 414 }
Wolfgang Betz 132:51056160fa4a 415 break;
Wolfgang Betz 132:51056160fa4a 416
Wolfgang Betz 132:51056160fa4a 417 case EVT_BLUE_GATT_ATTRIBUTE_MODIFIED:
Wolfgang Betz 132:51056160fa4a 418 {
Wolfgang Betz 132:51056160fa4a 419 PRINTF("EVT_BLUE_GATT_ATTRIBUTE_MODIFIED\n\r");
Wolfgang Betz 132:51056160fa4a 420 /* this callback is invoked when a GATT attribute is modified
Wolfgang Betz 132:51056160fa4a 421 extract callback data and pass to suitable handler function */
Wolfgang Betz 132:51056160fa4a 422 if (bnrg_expansion_board == IDB05A1) {
Wolfgang Betz 132:51056160fa4a 423 evt_gatt_attr_modified_IDB05A1 *evt = (evt_gatt_attr_modified_IDB05A1*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 424 Attribute_Modified_CB(evt->attr_handle, evt->data_length, evt->att_data, evt->offset);
Wolfgang Betz 132:51056160fa4a 425 } else {
Wolfgang Betz 132:51056160fa4a 426 evt_gatt_attr_modified_IDB04A1 *evt = (evt_gatt_attr_modified_IDB04A1*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 427 Attribute_Modified_CB(evt->attr_handle, evt->data_length, evt->att_data, 0);
Wolfgang Betz 132:51056160fa4a 428 }
Wolfgang Betz 132:51056160fa4a 429 }
Wolfgang Betz 132:51056160fa4a 430 break;
Wolfgang Betz 132:51056160fa4a 431
Wolfgang Betz 132:51056160fa4a 432 //Any cases for Data Sent Notifications?
Wolfgang Betz 132:51056160fa4a 433 case EVT_BLUE_GATT_NOTIFICATION:
Wolfgang Betz 132:51056160fa4a 434 //This is only relevant for Client Side Event
Wolfgang Betz 132:51056160fa4a 435 PRINTF("EVT_BLUE_GATT_NOTIFICATION");
Wolfgang Betz 132:51056160fa4a 436 break;
Wolfgang Betz 132:51056160fa4a 437 case EVT_BLUE_GATT_INDICATION:
Wolfgang Betz 132:51056160fa4a 438 //This is only relevant for Client Side Event
Wolfgang Betz 132:51056160fa4a 439 PRINTF("EVT_BLUE_GATT_INDICATION");
Wolfgang Betz 132:51056160fa4a 440 break;
Wolfgang Betz 132:51056160fa4a 441
Wolfgang Betz 132:51056160fa4a 442 case EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP:
Wolfgang Betz 132:51056160fa4a 443 {
Wolfgang Betz 132:51056160fa4a 444 PRINTF("EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 445 evt_att_read_by_group_resp *pr = (evt_att_read_by_group_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 446 BlueNRGGattClient::getInstance().primaryServicesCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 447 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 448 pr->attribute_data_length,
Wolfgang Betz 132:51056160fa4a 449 pr->attribute_data_list);
Wolfgang Betz 132:51056160fa4a 450 }
Wolfgang Betz 132:51056160fa4a 451 break;
Wolfgang Betz 132:51056160fa4a 452 case EVT_BLUE_ATT_READ_BY_TYPE_RESP:
Wolfgang Betz 132:51056160fa4a 453 {
Wolfgang Betz 132:51056160fa4a 454 PRINTF("EVT_BLUE_ATT_READ_BY_TYPE_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 455 evt_att_read_by_type_resp *pr = (evt_att_read_by_type_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 456 BlueNRGGattClient::getInstance().serviceCharsCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 457 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 458 pr->handle_value_pair_length,
Wolfgang Betz 132:51056160fa4a 459 pr->handle_value_pair);
Wolfgang Betz 132:51056160fa4a 460 }
Wolfgang Betz 132:51056160fa4a 461 break;
Wolfgang Betz 132:51056160fa4a 462 case EVT_BLUE_ATT_READ_RESP:
Wolfgang Betz 132:51056160fa4a 463 {
Wolfgang Betz 132:51056160fa4a 464 PRINTF("EVT_BLUE_ATT_READ_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 465 evt_att_read_resp *pr = (evt_att_read_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 466 BlueNRGGattClient::getInstance().charReadCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 467 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 468 pr->attribute_value);
Wolfgang Betz 132:51056160fa4a 469 }
Wolfgang Betz 132:51056160fa4a 470 break;
Wolfgang Betz 132:51056160fa4a 471 case EVT_BLUE_ATT_EXEC_WRITE_RESP:
Wolfgang Betz 132:51056160fa4a 472 {
Wolfgang Betz 132:51056160fa4a 473 PRINTF("EVT_BLUE_ATT_EXEC_WRITE_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 474 evt_att_prepare_write_resp *pr = (evt_att_prepare_write_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 475 BlueNRGGattClient::getInstance().charWriteExecCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 476 pr->event_data_length);
Wolfgang Betz 132:51056160fa4a 477 }
Wolfgang Betz 132:51056160fa4a 478 break;
Wolfgang Betz 132:51056160fa4a 479 case EVT_BLUE_ATT_PREPARE_WRITE_RESP:
Wolfgang Betz 132:51056160fa4a 480 {
Wolfgang Betz 132:51056160fa4a 481 PRINTF("EVT_BLUE_ATT_PREPARE_WRITE_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 482 evt_att_prepare_write_resp *pr = (evt_att_prepare_write_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 483 BlueNRGGattClient::getInstance().charWritePrepareCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 484 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 485 pr->attribute_handle,
Wolfgang Betz 132:51056160fa4a 486 pr->offset,
Wolfgang Betz 132:51056160fa4a 487 pr->part_attr_value);
Wolfgang Betz 132:51056160fa4a 488 }
Wolfgang Betz 132:51056160fa4a 489 break;
Wolfgang Betz 132:51056160fa4a 490 case EVT_BLUE_GATT_DISC_READ_CHAR_BY_UUID_RESP:
Wolfgang Betz 132:51056160fa4a 491 {
Wolfgang Betz 132:51056160fa4a 492 PRINTF("EVT_BLUE_GATT_DISC_READ_CHAR_BY_UUID_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 493 evt_gatt_disc_read_char_by_uuid_resp *pr = (evt_gatt_disc_read_char_by_uuid_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 494 BlueNRGGattClient::getInstance().serviceCharByUUIDCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 495 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 496 pr->attr_handle,
Wolfgang Betz 132:51056160fa4a 497 pr->attr_value);
Wolfgang Betz 132:51056160fa4a 498 }
Wolfgang Betz 132:51056160fa4a 499 break;
Wolfgang Betz 132:51056160fa4a 500 case EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP:
Wolfgang Betz 132:51056160fa4a 501 {
Wolfgang Betz 132:51056160fa4a 502 PRINTF("EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 503 evt_att_find_by_type_val_resp *pr = (evt_att_find_by_type_val_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 504 BlueNRGGattClient::getInstance().primaryServiceCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 505 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 506 pr->handles_info_list);
Wolfgang Betz 132:51056160fa4a 507 }
Wolfgang Betz 132:51056160fa4a 508 break;
Wolfgang Betz 132:51056160fa4a 509 case EVT_BLUE_GATT_PROCEDURE_COMPLETE:
Wolfgang Betz 132:51056160fa4a 510 {
Wolfgang Betz 132:51056160fa4a 511 //PRINTF("EVT_BLUE_GATT_PROCEDURE_COMPLETE\n\r");
Wolfgang Betz 132:51056160fa4a 512 evt_gatt_procedure_complete *evt = (evt_gatt_procedure_complete*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 513 PRINTF("EVT_BLUE_GATT_PROCEDURE_COMPLETE error_code=%d\n\r", evt->error_code);
Wolfgang Betz 132:51056160fa4a 514 BlueNRGGattClient::getInstance().gattProcedureCompleteCB(evt->conn_handle, evt->error_code);
Wolfgang Betz 132:51056160fa4a 515 }
Wolfgang Betz 132:51056160fa4a 516 break;
Wolfgang Betz 132:51056160fa4a 517
Wolfgang Betz 132:51056160fa4a 518 case EVT_BLUE_GAP_DEVICE_FOUND:
Wolfgang Betz 132:51056160fa4a 519 {
Wolfgang Betz 132:51056160fa4a 520 PRINTF("EVT_BLUE_GAP_DEVICE_FOUND\n\r");
Wolfgang Betz 132:51056160fa4a 521 evt_gap_device_found *pr = (evt_gap_device_found*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 522 PRINTF("EVT_BLUE_GAP_DEVICE_FOUND evt_type=%d\n\r", pr->evt_type);
Wolfgang Betz 132:51056160fa4a 523
Wolfgang Betz 132:51056160fa4a 524 BlueNRGGap::getInstance().Discovery_CB(BlueNRGGap::DEVICE_FOUND,
Wolfgang Betz 132:51056160fa4a 525 pr->evt_type,
Wolfgang Betz 132:51056160fa4a 526 &pr->bdaddr_type,
Wolfgang Betz 132:51056160fa4a 527 pr->bdaddr,
Wolfgang Betz 132:51056160fa4a 528 &pr->data_length,
Wolfgang Betz 132:51056160fa4a 529 &pr->data_RSSI[0],
Wolfgang Betz 132:51056160fa4a 530 &pr->data_RSSI[pr->data_length]);
Wolfgang Betz 132:51056160fa4a 531 }
Wolfgang Betz 132:51056160fa4a 532 break;
Wolfgang Betz 132:51056160fa4a 533
Wolfgang Betz 132:51056160fa4a 534 case EVT_BLUE_GAP_PROCEDURE_COMPLETE:
Wolfgang Betz 132:51056160fa4a 535 {
Wolfgang Betz 132:51056160fa4a 536 evt_gap_procedure_complete *pr = (evt_gap_procedure_complete*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 537 //printf("EVT_BLUE_GAP_PROCEDURE_COMPLETE (code=0x%02X)\n\r", pr->procedure_code);
Wolfgang Betz 132:51056160fa4a 538
Wolfgang Betz 132:51056160fa4a 539 switch(pr->procedure_code) {
Wolfgang Betz 132:51056160fa4a 540 case GAP_LIMITED_DISCOVERY_PROC:
Wolfgang Betz 132:51056160fa4a 541 case GAP_GENERAL_DISCOVERY_PROC:
Wolfgang Betz 132:51056160fa4a 542
Wolfgang Betz 132:51056160fa4a 543 BlueNRGGap::getInstance().Discovery_CB(BlueNRGGap::DISCOVERY_COMPLETE, 0, NULL, NULL, NULL, NULL, NULL);
Wolfgang Betz 132:51056160fa4a 544 break;
Wolfgang Betz 132:51056160fa4a 545 }
Wolfgang Betz 132:51056160fa4a 546 }
Wolfgang Betz 132:51056160fa4a 547 break;
Wolfgang Betz 132:51056160fa4a 548 }
Wolfgang Betz 132:51056160fa4a 549 }
Wolfgang Betz 132:51056160fa4a 550 break;
Wolfgang Betz 132:51056160fa4a 551 }
Wolfgang Betz 132:51056160fa4a 552 return ;
Wolfgang Betz 132:51056160fa4a 553 }
Wolfgang Betz 132:51056160fa4a 554
Wolfgang Betz 132:51056160fa4a 555
Wolfgang Betz 132:51056160fa4a 556 #ifdef __cplusplus
Wolfgang Betz 132:51056160fa4a 557 }
Wolfgang Betz 132:51056160fa4a 558 #endif