# SPDX-License-Identifier: Apache-2.0

config UART_NATIVE_POSIX
	bool "UART driver for native_sim/posix"
	default y
	depends on DT_HAS_ZEPHYR_NATIVE_POSIX_UART_ENABLED
	select SERIAL_HAS_DRIVER
	help
	  This enables a UART driver for the POSIX ARCH with up to 2 UARTs.
	  For the first UART port, the driver can be configured
	  to either connect to the terminal from which the executable was run, or into
	  one dedicated pseudoterminal for that UART.

if UART_NATIVE_POSIX

choice
	prompt "Native UART Port 0 connection"
	default NATIVE_UART_0_ON_OWN_PTY

config NATIVE_UART_0_ON_OWN_PTY
	bool "Connect the UART to its own pseudo terminal"
	help
	  Connect this UART to its own pseudoterminal. This is the preferred
	  option for users who want to use Zephyr's shell.
	  Moreover this option does not conflict with any other native
	  backend which may use the invoking shell standard input/output.

config NATIVE_UART_0_ON_STDINOUT
	bool "Connect the UART to the invoking shell stdin/stdout"
	help
	  Connect this UART to the stdin & stdout of the calling shell/terminal
	  which invoked the native executable. This is good enough for
	  automated testing, or when feeding from a file/pipe.
	  Note that other, non UART messages, will also be printed to the
	  terminal.
	  It is strongly discouraged to try to use this option with the new
	  shell interactively, as the default terminal configuration is NOT
	  appropriate for interactive use.

endchoice

config UART_NATIVE_WAIT_PTS_READY_ENABLE
	bool "Support waiting for pseudo terminal client readiness"
	depends on NATIVE_UART_0_ON_OWN_PTY || UART_NATIVE_POSIX_PORT_1_ENABLE
	help
	  When this option is selected a new command line switch is provided:
	  ``--wait_uart``
	  When ``--wait_uart`` is used, writes to the UART will be held until a
	  client has connected to the slave side of the pseudoterminal.
	  Otherwise writes are sent irrespectively.

config UART_NATIVE_POSIX_PORT_1_ENABLE
	bool "Second UART port"
	help
	  Useful if you need to have another serial connection to host.
	  This is used for example in PPP (Point-to-Point Protocol)
	  implementation.

config NATIVE_UART_AUTOATTACH_DEFAULT_CMD
	string "Default command to attach the UART to a new terminal"
	default "xterm -e screen %s &"
	help
	  If the native executable is called with the --attach_uart
	  command line option, this will be the default command which will be
	  run to attach a new terminal to the 1st UART.
	  Note that this command must have one, and only one, '%s' as
	  placeholder for the pseudoterminal device name (e.g. /dev/pts/35)
	  This is only applicable if the UART_0 is configured to use its own
	  PTY with NATIVE_UART_0_ON_OWN_PTY.
	  The 2nd UART will not be affected by this option.
	  If you are using GNOME, then you can use this command string
	  'gnome-terminal -- screen %s'

endif # UART_NATIVE_POSIX
