#
#    Copyright (c) 2020-2022 Project CHIP Authors
#    Copyright (c) 2018 Nest Labs, Inc.
#    All rights reserved.
#
#    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.
#
#    Description:
#      Configuration options CHIP within the ESP32 ESP-IDF environment.
#

#
# Options for configuring CHIP core
#
menu "CHIP Core"

    menu "General Options"

        config MAX_EXCHANGE_CONTEXTS
            int "Max CHIP Exchange Contexts"
            range 0 65535
            default 8
            help
                The maximum number of simultaneously active CHIP exchange contexts.

                An exchange context object is used to track the state of an ongoing CHIP message
                exchange (conversation) with a peer, e.g. a cloud service, a mobile application, or
                another device.

        config MAX_BINDINGS
            int "Max Bindings"
            range 0 65535
            default 8
            help
                The maximum number of simultaneously active CHIP Binding objects.

                A Binding object is used to configure how the local device communicates with
                a remote entity, be it a cloud service, a mobile application, or another device.

        config MAX_FABRICS
            int "Max Fabrics"
            range 5 255
            default 5
            help
                The maxinum number of fabrics the device can participate in.

                Each fabric can provision the device with its unique operational credentials and
                manage its own access control lists.

        config MAX_PEER_NODES
            int "Max Peer Nodes"
            range 0 65535
            default 16
            help
                The maximum number of peer nodes that the local node can communicate with using
                connectionless communication (e.g. UDP).  This value sizes a table that tracks
                communication state with peer nodes by their CHIP node id.

        config MAX_UNSOLICITED_MESSAGE_HANDLERS
            int "Max Unsolicited Message Handlers"
            range 0 65535
            default 8
            help
                The maximum number of simultaneously active unsolicited message handlers.

                Applications or protocol libraries acting as a CHIP server register unsolicited
                message handlers with the CHIP message layer to direct incoming messages to
                their code.

        config ENABLE_PW_RPC
            bool "Enable Pigweed RPC library"
            default n
            help
                Link the application with the library containing Pigweed RPC functionalities

        config USE_MINIMAL_MDNS
            bool "Use the minimal mDNS implementation shipped in the CHIP library"
            default y
            help
                The CHIP library is shipped with a minimal mDNS implementation,
                enable this config to use it rather than the mDNS library in IDF.

        config ENABLE_CHIP_SHELL
            bool "Use the CHIP shell library"
            default n
            help
                Link the application against CHIP interactive shell.

        config DISABLE_IPV4
            bool "Disable IPv4 functionality in the CHIP stack"
            default "n"
            help
                Matter spec is based on IPv6 communication only. Enabling this option may save some flash/ram.

        config BUILD_CHIP_TESTS
            bool "Build CHIP tests"
            default "y"
            help
                Build CHIP test binaries.

        # TODO: add log level selection

    endmenu # "General Options"

    menu "Networking Options"

        config NUM_TCP_ENDPOINTS
            int "Max TCP EndPoints"
            default 8
            help
                The maximum number of simultaneously active TCP EndPoint objects.

                CHIP generally needs one TCP EndPoint object for each active CHIP TCP
                connection, plus up to 3 additional EndPoints to listen for incoming
                connections.

        config NUM_UDP_ENDPOINTS
            int "Max UDP EndPoints"
            default 8
            help
                The maximum number of simultaneously active UDP EndPoint objects.

                CHIP generally needs one UDP EndPoint object for each local network
                interface, plus 2 additional EndPoints for general UDP communcation.

        config MAX_CONNECTIONS
            int "Max CHIP Connections"
            range 0 65535
            default 8
            help
                The maximum number of simultaneously active CHIP connections, either locally
                or remotely initiated.  This limit covers both CHIP TCP connections, and
                CHIP-over-BLE (WoBLE) connections.

        config DEFAULT_INCOMING_CONNECTION_IDLE_TIMEOUT
            int "Default Incoming Connection Idle Timeout (ms)"
            range 0 1000000
            default 15000
            help
                The maximum amount of time, in milliseconds, that an idle inbound
                CHIP connection will be allowed to exist before being closed.

                This is a default value that can be overridden at runtime by the
                application.

                A value of 0 disables automatic closing of idle connections.

    endmenu # "Networking Options"

    menu "System Options"

        config NUM_TIMERS
            int "Max System Timers"
            default 32
            help
                The maximum number of simultaneously timers in the CHIP System Layer.

        config ENABLE_OTA_REQUESTOR
            bool "Enable OTA Requestor"
            default n
            help
                Enable this option to enable OTA Requestor for example

    endmenu # "System Options"

    menu "Security Options"

        config MAX_SESSION_KEYS
            int "Max Session Keys"
            range 0 65535
            default 8
            help
                The maximum number of simultaneously active session keys.

        menu "Debugging"

            config SECURITY_TEST_MODE
                bool "Enable CHIP Security Test Mode"
                default n
                help
                    Enable various features that make it easier to debug secure CHIP communication.

                    WARNING: This option makes it possible to circumvent basic CHIP security functionality,
                    including message encryption. Because of this it SHOULD NEVER BE ENABLED IN PRODUCTION BUILDS.

            config DISABLE_PROVISIONING_AUTH
                bool "Disable Provisioning Authentication Checks"
                default n
                help
                    Disable authentication checks for CHIP provisioning operations.  This makes it possible to
                    perform device provisioning operations (e.g. adding a network or joining a fabric) without
                    establishing a secure session.

                    WARNING: This option makes it possible to circumvent basic CHIP security functionality.
                    Because of this it SHOULD NEVER BE ENABLED IN PRODUCTION BUILDS.

        endmenu # "Debugging"

    endmenu # "Security Options"

