From 69fce2c81c3c15a1dad913e34c94d00ad426c46e Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Tue, 21 Jan 2025 01:33:19 -0500 Subject: [PATCH] feat(ble): add support for generating device name based on MAC address This is useful for distinguishing multiple identical keyboards. --- app/Kconfig | 4 ++++ app/src/ble.c | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index e1c4ada9f..e8b999895 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -234,6 +234,10 @@ config BT_PERIPHERAL_PREF_TIMEOUT config BT_DEVICE_NAME_MAX default 16 +config ZMK_BLE_KEYBOARD_NAME_MAC + bool "Include MAC address in BLE device name" + depends on ZMK_SPLIT_ROLE_CENTRAL + endif # ZMK_BLE endmenu # Output Types diff --git a/app/src/ble.c b/app/src/ble.c index 94c1b2936..0f60b30cc 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -722,6 +722,24 @@ static int zmk_ble_complete_startup(void) { #endif // IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) +#if IS_ENABLED(CONFIG_ZMK_BLE_KEYBOARD_NAME_MAC) + bt_addr_le_t addrs[CONFIG_BT_ID_MAX]; + size_t id_count; + bt_id_get(addrs, &id_count); + if (id_count < 1) { + LOG_ERR("Failed to get Bluetooth device address"); + } else { + // The generated name can be a maximum of 29 bytes (plus NULL) since + // CONFIG_BT_DEVICE_NAME is 16 bytes at most. + char name[30] = {}; + uint8_t *a = addrs[0].a.val; + snprintf(name, sizeof(name), "%s %02X%02X%02X%02X%02X%02X", CONFIG_BT_DEVICE_NAME, a[5], + a[4], a[3], a[2], a[1], a[0]); + name[CONFIG_BT_DEVICE_NAME_MAX] = '\0'; + zmk_ble_set_device_name(name); + } +#endif + bt_conn_cb_register(&conn_callbacks); bt_conn_auth_cb_register(&zmk_ble_auth_cb_display); bt_conn_auth_info_cb_register(&zmk_ble_auth_info_cb_display);