#
#    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
        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_C2_DEVKITM
            bool "ESP32C2-DevKitM"
            depends on IDF_TARGET_ESP32C2
    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
        default 0 if DEVICE_TYPE_ESP32_C3_DEVKITM || DEVICE_TYPE_ESP32_C2_DEVKITM
        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 8 if DEVICE_TYPE_ESP32_C3_DEVKITM || DEVICE_TYPE_ESP32_C2_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
