# 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
	depends on SYS_LOG
	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
