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

choice LOG_MODE
	prompt "Mode"
	default LOG_MODE_MINIMAL if LOG_DEFAULT_MINIMAL
	default LOG_MODE_IMMEDIATE if LOG2_MODE_IMMEDIATE
	default LOG_MODE_DEFERRED

config LOG_MODE_DEFERRED
	bool "Deferred logging"
	depends on !LOG2_MODE_IMMEDIATE
	help
	  Log messages are buffered and processed later. This mode has the
	  least impact on the application. Time consuming processing is
	  deferred to the known context.

config LOG_MODE_IMMEDIATE
	bool "Synchronous"
	depends on !LOG2_MODE_DEFERRED
	help
	  When enabled log is processed in the context of the call. It impacts
	  performance of the system since time consuming operations are
	  performed in the context of the log entry (e.g. high priority
	  interrupt).Logger backends must support exclusive access to work
	  flawlessly in that mode because one log operation can be interrupted
	  by another one in the higher priority context.

config LOG_MODE_MINIMAL
	bool "Minimal-footprint"
	imply PRINTK
	depends on !LOG2_MODE_DEFERRED
	depends on !LOG2_MODE_IMMEDIATE
	help
	  Enable minimal logging implementation. This has very little footprint
	  overhead on top of the printk() implementation for standard
	  logging macros. Hexdump macros are also supported, with a small
	  amount of code pulled in if used. Build time filtering is supported,
	  but not runtime filtering. There are no timestamps, prefixes,
	  colors, or asynchronous logging, and all messages are simply
	  sent to printk().

endchoice

config LOG_FRONTEND
	bool "Frontend"
	depends on !LOG2_MODE_DEFERRED
	depends on !LOG2_MODE_IMMEDIATE
	help
	  When enabled, logs are redirected to a custom frontend which is the
	  fastest way of getting logs out.

config LOG_FRONTEND_ONLY
	bool "No backends" if !LOG1
	default y if LOG1
	depends on LOG_FRONTEND
	help
	  Option indicates that there are no backends intended to be used.
	  Code asserts if any backend is enabled.

config LOG2_MODE_DEFERRED
	bool "Deferred v2 (DEPRECATED)"
	help
	  Option has been deprecated. Use LOG_MODE_DEFERRED which defaults now
	  to v2.

config LOG2_MODE_IMMEDIATE
	bool "Synchronous v2 (DEPRECATED)"
	help
	  Option has been deprecated. Use LOG_MODE_IMMEDIATE which defaults now
	  to v2.

config LOG1
	bool "Use v1 (DEPRECATED)"
	help
	  Deprecated.

config LOG2
	bool
	select MPSC_PBUF
	default y if !LOG1

config LOG1_IMMEDIATE
	bool
	default y if LOG1 && LOG_MODE_IMMEDIATE

config LOG1_DEFERRED
	bool
	default y if LOG1 && LOG_MODE_DEFERRED

config LOG2_IMMEDIATE
	bool
	default y if !LOG1 && LOG_MODE_IMMEDIATE

config LOG2_DEFERRED
	bool
	default y if !LOG1 && LOG_MODE_DEFERRED

config LOG_DEFAULT_MINIMAL
	bool
