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
Diff: source/BlueNRGGap.cpp
- Branch:
- 5d71c4ee51a741fa3aabe0b7ad4b814d7bf27aee
- Revision:
- 268:c0a1e03c5736
- Parent:
- 266:b49e28134d83
- Child:
- 270:ca649990a830
--- a/source/BlueNRGGap.cpp Thu Sep 15 10:51:30 2016 +0100 +++ b/source/BlueNRGGap.cpp Thu Sep 15 10:51:31 2016 +0100 @@ -811,26 +811,47 @@ /**************************************************************************/ ble_error_t BlueNRGGap::setAddress(AddressType_t type, const BLEProtocol::AddressBytes_t address) { - tBleStatus ret; - if (type > BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE) { return BLE_ERROR_PARAM_OUT_OF_RANGE; } - addr_type = type; - - // If Address Type is other than PUBLIC, the given Address is ignored - if(addr_type == BLEProtocol::AddressType::PUBLIC){ - ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET, - CONFIG_DATA_PUBADDR_LEN, - address); + if(type == BLEProtocol::AddressType::PUBLIC){ + tBleStatus ret = aci_hal_write_config_data( + CONFIG_DATA_PUBADDR_OFFSET, + CONFIG_DATA_PUBADDR_LEN, + address + ); if(ret != BLE_STATUS_SUCCESS) { return BLE_ERROR_OPERATION_NOT_PERMITTED; } + } else if (type == BLEProtocol::AddressType::RANDOM_STATIC) { + // ensure that the random static address is well formed + if ((address[5] & 0xC0) != 0xC0) { + return BLE_ERROR_PARAM_OUT_OF_RANGE; + } + + // thanks to const correctness of the API ... + tBDAddr random_address = { 0 }; + memcpy(random_address, address, sizeof(random_address)); + int err = hci_le_set_random_address(random_address); + if (err) { + return BLE_ERROR_OPERATION_NOT_PERMITTED; + } + + // It is not possible to get the bluetooth address when it is set + // store it locally in class data member + memcpy(bdaddr, address, sizeof(bdaddr)); } else { - return BLE_ERROR_OPERATION_NOT_PERMITTED; + // FIXME random addresses are not supported yet + // BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE + // BLEProtocol::AddressType::RANDOM_PRIVATE_RESOLVABLE + return BLE_ERROR_NOT_IMPLEMENTED; } + // if we're here then the address was correctly set + // commit it inside the addr_type + addr_type = type; + isSetAddress = true; return BLE_ERROR_NONE; } @@ -871,23 +892,30 @@ uint8_t bdaddr[BDADDR_SIZE]; uint8_t data_len_out; - if (addr_type == BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE || - addr_type == BLEProtocol::AddressType::RANDOM_PRIVATE_RESOLVABLE) { - return BLE_ERROR_OPERATION_NOT_PERMITTED; - } - - if(typeP != NULL) { - *typeP = addr_type; + // precondition, check that pointers in input are valid + if (typeP == NULL || address == NULL) { + return BLE_ERROR_INVALID_PARAM; } - tBleStatus ret = aci_hal_read_config_data(CONFIG_DATA_RANDOM_ADDRESS_IDB05A1, BDADDR_SIZE, &data_len_out, bdaddr); - if(ret != BLE_STATUS_SUCCESS) { - return BLE_ERROR_UNSPECIFIED; + if (addr_type == BLEProtocol::AddressType::PUBLIC) { + tBleStatus ret = aci_hal_read_config_data(CONFIG_DATA_PUBADDR_OFFSET, BDADDR_SIZE, &data_len_out, bdaddr); + if(ret != BLE_STATUS_SUCCESS || data_len_out != BDADDR_SIZE) { + return BLE_ERROR_UNSPECIFIED; + } + } else if (addr_type == BLEProtocol::AddressType::RANDOM_STATIC) { + // FIXME hci_read_bd_addr and + // aci_hal_read_config_data CONFIG_DATA_RANDOM_ADDRESS_IDB05A1 + // does not work, use the address stored in class data member + memcpy(bdaddr, this->bdaddr, sizeof(bdaddr)); + } else { + // FIXME: should be implemented with privacy features + // BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE + // BLEProtocol::AddressType::RANDOM_PRIVATE_RESOLVABLE + return BLE_ERROR_NOT_IMPLEMENTED; } - if(address != NULL) { - memcpy(address, bdaddr, BDADDR_SIZE); - } + *typeP = addr_type; + memcpy(address, bdaddr, BDADDR_SIZE); return BLE_ERROR_NONE; }