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

menuconfig BT_HAS
	bool "Hearing Access Service support [EXPERIMENTAL]"
	select EXPERIMENTAL
	select UTF8
	depends on BT_AUDIO_UNICAST_SERVER
	help
	  This option enables support for Hearing Access Service.

if BT_HAS

choice BT_HAS_HEARING_AID_TYPE_CHOICE
	prompt "Hearing Aid Type selection"
	help
	  Select the Hearing Aid Type to compile.

config BT_HAS_HEARING_AID_MONAURAL
	bool "Monaural Hearing Aid"

config BT_HAS_HEARING_AID_BINAURAL
	depends on BT_CSIP
	bool "Binaural Hearing Aid"

config BT_HAS_HEARING_AID_BANDED
	bool "Banded Hearing Aid"

endchoice # BT_HAS_HEARING_AID_TYPE_CHOICE

if BT_HAS_HEARING_AID_MONAURAL || BT_HAS_HEARING_AID_BINAURAL

choice BT_HAS_HEARING_AID_LOCATION
	prompt "Hearing Aid Device Location"
	help
	  Select the Hearing Aid Device location.

config BT_HAS_HEARING_AID_LEFT
	bool "Left Ear"

config BT_HAS_HEARING_AID_RIGHT
	bool "Right Ear"

endchoice # BT_HAS_HEARING_AID_LOCATION

endif # BT_HAS_HEARING_AID_MONAURAL || BT_HAS_HEARING_AID_BINAURAL

config BT_HAS_HEARING_AID_TYPE
	int # hidden
	range 0 2
	default 0 if BT_HAS_HEARING_AID_BINAURAL
	default 1 if BT_HAS_HEARING_AID_MONAURAL
	default 2 if BT_HAS_HEARING_AID_BANDED
	help
	  The value shall be one of 3 defined by the HAS 1.0 specification table 3.2

config BT_HAS_PRESET_COUNT
	int "Preset record list size"
	default 2
	range 0 255
	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

if BT_HAS_HEARING_AID_BINAURAL

config BT_HAS_IDENTICAL_PRESET_RECORDS
	bool "Identical preset records in Binaural Hearing Aid Set"
	help
	  Set if the list of preset records is identical to the list of preset records
	  on the other member in the Binaural Hearing Aid Set.
	  This option sets Independent Presets field in Hearing Aid Features to 0b0.

config BT_HAS_PRESET_SYNC_SUPPORT
	bool "Preset synchronization support"
	depends on BT_HAS_IDENTICAL_PRESET_RECORDS
	help
	  Set if the hearing aid has support for relaying active preset changes to the other
	  member in the Binaural Hearing Aid Set.

endif # BT_HAS_HEARING_AID_BINAURAL

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.

endif # BT_HAS_PRESET_SUPPORT

config BT_DEBUG_HAS
	bool "Hearing Access Service debug"
	help
	  This option enables enables Hearing Access Service debug logs.

endif # BT_HAS

config BT_HAS_CLIENT
	bool "Hearing Access Service Client support [EXPERIMENTAL]"
	select EXPERIMENTAL
	select BT_GATT_CLIENT
	select BT_GATT_AUTO_DISCOVER_CCC
	select BT_GATT_AUTO_UPDATE_MTU
	select UTF8
	help
	  This option enables support for Hearing Access Service Client.

config BT_DEBUG_HAS_CLIENT
	bool "Hearing Access Service Client debug"
	depends on BT_HAS_CLIENT
	help
	  This option enables enables Hearing Access Service Client debug logs.
