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);
119#if defined(HAVE_LANGUAGE_PACK)
120void bolos_ux_select_language(uint16_t language);
121void bolos_ux_refresh_language(
void);
123typedef struct ux_loc_language_pack_infos {
124 unsigned char available;
126} UX_LOC_LANGUAGE_PACK_INFO;
129SYSCALL PERMISSION(APPLICATION_FLAG_BOLOS_UX)
void list_language_packs(
130 UX_LOC_LANGUAGE_PACK_INFO *packs PLENGTH(NB_LANG *
sizeof(UX_LOC_LANGUAGE_PACK_INFO)));
131SYSCALL PERMISSION(APPLICATION_FLAG_BOLOS_UX)
const LANGUAGE_PACK *get_language_pack(
132 unsigned int language);
135#ifndef BUTTON_FAST_THRESHOLD_CS
136#define BUTTON_FAST_THRESHOLD_CS 8
138#ifndef BUTTON_FAST_ACTION_CS
139#define BUTTON_FAST_ACTION_CS 3
143 unsigned int button_mask_counter);
145#define BUTTON_RIGHT 2
147#define BUTTON_EVT_FAST 0x40000000UL
148#define BUTTON_EVT_RELEASED 0x80000000UL
150 unsigned int new_button_mask);
157 unsigned int average_char_width);
160 unsigned int average_char_width);
165#ifndef UX_STACK_SLOT_COUNT
166#define UX_STACK_SLOT_COUNT 1
169#ifndef UX_STACK_SLOT_ARRAY_COUNT
170#define UX_STACK_SLOT_ARRAY_COUNT 1
231 const bagl_icon_details_t *
icon;
254 const bagl_icon_details_t *
icon;
284#if defined(HAVE_UX_FLOW)
302 ux_layout_paging_state_t layout_paging;
309#if defined(HAVE_UX_FLOW)
323 unsigned int menulist_current;
325 list_item_value_t menulist_getter;
326 list_item_select_t menulist_selector;
329#ifdef COMPLIANCE_UX_160
336#ifdef COMPLIANCE_UX_160
339#define G_ux_params ux.params
340#define callback_interval_ms stack[0].ticker_interval
342 memset(&G_ux, 0, sizeof(G_ux)); \
354#define UX_INIT() memset(&G_ux, 0, sizeof(G_ux));
364#define UX_DISPLAY_NEXT_ELEMENT() \
365 if (G_ux.stack[0].element_arrays[0].element_array \
366 && G_ux.stack[0].element_index < G_ux.stack[0].element_arrays[0].element_array_count \
367 && (os_perso_isonboarded() != BOLOS_UX_OK \
368 || os_global_pin_is_validated() == BOLOS_UX_OK)) { \
369 while (G_ux.stack[0].element_index \
370 < G_ux.stack[0].element_arrays[0].element_array_count) { \
371 const bagl_element_t *element \
372 = &G_ux.stack[0].element_arrays[0].element_array[G_ux.stack[0].element_index]; \
373 if (!G_ux.stack[0].screen_before_element_display_callback \
374 || (element = G_ux.stack[0].screen_before_element_display_callback(element))) { \
375 if ((unsigned int) element \
377 element = &G_ux.stack[0] \
379 .element_array[G_ux.stack[0].element_index]; \
381 io_seph_ux_display_bagl_element(element); \
383 G_ux.stack[0].element_index++; \
385 if (G_ux.stack[0].element_index == G_ux.stack[0].element_arrays[0].element_array_count) { \
395#define UX_WAKE_UP() \
396 G_ux_params.ux_id = BOLOS_UX_WAKE_UP; \
397 G_ux_params.len = 0; \
398 os_ux(&G_ux_params); \
399 G_ux_params.len = os_sched_last_status(TASK_BOLOS_UX);
404#define UX_REDISPLAY_REQUEST() \
405 io_seph_ux_init_button(); \
406 G_ux.stack[0].element_index = 0;
411#define UX_REDISPLAY_IDX(index) \
412 io_seph_ux_init_button();
414 G_ux.stack[0].element_index = index; \
416 G_ux_params.len = os_sched_last_status(TASK_BOLOS_UX); \
417 if (G_ux_params.len != BOLOS_UX_IGNORE && G_ux_params.len != BOLOS_UX_CONTINUE) { \
418 UX_DISPLAY_NEXT_ELEMENT(); \
424#define UX_REDISPLAY() UX_REDISPLAY_IDX(0)
426#define UX_DISPLAY(elements_array, preprocessor) \
427 G_ux.stack[0].element_arrays[0].element_array = elements_array; \
428 G_ux.stack[0].element_arrays[0].element_array_count \
429 = sizeof(elements_array) / sizeof(elements_array[0]); \
430 G_ux.stack[0].button_push_callback = elements_array##_button; \
431 G_ux.stack[0].screen_before_element_display_callback = preprocessor; \
439#define UX_DISPLAY_REQUEST(elements_array, preprocessor) \
440 G_ux.stack[0].element_arrays[0].element_array = elements_array; \
441 G_ux.stack[0].element_arrays[0].element_array_count \
442 = sizeof(elements_array) / sizeof(elements_array[0]); \
443 G_ux.stack[0].button_push_callback = elements_array##_button; \
444 G_ux.stack[0].screen_before_element_display_callback = preprocessor; \
451#define UX_CALLBACK_SET_INTERVAL(ms) G_ux.stack[0].ticker_value = ms;
457#define UX_FORWARD_EVENT(callback, ignoring_app_if_ux_busy) \
458 G_ux_params.ux_id = BOLOS_UX_EVENT; \
459 G_ux_params.len = 0; \
460 os_ux(&G_ux_params); \
461 G_ux_params.len = os_sched_last_status(TASK_BOLOS_UX); \
462 if (G_ux_params.len == BOLOS_UX_REDRAW) { \
465 else if (!ignoring_app_if_ux_busy \
466 || (G_ux_params.len != BOLOS_UX_IGNORE && G_ux_params.len != BOLOS_UX_CONTINUE)) { \
470#define UX_CONTINUE_DISPLAY_APP(displayed_callback) \
471 UX_DISPLAY_NEXT_ELEMENT(); \
473 if (G_ux.stack[0].element_index >= G_ux.stack[0].element_arrays[0].element_array_count) { \
480#define UX_DISPLAYED_EVENT(displayed_callback) \
481 UX_FORWARD_EVENT({ UX_CONTINUE_DISPLAY_APP(displayed_callback); }, 1)
486#define UX_DISPLAYED() \
487 (G_ux.stack[0].element_index >= G_ux.stack[0].element_arrays[0].element_array_count)
493#define UX_WAIT_DISPLAYED() \
494 while (!UX_DISPLAYED()) { \
495 UX_DISPLAY_NEXT_ELEMENT(); \
502#define UX_BUTTON_PUSH_EVENT(seph_packet) \
505 if (G_ux.stack[0].button_push_callback) { \
506 io_seproxyhal_button_push(G_ux.stack[0].button_push_callback, \
507 seph_packet[3] >> 1); \
509 UX_CONTINUE_DISPLAY_APP({}); \
513#define UX_FINGER_EVENT(seph_packet)
518#define UX_TICKER_EVENT(seph_packet, callback) \
521 unsigned int UX_ALLOWED \
522 = (G_ux_params.len != BOLOS_UX_IGNORE && G_ux_params.len != BOLOS_UX_CONTINUE); \
523 if (G_ux.stack[0].ticker_value) { \
524 G_ux.stack[0].ticker_value -= MIN(G_ux.stack[0].ticker_value, 100); \
525 if (!G_ux.stack[0].ticker_value) { \
526 if (!G_ux.stack[0].ticker_callback) { \
530 G_ux.stack[0].ticker_value = G_ux.stack[0].ticker_interval; \
531 G_ux.stack[0].ticker_callback(0); \
536 UX_CONTINUE_DISPLAY_APP({}); \
545#define UX_DEFAULT_EVENT() UX_FORWARD_EVENT({ UX_CONTINUE_DISPLAY_APP({}); }, 0);
551#define UX_DISPLAY_KEYBOARD(callback) \
552 G_ux_params.ux_id = BOLOS_UX_KEYBOARD; \
553 G_ux_params.len = 0; \
554 os_ux(&G_ux_params); \
555 G_ux_params.len = os_sched_last_status(TASK_BOLOS_UX);
563 unsigned int ux_status;
572 NULL, NULL, 0, NULL, NULL, NULL, 0, 0 \
575#define UX_MENU_INIT() memset(&ux_menu, 0, sizeof(ux_menu));
577#define UX_MENU_DISPLAY(current_entry, menu_entries, menu_entry_preprocessor) \
578 ux_menu_display(current_entry, menu_entries, menu_entry_preprocessor);
581#define UX_MENU_UNCHANGED_ENTRY (-1UL)
589#define UX_TURNER_INIT() memset(&ux_turner, 0, sizeof(ux_turner));
591#define UX_TURNER_DISPLAY(current_step, steps, steps_count, button_push_callback) \
592 ux_turner_display(current_step, steps, steps_count, button_push_callback);
595#define UX_TURNER_UNCHANGED_ENTRY (-1UL)
598 unsigned int steps_count,
611#error HAVE_UX_LEGACY must be removed in the release
613#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
struct ux_stack_slot_s::@48 element_arrays[UX_STACK_SLOT_ARRAY_COUNT]
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
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