refactor(ble): Use functions for advertising changes

Rewrote the macros for changing advertising state to be functions. This
makes it significantly easier to debug, since you cannot set a
breakpoint on a line inside of a macro.
This commit is contained in:
Joel Spadin 2023-11-05 11:38:14 -06:00
parent 9e8ee86842
commit 534d044872

View file

@ -127,42 +127,46 @@ bool zmk_ble_active_profile_is_connected() {
return info.state == BT_CONN_STATE_CONNECTED; return info.state == BT_CONN_STATE_CONNECTED;
} }
#define CHECKED_ADV_STOP() \ static int checked_adv_stop(void) {
err = bt_le_adv_stop(); \ int err = bt_le_adv_stop();
advertising_status = ZMK_ADV_NONE; \ if (err) {
if (err) { \ LOG_ERR("Failed to stop advertising (err %d)", err);
LOG_ERR("Failed to stop advertising (err %d)", err); \ } else {
return err; \ advertising_status = ZMK_ADV_NONE;
}
return err;
} }
#define CHECKED_DIR_ADV() \ static int checked_dir_adv(void) {
addr = zmk_ble_active_profile_addr(); \ bt_addr_le_t *addr = zmk_ble_active_profile_addr();
conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr); \ struct bt_conn *conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr);
if (conn != NULL) { /* TODO: Check status of connection */ \ if (conn != NULL) { /* TODO: Check status of connection */
LOG_DBG("Skipping advertising, profile host is already connected"); \ LOG_DBG("Skipping advertising, profile host is already connected");
bt_conn_unref(conn); \ bt_conn_unref(conn);
return 0; \ return 0;
} \ }
err = bt_le_adv_start(BT_LE_ADV_CONN_DIR_LOW_DUTY(addr), zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), \ int err = bt_le_adv_start(BT_LE_ADV_CONN_DIR_LOW_DUTY(addr), zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad),
NULL, 0); \ NULL, 0);
if (err) { \ if (err) {
LOG_ERR("Advertising failed to start (err %d)", err); \ LOG_ERR("Advertising failed to start (err %d)", err);
return err; \ } else {
} \
advertising_status = ZMK_ADV_DIR; advertising_status = ZMK_ADV_DIR;
}
return err;
}
#define CHECKED_OPEN_ADV() \ static int checked_open_adv(void) {
err = bt_le_adv_start(ZMK_ADV_CONN_NAME, zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), NULL, 0); \ int err = bt_le_adv_start(ZMK_ADV_CONN_NAME, zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), NULL, 0);
if (err) { \ if (err) {
LOG_ERR("Advertising failed to start (err %d)", err); \ LOG_ERR("Advertising failed to start (err %d)", err);
return err; \ } else {
} \
advertising_status = ZMK_ADV_CONN; advertising_status = ZMK_ADV_CONN;
}
return err;
}
int update_advertising() { int update_advertising(void) {
int err = 0; int err = 0;
bt_addr_le_t *addr;
struct bt_conn *conn;
enum advertising_type desired_adv = ZMK_ADV_NONE; enum advertising_type desired_adv = ZMK_ADV_NONE;
if (zmk_ble_active_profile_is_open()) { if (zmk_ble_active_profile_is_open()) {
@ -182,26 +186,30 @@ int update_advertising() {
switch (desired_adv + CURR_ADV(advertising_status)) { switch (desired_adv + CURR_ADV(advertising_status)) {
case ZMK_ADV_NONE + CURR_ADV(ZMK_ADV_DIR): case ZMK_ADV_NONE + CURR_ADV(ZMK_ADV_DIR):
case ZMK_ADV_NONE + CURR_ADV(ZMK_ADV_CONN): case ZMK_ADV_NONE + CURR_ADV(ZMK_ADV_CONN):
CHECKED_ADV_STOP(); err = checked_adv_stop();
break; break;
case ZMK_ADV_DIR + CURR_ADV(ZMK_ADV_DIR): case ZMK_ADV_DIR + CURR_ADV(ZMK_ADV_DIR):
case ZMK_ADV_DIR + CURR_ADV(ZMK_ADV_CONN): case ZMK_ADV_DIR + CURR_ADV(ZMK_ADV_CONN):
CHECKED_ADV_STOP(); err = checked_adv_stop();
CHECKED_DIR_ADV(); if (!err) {
err = checked_dir_adv();
}
break; break;
case ZMK_ADV_DIR + CURR_ADV(ZMK_ADV_NONE): case ZMK_ADV_DIR + CURR_ADV(ZMK_ADV_NONE):
CHECKED_DIR_ADV(); err = checked_dir_adv();
break; break;
case ZMK_ADV_CONN + CURR_ADV(ZMK_ADV_DIR): case ZMK_ADV_CONN + CURR_ADV(ZMK_ADV_DIR):
CHECKED_ADV_STOP(); err = checked_adv_stop();
CHECKED_OPEN_ADV(); if (!err) {
err = checked_open_adv();
}
break; break;
case ZMK_ADV_CONN + CURR_ADV(ZMK_ADV_NONE): case ZMK_ADV_CONN + CURR_ADV(ZMK_ADV_NONE):
CHECKED_OPEN_ADV(); err = checked_open_adv();
break; break;
} }
return 0; return err;
}; };
static void update_advertising_callback(struct k_work *work) { update_advertising(); } static void update_advertising_callback(struct k_work *work) { update_advertising(); }