#
#    Copyright (c) 2022 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_C2_DEVKITM if IDF_TARGET_ESP32C2
        default DEVICE_TYPE_ESP32_C6_DEVKITC if IDF_TARGET_ESP32C6
        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_ETHERNET_KIT
            bool "ESP32-Ethernet-Kit_A_V1.0"
            select ENABLE_ETHERNET_TELEMETRY
            depends on IDF_TARGET_ESP32
        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
        config DEVICE_TYPE_ESP32_H2_DEVKITM
            bool "ESP32H2-DevKitM"
            depends on IDF_TARGET_ESP32H2
    endchoice

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

      config RENDEZVOUS_MODE_SOFTAP
          bool "Soft-AP"
          select ESP_WIFI_SOFTAP_SUPPORT
      config RENDEZVOUS_MODE_BLE
          bool "BLE"
          depends on BT_ENABLED
      config RENDEZVOUS_MODE_ON_NETWORK
          bool "On-Network"
      config RENDEZVOUS_MODE_SOFTAP_ON_NETWORK
          bool "Soft-AP / On-Network"
          select ESP_WIFI_SOFTAP_SUPPORT
      config RENDEZVOUS_MODE_BLE_ON_NETWORK
          bool "BLE / On-Network"
    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 || DEVICE_TYPE_ESP32_H2_DEVKITM
        default 0 if DEVICE_TYPE_ESP32_C3_DEVKITM || DEVICE_TYPE_ESP32_C2_DEVKITM || 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_SOFTAP
       default 2 if RENDEZVOUS_MODE_BLE
       default 4 if RENDEZVOUS_MODE_ON_NETWORK
       default 5 if RENDEZVOUS_MODE_SOFTAP_ON_NETWORK
       default 6 if RENDEZVOUS_MODE_BLE_ON_NETWORK

    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

    config STATUS_LED_GPIO_NUM
        int
        range 0 40
        default 2 if DEVICE_TYPE_ESP32_DEVKITC         #Use LED1 (blue LED) as status LED on DevKitC
        default 2 if DEVICE_TYPE_ESP32_ETHERNET_KIT
        default 8 if DEVICE_TYPE_ESP32_C3_DEVKITM || DEVICE_TYPE_ESP32_C2_DEVKITM || DEVICE_TYPE_ESP32_C6_DEVKITC || DEVICE_TYPE_ESP32_H2_DEVKITM
        default 26 if DEVICE_TYPE_ESP32_WROVER_KIT
        default 40 if DEVICE_TYPE_M5STACK
        help
            Each board has a status led, define its pin number.

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
