# Copyright (c) 2021 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

menu "Output Formatting"

menu "Prepend non-hexdump log message with function name"
	depends on !LOG_FRONTEND_ONLY

config LOG_FUNC_NAME_PREFIX_ERR
	bool "Error messages prepended"

config LOG_FUNC_NAME_PREFIX_WRN
	bool "Warning messages prepended"

config LOG_FUNC_NAME_PREFIX_INF
	bool "Info messages prepended"

config LOG_FUNC_NAME_PREFIX_DBG
	bool "Debug messages prepended"
	default y

endmenu

menuconfig LOG_MIPI_SYST_ENABLE
	bool "MIPI SyS-T format output"
	select MIPI_SYST_LIB
	help
	  Enable MIPI SyS-T format output for the logger system.

if LOG_MIPI_SYST_ENABLE

config LOG_MIPI_SYST_USE_CATALOG
	bool "Use MIPI Sys-T Catalog for logging"
	depends on LOG2
	select LOG2_FMT_SECTION
	select LOG2_MSG_PKG_ALWAYS_ADD_RO_STRING_IDXS
	help
	  Use MIPI Sys-T Catalog for logging instead of plain text.

config LOG_MIPI_SYST_CATALOG_ARGS_BUFFER_SIZE
	int "Size of temporary arguments buffer when using Sys-T Catalog"
	depends on LOG_MIPI_SYST_USE_CATALOG
	default 1024
	help
	  The size (in bytes) of the temporary buffer to store the expanded
	  argument list needed for the MIPI Sys-T library for processing
	  catalog messages.

config LOG_MIPI_SYST_OUTPUT_LOG_MSG_SRC_ID
	bool "Output Log Message Source ID as Module ID"
	default y if LOG_MIPI_SYST_USE_CATALOG
	help
	  Enable this option to output the log message source ID
	  as the Sys-T message module ID (as in origin unit in Sys-T
	  message header).

config LOG_MIPI_SYST_MSG_DEFAULT_MODULE_ID
	int "Default module ID in Sys-T message"
	range 0 127
	default 127 if LOG_MIPI_SYST_OUTPUT_LOG_MSG_SRC_ID
	default 0
	help
	  The default module ID embedded in the origin unit in
	  Sys-T message header.

	  If CONFIG_LOG_MIPI_SYST_OUTPUT_LOG_MSG_SRC_ID is disabled,
	  this will be used for all Sys-T messages.

	  If CONFIG_LOG_MIPI_SYST_OUTPUT_LOG_MSG_SRC_ID is enabled,
	  this will be used for log messages without source IDs,
	  for example, printk() if CONFIG_LOG_PRINTK is enabled.

config LOG_MIPI_SYST_MSG_DEFAULT_UNIT_ID
	int "Default unit ID in Sys-T message"
	range 0 15
	default 0
	help
	  The default unit ID embedded in the origin unit in
	  Sys-T message header.

endif # LOG_MIPI_SYST_ENABLE

config LOG_DICTIONARY_SUPPORT
	bool
	depends on LOG2
	select LOG_DICTIONARY_DB
	help
	  Enable support for dictionary based logging.

	  Dictionary based logging is binary based where predefined strings
	  are replaced with their equivalent addresses from the built binary
	  image file in log output. This reduces the size required to store
	  the log output when there are long format strings to be logged.

	  This should be selected by the backend automatically.

config LOG_IMMEDIATE_CLEAN_OUTPUT
	bool "Clean log output"
	depends on LOG_MODE_IMMEDIATE
	help
	  If enabled, interrupts are locked during whole log message processing.
	  As a result, processing on one log message cannot be interrupted by
	  another one and output is clean, not interleaved. However, enabling
	  this option is causing interrupts locking for significant amount of
	  time (up to multiple milliseconds).

config LOG_BACKEND_SHOW_COLOR
	bool "Colors in the backend"
	depends on LOG_BACKEND_UART || LOG_BACKEND_NATIVE_POSIX || LOG_BACKEND_RTT \
	           || LOG_BACKEND_SWO || LOG_BACKEND_XTENSA_SIM
	default y
	help
	  When enabled selected backend prints errors in red and warning in yellow.

if LOG_BACKEND_SHOW_COLOR

config LOG_INFO_COLOR_GREEN
	bool "Use green color for info level logs"

endif # LOG_BACKEND_SHOW_COLOR

config LOG_TAG_MAX_LEN
	int "Tag max length"
	default 0
	range 0 64
	help
	  Setting non-zero value enables option to specify a tag which is
	  prepended to each log message. Tag can be changed at runtime.

config LOG_TAG_DEFAULT
	string "Default tag"
	depends on LOG_TAG_MAX_LEN > 0
	default ""
	help
	  Initial tag.

config LOG_BACKEND_FORMAT_TIMESTAMP
	bool "Timestamp formatting in the backend"
	depends on LOG_BACKEND_UART || LOG_BACKEND_NATIVE_POSIX || LOG_BACKEND_RTT \
	           || LOG_BACKEND_SWO || LOG_BACKEND_XTENSA_SIM || LOG_BACKEND_FS
	default y
	help
	  When enabled timestamp is formatted to hh:mm:ss:ms,us.

config LOG_OUTPUT_FORMAT_LINUX_TIMESTAMP
	bool "Format timestamp in Linux format"
	help
	  This formatting is something in the middle between the pure raw format
	  and the hh:mm:ss:ms,us one. It resembles the Linux's kernel format in
	  which timestamps are printed as fixed point values with seconds on the
	  left side of the point and microseconds on the right side.

endmenu
