# Bluetooth Object Transfer service

# Copyright (c) 2020-2022 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

config BT_OTS
	bool "Object Transfer Service (OTS) [EXPERIMENTAL]"
	select BT_L2CAP_DYNAMIC_CHANNEL
	select BT_GATT_DYNAMIC_DB
	select BT_SMP
	select EXPERIMENTAL
	help
	  Enable Object Transfer Service.

if BT_OTS

config BT_OTS_DIR_LIST_OBJ
	bool "The Directory Listing Object"
	help
	  Enables the Directory Listing Object, which is an object that contains all the metadata
	  from all other objects, for easy exposure to a client. Enabling this will use one of the
	  objects given by BT_OTS_MAX_OBJ_CNT.

config BT_OTS_DIR_LIST_OBJ_NAME
	string "The object name of the Directory Listing Object"
	default "Directory"
	depends on BT_OTS_DIR_LIST_OBJ
	help
	  The name of the Directory Listing Object when it is read by a client.

config BT_OTS_MAX_INST_CNT
	int "Maximum number of available OTS instances"
	default 1
	range 1 1 if !BT_OTS_SECONDARY_SVC

config BT_OTS_SECONDARY_SVC
	bool "Register OTS as Secondary Service"

config BT_OTS_OACP_CREATE_SUPPORT
	bool "Support OACP Create Operation"
	depends on BT_OTS_OACP_WRITE_SUPPORT
	depends on BT_OTS_OBJ_NAME_WRITE_SUPPORT

config BT_OTS_OACP_DELETE_SUPPORT
	bool "Support OACP Delete Operation"

config BT_OTS_OACP_READ_SUPPORT
	bool "Support OACP Read Operation"
	default y

config BT_OTS_OACP_WRITE_SUPPORT
	bool "Support OACP Write Operation"

config BT_OTS_OACP_PATCH_SUPPORT
	bool "Support patching of objects"
	depends on BT_OTS_OACP_WRITE_SUPPORT

config BT_OTS_OLCP_GO_TO_SUPPORT
	bool "Support OLCP Go To Operation"
	default y

config BT_OTS_OBJ_NAME_WRITE_SUPPORT
	bool "Support object name write"

endif # BT_OTS

#### Object Transfer Service Client ################################

config BT_OTS_CLIENT
	bool "Object Transfer Service Client [Experimental]"
	select BT_L2CAP_DYNAMIC_CHANNEL
	select BT_GATT_CLIENT
	select BT_GATT_AUTO_DISCOVER_CCC
	select EXPERIMENTAL
	help
	  This option enables support for the Object Transfer Service Client.

if BT_OTS_CLIENT

# TODO: Unify logging for OTS server and client - the client uses
# "BT" debugging, the server does not.

config BT_DEBUG_OTS_CLIENT
	bool "Object Transfer Service Client debug"
	select DEPRECATED
	help
	  Use this option to enable Object Transfer Client debug logs

module = BT_OTS_CLIENT
legacy-debug-sym = BT_DEBUG_OTS_CLIENT
module-str = "Object Transfer Service Client"
source "subsys/bluetooth/common/Kconfig.template.log_config_bt"

endif # BT_OTS_CLIENT

if BT_OTS || BT_OTS_CLIENT

config BT_OTS_MAX_OBJ_CNT
	hex "Maximum number of objects that each service instance can store"
	default 0x05
	# Given the maximum size of a directory listing record (172) and the maximum size of an
	# object using the net_buf implementation is 2^16-1, the maximum number of objects is given
	# by 2^16-1 / 172 = 381 == 0x17D)
	range 0x02 0x17D if BT_OTS_DIR_LIST_OBJ
	# Max obj count is otherwise the non-RFU IDs available
	range 0x01 0xFFFFFFFFFFFFFEFF

config BT_OTS_L2CAP_CHAN_TX_MTU
	int "Size of TX MTU for Object Transfer Channel"
	default 256
	range 21 65533

config BT_OTS_L2CAP_CHAN_RX_MTU
	int "Size of RX MTU for Object Transfer Channel"
	# RX MTU will be truncated to account for the L2CAP PDU and SDU header.
	default BT_BUF_ACL_RX_SIZE
	range 21 BT_BUF_ACL_RX_SIZE

config BT_OTS_OBJ_MAX_NAME_LEN
	int "Maximum object name length"
	# Max name length allowed by OTS spec is 120 octets
	# TODO: Set separate max name length for client, as other
	# servers may use the full 120 octets.
	default 120
	range 1 120

module = BT_OTS
module-str = BT_OTS
source "${ZEPHYR_BASE}/subsys/logging/Kconfig.template.log_config"

endif # BT_OTS || BT_OTS_CLIENT
