diff --git a/ports/nrf/drivers/bluetooth/ble_drv.c b/ports/nrf/drivers/bluetooth/ble_drv.c index 1eb0fef52ffc2..25cb430c24fe4 100644 --- a/ports/nrf/drivers/bluetooth/ble_drv.c +++ b/ports/nrf/drivers/bluetooth/ble_drv.c @@ -279,6 +279,26 @@ void ble_drv_address_get(ble_drv_addr_t * p_addr) { memcpy(p_addr->addr, local_ble_addr.addr, 6); } + +void ble_drv_address_set(ble_drv_addr_t * p_addr) { + SD_TEST_OR_ENABLE(); + + ble_gap_addr_t local_ble_addr; + local_ble_addr.addr_id_peer = 0x00; + local_ble_addr.addr_type = 0x00; // BLE_GAP_ADDR_TYPE_PUBLIC + memcpy(local_ble_addr.addr, p_addr->addr, 6); + +#if (BLUETOOTH_SD == 110) + uint32_t err_code = sd_ble_gap_address_set(&local_ble_addr); +#else + uint32_t err_code = sd_ble_gap_addr_set(&local_ble_addr); +#endif + + if (err_code != 0) { + mp_raise_msg_varg(&mp_type_OSError, MP_ERROR_TEXT("Can't set the device address. status: 0x" HEX2_FMT), (uint16_t)err_code); + } +} + bool ble_drv_uuid_add_vs(uint8_t * p_uuid, uint8_t * idx) { SD_TEST_OR_ENABLE(); diff --git a/ports/nrf/drivers/bluetooth/ble_drv.h b/ports/nrf/drivers/bluetooth/ble_drv.h index ac68959375ce6..0515124d54663 100644 --- a/ports/nrf/drivers/bluetooth/ble_drv.h +++ b/ports/nrf/drivers/bluetooth/ble_drv.h @@ -80,6 +80,8 @@ uint8_t ble_drv_stack_enabled(void); void ble_drv_address_get(ble_drv_addr_t * p_addr); +void ble_drv_address_set(ble_drv_addr_t * p_addr); + bool ble_drv_uuid_add_vs(uint8_t * p_uuid, uint8_t * idx); bool ble_drv_service_add(ubluepy_service_obj_t * p_service_obj); diff --git a/ports/nrf/modules/ble/modble.c b/ports/nrf/modules/ble/modble.c index 7a9b55523efb7..016d101ff2b00 100644 --- a/ports/nrf/modules/ble/modble.c +++ b/ports/nrf/modules/ble/modble.c @@ -81,10 +81,37 @@ mp_obj_t ble_obj_address(void) { return mac_str; } +/// \method address_set() +/// Set device address +mp_obj_t ble_obj_address_set(mp_obj_t ble_obj_address_set_obj) { + + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(ble_obj_address_set_obj, &bufinfo, MP_BUFFER_READ); + + // Check if the buffer has at least 6 bytes + if (bufinfo.len != 6) { + mp_raise_ValueError(MP_ERROR_TEXT("Not a valid MAC address")); + return mp_const_none; + } + + ble_drv_addr_t new_ble_addr; + + // Manually copy the bytes from the buffer to the addr field + for (int i = 0; i < 6; i++) { + new_ble_addr.addr[5-i] = ((uint8_t *)bufinfo.buf)[i]; + } + + ble_drv_address_set(&new_ble_addr); + + return mp_const_none; +} + + static MP_DEFINE_CONST_FUN_OBJ_0(ble_obj_enable_obj, ble_obj_enable); static MP_DEFINE_CONST_FUN_OBJ_0(ble_obj_disable_obj, ble_obj_disable); static MP_DEFINE_CONST_FUN_OBJ_0(ble_obj_enabled_obj, ble_obj_enabled); static MP_DEFINE_CONST_FUN_OBJ_0(ble_obj_address_obj, ble_obj_address); +static MP_DEFINE_CONST_FUN_OBJ_1(ble_obj_address_set_obj, ble_obj_address_set); static const mp_rom_map_elem_t ble_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ble) }, @@ -92,6 +119,7 @@ static const mp_rom_map_elem_t ble_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_disable), MP_ROM_PTR(&ble_obj_disable_obj) }, { MP_ROM_QSTR(MP_QSTR_enabled), MP_ROM_PTR(&ble_obj_enabled_obj) }, { MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&ble_obj_address_obj) }, + { MP_ROM_QSTR(MP_QSTR_address_set), MP_ROM_PTR(&ble_obj_address_set_obj) }, };