1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-06-08 17:18:46 +00:00

fixup! refactor(core/prodtest): make cli non-blocking, event-loop compatible

This commit is contained in:
tychovrahe 2025-03-27 11:07:27 +01:00
parent e2c12cecb3
commit 7623646538
2 changed files with 16 additions and 12 deletions

View File

@ -108,7 +108,7 @@ cli_t g_cli = {0};
#define VCP_IFACE 0 #define VCP_IFACE 0
static size_t console_read(void *context, char *buf, size_t size) { static size_t console_read(void *context, char *buf, size_t size) {
return usb_vcp_read_blocking(VCP_IFACE, (uint8_t *)buf, size, -1); return usb_vcp_read(VCP_IFACE, (uint8_t *)buf, size);
} }
static size_t console_write(void *context, const char *buf, size_t size) { static size_t console_write(void *context, const char *buf, size_t size) {

View File

@ -277,7 +277,11 @@ static int cli_readch(cli_t* cli) {
for (;;) { for (;;) {
char ch; char ch;
cli->read(cli->callback_context, &ch, 1); size_t len = cli->read(cli->callback_context, &ch, 1);
if (len != 1) {
return 0;
}
if (ch == '\e') { if (ch == '\e') {
// Escape sequence start // Escape sequence start
@ -331,16 +335,14 @@ static char cli_autocomplete(cli_t* cli, const char* prefix) {
return next_char; return next_char;
} }
// Reads next char and processes it. // Processes a received character
// //
// Returns 1 if the input line is complete, // Returns 1 if the input line is complete,
// returns 0 if more characters are needed, // returns 0 if more characters are needed,
// returns negative value if the input line is too long // returns negative value if the input line is too long
static int cli_process_char(cli_t* cli) { static int cli_process_char(cli_t* cli, int ch) {
char* buf = cli->line_buffer; char* buf = cli->line_buffer;
int ch = cli_readch(cli);
switch (ch) { switch (ch) {
case ESC_SEQ('A'): // ESC[A case ESC_SEQ('A'): // ESC[A
// Up arrow - search history backwards // Up arrow - search history backwards
@ -556,18 +558,20 @@ static void cli_process_command(cli_t* cli, const cli_command_t* cmd) {
} }
void cli_run(cli_t* cli) { void cli_run(cli_t* cli) {
// Read the next line int res;
int res = cli_process_char(cli); do {
int ch = cli_readch(cli);
if (ch == 0) {
return;
}
res = cli_process_char(cli, ch);
} while (res == 0);
if (res < 0) { if (res < 0) {
cli_error(cli, CLI_ERROR_FATAL, "Input line too long."); cli_error(cli, CLI_ERROR_FATAL, "Input line too long.");
goto cleanup; goto cleanup;
} }
if (res == 0) {
return;
}
cli_history_add(cli, cli->line_buffer); cli_history_add(cli, cli->line_buffer);
// Split command line into arguments // Split command line into arguments