# Copyright 2021 The Pigweed 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
#
#     https://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.

menu "pw_log"

choice PIGWEED_LOG
    prompt "Logging backend used"
    default PIGWEED_LOG_ZEPHYR if CPP
    default PIGWEED_LOG_NONE
    help
      The type of Zephyr pw_log backend to use. See :ref:`module-pw_log` for
      module details

config PIGWEED_LOG_NONE
    bool "Do not use Pigweed logging"
    help
      PW_LOG_ statements will not work.

config PIGWEED_LOG_ZEPHYR
    bool "Zephyr logging for PW_LOG_* statements"
    select PIGWEED_PREPROCESSOR
    help
      Once the Pigweed logging is enabled, all Pigweed logs via PW_LOG_*() will
      be routed to the Zephyr logging system. This means that:
      - :c:macro:`PW_LOG_LEVEL_DEBUG` maps to Zephyr's LOG_LEVEL_DBG
      - :c:macro:`PW_LOG_LEVEL_INFO` maps to Zephyr's LOG_LEVEL_INF
      - :c:macro:`PW_LOG_LEVEL_WARN` maps to Zephyr's LOG_LEVEL_WRN
      - :c:macro:`PW_LOG_LEVEL_ERROR` maps to Zephyr's LOG_LEVEL_ERR
      - :c:macro:`PW_LOG_LEVEL_CRITICAL` maps to Zephyr's LOG_LEVEL_ERR
      - :c:macro:`PW_LOG_LEVEL_FATAL` maps to Zephyr's LOG_LEVEL_ERR

menuconfig PIGWEED_LOG_TOKENIZED
    bool "Maps all Zephyr log macros to tokenized PW_LOG_* macros"
    select PIGWEED_PREPROCESSOR
    select PIGWEED_SYNC_INTERRUPT_SPIN_LOCK
    select PIGWEED_SYS_IO
    select PIGWEED_TOKENIZER
    select LOG_CUSTOM_HEADER
    select SHELL_CUSTOM_HEADER
    help
      Map all the Zephyr log macros to use Pigweed's then use the
      :ref:`module-pw_log_tokenized` target as the logging backend in order to
      automatically tokenize all the logging strings. This means that Pigweed
      will also tokenize all of Zephyr's logging statements.

config PIGWEED_LOG_TOKENIZED_LIB
    bool "Tokenize logging and implement your own pw_log_tokenized_HandleLog"
    select PIGWEED_TOKENIZER
    select LOG_CUSTOM_HEADER
    select SHELL_CUSTOM_HEADER
    help
      Same as PIGWEED_LOG_TOKENIZED but you'll need to implement
      pw_log_tokenized_HandleLog. This gives you flexiblity to access handlers
      outside of pigweed.

config PIGWEED_LOG_NONE
    bool "Do not use pigweed logging"
    help
      Pigweed log macros will not work unless the application manually
      configures the logging backend.

menuconfig PIGWEED_LOG_TOKENIZED_RPC
    bool "Enables RPC tokenized logging"
    select PIGWEED_SYNC_INTERRUPT_SPIN_LOCK
    select PIGWEED_SYNC_THREAD_NOTIFICATION
    select PIGWEED_SYNC_TIMED_THREAD_NOTIFICATION
    select PIGWEED_SYSTEM_HDLC_RPC_SERVER
    select PIGWEED_SYSTEM_LOG_BACKEND
    select PIGWEED_SYSTEM_TARGET_HOOKS
    select PIGWEED_THREAD
    select PIGWEED_THREAD_ITERATION
    select PIGWEED_TOKENIZER
    select LOG_CUSTOM_HEADER
    select SHELL_CUSTOM_HEADER
    depends on CONSOLE_GETCHAR
    help
      Enable tokenized logging over RPC by using the system log backend.

endchoice

if PIGWEED_LOG_ZEPHYR || PIGWEED_LOG_TOKENIZED || PIGWEED_LOG_TOKENIZED_RPC

choice "PIGWEED_LOG_LEVEL_CHOICE"
	prompt "Max compiled-in log level for pigweed"
	default PIGWEED_LOG_LEVEL_DEFAULT
	depends on LOG

config PIGWEED_LOG_LEVEL_OFF
	bool "Off"
	help
	  Turn off all Pigweed logging.

config PIGWEED_LOG_LEVEL_ERR
	bool "Error"
	help
	  Only print error level log statements.

config PIGWEED_LOG_LEVEL_WRN
	bool "Warning"
	help
	  Only print warning level log statements and above.

config PIGWEED_LOG_LEVEL_INF
	bool "Info"
	help
	  Only print info level log statements and above.

config PIGWEED_LOG_LEVEL_DBG
	bool "Debug"
	help
	  Print all log statements.

config PIGWEED_LOG_LEVEL_DEFAULT
	bool "Default"
	help
	  Use Zephyr's ``LOG_DEFAULT_LEVEL`` as the log level.

endchoice

config PIGWEED_LOG_LEVEL
	int
	depends on LOG
	default 0 if PIGWEED_LOG_LEVEL_OFF
	default 1 if PIGWEED_LOG_LEVEL_ERR
	default 2 if PIGWEED_LOG_LEVEL_WRN
	default 3 if PIGWEED_LOG_LEVEL_INF
	default 4 if PIGWEED_LOG_LEVEL_DBG
	default LOG_DEFAULT_LEVEL if PIGWEED_LOG_LEVEL_DEFAULT

endif # PIGWEED_LOG_ZEPHYR || PIGWEED_LOG_TOKENIZED || PIGWEED_LOG_TOKENIZED_RPC

if PIGWEED_LOG_TOKENIZED
rsource "Kconfig.tokenized"
endif # PIGWEED_LOG_TOKENIZED

endmenu
