157 lines
4.1 KiB
C
157 lines
4.1 KiB
C
/** @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 <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include <zephyr/autoconf.h>
|
|
#include <zephyr/bluetooth/bluetooth.h>
|
|
#include <zephyr/bluetooth/gatt.h>
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/sys/atomic.h>
|
|
#include <zephyr/types.h>
|
|
|
|
#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_ */
|