#
#   Copyright (c) 2021 Project CHIP Authors
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#

menuconfig CHIP
	bool "Matter protocol stack"
	default n
	select CPLUSPLUS
	imply LIB_CPLUSPLUS
	imply REQUIRES_FULL_LIBC
	imply NEWLIB_LIBC_NANO
	imply CBPRINTF_LIBC_SUBSTS
	imply POSIX_API if !ARCH_POSIX
	imply EVENTFD if !ARCH_POSIX
	imply REBOOT
	imply ENTROPY_GENERATOR
	imply NET_UDP
	imply NET_IPV6
	imply NET_CONFIG_NEED_IPV6
	imply NET_SOCKETS
	imply NETWORKING
	imply HWINFO
	imply FLASH
	imply FLASH_MAP
	imply NVS
	imply SETTINGS
	help
	  Enables Matter libraries required for the Matter protocol stack to work.

if CHIP

# Device and firmware identifers

config CHIP_DEVICE_VENDOR_ID
	int "Device Vendor ID"
	default 65521 # 0xFFF1
	range 0 65535
	help
	  Provides the 16-bit numeric identifier of the device manufacturer,
	  assigned by Connectivity Standards Alliance. The identifier is exposed as
	  an attribute of the Basic Informationcluster, and included in the header
	  of the generated Matter Over-the-air (OTA) update image.

config CHIP_DEVICE_VENDOR_NAME
	string "Device vendor name"
	help
	  Provides a human-readable name of the device manufacturer. The name is
	  exposed as an attribute of the Basic Information cluster.

config CHIP_DEVICE_PRODUCT_ID
	int "Product ID"
	default 32768 # 0x8000
	range 0 65535
	help
	  Provides the 16-bit numeric identifier of the product, assigned by the
	  device manufacturer. The identifier is exposed as an attribute of the
	  Basic Information cluster, and included in the header of the generated
	  Matter over-the-air (OTA) update image.

config CHIP_DEVICE_PRODUCT_NAME
	string "Product name"
	default "not-specified"
	help
	  Provides a human-readable product name, such as the model number, assigned
	  by the device manufacturer. The name is exposed as an attribute of the
	  Basic Information cluster.

config CHIP_DEVICE_HARDWARE_VERSION
	int "Hardware version"
	default 0
	help
	  Provides the 16-bit hardware version number, assigned by the device
	  manufacturer. The number is exposed as an attribute of the Basic
	  Information cluster.

config CHIP_DEVICE_HARDWARE_VERSION_STRING
	string "Hardware version string"
	default "prerelease"
	help
	  Provides a human-readable representation of the hardware version number.
	  This must be an ASCII string of a length between 1 and 64 characters. The
	  hardware version string is exposed as an attribute of the Basic
	  Information cluster.

config CHIP_DEVICE_SOFTWARE_VERSION
	int "Software version"
	default 0
	range 0 4294967295
	help
	  Provides the 32-bit software version number. The number is exposed as an
	  attribute of the Basic Information cluster, and included in the header of
	  the generated Matter Over-the-air (OTA) update image. The exact numbering
	  scheme is up to the device manufacturer. However, when using the Matter
	  OTA mechanism, only updates to higher versions than the current one are
	  accepted.

config CHIP_DEVICE_SOFTWARE_VERSION_STRING
	string "Software version string"
	default "prerelease"
	help
	  Provides a human-readable representation of the software version number.
	  This must be an ASCII string of a length between 1 and 64 characters. The
	  software version string is exposed as an attribute of the Basic
	  Information cluster, and included in the header of the generated Matter
	  over-the-air (OTA) update image.

config CHIP_DEVICE_MANUFACTURING_DATE
	string "Manufacturing date (ISO 8601 format)"
	default "2022-01-01"
	help
	  Provides the device manufacturing date in the ISO 8601 format: YYYY-MM-DD.

