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:
parent
1da84e99aa
commit
029afad6c1
4 changed files with 74 additions and 20 deletions
|
@ -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,
|
int bt_csip_set_member_register(const struct bt_csip_set_member_register_param *param,
|
||||||
struct bt_csip_set_member_svc_inst **svc_inst);
|
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
|
* @brief Print the SIRK to the debug output
|
||||||
*
|
*
|
||||||
|
|
|
@ -50,7 +50,15 @@ int bt_cap_acceptor_register(const struct bt_csip_set_member_register_param *par
|
||||||
|
|
||||||
err = bt_gatt_service_register(&cas);
|
err = bt_gatt_service_register(&cas);
|
||||||
if (err) {
|
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");
|
LOG_DBG("Failed to register CAS");
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,9 +144,13 @@ static int notify_lock_value(const struct bt_csip_set_member_svc_inst *svc_inst,
|
||||||
struct bt_conn *conn)
|
struct bt_conn *conn)
|
||||||
{
|
{
|
||||||
LOG_DBG("");
|
LOG_DBG("");
|
||||||
return csip_gatt_notify_set_lock(conn, svc_inst->service_p->attrs,
|
|
||||||
&svc_inst->set_lock,
|
if (svc_inst->service_p != NULL) {
|
||||||
sizeof(svc_inst->set_lock));
|
return csip_gatt_notify_set_lock(conn, svc_inst->service_p->attrs,
|
||||||
|
&svc_inst->set_lock, sizeof(svc_inst->set_lock));
|
||||||
|
} else {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void notify_client(struct bt_conn *conn, void *data)
|
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 ******************************/
|
/****************************** Public API ******************************/
|
||||||
void *bt_csip_set_member_svc_decl_get(const struct bt_csip_set_member_svc_inst *svc_inst)
|
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;
|
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;
|
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,
|
int bt_csip_set_member_lock(struct bt_csip_set_member_svc_inst *svc_inst,
|
||||||
bool lock, bool force)
|
bool lock, bool force)
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,17 +22,6 @@ struct bt_csip_set_member_register_param param = {
|
||||||
0x22, 0xfd, 0xa1, 0x21, 0x09, 0x7d, 0x7d, 0x45 },
|
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,
|
static void csip_lock_changed_cb(struct bt_conn *conn,
|
||||||
struct bt_csip_set_member_svc_inst *svc_inst,
|
struct bt_csip_set_member_svc_inst *svc_inst,
|
||||||
bool locked)
|
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)
|
static void test_main(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
@ -102,7 +87,17 @@ static void test_main(void)
|
||||||
return;
|
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)
|
static void test_force_release(void)
|
||||||
|
@ -116,11 +111,22 @@ static void test_force_release(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bt_conn_cb_register(&conn_callbacks);
|
WAIT_FOR_FLAG(flag_connected);
|
||||||
|
|
||||||
WAIT_FOR_COND(g_locked);
|
WAIT_FOR_COND(g_locked);
|
||||||
printk("Force releasing set\n");
|
printk("Force releasing set\n");
|
||||||
bt_csip_set_member_lock(svc_inst, false, true);
|
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)
|
static void test_csip_enc(void)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue