Skip to content

Commit

Permalink
feat(ble): Set device name at runtime
Browse files Browse the repository at this point in the history
This allows for the device name to be set at runtime, possible uses for this include a custom display screen that lets you type it in using the keycode state event, future configuration in zmk studio, or altering it per profile as per zmkfirmware#1169
  • Loading branch information
ReFil committed Jun 18, 2024
1 parent 308d6bc commit f7dee82
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 5 deletions.
1 change: 1 addition & 0 deletions app/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ menuconfig ZMK_BLE
select BT_SMP_APP_PAIRING_ACCEPT
select BT_PERIPHERAL
select BT_DIS
select BT_DEVICE_NAME_DYNAMIC
imply BT_SETTINGS if !ARCH_POSIX
imply SETTINGS if !ARCH_POSIX
imply ZMK_BATTERY_REPORTING if !ARCH_POSIX
Expand Down
2 changes: 2 additions & 0 deletions app/include/zmk/ble.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ char *zmk_ble_active_profile_name(void);

int zmk_ble_unpair_all(void);

void zmk_ble_set_device_name(char *name);

#if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)
int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr);
#endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */
24 changes: 19 additions & 5 deletions app/src/ble.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,19 +56,18 @@ enum advertising_type {
#define CURR_ADV(adv) (adv << 4)

#define ZMK_ADV_CONN_NAME \
BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME, BT_GAP_ADV_FAST_INT_MIN_2, \
BT_GAP_ADV_FAST_INT_MAX_2, NULL)
BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME | BT_LE_ADV_OPT_USE_NAME, \
BT_GAP_ADV_FAST_INT_MIN_2, BT_GAP_ADV_FAST_INT_MAX_2, NULL)

static struct zmk_ble_profile profiles[ZMK_BLE_PROFILE_COUNT];
static uint8_t active_profile;

#define DEVICE_NAME CONFIG_BT_DEVICE_NAME
#define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1)

BUILD_ASSERT(DEVICE_NAME_LEN <= 16, "ERROR: BLE device name is too long. Max length: 16");
BUILD_ASSERT(DEVICE_NAME_LEN <= 27, "ERROR: BLE device name is too long. Max length: 27");

static const struct bt_data zmk_ble_ad[] = {
BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
static struct bt_data zmk_ble_ad[] = {
BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, 0xC1, 0x03),
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
BT_DATA_BYTES(BT_DATA_UUID16_SOME, 0x12, 0x18, /* HID Service */
Expand Down Expand Up @@ -320,6 +319,21 @@ bt_addr_le_t *zmk_ble_active_profile_addr(void) { return &profiles[active_profil

char *zmk_ble_active_profile_name(void) { return profiles[active_profile].name; }

void zmk_ble_set_device_name(char *name) {
// Copy new name to advertising parameters
bt_set_name(name);
LOG_DBG("New device name: %s", name);
if (advertising_status == ZMK_ADV_CONN) {
// Stop current advertising so it can restart with new name
int err = bt_le_adv_stop();
advertising_status = ZMK_ADV_NONE;
if (err) {
LOG_ERR("Failed to stop advertising (err %d)", err);
}
}
update_advertising();
}

#if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)

int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr) {
Expand Down

0 comments on commit f7dee82

Please sign in to comment.