X_NUCLEO_IDB05A1
Dependencies: mbed-os-example-ble-Advertising
Revision 266:b49e28134d83, committed 2016-09-15
- Comitter:
- Vincent Coubard
- Date:
- Thu Sep 15 10:51:29 2016 +0100
- Branch:
- ed913d4b8f4131a00dc3184889a36725d080f65f
- Parent:
- 263:8516afb5e29c
- Child:
- 267:cd7870e466b3
- Commit message:
- Sync with ed913d4b8f4131a00dc3184889a36725d080f65f
2016-07-11 18:33:50+01:00: Vincent Coubard
implement set/get preferered connection parameters
Changed in this revision
--- a/source/BlueNRGGap.cpp Thu Sep 15 10:51:25 2016 +0100
+++ b/source/BlueNRGGap.cpp Thu Sep 15 10:51:29 2016 +0100
@@ -907,10 +907,37 @@
/**************************************************************************/
ble_error_t BlueNRGGap::getPreferredConnectionParams(ConnectionParams_t *params)
{
- /* avoid compiler warnings about unused variables */
- (void)params;
+ static const size_t parameter_size = 2;
+
+ if (!g_preferred_connection_parameters_char_handle) {
+ return BLE_ERROR_OPERATION_NOT_PERMITTED;
+ }
+
+ // Peripheral preferred connection parameters are an array of 4 uint16_t
+ uint8_t parameters_packed[parameter_size * 4];
+ uint16_t bytes_read = 0;
- return BLE_ERROR_NOT_IMPLEMENTED;
+ tBleStatus err = aci_gatt_read_handle_value(
+ g_preferred_connection_parameters_char_handle + BlueNRGGattServer::CHAR_VALUE_HANDLE,
+ sizeof(parameters_packed),
+ &bytes_read,
+ parameters_packed
+ );
+
+ PRINTF("getPreferredConnectionParams err=0x%02x (bytes_read=%u)\n\r", err, bytes_read);
+
+ // check that the read succeed and the result have the expected length
+ if (err || bytes_read != sizeof(parameters_packed)) {
+ return BLE_ERROR_UNSPECIFIED;
+ }
+
+ // memcpy field by field
+ memcpy(¶ms->minConnectionInterval, parameters_packed, parameter_size);
+ memcpy(¶ms->maxConnectionInterval, ¶meters_packed[parameter_size], parameter_size);
+ memcpy(¶ms->slaveLatency, ¶meters_packed[2 * parameter_size], parameter_size);
+ memcpy(¶ms->connectionSupervisionTimeout, ¶meters_packed[3 * parameter_size], parameter_size);
+
+ return BLE_ERROR_NONE;
}
@@ -929,10 +956,61 @@
/**************************************************************************/
ble_error_t BlueNRGGap::setPreferredConnectionParams(const ConnectionParams_t *params)
{
- /* avoid compiler warnings about unused variables */
- (void)params;
+ static const size_t parameter_size = 2;
+ uint8_t parameters_packed[parameter_size * 4];
+
+ // ensure that parameters are correct
+ // see BLUETOOTH SPECIFICATION Version 4.2 [Vol 3, Part C]
+ // section 12.3 PERIPHERAL PREFERRED CONNECTION PARAMETERS CHARACTERISTIC
+ if (((0x0006 > params->minConnectionInterval) || (params->minConnectionInterval > 0x0C80)) &&
+ params->minConnectionInterval != 0xFFFF) {
+ return BLE_ERROR_PARAM_OUT_OF_RANGE;
+ }
+
+ if (((params->minConnectionInterval > params->maxConnectionInterval) || (params->maxConnectionInterval > 0x0C80)) &&
+ params->maxConnectionInterval != 0xFFFF) {
+ return BLE_ERROR_PARAM_OUT_OF_RANGE;
+ }
+
+ if (params->slaveLatency > 0x01F3) {
+ return BLE_ERROR_PARAM_OUT_OF_RANGE;
+ }
+
+ if (((0x000A > params->connectionSupervisionTimeout) || (params->connectionSupervisionTimeout > 0x0C80)) &&
+ params->connectionSupervisionTimeout != 0xFFFF) {
+ return BLE_ERROR_PARAM_OUT_OF_RANGE;
+ }
- return BLE_ERROR_NOT_IMPLEMENTED;
+ // copy the parameters inside the byte array
+ memcpy(parameters_packed, ¶ms->minConnectionInterval, parameter_size);
+ memcpy(¶meters_packed[parameter_size], ¶ms->maxConnectionInterval, parameter_size);
+ memcpy(¶meters_packed[2 * parameter_size], ¶ms->slaveLatency, parameter_size);
+ memcpy(¶meters_packed[3 * parameter_size], ¶ms->connectionSupervisionTimeout, parameter_size);
+
+ tBleStatus err = aci_gatt_update_char_value(
+ g_gap_service_handle,
+ g_preferred_connection_parameters_char_handle,
+ /* offset */ 0,
+ sizeof(parameters_packed),
+ parameters_packed
+ );
+
+ if (err) {
+ PRINTF("setPreferredConnectionParams failed (err=0x%x)!!\n\r", err) ;
+ switch (err) {
+ case BLE_STATUS_INVALID_HANDLE:
+ case BLE_STATUS_INVALID_PARAMETER:
+ return BLE_ERROR_INVALID_PARAM;
+ case BLE_STATUS_INSUFFICIENT_RESOURCES:
+ return BLE_ERROR_NO_MEM;
+ case BLE_STATUS_TIMEOUT:
+ return BLE_STACK_BUSY;
+ default:
+ return BLE_ERROR_UNSPECIFIED;
+ }
+ }
+
+ return BLE_ERROR_NONE;
}
/**************************************************************************/
--- a/source/platform/btle.cpp Thu Sep 15 10:51:25 2016 +0100
+++ b/source/platform/btle.cpp Thu Sep 15 10:51:29 2016 +0100
@@ -81,6 +81,7 @@
uint16_t g_gap_service_handle = 0;
uint16_t g_appearance_char_handle = 0;
uint16_t g_device_name_char_handle = 0;
+uint16_t g_preferred_connection_parameters_char_handle = 0;
/* Private variables ---------------------------------------------------------*/
volatile uint8_t set_connectable = 1;
@@ -203,6 +204,15 @@
/*ret = aci_gatt_update_char_value(service_handle, dev_name_char_handle, 0,
strlen(name), (tHalUint8 *)name);*/
+ // update the peripheral preferred conenction parameters handle
+ // if the device is configured as a peripheral
+ // This value is hardcoded at the moment.
+ if ((role & GAP_PERIPHERAL_ROLE_IDB05A1) || (role & GAP_PERIPHERAL_ROLE_IDB04A1) ||
+ (bnrg_expansion_board == IDB05A1 /* role is ignored in this configuration ... */)) {
+ g_preferred_connection_parameters_char_handle = 10;
+ }
+
+
#ifdef AST_FOR_MBED_OS
minar::Scheduler::postCallback(btle_handler);
#endif
--- a/x-nucleo-idb0xa1/platform/btle.h Thu Sep 15 10:51:25 2016 +0100 +++ b/x-nucleo-idb0xa1/platform/btle.h Thu Sep 15 10:51:29 2016 +0100 @@ -25,19 +25,20 @@ #include <stdio.h> #include <string.h> - + #include "hci.h" -#include "bluenrg_aci.h" -#include "hci_const.h" +#include "bluenrg_aci.h" +#include "hci_const.h" #include "bluenrg_hal_aci.h" -#include "stm32_bluenrg_ble.h" +#include "stm32_bluenrg_ble.h" #include "bluenrg_gap.h" #include "bluenrg_gatt_server.h" extern uint16_t g_gap_service_handle; extern uint16_t g_appearance_char_handle; extern uint16_t g_device_name_char_handle; - +extern uint16_t g_preferred_connection_parameters_char_handle; + void btleInit(bool isSetAddress, uint8_t role); void SPI_Poll(void); void User_Process(void); @@ -58,4 +59,4 @@ } #endif -#endif +#endif \ No newline at end of file