# Bluetooth Audio - Call control configuration options
#
# Copyright (c) 2020 Bose Corporation
# Copyright (c) 2024 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0
#

if BT_AUDIO

#####################  Telephone Bearer Service #####################

config BT_TBS
	bool "Telephone Bearer Service Support"
	depends on BT_GATT_DYNAMIC_DB
	depends on UTF8
	help
	  This option enables support for Telephone Bearer Service. By default this only
	  initializes the GTBS service. If specific TBS services are wanted, they need to be
	  enabled by setting BT_TBS_BEARER_COUNT to a non-zero value.

if BT_TBS

config BT_TBS_SUPPORTED_FEATURES
	int "Telephone Bearer Service Supported Features"
	default 1
	range 0 3
	help
	  Bitfield to set supported features of the bearer.
	  Bit 0: Local Hold and Retrieve
	  Bit 1: Join calls within Telephone Bearer Service

config BT_TBS_MAX_CALLS
	int "Telephone Bearer Service Maximum Number Of Calls Supported"
	default 3
	range 1 16
	help
	  Sets the maximum number of calls the service supports per bearer.

config BT_TBS_BEARER_COUNT
	int "How many bearer instances the device instantiates"
	default 0
	range 0 $(UINT8_MAX)
	help
	  Sets the number of TBS instances that are instantiated

config BT_TBS_MAX_SCHEME_LIST_LENGTH
	int "The maximum length of the URI scheme list"
	default 30
	range 0 512
	help
	  Sets the maximum length of the URI scheme list.

endif # BT_TBS


##################### Call Control Client #####################

config BT_TBS_CLIENT_GTBS
	bool "Generic Telephone Bearer Service client support"
	depends on UTF8
	help
	  This option enables support for the GTBS-oriented Call Control client.

config BT_TBS_CLIENT_TBS
	bool "Telephone Bearer Service client support"
	depends on UTF8
	help
	  This option enables support for the TBS-oriented Call Control client.

config BT_TBS_CLIENT
	def_bool BT_TBS_CLIENT_GTBS || BT_TBS_CLIENT_TBS
	select BT_GATT_CLIENT
	select BT_GATT_AUTO_DISCOVER_CCC

if BT_TBS_CLIENT

config BT_TBS_CLIENT_MAX_CALLS
	int "Maximum Number Of Calls Supported"
	default 1
	help
	  Sets the maximum number of calls the client supports per TBS instance.

config BT_TBS_CLIENT_MAX_TBS_INSTANCES
	int "Maximum number of TBS instances to setup"
	depends on BT_TBS_CLIENT_TBS
	default 1
	range 1 3
	help
	  Sets the maximum number of Telephone Bearer Service (TBS)
	  instances to setup and use.

config BT_TBS_CLIENT_MINIMAL
	bool "Minimal TBS Client without optional procedures"
	default n
	help
	  This option disables all optional procedures in the TBS Client.

config BT_TBS_CLIENT_BEARER_PROVIDER_NAME
	bool "Support reading Bearer Provider Name"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Bearer Provider Name.

config BT_TBS_CLIENT_BEARER_UCI
	bool "Support reading Bearer UCI"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Bearer UCI.

config BT_TBS_CLIENT_BEARER_TECHNOLOGY
	bool "Support reading Bearer Technology"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Bearer Technology.

config BT_TBS_CLIENT_BEARER_URI_SCHEMES_SUPPORTED_LIST
	bool "Support reading Bearer URI Schemes Supported List"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Bearer URI Schemes Supported
	  List.

config BT_TBS_CLIENT_BEARER_SIGNAL_STRENGTH
	bool "Support reading Bearer Signal Strength"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Bearer Signal Strength.

config BT_TBS_CLIENT_READ_BEARER_SIGNAL_INTERVAL
	bool "Support reading Bearer Signal Strength Reporting Interval"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Bearer Signal Strength
	  Reporting Interval.

config BT_TBS_CLIENT_SET_BEARER_SIGNAL_INTERVAL
	bool "Support setting Bearer Signal Strength Reporting Interval"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for setting Bearer Signal Strength
	  Reporting Interval.

config BT_TBS_CLIENT_BEARER_LIST_CURRENT_CALLS
	bool "Support reading Bearer List Current Calls"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Bearer List Current Calls.

config BT_TBS_CLIENT_CCID
	bool "Support reading Content Control ID"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Content Control ID.

config BT_TBS_CLIENT_INCOMING_URI
	bool "Support reading Incoming Call Target Bearer URI"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Incoming Call Target Bearer
	  URI.

config BT_TBS_CLIENT_STATUS_FLAGS
	bool "Support reading Status Flags"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Status Flags.

config BT_TBS_CLIENT_CP_PROCEDURES
	def_bool y
	depends on (BT_TBS_CLIENT_ACCEPT_CALL || \
		    BT_TBS_CLIENT_TERMINATE_CALL || \
		    BT_TBS_CLIENT_HOLD_CALL || \
		    BT_TBS_CLIENT_RETRIEVE_CALL || \
		    BT_TBS_CLIENT_ORIGINATE_CALL || \
		    BT_TBS_CLIENT_JOIN_CALLS)
	help
	  This hidden option indicates that there are at least one control
	  point procedure available.
	  When this option is disabled it indicates that the control point can
	  be optimized away.

config BT_TBS_CLIENT_ACCEPT_CALL
	bool "Support Accept Call"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for answering an incoming call.

config BT_TBS_CLIENT_TERMINATE_CALL
	bool "Support Terminate Call"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for terminating a call.

config BT_TBS_CLIENT_HOLD_CALL
	bool "Support Hold Call"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for putting a call on hold.

config BT_TBS_CLIENT_RETRIEVE_CALL
	bool "Support Retrieve Call"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for retrieving a call on hold.

config BT_TBS_CLIENT_ORIGINATE_CALL
	bool "Support Originate Call"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for originating a call.

config BT_TBS_CLIENT_JOIN_CALLS
	bool "Support Join Calls"
	depends on BT_TBS_CLIENT_MAX_CALLS > 1
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for joining calls.

config BT_TBS_CLIENT_OPTIONAL_OPCODES
	bool "Support reading Optional Opcodes"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Optional Opcodes.

config BT_TBS_CLIENT_INCOMING_CALL
	bool "Support reading Incoming Call"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Incoming Call.

config BT_TBS_CLIENT_CALL_FRIENDLY_NAME
	bool "Support reading Call Friendly Name"
	default !BT_TBS_CLIENT_MINIMAL
	help
	  This option enables support for reading Call Friendly Name.

endif # BT_TBS_CLIENT

if BT_TBS || BT_TBS_CLIENT

config BT_TBS_MAX_URI_LENGTH
	int "The maximum length of the call URI supported"
	default 30
	range 4 253
	help
	  Sets the maximum length of the call URI supported. Note that if this
	  value is lower than a call URI, the call request will be rejected.

config BT_TBS_MAX_PROVIDER_NAME_LENGTH
	int "The maximum length of the bearer provider name"
	default 30
	range 0 512
	help
	  Sets the maximum length of the bearer provider name.

endif # BT_TBS || BT_TBS_CLIENT

endif # BT_AUDIO
