# 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"
	help
	  Use this option to enable Object Transfer Client debug logs

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