config CHIP_DEVICE_SERIAL_NUMBER
	string "Device serial number"
	default "11223344556677889900"
	help
	  Provides a human-readable representation of the device serial number that
	  uniquely identifies the device. This must be an ASCII string of no more
	  than 32 characters.

config CHIP_DEVICE_ROTATING_DEVICE_UID
	string "Rotating device ID unique ID (HEX format)"
	default "91a9c12a7c80700a31ddcfa7fce63e44"
	help
	  Provides a unique identifier of the device. This ID is used to derive the
	  rotating device identifier, which allows commissioners to discover the
	  device in a privacy-preserving way. The identifier must be a string of at
	  least 16 bytes encoded in HEX.

config CHIP_DEVICE_TYPE
	int "Primary device type"
	default 65535
	range 0 65535
	help
	  Provides the primary device type implemented by the node. This must be one
	  of the device type identifiers defined in the Matter Device Library
	  specification.

config CHIP_DEVICE_DISCRIMINATOR
	hex "Device pairing discriminator"
	default 0xF00
	help
	  Provides a 12-bit identifier that is used to discover the device during
	  the commissioning.

config CHIP_DEVICE_SPAKE2_PASSCODE
	int "SPAKE2+ passcode"
	default 20202021
	range 1 99999998
	help
	  Provides a pairing passcode. This is a 27-bit unsigned integer that serves
	  as a proof of possession during the commissioning. The passcode must be
	  a value between 1 and 99999998, excluding the following invalid passcodes:
	  00000000, 11111111, 22222222, 33333333, 44444444, 55555555,
	  66666666, 77777777, 88888888, 99999999, 12345678, 87654321.

config CHIP_DEVICE_SPAKE2_IT
	int "SPAKE2+ iteration count"
	default 1000
	help
	  Provides the SPAKE2+ iteration count, which is one of the input parameters
	  for the PBKDF operation, used to generate the SPAKE2+ verifier.

config CHIP_DEVICE_SPAKE2_SALT
	string "SPAKE2+ salt (base64 format)"
	default "U1BBS0UyUCBLZXkgU2FsdA=="
	help
	  Provides the SPAKE2+ salt, which is one of the input parameters for the
	  PBKDF operation, used to generate the SPAKE2+ verifier. The salt must be
	  of a length between 16 and 32 bytes and it should be randomly generated
	  for each SPAKE2+ passcode.

config CHIP_DEVICE_SPAKE2_TEST_VERIFIER
	string "SPAKE2+ verifier for testing purposes (base64 format)"
	default "uWFwqugDNGiEck/po7KHwwMwwqZgN10XuyBajPGuyzUEV/iree4lOrao5GuwnlQ65CJzbeUB49s31EH+NEkg0JVI5MGCQGMMT/SRPFNRODm3wH/MBiehuFc6FJ/NH6Rmzw=="
	help
	  Provides the SPAKE2+ verifier that was generated using the configured
	  SPAKE2+ passcode, iteration count and salt. This configuration option can
	  be used for development or testing purposes. The default value was
	  generated using the following command:
	  ./scripts/tools/spake2p/spake2p.py gen-verifier -i 1000 -s U1BBS0UyUCBLZXkgU2FsdA== -p 20202021

config CHIP_DEVICE_ENABLE_KEY
	string "Enable Key for triggering test actions (HEX format)"
	default "00112233445566778899AABBCCDDEEFF"
	help
	  Provides the Enable Key, which is a 16-byte value encoded in HEX that
	  must be provided in the TestEventTrigger command to trigger a requested
	  test action. This value is used during certification tests, and should not
	  be present on devices in production environment.

# Matter optional features and parameters

config CHIP_ENABLE_PAIRING_AUTOSTART
	bool "Open commissioning window on boot"
	default n
	help
	  Opens the commissioning window automatically at application boot time if
	  the node is not yet commissioned.

