|
52 | 52 | #include "shared-bindings/_bleio/ScanEntry.h"
|
53 | 53 | #include "shared-bindings/time/__init__.h"
|
54 | 54 |
|
| 55 | +#if CIRCUITPY_DOTENV |
| 56 | +#include "shared-module/dotenv/__init__.h" |
| 57 | +#endif |
| 58 | + |
55 | 59 | #define BLE_MIN_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS)
|
56 | 60 | #define BLE_MAX_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS)
|
57 | 61 | #define BLE_SLAVE_LATENCY 0
|
@@ -329,18 +333,30 @@ STATIC void get_address(bleio_adapter_obj_t *self, ble_gap_addr_t *address) {
|
329 | 333 | char default_ble_name[] = { 'C', 'I', 'R', 'C', 'U', 'I', 'T', 'P', 'Y', 0, 0, 0, 0, 0};
|
330 | 334 |
|
331 | 335 | STATIC void bleio_adapter_reset_name(bleio_adapter_obj_t *self) {
|
332 |
| - uint8_t len = sizeof(default_ble_name) - 1; |
| 336 | + // setup the default name |
| 337 | + ble_gap_addr_t addr; // local_address |
| 338 | + get_address(self, &addr); |
| 339 | + mp_int_t len = sizeof(default_ble_name) - 1; |
| 340 | + default_ble_name[len - 4] = nibble_to_hex_lower[addr.addr[1] >> 4 & 0xf]; |
| 341 | + default_ble_name[len - 3] = nibble_to_hex_lower[addr.addr[1] & 0xf]; |
| 342 | + default_ble_name[len - 2] = nibble_to_hex_lower[addr.addr[0] >> 4 & 0xf]; |
| 343 | + default_ble_name[len - 1] = nibble_to_hex_lower[addr.addr[0] & 0xf]; |
| 344 | + default_ble_name[len] = '\0'; // for now we add null for compatibility with C ASCIIZ strings |
333 | 345 |
|
334 |
| - ble_gap_addr_t local_address; |
335 |
| - get_address(self, &local_address); |
| 346 | + mp_int_t name_len = 0; |
336 | 347 |
|
337 |
| - default_ble_name[len - 4] = nibble_to_hex_lower[local_address.addr[1] >> 4 & 0xf]; |
338 |
| - default_ble_name[len - 3] = nibble_to_hex_lower[local_address.addr[1] & 0xf]; |
339 |
| - default_ble_name[len - 2] = nibble_to_hex_lower[local_address.addr[0] >> 4 & 0xf]; |
340 |
| - default_ble_name[len - 1] = nibble_to_hex_lower[local_address.addr[0] & 0xf]; |
341 |
| - default_ble_name[len] = '\0'; // for now we add null for compatibility with C ASCIIZ strings |
| 348 | + #if CIRCUITPY_DOTENV |
| 349 | + char ble_name[32]; |
| 350 | + name_len = dotenv_get_key("/.env", "CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name) - 1); |
| 351 | + if (name_len > 0) { |
| 352 | + ble_name[name_len] = '\0'; |
| 353 | + common_hal_bleio_adapter_set_name(self, (char *)ble_name); |
| 354 | + } |
| 355 | + #endif |
342 | 356 |
|
343 |
| - common_hal_bleio_adapter_set_name(self, (char *)default_ble_name); |
| 357 | + if (name_len <= 0) { |
| 358 | + common_hal_bleio_adapter_set_name(self, (char *)default_ble_name); |
| 359 | + } |
344 | 360 | }
|
345 | 361 |
|
346 | 362 | static void bluetooth_adapter_background(void *data) {
|
@@ -448,7 +464,17 @@ void common_hal_bleio_adapter_set_name(bleio_adapter_obj_t *self, const char *na
|
448 | 464 | ble_gap_conn_sec_mode_t sec;
|
449 | 465 | sec.lv = 0;
|
450 | 466 | sec.sm = 0;
|
451 |
| - sd_ble_gap_device_name_set(&sec, (const uint8_t *)name, strlen(name)); |
| 467 | + int result; |
| 468 | + result = sd_ble_gap_device_name_set(&sec, (const uint8_t *)name, strlen(name)); |
| 469 | + for (int name_len = strlen(name); name_len > 0; --name_len) { |
| 470 | + result = sd_ble_gap_device_name_set(&sec, (const uint8_t *)name, name_len); |
| 471 | + // expecting NRF_ERROR_DATA_SIZE when name too long |
| 472 | + if (result == NRF_SUCCESS) { |
| 473 | + return; |
| 474 | + } |
| 475 | + } |
| 476 | + // default back to default if all fails |
| 477 | + sd_ble_gap_device_name_set(&sec, (const uint8_t *)default_ble_name, sizeof(default_ble_name) - 1); |
452 | 478 | }
|
453 | 479 |
|
454 | 480 | STATIC uint32_t _update_identities(bool is_central) {
|
|
0 commit comments