Bluetooth: CSIP: Add bt_csip_set_member_unregister

Add support for unregistering a CSIS as the CSIP set member.

Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
This commit is contained in:
Emil Gydesen 2024-01-08 15:51:16 +01:00 committed by Anas Nashif
commit 029afad6c1
4 changed files with 74 additions and 20 deletions

View file

@ -186,6 +186,17 @@ void *bt_csip_set_member_svc_decl_get(const struct bt_csip_set_member_svc_inst *
int bt_csip_set_member_register(const struct bt_csip_set_member_register_param *param,
struct bt_csip_set_member_svc_inst **svc_inst);
/**
* @brief Unregister a Coordinated Set Identification Service instance.
*
* This will unregister and disable the service instance.
*
* @param svc_inst Pointer to the registered Coordinated Set Identification Service.
*
* @return 0 if success, errno on failure.
*/
int bt_csip_set_member_unregister(struct bt_csip_set_member_svc_inst *svc_inst);
/**
* @brief Print the SIRK to the debug output
*

View file

@ -50,7 +50,15 @@ int bt_cap_acceptor_register(const struct bt_csip_set_member_register_param *par
err = bt_gatt_service_register(&cas);
if (err) {
const int csip_err = bt_csip_set_member_unregister(*svc_inst);
if (csip_err) {
LOG_ERR("Failed to unregister CSIS: %d", csip_err);
}
cas.attrs[1].user_data = NULL;
LOG_DBG("Failed to register CAS");
return err;
}

View file

@ -144,9 +144,13 @@ static int notify_lock_value(const struct bt_csip_set_member_svc_inst *svc_inst,
struct bt_conn *conn)
{
LOG_DBG("");
if (svc_inst->service_p != NULL) {
return csip_gatt_notify_set_lock(conn, svc_inst->service_p->attrs,
&svc_inst->set_lock,
sizeof(svc_inst->set_lock));
&svc_inst->set_lock, sizeof(svc_inst->set_lock));
} else {
return -EINVAL;
}
}
static void notify_client(struct bt_conn *conn, void *data)
@ -727,6 +731,10 @@ BT_GATT_SERVICE_INSTANCE_DEFINE(csip_set_member_service_list, svc_insts,
/****************************** Public API ******************************/
void *bt_csip_set_member_svc_decl_get(const struct bt_csip_set_member_svc_inst *svc_inst)
{
if (svc_inst == NULL || svc_inst->service_p == NULL) {
return NULL;
}
return svc_inst->service_p->attrs;
}
@ -944,6 +952,27 @@ int bt_csip_set_member_register(const struct bt_csip_set_member_register_param *
return 0;
}
int bt_csip_set_member_unregister(struct bt_csip_set_member_svc_inst *svc_inst)
{
int err;
CHECKIF(svc_inst == NULL) {
LOG_DBG("NULL svc_inst");
return -EINVAL;
}
err = bt_gatt_service_unregister(svc_inst->service_p);
if (err != 0) {
LOG_DBG("CSIS service unregister failed: %d", err);
return err;
}
(void)k_work_cancel_delayable(&svc_inst->set_lock_timer);
memset(svc_inst, 0, sizeof(*svc_inst));
return 0;
}
int bt_csip_set_member_lock(struct bt_csip_set_member_svc_inst *svc_inst,
bool lock, bool force)
{

View file

@ -22,17 +22,6 @@ struct bt_csip_set_member_register_param param = {
0x22, 0xfd, 0xa1, 0x21, 0x09, 0x7d, 0x7d, 0x45 },
};
static void csip_disconnected(struct bt_conn *conn, uint8_t reason)
{
printk("Disconnected (reason %u)\n", reason);
if (reason == BT_HCI_ERR_REMOTE_USER_TERM_CONN) {
PASS("Client successfully disconnected\n");
} else {
FAIL("Client disconnected unexpectedly (0x%02x)\n", reason);
}
}
static void csip_lock_changed_cb(struct bt_conn *conn,
struct bt_csip_set_member_svc_inst *svc_inst,
bool locked)
@ -87,10 +76,6 @@ static void bt_ready(int err)
}
}
static struct bt_conn_cb conn_callbacks = {
.disconnected = csip_disconnected,
};
static void test_main(void)
{
int err;
@ -102,7 +87,17 @@ static void test_main(void)
return;
}
bt_conn_cb_register(&conn_callbacks);
WAIT_FOR_FLAG(flag_connected);
WAIT_FOR_UNSET_FLAG(flag_connected);
err = bt_csip_set_member_unregister(svc_inst);
if (err != 0) {
FAIL("Could not unregister CSIP (err %d)\n", err);
return;
}
svc_inst = NULL;
PASS("CSIP Set member passed: Client successfully disconnected\n");
}
static void test_force_release(void)
@ -116,11 +111,22 @@ static void test_force_release(void)
return;
}
bt_conn_cb_register(&conn_callbacks);
WAIT_FOR_FLAG(flag_connected);
WAIT_FOR_COND(g_locked);
printk("Force releasing set\n");
bt_csip_set_member_lock(svc_inst, false, true);
WAIT_FOR_UNSET_FLAG(flag_connected);
err = bt_csip_set_member_unregister(svc_inst);
if (err != 0) {
FAIL("Could not unregister CSIP (err %d)\n", err);
return;
}
svc_inst = NULL;
PASS("CSIP Set member passed: Client successfully disconnected\n");
}
static void test_csip_enc(void)