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:
Vincent Coubard
Date:
Thu Sep 15 10:51:31 2016 +0100
Branch:
5d71c4ee51a741fa3aabe0b7ad4b814d7bf27aee
Revision:
268:c0a1e03c5736
Parent:
267:cd7870e466b3
Child:
269:cd037b36a62b
Sync with 5d71c4ee51a741fa3aabe0b7ad4b814d7bf27aee

2016-07-12 15:18:12+01:00: Vincent Coubard
Fix set address function

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