HW layer for the Nucleo board, it only work with old BLE_API
Dependents: Hello_BLE F446RE-BLE
Fork of X_NUCLEO_IDB0XA1 by
platform/src/btle.cpp@74:c4526f8284d5, 2015-06-16 (annotated)
- Committer:
- Antonio Vilei
- Date:
- Tue Jun 16 10:23:56 2015 +0200
- Revision:
- 74:c4526f8284d5
- Parent:
- 70:d20d30f59b1c
- Child:
- 77:332b416123b4
Use mbed C++ API for BlueNRG Driver
Update the old driver and replace the low-level C functions
with the C++ API for SPI and InterruptIn.
Fix issues with interrupt initialization caused by the old driver
(calling mbed's private functions to setup SPI and irq and messing
up other code based on InterruptIn, e.g. button.)
Signed-off-by: Antonio Vilei <antonio.vilei@st.com>
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Silvio Lucio Oliva |
70:d20d30f59b1c | 1 | /* mbed Microcontroller Library |
Silvio Lucio Oliva |
70:d20d30f59b1c | 2 | * Copyright (c) 2006-2013 ARM Limited |
Silvio Lucio Oliva |
70:d20d30f59b1c | 3 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 5 | * you may not use this file except in compliance with the License. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 6 | * You may obtain a copy of the License at |
Silvio Lucio Oliva |
70:d20d30f59b1c | 7 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
Silvio Lucio Oliva |
70:d20d30f59b1c | 9 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 10 | * Unless required by applicable law or agreed to in writing, software |
Silvio Lucio Oliva |
70:d20d30f59b1c | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 13 | * See the License for the specific language governing permissions and |
Silvio Lucio Oliva |
70:d20d30f59b1c | 14 | * limitations under the License. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 15 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 16 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 17 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 18 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 19 | ****************************************************************************** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 20 | * @file btle.cpp |
Silvio Lucio Oliva |
70:d20d30f59b1c | 21 | * @author STMicroelectronics |
Silvio Lucio Oliva |
70:d20d30f59b1c | 22 | * @brief Implementation BlueNRG Init and helper functions. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 23 | ****************************************************************************** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 24 | * @copy |
Silvio Lucio Oliva |
70:d20d30f59b1c | 25 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 26 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS |
Silvio Lucio Oliva |
70:d20d30f59b1c | 27 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 28 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY |
Silvio Lucio Oliva |
70:d20d30f59b1c | 29 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING |
Silvio Lucio Oliva |
70:d20d30f59b1c | 30 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 31 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 32 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 33 | * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2> |
Silvio Lucio Oliva |
70:d20d30f59b1c | 34 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 35 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 36 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 37 | #include "btle.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 38 | #include "public/Gap.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 39 | #include "public/GapEvents.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 40 | #include "BlueNRGGap.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 41 | #include "BlueNRGGattServer.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 42 | #include "Utils.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 43 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 44 | #ifdef __cplusplus |
Silvio Lucio Oliva |
70:d20d30f59b1c | 45 | extern "C" { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 46 | #endif |
Silvio Lucio Oliva |
70:d20d30f59b1c | 47 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 48 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 49 | /* C File Includes ------------------------------------------------------------------*/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 50 | // ANDREA: Updated includes and changed some types (e.g., tHalUint8 --> uint8_t) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 51 | #include <stdio.h> |
Silvio Lucio Oliva |
70:d20d30f59b1c | 52 | #include <string.h> |
Silvio Lucio Oliva |
70:d20d30f59b1c | 53 | #include "hci.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 54 | #include "hci_const.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 55 | #include "bluenrg_aci.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 56 | #include "bluenrg_hal_aci.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 57 | #include "bluenrg_gap.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 58 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 59 | #include "hal_types.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 60 | #include "hal.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 61 | #include "gp_timer.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 62 | #include "osal.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 63 | #include "sm.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 64 | #include "debug.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 65 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 66 | #ifdef __cplusplus |
Silvio Lucio Oliva |
70:d20d30f59b1c | 67 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 68 | #endif |
Silvio Lucio Oliva |
70:d20d30f59b1c | 69 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 70 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 71 | static void btle_handler(/*ble_evt_t * p_ble_evt*/); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 72 | void HCI_Input(tHciDataPacket * hciReadPacket); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 73 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 74 | //#define BDADDR_SIZE 6 |
Silvio Lucio Oliva |
70:d20d30f59b1c | 75 | //tHalUint8 bdaddr[BDADDR_SIZE]= {0xaa, 0x00, 0x00, 0xE1, 0x80, 0x02}; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 76 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 77 | uint16_t g_gap_service_handle = 0; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 78 | uint16_t g_appearance_char_handle = 0; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 79 | uint16_t g_device_name_char_handle = 0; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 80 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 81 | /* Private variables ---------------------------------------------------------*/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 82 | volatile uint8_t set_connectable = 1; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 83 | // ANDREA |
Silvio Lucio Oliva |
70:d20d30f59b1c | 84 | Gap::Address_t bleAddr; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 85 | Gap::AddressType_t addr_type = Gap::ADDR_TYPE_PUBLIC; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 86 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 87 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 88 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 89 | @brief Initialises BTLE and the underlying HW/Device |
Silvio Lucio Oliva |
70:d20d30f59b1c | 90 | @param isSetAddress boolean if address has been set |
Silvio Lucio Oliva |
70:d20d30f59b1c | 91 | @param mosi MOSI Pin |
Silvio Lucio Oliva |
70:d20d30f59b1c | 92 | @param miso MISO Pin |
Silvio Lucio Oliva |
70:d20d30f59b1c | 93 | @param sclk clock Pin |
Silvio Lucio Oliva |
70:d20d30f59b1c | 94 | @returns void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 95 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 96 | /**************************************************************************/ |
Antonio Vilei |
74:c4526f8284d5 | 97 | void btle_init(bool isSetAddress) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 98 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 99 | DEBUG("btle_init>>\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 100 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 101 | int ret; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 102 | uint16_t service_handle, dev_name_char_handle, appearance_char_handle; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 103 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 104 | /* Delay needed only to be able to acces the JTAG interface after reset |
Silvio Lucio Oliva |
70:d20d30f59b1c | 105 | if it will be disabled later. */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 106 | Clock_Wait(500); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 107 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 108 | /* Initialize the BlueNRG HCI */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 109 | HCI_Init(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 110 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 111 | /* Reset BlueNRG SPI interface */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 112 | BlueNRG_RST(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 113 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 114 | /* The Nucleo board must be configured as SERVER */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 115 | //check if issetAddress is set than set address. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 116 | // ANDREA |
Silvio Lucio Oliva |
70:d20d30f59b1c | 117 | if(isSetAddress) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 118 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 119 | BlueNRGGap::getInstance().getAddress(&addr_type, bleAddr); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 120 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 121 | Gap::Address_t bdaddr; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 122 | Osal_MemCpy(bdaddr, bleAddr, BDADDR_SIZE); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 123 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 124 | ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 125 | CONFIG_DATA_PUBADDR_LEN, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 126 | bdaddr); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 127 | } else { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 128 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 129 | const Gap::Address_t BLE_address_BE = {0xFD,0x00,0x25,0xAA,0x02,0x04}; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 130 | BlueNRGGap::getInstance().setAddress(Gap::ADDR_TYPE_PUBLIC, BLE_address_BE); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 131 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 132 | ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 133 | CONFIG_DATA_PUBADDR_LEN, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 134 | BLE_address_BE); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 135 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 136 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 137 | ret = aci_gatt_init(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 138 | if(ret){ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 139 | PRINTF("GATT_Init failed.\n"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 140 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 141 | //GAP is always in PERIPHERAL _ROLE as mbed does not support Master role at the moment |
Silvio Lucio Oliva |
70:d20d30f59b1c | 142 | #ifdef BLUENRG_MS |
Silvio Lucio Oliva |
70:d20d30f59b1c | 143 | ret = aci_gap_init(GAP_PERIPHERAL_ROLE, 0, 0x07, &service_handle, &dev_name_char_handle, &appearance_char_handle); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 144 | #else |
Silvio Lucio Oliva |
70:d20d30f59b1c | 145 | ret = aci_gap_init(GAP_PERIPHERAL_ROLE, &service_handle, &dev_name_char_handle, &appearance_char_handle); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 146 | #endif |
Silvio Lucio Oliva |
70:d20d30f59b1c | 147 | if(ret != BLE_STATUS_SUCCESS){ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 148 | PRINTF("GAP_Init failed.\n"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 149 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 150 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 151 | //ANDREA -- FIXME: Security and passkey set by default |
Silvio Lucio Oliva |
70:d20d30f59b1c | 152 | ret = aci_gap_set_auth_requirement(MITM_PROTECTION_REQUIRED, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 153 | OOB_AUTH_DATA_ABSENT, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 154 | NULL, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 155 | 7, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 156 | 16, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 157 | USE_FIXED_PIN_FOR_PAIRING, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 158 | 123456, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 159 | BONDING); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 160 | if (ret == BLE_STATUS_SUCCESS) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 161 | DEBUG("Auth Req set successfully.\n"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 162 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 163 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 164 | aci_hal_set_tx_power_level(1,4); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 165 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 166 | g_gap_service_handle = service_handle; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 167 | g_appearance_char_handle = appearance_char_handle; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 168 | g_device_name_char_handle = dev_name_char_handle; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 169 | //Device Name is set from Accumulate Adv Data Payload or through setDeviceName API |
Silvio Lucio Oliva |
70:d20d30f59b1c | 170 | /*ret = aci_gatt_update_char_value(service_handle, dev_name_char_handle, 0, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 171 | strlen(name), (tHalUint8 *)name);*/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 172 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 173 | return; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 174 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 175 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 176 | void User_Process() |
Silvio Lucio Oliva |
70:d20d30f59b1c | 177 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 178 | if(set_connectable){ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 179 | setConnectable(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 180 | set_connectable = FALSE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 181 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 182 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 183 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 184 | void setConnectable(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 185 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 186 | tBleStatus ret; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 187 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 188 | const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME,'B','l','u','e','N','R','G'}; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 189 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 190 | /* disable scan response */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 191 | hci_le_set_scan_resp_data(0,NULL); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 192 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 193 | //int t = BlueNRGGap::getInstance()::ADV_IND;// advType; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 194 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 195 | ret = aci_gap_set_discoverable(BlueNRGGap::getInstance().ADV_IND, 0, 0, PUBLIC_ADDR, NO_WHITE_LIST_USE, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 196 | sizeof(local_name), local_name, 0, NULL, 0, 0); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 197 | if (ret != BLE_STATUS_SUCCESS) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 198 | DEBUG("Error while setting discoverable mode (%d)\n", ret); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 199 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 200 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 201 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 202 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 203 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 204 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 205 | @brief Not Used |
Silvio Lucio Oliva |
70:d20d30f59b1c | 206 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 207 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 208 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 209 | @returns |
Silvio Lucio Oliva |
70:d20d30f59b1c | 210 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 211 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 212 | static void btle_handler() |
Silvio Lucio Oliva |
70:d20d30f59b1c | 213 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 214 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 215 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 216 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 217 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 218 | @brief Not Used |
Silvio Lucio Oliva |
70:d20d30f59b1c | 219 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 220 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 221 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 222 | @returns |
Silvio Lucio Oliva |
70:d20d30f59b1c | 223 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 224 | void SPI_Poll(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 225 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 226 | //HAL_GPIO_EXTI_Callback_Poll(BNRG_SPI_EXTI_PIN); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 227 | return; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 228 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 229 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 230 | #ifdef __cplusplus |
Silvio Lucio Oliva |
70:d20d30f59b1c | 231 | extern "C" { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 232 | #endif |
Silvio Lucio Oliva |
70:d20d30f59b1c | 233 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 234 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 235 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 236 | @brief Handle HCI Stack Event |
Silvio Lucio Oliva |
70:d20d30f59b1c | 237 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 238 | @param[in] pckt |
Silvio Lucio Oliva |
70:d20d30f59b1c | 239 | Event Packet sent by the stack to be decoded |
Silvio Lucio Oliva |
70:d20d30f59b1c | 240 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 241 | @returns |
Silvio Lucio Oliva |
70:d20d30f59b1c | 242 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 243 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 244 | extern void HCI_Event_CB(void *pckt) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 245 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 246 | hci_uart_pckt *hci_pckt = (hci_uart_pckt*)pckt; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 247 | hci_event_pckt *event_pckt = (hci_event_pckt*)hci_pckt->data; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 248 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 249 | if(hci_pckt->type != HCI_EVENT_PKT) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 250 | return; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 251 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 252 | switch(event_pckt->evt){ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 253 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 254 | case EVT_DISCONN_COMPLETE: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 255 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 256 | DEBUG("EVT_DISCONN_COMPLETE\n"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 257 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 258 | evt_disconn_complete *evt = (evt_disconn_complete*)event_pckt; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 259 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 260 | BlueNRGGap::getInstance().processDisconnectionEvent(evt->handle, BlueNRGGap::REMOTE_USER_TERMINATED_CONNECTION); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 261 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 262 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 263 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 264 | case EVT_LE_META_EVENT: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 265 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 266 | DEBUG("EVT_LE_META_EVENT\n"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 267 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 268 | evt_le_meta_event *evt = (evt_le_meta_event *)event_pckt->data; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 269 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 270 | switch(evt->subevent){ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 271 | // ANDREA |
Silvio Lucio Oliva |
70:d20d30f59b1c | 272 | case EVT_LE_CONN_COMPLETE: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 273 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 274 | Gap::AddressType_t peerAddrType = Gap::ADDR_TYPE_PUBLIC; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 275 | DEBUG("EVT_LE_CONN_COMPLETE\n"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 276 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 277 | evt_le_connection_complete *cc = (evt_le_connection_complete *)evt->data; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 278 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 279 | BlueNRGGap::getInstance().setConnectionHandle(cc->handle); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 280 | BlueNRGGap::ConnectionParams_t connectionParams; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 281 | BlueNRGGap::getInstance().getPreferredConnectionParams(&connectionParams); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 282 | switch (cc->peer_bdaddr_type) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 283 | case PUBLIC_ADDR: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 284 | peerAddrType = Gap::ADDR_TYPE_PUBLIC; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 285 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 286 | case STATIC_RANDOM_ADDR: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 287 | peerAddrType = Gap::ADDR_TYPE_RANDOM_STATIC; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 288 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 289 | case RESOLVABLE_PRIVATE_ADDR: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 290 | peerAddrType = Gap::ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 291 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 292 | case NON_RESOLVABLE_PRIVATE_ADDR: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 293 | peerAddrType = Gap::ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 294 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 295 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 296 | BlueNRGGap::getInstance().processConnectionEvent(cc->handle, peerAddrType, cc->peer_bdaddr, addr_type, bleAddr, (const BlueNRGGap::ConnectionParams_t *)&connectionParams); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 297 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 298 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 299 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 300 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 301 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 302 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 303 | case EVT_VENDOR: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 304 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 305 | evt_blue_aci *blue_evt = (evt_blue_aci*)event_pckt->data; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 306 | switch(blue_evt->ecode){ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 307 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 308 | DEBUG("EVT_VENDOR %d\n", blue_evt->ecode); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 309 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 310 | case EVT_BLUE_GATT_READ_PERMIT_REQ: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 311 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 312 | DEBUG("EVT_BLUE_GATT_READ_PERMIT_REQ_OK\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 313 | evt_gatt_read_permit_req *pr = (evt_gatt_read_permit_req*)blue_evt->data; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 314 | BlueNRGGattServer::getInstance().Read_Request_CB(pr->attr_handle); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 315 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 316 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 317 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 318 | case EVT_BLUE_GATT_ATTRIBUTE_MODIFIED: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 319 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 320 | /* this callback is invoked when a GATT attribute is modified |
Silvio Lucio Oliva |
70:d20d30f59b1c | 321 | extract callback data and pass to suitable handler function */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 322 | evt_gatt_attr_modified *evt = (evt_gatt_attr_modified*)blue_evt->data; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 323 | DEBUG("EVT_BLUE_GATT_ATTRIBUTE_MODIFIED\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 324 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 325 | //DEBUG("CharHandle 0x%x, length: 0x%x, Data: 0x%x\n\r",evt->attr_handle, evt->data_length, (uint16_t)evt->att_data[0]); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 326 | DEBUG("CharHandle %d, length: %d, Data: %d\n\r",evt->attr_handle, evt->data_length, (uint16_t)evt->att_data[0]); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 327 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 328 | //Extract the GattCharacteristic from p_characteristics[] and find the properties mask |
Silvio Lucio Oliva |
70:d20d30f59b1c | 329 | GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(evt->attr_handle); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 330 | if(p_char!=NULL) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 331 | DEBUG("getProperties 0x%x\n\r",p_char->getProperties()); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 332 | if((p_char->getProperties() & (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY |
Silvio Lucio Oliva |
70:d20d30f59b1c | 333 | | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 334 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 335 | //Now Check if data written in Enable or Disable |
Silvio Lucio Oliva |
70:d20d30f59b1c | 336 | if((uint16_t)evt->att_data[0]==1) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 337 | //DEBUG("Notify ENABLED\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 338 | BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_ENABLED, evt->attr_handle); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 339 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 340 | else { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 341 | //DEBUG("Notify DISABLED\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 342 | BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_DISABLED, evt->attr_handle); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 343 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 344 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 345 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 346 | //Check is attr handle property is WRITEABLE, if yes, generate GATT_EVENT_DATA_WRITTEN Event |
Silvio Lucio Oliva |
70:d20d30f59b1c | 347 | if((p_char->getProperties() & |
Silvio Lucio Oliva |
70:d20d30f59b1c | 348 | (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE| |
Silvio Lucio Oliva |
70:d20d30f59b1c | 349 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE))) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 350 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 351 | GattCharacteristicWriteCBParams writeParams; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 352 | writeParams.charHandle=evt->attr_handle; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 353 | writeParams.op=GattCharacteristicWriteCBParams::GATTS_CHAR_OP_WRITE_REQ;//Where to find this property in BLUENRG? |
Silvio Lucio Oliva |
70:d20d30f59b1c | 354 | writeParams.len=evt->data_length; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 355 | writeParams.data=evt->att_data; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 356 | #ifdef BLUENRG_MS |
Silvio Lucio Oliva |
70:d20d30f59b1c | 357 | writeParams.offset=evt->offset;//Not used in BlueNRG? |
Silvio Lucio Oliva |
70:d20d30f59b1c | 358 | #endif |
Silvio Lucio Oliva |
70:d20d30f59b1c | 359 | BlueNRGGattServer::getInstance().HCIDataWrittenEvent(&writeParams); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 360 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 361 | //BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_WRITTEN, evt->attr_handle); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 362 | //Write the actual Data to the Attr Handle? (uint8_1[])evt->att_data contains the data |
Silvio Lucio Oliva |
70:d20d30f59b1c | 363 | if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 364 | BlueNRGGattServer::getInstance().updateValue(p_char->getValueAttribute().getHandle(), |
Silvio Lucio Oliva |
70:d20d30f59b1c | 365 | p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), false /* localOnly */); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 366 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 367 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 368 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 369 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 370 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 371 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 372 | //Any cases for Data Sent Notifications? |
Silvio Lucio Oliva |
70:d20d30f59b1c | 373 | case EVT_BLUE_GATT_NOTIFICATION: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 374 | //This is only relevant for Client Side Event |
Silvio Lucio Oliva |
70:d20d30f59b1c | 375 | DEBUG("EVT_BLUE_GATT_NOTIFICATION"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 376 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 377 | case EVT_BLUE_GATT_INDICATION: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 378 | //This is only relevant for Client Side Event |
Silvio Lucio Oliva |
70:d20d30f59b1c | 379 | DEBUG("EVT_BLUE_GATT_INDICATION"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 380 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 381 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 382 | case EVT_BLUE_GATT_PROCEDURE_COMPLETE: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 383 | DEBUG("EVT_BLUE_GATT_PROCEDURE_COMPLETE"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 384 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 385 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 386 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 387 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 388 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 389 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 390 | return ; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 391 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 392 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 393 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 394 | #ifdef __cplusplus |
Silvio Lucio Oliva |
70:d20d30f59b1c | 395 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 396 | #endif |