config CHIP_OTA_REQUESTOR
	bool "OTA Software Update Requestor"
	help
	  Enables over-the-air (OTA) Requestor role that allows the node to perform
	  Device Firmware Upgrade by quering and downloading a new firmware image
	  from a peer OTA Provider node.

config CHIP_ROTATING_DEVICE_ID
	bool "Generate rotating device ID"
	help
	  Enables the rotating device identifier that provides a non-trackable
	  identifier. The identifier is unique per device and rotates at pre-defined
	  moments.

config CHIP_COMMISSIONABLE_DEVICE_TYPE
	bool "Include device type subtype in commissionable node discovery record"
	help
	  Includes the device type subtype in the commissionable node discovery
	  record. This allows a commissioner to find the node when looking for
	  a specific device type.

config CHIP_EXTENDED_DISCOVERY
	bool "Extended discovery"
	help
	  Enables advertising of the commissionable node service even if the node
	  does not have the commissioning window open.

config CHIP_OPERATIONAL_TIME_SAVE_INTERVAL
	int "Total operational time save interval (hours unit)"
	default 10
	range 1 4294967295
	help
	  Provides an interval in hours with which the node operational time is
	  saved to the flash memory. The provided value is a trade-off between
	  performing frequent saves to know the precise operational time (in case of
	  device reboot) and maximizing the flash memory lifetime.

config CHIP_CRYPTO_PSA
	bool "Use PSA crypto API for cryptographic operations"
	help
	  Enables the implementation of the Matter cryptographic operations that is
	  based on the PSA crypto API (instead of the default implementation, which
	  is based on the legacy mbedTLS APIs).

config CHIP_LIB_SHELL
	bool "Matter shell commands"
	default n
	imply SHELL
	help
	  Enables linking the application with the library that contains Matter
	  shell commands.

config CHIP_PROJECT_CONFIG
	string "Project configuration file for Matter"
	help
	  Provides a path to the project configuration file for Matter. The path can
	  be either absolute or relative to the application directory. If specified,
	  Matter's generic configuration files will include the project
	  configuration file that can be used to override any of Matter's default or
	  platform-specific settings.

# Thread network features

config CHIP_ENABLE_DNSSD_SRP
	bool "OpenThread Service Registration Protocol"
	default y if NET_L2_OPENTHREAD
	imply OPENTHREAD_ECDSA
	imply OPENTHREAD_SRP_CLIENT
	help
	  Enables using the OpenThread SRP client for the Matter service
	  advertising.

config CHIP_ENABLE_DNS_CLIENT
	bool "OpenThread DNS client"
	default y if NET_L2_OPENTHREAD
	imply OPENTHREAD_DNS_CLIENT
	help
	  Enables using the OpenThread DNS client for the Matter service discovery.

config CHIP_ENABLE_SLEEPY_END_DEVICE_SUPPORT
	bool "Thread Sleepy End Device support"
	default n
	depends on OPENTHREAD_MTD
	imply OPENTHREAD_MTD_SED
	help
	  Enables the Thread Sleepy End Device (SED) support in Matter.

if CHIP_ENABLE_SLEEPY_END_DEVICE_SUPPORT

config CHIP_SED_IDLE_INTERVAL
	int "Sleepy End Device idle interval (ms)"
	default 1000
	help
	  Provides the Sleepy End Device wake interval in milliseconds while the
	  device is idle (which means that there is no active exchange to or from
	  the device, and its commissioning window is closed).

config CHIP_SED_ACTIVE_INTERVAL
	int "Sleepy End Device active interval (ms)"
	default 200
	help
	  Provides the Sleepy End Device wake interval in milliseconds while the
	  device is active (which means that there is an active exchange to or from
	  the device, or its commissioning window is open).

endif # CHIP_ENABLE_SLEEPY_END_DEVICE_SUPPORT

config CHIP_THREAD_SSED
	bool "Enable Thread Synchronized Sleepy End Device support"
	depends on OPENTHREAD_CSL_RECEIVER && CHIP_ENABLE_SLEEPY_END_DEVICE_SUPPORT
	help
	  Enables the Thread Synchronized Sleepy End Device support in Matter.

