# 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 anothe console driver (like uart), twist
	being that it will take over the output if only a successul
	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 adition to previous level

	- 3 INFO, write SYS_LOG_INF in adition to previous levels

	- 4 DEBUG, write SYS_LOG_DBG in adition to previous levels

config TELNET_CONSOLE_DEBUG_DEEP
	bool "Forward output to original console handler"
	depends on UART_CONSOLE
	default n
	help
	For telnet developpers 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
