mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-27 08:38:07 +00:00
ui.display.loader: slice_span added for indeterminate loaders
This commit is contained in:
parent
a3aae9c234
commit
9de96f6114
@ -237,7 +237,7 @@ void ui_screen_install_confirm_newvendor(const vendor_header *const vhdr,
|
||||
void ui_screen_install(void) {
|
||||
display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_WHITE);
|
||||
display_loader(0, -20, COLOR_BL_PROCESS, COLOR_WHITE, toi_icon_install,
|
||||
sizeof(toi_icon_install), COLOR_BLACK);
|
||||
sizeof(toi_icon_install), COLOR_BLACK, 0);
|
||||
display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 24,
|
||||
"Installing firmware", -1, FONT_NORMAL, COLOR_BLACK,
|
||||
COLOR_WHITE);
|
||||
@ -245,12 +245,12 @@ void ui_screen_install(void) {
|
||||
|
||||
void ui_screen_install_progress_erase(int pos, int len) {
|
||||
display_loader(250 * pos / len, -20, COLOR_BL_PROCESS, COLOR_WHITE,
|
||||
toi_icon_install, sizeof(toi_icon_install), COLOR_BLACK);
|
||||
toi_icon_install, sizeof(toi_icon_install), COLOR_BLACK, 0);
|
||||
}
|
||||
|
||||
void ui_screen_install_progress_upload(int pos) {
|
||||
display_loader(pos, -20, COLOR_BL_PROCESS, COLOR_WHITE, toi_icon_install,
|
||||
sizeof(toi_icon_install), COLOR_BLACK);
|
||||
sizeof(toi_icon_install), COLOR_BLACK, 0);
|
||||
}
|
||||
|
||||
// wipe UI
|
||||
@ -275,14 +275,14 @@ void ui_screen_wipe_confirm(void) {
|
||||
void ui_screen_wipe(void) {
|
||||
display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_WHITE);
|
||||
display_loader(0, -20, COLOR_BL_PROCESS, COLOR_WHITE, toi_icon_wipe,
|
||||
sizeof(toi_icon_wipe), COLOR_BLACK);
|
||||
sizeof(toi_icon_wipe), COLOR_BLACK, 0);
|
||||
display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 24, "Wiping device", -1,
|
||||
FONT_NORMAL, COLOR_BLACK, COLOR_WHITE);
|
||||
}
|
||||
|
||||
void ui_screen_wipe_progress(int pos, int len) {
|
||||
display_loader(1000 * pos / len, -20, COLOR_BL_PROCESS, COLOR_WHITE,
|
||||
toi_icon_wipe, sizeof(toi_icon_wipe), COLOR_BLACK);
|
||||
toi_icon_wipe, sizeof(toi_icon_wipe), COLOR_BLACK, 0);
|
||||
}
|
||||
|
||||
// done UI
|
||||
@ -301,7 +301,7 @@ void ui_screen_done(int restart_seconds, secbool full_redraw) {
|
||||
display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_WHITE);
|
||||
}
|
||||
display_loader(1000, -20, COLOR_BL_DONE, COLOR_WHITE, toi_icon_done,
|
||||
sizeof(toi_icon_done), COLOR_BLACK);
|
||||
sizeof(toi_icon_done), COLOR_BLACK, 0);
|
||||
if (secfalse == full_redraw) {
|
||||
display_bar(0, DISPLAY_RESY - 24 - 18, 240, 23, COLOR_WHITE);
|
||||
}
|
||||
@ -314,7 +314,7 @@ void ui_screen_done(int restart_seconds, secbool full_redraw) {
|
||||
void ui_screen_fail(void) {
|
||||
display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_WHITE);
|
||||
display_loader(1000, -20, COLOR_BL_FAIL, COLOR_WHITE, toi_icon_fail,
|
||||
sizeof(toi_icon_fail), COLOR_BLACK);
|
||||
sizeof(toi_icon_fail), COLOR_BLACK, 0);
|
||||
display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 24,
|
||||
"Failed! Please, reconnect.", -1, FONT_NORMAL,
|
||||
COLOR_BLACK, COLOR_WHITE);
|
||||
|
@ -318,7 +318,7 @@ static void inflate_callback_loader(uint8_t byte, uint32_t pos,
|
||||
|
||||
void display_loader(uint16_t progress, int yoffset, uint16_t fgcolor,
|
||||
uint16_t bgcolor, const uint8_t *icon, uint32_t iconlen,
|
||||
uint16_t iconfgcolor) {
|
||||
uint16_t iconfgcolor, uint16_t slice_span) {
|
||||
#if TREZOR_MODEL == T
|
||||
uint16_t colortable[16], iconcolortable[16];
|
||||
set_color_table(colortable, fgcolor, bgcolor);
|
||||
@ -378,7 +378,7 @@ void display_loader(uint16_t progress, int yoffset, uint16_t fgcolor,
|
||||
PIXELDATA(iconcolortable[c]);
|
||||
} else {
|
||||
uint8_t c;
|
||||
if (progress > a) {
|
||||
if (progress > a && (slice_span == 0 || progress < (a + slice_span))) {
|
||||
c = (img_loader[my][mx] & 0x00F0) >> 4;
|
||||
} else {
|
||||
c = img_loader[my][mx] & 0x000F;
|
||||
|
@ -84,7 +84,7 @@ void display_icon(int x, int y, int w, int h, const void *data, int datalen,
|
||||
uint16_t fgcolor, uint16_t bgcolor);
|
||||
void display_loader(uint16_t progress, int yoffset, uint16_t fgcolor,
|
||||
uint16_t bgcolor, const uint8_t *icon, uint32_t iconlen,
|
||||
uint16_t iconfgcolor);
|
||||
uint16_t iconfgcolor, uint16_t slice_span);
|
||||
|
||||
#ifndef TREZOR_PRINT_DISABLE
|
||||
void display_print_color(uint16_t fgcolor, uint16_t bgcolor);
|
||||
|
@ -198,7 +198,7 @@ STATIC mp_obj_t mod_trezorui_Display_icon(size_t n_args, const mp_obj_t *args) {
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_icon_obj, 6, 6,
|
||||
mod_trezorui_Display_icon);
|
||||
/// def loader(self, progress: int, yoffset: int, fgcolor: int, bgcolor: int,
|
||||
/// icon: bytes = None, iconfgcolor: int = None) -> None:
|
||||
/// icon: bytes = None, iconfgcolor: int = None, slice_span: int = None) -> None:
|
||||
/// '''
|
||||
/// Renders a rotating loader graphic.
|
||||
/// Progress determines its position (0-1000), fgcolor is used as foreground
|
||||
@ -206,6 +206,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_icon_obj, 6, 6,
|
||||
/// icon is drawn in the middle using the color specified in iconfgcolor.
|
||||
/// Icon needs to be of exactly LOADER_ICON_SIZE x LOADER_ICON_SIZE pixels
|
||||
/// size.
|
||||
/// If slice_span is defined the progress is sliced to emulate indeterminate
|
||||
/// loader.
|
||||
/// '''
|
||||
STATIC mp_obj_t mod_trezorui_Display_loader(size_t n_args,
|
||||
const mp_obj_t *args) {
|
||||
@ -213,8 +215,11 @@ STATIC mp_obj_t mod_trezorui_Display_loader(size_t n_args,
|
||||
mp_int_t yoffset = mp_obj_get_int(args[2]);
|
||||
mp_int_t fgcolor = mp_obj_get_int(args[3]);
|
||||
mp_int_t bgcolor = mp_obj_get_int(args[4]);
|
||||
if (n_args > 5) { // icon provided
|
||||
mp_buffer_info_t icon;
|
||||
mp_buffer_info_t icon = {.buf = NULL, .len=0};
|
||||
uint16_t iconfgcolor = 0;
|
||||
uint16_t slice_span = 0;
|
||||
|
||||
if (n_args > 5 && args[5] != mp_const_none) { // icon provided
|
||||
mp_get_buffer_raise(args[5], &icon, MP_BUFFER_READ);
|
||||
const uint8_t *data = icon.buf;
|
||||
if (icon.len < 8 || memcmp(data, "TOIg", 4) != 0) {
|
||||
@ -229,21 +234,25 @@ STATIC mp_obj_t mod_trezorui_Display_loader(size_t n_args,
|
||||
if (datalen != icon.len - 12) {
|
||||
mp_raise_ValueError("Invalid size of data");
|
||||
}
|
||||
uint16_t iconfgcolor;
|
||||
|
||||
if (n_args > 6) { // icon color provided
|
||||
iconfgcolor = mp_obj_get_int(args[6]);
|
||||
} else {
|
||||
iconfgcolor = ~bgcolor; // invert
|
||||
}
|
||||
display_loader(progress, yoffset, fgcolor, bgcolor, icon.buf, icon.len,
|
||||
iconfgcolor);
|
||||
} else {
|
||||
display_loader(progress, yoffset, fgcolor, bgcolor, NULL, 0, 0);
|
||||
}
|
||||
|
||||
if (n_args > 7 && args[7] != mp_const_none) { // slice span provided
|
||||
slice_span = mp_obj_get_int(args[7]);
|
||||
}
|
||||
|
||||
display_loader(progress, yoffset, fgcolor, bgcolor, icon.buf, icon.len,
|
||||
iconfgcolor, slice_span);
|
||||
|
||||
return mp_const_none;
|
||||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_loader_obj, 5,
|
||||
7, mod_trezorui_Display_loader);
|
||||
8, mod_trezorui_Display_loader);
|
||||
|
||||
/// def print(self, text: str) -> None:
|
||||
/// '''
|
||||
|
@ -51,12 +51,14 @@ class Display:
|
||||
The icon needs to be in TREZOR Optimized Image Format (TOIF) - gray-scale mode.
|
||||
'''
|
||||
|
||||
def loader(self, progress: int, yoffset: int, fgcolor: int, bgcolor: int, icon: bytes = None, iconfgcolor: int = None) -> None:
|
||||
def loader(self, progress: int, yoffset: int, fgcolor: int, bgcolor: int, icon: bytes = None, iconfgcolor: int = None, slice_span: int = None) -> None:
|
||||
'''
|
||||
Renders a rotating loader graphic.
|
||||
Progress determines its position (0-1000), fgcolor is used as foreground color, bgcolor as background.
|
||||
When icon and iconfgcolor are provided, an icon is drawn in the middle using the color specified in iconfgcolor.
|
||||
Icon needs to be of exactly LOADER_ICON_SIZE x LOADER_ICON_SIZE pixels size.
|
||||
If slice_span is defined the progress is sliced to emulate indeterminate
|
||||
loader.
|
||||
'''
|
||||
|
||||
def print(self, text: str) -> None:
|
||||
|
Loading…
Reference in New Issue
Block a user