Lines Matching refs:inst

41 static int aics_client_common_control(uint8_t opcode, struct bt_aics *inst);
63 struct bt_aics *inst; in aics_client_notify_handler() local
71 inst = lookup_aics_by_handle(conn, handle); in aics_client_notify_handler()
73 if (!inst) { in aics_client_notify_handler()
82 if (handle == inst->cli.state_handle) { in aics_client_notify_handler()
85 LOG_DBG("Inst %p: Gain %d, mute %u, gain_mode %u, counter %u", inst, in aics_client_notify_handler()
88 inst->cli.change_counter = state->change_counter; in aics_client_notify_handler()
90 if (inst->cli.cb && inst->cli.cb->state) { in aics_client_notify_handler()
91 inst->cli.cb->state(inst, 0, state->gain, in aics_client_notify_handler()
96 } else if (handle == inst->cli.status_handle) { in aics_client_notify_handler()
99 LOG_DBG("Inst %p: Status %u", inst, *status); in aics_client_notify_handler()
100 if (inst->cli.cb && inst->cli.cb->status) { in aics_client_notify_handler()
101 inst->cli.cb->status(inst, 0, *status); in aics_client_notify_handler()
104 } else if (handle == inst->cli.desc_handle) { in aics_client_notify_handler()
116 LOG_DBG("Inst %p: Input description: %s", inst, desc); in aics_client_notify_handler()
117 if (inst->cli.cb && inst->cli.cb->description) { in aics_client_notify_handler()
118 inst->cli.cb->description(inst, 0, desc); in aics_client_notify_handler()
132 struct bt_aics *inst = lookup_aics_by_handle(conn, params->single.handle); in aics_client_read_state_cb() local
137 if (!inst) { in aics_client_read_state_cb()
142 LOG_DBG("Inst %p: err: 0x%02X", inst, err); in aics_client_read_state_cb()
143 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in aics_client_read_state_cb()
147 if (inst->cli.cb && inst->cli.cb->state) { in aics_client_read_state_cb()
148 inst->cli.cb->state(inst, cb_err, 0, 0, 0); in aics_client_read_state_cb()
158 inst->cli.change_counter = state->change_counter; in aics_client_read_state_cb()
168 if (inst->cli.cb && inst->cli.cb->state) { in aics_client_read_state_cb()
169 inst->cli.cb->state(inst, cb_err, state->gain, in aics_client_read_state_cb()
181 struct bt_aics *inst = lookup_aics_by_handle(conn, params->single.handle); in aics_client_read_gain_settings_cb() local
187 if (!inst) { in aics_client_read_gain_settings_cb()
192 LOG_DBG("Inst %p: err: 0x%02X", inst, err); in aics_client_read_gain_settings_cb()
193 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in aics_client_read_gain_settings_cb()
197 if (inst->cli.cb && inst->cli.cb->gain_setting) { in aics_client_read_gain_settings_cb()
198 inst->cli.cb->gain_setting(inst, cb_err, 0, 0, 0); in aics_client_read_gain_settings_cb()
216 if (inst->cli.cb && inst->cli.cb->gain_setting) { in aics_client_read_gain_settings_cb()
217 inst->cli.cb->gain_setting(inst, cb_err, gain_settings->units, in aics_client_read_gain_settings_cb()
231 struct bt_aics *inst = lookup_aics_by_handle(conn, params->single.handle); in aics_client_read_type_cb() local
235 if (!inst) { in aics_client_read_type_cb()
240 LOG_DBG("Inst %p: err: 0x%02X", inst, err); in aics_client_read_type_cb()
241 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in aics_client_read_type_cb()
245 if (inst->cli.cb && inst->cli.cb->type) { in aics_client_read_type_cb()
246 inst->cli.cb->type(inst, cb_err, 0); in aics_client_read_type_cb()
263 if (inst->cli.cb && inst->cli.cb->type) { in aics_client_read_type_cb()
264 inst->cli.cb->type(inst, cb_err, *type); in aics_client_read_type_cb()
276 struct bt_aics *inst = lookup_aics_by_handle(conn, params->single.handle); in aics_client_read_status_cb() local
280 if (!inst) { in aics_client_read_status_cb()
285 LOG_DBG("Inst %p: err: 0x%02X", inst, err); in aics_client_read_status_cb()
286 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in aics_client_read_status_cb()
290 if (inst->cli.cb && inst->cli.cb->status) { in aics_client_read_status_cb()
291 inst->cli.cb->status(inst, cb_err, 0); in aics_client_read_status_cb()
308 if (inst->cli.cb && inst->cli.cb->status) { in aics_client_read_status_cb()
309 inst->cli.cb->status(inst, cb_err, *status); in aics_client_read_status_cb()
315 static void aics_cp_notify_app(struct bt_aics *inst, uint8_t err) in aics_cp_notify_app() argument
317 if (!inst->cli.cb) { in aics_cp_notify_app()
321 switch (inst->cli.cp_val.cp.opcode) { in aics_cp_notify_app()
323 if (inst->cli.cb->set_gain) { in aics_cp_notify_app()
324 inst->cli.cb->set_gain(inst, err); in aics_cp_notify_app()
328 if (inst->cli.cb->unmute) { in aics_cp_notify_app()
329 inst->cli.cb->unmute(inst, err); in aics_cp_notify_app()
333 if (inst->cli.cb->mute) { in aics_cp_notify_app()
334 inst->cli.cb->mute(inst, err); in aics_cp_notify_app()
338 if (inst->cli.cb->set_manual_mode) { in aics_cp_notify_app()
339 inst->cli.cb->set_manual_mode(inst, err); in aics_cp_notify_app()
343 if (inst->cli.cb->set_auto_mode) { in aics_cp_notify_app()
344 inst->cli.cb->set_auto_mode(inst, err); in aics_cp_notify_app()
348 LOG_DBG("Unknown opcode 0x%02x", inst->cli.cp_val.cp.opcode); in aics_cp_notify_app()
358 struct bt_aics *inst = lookup_aics_by_handle(conn, params->single.handle); in internal_read_state_cb() local
363 if (!inst) { in internal_read_state_cb()
376 inst->cli.change_counter = state->change_counter; in internal_read_state_cb()
379 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in internal_read_state_cb()
381 if (inst->cli.cp_val.cp.opcode == BT_AICS_OPCODE_SET_GAIN) { in internal_read_state_cb()
382 write_err = bt_aics_client_gain_set(inst, in internal_read_state_cb()
383 inst->cli.cp_val.gain_setting); in internal_read_state_cb()
385 write_err = aics_client_common_control(inst->cli.cp_val.cp.opcode, in internal_read_state_cb()
386 inst); in internal_read_state_cb()
402 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in internal_read_state_cb()
403 aics_cp_notify_app(inst, cb_err); in internal_read_state_cb()
414 struct bt_aics *inst = lookup_aics_by_handle(conn, params->handle); in aics_client_write_aics_cp_cb() local
418 if (!inst) { in aics_client_write_aics_cp_cb()
423 LOG_DBG("Inst %p: err: %d", inst, cb_err); in aics_client_write_aics_cp_cb()
432 atomic_test_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_CP_RETRIED)) { in aics_client_write_aics_cp_cb()
434 } else if (cb_err == BT_AICS_ERR_INVALID_COUNTER && inst->cli.state_handle) { in aics_client_write_aics_cp_cb()
435 inst->cli.read_params.func = internal_read_state_cb; in aics_client_write_aics_cp_cb()
436 inst->cli.read_params.handle_count = 1; in aics_client_write_aics_cp_cb()
437 inst->cli.read_params.single.handle = inst->cli.state_handle; in aics_client_write_aics_cp_cb()
438 inst->cli.read_params.single.offset = 0U; in aics_client_write_aics_cp_cb()
440 atomic_set_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_CP_RETRIED); in aics_client_write_aics_cp_cb()
442 cb_err = bt_gatt_read(conn, &inst->cli.read_params); in aics_client_write_aics_cp_cb()
453 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_CP_RETRIED); in aics_client_write_aics_cp_cb()
454 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in aics_client_write_aics_cp_cb()
456 aics_cp_notify_app(inst, cb_err); in aics_client_write_aics_cp_cb()
459 static int aics_client_common_control(uint8_t opcode, struct bt_aics *inst) in aics_client_common_control() argument
463 CHECKIF(!inst) { in aics_client_common_control()
468 CHECKIF(!inst->client_instance) { in aics_client_common_control()
473 CHECKIF(inst->cli.conn == NULL) { in aics_client_common_control()
478 if (!inst->cli.control_handle) { in aics_client_common_control()
481 } else if (atomic_test_and_set_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY)) { in aics_client_common_control()
485 inst->cli.cp_val.cp.opcode = opcode; in aics_client_common_control()
486 inst->cli.cp_val.cp.counter = inst->cli.change_counter; in aics_client_common_control()
488 inst->cli.write_params.offset = 0; in aics_client_common_control()
489 inst->cli.write_params.data = &inst->cli.cp_val.cp; in aics_client_common_control()
490 inst->cli.write_params.length = sizeof(inst->cli.cp_val.cp); in aics_client_common_control()
491 inst->cli.write_params.handle = inst->cli.control_handle; in aics_client_common_control()
492 inst->cli.write_params.func = aics_client_write_aics_cp_cb; in aics_client_common_control()
494 err = bt_gatt_write(inst->cli.conn, &inst->cli.write_params); in aics_client_common_control()
496 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in aics_client_common_control()
508 struct bt_aics *inst = lookup_aics_by_handle(conn, params->single.handle); in aics_client_read_desc_cb() local
512 if (!inst) { in aics_client_read_desc_cb()
517 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in aics_client_read_desc_cb()
521 if (inst->cli.cb && inst->cli.cb->description) { in aics_client_read_desc_cb()
522 inst->cli.cb->description(inst, cb_err, NULL); in aics_client_read_desc_cb()
545 if (inst->cli.cb && inst->cli.cb->description) { in aics_client_read_desc_cb()
546 inst->cli.cb->description(inst, cb_err, desc); in aics_client_read_desc_cb()
552 static bool valid_inst_discovered(struct bt_aics *inst) in valid_inst_discovered() argument
554 return inst->cli.state_handle && in valid_inst_discovered()
555 inst->cli.gain_handle && in valid_inst_discovered()
556 inst->cli.type_handle && in valid_inst_discovered()
557 inst->cli.status_handle && in valid_inst_discovered()
558 inst->cli.control_handle && in valid_inst_discovered()
559 inst->cli.desc_handle; in valid_inst_discovered()
627 struct bt_aics *inst = CONTAINER_OF(client_inst, struct bt_aics, cli); in aics_discover_func() local
632 LOG_DBG("Discovery complete for AICS %p", inst); in aics_discover_func()
636 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in aics_discover_func()
638 if (inst->cli.cb && inst->cli.cb->discover) { in aics_discover_func()
639 err = valid_inst_discovered(inst) ? 0 : -ENOENT; in aics_discover_func()
641 inst->cli.cb->discover(inst, err); in aics_discover_func()
652 if (inst->cli.start_handle == 0U) { /* if start handle is unset */ in aics_discover_func()
653 inst->cli.start_handle = chrc->value_handle; in aics_discover_func()
655 inst->cli.end_handle = chrc->value_handle; in aics_discover_func()
660 client_inst->cb->discover(inst, err); in aics_discover_func()
669 static void aics_client_reset(struct bt_aics *inst) in aics_client_reset() argument
671 inst->cli.change_counter = 0; in aics_client_reset()
672 inst->cli.gain_mode = 0; in aics_client_reset()
673 inst->cli.start_handle = 0; in aics_client_reset()
674 inst->cli.end_handle = 0; in aics_client_reset()
675 inst->cli.state_handle = 0; in aics_client_reset()
676 inst->cli.gain_handle = 0; in aics_client_reset()
677 inst->cli.type_handle = 0; in aics_client_reset()
678 inst->cli.status_handle = 0; in aics_client_reset()
679 inst->cli.control_handle = 0; in aics_client_reset()
680 inst->cli.desc_handle = 0; in aics_client_reset()
682 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_DESC_WRITABLE); in aics_client_reset()
683 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_CP_RETRIED); in aics_client_reset()
685 if (inst->cli.conn != NULL) { in aics_client_reset()
686 struct bt_conn *conn = inst->cli.conn; in aics_client_reset()
689 inst->cli.conn = NULL; in aics_client_reset()
706 int bt_aics_discover(struct bt_conn *conn, struct bt_aics *inst, in bt_aics_discover() argument
711 CHECKIF(!inst || !conn || !param) { in bt_aics_discover()
712 LOG_DBG("%s cannot be NULL", inst == NULL ? "inst" in bt_aics_discover()
724 CHECKIF(!atomic_test_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_ACTIVE)) { in bt_aics_discover()
729 if (atomic_test_and_set_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY)) { in bt_aics_discover()
734 aics_client_reset(inst); in bt_aics_discover()
736 (void)memset(&inst->cli.discover_params, 0, sizeof(inst->cli.discover_params)); in bt_aics_discover()
738 inst->cli.discover_params.start_handle = param->start_handle; in bt_aics_discover()
739 inst->cli.discover_params.end_handle = param->end_handle; in bt_aics_discover()
740 inst->cli.discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; in bt_aics_discover()
741 inst->cli.discover_params.func = aics_discover_func; in bt_aics_discover()
743 err = bt_gatt_discover(conn, &inst->cli.discover_params); in bt_aics_discover()
745 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in bt_aics_discover()
748 inst->cli.conn = bt_conn_ref(conn); in bt_aics_discover()
788 int bt_aics_client_state_get(struct bt_aics *inst) in bt_aics_client_state_get() argument
792 CHECKIF(!inst) { in bt_aics_client_state_get()
797 CHECKIF(!inst->client_instance) { in bt_aics_client_state_get()
802 CHECKIF(inst->cli.conn == NULL) { in bt_aics_client_state_get()
807 if (!inst->cli.state_handle) { in bt_aics_client_state_get()
810 } else if (atomic_test_and_set_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY)) { in bt_aics_client_state_get()
814 inst->cli.read_params.func = aics_client_read_state_cb; in bt_aics_client_state_get()
815 inst->cli.read_params.handle_count = 1; in bt_aics_client_state_get()
816 inst->cli.read_params.single.handle = inst->cli.state_handle; in bt_aics_client_state_get()
818 err = bt_gatt_read(inst->cli.conn, &inst->cli.read_params); in bt_aics_client_state_get()
820 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in bt_aics_client_state_get()
826 int bt_aics_client_gain_setting_get(struct bt_aics *inst) in bt_aics_client_gain_setting_get() argument
830 CHECKIF(!inst) { in bt_aics_client_gain_setting_get()
835 CHECKIF(!inst->client_instance) { in bt_aics_client_gain_setting_get()
840 CHECKIF(inst->cli.conn == NULL) { in bt_aics_client_gain_setting_get()
845 if (!inst->cli.gain_handle) { in bt_aics_client_gain_setting_get()
848 } else if (atomic_test_and_set_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY)) { in bt_aics_client_gain_setting_get()
852 inst->cli.read_params.func = aics_client_read_gain_settings_cb; in bt_aics_client_gain_setting_get()
853 inst->cli.read_params.handle_count = 1; in bt_aics_client_gain_setting_get()
854 inst->cli.read_params.single.handle = inst->cli.gain_handle; in bt_aics_client_gain_setting_get()
856 err = bt_gatt_read(inst->cli.conn, &inst->cli.read_params); in bt_aics_client_gain_setting_get()
858 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in bt_aics_client_gain_setting_get()
864 int bt_aics_client_type_get(struct bt_aics *inst) in bt_aics_client_type_get() argument
868 CHECKIF(!inst) { in bt_aics_client_type_get()
873 CHECKIF(!inst->client_instance) { in bt_aics_client_type_get()
878 CHECKIF(inst->cli.conn == NULL) { in bt_aics_client_type_get()
883 if (!inst->cli.type_handle) { in bt_aics_client_type_get()
886 } else if (atomic_test_and_set_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY)) { in bt_aics_client_type_get()
890 inst->cli.read_params.func = aics_client_read_type_cb; in bt_aics_client_type_get()
891 inst->cli.read_params.handle_count = 1; in bt_aics_client_type_get()
892 inst->cli.read_params.single.handle = inst->cli.type_handle; in bt_aics_client_type_get()
894 err = bt_gatt_read(inst->cli.conn, &inst->cli.read_params); in bt_aics_client_type_get()
896 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in bt_aics_client_type_get()
902 int bt_aics_client_status_get(struct bt_aics *inst) in bt_aics_client_status_get() argument
906 CHECKIF(!inst) { in bt_aics_client_status_get()
911 CHECKIF(!inst->client_instance) { in bt_aics_client_status_get()
916 CHECKIF(inst->cli.conn == NULL) { in bt_aics_client_status_get()
921 if (!inst->cli.status_handle) { in bt_aics_client_status_get()
924 } else if (atomic_test_and_set_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY)) { in bt_aics_client_status_get()
928 inst->cli.read_params.func = aics_client_read_status_cb; in bt_aics_client_status_get()
929 inst->cli.read_params.handle_count = 1; in bt_aics_client_status_get()
930 inst->cli.read_params.single.handle = inst->cli.status_handle; in bt_aics_client_status_get()
932 err = bt_gatt_read(inst->cli.conn, &inst->cli.read_params); in bt_aics_client_status_get()
934 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in bt_aics_client_status_get()
940 int bt_aics_client_unmute(struct bt_aics *inst) in bt_aics_client_unmute() argument
942 return aics_client_common_control(BT_AICS_OPCODE_UNMUTE, inst); in bt_aics_client_unmute()
945 int bt_aics_client_mute(struct bt_aics *inst) in bt_aics_client_mute() argument
947 return aics_client_common_control(BT_AICS_OPCODE_MUTE, inst); in bt_aics_client_mute()
950 int bt_aics_client_manual_gain_set(struct bt_aics *inst) in bt_aics_client_manual_gain_set() argument
952 return aics_client_common_control(BT_AICS_OPCODE_SET_MANUAL, inst); in bt_aics_client_manual_gain_set()
955 int bt_aics_client_automatic_gain_set(struct bt_aics *inst) in bt_aics_client_automatic_gain_set() argument
957 return aics_client_common_control(BT_AICS_OPCODE_SET_AUTO, inst); in bt_aics_client_automatic_gain_set()
960 int bt_aics_client_gain_set(struct bt_aics *inst, int8_t gain) in bt_aics_client_gain_set() argument
964 CHECKIF(!inst) { in bt_aics_client_gain_set()
969 CHECKIF(!inst->client_instance) { in bt_aics_client_gain_set()
974 CHECKIF(inst->cli.conn == NULL) { in bt_aics_client_gain_set()
979 if (!inst->cli.control_handle) { in bt_aics_client_gain_set()
982 } else if (atomic_test_and_set_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY)) { in bt_aics_client_gain_set()
986 inst->cli.cp_val.cp.opcode = BT_AICS_OPCODE_SET_GAIN; in bt_aics_client_gain_set()
987 inst->cli.cp_val.cp.counter = inst->cli.change_counter; in bt_aics_client_gain_set()
988 inst->cli.cp_val.gain_setting = gain; in bt_aics_client_gain_set()
990 inst->cli.write_params.data = &inst->cli.cp_val; in bt_aics_client_gain_set()
991 inst->cli.write_params.length = sizeof(inst->cli.cp_val); in bt_aics_client_gain_set()
992 inst->cli.write_params.handle = inst->cli.control_handle; in bt_aics_client_gain_set()
993 inst->cli.write_params.func = aics_client_write_aics_cp_cb; in bt_aics_client_gain_set()
995 err = bt_gatt_write(inst->cli.conn, &inst->cli.write_params); in bt_aics_client_gain_set()
997 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in bt_aics_client_gain_set()
1003 int bt_aics_client_description_get(struct bt_aics *inst) in bt_aics_client_description_get() argument
1007 CHECKIF(!inst) { in bt_aics_client_description_get()
1012 CHECKIF(!inst->client_instance) { in bt_aics_client_description_get()
1017 CHECKIF(inst->cli.conn == NULL) { in bt_aics_client_description_get()
1022 if (!inst->cli.desc_handle) { in bt_aics_client_description_get()
1025 } else if (atomic_test_and_set_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY)) { in bt_aics_client_description_get()
1029 inst->cli.read_params.func = aics_client_read_desc_cb; in bt_aics_client_description_get()
1030 inst->cli.read_params.handle_count = 1; in bt_aics_client_description_get()
1031 inst->cli.read_params.single.handle = inst->cli.desc_handle; in bt_aics_client_description_get()
1033 err = bt_gatt_read(inst->cli.conn, &inst->cli.read_params); in bt_aics_client_description_get()
1035 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in bt_aics_client_description_get()
1041 int bt_aics_client_description_set(struct bt_aics *inst, in bt_aics_client_description_set() argument
1046 CHECKIF(!inst) { in bt_aics_client_description_set()
1051 CHECKIF(!inst->client_instance) { in bt_aics_client_description_set()
1056 CHECKIF(inst->cli.conn == NULL) { in bt_aics_client_description_set()
1061 if (!inst->cli.desc_handle) { in bt_aics_client_description_set()
1064 } else if (!atomic_test_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_DESC_WRITABLE)) { in bt_aics_client_description_set()
1067 } else if (atomic_test_and_set_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY)) { in bt_aics_client_description_set()
1071 err = bt_gatt_write_without_response(inst->cli.conn, inst->cli.desc_handle, description, in bt_aics_client_description_set()
1074 atomic_clear_bit(inst->cli.flags, BT_AICS_CLIENT_FLAG_BUSY); in bt_aics_client_description_set()
1080 void bt_aics_client_cb_register(struct bt_aics *inst, struct bt_aics_cb *cb) in bt_aics_client_cb_register() argument
1082 CHECKIF(!inst) { in bt_aics_client_cb_register()
1087 inst->cli.cb = cb; in bt_aics_client_cb_register()