Skip to content

Commit e421c66

Browse files
authored
feat(ui): draw progress bar using LVGL components. (#354)
1 parent 5cc232f commit e421c66

File tree

2 files changed

+65
-55
lines changed

2 files changed

+65
-55
lines changed

core/embed/trezorhal/se_thd89.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1792,6 +1792,9 @@ secbool se_gen_session_seed(const char *passphrase, bool cardano) {
17921792
}
17931793
hal_delay(100);
17941794
}
1795+
if (ui_callback) {
1796+
ui_callback(0, 100 * 10, NULL);
1797+
}
17951798
} else {
17961799
if (status & 0x80) {
17971800
return sectrue;
@@ -1808,6 +1811,10 @@ secbool se_gen_session_seed(const char *passphrase, bool cardano) {
18081811
}
18091812
hal_delay(100);
18101813
}
1814+
1815+
if (ui_callback) {
1816+
ui_callback(0, 100 * 10, NULL);
1817+
}
18111818
}
18121819

18131820
return sectrue;

core/src/trezor/pin.py

Lines changed: 58 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -6,84 +6,87 @@
66

77
_pre_scr: Any = None
88
_scr: Any = None
9+
_timer: Any = None
10+
11+
12+
def _timer_callback(timer: Any) -> None:
13+
14+
global _scr, _timer
15+
16+
if _scr is not None:
17+
try:
18+
_scr.delete()
19+
_scr = None
20+
if _timer is not None:
21+
_timer._del()
22+
_timer = None
23+
except Exception:
24+
_scr = None
25+
_timer = None
926

1027

1128
def show_pin_timeout(seconds: int, progress: int, message: str) -> bool:
12-
from trezor import ui
1329
from trezor.lvglui.scrs import lv
1430
from trezor.lvglui.scrs.common import FullSizeWindow
31+
from trezor.lvglui.i18n import gettext as _, keys as i18n_keys
32+
from trezor.lvglui.lv_colors import lv_colors
1533

1634
global _previous_progress
17-
global _previous_seconds
18-
global _scr
35+
global _scr, _timer
1936

2037
if callable(keepalive_callback):
2138
keepalive_callback()
2239

23-
if message is not None:
24-
text = ""
25-
if message == "read fp data":
40+
_scr_need_create = _scr is None
41+
if _scr_need_create:
42+
try:
43+
_scr.subtitle
44+
except Exception:
45+
_scr = None
46+
_scr_need_create = True
47+
48+
if _scr_need_create:
49+
if message is not None:
2650
text = ""
51+
if message == "read fp data":
52+
text = _(i18n_keys.MSG__READING_FINGERPRINT_FROM_SECURITY_CHIP)
53+
else:
54+
text = message
2755
else:
28-
text = message
56+
text = ""
2957

30-
if _scr is None:
31-
_scr = FullSizeWindow(title="", subtitle=text)
32-
_scr.subtitle.set_size(480, 200)
33-
_scr.subtitle.set_pos(0, 462)
34-
_scr.subtitle.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
35-
if progress != 0:
36-
lv.refr_now(None)
58+
_scr = FullSizeWindow(title="", subtitle=text)
59+
_scr.subtitle.set_size(480, 200)
60+
_scr.subtitle.set_pos(0, 462)
61+
_scr.subtitle.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
3762

38-
else:
39-
if _scr is not None:
40-
try:
41-
_scr.delete()
42-
_scr = None
43-
except Exception:
44-
_scr = None
63+
arc_loader = lv.arc(_scr)
64+
arc_loader.set_bg_angles(0, 360)
65+
arc_loader.set_size(160, 160)
66+
arc_loader.set_rotation(270)
67+
arc_loader.set_angles(0, 0)
68+
arc_loader.remove_style(None, lv.PART.KNOB)
69+
arc_loader.set_style_arc_color(lv_colors.WHITE, lv.PART.INDICATOR)
70+
arc_loader.center()
4571

46-
if progress == 0:
47-
if progress != _previous_progress:
48-
# avoid overdraw in case of repeated progress calls
49-
ui.display.clear()
50-
ui.display.loader(progress, False, 0, ui.FG, ui.BG)
51-
_previous_seconds = None
52-
# ui.display.text_center(ui.WIDTH // 2, 37, message, ui.BOLD, ui.FG, ui.BG)
53-
if _scr is not None:
54-
try:
55-
_scr.invalidate()
56-
lv.refr_now(None)
57-
except Exception:
58-
_scr = None
72+
_scr.arc_loader = arc_loader
73+
74+
_timer = lv.timer_create(_timer_callback, 10, None)
75+
_timer.set_repeat_count(1)
5976

60-
# if not utils.DISABLE_ANIMATION:
61-
else:
62-
ui.display.loader(progress, False, 0, ui.FG, ui.BG)
63-
64-
if seconds != _previous_seconds:
65-
if seconds == 0:
66-
# remaining = ""
67-
ui.display.clear()
68-
# elif seconds == 1:
69-
# remaining = "1 second left"
70-
# else:
71-
# remaining = f"{seconds} seconds left"
72-
ui.display.bar(0, ui.HEIGHT - 42, ui.WIDTH, 25, ui.BG)
73-
# ui.display.text_center(
74-
# ui.WIDTH // 2, ui.HEIGHT - 22, remaining, ui.BOLD, ui.FG, ui.BG
75-
# )
76-
_previous_seconds = seconds
77+
_scr.arc_loader.set_end_angle(progress * 360 // 1000)
78+
lv.refr_now(None)
7779

7880
if progress == 1000:
79-
ui.display.clear()
8081
if _scr is not None:
8182
try:
8283
_scr.delete()
8384
_scr = None
85+
if _timer is not None:
86+
_timer._del()
87+
_timer = None
8488
except Exception:
8589
_scr = None
90+
_timer = None
8691

87-
ui.refresh()
88-
_previous_progress = progress
89-
return False
92+
return True

0 commit comments

Comments
 (0)