From dabd2130a9ebed70316de22d5db5888a5b3d5d48 Mon Sep 17 00:00:00 2001 From: Henner Zeller Date: Sat, 23 Jun 2018 12:24:41 -0700 Subject: [PATCH 1/3] Provide local-echo option. Can be switched on with -e on the command line. Can be toggled with Ctrl t e while program is running. --- man/tio.1 | 7 +++++++ src/bash-completion/tio.in | 4 ++++ src/include/tio/options.h | 1 + src/include/tio/tty.h | 1 + src/options.c | 9 ++++++++- src/tty.c | 17 +++++++++++++++++ 6 files changed, 38 insertions(+), 1 deletion(-) diff --git a/man/tio.1 b/man/tio.1 index f8566e4..e98db4d 100644 --- a/man/tio.1 +++ b/man/tio.1 @@ -51,6 +51,11 @@ However, if the .B \-\-no\-autoconnect option is provided, tio will exit if the device is not present or an established connection is lost. +.TP +.BR \-e ", " "\-\-local\-echo + +Enable local echo. + .TP .BR \-l ", " "\-\-log " \fI @@ -100,6 +105,8 @@ List available key commands Send serial break (triggers SysRq on Linux, etc.) .IP "\fBctrl-t c" Show configuration (baudrate, databits, etc.) +.IP "\fBctrl-t e" +Toggle local echo mode .IP "\fBctrl-t h" Toggle hexadecimal mode .IP "\fBctrl-t l" diff --git a/src/bash-completion/tio.in b/src/bash-completion/tio.in index 367f4b2..a0d062d 100644 --- a/src/bash-completion/tio.in +++ b/src/bash-completion/tio.in @@ -33,6 +33,10 @@ _tio() COMPREPLY=( $(compgen -W "5 6 7 8" -- ${cur}) ) return 0 ;; + -h | --local-echo) + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + return 0 + ;; -f | --flow) COMPREPLY=( $(compgen -W "hard soft none" -- ${cur}) ) return 0 diff --git a/src/include/tio/options.h b/src/include/tio/options.h index b41f340..c2292e1 100644 --- a/src/include/tio/options.h +++ b/src/include/tio/options.h @@ -39,6 +39,7 @@ struct option_t int output_delay; bool no_autoconnect; bool log; + bool local_echo; const char *log_filename; const char *map; }; diff --git a/src/include/tio/tty.h b/src/include/tio/tty.h index cfc2610..888469f 100644 --- a/src/include/tio/tty.h +++ b/src/include/tio/tty.h @@ -25,6 +25,7 @@ #define KEY_QUESTION 0x3f #define KEY_B 0x62 #define KEY_C 0x63 +#define KEY_E 0x65 #define KEY_H 0x68 #define KEY_L 0x6C #define KEY_Q 0x71 diff --git a/src/options.c b/src/options.c index 3edf05c..55406b7 100644 --- a/src/options.c +++ b/src/options.c @@ -45,6 +45,7 @@ struct option_t option = 0, // No output delay false, // No autoconnect false, // No log + false, // No local echo "", // Log filename "" // Map string }; @@ -61,6 +62,7 @@ void print_help(char *argv[]) printf(" -p, --parity odd|even|none Parity (default: none)\n"); printf(" -o, --output-delay Output delay (default: 0)\n"); printf(" -n, --no-autoconnect Disable automatic connect\n"); + printf(" -e, --local-echo Do local echo\n"); printf(" -l, --log Log to file\n"); printf(" -m, --map Map special characters\n"); printf(" -v, --version Display version\n"); @@ -108,6 +110,7 @@ void parse_options(int argc, char *argv[]) {"stopbits", required_argument, 0, 's'}, {"parity", required_argument, 0, 'p'}, {"output-delay", required_argument, 0, 'o'}, + {"local-echo", no_argument, 0, 'e'}, {"no-autoconnect", no_argument, 0, 'n'}, {"log", required_argument, 0, 'l'}, {"map", required_argument, 0, 'm'}, @@ -120,7 +123,7 @@ void parse_options(int argc, char *argv[]) int option_index = 0; /* Parse argument using getopt_long */ - c = getopt_long(argc, argv, "b:d:f:s:p:o:nl:m:vh", long_options, &option_index); + c = getopt_long(argc, argv, "b:d:f:s:p:o:nl:m:vhe", long_options, &option_index); /* Detect the end of the options */ if (c == -1) @@ -146,6 +149,10 @@ void parse_options(int argc, char *argv[]) option.databits = string_to_long(optarg); break; + case 'e': + option.local_echo = true; + break; + case 'f': option.flow = optarg; break; diff --git a/src/tty.c b/src/tty.c index c823e1b..9d31947 100644 --- a/src/tty.c +++ b/src/tty.c @@ -100,6 +100,7 @@ void handle_command_sequence(char input_char, char previous_char, char *output_c tio_printf(" ctrl-t ? List available key commands"); tio_printf(" ctrl-t b Send break"); tio_printf(" ctrl-t c Show configuration"); + tio_printf(" ctrl-t e Toggle local echo mode"); tio_printf(" ctrl-t h Toggle hexadecimal mode"); tio_printf(" ctrl-t l Clear screen"); tio_printf(" ctrl-t q Quit"); @@ -119,6 +120,7 @@ void handle_command_sequence(char input_char, char previous_char, char *output_c tio_printf(" Flow: %s", option.flow); tio_printf(" Stopbits: %d", option.stopbits); tio_printf(" Parity: %s", option.parity); + tio_printf(" Local Echo: %s", option.local_echo ? "yes":"no"); tio_printf(" Output delay: %d", option.output_delay); if (option.map[0] != 0) tio_printf(" Map flags: %s", option.map); @@ -126,6 +128,10 @@ void handle_command_sequence(char input_char, char previous_char, char *output_c tio_printf(" Log file: %s", option.log_filename); break; + case KEY_E: + option.local_echo = !option.local_echo; + break; + case KEY_H: /* Toggle hexadecimal printing mode */ if (print_mode == NORMAL) @@ -511,6 +517,15 @@ void tty_restore(void) tty_disconnect(); } +static void optional_local_echo(char c) +{ + if (!option.local_echo) + return; + print(c); + if (option.log) + log_write(c); +} + int tty_connect(void) { fd_set rdfs; /* Read file descriptor set */ @@ -657,6 +672,7 @@ int tty_connect(void) if ((output_char == '\n') && (map_onlcrnl)) { char r = '\r'; + optional_local_echo(r); status = write(fd, &r, 1); if (status < 0) warning_printf("Could not write to tty device"); @@ -666,6 +682,7 @@ int tty_connect(void) } /* Send output to tty device */ + optional_local_echo(output_char); status = write(fd, &output_char, 1); if (status < 0) warning_printf("Could not write to tty device"); From 0bc56c8a8f2a8e79e923c953b659419dccfbd3d4 Mon Sep 17 00:00:00 2001 From: Henner Zeller Date: Sat, 23 Jun 2018 13:58:59 -0700 Subject: [PATCH 2/3] Update README. --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c57da46..02eddf2 100644 --- a/README.md +++ b/README.md @@ -21,21 +21,24 @@ application to easily connect to various terminal TTY devices. The commandline interface is straightforward as reflected in the output from 'tio --help': ``` - Usage: tio [] + Usage: tio [] Options: -b, --baudrate Baud rate (default: 115200) -d, --databits 5|6|7|8 Data bits (default: 8) -f, --flow hard|soft|none Flow control (default: none) -s, --stopbits 1|2 Stop bits (default: 1) - -p, --parity even|odd|none Parity (default: none) + -p, --parity odd|even|none Parity (default: none) -o, --output-delay Output delay (default: 0) -n, --no-autoconnect Disable automatic connect + -e, --local-echo Do local echo -l, --log Log to file -m, --map Map special characters -v, --version Display version -h, --help Display help + See the man page for list of supported mapping flags. + In session, press ctrl-t q to quit. ``` From 776284e25189732ebe91041007034342579632c0 Mon Sep 17 00:00:00 2001 From: Henner Zeller Date: Sun, 24 Jun 2018 06:50:05 -0700 Subject: [PATCH 3/3] Organize options the same sequence they are mentiond in cmdline help. --- src/options.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/options.c b/src/options.c index 55406b7..2df3827 100644 --- a/src/options.c +++ b/src/options.c @@ -110,8 +110,8 @@ void parse_options(int argc, char *argv[]) {"stopbits", required_argument, 0, 's'}, {"parity", required_argument, 0, 'p'}, {"output-delay", required_argument, 0, 'o'}, - {"local-echo", no_argument, 0, 'e'}, {"no-autoconnect", no_argument, 0, 'n'}, + {"local-echo", no_argument, 0, 'e'}, {"log", required_argument, 0, 'l'}, {"map", required_argument, 0, 'm'}, {"version", no_argument, 0, 'v'}, @@ -123,7 +123,7 @@ void parse_options(int argc, char *argv[]) int option_index = 0; /* Parse argument using getopt_long */ - c = getopt_long(argc, argv, "b:d:f:s:p:o:nl:m:vhe", long_options, &option_index); + c = getopt_long(argc, argv, "b:d:f:s:p:o:nel:m:vh", long_options, &option_index); /* Detect the end of the options */ if (c == -1) @@ -149,10 +149,6 @@ void parse_options(int argc, char *argv[]) option.databits = string_to_long(optarg); break; - case 'e': - option.local_echo = true; - break; - case 'f': option.flow = optarg; break; @@ -173,6 +169,10 @@ void parse_options(int argc, char *argv[]) option.no_autoconnect = true; break; + case 'e': + option.local_echo = true; + break; + case 'l': option.log = true; option.log_filename = optarg;