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:
Andrea Palmieri
Date:
Tue Apr 26 14:33:08 2016 +0200
Revision:
227:624ae7aa567d
Parent:
223:36df860f7ffc
Child:
229:9981f62cdb1a
Fix Address Type

Signed-off-by: Andrea Palmieri <andrea.palmieri@st.com>

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
Andrea Palmieri 223:36df860f7ffc 75 // Stack Mode 0x04 allows Simultaneous Scanning and Advertisement (SSAdv)
Andrea Palmieri 223:36df860f7ffc 76 #define STACK_MODE (0x04)
Andrea Palmieri 220:e02936f0d4c7 77
Wolfgang Betz 132:51056160fa4a 78 void HCI_Input(tHciDataPacket * hciReadPacket);
Wolfgang Betz 132:51056160fa4a 79
Wolfgang Betz 132:51056160fa4a 80 uint16_t g_gap_service_handle = 0;
Wolfgang Betz 132:51056160fa4a 81 uint16_t g_appearance_char_handle = 0;
Wolfgang Betz 132:51056160fa4a 82 uint16_t g_device_name_char_handle = 0;
Wolfgang Betz 132:51056160fa4a 83
Wolfgang Betz 132:51056160fa4a 84 /* Private variables ---------------------------------------------------------*/
Wolfgang Betz 132:51056160fa4a 85 volatile uint8_t set_connectable = 1;
Andrea Palmieri 219:d8e8cd4d4521 86
Andrea Palmieri 219:d8e8cd4d4521 87 static char versionString[32];
Wolfgang Betz 132:51056160fa4a 88 uint8_t bnrg_expansion_board = IDB04A1; /* at startup, suppose the X-NUCLEO-IDB04A1 is used */
Wolfgang Betz 132:51056160fa4a 89
Wolfgang Betz 132:51056160fa4a 90 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 91 /*!
Wolfgang Betz 132:51056160fa4a 92 @brief Initialises BTLE and the underlying HW/Device
Wolfgang Betz 132:51056160fa4a 93 @param isSetAddress boolean if address has been set
Wolfgang Betz 132:51056160fa4a 94 @param mosi MOSI Pin
Wolfgang Betz 132:51056160fa4a 95 @param miso MISO Pin
Wolfgang Betz 132:51056160fa4a 96 @param sclk clock Pin
Wolfgang Betz 132:51056160fa4a 97 @returns void
Wolfgang Betz 132:51056160fa4a 98 */
Wolfgang Betz 132:51056160fa4a 99 /**************************************************************************/
Andrea Palmieri 219:d8e8cd4d4521 100 void btleInit(bool isSetAddress, uint8_t role)
Wolfgang Betz 132:51056160fa4a 101 {
Andrea Palmieri 219:d8e8cd4d4521 102 PRINTF("btleInit>>\n\r");
Wolfgang Betz 132:51056160fa4a 103
Wolfgang Betz 132:51056160fa4a 104 int ret;
Wolfgang Betz 132:51056160fa4a 105 uint8_t hwVersion;
Wolfgang Betz 132:51056160fa4a 106 uint16_t fwVersion;
Wolfgang Betz 132:51056160fa4a 107 uint16_t service_handle, dev_name_char_handle, appearance_char_handle;
Wolfgang Betz 132:51056160fa4a 108
Wolfgang Betz 132:51056160fa4a 109 /* Delay needed only to be able to acces the JTAG interface after reset
Wolfgang Betz 132:51056160fa4a 110 if it will be disabled later. */
Wolfgang Betz 132:51056160fa4a 111 Clock_Wait(500);
Wolfgang Betz 132:51056160fa4a 112
Wolfgang Betz 132:51056160fa4a 113 /* Initialize the BlueNRG HCI */
Wolfgang Betz 132:51056160fa4a 114 HCI_Init();
Wolfgang Betz 132:51056160fa4a 115
Wolfgang Betz 132:51056160fa4a 116 /* Reset BlueNRG SPI interface */
Wolfgang Betz 132:51056160fa4a 117 BlueNRG_RST();
Wolfgang Betz 132:51056160fa4a 118
Wolfgang Betz 132:51056160fa4a 119 /* get the BlueNRG HW and FW versions */
Wolfgang Betz 132:51056160fa4a 120 getBlueNRGVersion(&hwVersion, &fwVersion);
Wolfgang Betz 132:51056160fa4a 121
Wolfgang Betz 132:51056160fa4a 122 /*
Wolfgang Betz 132:51056160fa4a 123 * Reset BlueNRG again otherwise we won't
Wolfgang Betz 132:51056160fa4a 124 * be able to change its MAC address.
Wolfgang Betz 132:51056160fa4a 125 * aci_hal_write_config_data() must be the first
Wolfgang Betz 132:51056160fa4a 126 * command after reset otherwise it will fail.
Wolfgang Betz 132:51056160fa4a 127 */
Wolfgang Betz 132:51056160fa4a 128 BlueNRG_RST();
Wolfgang Betz 132:51056160fa4a 129
Wolfgang Betz 132:51056160fa4a 130 if (hwVersion > 0x30) { /* X-NUCLEO-IDB05A1 expansion board is used */
Wolfgang Betz 132:51056160fa4a 131 bnrg_expansion_board = IDB05A1;
Wolfgang Betz 132:51056160fa4a 132 }
Wolfgang Betz 132:51056160fa4a 133
Andrea Palmieri 219:d8e8cd4d4521 134 /* set BLE version string */
Andrea Palmieri 219:d8e8cd4d4521 135 setVersionString(hwVersion, fwVersion);
Andrea Palmieri 219:d8e8cd4d4521 136
Andrea Palmieri 220:e02936f0d4c7 137 if (bnrg_expansion_board == IDB05A1) {
Andrea Palmieri 220:e02936f0d4c7 138 uint8_t stackMode = STACK_MODE;
Andrea Palmieri 220:e02936f0d4c7 139 ret = aci_hal_write_config_data(CONFIG_DATA_ROLE,
Andrea Palmieri 220:e02936f0d4c7 140 CONFIG_DATA_ROLE_LEN,
Andrea Palmieri 220:e02936f0d4c7 141 &stackMode);
Andrea Palmieri 220:e02936f0d4c7 142 }
Andrea Palmieri 220:e02936f0d4c7 143
Wolfgang Betz 132:51056160fa4a 144 /* The Nucleo board must be configured as SERVER */
Andrea Palmieri 219:d8e8cd4d4521 145 //check if isSetAddress is set then set address.
Wolfgang Betz 132:51056160fa4a 146 // ANDREA
Andrea Palmieri 227:624ae7aa567d 147 #if 0
Wolfgang Betz 132:51056160fa4a 148 if(isSetAddress)
Wolfgang Betz 132:51056160fa4a 149 {
Andrea Palmieri 221:7896e6d8b652 150 Gap::Address_t bleAddr;
Andrea Palmieri 221:7896e6d8b652 151 Gap::AddressType_t addr_type;
Andrea Palmieri 221:7896e6d8b652 152
Wolfgang Betz 132:51056160fa4a 153 BlueNRGGap::getInstance().getAddress(&addr_type, bleAddr);
Andrea Palmieri 227:624ae7aa567d 154
Wolfgang Betz 132:51056160fa4a 155 ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
Wolfgang Betz 132:51056160fa4a 156 CONFIG_DATA_PUBADDR_LEN,
Andrea Palmieri 221:7896e6d8b652 157 bleAddr);
Wolfgang Betz 132:51056160fa4a 158 } else {
Wolfgang Betz 132:51056160fa4a 159
Wolfgang Betz 140:0cd922dca83c 160 const Gap::Address_t BLE_address_BE = {0xFD,0x66,0x05,0x13,0xBE,0xBA};
Andrea Palmieri 227:624ae7aa567d 161 BlueNRGGap::getInstance().setAddress(BLEProtocol::AddressType::RANDOM_STATIC, BLE_address_BE);
Wolfgang Betz 132:51056160fa4a 162
Wolfgang Betz 132:51056160fa4a 163 ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
Wolfgang Betz 132:51056160fa4a 164 CONFIG_DATA_PUBADDR_LEN,
Wolfgang Betz 132:51056160fa4a 165 BLE_address_BE);
Wolfgang Betz 132:51056160fa4a 166 }
Andrea Palmieri 227:624ae7aa567d 167 #endif
Wolfgang Betz 132:51056160fa4a 168
Wolfgang Betz 132:51056160fa4a 169 ret = aci_gatt_init();
Wolfgang Betz 132:51056160fa4a 170 if(ret){
Wolfgang Betz 132:51056160fa4a 171 PRINTF("GATT_Init failed.\n");
Wolfgang Betz 132:51056160fa4a 172 }
Wolfgang Betz 132:51056160fa4a 173 if (bnrg_expansion_board == IDB05A1) {
Andrea Palmieri 219:d8e8cd4d4521 174 ret = aci_gap_init_IDB05A1(GAP_PERIPHERAL_ROLE_IDB05A1|GAP_CENTRAL_ROLE_IDB05A1|GAP_OBSERVER_ROLE_IDB05A1, 0, 0x07, &service_handle, &dev_name_char_handle, &appearance_char_handle);
Wolfgang Betz 132:51056160fa4a 175 } else {
Wolfgang Betz 132:51056160fa4a 176 ret = aci_gap_init_IDB04A1(role, &service_handle, &dev_name_char_handle, &appearance_char_handle);
Wolfgang Betz 132:51056160fa4a 177 }
Wolfgang Betz 132:51056160fa4a 178
Wolfgang Betz 132:51056160fa4a 179 if(ret != BLE_STATUS_SUCCESS){
Wolfgang Betz 132:51056160fa4a 180 PRINTF("GAP_Init failed.\n");
Wolfgang Betz 132:51056160fa4a 181 }
Wolfgang Betz 132:51056160fa4a 182
Wolfgang Betz 132:51056160fa4a 183 //ANDREA -- FIXME: Security and passkey set by default
Wolfgang Betz 132:51056160fa4a 184 ret = aci_gap_set_auth_requirement(MITM_PROTECTION_REQUIRED,
Wolfgang Betz 132:51056160fa4a 185 OOB_AUTH_DATA_ABSENT,
Wolfgang Betz 132:51056160fa4a 186 NULL,
Wolfgang Betz 132:51056160fa4a 187 7,
Wolfgang Betz 132:51056160fa4a 188 16,
Wolfgang Betz 132:51056160fa4a 189 USE_FIXED_PIN_FOR_PAIRING,
Wolfgang Betz 132:51056160fa4a 190 123456,
Wolfgang Betz 132:51056160fa4a 191 BONDING);
Wolfgang Betz 132:51056160fa4a 192 if (ret == BLE_STATUS_SUCCESS) {
Wolfgang Betz 132:51056160fa4a 193 PRINTF("Auth Req set successfully.\n");
Wolfgang Betz 132:51056160fa4a 194 }
Wolfgang Betz 132:51056160fa4a 195
Wolfgang Betz 132:51056160fa4a 196 aci_hal_set_tx_power_level(1,4);
Wolfgang Betz 132:51056160fa4a 197
Wolfgang Betz 132:51056160fa4a 198 g_gap_service_handle = service_handle;
Wolfgang Betz 132:51056160fa4a 199 g_appearance_char_handle = appearance_char_handle;
Wolfgang Betz 132:51056160fa4a 200 g_device_name_char_handle = dev_name_char_handle;
Wolfgang Betz 132:51056160fa4a 201 //Device Name is set from Accumulate Adv Data Payload or through setDeviceName API
Wolfgang Betz 132:51056160fa4a 202 /*ret = aci_gatt_update_char_value(service_handle, dev_name_char_handle, 0,
Wolfgang Betz 132:51056160fa4a 203 strlen(name), (tHalUint8 *)name);*/
Wolfgang Betz 132:51056160fa4a 204
Wolfgang Betz 132:51056160fa4a 205 // Andrea: mbedOS
Wolfgang Betz 138:32e3c4ca7a45 206 #ifdef AST_FOR_MBED_OS
Wolfgang Betz 132:51056160fa4a 207 minar::Scheduler::postCallback(btle_handler);
Wolfgang Betz 132:51056160fa4a 208 #endif
Wolfgang Betz 132:51056160fa4a 209 return;
Wolfgang Betz 132:51056160fa4a 210 }
Wolfgang Betz 132:51056160fa4a 211
Wolfgang Betz 132:51056160fa4a 212 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 213 /*!
Wolfgang Betz 132:51056160fa4a 214 @brief Andrea: mbedOS
Wolfgang Betz 132:51056160fa4a 215
Wolfgang Betz 132:51056160fa4a 216 @param[in] void
Wolfgang Betz 132:51056160fa4a 217
Wolfgang Betz 132:51056160fa4a 218 @returns
Wolfgang Betz 132:51056160fa4a 219 */
Wolfgang Betz 132:51056160fa4a 220 /**************************************************************************/
Wolfgang Betz 138:32e3c4ca7a45 221 #ifdef AST_FOR_MBED_OS
Wolfgang Betz 134:d2f8d5898d04 222 int btle_handler_pending = 0;
Wolfgang Betz 134:d2f8d5898d04 223
Wolfgang Betz 133:1bb8df697f7f 224 void btle_handler(void)
Wolfgang Betz 132:51056160fa4a 225 {
Wolfgang Betz 134:d2f8d5898d04 226 btle_handler_pending = 0;
Wolfgang Betz 132:51056160fa4a 227 HCI_Process();
Wolfgang Betz 132:51056160fa4a 228 }
Wolfgang Betz 132:51056160fa4a 229 #endif
Wolfgang Betz 132:51056160fa4a 230
Andrea Palmieri 219:d8e8cd4d4521 231 /* set BLE Version string */
Andrea Palmieri 219:d8e8cd4d4521 232 void setVersionString(uint8_t hwVersion, uint16_t fwVersion)
Andrea Palmieri 219:d8e8cd4d4521 233 {
Andrea Palmieri 219:d8e8cd4d4521 234 if(bnrg_expansion_board == IDB04A1 || bnrg_expansion_board == IDB05A1) {
Andrea Palmieri 219:d8e8cd4d4521 235 snprintf(versionString, sizeof(versionString), "ST BLE4.1 HW v%u.%u FW v%u.%u",
Andrea Palmieri 219:d8e8cd4d4521 236 hwVersion>>4, (hwVersion&0x0F),
Andrea Palmieri 219:d8e8cd4d4521 237 fwVersion>>8, (fwVersion&0x00F0)>>4);
Andrea Palmieri 219:d8e8cd4d4521 238 } else {
Andrea Palmieri 219:d8e8cd4d4521 239 snprintf(versionString, sizeof(versionString), "ST (unknown spec)");
Andrea Palmieri 219:d8e8cd4d4521 240 }
Andrea Palmieri 219:d8e8cd4d4521 241 }
Andrea Palmieri 219:d8e8cd4d4521 242
Andrea Palmieri 219:d8e8cd4d4521 243 /* get BLE Version string */
Andrea Palmieri 219:d8e8cd4d4521 244 const char* getVersionString(void)
Andrea Palmieri 219:d8e8cd4d4521 245 {
Andrea Palmieri 219:d8e8cd4d4521 246 return versionString;
Andrea Palmieri 219:d8e8cd4d4521 247 }
Andrea Palmieri 219:d8e8cd4d4521 248
Andrea Palmieri 219:d8e8cd4d4521 249 tBleStatus btleStartRadioScan(uint8_t scan_type,
Andrea Palmieri 219:d8e8cd4d4521 250 uint16_t scan_interval,
Andrea Palmieri 219:d8e8cd4d4521 251 uint16_t scan_window,
Andrea Palmieri 219:d8e8cd4d4521 252 uint8_t own_address_type)
Andrea Palmieri 219:d8e8cd4d4521 253 {
Andrea Palmieri 219:d8e8cd4d4521 254 tBleStatus ret;
Andrea Palmieri 219:d8e8cd4d4521 255
Andrea Palmieri 219:d8e8cd4d4521 256 // Observer role is not supported by X-NUCLEO-IDB04A1, return BLE_ERROR_NOT_IMPLEMENTED
Andrea Palmieri 219:d8e8cd4d4521 257 if(bnrg_expansion_board == IDB05A1) {
Andrea Palmieri 220:e02936f0d4c7 258 PRINTF("scan_interval=%d scan_window=%d\n\r", scan_interval, scan_window);
Andrea Palmieri 219:d8e8cd4d4521 259 ret = aci_gap_start_observation_procedure(scan_interval,
Andrea Palmieri 220:e02936f0d4c7 260 scan_window,
Andrea Palmieri 219:d8e8cd4d4521 261 scan_type,
Andrea Palmieri 220:e02936f0d4c7 262 own_address_type,
Andrea Palmieri 219:d8e8cd4d4521 263 1); // 1 to filter duplicates
Andrea Palmieri 219:d8e8cd4d4521 264 } else {
Andrea Palmieri 219:d8e8cd4d4521 265 ret = BLE_STATUS_INVALID_CID;
Andrea Palmieri 219:d8e8cd4d4521 266 }
Andrea Palmieri 219:d8e8cd4d4521 267
Andrea Palmieri 219:d8e8cd4d4521 268 return ret;
Andrea Palmieri 219:d8e8cd4d4521 269
Andrea Palmieri 219:d8e8cd4d4521 270 }
Wolfgang Betz 132:51056160fa4a 271
Wolfgang Betz 132:51056160fa4a 272 /*!
Wolfgang Betz 132:51056160fa4a 273 @brief Not Used
Wolfgang Betz 132:51056160fa4a 274
Wolfgang Betz 132:51056160fa4a 275 @param[in] void
Wolfgang Betz 132:51056160fa4a 276
Wolfgang Betz 132:51056160fa4a 277 @returns
Wolfgang Betz 132:51056160fa4a 278 */
Wolfgang Betz 132:51056160fa4a 279 void SPI_Poll(void)
Wolfgang Betz 132:51056160fa4a 280 {
Wolfgang Betz 132:51056160fa4a 281 //HAL_GPIO_EXTI_Callback_Poll(BNRG_SPI_EXTI_PIN);
Wolfgang Betz 132:51056160fa4a 282 return;
Wolfgang Betz 132:51056160fa4a 283 }
Wolfgang Betz 132:51056160fa4a 284
Wolfgang Betz 132:51056160fa4a 285 void Attribute_Modified_CB(uint16_t attr_handle, uint8_t data_length, uint8_t *att_data, uint8_t offset)
Wolfgang Betz 132:51056160fa4a 286 {
Wolfgang Betz 132:51056160fa4a 287 //Extract the GattCharacteristic from p_characteristics[] and find the properties mask
Wolfgang Betz 132:51056160fa4a 288 GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(attr_handle);
Wolfgang Betz 132:51056160fa4a 289 if(p_char!=NULL) {
Wolfgang Betz 132:51056160fa4a 290 GattAttribute::Handle_t charHandle = p_char->getValueAttribute().getHandle();
Wolfgang Betz 132:51056160fa4a 291 BlueNRGGattServer::HandleEnum_t currentHandle = BlueNRGGattServer::CHAR_HANDLE;
Wolfgang Betz 132:51056160fa4a 292 PRINTF("CharHandle %d, length: %d, Data: %d\n\r", charHandle, data_length, (uint16_t)att_data[0]);
Wolfgang Betz 132:51056160fa4a 293 PRINTF("getProperties 0x%x\n\r",p_char->getProperties());
Wolfgang Betz 132:51056160fa4a 294 if(attr_handle == charHandle+CHAR_VALUE_OFFSET) {
Wolfgang Betz 132:51056160fa4a 295 currentHandle = BlueNRGGattServer::CHAR_VALUE_HANDLE;
Wolfgang Betz 132:51056160fa4a 296 }
Wolfgang Betz 132:51056160fa4a 297
Wolfgang Betz 132:51056160fa4a 298 if(attr_handle == charHandle+CHAR_DESC_OFFSET) {
Wolfgang Betz 132:51056160fa4a 299 currentHandle = BlueNRGGattServer::CHAR_DESC_HANDLE;
Wolfgang Betz 132:51056160fa4a 300 }
Wolfgang Betz 132:51056160fa4a 301 PRINTF("currentHandle %d\n\r", currentHandle);
Wolfgang Betz 132:51056160fa4a 302 if((p_char->getProperties() &
Wolfgang Betz 132:51056160fa4a 303 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) &&
Wolfgang Betz 132:51056160fa4a 304 currentHandle == BlueNRGGattServer::CHAR_DESC_HANDLE) {
Wolfgang Betz 132:51056160fa4a 305
Wolfgang Betz 132:51056160fa4a 306 PRINTF("*****NOTIFICATION CASE\n\r");
Wolfgang Betz 132:51056160fa4a 307 //Now Check if data written in Enable or Disable
Wolfgang Betz 132:51056160fa4a 308 if((uint16_t)att_data[0]==1) {
Wolfgang Betz 132:51056160fa4a 309 //PRINTF("Notify ENABLED\n\r");
Wolfgang Betz 132:51056160fa4a 310 BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_ENABLED, p_char->getValueAttribute().getHandle());
Wolfgang Betz 132:51056160fa4a 311 } else {
Wolfgang Betz 132:51056160fa4a 312 //PRINTF("Notify DISABLED\n\r");
Wolfgang Betz 132:51056160fa4a 313 BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_DISABLED, p_char->getValueAttribute().getHandle());
Wolfgang Betz 132:51056160fa4a 314 }
Wolfgang Betz 132:51056160fa4a 315 }
Wolfgang Betz 132:51056160fa4a 316
Wolfgang Betz 132:51056160fa4a 317 //Check is attr handle property is WRITEABLE, if yes, generate GATT_EVENT_DATA_WRITTEN Event
Wolfgang Betz 132:51056160fa4a 318 if((p_char->getProperties() &
Wolfgang Betz 132:51056160fa4a 319 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE)) &&
Wolfgang Betz 132:51056160fa4a 320 currentHandle == BlueNRGGattServer::CHAR_VALUE_HANDLE) {
Wolfgang Betz 132:51056160fa4a 321
Wolfgang Betz 132:51056160fa4a 322 PRINTF("*****WRITE CASE\n\r");
Wolfgang Betz 132:51056160fa4a 323
Wolfgang Betz 132:51056160fa4a 324 GattWriteCallbackParams writeParams;
Wolfgang Betz 132:51056160fa4a 325 writeParams.handle = p_char->getValueAttribute().getHandle();
Wolfgang Betz 132:51056160fa4a 326 writeParams.writeOp = GattWriteCallbackParams::OP_WRITE_REQ;//Where to find this property in BLUENRG?
Wolfgang Betz 132:51056160fa4a 327 writeParams.len = data_length;
Wolfgang Betz 132:51056160fa4a 328 writeParams.data = att_data;
Wolfgang Betz 132:51056160fa4a 329 if (bnrg_expansion_board == IDB05A1) {
Wolfgang Betz 132:51056160fa4a 330 writeParams.offset = offset;
Wolfgang Betz 132:51056160fa4a 331 } else {
Wolfgang Betz 132:51056160fa4a 332 writeParams.offset = 0;
Wolfgang Betz 132:51056160fa4a 333 }
Wolfgang Betz 132:51056160fa4a 334 BlueNRGGattServer::getInstance().HCIDataWrittenEvent(&writeParams);
Wolfgang Betz 132:51056160fa4a 335
Wolfgang Betz 132:51056160fa4a 336 //BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_WRITTEN, evt->attr_handle);
Wolfgang Betz 132:51056160fa4a 337 //Write the actual Data to the Attr Handle? (uint8_1[])att_data contains the data
Andrea Palmieri 202:caf4864292c1 338 if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getLength() > 0)) {
Wolfgang Betz 132:51056160fa4a 339 BlueNRGGattServer::getInstance().write(p_char->getValueAttribute().getHandle(), (uint8_t*)att_data, data_length, false);
Wolfgang Betz 132:51056160fa4a 340 }
Wolfgang Betz 132:51056160fa4a 341 }
Wolfgang Betz 132:51056160fa4a 342 }
Wolfgang Betz 132:51056160fa4a 343
Wolfgang Betz 132:51056160fa4a 344 }
Wolfgang Betz 132:51056160fa4a 345
Wolfgang Betz 132:51056160fa4a 346 #ifdef __cplusplus
Wolfgang Betz 132:51056160fa4a 347 extern "C" {
Wolfgang Betz 132:51056160fa4a 348 #endif
Wolfgang Betz 132:51056160fa4a 349
Wolfgang Betz 132:51056160fa4a 350 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 351 /*!
Wolfgang Betz 132:51056160fa4a 352 @brief Handle HCI Stack Event
Wolfgang Betz 132:51056160fa4a 353
Wolfgang Betz 132:51056160fa4a 354 @param[in] pckt
Wolfgang Betz 132:51056160fa4a 355 Event Packet sent by the stack to be decoded
Wolfgang Betz 132:51056160fa4a 356
Wolfgang Betz 132:51056160fa4a 357 @returns
Wolfgang Betz 132:51056160fa4a 358 */
Wolfgang Betz 132:51056160fa4a 359 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 360 extern void HCI_Event_CB(void *pckt) {
Wolfgang Betz 132:51056160fa4a 361 hci_uart_pckt *hci_pckt = (hci_uart_pckt*)pckt;
Wolfgang Betz 132:51056160fa4a 362 hci_event_pckt *event_pckt = (hci_event_pckt*)hci_pckt->data;
Wolfgang Betz 132:51056160fa4a 363
Wolfgang Betz 132:51056160fa4a 364 if(hci_pckt->type != HCI_EVENT_PKT)
Andrea Palmieri 221:7896e6d8b652 365 return;
Wolfgang Betz 132:51056160fa4a 366
Wolfgang Betz 132:51056160fa4a 367 switch(event_pckt->evt){
Wolfgang Betz 132:51056160fa4a 368
Wolfgang Betz 132:51056160fa4a 369 case EVT_DISCONN_COMPLETE:
Wolfgang Betz 132:51056160fa4a 370 {
Wolfgang Betz 132:51056160fa4a 371 PRINTF("EVT_DISCONN_COMPLETE\n");
Wolfgang Betz 132:51056160fa4a 372
Andrea Palmieri 221:7896e6d8b652 373 evt_disconn_complete *evt = (evt_disconn_complete*)event_pckt->data;
Wolfgang Betz 132:51056160fa4a 374
Andrea Palmieri 221:7896e6d8b652 375 BlueNRGGap::getInstance().processDisconnectionEvent(evt->handle, (Gap::DisconnectionReason_t)evt->reason);
Wolfgang Betz 132:51056160fa4a 376 }
Wolfgang Betz 132:51056160fa4a 377 break;
Wolfgang Betz 132:51056160fa4a 378
Wolfgang Betz 132:51056160fa4a 379 case EVT_LE_META_EVENT:
Wolfgang Betz 132:51056160fa4a 380 {
Wolfgang Betz 132:51056160fa4a 381 PRINTF("EVT_LE_META_EVENT\n");
Wolfgang Betz 132:51056160fa4a 382
Wolfgang Betz 132:51056160fa4a 383 evt_le_meta_event *evt = (evt_le_meta_event *)event_pckt->data;
Wolfgang Betz 132:51056160fa4a 384
Wolfgang Betz 132:51056160fa4a 385 switch(evt->subevent){
Wolfgang Betz 132:51056160fa4a 386 // ANDREA
Wolfgang Betz 132:51056160fa4a 387 case EVT_LE_CONN_COMPLETE:
Wolfgang Betz 132:51056160fa4a 388 {
Wolfgang Betz 132:51056160fa4a 389 PRINTF("EVT_LE_CONN_COMPLETE\n");
Andrea Palmieri 221:7896e6d8b652 390 Gap::Address_t ownAddr;
Andrea Palmieri 221:7896e6d8b652 391 Gap::AddressType_t ownAddrType;
Andrea Palmieri 221:7896e6d8b652 392 BlueNRGGap::getInstance().getAddress(&ownAddrType, ownAddr);
Andrea Palmieri 221:7896e6d8b652 393
Andrea Palmieri 227:624ae7aa567d 394 Gap::AddressType_t peerAddrType = BLEProtocol::AddressType::RANDOM_STATIC;
Wolfgang Betz 132:51056160fa4a 395 Gap::Role_t role;
Wolfgang Betz 132:51056160fa4a 396
Wolfgang Betz 132:51056160fa4a 397 evt_le_connection_complete *cc = (evt_le_connection_complete *)evt->data;
Wolfgang Betz 132:51056160fa4a 398
Wolfgang Betz 132:51056160fa4a 399 BlueNRGGap::getInstance().setConnectionHandle(cc->handle);
Wolfgang Betz 132:51056160fa4a 400 BlueNRGGap::ConnectionParams_t connectionParams;
Wolfgang Betz 132:51056160fa4a 401 BlueNRGGap::getInstance().getPreferredConnectionParams(&connectionParams);
Wolfgang Betz 132:51056160fa4a 402 switch (cc->peer_bdaddr_type) {
Wolfgang Betz 132:51056160fa4a 403 case PUBLIC_ADDR:
Andrea Palmieri 210:08c4c85ca679 404 peerAddrType = BLEProtocol::AddressType::PUBLIC;
Wolfgang Betz 132:51056160fa4a 405 break;
Wolfgang Betz 132:51056160fa4a 406 case STATIC_RANDOM_ADDR:
Andrea Palmieri 210:08c4c85ca679 407 peerAddrType = BLEProtocol::AddressType::RANDOM_STATIC;
Wolfgang Betz 132:51056160fa4a 408 break;
Wolfgang Betz 132:51056160fa4a 409 case RESOLVABLE_PRIVATE_ADDR:
Andrea Palmieri 210:08c4c85ca679 410 peerAddrType = BLEProtocol::AddressType::RANDOM_PRIVATE_RESOLVABLE;
Wolfgang Betz 132:51056160fa4a 411 break;
Wolfgang Betz 132:51056160fa4a 412 case NON_RESOLVABLE_PRIVATE_ADDR:
Andrea Palmieri 210:08c4c85ca679 413 peerAddrType = BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE;
Wolfgang Betz 132:51056160fa4a 414 break;
Wolfgang Betz 132:51056160fa4a 415 }
Wolfgang Betz 132:51056160fa4a 416 //PRINTF("EVT_LE_CONN_COMPLETE LL role=%d\n", cc->role);
Wolfgang Betz 132:51056160fa4a 417 switch (cc->role) {
Wolfgang Betz 133:1bb8df697f7f 418 case 0: //master
Wolfgang Betz 132:51056160fa4a 419 role = Gap::CENTRAL;
Wolfgang Betz 132:51056160fa4a 420 break;
Wolfgang Betz 133:1bb8df697f7f 421 case 1:
Wolfgang Betz 132:51056160fa4a 422 role = Gap::PERIPHERAL;
Wolfgang Betz 132:51056160fa4a 423 break;
Wolfgang Betz 133:1bb8df697f7f 424 default:
Wolfgang Betz 139:3a75965fd389 425 role = Gap::PERIPHERAL;
Wolfgang Betz 133:1bb8df697f7f 426 break;
Wolfgang Betz 132:51056160fa4a 427 }
Wolfgang Betz 132:51056160fa4a 428 //PRINTF("EVT_LE_CONN_COMPLETE GAP role=%d\n", role);
Andrea Palmieri 221:7896e6d8b652 429 BlueNRGGap::getInstance().processConnectionEvent(cc->handle,
Andrea Palmieri 221:7896e6d8b652 430 role,
Andrea Palmieri 221:7896e6d8b652 431 peerAddrType,
Andrea Palmieri 221:7896e6d8b652 432 cc->peer_bdaddr,
Andrea Palmieri 221:7896e6d8b652 433 ownAddrType,
Andrea Palmieri 221:7896e6d8b652 434 ownAddr,
Andrea Palmieri 221:7896e6d8b652 435 &connectionParams);
Wolfgang Betz 132:51056160fa4a 436 }
Wolfgang Betz 132:51056160fa4a 437 break;
Wolfgang Betz 132:51056160fa4a 438
Wolfgang Betz 132:51056160fa4a 439 case EVT_LE_ADVERTISING_REPORT:
Wolfgang Betz 132:51056160fa4a 440 PRINTF("EVT_LE_ADVERTISING_REPORT\n\r");
Wolfgang Betz 132:51056160fa4a 441 /* FIXME: comment this otherwise it will be obscure and error prone if BlueNRG FW will be updated */
Wolfgang Betz 132:51056160fa4a 442 // 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 443 // Formally the structure related to both events are identical except that for the ADV REPORT
Wolfgang Betz 132:51056160fa4a 444 // there is one more field (number of reports) which is not forwarded to upper layer.
Wolfgang Betz 132:51056160fa4a 445 // Thus we need to move one byte over (((uint8_t*)evt->data)+1) before persing the ADV REPORT.
Wolfgang Betz 132:51056160fa4a 446 le_advertising_info *pr = (le_advertising_info*) (((uint8_t*)evt->data)+1);
Wolfgang Betz 132:51056160fa4a 447 PRINTF("EVT_LE_ADVERTISING_REPORT evt_type=%d\n\r", pr->evt_type);
Wolfgang Betz 132:51056160fa4a 448
Wolfgang Betz 132:51056160fa4a 449 BlueNRGGap::getInstance().Discovery_CB(BlueNRGGap::DEVICE_FOUND,
Wolfgang Betz 132:51056160fa4a 450 pr->evt_type,
Wolfgang Betz 132:51056160fa4a 451 &pr->bdaddr_type,
Wolfgang Betz 132:51056160fa4a 452 pr->bdaddr,
Wolfgang Betz 132:51056160fa4a 453 &pr->data_length,
Wolfgang Betz 132:51056160fa4a 454 &pr->data_RSSI[0],
Wolfgang Betz 132:51056160fa4a 455 &pr->data_RSSI[pr->data_length]);
Wolfgang Betz 132:51056160fa4a 456 break;
Wolfgang Betz 132:51056160fa4a 457 }
Wolfgang Betz 132:51056160fa4a 458 }
Wolfgang Betz 132:51056160fa4a 459 break;
Wolfgang Betz 132:51056160fa4a 460
Wolfgang Betz 132:51056160fa4a 461 case EVT_VENDOR:
Wolfgang Betz 132:51056160fa4a 462 {
Wolfgang Betz 132:51056160fa4a 463 evt_blue_aci *blue_evt = (evt_blue_aci*)event_pckt->data;
Wolfgang Betz 132:51056160fa4a 464 //PRINTF("EVT_VENDOR %d\n", blue_evt->ecode);
Wolfgang Betz 132:51056160fa4a 465
Wolfgang Betz 132:51056160fa4a 466 switch(blue_evt->ecode){
Wolfgang Betz 132:51056160fa4a 467
Wolfgang Betz 132:51056160fa4a 468 case EVT_BLUE_GATT_READ_PERMIT_REQ:
Wolfgang Betz 132:51056160fa4a 469 {
Wolfgang Betz 132:51056160fa4a 470 PRINTF("EVT_BLUE_GATT_READ_PERMIT_REQ_OK\n\r");
Wolfgang Betz 132:51056160fa4a 471 evt_gatt_read_permit_req *pr = (evt_gatt_read_permit_req*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 472 BlueNRGGattServer::getInstance().Read_Request_CB(pr->attr_handle-CHAR_VALUE_OFFSET);
Wolfgang Betz 132:51056160fa4a 473 }
Wolfgang Betz 132:51056160fa4a 474 break;
Wolfgang Betz 132:51056160fa4a 475
Wolfgang Betz 132:51056160fa4a 476 case EVT_BLUE_GATT_ATTRIBUTE_MODIFIED:
Wolfgang Betz 132:51056160fa4a 477 {
Wolfgang Betz 132:51056160fa4a 478 PRINTF("EVT_BLUE_GATT_ATTRIBUTE_MODIFIED\n\r");
Wolfgang Betz 132:51056160fa4a 479 /* this callback is invoked when a GATT attribute is modified
Wolfgang Betz 132:51056160fa4a 480 extract callback data and pass to suitable handler function */
Wolfgang Betz 132:51056160fa4a 481 if (bnrg_expansion_board == IDB05A1) {
Wolfgang Betz 132:51056160fa4a 482 evt_gatt_attr_modified_IDB05A1 *evt = (evt_gatt_attr_modified_IDB05A1*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 483 Attribute_Modified_CB(evt->attr_handle, evt->data_length, evt->att_data, evt->offset);
Wolfgang Betz 132:51056160fa4a 484 } else {
Wolfgang Betz 132:51056160fa4a 485 evt_gatt_attr_modified_IDB04A1 *evt = (evt_gatt_attr_modified_IDB04A1*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 486 Attribute_Modified_CB(evt->attr_handle, evt->data_length, evt->att_data, 0);
Wolfgang Betz 132:51056160fa4a 487 }
Wolfgang Betz 132:51056160fa4a 488 }
Wolfgang Betz 132:51056160fa4a 489 break;
Wolfgang Betz 132:51056160fa4a 490
Wolfgang Betz 132:51056160fa4a 491 //Any cases for Data Sent Notifications?
Wolfgang Betz 132:51056160fa4a 492 case EVT_BLUE_GATT_NOTIFICATION:
Wolfgang Betz 132:51056160fa4a 493 //This is only relevant for Client Side Event
Wolfgang Betz 132:51056160fa4a 494 PRINTF("EVT_BLUE_GATT_NOTIFICATION");
Wolfgang Betz 132:51056160fa4a 495 break;
Wolfgang Betz 132:51056160fa4a 496 case EVT_BLUE_GATT_INDICATION:
Wolfgang Betz 132:51056160fa4a 497 //This is only relevant for Client Side Event
Wolfgang Betz 132:51056160fa4a 498 PRINTF("EVT_BLUE_GATT_INDICATION");
Wolfgang Betz 132:51056160fa4a 499 break;
Wolfgang Betz 132:51056160fa4a 500
Wolfgang Betz 132:51056160fa4a 501 case EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP:
Wolfgang Betz 132:51056160fa4a 502 {
Wolfgang Betz 132:51056160fa4a 503 PRINTF("EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 504 evt_att_read_by_group_resp *pr = (evt_att_read_by_group_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 505 BlueNRGGattClient::getInstance().primaryServicesCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 506 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 507 pr->attribute_data_length,
Wolfgang Betz 132:51056160fa4a 508 pr->attribute_data_list);
Wolfgang Betz 132:51056160fa4a 509 }
Wolfgang Betz 132:51056160fa4a 510 break;
Wolfgang Betz 132:51056160fa4a 511 case EVT_BLUE_ATT_READ_BY_TYPE_RESP:
Wolfgang Betz 132:51056160fa4a 512 {
Wolfgang Betz 132:51056160fa4a 513 PRINTF("EVT_BLUE_ATT_READ_BY_TYPE_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 514 evt_att_read_by_type_resp *pr = (evt_att_read_by_type_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 515 BlueNRGGattClient::getInstance().serviceCharsCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 516 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 517 pr->handle_value_pair_length,
Wolfgang Betz 132:51056160fa4a 518 pr->handle_value_pair);
Wolfgang Betz 132:51056160fa4a 519 }
Wolfgang Betz 132:51056160fa4a 520 break;
Wolfgang Betz 132:51056160fa4a 521 case EVT_BLUE_ATT_READ_RESP:
Wolfgang Betz 132:51056160fa4a 522 {
Wolfgang Betz 132:51056160fa4a 523 PRINTF("EVT_BLUE_ATT_READ_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 524 evt_att_read_resp *pr = (evt_att_read_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 525 BlueNRGGattClient::getInstance().charReadCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 526 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 527 pr->attribute_value);
Wolfgang Betz 132:51056160fa4a 528 }
Wolfgang Betz 132:51056160fa4a 529 break;
Wolfgang Betz 132:51056160fa4a 530 case EVT_BLUE_ATT_EXEC_WRITE_RESP:
Wolfgang Betz 132:51056160fa4a 531 {
Wolfgang Betz 132:51056160fa4a 532 PRINTF("EVT_BLUE_ATT_EXEC_WRITE_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 533 evt_att_prepare_write_resp *pr = (evt_att_prepare_write_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 534 BlueNRGGattClient::getInstance().charWriteExecCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 535 pr->event_data_length);
Wolfgang Betz 132:51056160fa4a 536 }
Wolfgang Betz 132:51056160fa4a 537 break;
Wolfgang Betz 132:51056160fa4a 538 case EVT_BLUE_ATT_PREPARE_WRITE_RESP:
Wolfgang Betz 132:51056160fa4a 539 {
Wolfgang Betz 132:51056160fa4a 540 PRINTF("EVT_BLUE_ATT_PREPARE_WRITE_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 541 evt_att_prepare_write_resp *pr = (evt_att_prepare_write_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 542 BlueNRGGattClient::getInstance().charWritePrepareCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 543 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 544 pr->attribute_handle,
Wolfgang Betz 132:51056160fa4a 545 pr->offset,
Wolfgang Betz 132:51056160fa4a 546 pr->part_attr_value);
Wolfgang Betz 132:51056160fa4a 547 }
Wolfgang Betz 132:51056160fa4a 548 break;
Wolfgang Betz 132:51056160fa4a 549 case EVT_BLUE_GATT_DISC_READ_CHAR_BY_UUID_RESP:
Wolfgang Betz 132:51056160fa4a 550 {
Wolfgang Betz 132:51056160fa4a 551 PRINTF("EVT_BLUE_GATT_DISC_READ_CHAR_BY_UUID_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 552 evt_gatt_disc_read_char_by_uuid_resp *pr = (evt_gatt_disc_read_char_by_uuid_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 553 BlueNRGGattClient::getInstance().serviceCharByUUIDCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 554 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 555 pr->attr_handle,
Wolfgang Betz 132:51056160fa4a 556 pr->attr_value);
Wolfgang Betz 132:51056160fa4a 557 }
Wolfgang Betz 132:51056160fa4a 558 break;
Wolfgang Betz 132:51056160fa4a 559 case EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP:
Wolfgang Betz 132:51056160fa4a 560 {
Wolfgang Betz 132:51056160fa4a 561 PRINTF("EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP\n\r");
Wolfgang Betz 132:51056160fa4a 562 evt_att_find_by_type_val_resp *pr = (evt_att_find_by_type_val_resp*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 563 BlueNRGGattClient::getInstance().primaryServiceCB(pr->conn_handle,
Wolfgang Betz 132:51056160fa4a 564 pr->event_data_length,
Wolfgang Betz 132:51056160fa4a 565 pr->handles_info_list);
Wolfgang Betz 132:51056160fa4a 566 }
Wolfgang Betz 132:51056160fa4a 567 break;
Wolfgang Betz 132:51056160fa4a 568 case EVT_BLUE_GATT_PROCEDURE_COMPLETE:
Wolfgang Betz 132:51056160fa4a 569 {
Wolfgang Betz 132:51056160fa4a 570 //PRINTF("EVT_BLUE_GATT_PROCEDURE_COMPLETE\n\r");
Wolfgang Betz 132:51056160fa4a 571 evt_gatt_procedure_complete *evt = (evt_gatt_procedure_complete*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 572 PRINTF("EVT_BLUE_GATT_PROCEDURE_COMPLETE error_code=%d\n\r", evt->error_code);
Wolfgang Betz 132:51056160fa4a 573 BlueNRGGattClient::getInstance().gattProcedureCompleteCB(evt->conn_handle, evt->error_code);
Wolfgang Betz 132:51056160fa4a 574 }
Wolfgang Betz 132:51056160fa4a 575 break;
Wolfgang Betz 132:51056160fa4a 576
Wolfgang Betz 132:51056160fa4a 577 case EVT_BLUE_GAP_DEVICE_FOUND:
Wolfgang Betz 132:51056160fa4a 578 {
Wolfgang Betz 132:51056160fa4a 579 PRINTF("EVT_BLUE_GAP_DEVICE_FOUND\n\r");
Wolfgang Betz 132:51056160fa4a 580 evt_gap_device_found *pr = (evt_gap_device_found*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 581 PRINTF("EVT_BLUE_GAP_DEVICE_FOUND evt_type=%d\n\r", pr->evt_type);
Wolfgang Betz 132:51056160fa4a 582
Wolfgang Betz 132:51056160fa4a 583 BlueNRGGap::getInstance().Discovery_CB(BlueNRGGap::DEVICE_FOUND,
Wolfgang Betz 132:51056160fa4a 584 pr->evt_type,
Wolfgang Betz 132:51056160fa4a 585 &pr->bdaddr_type,
Wolfgang Betz 132:51056160fa4a 586 pr->bdaddr,
Wolfgang Betz 132:51056160fa4a 587 &pr->data_length,
Wolfgang Betz 132:51056160fa4a 588 &pr->data_RSSI[0],
Wolfgang Betz 132:51056160fa4a 589 &pr->data_RSSI[pr->data_length]);
Wolfgang Betz 132:51056160fa4a 590 }
Wolfgang Betz 132:51056160fa4a 591 break;
Wolfgang Betz 132:51056160fa4a 592
Wolfgang Betz 132:51056160fa4a 593 case EVT_BLUE_GAP_PROCEDURE_COMPLETE:
Wolfgang Betz 132:51056160fa4a 594 {
Wolfgang Betz 132:51056160fa4a 595 evt_gap_procedure_complete *pr = (evt_gap_procedure_complete*)blue_evt->data;
Wolfgang Betz 132:51056160fa4a 596 //printf("EVT_BLUE_GAP_PROCEDURE_COMPLETE (code=0x%02X)\n\r", pr->procedure_code);
Wolfgang Betz 132:51056160fa4a 597
Wolfgang Betz 132:51056160fa4a 598 switch(pr->procedure_code) {
Andrea Palmieri 219:d8e8cd4d4521 599 case GAP_OBSERVATION_PROC_IDB05A1:
Wolfgang Betz 132:51056160fa4a 600
Wolfgang Betz 132:51056160fa4a 601 BlueNRGGap::getInstance().Discovery_CB(BlueNRGGap::DISCOVERY_COMPLETE, 0, NULL, NULL, NULL, NULL, NULL);
Wolfgang Betz 132:51056160fa4a 602 break;
Wolfgang Betz 132:51056160fa4a 603 }
Wolfgang Betz 132:51056160fa4a 604 }
Wolfgang Betz 132:51056160fa4a 605 break;
Wolfgang Betz 132:51056160fa4a 606 }
Wolfgang Betz 132:51056160fa4a 607 }
Wolfgang Betz 132:51056160fa4a 608 break;
Wolfgang Betz 132:51056160fa4a 609 }
Wolfgang Betz 132:51056160fa4a 610 return ;
Wolfgang Betz 132:51056160fa4a 611 }
Wolfgang Betz 132:51056160fa4a 612
Wolfgang Betz 132:51056160fa4a 613
Wolfgang Betz 132:51056160fa4a 614 #ifdef __cplusplus
Wolfgang Betz 132:51056160fa4a 615 }
Wolfgang Betz 132:51056160fa4a 616 #endif