From 2256af8c67b028b9a6decc1308c84732e753dd13 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 6 Dec 2024 12:02:47 +0100 Subject: [PATCH] Add a new modal for when an exception is encountered in the lib application --- src/globals.h | 10 +++++++++- src/main.c | 10 +++++++--- src/ui/sign_result.c | 17 +++++++++++++++++ src/ui/sign_result.h | 1 + 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/globals.h b/src/globals.h index 4d4579ebd..e5355fb4e 100644 --- a/src/globals.h +++ b/src/globals.h @@ -103,10 +103,18 @@ typedef struct swap_app_context_s { extern swap_app_context_t G_swap_ctx; #ifdef HAVE_NBGL + +// Boolean like status + a special value +typedef enum last_cycle_status_e { + LAST_CYCLE_ERROR = 0, + LAST_CYCLE_SUCCESS = 1, + LAST_CYCLE_EXCEPTION = 2, +} last_cycle_status_t; + // On Stax, remember some data from the previous cycle if applicable to display a status screen typedef struct previous_cycle_data_s { bool had_previous_cycle; - bool was_successful; + last_cycle_status_t was_successful; char appname_last_cycle[BOLOS_APPNAME_MAX_SIZE_B + 1]; } previous_cycle_data_t; diff --git a/src/main.c b/src/main.c index 7a1263d9c..31f2cbd40 100644 --- a/src/main.c +++ b/src/main.c @@ -135,12 +135,16 @@ __attribute__((section(".boot"))) int main(__attribute__((unused)) int arg0) { // - we need a BSS reset + UX_INIT if (G_previous_cycle_data.had_previous_cycle) { G_previous_cycle_data.had_previous_cycle = false; - if (G_previous_cycle_data.was_successful) { + if (G_previous_cycle_data.was_successful == LAST_CYCLE_ERROR) { + PRINTF("Displaying modal for failed last cycle\n"); + display_signing_failure(G_previous_cycle_data.appname_last_cycle); + } else if (G_previous_cycle_data.was_successful == LAST_CYCLE_SUCCESS) { PRINTF("Displaying modal for successful last cycle\n"); display_signing_success(); } else { - PRINTF("Displaying modal for failed last cycle\n"); - display_signing_failure(G_previous_cycle_data.appname_last_cycle); + // LAST_CYCLE_EXCEPTION + PRINTF("Displaying modal for exception last cycle\n"); + display_signing_exception(G_previous_cycle_data.appname_last_cycle); } } else { ui_idle(); diff --git a/src/ui/sign_result.c b/src/ui/sign_result.c index 1c26ca6d5..139bc47f3 100644 --- a/src/ui/sign_result.c +++ b/src/ui/sign_result.c @@ -12,6 +12,13 @@ (sizeof(REFUSAL_TEXT_PART_2) - 1) + 1) static char refusal_text[REFUSAL_TEXT_MAX_SIZE]; +#define EXCEPTION_TEXT_PART_1 "Exception raised\nby the\n" +#define EXCEPTION_TEXT_PART_2 " app.\nTransaction state is unknown" +#define EXCEPTION_TEXT_MAX_SIZE \ + ((sizeof(EXCEPTION_TEXT_PART_1) - 1) + (sizeof(G_swap_ctx.payin_binary_name) - 1) + \ + (sizeof(EXCEPTION_TEXT_PART_2) - 1) + 1) +static char exception_text[EXCEPTION_TEXT_MAX_SIZE]; + void display_signing_failure(const char *appname) { snprintf(refusal_text, sizeof(refusal_text), @@ -26,4 +33,14 @@ void display_signing_success(void) { nbgl_useCaseReviewStatus(STATUS_TYPE_TRANSACTION_SIGNED, ui_idle); } +void display_signing_exception(const char *appname) { + snprintf(exception_text, + sizeof(exception_text), + "%s%s%s", + REFUSAL_TEXT_PART_1, + appname, + REFUSAL_TEXT_PART_2); + nbgl_useCaseStatus(exception_text, false, ui_idle); +} + #endif // HAVE_NBGL diff --git a/src/ui/sign_result.h b/src/ui/sign_result.h index dfa6ad0c7..9d7188739 100644 --- a/src/ui/sign_result.h +++ b/src/ui/sign_result.h @@ -7,4 +7,5 @@ // The "Ledger Moment" modal is only available on Stax void display_signing_success(void); void display_signing_failure(const char *appname); +void display_signing_exception(const char *appname); #endif // HAVE_NBGL