Cli: return to last line with UP arrow
This commit is contained in:
parent
f996b5414d
commit
0ca098b103
main
104
main/cli.c
104
main/cli.c
|
@ -25,6 +25,7 @@ struct Cli {
|
||||||
mstring_t* line;
|
mstring_t* line;
|
||||||
mstring_t* prev_line;
|
mstring_t* prev_line;
|
||||||
size_t cursor_position;
|
size_t cursor_position;
|
||||||
|
bool esc_mode;
|
||||||
|
|
||||||
void* context;
|
void* context;
|
||||||
CliWrite write_cb;
|
CliWrite write_cb;
|
||||||
|
@ -38,6 +39,7 @@ Cli* cli_init(void) {
|
||||||
cli->context = NULL;
|
cli->context = NULL;
|
||||||
cli->write_cb = NULL;
|
cli->write_cb = NULL;
|
||||||
cli->flush_cb = NULL;
|
cli->flush_cb = NULL;
|
||||||
|
cli->esc_mode = false;
|
||||||
|
|
||||||
return cli;
|
return cli;
|
||||||
}
|
}
|
||||||
|
@ -156,49 +158,73 @@ static void cli_handle_backspace(Cli* cli) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void cli_handle_char(Cli* cli, uint8_t c) {
|
void cli_handle_char(Cli* cli, uint8_t c) {
|
||||||
switch(c) {
|
if(cli->esc_mode) {
|
||||||
case CliSymbolAsciiCR:
|
switch(c) {
|
||||||
if(mstring_size(cli->line) == 0) {
|
case '[':
|
||||||
|
cli->esc_mode = true;
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
if(mstring_size(cli->line) == 0 && mstring_cmp(cli->line, cli->prev_line) != 0) {
|
||||||
|
// Set line buffer and cursor position
|
||||||
|
mstring_set(cli->line, mstring_get_cstr(cli->prev_line));
|
||||||
|
cli->cursor_position = mstring_size(cli->line);
|
||||||
|
// Show new line to user
|
||||||
|
cli_write_str(cli, mstring_get_cstr(cli->line));
|
||||||
|
}
|
||||||
|
cli->esc_mode = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
cli->esc_mode = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch(c) {
|
||||||
|
case CliSymbolAsciiEsc:
|
||||||
|
cli->esc_mode = true;
|
||||||
|
break;
|
||||||
|
case CliSymbolAsciiCR:
|
||||||
|
if(mstring_size(cli->line) == 0) {
|
||||||
|
cli_write_eol(cli);
|
||||||
|
} else {
|
||||||
|
cli_write_eol(cli);
|
||||||
|
cli_handle_enter(cli);
|
||||||
|
cli_reset(cli);
|
||||||
|
cli_write_eol(cli);
|
||||||
|
}
|
||||||
|
cli_write_prompt(cli);
|
||||||
|
break;
|
||||||
|
case CliSymbolAsciiDel:
|
||||||
|
case CliSymbolAsciiBackspace:
|
||||||
|
cli_handle_backspace(cli);
|
||||||
|
break;
|
||||||
|
case CliSymbolAsciiSOH:
|
||||||
|
delay(33);
|
||||||
|
cli_write_motd(cli);
|
||||||
cli_write_eol(cli);
|
cli_write_eol(cli);
|
||||||
} else {
|
cli_write_prompt(cli);
|
||||||
cli_write_eol(cli);
|
break;
|
||||||
cli_handle_enter(cli);
|
case CliSymbolAsciiETX:
|
||||||
cli_reset(cli);
|
cli_reset(cli);
|
||||||
cli_write_eol(cli);
|
cli_write_eol(cli);
|
||||||
|
cli_write_prompt(cli);
|
||||||
|
break;
|
||||||
|
case CliSymbolAsciiEOT:
|
||||||
|
cli_reset(cli);
|
||||||
|
break;
|
||||||
|
case ' ' ... '~':
|
||||||
|
if(cli->cursor_position == mstring_size(cli->line)) {
|
||||||
|
mstring_push_back(cli->line, c);
|
||||||
|
cli_write_char(cli, c);
|
||||||
|
} else {
|
||||||
|
mstring_push_back(cli->line, c);
|
||||||
|
cli_write_str(cli, "\e[4h");
|
||||||
|
cli_write_char(cli, c);
|
||||||
|
cli_write_str(cli, "\e[4l");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
cli_write_prompt(cli);
|
|
||||||
break;
|
|
||||||
case CliSymbolAsciiDel:
|
|
||||||
case CliSymbolAsciiBackspace:
|
|
||||||
cli_handle_backspace(cli);
|
|
||||||
break;
|
|
||||||
case CliSymbolAsciiSOH:
|
|
||||||
delay(33);
|
|
||||||
cli_write_motd(cli);
|
|
||||||
cli_write_eol(cli);
|
|
||||||
cli_write_prompt(cli);
|
|
||||||
break;
|
|
||||||
case CliSymbolAsciiETX:
|
|
||||||
cli_reset(cli);
|
|
||||||
cli_write_eol(cli);
|
|
||||||
cli_write_prompt(cli);
|
|
||||||
break;
|
|
||||||
case CliSymbolAsciiEOT:
|
|
||||||
cli_reset(cli);
|
|
||||||
break;
|
|
||||||
case ' ' ... '~':
|
|
||||||
if(cli->cursor_position == mstring_size(cli->line)) {
|
|
||||||
mstring_push_back(cli->line, c);
|
|
||||||
cli_write_char(cli, c);
|
|
||||||
} else {
|
|
||||||
mstring_push_back(cli->line, c);
|
|
||||||
cli_write_str(cli, "\e[4h");
|
|
||||||
cli_write_char(cli, c);
|
|
||||||
cli_write_str(cli, "\e[4l");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cli_flush(cli);
|
cli_flush(cli);
|
||||||
|
|
Loading…
Reference in New Issue