# Bluetooth Object Transfer service

# Copyright (c) 2020 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
	help
	  Enable Object Transfer Service.

if BT_OTS

config BT_OTS_DIR_LIST_OBJ
	bool "Enables 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_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_SECONDARY_SVC
	bool "Register OTS as Secondary Service"

config BT_OTS_OACP_READ_SUPPORT
	bool "Support OACP Read Operation"
	default y

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

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"
	default 120
	range 1 120

config BT_OTS_OBJ_NAME_WRITE_SUPPORT
	bool "Support object name write"

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

endif # BT_OTS
