21#if defined(HAVE_BOLOS)
22#include "bolos_privileged_ux.h"
25#include "bolos_target.h"
34#define COMPLIANCE_UX_160
41#if defined(HAVE_INDEXED_STRINGS)
43#include "bolos_ux_loc_strings.h"
60#if defined(HAVE_INDEXED_STRINGS)
73#if !defined(HAVE_INDEXED_STRINGS)
74#define STATIC_IF_NOT_INDEXED static
76#define STATIC_IF_NOT_INDEXED
82 unsigned short element_count,
85 unsigned char event_kind);
87 unsigned short element_count,
90 unsigned char event_kind,
107 const bagl_icon_details_t *
icon;
111#if defined(HAVE_INDEXED_STRINGS)
115const bagl_icon_details_t *get_glyphs_icon(
unsigned char id);
116const char *get_string_buffer(
unsigned char id);
120#ifndef BUTTON_FAST_THRESHOLD_CS
121#define BUTTON_FAST_THRESHOLD_CS 8
123#ifndef BUTTON_FAST_ACTION_CS
124#define BUTTON_FAST_ACTION_CS 3
128 unsigned int button_mask_counter);
130#define BUTTON_RIGHT 2
132#define BUTTON_EVT_FAST 0x40000000UL
133#define BUTTON_EVT_RELEASED 0x80000000UL
135 unsigned int new_button_mask);
142 unsigned int average_char_width);
145 unsigned int average_char_width);
150#ifndef UX_STACK_SLOT_COUNT
151#define UX_STACK_SLOT_COUNT 1
154#ifndef UX_STACK_SLOT_ARRAY_COUNT
155#define UX_STACK_SLOT_ARRAY_COUNT 1
216 const bagl_icon_details_t *
icon;
239 const bagl_icon_details_t *
icon;
269#if defined(HAVE_UX_FLOW)
287 ux_layout_paging_state_t layout_paging;
294#if defined(HAVE_UX_FLOW)
308 unsigned int menulist_current;
310 list_item_value_t menulist_getter;
311 list_item_select_t menulist_selector;
314#ifdef COMPLIANCE_UX_160
321#ifdef COMPLIANCE_UX_160
324#define G_ux_params ux.params
325#define callback_interval_ms stack[0].ticker_interval
327 memset(&G_ux, 0, sizeof(G_ux)); \
339#define UX_INIT() memset(&G_ux, 0, sizeof(G_ux));
349#define UX_DISPLAY_NEXT_ELEMENT() \
350 if (G_ux.stack[0].element_arrays[0].element_array \
351 && G_ux.stack[0].element_index < G_ux.stack[0].element_arrays[0].element_array_count \
352 && (os_perso_isonboarded() != BOLOS_UX_OK \
353 || os_global_pin_is_validated() == BOLOS_UX_OK)) { \
354 while (G_ux.stack[0].element_index \
355 < G_ux.stack[0].element_arrays[0].element_array_count) { \
356 const bagl_element_t *element \
357 = &G_ux.stack[0].element_arrays[0].element_array[G_ux.stack[0].element_index]; \
358 if (!G_ux.stack[0].screen_before_element_display_callback \
359 || (element = G_ux.stack[0].screen_before_element_display_callback(element))) { \
360 if ((unsigned int) element \
362 element = &G_ux.stack[0] \
364 .element_array[G_ux.stack[0].element_index]; \
366 io_seph_ux_display_bagl_element(element); \
368 G_ux.stack[0].element_index++; \
370 if (G_ux.stack[0].element_index == G_ux.stack[0].element_arrays[0].element_array_count) { \
380#define UX_WAKE_UP() \
381 G_ux_params.ux_id = BOLOS_UX_WAKE_UP; \
382 G_ux_params.len = 0; \
383 os_ux(&G_ux_params); \
384 G_ux_params.len = os_sched_last_status(TASK_BOLOS_UX);
389#define UX_REDISPLAY_REQUEST() \
390 io_seph_ux_init_button(); \
391 G_ux.stack[0].element_index = 0;
396#define UX_REDISPLAY_IDX(index) \
397 io_seph_ux_init_button();
399 G_ux.stack[0].element_index = index; \
401 G_ux_params.len = os_sched_last_status(TASK_BOLOS_UX); \
402 if (G_ux_params.len != BOLOS_UX_IGNORE && G_ux_params.len != BOLOS_UX_CONTINUE) { \
403 UX_DISPLAY_NEXT_ELEMENT(); \
409#define UX_REDISPLAY() UX_REDISPLAY_IDX(0)
411#define UX_DISPLAY(elements_array, preprocessor) \
412 G_ux.stack[0].element_arrays[0].element_array = elements_array; \
413 G_ux.stack[0].element_arrays[0].element_array_count \
414 = sizeof(elements_array) / sizeof(elements_array[0]); \
415 G_ux.stack[0].button_push_callback = elements_array##_button; \
416 G_ux.stack[0].screen_before_element_display_callback = preprocessor; \
424#define UX_DISPLAY_REQUEST(elements_array, preprocessor) \
425 G_ux.stack[0].element_arrays[0].element_array = elements_array; \
426 G_ux.stack[0].element_arrays[0].element_array_count \
427 = sizeof(elements_array) / sizeof(elements_array[0]); \
428 G_ux.stack[0].button_push_callback = elements_array##_button; \
429 G_ux.stack[0].screen_before_element_display_callback = preprocessor; \
436#define UX_CALLBACK_SET_INTERVAL(ms) G_ux.stack[0].ticker_value = ms;
442#define UX_FORWARD_EVENT(callback, ignoring_app_if_ux_busy) \
443 G_ux_params.ux_id = BOLOS_UX_EVENT; \
444 G_ux_params.len = 0; \
445 os_ux(&G_ux_params); \
446 G_ux_params.len = os_sched_last_status(TASK_BOLOS_UX); \
447 if (G_ux_params.len == BOLOS_UX_REDRAW) { \
450 else if (!ignoring_app_if_ux_busy \
451 || (G_ux_params.len != BOLOS_UX_IGNORE && G_ux_params.len != BOLOS_UX_CONTINUE)) { \
455#define UX_CONTINUE_DISPLAY_APP(displayed_callback) \
456 UX_DISPLAY_NEXT_ELEMENT(); \
458 if (G_ux.stack[0].element_index >= G_ux.stack[0].element_arrays[0].element_array_count) { \
465#define UX_DISPLAYED_EVENT(displayed_callback) \
466 UX_FORWARD_EVENT({ UX_CONTINUE_DISPLAY_APP(displayed_callback); }, 1)
471#define UX_DISPLAYED() \
472 (G_ux.stack[0].element_index >= G_ux.stack[0].element_arrays[0].element_array_count)
478#define UX_WAIT_DISPLAYED() \
479 while (!UX_DISPLAYED()) { \
480 UX_DISPLAY_NEXT_ELEMENT(); \
487#define UX_BUTTON_PUSH_EVENT(seph_packet) \
490 if (G_ux.stack[0].button_push_callback) { \
491 io_seproxyhal_button_push(G_ux.stack[0].button_push_callback, \
492 seph_packet[3] >> 1); \
494 UX_CONTINUE_DISPLAY_APP({}); \
498#define UX_FINGER_EVENT(seph_packet)
503#define UX_TICKER_EVENT(seph_packet, callback) \
506 unsigned int UX_ALLOWED \
507 = (G_ux_params.len != BOLOS_UX_IGNORE && G_ux_params.len != BOLOS_UX_CONTINUE); \
508 if (G_ux.stack[0].ticker_value) { \
509 G_ux.stack[0].ticker_value -= MIN(G_ux.stack[0].ticker_value, 100); \
510 if (!G_ux.stack[0].ticker_value) { \
511 if (!G_ux.stack[0].ticker_callback) { \
515 G_ux.stack[0].ticker_value = G_ux.stack[0].ticker_interval; \
516 G_ux.stack[0].ticker_callback(0); \
521 UX_CONTINUE_DISPLAY_APP({}); \
530#define UX_DEFAULT_EVENT() UX_FORWARD_EVENT({ UX_CONTINUE_DISPLAY_APP({}); }, 0);
536#define UX_DISPLAY_KEYBOARD(callback) \
537 G_ux_params.ux_id = BOLOS_UX_KEYBOARD; \
538 G_ux_params.len = 0; \
539 os_ux(&G_ux_params); \
540 G_ux_params.len = os_sched_last_status(TASK_BOLOS_UX);
548 unsigned int ux_status;
557 NULL, NULL, 0, NULL, NULL, NULL, 0, 0 \
560#define UX_MENU_INIT() memset(&ux_menu, 0, sizeof(ux_menu));
562#define UX_MENU_DISPLAY(current_entry, menu_entries, menu_entry_preprocessor) \
563 ux_menu_display(current_entry, menu_entries, menu_entry_preprocessor);
566#define UX_MENU_UNCHANGED_ENTRY (-1UL)
574#define UX_TURNER_INIT() memset(&ux_turner, 0, sizeof(ux_turner));
576#define UX_TURNER_DISPLAY(current_step, steps, steps_count, button_push_callback) \
577 ux_turner_display(current_step, steps, steps_count, button_push_callback);
580#define UX_TURNER_UNCHANGED_ENTRY (-1UL)
583 unsigned int steps_count,
596#error HAVE_UX_LEGACY must be removed in the release
598#warning Refactor UX plz
Key pair generation based on elliptic curves.
bagl_component_t component
const bagl_icon_details_t * icon
unsigned int button_same_mask_counter
unsigned char element_arrays_count
button_push_callback_t button_push_callback
unsigned int ticker_interval
bolos_task_status_t exit_code_after_elements_displayed
unsigned short element_index
callback_int_t ticker_callback
struct ux_stack_slot_s::@51 element_arrays[UX_STACK_SLOT_ARRAY_COUNT]
bagl_element_callback_t screen_before_element_display_callback
unsigned int ticker_value
const bagl_element_t * element_array
unsigned char element_array_count
unsigned char stack_count
ux_stack_slot_t stack[UX_STACK_SLOT_COUNT]
bagl_element_t tmp_element
bolos_task_status_t exit_code
unsigned int current_step
const ux_turner_step_t * steps
button_push_callback_t button_callback
const bagl_icon_details_t * icon
unsigned int next_step_ms
void io_seproxyhal_button_push(button_push_callback_t button_push_callback, unsigned int new_button_mask)
void(* ux_menu_callback_t)(unsigned int userid)
unsigned int ux_stack_push(void)
unsigned int ux_stack_is_element_array_present(const bagl_element_t *element_array)
void io_seproxyhal_touch_callback(const bagl_element_t *element, unsigned char event)
const bagl_element_t * ux_menu_element_preprocessor(const bagl_element_t *element)
struct ux_turner_state_s ux_turner_state_t
const bagl_element_t * ux_stack_display_element_callback(const bagl_element_t *element)
struct ux_seph_s ux_seph_os_and_app_t
struct ux_menu_state_s ux_menu_state_t
#define UX_STACK_SLOT_COUNT
void ux_turner_display(unsigned int current_step, const ux_turner_step_t *steps, unsigned int steps_count, button_push_callback_t button_callback)
void ux_turner_ticker(unsigned int elpased_ms)
const ux_menu_entry_t *(* ux_menu_iterator_t)(unsigned int entry_idx)
struct ux_layout_icon_strings_params_s ux_layout_icon_strings_params_t
void ux_stack_display(unsigned int stack_slot)
void(* ux_turner_callback_t)(void)
void io_seproxyhal_display(const bagl_element_t *element)
void io_seproxyhal_touch_element_callback(const bagl_element_t *elements, unsigned short element_count, unsigned short x, unsigned short y, unsigned char event_kind, bagl_element_callback_t before_display)
void ux_stack_remove(unsigned int stack_slot)
void io_seproxyhal_display_default(const bagl_element_t *element)
struct ux_turner_step_s ux_turner_step_t
void ux_stack_al_display_next_element(unsigned int stack_slot)
void ux_stack_insert(unsigned int stack_slot)
void io_seproxyhal_touch(const bagl_element_t *elements, unsigned short element_count, unsigned short x, unsigned short y, unsigned char event_kind)
ux_turner_state_t ux_turner
const bagl_element_t * ux_layout_strings_prepro(const bagl_element_t *element)
ux_seph_os_and_app_t G_ux_os
void ux_stack_init(unsigned int stack_slot)
unsigned int(* button_push_callback_t)(unsigned int button_mask, unsigned int button_mask_counter)
const bagl_element_t *(* bagl_element_callback_t)(const bagl_element_t *element)
#define UX_STACK_SLOT_ARRAY_COUNT
void ux_menu_display(unsigned int current_entry, const ux_menu_entry_t *menu_entries, ux_menu_preprocessor_t menu_entry_preprocessor)
void ux_stack_display_elements(ux_stack_slot_t *slot)
struct ux_layout_strings_params_s ux_layout_strings_params_t
void ux_stack_redisplay(void)
unsigned int bagl_label_roundtrip_duration_ms(const bagl_element_t *e, unsigned int average_char_width)
unsigned int bagl_label_roundtrip_duration_ms_buf(const bagl_element_t *e, const char *str, unsigned int average_char_width)
const bagl_element_t *(* ux_menu_preprocessor_t)(const ux_menu_entry_t *, bagl_element_t *element)
unsigned int ux_menu_elements_button(unsigned int button_mask, unsigned int button_mask_counter)
unsigned int(* callback_int_t)(unsigned int)
unsigned int ux_stack_pop(void)
BOLOS_UX_LOC_STRINGS UX_LOC_STRINGS_INDEX