# Kconfig - console driver configuration options

#
# Copyright (c) 2017 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#

menuconfig TELNET_CONSOLE
	bool "Enable a super basic telnet console service"
	default n
	select NETWORKING
	select NET_TCP
	help
	This option enables telnet as a network console service. It is for
	now a very basic implementation of the telnet protocol. Currently,
	it is basically just a redirection of the Zephyr console through TCP.
	It nicely works along with another console driver (like uart), twist
	being that it will take over the output if only a successful
	connection to its port is done.

if TELNET_CONSOLE

config TELNET_CONSOLE_PORT
	int "Telnet console port number"
	default 23
	help
	This option is used to configure on which port telnet is going
	to be bound.

config TELNET_CONSOLE_LINE_BUF_SIZE
	int "Telnet console line buffer size"
	default 64
	help
	This option can be used to modify the size of the buffer storing
	console output line, prior to sending it through the network.
	Of course an output line can be longer than such size, it just
	means sending it will start as soon as it reaches this size.
	It really depends on what type of output is expected.
	A lot of short lines: better reduce this value. On the contrary,
	raise it.

config TELNET_CONSOLE_LINE_BUF_NUMBERS
	int "Telnet console line buffers"
	default 4
	help
	This option can be used to modify the amount of line buffers the
	driver can use. It really depends on how much output is meant to be
	sent, depending on the system load etc. You can play on both
	TELNET_CONSOLE_LINE_BUF_SIZE and this current option to get the
	best possible buffer settings you need.

config TELNET_CONSOLE_SEND_TIMEOUT
	int "Telnet console line send timeout"
	default 100
	help
	This option can be used to modify the duration of the timer that kick
	in when a line buffer is not empty but did not yet meet the line feed.

config TELNET_CONSOLE_SEND_THRESHOLD
	int "Telnet console line send threshold"
	default 5
	help
	This option can be used to modify the minimal amount of a line buffer
	that can be sent by the telnet server when nothing has happened for
	a little while (see TELNET_CONSOLE_SEND_TIMEOUT) and when the line
	buffer did not meet the line feed yet.

config TELNET_CONSOLE_SUPPORT_COMMAND
	bool "Add support for telnet commands (IAC) [Experimental]"
	default n
	help
	Current support is so limited it's not interesting to enable it.
	However, if proven to be needed at some point, it will be possible
	to extend such support.

config TELNET_CONSOLE_THREAD_STACK
	int "Telnet console inner thread stack size"
	default 1024
	help
	This option helps to fine-tune telnet's inner thread stack size.

config TELNET_CONSOLE_PRIO
	int "Telnet console inner thread priority"
	default 7
	help
	This option helps to fine-tune telnet's inner thread priority.

config SYS_LOG_TELNET_CONSOLE_LEVEL
	int "Telnet console log level"
	default 0
	help
	Sets log level for telnet console (for telnet console dev only)

	Levels are:

	- 0 OFF, do not write

	- 1 ERROR, only write SYS_LOG_ERR

	- 2 WARNING, write SYS_LOG_WRN in addition to previous level

	- 3 INFO, write SYS_LOG_INF in addition to previous levels

	- 4 DEBUG, write SYS_LOG_DBG in addition to previous levels

config TELNET_CONSOLE_DEBUG_DEEP
	bool "Forward output to original console handler"
	depends on UART_CONSOLE
	default n
	help
	For telnet developers only, this will forward each output to
	original console handler. So if by chance telnet seems silent,
	at least things will be printed to original handler, usually
	UART console.

config TELNET_CONSOLE_INIT_PRIORITY
	int "Telnet console init priority"
	default 99
	help
	Telnet console driver initialization priority. Note that Telnet works
	on application level. Usually, you won't have to tweak this.

endif