endmenu # "CHIP"


#
# Options for configuring the CHIP Device Layer
#
menu "CHIP Device Layer"

    menu "General Options"
        config CHIP_PROJECT_CONFIG
            string "CHIP Project Configuration file"
            default ""
            help
                CHIP's project configuration file location.

        config CHIP_TASK_STACK_SIZE
            int "CHIP Task Stack Size"
            range 0 65535
            default 8192
            help
                The size (in bytes) of the CHIP task stack.

        config CHIP_TASK_PRIORITY
            int "CHIP Task Priority"
            range 0 256
            default 1
            help
                The priority of the CHIP task.

                On the ESP32 platform this value is added to ESP_TASK_PRIO_MIN to determine the FreeRTOS priority value.

        config MAX_EVENT_QUEUE_SIZE
            int "Max Event Queue Size"
            range 0 65535
            default 25
            help
                The maximum number of events that can be held in the CHIP Platform event queue.

        config SERVICE_DIRECTORY_CACHE_SIZE
            int "CHIP Service Directory Cache Size"
            range 0 65535
            default 512
            help
                The size (in bytes) of the service directory cache.  This limits the maximum size of the directory
                that can be returned in response to a service directory query.
        
        config ENABLE_EXTENDED_DISCOVERY
            bool "Enable Extended discovery Support"
            default n
            help
                Enables support for Extended Discovery.

        config ENABLE_COMMISSIONABLE_DEVICE_TYPE
            bool "Enable Device type in commissionable node discovery."
            default n
            help
                Enables or Disables the support for Commissionable Device Type.

    endmenu

    menu "Device Identification Options"

        config DEVICE_VENDOR_ID
            hex "Device Vendor Id"
            range 1 0xFFFE
            default 0xFFF1
            help
                The device vendor id (in hex). This a CHIP-assigned id for the organization responsible for producing the device.
                Defaults to test VID 0xFFF1.

        config DEVICE_PRODUCT_ID
            hex "Device Product Id"
            range 1 0xFFFE
            default 0x8000
            help
                The device product id (in hex).  This is a unique id assigned by the device vendor to identify the product or device type.
                Defaults to a CHIP-assigned id designating a non-production or test "product".

        config DEFAULT_DEVICE_HARDWARE_VERSION
            int "Default Device Hardware Version"
            range 0 65535
            default 0
            help
                The default device hardware version.

                Hardware versions are specific to a particular device vendor and product id, and typically
                correspond to a version of the physical device, a change to its packaging, and/or a change
                to its marketing presentation. This value is generally *not* incremented for device software
                versions.

                This is a default value which is used when a hardware version has not been stored in device
                persistent storage (e.g. by a factory provisioning process).

        config DEVICE_SOFTWARE_VERSION
            string "Device Software Version String"
            default "v1.0"
            help
                A string identifying the software version running on the device.

        config DEVICE_SOFTWARE_VERSION_NUMBER
            int "Device Software Version Number"
            default 1
            help
                Software version number running on the device.

        config DEVICE_TYPE
            int "Default Device type"
            default 0
            help
                The default device type.

    endmenu

    menu "WiFi Station Options"

        config ENABLE_WIFI_STATION
            bool "Enable CHIP WIFI STATION"
            default y
            help
                Enables WiFi station for CHIP.

        config DEFAULT_WIFI_SSID
            string "Default WiFi SSID"
            default ""
            depends on ENABLE_WIFI_STATION
            help
                The SSID of network to connect to if no WiFi station configuration exists in NV storage
                at the time the device boots.

                This option is for testing only and should be disabled in production releases.

        config DEFAULT_WIFI_PASSWORD
            string "Default WiFi Password"
            default ""
            depends on ENABLE_WIFI_STATION
            help
                The password for the default WiFi network.

                This option is for testing only and should be disabled in production releases.

        config WIFI_STATION_RECONNECT_INTERVAL
            int "WiFi Station Interface Reconnect Interval (ms)"
            range 0 65535
            default 5000
            depends on ENABLE_WIFI_STATION
            help
                The interval at which the CHIP platform will attempt to reconnect to the configured WiFi network (in milliseconds).

        config MAX_SCAN_NETWORKS_RESULTS
            int "Max ScanNetworks Results"
            range 0 65535
            default 10
            depends on ENABLE_WIFI_STATION
            help
                The maximum number of networks to return as a result of a CHIP NetworkProvisioning:ScanNetworks request.

        config WIFI_SCAN_COMPLETION_TIMEOUT
            int "WiFi Scan Completion Timeout (ms)"
            range 0 65535
            default 10000
            depends on ENABLE_WIFI_STATION
            help
                The amount of time (in milliseconds) after which the CHIP platform will timeout a WiFi scan
                operation that hasn't completed.  A value of 0 will disable the timeout logic.

        config WIFI_CONNECTIVITY_TIMEOUT
            int "WiFi Connectivity Timeout (ms)"
            range 0 65535
            default 30000
            depends on ENABLE_WIFI_STATION
            help
                The amount of time (in milliseconds) to wait for Internet connectivity to be established on
                the device's WiFi station interface during a Network Provisioning TestConnectivity operation.

    endmenu

    menu "WiFi AP Options"

        config ENABLE_WIFI_AP
            bool "Enable CHIP WIFI AP"
            default y
            help
                Enables WiFi AP for CHIP.

        config WIFI_AP_SSID_PREFIX
            string "WiFi AP SSID Prefix"
            default "MATTER-"
            depends on ENABLE_WIFI_AP
            help
                A prefix string used in forming the WiFi soft-AP SSID.  The remainder of the SSID
                consists of the final two bytes of the device's primary WiFi MAC address in hex.

        config WIFI_AP_CHANNEL
            int "WiFi AP Channel"
            range 1 14
            default 1
            depends on ENABLE_WIFI_AP
            help
                The WiFi channel number to be used by the soft-AP.

        config WIFI_AP_MAX_STATIONS
            int "WiFi AP Max Allowed Stations"
            range 1 10
            default 4
            depends on ENABLE_WIFI_AP
            help
                The maximum number of stations allowed to connect to the soft-AP.

        config WIFI_AP_BEACON_INTERVAL
            int "WiFi AP Beacon Interval (ms)"
            range 100 60000
            default 100
            depends on ENABLE_WIFI_AP
            help
                The beacon interval (in milliseconds) for the WiFi soft-AP.

        config WIFI_AP_IDLE_TIMEOUT
            int "WiFi AP Idle Timeout (ms)"
            range 0 600000
            default 120000
            depends on ENABLE_WIFI_AP
            help
                The amount of time (in milliseconds) after which the CHIP platform will deactivate the soft-AP
                if it has been idle.

    endmenu

    menu "BLE Options"
        visible if BT_ENABLED

        config ENABLE_CHIPOBLE
            bool "Enable CHIP-over-BLE (CHIPoBLE) Support"
            default y
            depends on BT_ENABLED
            help
                Enables support for sending and receiving CHIP messages over a BLE connection.

                NOTE: This feature depends on BLE central support being enabled in ESP-IDF. In
                particular, the ESP-IDF features CONFIG_BT_ENABLED and CONFIG_GATTS_ENABLE must
                both be enabled.

        config BLE_DEVICE_NAME_PREFIX
            string "BLE Device Name Prefix"
            default "MATTER-"
            depends on ENABLE_CHIPOBLE
            help
                A prefix string used in forming the BLE device name.  The remainder of the name
                consists of the final two bytes of the device's CHIP node id in hex.

                NOTE: The device layer limits the total length of a device name to 16 characters.
                However, due to other data sent in WoBLE advertise packets, the device name
                may need to be shorter.

        config BLE_FAST_ADVERTISING_INTERVAL_MIN
            int "Fast Advertising Min Interval"
            default 40
            depends on ENABLE_CHIPOBLE
            help
                The minimum interval (in units of 0.625ms) at which the device will send BLE advertisements while
                in fast advertising mode.

        config BLE_FAST_ADVERTISING_INTERVAL_MAX
            int "Fast Advertising Max Interval"
            default 40
            depends on ENABLE_CHIPOBLE
            help
                The maximum interval (in units of 0.625ms) at which the device will send BLE advertisements while
                in fast advertising mode.

        config BLE_SLOW_ADVERTISING_INTERVAL_MIN
            int "Slow Advertising Min Interval"
            default 800
            depends on ENABLE_CHIPOBLE
            help
                The minimum interval (in units of 0.625ms) at which the device will send BLE advertisements while
                in slow advertising mode.

        config BLE_SLOW_ADVERTISING_INTERVAL_MAX
            int "Slow Advertising Max Interval"
            default 800
            depends on ENABLE_CHIPOBLE
            help
                The maximum interval (in units of 0.625ms) at which the device will send BLE advertisements while
                in slow advertising mode.

        config CHIPOBLE_SINGLE_CONNECTION
            bool "Single Connection Mode"
            default y
            depends on ENABLE_CHIPOBLE
            help
                Limit support for CHIP-over-BLE (WoBLE) to a single inbound connection.

                When set, WoBLE advertisements will stop while a WoBLE connection is active.

        config DEINIT_BLE_ON_COMMISSIONING_COMPLETE
	    bool "Disable and DeInit BLE on commissioning complete"
	    default y
	    help 
                Disable and deinit BLE and reclaim all its memory, once the commissioning is successful and Commissioning complete event is received in the application.	
    endmenu

    menu "CHIP Thread Options"
        visible if OPENTHREAD_ENABLED

        config THREAD_TASK_STACK_SIZE
            int "Thread task stack size"
            default 5120
            depends on OPENTHREAD_ENABLED
            help
                Stack size of Thread task.

    endmenu

    menu "CHIP Trait Manager"

        config ENABLE_TRAIT_MANAGER
            bool "Enable Trait Manager"
            default y
            help
                Enable support for the CHIP Trait Manager.

                The Trait Manager is an experimental feature of the CHIP Device Layer.

    endmenu

    menu "Time Sync Options"

        config ENABLE_SERVICE_DIRECTORY_TIME_SYNC
            bool "Enable Service Directory Time Sync"
            default y
            help
                Enables synchronizing the device real-time clock using information returned during
                a CHIP service directory query.  For any device that uses the CHIP service directory
                to lookup a tunnel server, enabling this option will result in the real time clock being
                synchronized every time the service tunnel is established.

        config ENABLE_CHIP_TIME_SERVICE_TIME_SYNC
            bool "Enable Time Service Time Sync"
            default n
            help
                Enables synchronizing the device's real time clock with a remote CHIP Time service
                using the CHIP Time Sync protocol.

        config CHIP_TIME_SERVICE_ENDPOINT_ID
            hex "CHIP Time Service Endpoint Id"
            default 18B4300200000005
            depends on ENABLE_CHIP_TIME_SERVICE_TIME_SYNC
            help
                Specifies the service endpoint id of the CHIP Time Sync service to be used to synchronize time.

        config DEFAULT_TIME_SYNC_INTERVAL
            int "Time Sync Interval (seconds)"
            default 60
            depends on ENABLE_CHIP_TIME_SERVICE_TIME_SYNC
            help
                Specifies the minimum interval (in seconds) at which the device should synchronize its real time
                clock with the configured CHIP Time Sync server.

        config TIME_SYNC_TIMEOUT
            int "Time Sync Timeout (ms)"
            default 10000
            depends on ENABLE_CHIP_TIME_SERVICE_TIME_SYNC
            help
                Specifies the maximum amount of time (in milliseconds) to wait for a response from a
                CHIP Time Sync server.

    endmenu

    menu "Service Provisioning Options"

        config SERVICE_PROVISIONING_ENDPOINT_ID
            hex "CHIP Service Provisioning Endpoint Id"
            default 18B4300200000010
            help
                Specifies the service endpoint id of the CHIP Service Provisioning service.  When a device
                undergoes service provisioning, this is the endpoint to which it will send its Pair Device
                to Account request.

        config SERVICE_PROVISIONING_CONNECTIVITY_TIMEOUT
            int "Service Provisioning Connectivity Timeout (ms)"
            default 10000
            help
                The maximum amount of time (in milliseconds) to wait for service connectivity during the device
                service provisioning step.  More specifically, this is the maximum amount of time the device will
                wait for connectivity to be established with the service at the point where the device waiting
                to send a Pair Device to Account request to the Service Provisioning service.

        config SERVICE_PROVISIONING_REQUEST_TIMEOUT
            int "Service Provisioning Request Timeout (ms)"
            default 10000
            help
                Specifies the maximum amount of time (in milliseconds) to wait for a response from the Service
                Provisioning service.

    endmenu

    menu "Commissioning options"
        config RENDEZVOUS_WAIT_FOR_COMMISSIONING_COMPLETE
            int "Use full IP-based commissioning (expect cluster commands)"
            default 0
            help
                Setting this to y will cause the commissioner to send commissioning commands to the
                various clusters after establishing a PASE session.

        config ENABLE_ROTATING_DEVICE_ID
            depends on ENABLE_CHIPOBLE
            bool "Enable Rotating Device Identifier Support"
            default n

        config ENABLE_ESP32_FACTORY_DATA_PROVIDER
            bool "Use ESP32 Factory Data Provider"
            default n
            help
                If this option is enabled, then ESP32 implementation of CommissionableDataProvider and
                DeviceAttestationCredentialsProvider is used. Otherwise, the test-mode CommissionableDataProvider
                and Example DeviceAttestationCredentialsProvider is used. ESP32 implementation reads factory data from
                nvs partition. Factory partition can be configured using CONFIG_CHIP_FACTORY_NAMESPACE_PARTITION_LABEL
                option, default is "nvs".

        config ENABLE_ESP32_DEVICE_INSTANCE_INFO_PROVIDER
            depends on ENABLE_ESP32_FACTORY_DATA_PROVIDER
            bool "Use ESP32 Device Instance Info Provider"
            default n
            help
                Use ESP32 Device Instance Info Provider to get device instance info from factory partition.
                Details like Vendor Name, Vendor Id, Product Name, Product Id, Serial Number, Manufacturing Date,
                Hardware Version, Hardware Version String, and Rotating Device Id UniqueId will be read from factory
                partition.

        config ENABLE_ESP32_DEVICE_INFO_PROVIDER
            depends on ENABLE_ESP32_FACTORY_DATA_PROVIDER
            bool "Use ESP32 Device Info Provider"
            default n
            help
                Use ESP32 Device Info Provider to get device instance info from factory partition.
                Details like Supported calendar types, supported locales, and fixed labels will be read from factory
                partition.

    endmenu



    menu "Testing Options"

        config USE_TEST_SERIAL_NUMBER
            string "Use Test Serial Number"
            default "TEST_SN"
            help
                Specifies a hard-coded device serial number to be used if none is found in CHIP NV storage.
                Setting the value to an empty string disables the feature.

                Note that any string up to 32 characters can be used here. This value is a unique identifier
                assigned to each device by the device vendor.

                This option is for testing only and should not be enabled in production releases.

        config ENABLE_TEST_SETUP_PARAMS
            bool "Enable Test Setup Parameters"
            default y
            help
                Enable use of test setup parameters for testing purposes only.

                WARNING: This option makes it possible to circumvent basic chip security functionality.
                Because of this it SHOULD NEVER BE ENABLED IN PRODUCTION BUILDS.

        config ENABLE_FIXED_TUNNEL_SERVER
            bool "Use Fixed Tunnel Server"
            default n
            help
                Forces the use of a service tunnel server at a fixed IP address and port.  This
                bypasses the need for a directory query to the service directory endpoint to
                determine the tunnel server address.  When enabled, this option allows devices
                that haven't been service provisioned to establish a service tunnel.

        config TUNNEL_SERVER_ADDRESS
            string "Tunnel Server Address"
            default ""
            depends on ENABLE_FIXED_TUNNEL_SERVER
            help
                The IP address and port of the server to which the device should establish a service tunnel.
                The supplied address must be a dot-notation IP address--not a host name.  The port number is
                optional; if present it should be separated from the IP address with a colon (e.g. 192.168.1.100:5540).

        config LOG_PROVISIONING_HASH
            bool "Enable Provisioning Hash Logging"
            default n
            help
                Compute and log a hash of the device's provisioning data on boot.  The generated hash value confirms
                to the form described in the CHIP: Factory Provisioning Specification.

    endmenu

    menu "Network Telemetry Options"

        config ENABLE_WIFI_TELEMETRY
            bool "Enable WiFi Telemetry"
            default y
            help
                Enable automatically uploading Wi-Fi telemetry via trait on an interval.

        config ENABLE_THREAD_TELEMETRY
            bool "Enable Thread Telemetry"
            default n
            help
                Enable automatically uploading minimal Thread telemetry and topology via trait on an interval.

        config ENABLE_THREAD_TELEMETRY_FULL
            bool "Enable Full Thread Telemetry"
            default n
            help
                Enable automatically uploading all Thread telemetry and topology via trait on an interval.
                This is suitable for products that have router capability.

                This option can be enabled only when Thread telemetry is enabled.

        config ENABLE_TUNNEL_TELEMETRY
            bool "Enable CHIP Tunnel Telemetry"
            default n
            help
                Enable automatically uploading CHIP tunnel telemetry via trait on an interval.

    endmenu

    menu "Event Logging Options"

        config EVENT_LOGGING_CRIT_BUFFER_SIZE
            int "Event Logging Critical Production Buffer Size"
            range 0 65535
            default 4096
            help
                A size, in bytes, of the individual critical production event logging buffer.

                This critical production event buffer must exist.

        config EVENT_LOGGING_PROD_BUFFER_SIZE
            int "Event Logging Production Buffer Size"
            range 0 65535
            default 2048
            help
                A size, in bytes, of the individual production event logging buffer.

                This critical production event buffer must exist.

        config EVENT_LOGGING_INFO_BUFFER_SIZE
            int "Event Logging Info Buffer Size"
            range 0 65535
            default 1024
            help
                A size, in bytes, of the individual info event logging buffer.

                When size is set to 0, the info event buffer and all support
                for the info level events are disabled.

        config EVENT_LOGGING_DEBUG_BUFFER_SIZE
            int "Event Logging Debug Buffer Size"
            range 0 65535
            default 1024
            help
                A size, in bytes, of the individual debug event logging buffer.

                When size is set to 0, the debug event buffer and all support
                for the debug level events are disabled.


	config CHIP_ENABLE_SCHEMA_CHECK
	   bool "Enable Schema Check"
	   default y
	   help
	     If enabled, it checks incoming messages are following the expected schema,
             and incoming message payloads are logged in detail.
	     To see detailed logging please set default log level to Debug.
	     (Component config --> Log output --> Default log verbosity --> Debug)

    endmenu

    menu "Matter OTA Image"

        config CHIP_OTA_IMAGE_BUILD
            bool "Generate Matter OTA image"
            help
              Enable building OTA (Over-the-air update) image which includes Matter OTA header.

        config CHIP_OTA_IMAGE_EXTRA_ARGS
            string "OTA image creator extra arguments"
            depends on CHIP_OTA_IMAGE_BUILD
            help
              ota_image_tool.py is used to create the OTA image.
              Mandatory arguments(Version, VersionString, VID, PID) are picked up from the config options.
              This option allows us to pass optional arguments(MinApplicableSoftwareVersion, MaxApplicableSoftwareVersion,
              and ReleaseNotesURL) to the ota_image_tool.py script.
              eg: "-mi 2 -ma 4 -rn https://github.com/espressif/esp-idf/releases/tag/v4.4"

    endmenu

    menu "External Platform"
        config CHIP_ENABLE_EXTERNAL_PLATFORM
            bool "Enable external platform layer"
            default n
            help
                Use external platform layer to override the default ESP32 platform in Matter SDK.

        config CHIP_EXTERNAL_PLATFORM_DIR
            string "The external platform directory"
            depends on CHIP_ENABLE_EXTERNAL_PLATFORM
            help
                The directory of the external platform.

    endmenu

    menu "Matter Manufacturing Options"
        config CHIP_FACTORY_NAMESPACE_PARTITION_LABEL
            string "chip-factory namespace partition label"
            default "nvs"
            help
                Label of the partition to store key-values in the "chip-factory" namespace.

        config CHIP_CONFIG_NAMESPACE_PARTITION_LABEL
            string "chip-config namespace partition label"
            default "nvs"
            help
                Label of the partition to store key-values in the "chip-config" namespace.

        config CHIP_COUNTERS_NAMESPACE_PARTITION_LABEL
            string "chip-counters namespace partition label"
            default "nvs"
            help
                Label of the partition to store key-values in the "chip-counters" namespace.

    endmenu

endmenu
