# Bluetooth Audio - Hearing Access Service options
#
# Copyright (c) 2022 Codecoup
#
# SPDX-License-Identifier: Apache-2.0

menuconfig BT_HAS
	bool "Hearing Access Service support"
	depends on UTF8
	depends on BT_GATT_DYNAMIC_DB
	depends on BT_BAP_UNICAST_SERVER
	help
	  This option enables support for Hearing Access Service.

if BT_HAS

config BT_HAS_FEATURES_NOTIFIABLE
	bool "Hearing Aid Features Notifiable Support"
	help
	  This option enables support for clients to subscribe for notifications
	  on the Hearing Aid Features characteristic.

config BT_HAS_PRESET_COUNT
	int "Preset record list size"
	default 2
	range 0 $(UINT8_MAX)
	help
	  This option sets the number of Hearing Access Service Presets
	  that can be registered. Setting this value to 0 disables Presets support.

config BT_HAS_PRESET_SUPPORT
	def_bool BT_HAS_PRESET_COUNT > 0

if BT_HAS_PRESET_SUPPORT

config BT_HAS_PRESET_NAME_DYNAMIC
	bool "Allow to set preset name on runtime"
	help
	  Enabling this option allows for runtime configuration of preset name.

config BT_HAS_PRESET_CONTROL_POINT_NOTIFIABLE
	bool "Preset Control Point Notifiable support"
	depends on BT_EATT
	help
	  This option enables support for clients to subscribe for notifications
	  on the Hearing Aid Preset Control Point characteristic.

config BT_HAS_ACTIVE_PRESET_INDEX
	def_bool BT_HAS_PRESET_SUPPORT
	help
	  This option enables the Hearing Aid Active Preset Index characteristic.

endif # BT_HAS_PRESET_SUPPORT

endif # BT_HAS

config BT_HAS_CLIENT
	bool "Hearing Access Service Client support"
	depends on UTF8
	depends on BT_GATT_CLIENT
	depends on BT_GATT_AUTO_DISCOVER_CCC
	depends on BT_GATT_AUTO_UPDATE_MTU
	help
	  This option enables support for Hearing Access Service Client.
