Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of X_NUCLEO_IDB0XA1 by
source/platform/btle.cpp@253:9665a6f8bbdb, 2016-09-15 (annotated)
- Committer:
- Vincent Coubard
- Date:
- Thu Sep 15 10:49:39 2016 +0100
- Branch:
- sync_with_github
- Revision:
- 253:9665a6f8bbdb
- Parent:
- 245:6830f71c197c
- Child:
- 256:146bb175ce80
- Child:
- 264:1e754a01869e
Sync with 4607c9b8b84bb61287ac96092cab09641a8e8c37\nMinor adjustements to sync with the github repository at this point in time.
Who changed what in which revision?
User | Revision | Line number | New 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>© 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 | /*! |
Antonio Vilei |
245:6830f71c197c | 93 | @brief Init the BTLE stack with the specified role |
Wolfgang Betz |
132:51056160fa4a | 94 | @param isSetAddress boolean if address has been set |
Antonio Vilei |
245:6830f71c197c | 95 | @param role The device role |
Wolfgang Betz |
132:51056160fa4a | 96 | @returns void |
Wolfgang Betz |
132:51056160fa4a | 97 | */ |
Wolfgang Betz |
132:51056160fa4a | 98 | /**************************************************************************/ |
Andrea Palmieri |
219:d8e8cd4d4521 | 99 | void btleInit(bool isSetAddress, uint8_t role) |
Wolfgang Betz |
132:51056160fa4a | 100 | { |
Andrea Palmieri |
219:d8e8cd4d4521 | 101 | PRINTF("btleInit>>\n\r"); |
Andrea Palmieri |
229:9981f62cdb1a | 102 | /* Avoid compiler warnings about unused variables. */ |
Andrea Palmieri |
229:9981f62cdb1a | 103 | (void)isSetAddress; |
Wolfgang Betz |
132:51056160fa4a | 104 | |
Wolfgang Betz |
132:51056160fa4a | 105 | int ret; |
Wolfgang Betz |
132:51056160fa4a | 106 | uint8_t hwVersion; |
Wolfgang Betz |
132:51056160fa4a | 107 | uint16_t fwVersion; |
Wolfgang Betz |
132:51056160fa4a | 108 | uint16_t service_handle, dev_name_char_handle, appearance_char_handle; |
Wolfgang Betz |
132:51056160fa4a | 109 | |
Wolfgang Betz |
132:51056160fa4a | 110 | /* Reset BlueNRG SPI interface */ |
Wolfgang Betz |
132:51056160fa4a | 111 | BlueNRG_RST(); |
Wolfgang Betz |
132:51056160fa4a | 112 | |
Wolfgang Betz |
132:51056160fa4a | 113 | /* get the BlueNRG HW and FW versions */ |
Wolfgang Betz |
132:51056160fa4a | 114 | getBlueNRGVersion(&hwVersion, &fwVersion); |
Wolfgang Betz |
132:51056160fa4a | 115 | |
Wolfgang Betz |
132:51056160fa4a | 116 | /* |
Wolfgang Betz |
132:51056160fa4a | 117 | * Reset BlueNRG again otherwise we won't |
Wolfgang Betz |
132:51056160fa4a | 118 | * be able to change its MAC address. |
Wolfgang Betz |
132:51056160fa4a | 119 | * aci_hal_write_config_data() must be the first |
Wolfgang Betz |
132:51056160fa4a | 120 | * command after reset otherwise it will fail. |
Wolfgang Betz |
132:51056160fa4a | 121 | */ |
Wolfgang Betz |
132:51056160fa4a | 122 | BlueNRG_RST(); |
Wolfgang Betz |
132:51056160fa4a | 123 | |
Wolfgang Betz |
132:51056160fa4a | 124 | if (hwVersion > 0x30) { /* X-NUCLEO-IDB05A1 expansion board is used */ |
Wolfgang Betz |
132:51056160fa4a | 125 | bnrg_expansion_board = IDB05A1; |
Wolfgang Betz |
132:51056160fa4a | 126 | } |
Wolfgang Betz |
132:51056160fa4a | 127 | |
Andrea Palmieri |
219:d8e8cd4d4521 | 128 | /* set BLE version string */ |
Andrea Palmieri |
219:d8e8cd4d4521 | 129 | setVersionString(hwVersion, fwVersion); |
Andrea Palmieri |
219:d8e8cd4d4521 | 130 | |
Andrea Palmieri |
220:e02936f0d4c7 | 131 | if (bnrg_expansion_board == IDB05A1) { |
Andrea Palmieri |
220:e02936f0d4c7 | 132 | uint8_t stackMode = STACK_MODE; |
Andrea Palmieri |
220:e02936f0d4c7 | 133 | ret = aci_hal_write_config_data(CONFIG_DATA_ROLE, |
Andrea Palmieri |
220:e02936f0d4c7 | 134 | CONFIG_DATA_ROLE_LEN, |
Andrea Palmieri |
220:e02936f0d4c7 | 135 | &stackMode); |
Andrea Palmieri |
220:e02936f0d4c7 | 136 | } |
Andrea Palmieri |
220:e02936f0d4c7 | 137 | |
Wolfgang Betz |
132:51056160fa4a | 138 | /* The Nucleo board must be configured as SERVER */ |
Andrea Palmieri |
219:d8e8cd4d4521 | 139 | //check if isSetAddress is set then set address. |
Andrea Palmieri |
227:624ae7aa567d | 140 | #if 0 |
Wolfgang Betz |
132:51056160fa4a | 141 | if(isSetAddress) |
Wolfgang Betz |
132:51056160fa4a | 142 | { |
Andrea Palmieri |
221:7896e6d8b652 | 143 | Gap::Address_t bleAddr; |
Andrea Palmieri |
221:7896e6d8b652 | 144 | Gap::AddressType_t addr_type; |
Andrea Palmieri |
221:7896e6d8b652 | 145 | |
Wolfgang Betz |
132:51056160fa4a | 146 | BlueNRGGap::getInstance().getAddress(&addr_type, bleAddr); |
Andrea Palmieri |
227:624ae7aa567d | 147 | |
Wolfgang Betz |
132:51056160fa4a | 148 | ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET, |
Wolfgang Betz |
132:51056160fa4a | 149 | CONFIG_DATA_PUBADDR_LEN, |
Andrea Palmieri |
221:7896e6d8b652 | 150 | bleAddr); |
Wolfgang Betz |
132:51056160fa4a | 151 | } else { |
Wolfgang Betz |
132:51056160fa4a | 152 | |
Wolfgang Betz |
140:0cd922dca83c | 153 | const Gap::Address_t BLE_address_BE = {0xFD,0x66,0x05,0x13,0xBE,0xBA}; |
Andrea Palmieri |
227:624ae7aa567d | 154 | BlueNRGGap::getInstance().setAddress(BLEProtocol::AddressType::RANDOM_STATIC, BLE_address_BE); |
Wolfgang Betz |
132:51056160fa4a | 155 | |
Wolfgang Betz |
132:51056160fa4a | 156 | ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET, |
Wolfgang Betz |
132:51056160fa4a | 157 | CONFIG_DATA_PUBADDR_LEN, |
Wolfgang Betz |
132:51056160fa4a | 158 | BLE_address_BE); |
Wolfgang Betz |
132:51056160fa4a | 159 | } |
Andrea Palmieri |
227:624ae7aa567d | 160 | #endif |
Andrea Palmieri |
229:9981f62cdb1a | 161 | |
Andrea Palmieri |
229:9981f62cdb1a | 162 | const Gap::Address_t BLE_address_BE = {0xFD,0x66,0x05,0x13,0xBE,0xBA}; |
Andrea Palmieri |
229:9981f62cdb1a | 163 | BlueNRGGap::getInstance().setAddress(BLEProtocol::AddressType::RANDOM_STATIC, BLE_address_BE); |
Wolfgang Betz |
132:51056160fa4a | 164 | |
Wolfgang Betz |
132:51056160fa4a | 165 | ret = aci_gatt_init(); |
Vincent Coubard |
253:9665a6f8bbdb | 166 | if(ret != BLE_STATUS_SUCCESS){ |
Wolfgang Betz |
132:51056160fa4a | 167 | PRINTF("GATT_Init failed.\n"); |
Wolfgang Betz |
132:51056160fa4a | 168 | } |
Wolfgang Betz |
132:51056160fa4a | 169 | if (bnrg_expansion_board == IDB05A1) { |
Andrea Palmieri |
229:9981f62cdb1a | 170 | ret = aci_gap_init_IDB05A1(GAP_PERIPHERAL_ROLE_IDB05A1|GAP_CENTRAL_ROLE_IDB05A1|GAP_OBSERVER_ROLE_IDB05A1, |
Andrea Palmieri |
229:9981f62cdb1a | 171 | 0, |
Andrea Palmieri |
229:9981f62cdb1a | 172 | 0x18, |
Andrea Palmieri |
229:9981f62cdb1a | 173 | &service_handle, |
Andrea Palmieri |
229:9981f62cdb1a | 174 | &dev_name_char_handle, |
Andrea Palmieri |
229:9981f62cdb1a | 175 | &appearance_char_handle); |
Wolfgang Betz |
132:51056160fa4a | 176 | } else { |
Wolfgang Betz |
132:51056160fa4a | 177 | ret = aci_gap_init_IDB04A1(role, &service_handle, &dev_name_char_handle, &appearance_char_handle); |
Wolfgang Betz |
132:51056160fa4a | 178 | } |
Wolfgang Betz |
132:51056160fa4a | 179 | |
Wolfgang Betz |
132:51056160fa4a | 180 | if(ret != BLE_STATUS_SUCCESS){ |
Wolfgang Betz |
132:51056160fa4a | 181 | PRINTF("GAP_Init failed.\n"); |
Wolfgang Betz |
132:51056160fa4a | 182 | } |
Wolfgang Betz |
132:51056160fa4a | 183 | |
Andrea Palmieri |
229:9981f62cdb1a | 184 | //FIXME: Security and passkey set by default |
Wolfgang Betz |
132:51056160fa4a | 185 | ret = aci_gap_set_auth_requirement(MITM_PROTECTION_REQUIRED, |
Wolfgang Betz |
132:51056160fa4a | 186 | OOB_AUTH_DATA_ABSENT, |
Wolfgang Betz |
132:51056160fa4a | 187 | NULL, |
Wolfgang Betz |
132:51056160fa4a | 188 | 7, |
Wolfgang Betz |
132:51056160fa4a | 189 | 16, |
Wolfgang Betz |
132:51056160fa4a | 190 | USE_FIXED_PIN_FOR_PAIRING, |
Wolfgang Betz |
132:51056160fa4a | 191 | 123456, |
Wolfgang Betz |
132:51056160fa4a | 192 | BONDING); |
Vincent Coubard |
253:9665a6f8bbdb | 193 | if (ret != BLE_STATUS_SUCCESS) { |
Vincent Coubard |
253:9665a6f8bbdb | 194 | PRINTF("Auth Req set failed.\n"); |
Wolfgang Betz |
132:51056160fa4a | 195 | } |
Wolfgang Betz |
132:51056160fa4a | 196 | |
Wolfgang Betz |
132:51056160fa4a | 197 | aci_hal_set_tx_power_level(1,4); |
Wolfgang Betz |
132:51056160fa4a | 198 | |
Wolfgang Betz |
132:51056160fa4a | 199 | g_gap_service_handle = service_handle; |
Wolfgang Betz |
132:51056160fa4a | 200 | g_appearance_char_handle = appearance_char_handle; |
Wolfgang Betz |
132:51056160fa4a | 201 | g_device_name_char_handle = dev_name_char_handle; |
Wolfgang Betz |
132:51056160fa4a | 202 | //Device Name is set from Accumulate Adv Data Payload or through setDeviceName API |
Wolfgang Betz |
132:51056160fa4a | 203 | /*ret = aci_gatt_update_char_value(service_handle, dev_name_char_handle, 0, |
Wolfgang Betz |
132:51056160fa4a | 204 | strlen(name), (tHalUint8 *)name);*/ |
Wolfgang Betz |
132:51056160fa4a | 205 | |
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 | /*! |
Andrea Palmieri |
229:9981f62cdb1a | 214 | @brief 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 |
231:a0d2544b38cd | 259 | PRINTF("scan_type=%d own_address_type=%d\n\r", scan_type, own_address_type); |
Andrea Palmieri |
219:d8e8cd4d4521 | 260 | ret = aci_gap_start_observation_procedure(scan_interval, |
Andrea Palmieri |
220:e02936f0d4c7 | 261 | scan_window, |
Andrea Palmieri |
219:d8e8cd4d4521 | 262 | scan_type, |
Andrea Palmieri |
220:e02936f0d4c7 | 263 | own_address_type, |
Andrea Palmieri |
235:31b976a40f43 | 264 | 0); // 1 to filter duplicates |
Andrea Palmieri |
219:d8e8cd4d4521 | 265 | } else { |
Andrea Palmieri |
219:d8e8cd4d4521 | 266 | ret = BLE_STATUS_INVALID_CID; |
Andrea Palmieri |
219:d8e8cd4d4521 | 267 | } |
Andrea Palmieri |
219:d8e8cd4d4521 | 268 | |
Andrea Palmieri |
219:d8e8cd4d4521 | 269 | return ret; |
Andrea Palmieri |
219:d8e8cd4d4521 | 270 | |
Andrea Palmieri |
219:d8e8cd4d4521 | 271 | } |
Wolfgang Betz |
132:51056160fa4a | 272 | |
Wolfgang Betz |
132:51056160fa4a | 273 | /*! |
Wolfgang Betz |
132:51056160fa4a | 274 | @brief Not Used |
Wolfgang Betz |
132:51056160fa4a | 275 | |
Wolfgang Betz |
132:51056160fa4a | 276 | @param[in] void |
Wolfgang Betz |
132:51056160fa4a | 277 | |
Wolfgang Betz |
132:51056160fa4a | 278 | @returns |
Wolfgang Betz |
132:51056160fa4a | 279 | */ |
Wolfgang Betz |
132:51056160fa4a | 280 | void SPI_Poll(void) |
Wolfgang Betz |
132:51056160fa4a | 281 | { |
Wolfgang Betz |
132:51056160fa4a | 282 | //HAL_GPIO_EXTI_Callback_Poll(BNRG_SPI_EXTI_PIN); |
Wolfgang Betz |
132:51056160fa4a | 283 | return; |
Wolfgang Betz |
132:51056160fa4a | 284 | } |
Wolfgang Betz |
132:51056160fa4a | 285 | |
Andrea Palmieri |
229:9981f62cdb1a | 286 | void Attribute_Modified_CB(evt_blue_aci *blue_evt) |
Andrea Palmieri |
229:9981f62cdb1a | 287 | { |
Andrea Palmieri |
229:9981f62cdb1a | 288 | uint16_t conn_handle; |
Andrea Palmieri |
229:9981f62cdb1a | 289 | uint16_t attr_handle; |
Andrea Palmieri |
229:9981f62cdb1a | 290 | uint8_t data_length; |
Andrea Palmieri |
229:9981f62cdb1a | 291 | uint8_t *att_data; |
Andrea Palmieri |
229:9981f62cdb1a | 292 | uint8_t offset; |
Andrea Palmieri |
229:9981f62cdb1a | 293 | |
Andrea Palmieri |
229:9981f62cdb1a | 294 | if (bnrg_expansion_board == IDB05A1) { |
Andrea Palmieri |
229:9981f62cdb1a | 295 | evt_gatt_attr_modified_IDB05A1 *evt = (evt_gatt_attr_modified_IDB05A1*)blue_evt->data; |
Andrea Palmieri |
229:9981f62cdb1a | 296 | conn_handle = evt->conn_handle; |
Andrea Palmieri |
229:9981f62cdb1a | 297 | attr_handle = evt->attr_handle; |
Andrea Palmieri |
229:9981f62cdb1a | 298 | data_length = evt->data_length; |
Andrea Palmieri |
229:9981f62cdb1a | 299 | att_data = evt->att_data; |
Andrea Palmieri |
229:9981f62cdb1a | 300 | offset = evt->offset; |
Andrea Palmieri |
229:9981f62cdb1a | 301 | } else { |
Andrea Palmieri |
229:9981f62cdb1a | 302 | evt_gatt_attr_modified_IDB04A1 *evt = (evt_gatt_attr_modified_IDB04A1*)blue_evt->data; |
Andrea Palmieri |
229:9981f62cdb1a | 303 | conn_handle = evt->conn_handle; |
Andrea Palmieri |
229:9981f62cdb1a | 304 | attr_handle = evt->attr_handle; |
Andrea Palmieri |
229:9981f62cdb1a | 305 | data_length = evt->data_length; |
Andrea Palmieri |
229:9981f62cdb1a | 306 | att_data = evt->att_data; |
Andrea Palmieri |
229:9981f62cdb1a | 307 | offset = 0; |
Andrea Palmieri |
229:9981f62cdb1a | 308 | } |
Andrea Palmieri |
229:9981f62cdb1a | 309 | |
Wolfgang Betz |
132:51056160fa4a | 310 | //Extract the GattCharacteristic from p_characteristics[] and find the properties mask |
Wolfgang Betz |
132:51056160fa4a | 311 | GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(attr_handle); |
Wolfgang Betz |
132:51056160fa4a | 312 | if(p_char!=NULL) { |
Andrea Palmieri |
229:9981f62cdb1a | 313 | GattAttribute::Handle_t charHandle = p_char->getValueAttribute().getHandle()-BlueNRGGattServer::CHAR_VALUE_HANDLE; |
Wolfgang Betz |
132:51056160fa4a | 314 | BlueNRGGattServer::HandleEnum_t currentHandle = BlueNRGGattServer::CHAR_HANDLE; |
Wolfgang Betz |
132:51056160fa4a | 315 | PRINTF("CharHandle %d, length: %d, Data: %d\n\r", charHandle, data_length, (uint16_t)att_data[0]); |
Wolfgang Betz |
132:51056160fa4a | 316 | PRINTF("getProperties 0x%x\n\r",p_char->getProperties()); |
Andrea Palmieri |
229:9981f62cdb1a | 317 | |
Andrea Palmieri |
229:9981f62cdb1a | 318 | if(attr_handle == charHandle+BlueNRGGattServer::CHAR_VALUE_HANDLE) { |
Wolfgang Betz |
132:51056160fa4a | 319 | currentHandle = BlueNRGGattServer::CHAR_VALUE_HANDLE; |
Wolfgang Betz |
132:51056160fa4a | 320 | } |
Wolfgang Betz |
132:51056160fa4a | 321 | |
Andrea Palmieri |
229:9981f62cdb1a | 322 | if(attr_handle == charHandle+BlueNRGGattServer::CHAR_DESC_HANDLE) { |
Wolfgang Betz |
132:51056160fa4a | 323 | currentHandle = BlueNRGGattServer::CHAR_DESC_HANDLE; |
Wolfgang Betz |
132:51056160fa4a | 324 | } |
Wolfgang Betz |
132:51056160fa4a | 325 | PRINTF("currentHandle %d\n\r", currentHandle); |
Wolfgang Betz |
132:51056160fa4a | 326 | if((p_char->getProperties() & |
Wolfgang Betz |
132:51056160fa4a | 327 | (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) && |
Wolfgang Betz |
132:51056160fa4a | 328 | currentHandle == BlueNRGGattServer::CHAR_DESC_HANDLE) { |
Wolfgang Betz |
132:51056160fa4a | 329 | |
Andrea Palmieri |
229:9981f62cdb1a | 330 | GattAttribute::Handle_t charDescHandle = p_char->getValueAttribute().getHandle()+1; |
Andrea Palmieri |
229:9981f62cdb1a | 331 | |
Wolfgang Betz |
132:51056160fa4a | 332 | PRINTF("*****NOTIFICATION CASE\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 333 | //Now Check if data written in Enable or Disable |
Wolfgang Betz |
132:51056160fa4a | 334 | if((uint16_t)att_data[0]==1) { |
Wolfgang Betz |
132:51056160fa4a | 335 | //PRINTF("Notify ENABLED\n\r"); |
Andrea Palmieri |
229:9981f62cdb1a | 336 | BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_ENABLED, charDescHandle); |
Wolfgang Betz |
132:51056160fa4a | 337 | } else { |
Wolfgang Betz |
132:51056160fa4a | 338 | //PRINTF("Notify DISABLED\n\r"); |
Andrea Palmieri |
229:9981f62cdb1a | 339 | BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_DISABLED, charDescHandle); |
Wolfgang Betz |
132:51056160fa4a | 340 | } |
Wolfgang Betz |
132:51056160fa4a | 341 | } |
Wolfgang Betz |
132:51056160fa4a | 342 | |
Andrea Palmieri |
229:9981f62cdb1a | 343 | //Check if attr handle property is WRITEABLE, in the case generate GATT_EVENT_DATA_WRITTEN Event |
Wolfgang Betz |
132:51056160fa4a | 344 | if((p_char->getProperties() & |
Wolfgang Betz |
132:51056160fa4a | 345 | (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE)) && |
Wolfgang Betz |
132:51056160fa4a | 346 | currentHandle == BlueNRGGattServer::CHAR_VALUE_HANDLE) { |
Wolfgang Betz |
132:51056160fa4a | 347 | |
Wolfgang Betz |
132:51056160fa4a | 348 | PRINTF("*****WRITE CASE\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 349 | |
Wolfgang Betz |
132:51056160fa4a | 350 | GattWriteCallbackParams writeParams; |
Andrea Palmieri |
229:9981f62cdb1a | 351 | writeParams.connHandle = conn_handle; |
Wolfgang Betz |
132:51056160fa4a | 352 | writeParams.handle = p_char->getValueAttribute().getHandle(); |
Wolfgang Betz |
132:51056160fa4a | 353 | writeParams.writeOp = GattWriteCallbackParams::OP_WRITE_REQ;//Where to find this property in BLUENRG? |
Wolfgang Betz |
132:51056160fa4a | 354 | writeParams.len = data_length; |
Andrea Palmieri |
229:9981f62cdb1a | 355 | writeParams.data = att_data; |
Andrea Palmieri |
229:9981f62cdb1a | 356 | writeParams.offset = offset; |
Andrea Palmieri |
229:9981f62cdb1a | 357 | |
Wolfgang Betz |
132:51056160fa4a | 358 | BlueNRGGattServer::getInstance().HCIDataWrittenEvent(&writeParams); |
Wolfgang Betz |
132:51056160fa4a | 359 | |
Andrea Palmieri |
229:9981f62cdb1a | 360 | //BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_WRITTEN, attr_handle); |
Wolfgang Betz |
132:51056160fa4a | 361 | //Write the actual Data to the Attr Handle? (uint8_1[])att_data contains the data |
Andrea Palmieri |
202:caf4864292c1 | 362 | if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getLength() > 0)) { |
Andrea Palmieri |
229:9981f62cdb1a | 363 | BlueNRGGattServer::getInstance().write(p_char->getValueAttribute().getHandle(), |
Andrea Palmieri |
229:9981f62cdb1a | 364 | (uint8_t*)att_data, |
Andrea Palmieri |
229:9981f62cdb1a | 365 | data_length, |
Andrea Palmieri |
229:9981f62cdb1a | 366 | false); |
Wolfgang Betz |
132:51056160fa4a | 367 | } |
Wolfgang Betz |
132:51056160fa4a | 368 | } |
Wolfgang Betz |
132:51056160fa4a | 369 | } |
Wolfgang Betz |
132:51056160fa4a | 370 | |
Wolfgang Betz |
132:51056160fa4a | 371 | } |
Wolfgang Betz |
132:51056160fa4a | 372 | |
Wolfgang Betz |
132:51056160fa4a | 373 | #ifdef __cplusplus |
Wolfgang Betz |
132:51056160fa4a | 374 | extern "C" { |
Wolfgang Betz |
132:51056160fa4a | 375 | #endif |
Wolfgang Betz |
132:51056160fa4a | 376 | |
Wolfgang Betz |
132:51056160fa4a | 377 | /**************************************************************************/ |
Wolfgang Betz |
132:51056160fa4a | 378 | /*! |
Wolfgang Betz |
132:51056160fa4a | 379 | @brief Handle HCI Stack Event |
Wolfgang Betz |
132:51056160fa4a | 380 | |
Wolfgang Betz |
132:51056160fa4a | 381 | @param[in] pckt |
Wolfgang Betz |
132:51056160fa4a | 382 | Event Packet sent by the stack to be decoded |
Wolfgang Betz |
132:51056160fa4a | 383 | |
Wolfgang Betz |
132:51056160fa4a | 384 | @returns |
Wolfgang Betz |
132:51056160fa4a | 385 | */ |
Wolfgang Betz |
132:51056160fa4a | 386 | /**************************************************************************/ |
Wolfgang Betz |
132:51056160fa4a | 387 | extern void HCI_Event_CB(void *pckt) { |
Wolfgang Betz |
132:51056160fa4a | 388 | hci_uart_pckt *hci_pckt = (hci_uart_pckt*)pckt; |
Wolfgang Betz |
132:51056160fa4a | 389 | hci_event_pckt *event_pckt = (hci_event_pckt*)hci_pckt->data; |
Wolfgang Betz |
132:51056160fa4a | 390 | |
Wolfgang Betz |
132:51056160fa4a | 391 | if(hci_pckt->type != HCI_EVENT_PKT) |
Andrea Palmieri |
221:7896e6d8b652 | 392 | return; |
Wolfgang Betz |
132:51056160fa4a | 393 | |
Wolfgang Betz |
132:51056160fa4a | 394 | switch(event_pckt->evt){ |
Wolfgang Betz |
132:51056160fa4a | 395 | |
Wolfgang Betz |
132:51056160fa4a | 396 | case EVT_DISCONN_COMPLETE: |
Wolfgang Betz |
132:51056160fa4a | 397 | { |
Wolfgang Betz |
132:51056160fa4a | 398 | PRINTF("EVT_DISCONN_COMPLETE\n"); |
Wolfgang Betz |
132:51056160fa4a | 399 | |
Andrea Palmieri |
221:7896e6d8b652 | 400 | evt_disconn_complete *evt = (evt_disconn_complete*)event_pckt->data; |
Wolfgang Betz |
132:51056160fa4a | 401 | |
Andrea Palmieri |
221:7896e6d8b652 | 402 | BlueNRGGap::getInstance().processDisconnectionEvent(evt->handle, (Gap::DisconnectionReason_t)evt->reason); |
Wolfgang Betz |
132:51056160fa4a | 403 | } |
Wolfgang Betz |
132:51056160fa4a | 404 | break; |
Wolfgang Betz |
132:51056160fa4a | 405 | |
Wolfgang Betz |
132:51056160fa4a | 406 | case EVT_LE_META_EVENT: |
Wolfgang Betz |
132:51056160fa4a | 407 | { |
Wolfgang Betz |
132:51056160fa4a | 408 | PRINTF("EVT_LE_META_EVENT\n"); |
Wolfgang Betz |
132:51056160fa4a | 409 | |
Wolfgang Betz |
132:51056160fa4a | 410 | evt_le_meta_event *evt = (evt_le_meta_event *)event_pckt->data; |
Wolfgang Betz |
132:51056160fa4a | 411 | |
Wolfgang Betz |
132:51056160fa4a | 412 | switch(evt->subevent){ |
Andrea Palmieri |
229:9981f62cdb1a | 413 | |
Wolfgang Betz |
132:51056160fa4a | 414 | case EVT_LE_CONN_COMPLETE: |
Wolfgang Betz |
132:51056160fa4a | 415 | { |
Wolfgang Betz |
132:51056160fa4a | 416 | PRINTF("EVT_LE_CONN_COMPLETE\n"); |
Andrea Palmieri |
221:7896e6d8b652 | 417 | Gap::Address_t ownAddr; |
Andrea Palmieri |
221:7896e6d8b652 | 418 | Gap::AddressType_t ownAddrType; |
Andrea Palmieri |
221:7896e6d8b652 | 419 | BlueNRGGap::getInstance().getAddress(&ownAddrType, ownAddr); |
Andrea Palmieri |
221:7896e6d8b652 | 420 | |
Andrea Palmieri |
227:624ae7aa567d | 421 | Gap::AddressType_t peerAddrType = BLEProtocol::AddressType::RANDOM_STATIC; |
Wolfgang Betz |
132:51056160fa4a | 422 | Gap::Role_t role; |
Wolfgang Betz |
132:51056160fa4a | 423 | |
Wolfgang Betz |
132:51056160fa4a | 424 | evt_le_connection_complete *cc = (evt_le_connection_complete *)evt->data; |
Wolfgang Betz |
132:51056160fa4a | 425 | |
Wolfgang Betz |
132:51056160fa4a | 426 | BlueNRGGap::getInstance().setConnectionHandle(cc->handle); |
Wolfgang Betz |
132:51056160fa4a | 427 | BlueNRGGap::ConnectionParams_t connectionParams; |
Wolfgang Betz |
132:51056160fa4a | 428 | BlueNRGGap::getInstance().getPreferredConnectionParams(&connectionParams); |
Wolfgang Betz |
132:51056160fa4a | 429 | switch (cc->peer_bdaddr_type) { |
Wolfgang Betz |
132:51056160fa4a | 430 | case PUBLIC_ADDR: |
Andrea Palmieri |
210:08c4c85ca679 | 431 | peerAddrType = BLEProtocol::AddressType::PUBLIC; |
Wolfgang Betz |
132:51056160fa4a | 432 | break; |
Wolfgang Betz |
132:51056160fa4a | 433 | case STATIC_RANDOM_ADDR: |
Andrea Palmieri |
210:08c4c85ca679 | 434 | peerAddrType = BLEProtocol::AddressType::RANDOM_STATIC; |
Wolfgang Betz |
132:51056160fa4a | 435 | break; |
Wolfgang Betz |
132:51056160fa4a | 436 | case RESOLVABLE_PRIVATE_ADDR: |
Andrea Palmieri |
210:08c4c85ca679 | 437 | peerAddrType = BLEProtocol::AddressType::RANDOM_PRIVATE_RESOLVABLE; |
Wolfgang Betz |
132:51056160fa4a | 438 | break; |
Wolfgang Betz |
132:51056160fa4a | 439 | case NON_RESOLVABLE_PRIVATE_ADDR: |
Andrea Palmieri |
210:08c4c85ca679 | 440 | peerAddrType = BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE; |
Wolfgang Betz |
132:51056160fa4a | 441 | break; |
Wolfgang Betz |
132:51056160fa4a | 442 | } |
Wolfgang Betz |
132:51056160fa4a | 443 | //PRINTF("EVT_LE_CONN_COMPLETE LL role=%d\n", cc->role); |
Wolfgang Betz |
132:51056160fa4a | 444 | switch (cc->role) { |
Wolfgang Betz |
133:1bb8df697f7f | 445 | case 0: //master |
Wolfgang Betz |
132:51056160fa4a | 446 | role = Gap::CENTRAL; |
Wolfgang Betz |
132:51056160fa4a | 447 | break; |
Wolfgang Betz |
133:1bb8df697f7f | 448 | case 1: |
Wolfgang Betz |
132:51056160fa4a | 449 | role = Gap::PERIPHERAL; |
Wolfgang Betz |
132:51056160fa4a | 450 | break; |
Wolfgang Betz |
133:1bb8df697f7f | 451 | default: |
Wolfgang Betz |
139:3a75965fd389 | 452 | role = Gap::PERIPHERAL; |
Wolfgang Betz |
133:1bb8df697f7f | 453 | break; |
Wolfgang Betz |
132:51056160fa4a | 454 | } |
Wolfgang Betz |
132:51056160fa4a | 455 | //PRINTF("EVT_LE_CONN_COMPLETE GAP role=%d\n", role); |
Andrea Palmieri |
221:7896e6d8b652 | 456 | BlueNRGGap::getInstance().processConnectionEvent(cc->handle, |
Andrea Palmieri |
221:7896e6d8b652 | 457 | role, |
Andrea Palmieri |
221:7896e6d8b652 | 458 | peerAddrType, |
Andrea Palmieri |
221:7896e6d8b652 | 459 | cc->peer_bdaddr, |
Andrea Palmieri |
221:7896e6d8b652 | 460 | ownAddrType, |
Andrea Palmieri |
221:7896e6d8b652 | 461 | ownAddr, |
Andrea Palmieri |
221:7896e6d8b652 | 462 | &connectionParams); |
Wolfgang Betz |
132:51056160fa4a | 463 | } |
Wolfgang Betz |
132:51056160fa4a | 464 | break; |
Wolfgang Betz |
132:51056160fa4a | 465 | |
Wolfgang Betz |
132:51056160fa4a | 466 | case EVT_LE_ADVERTISING_REPORT: |
Wolfgang Betz |
132:51056160fa4a | 467 | PRINTF("EVT_LE_ADVERTISING_REPORT\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 468 | /* FIXME: comment this otherwise it will be obscure and error prone if BlueNRG FW will be updated */ |
Wolfgang Betz |
132:51056160fa4a | 469 | // 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 | 470 | // Formally the structure related to both events are identical except that for the ADV REPORT |
Wolfgang Betz |
132:51056160fa4a | 471 | // there is one more field (number of reports) which is not forwarded to upper layer. |
Wolfgang Betz |
132:51056160fa4a | 472 | // Thus we need to move one byte over (((uint8_t*)evt->data)+1) before persing the ADV REPORT. |
Wolfgang Betz |
132:51056160fa4a | 473 | le_advertising_info *pr = (le_advertising_info*) (((uint8_t*)evt->data)+1); |
Wolfgang Betz |
132:51056160fa4a | 474 | PRINTF("EVT_LE_ADVERTISING_REPORT evt_type=%d\n\r", pr->evt_type); |
Wolfgang Betz |
132:51056160fa4a | 475 | |
Wolfgang Betz |
132:51056160fa4a | 476 | BlueNRGGap::getInstance().Discovery_CB(BlueNRGGap::DEVICE_FOUND, |
Wolfgang Betz |
132:51056160fa4a | 477 | pr->evt_type, |
Andrea Palmieri |
229:9981f62cdb1a | 478 | pr->bdaddr_type, |
Wolfgang Betz |
132:51056160fa4a | 479 | pr->bdaddr, |
Wolfgang Betz |
132:51056160fa4a | 480 | &pr->data_length, |
Wolfgang Betz |
132:51056160fa4a | 481 | &pr->data_RSSI[0], |
Wolfgang Betz |
132:51056160fa4a | 482 | &pr->data_RSSI[pr->data_length]); |
Wolfgang Betz |
132:51056160fa4a | 483 | break; |
Wolfgang Betz |
132:51056160fa4a | 484 | } |
Wolfgang Betz |
132:51056160fa4a | 485 | } |
Wolfgang Betz |
132:51056160fa4a | 486 | break; |
Wolfgang Betz |
132:51056160fa4a | 487 | |
Wolfgang Betz |
132:51056160fa4a | 488 | case EVT_VENDOR: |
Wolfgang Betz |
132:51056160fa4a | 489 | { |
Wolfgang Betz |
132:51056160fa4a | 490 | evt_blue_aci *blue_evt = (evt_blue_aci*)event_pckt->data; |
Wolfgang Betz |
132:51056160fa4a | 491 | //PRINTF("EVT_VENDOR %d\n", blue_evt->ecode); |
Wolfgang Betz |
132:51056160fa4a | 492 | |
Wolfgang Betz |
132:51056160fa4a | 493 | switch(blue_evt->ecode){ |
Wolfgang Betz |
132:51056160fa4a | 494 | |
Wolfgang Betz |
132:51056160fa4a | 495 | case EVT_BLUE_GATT_READ_PERMIT_REQ: |
Wolfgang Betz |
132:51056160fa4a | 496 | { |
Wolfgang Betz |
132:51056160fa4a | 497 | PRINTF("EVT_BLUE_GATT_READ_PERMIT_REQ_OK\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 498 | evt_gatt_read_permit_req *pr = (evt_gatt_read_permit_req*)blue_evt->data; |
Andrea Palmieri |
229:9981f62cdb1a | 499 | PRINTF("EVT_BLUE_GATT_READ_PERMIT_REQ_OK pr->attr_handle=%u\n\r", pr->attr_handle); |
Andrea Palmieri |
229:9981f62cdb1a | 500 | BlueNRGGattServer::getInstance().Read_Request_CB(pr->attr_handle); |
Wolfgang Betz |
132:51056160fa4a | 501 | } |
Wolfgang Betz |
132:51056160fa4a | 502 | break; |
Wolfgang Betz |
132:51056160fa4a | 503 | |
Wolfgang Betz |
132:51056160fa4a | 504 | case EVT_BLUE_GATT_ATTRIBUTE_MODIFIED: |
Wolfgang Betz |
132:51056160fa4a | 505 | { |
Wolfgang Betz |
132:51056160fa4a | 506 | PRINTF("EVT_BLUE_GATT_ATTRIBUTE_MODIFIED\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 507 | /* this callback is invoked when a GATT attribute is modified |
Wolfgang Betz |
132:51056160fa4a | 508 | extract callback data and pass to suitable handler function */ |
Andrea Palmieri |
229:9981f62cdb1a | 509 | Attribute_Modified_CB(blue_evt); |
Wolfgang Betz |
132:51056160fa4a | 510 | } |
Wolfgang Betz |
132:51056160fa4a | 511 | break; |
Wolfgang Betz |
132:51056160fa4a | 512 | |
Wolfgang Betz |
132:51056160fa4a | 513 | //Any cases for Data Sent Notifications? |
Wolfgang Betz |
132:51056160fa4a | 514 | case EVT_BLUE_GATT_NOTIFICATION: |
Wolfgang Betz |
132:51056160fa4a | 515 | //This is only relevant for Client Side Event |
Wolfgang Betz |
132:51056160fa4a | 516 | PRINTF("EVT_BLUE_GATT_NOTIFICATION"); |
Wolfgang Betz |
132:51056160fa4a | 517 | break; |
Wolfgang Betz |
132:51056160fa4a | 518 | case EVT_BLUE_GATT_INDICATION: |
Wolfgang Betz |
132:51056160fa4a | 519 | //This is only relevant for Client Side Event |
Wolfgang Betz |
132:51056160fa4a | 520 | PRINTF("EVT_BLUE_GATT_INDICATION"); |
Wolfgang Betz |
132:51056160fa4a | 521 | break; |
Wolfgang Betz |
132:51056160fa4a | 522 | |
Wolfgang Betz |
132:51056160fa4a | 523 | case EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP: |
Wolfgang Betz |
132:51056160fa4a | 524 | { |
Wolfgang Betz |
132:51056160fa4a | 525 | PRINTF("EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 526 | evt_att_read_by_group_resp *pr = (evt_att_read_by_group_resp*)blue_evt->data; |
Wolfgang Betz |
132:51056160fa4a | 527 | BlueNRGGattClient::getInstance().primaryServicesCB(pr->conn_handle, |
Wolfgang Betz |
132:51056160fa4a | 528 | pr->event_data_length, |
Wolfgang Betz |
132:51056160fa4a | 529 | pr->attribute_data_length, |
Wolfgang Betz |
132:51056160fa4a | 530 | pr->attribute_data_list); |
Wolfgang Betz |
132:51056160fa4a | 531 | } |
Wolfgang Betz |
132:51056160fa4a | 532 | break; |
Wolfgang Betz |
132:51056160fa4a | 533 | case EVT_BLUE_ATT_READ_BY_TYPE_RESP: |
Wolfgang Betz |
132:51056160fa4a | 534 | { |
Wolfgang Betz |
132:51056160fa4a | 535 | PRINTF("EVT_BLUE_ATT_READ_BY_TYPE_RESP\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 536 | evt_att_read_by_type_resp *pr = (evt_att_read_by_type_resp*)blue_evt->data; |
Wolfgang Betz |
132:51056160fa4a | 537 | BlueNRGGattClient::getInstance().serviceCharsCB(pr->conn_handle, |
Wolfgang Betz |
132:51056160fa4a | 538 | pr->event_data_length, |
Wolfgang Betz |
132:51056160fa4a | 539 | pr->handle_value_pair_length, |
Wolfgang Betz |
132:51056160fa4a | 540 | pr->handle_value_pair); |
Wolfgang Betz |
132:51056160fa4a | 541 | } |
Wolfgang Betz |
132:51056160fa4a | 542 | break; |
Wolfgang Betz |
132:51056160fa4a | 543 | case EVT_BLUE_ATT_READ_RESP: |
Wolfgang Betz |
132:51056160fa4a | 544 | { |
Wolfgang Betz |
132:51056160fa4a | 545 | PRINTF("EVT_BLUE_ATT_READ_RESP\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 546 | evt_att_read_resp *pr = (evt_att_read_resp*)blue_evt->data; |
Wolfgang Betz |
132:51056160fa4a | 547 | BlueNRGGattClient::getInstance().charReadCB(pr->conn_handle, |
Wolfgang Betz |
132:51056160fa4a | 548 | pr->event_data_length, |
Wolfgang Betz |
132:51056160fa4a | 549 | pr->attribute_value); |
Wolfgang Betz |
132:51056160fa4a | 550 | } |
Wolfgang Betz |
132:51056160fa4a | 551 | break; |
Wolfgang Betz |
132:51056160fa4a | 552 | case EVT_BLUE_ATT_EXEC_WRITE_RESP: |
Wolfgang Betz |
132:51056160fa4a | 553 | { |
Wolfgang Betz |
132:51056160fa4a | 554 | PRINTF("EVT_BLUE_ATT_EXEC_WRITE_RESP\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 555 | evt_att_prepare_write_resp *pr = (evt_att_prepare_write_resp*)blue_evt->data; |
Wolfgang Betz |
132:51056160fa4a | 556 | BlueNRGGattClient::getInstance().charWriteExecCB(pr->conn_handle, |
Wolfgang Betz |
132:51056160fa4a | 557 | pr->event_data_length); |
Wolfgang Betz |
132:51056160fa4a | 558 | } |
Wolfgang Betz |
132:51056160fa4a | 559 | break; |
Wolfgang Betz |
132:51056160fa4a | 560 | case EVT_BLUE_ATT_PREPARE_WRITE_RESP: |
Wolfgang Betz |
132:51056160fa4a | 561 | { |
Wolfgang Betz |
132:51056160fa4a | 562 | PRINTF("EVT_BLUE_ATT_PREPARE_WRITE_RESP\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 563 | evt_att_prepare_write_resp *pr = (evt_att_prepare_write_resp*)blue_evt->data; |
Wolfgang Betz |
132:51056160fa4a | 564 | BlueNRGGattClient::getInstance().charWritePrepareCB(pr->conn_handle, |
Wolfgang Betz |
132:51056160fa4a | 565 | pr->event_data_length, |
Wolfgang Betz |
132:51056160fa4a | 566 | pr->attribute_handle, |
Wolfgang Betz |
132:51056160fa4a | 567 | pr->offset, |
Wolfgang Betz |
132:51056160fa4a | 568 | pr->part_attr_value); |
Wolfgang Betz |
132:51056160fa4a | 569 | } |
Wolfgang Betz |
132:51056160fa4a | 570 | break; |
Wolfgang Betz |
132:51056160fa4a | 571 | case EVT_BLUE_GATT_DISC_READ_CHAR_BY_UUID_RESP: |
Wolfgang Betz |
132:51056160fa4a | 572 | { |
Wolfgang Betz |
132:51056160fa4a | 573 | PRINTF("EVT_BLUE_GATT_DISC_READ_CHAR_BY_UUID_RESP\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 574 | evt_gatt_disc_read_char_by_uuid_resp *pr = (evt_gatt_disc_read_char_by_uuid_resp*)blue_evt->data; |
Wolfgang Betz |
132:51056160fa4a | 575 | BlueNRGGattClient::getInstance().serviceCharByUUIDCB(pr->conn_handle, |
Wolfgang Betz |
132:51056160fa4a | 576 | pr->event_data_length, |
Wolfgang Betz |
132:51056160fa4a | 577 | pr->attr_handle, |
Wolfgang Betz |
132:51056160fa4a | 578 | pr->attr_value); |
Wolfgang Betz |
132:51056160fa4a | 579 | } |
Wolfgang Betz |
132:51056160fa4a | 580 | break; |
Wolfgang Betz |
132:51056160fa4a | 581 | case EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP: |
Wolfgang Betz |
132:51056160fa4a | 582 | { |
Wolfgang Betz |
132:51056160fa4a | 583 | PRINTF("EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 584 | evt_att_find_by_type_val_resp *pr = (evt_att_find_by_type_val_resp*)blue_evt->data; |
Wolfgang Betz |
132:51056160fa4a | 585 | BlueNRGGattClient::getInstance().primaryServiceCB(pr->conn_handle, |
Wolfgang Betz |
132:51056160fa4a | 586 | pr->event_data_length, |
Wolfgang Betz |
132:51056160fa4a | 587 | pr->handles_info_list); |
Wolfgang Betz |
132:51056160fa4a | 588 | } |
Wolfgang Betz |
132:51056160fa4a | 589 | break; |
Andrea Palmieri |
229:9981f62cdb1a | 590 | case EVT_BLUE_ATT_FIND_INFORMATION_RESP: |
Andrea Palmieri |
229:9981f62cdb1a | 591 | { |
Andrea Palmieri |
229:9981f62cdb1a | 592 | PRINTF("EVT_BLUE_ATT_FIND_INFORMATION_RESP\n\r"); |
Andrea Palmieri |
229:9981f62cdb1a | 593 | evt_att_find_information_resp *pr = (evt_att_find_information_resp*)blue_evt->data; |
Andrea Palmieri |
229:9981f62cdb1a | 594 | BlueNRGGattClient::getInstance().discAllCharacDescCB(pr->conn_handle, |
Andrea Palmieri |
229:9981f62cdb1a | 595 | pr->event_data_length, |
Andrea Palmieri |
229:9981f62cdb1a | 596 | pr->format, |
Andrea Palmieri |
229:9981f62cdb1a | 597 | pr->handle_uuid_pair); |
Andrea Palmieri |
229:9981f62cdb1a | 598 | } |
Andrea Palmieri |
229:9981f62cdb1a | 599 | break; |
Andrea Palmieri |
229:9981f62cdb1a | 600 | case EVT_BLUE_GATT_PROCEDURE_COMPLETE: |
Wolfgang Betz |
132:51056160fa4a | 601 | { |
Wolfgang Betz |
132:51056160fa4a | 602 | evt_gatt_procedure_complete *evt = (evt_gatt_procedure_complete*)blue_evt->data; |
Wolfgang Betz |
132:51056160fa4a | 603 | PRINTF("EVT_BLUE_GATT_PROCEDURE_COMPLETE error_code=%d\n\r", evt->error_code); |
Wolfgang Betz |
132:51056160fa4a | 604 | BlueNRGGattClient::getInstance().gattProcedureCompleteCB(evt->conn_handle, evt->error_code); |
Wolfgang Betz |
132:51056160fa4a | 605 | } |
Wolfgang Betz |
132:51056160fa4a | 606 | break; |
Wolfgang Betz |
132:51056160fa4a | 607 | |
Wolfgang Betz |
132:51056160fa4a | 608 | case EVT_BLUE_GAP_DEVICE_FOUND: |
Wolfgang Betz |
132:51056160fa4a | 609 | { |
Wolfgang Betz |
132:51056160fa4a | 610 | evt_gap_device_found *pr = (evt_gap_device_found*)blue_evt->data; |
Wolfgang Betz |
132:51056160fa4a | 611 | PRINTF("EVT_BLUE_GAP_DEVICE_FOUND evt_type=%d\n\r", pr->evt_type); |
Wolfgang Betz |
132:51056160fa4a | 612 | |
Wolfgang Betz |
132:51056160fa4a | 613 | BlueNRGGap::getInstance().Discovery_CB(BlueNRGGap::DEVICE_FOUND, |
Wolfgang Betz |
132:51056160fa4a | 614 | pr->evt_type, |
Andrea Palmieri |
229:9981f62cdb1a | 615 | pr->bdaddr_type, |
Wolfgang Betz |
132:51056160fa4a | 616 | pr->bdaddr, |
Wolfgang Betz |
132:51056160fa4a | 617 | &pr->data_length, |
Wolfgang Betz |
132:51056160fa4a | 618 | &pr->data_RSSI[0], |
Wolfgang Betz |
132:51056160fa4a | 619 | &pr->data_RSSI[pr->data_length]); |
Wolfgang Betz |
132:51056160fa4a | 620 | } |
Wolfgang Betz |
132:51056160fa4a | 621 | break; |
Wolfgang Betz |
132:51056160fa4a | 622 | |
Wolfgang Betz |
132:51056160fa4a | 623 | case EVT_BLUE_GAP_PROCEDURE_COMPLETE: |
Wolfgang Betz |
132:51056160fa4a | 624 | { |
Wolfgang Betz |
132:51056160fa4a | 625 | evt_gap_procedure_complete *pr = (evt_gap_procedure_complete*)blue_evt->data; |
Andrea Palmieri |
229:9981f62cdb1a | 626 | //PRINTF("EVT_BLUE_GAP_PROCEDURE_COMPLETE (code=0x%02X)\n\r", pr->procedure_code); |
Wolfgang Betz |
132:51056160fa4a | 627 | |
Wolfgang Betz |
132:51056160fa4a | 628 | switch(pr->procedure_code) { |
Andrea Palmieri |
219:d8e8cd4d4521 | 629 | case GAP_OBSERVATION_PROC_IDB05A1: |
Wolfgang Betz |
132:51056160fa4a | 630 | |
Andrea Palmieri |
229:9981f62cdb1a | 631 | BlueNRGGap::getInstance().Discovery_CB(BlueNRGGap::DISCOVERY_COMPLETE, 0, 0, NULL, NULL, NULL, NULL); |
Wolfgang Betz |
132:51056160fa4a | 632 | break; |
Wolfgang Betz |
132:51056160fa4a | 633 | } |
Wolfgang Betz |
132:51056160fa4a | 634 | } |
Wolfgang Betz |
132:51056160fa4a | 635 | break; |
Wolfgang Betz |
132:51056160fa4a | 636 | } |
Wolfgang Betz |
132:51056160fa4a | 637 | } |
Wolfgang Betz |
132:51056160fa4a | 638 | break; |
Wolfgang Betz |
132:51056160fa4a | 639 | } |
Wolfgang Betz |
132:51056160fa4a | 640 | return ; |
Wolfgang Betz |
132:51056160fa4a | 641 | } |
Wolfgang Betz |
132:51056160fa4a | 642 | |
Wolfgang Betz |
132:51056160fa4a | 643 | |
Wolfgang Betz |
132:51056160fa4a | 644 | #ifdef __cplusplus |
Wolfgang Betz |
132:51056160fa4a | 645 | } |
Wolfgang Betz |
132:51056160fa4a | 646 | #endif |