config CHIP_OPENTHREAD_CONFIG
	string "Custom OpenThread configuration file"
	help
	  Provides a path to an OpenThread configuration file. The path can be
	  either absolute or relative to the application directory. When this option
	  is specified, it replaces the OpenThread configuration file supplied by
	  Zephyr.

# Platform additions and configuration

config CHIP_CERTIFICATION_DECLARATION_STORAGE
	bool "Certification Declaration settings storage"
	depends on CHIP_FACTORY_DATA
	help
	  Enables storing of the Certification Declaration in Zephyr settings
	  instead of using the hardcoded value from firmware. This option also adds
	  support for including new Certification Declaration into a firmware
	  update image package that is sent as part of the OTA software update.

if CHIP_CERTIFICATION_DECLARATION_STORAGE

config CHIP_CERTIFiCATION_DECLARATION_OTA_IMAGE_ID
	int "Certification declaration OTA image ID"
	default 205 #0xcd
	help
	  Provides the image ID of the Certification Declaration image for sending
	  it as part of the OTA software update.

endif

config CHIP_FACTORY_RESET_ERASE_NVS
	bool "Erase NVS flash pages on factory reset"
	depends on SETTINGS_NVS
	help
	  Erases flash pages occupied by non-volatile storage when a factory reset
	  is requested, instead of removing Matter-related settings only. Enabling
	  this option provides a more robust factory reset mechanism and allows to
	  regain the original storage performance if any firmware issue has brought
	  it to an unexpected state. For this reason, set this option if the entire
	  configuration is supposed to be cleared on a factory reset, including
	  device-specific entries.

config CHIP_MALLOC_SYS_HEAP
	bool "Memory allocator based on Zephyr sys_heap"
	imply SYS_HEAP_RUNTIME_STATS
	help
	  Enables memory allocation functions that imitate the default malloc,
	  calloc, realloc and free, based on sys_heap from Zephyr RTOS.

if CHIP_MALLOC_SYS_HEAP

config CHIP_MALLOC_SYS_HEAP_OVERRIDE
	bool "Override default allocator with memory allocator based on Zephyr sys_heap"
	default y
	help
	  Replaces the default memory allocation functions (such as malloc, calloc,
	  realloc, free, and their reentrant versions) with their counterparts based
	  on sys_heap from Zephyr RTOS.

config CHIP_MALLOC_SYS_HEAP_SIZE
	int "Heap size used by memory allocator based on Zephyr sys_heap"
	default 16384 # 16kB
	help
	  Provides a value that controls how much of the device RAM is reserved for
	  the heap used by the memory allocation functions based on sys_heap from
	  Zephyr RTOS.

endif

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

# Build system options

config APP_LINK_WITH_CHIP
	bool "Link application with Matter libraries"
	default y
	help
	  Adds Matter directories to the 'app' target include paths and links the
	  'app' target with Matter libraries.

config CHIP_PW_RPC
	bool "Pigweed RPC library"
	default n
	help
	  Links the application with the libraries containing Pigweed RPC
	  functionalities.

config CHIP_BUILD_TESTS
	bool "Build Matter unit tests"
	default n
	help
	  Enables building Matter unit tests.

config CHIP_OTA_IMAGE_BUILD
	bool "Generate OTA image"
	help
	  Enables building Matter over-the-air (OTA) update image.

if CHIP_OTA_IMAGE_BUILD

config CHIP_OTA_IMAGE_FILE_NAME
	string "OTA image file name"
	default "matter.ota"
	help
	  Provides the file name of the generated Matter OTA image.

config CHIP_OTA_IMAGE_EXTRA_ARGS
	string "OTA image creator extra arguments"
	help
	  Provides optional arguments to the ota_image_tool.py script, used for
	  building Matter OTA image.

endif

endif
