Skip to content

Commit c06b6df

Browse files
committed
nrf/softdevice : Add function to set the BT address.
Signed-off-by: Blafy <alban.boye@protonmail.com>
1 parent f5d10c3 commit c06b6df

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

ports/nrf/drivers/bluetooth/ble_drv.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,26 @@ void ble_drv_address_get(ble_drv_addr_t * p_addr) {
279279
memcpy(p_addr->addr, local_ble_addr.addr, 6);
280280
}
281281

282+
283+
void ble_drv_address_set(ble_drv_addr_t * p_addr) {
284+
SD_TEST_OR_ENABLE();
285+
286+
ble_gap_addr_t local_ble_addr;
287+
local_ble_addr.addr_id_peer = 0x00;
288+
local_ble_addr.addr_type = 0x00; // BLE_GAP_ADDR_TYPE_PUBLIC
289+
memcpy(local_ble_addr.addr, p_addr->addr, 6);
290+
291+
#if (BLUETOOTH_SD == 110)
292+
uint32_t err_code = sd_ble_gap_address_set(&local_ble_addr);
293+
#else
294+
uint32_t err_code = sd_ble_gap_addr_set(&local_ble_addr);
295+
#endif
296+
297+
if (err_code != 0) {
298+
mp_raise_msg_varg(&mp_type_OSError, MP_ERROR_TEXT("Can't set the device address. status: 0x" HEX2_FMT), (uint16_t)err_code);
299+
}
300+
}
301+
282302
bool ble_drv_uuid_add_vs(uint8_t * p_uuid, uint8_t * idx) {
283303
SD_TEST_OR_ENABLE();
284304

ports/nrf/drivers/bluetooth/ble_drv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ uint8_t ble_drv_stack_enabled(void);
8080

8181
void ble_drv_address_get(ble_drv_addr_t * p_addr);
8282

83+
void ble_drv_address_set(ble_drv_addr_t * p_addr);
84+
8385
bool ble_drv_uuid_add_vs(uint8_t * p_uuid, uint8_t * idx);
8486

8587
bool ble_drv_service_add(ubluepy_service_obj_t * p_service_obj);

ports/nrf/modules/ble/modble.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,45 @@ mp_obj_t ble_obj_address(void) {
8181
return mac_str;
8282
}
8383

84+
/// \method address_set()
85+
/// Set device address
86+
mp_obj_t ble_obj_address_set(mp_obj_t ble_obj_address_set_obj) {
87+
88+
mp_buffer_info_t bufinfo;
89+
mp_get_buffer_raise(ble_obj_address_set_obj, &bufinfo, MP_BUFFER_READ);
90+
91+
// Check if the buffer has at least 6 bytes
92+
if (bufinfo.len != 6) {
93+
mp_raise_ValueError(MP_ERROR_TEXT("Not a valid MAC address"));
94+
return mp_const_none;
95+
}
96+
97+
ble_drv_addr_t new_ble_addr;
98+
99+
// Manually copy the bytes from the buffer to the addr field
100+
for (int i = 0; i < 6; i++) {
101+
new_ble_addr.addr[5-i] = ((uint8_t *)bufinfo.buf)[i];
102+
}
103+
104+
ble_drv_address_set(&new_ble_addr);
105+
106+
return mp_const_none;
107+
}
108+
109+
84110
static MP_DEFINE_CONST_FUN_OBJ_0(ble_obj_enable_obj, ble_obj_enable);
85111
static MP_DEFINE_CONST_FUN_OBJ_0(ble_obj_disable_obj, ble_obj_disable);
86112
static MP_DEFINE_CONST_FUN_OBJ_0(ble_obj_enabled_obj, ble_obj_enabled);
87113
static MP_DEFINE_CONST_FUN_OBJ_0(ble_obj_address_obj, ble_obj_address);
114+
static MP_DEFINE_CONST_FUN_OBJ_1(ble_obj_address_set_obj, ble_obj_address_set);
88115

89116
static const mp_rom_map_elem_t ble_module_globals_table[] = {
90117
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ble) },
91118
{ MP_ROM_QSTR(MP_QSTR_enable), MP_ROM_PTR(&ble_obj_enable_obj) },
92119
{ MP_ROM_QSTR(MP_QSTR_disable), MP_ROM_PTR(&ble_obj_disable_obj) },
93120
{ MP_ROM_QSTR(MP_QSTR_enabled), MP_ROM_PTR(&ble_obj_enabled_obj) },
94121
{ MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&ble_obj_address_obj) },
122+
{ MP_ROM_QSTR(MP_QSTR_address_set), MP_ROM_PTR(&ble_obj_address_set_obj) },
95123
};
96124

97125

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy