#
#    Copyright (c) 2021-2023 Project CHIP Authors
#    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 ESP32 demo application.
#

menu "Demo"

    choice
        prompt "Device Type"
        default DEVICE_TYPE_ESP32_DEVKITC if IDF_TARGET_ESP32
        default DEVICE_TYPE_ESP32_C3_DEVKITM if IDF_TARGET_ESP32C3
        default DEVICE_TYPE_ESP32_S3_DEVKITM if IDF_TARGET_ESP32S3
        default DEVICE_TYPE_ESP32_C2_DEVKITM if IDF_TARGET_ESP32C2
        default DEVICE_TYPE_ESP32_C6_DEVKITC if IDF_TARGET_ESP32C6
        default DEVICE_TYPE_ESP32_H2_DEVKITC if IDF_TARGET_ESP32H2
        help
            Specifies the type of ESP32 device.

            Note that the "ESP32-DevKitC" choice is compatible with a number of clone devices
            available from third-party manufacturers.

        config DEVICE_TYPE_ESP32_DEVKITC
            bool "ESP32-DevKitC"
            depends on IDF_TARGET_ESP32
        config DEVICE_TYPE_ESP32_WROVER_KIT
            bool "ESP32-WROVER-KIT_V4.1"
            depends on IDF_TARGET_ESP32
        config DEVICE_TYPE_M5STACK
            bool "M5Stack"
            depends on IDF_TARGET_ESP32
        config DEVICE_TYPE_ESP32_C3_DEVKITM
            bool "ESP32C3-DevKitM"
            depends on IDF_TARGET_ESP32C3
        config DEVICE_TYPE_ESP32_S3_DEVKITM
            bool "ESP32S3-DevKitM"
            depends on IDF_TARGET_ESP32S3
        config DEVICE_TYPE_ESP32H2_DEVKITC
            bool "ESP32H2-DevKitC"
            depends on IDF_TARGET_ESP32H2
        config DEVICE_TYPE_ESP32_C2_DEVKITM
            bool "ESP32C2-DevKitM"
            depends on IDF_TARGET_ESP32C2
        config DEVICE_TYPE_ESP32_C6_DEVKITC
            bool "ESP32C6-DevKitC"
            depends on IDF_TARGET_ESP32C6
    endchoice

    config CHIP_PROJECT_CONFIG
        string "CHIP Project Configuration file"
        default "main/include/CHIPProjectConfig.h"

    choice LED_TYPE
        prompt "LED type"
        default LED_TYPE_RMT if DEVICE_TYPE_ESP32_C3_DEVKITM || DEVICE_TYPE_ESP32_S3_DEVKITM || DEVICE_TYPE_ESP32H2_DEVKITC || DEVICE_TYPE_ESP32_C6_DEVKITC
        default LED_TYPE_GPIO
        help
            Defines the default LED type used in the example

        config LED_TYPE_GPIO
            bool "GPIO"
        config LED_TYPE_RMT
            bool "RMT - Addressable LED"
    endchoice

    config LED_RMT_CHANNEL
        depends on LED_TYPE_RMT
        int "RMT Channel"
        range 0 7
        default 0
        help
            Set the RMT peripheral channel.
            ESP32 RMT channel from 0 to 7
            ESP32-S3 RMT channel from 0 to 3
            ESP32-C3 RMT channel from 0 to 1

    config LED_GPIO
        int "LED GPIO number"
        range 0 48
        default 26 if DEVICE_TYPE_ESP32_WROVER_KIT
        default 8 if DEVICE_TYPE_ESP32_C3_DEVKITM || DEVICE_TYPE_ESP32H2_DEVKITC || DEVICE_TYPE_ESP32_C2_DEVKITM || DEVICE_TYPE_ESP32_C6_DEVKITC
        default 48 if DEVICE_TYPE_ESP32_S3_DEVKITM
        default 5 if DEVICE_TYPE_M5STACK
        default 5
        help
            GPIO number (IOxx) to blink on and off or the RMT signal for the addressable LED.

    choice
      prompt "Rendezvous Mode"
      default RENDEZVOUS_MODE_BLE
      help
          Specifies the Rendezvous mode of the peripheral.

      config RENDEZVOUS_MODE_WIFI
          bool "Wi-Fi"
      config RENDEZVOUS_MODE_BLE
          bool "BLE"
      config RENDEZVOUS_MODE_THREAD
          bool "Thread"
      config RENDEZVOUS_MODE_ETHERNET
          bool "Ethernet"
    endchoice

    # NOTE: This config is not displayed as a input in the Kconfig menu, as its value is
    # entirely derived from the Device Type choice.  However the CONFIG_EXAMPLE_DISPLAY_TYPE
    # define that is produced is needed to configure the TFT library correctly.
    config TFT_PREDEFINED_DISPLAY_TYPE
        int
        range 0 5
        default 0 if DEVICE_TYPE_ESP32_DEVKITC
        default 0 if DEVICE_TYPE_ESP32_C3_DEVKITM || DEVICE_TYPE_ESP32_C2_DEVKITM || DEVICE_TYPE_ESP32H2_DEVKITC || DEVICE_TYPE_ESP32_C6_DEVKITC
        default 3 if DEVICE_TYPE_M5STACK
        default 4 if DEVICE_TYPE_ESP32_WROVER_KIT

    config HAVE_DISPLAY
        bool
        default y if DEVICE_TYPE_M5STACK || DEVICE_TYPE_ESP32_WROVER_KIT
        default n if !(DEVICE_TYPE_M5STACK || DEVICE_TYPE_ESP32_WROVER_KIT)

    config RENDEZVOUS_MODE
       int
       range 0 8
       default 1 if RENDEZVOUS_MODE_WIFI
       default 2 if RENDEZVOUS_MODE_BLE
       default 4 if RENDEZVOUS_MODE_THREAD
       default 8 if RENDEZVOUS_MODE_ETHERNET

    config DISPLAY_AUTO_OFF
        bool "Automatically turn off the M5Stack's Display after a few seconds"
        default "y"
        depends on DEVICE_TYPE_M5STACK
        help
            To reduce wear and heat the M5Stack's Display is automatically switched off after a few seconds

endmenu

menu "PW RPC Debug channel"
depends on ENABLE_PW_RPC
    config EXAMPLE_UART_PORT_NUM
        int "UART port number"
        range 0 2 if IDF_TARGET_ESP32
        range 0 1 if IDF_TARGET_ESP32C3
        default 0
        help
            UART communication port number for the example.
            See UART documentation for available port numbers.

    config EXAMPLE_UART_BAUD_RATE
        int "UART communication speed"
        range 1200 115200
        default 115200
        help
            UART communication speed for Modbus example.

    config EXAMPLE_UART_RXD
        int "UART RXD pin number"
        range 0 34 if IDF_TARGET_ESP32
        range 0 19 if IDF_TARGET_ESP32C3
        default 5
        help
            GPIO number for UART RX pin. See UART documentation for more information
            about available pin numbers for UART.

    config EXAMPLE_UART_TXD
        int "UART TXD pin number"
        range 0 34 if IDF_TARGET_ESP32
        range 0 19 if IDF_TARGET_ESP32C3
        default 4
        help
            GPIO number for UART TX pin. See UART documentation for more information
            about available pin numbers for UART.

endmenu
