/** @file * @brief Internal APIs for Bluetooth AICS. */ /* * Copyright (c) 2020 Bose Corporation * Copyright (c) 2020 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_AICS_INTERNAL_ #define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_AICS_INTERNAL_ #include #include #include #include #include #include #include #include #if defined(CONFIG_BT_AICS) #define BT_AICS_MAX_DESC_SIZE CONFIG_BT_AICS_MAX_INPUT_DESCRIPTION_SIZE #else #define BT_AICS_MAX_DESC_SIZE 1 #endif /* CONFIG_BT_AICS */ /* AICS opcodes */ #define BT_AICS_OPCODE_SET_GAIN 0x01 #define BT_AICS_OPCODE_UNMUTE 0x02 #define BT_AICS_OPCODE_MUTE 0x03 #define BT_AICS_OPCODE_SET_MANUAL 0x04 #define BT_AICS_OPCODE_SET_AUTO 0x05 /* AICS status */ #define BT_AICS_STATUS_INACTIVE 0x00 #define BT_AICS_STATUS_ACTIVE 0x01 #define BT_AICS_INPUT_MODE_IMMUTABLE(gain_mode) \ ((gain_mode) == BT_AICS_MODE_MANUAL_ONLY || (gain_mode) == BT_AICS_MODE_AUTO_ONLY) #define BT_AICS_INPUT_MODE_SETTABLE(gain_mode) \ ((gain_mode) == BT_AICS_MODE_AUTO || (gain_mode) == BT_AICS_MODE_MANUAL) struct bt_aics_control { uint8_t opcode; uint8_t counter; } __packed; struct bt_aics_gain_control { struct bt_aics_control cp; int8_t gain_setting; } __packed; enum bt_aics_client_flag { BT_AICS_CLIENT_FLAG_BUSY, BT_AICS_CLIENT_FLAG_CP_RETRIED, BT_AICS_CLIENT_FLAG_DESC_WRITABLE, BT_AICS_CLIENT_FLAG_ACTIVE, BT_AICS_CLIENT_FLAG_NUM_FLAGS, /* keep as last */ }; struct bt_aics_client { uint8_t change_counter; uint8_t gain_mode; uint16_t start_handle; uint16_t end_handle; uint16_t state_handle; uint16_t gain_handle; uint16_t type_handle; uint16_t status_handle; uint16_t control_handle; uint16_t desc_handle; struct bt_gatt_subscribe_params state_sub_params; struct bt_gatt_subscribe_params status_sub_params; struct bt_gatt_subscribe_params desc_sub_params; struct bt_aics_gain_control cp_val; struct bt_gatt_write_params write_params; struct bt_gatt_read_params read_params; struct bt_gatt_discover_params discover_params; struct bt_aics_cb *cb; struct bt_conn *conn; ATOMIC_DEFINE(flags, BT_AICS_CLIENT_FLAG_NUM_FLAGS); }; struct bt_aics_state { int8_t gain; uint8_t mute; uint8_t gain_mode; uint8_t change_counter; } __packed; struct bt_aics_gain_settings { uint8_t units; int8_t minimum; int8_t maximum; } __packed; enum bt_aics_notify { AICS_NOTIFY_STATE, AICS_NOTIFY_DESCRIPTION, AICS_NOTIFY_STATUS, AICS_NOTIFY_NUM, }; struct bt_aics_server { struct bt_aics_state state; struct bt_aics_gain_settings gain_settings; bool initialized; uint8_t type; uint8_t status; struct bt_aics *inst; char description[BT_AICS_MAX_DESC_SIZE]; struct bt_aics_cb *cb; struct bt_gatt_service *service_p; ATOMIC_DEFINE(notify, AICS_NOTIFY_NUM); struct k_work_delayable notify_work; }; /* Struct used as a common type for the api */ struct bt_aics { bool client_instance; union { struct bt_aics_server srv; struct bt_aics_client cli; }; }; uint8_t aics_client_notify_handler(struct bt_conn *conn, struct bt_gatt_subscribe_params *params, const void *data, uint16_t length); int bt_aics_client_register(struct bt_aics *inst); int bt_aics_client_unregister(struct bt_aics *inst); int bt_aics_client_state_get(struct bt_aics *inst); int bt_aics_client_gain_setting_get(struct bt_aics *inst); int bt_aics_client_type_get(struct bt_aics *inst); int bt_aics_client_status_get(struct bt_aics *inst); int bt_aics_client_unmute(struct bt_aics *inst); int bt_aics_client_mute(struct bt_aics *inst); int bt_aics_client_manual_gain_set(struct bt_aics *inst); int bt_aics_client_automatic_gain_set(struct bt_aics *inst); int bt_aics_client_gain_set(struct bt_aics *inst, int8_t gain); int bt_aics_client_description_get(struct bt_aics *inst); int bt_aics_client_description_set(struct bt_aics *inst, const char *description); #endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_AICS_INTERNAL_ */