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:
Mon Jun 20 14:42:11 2016 +0200
Revision:
241:c13c2e31316d
Parent:
235:31b976a40f43
Child:
245:6830f71c197c
Add macro for IDB0XA1 Stack Mode

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