mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-23 14:58:09 +00:00
feat(core): uninitialized welcome flow
[no changelog]
This commit is contained in:
parent
2537436211
commit
64bc94cbc9
BIN
core/assets/device_name_T.png
Normal file
BIN
core/assets/device_name_T.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.7 KiB |
BIN
core/assets/lock_empty.png
Normal file
BIN
core/assets/lock_empty.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
BIN
core/assets/lock_full.png
Normal file
BIN
core/assets/lock_full.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.5 KiB |
Binary file not shown.
Before Width: | Height: | Size: 12 KiB |
BIN
core/assets/start.png
Normal file
BIN
core/assets/start.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.8 KiB |
@ -117,6 +117,7 @@ void ui_screen_boot_click(void) {
|
||||
|
||||
// welcome UI
|
||||
|
||||
void ui_screen_welcome_model(void) { screen_welcome_model(); }
|
||||
void ui_screen_welcome(void) { screen_welcome(); }
|
||||
|
||||
uint32_t ui_screen_intro(const vendor_header *const vhdr,
|
||||
|
@ -37,6 +37,7 @@ void ui_screen_boot(const vendor_header* const vhdr,
|
||||
void ui_screen_boot_wait(int wait_seconds);
|
||||
void ui_screen_boot_click(void);
|
||||
|
||||
void ui_screen_welcome_model(void);
|
||||
void ui_screen_welcome(void);
|
||||
|
||||
uint32_t ui_screen_intro(const vendor_header* const vhdr,
|
||||
|
@ -359,6 +359,8 @@ int main(void) {
|
||||
|
||||
ui_set_initial_setup(true);
|
||||
|
||||
ui_screen_welcome_model();
|
||||
hal_delay(1000);
|
||||
ui_screen_welcome();
|
||||
|
||||
// erase storage
|
||||
|
@ -135,8 +135,6 @@ int main(void) {
|
||||
sdcard_init();
|
||||
#endif
|
||||
|
||||
display_clear();
|
||||
|
||||
#if !defined TREZOR_MODEL_1
|
||||
// jump to unprivileged mode
|
||||
// http://infocenter.arm.com/help/topic/com.arm.doc.dui0552a/CHDBIBGJ.html
|
||||
|
@ -24,5 +24,6 @@ void screen_wipe_fail(void);
|
||||
uint32_t screen_install_success(const char* reboot_msg, bool initial_setup,
|
||||
bool complete_draw);
|
||||
uint32_t screen_install_fail(void);
|
||||
void screen_welcome_model(void);
|
||||
void screen_welcome(void);
|
||||
void screen_boot_empty(bool firmware_present, bool fading);
|
||||
|
@ -474,6 +474,7 @@ pub const TOP_CENTER: Alignment2D = (Alignment::Center, Alignment::Start);
|
||||
pub const CENTER: Alignment2D = (Alignment::Center, Alignment::Center);
|
||||
pub const BOTTOM_LEFT: Alignment2D = (Alignment::Start, Alignment::End);
|
||||
pub const BOTTOM_RIGHT: Alignment2D = (Alignment::End, Alignment::End);
|
||||
pub const BOTTOM_CENTER: Alignment2D = (Alignment::Center, Alignment::End);
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Eq)]
|
||||
pub enum Axis {
|
||||
|
@ -5,7 +5,7 @@ use crate::{
|
||||
display::{self, Font},
|
||||
event::TouchEvent,
|
||||
geometry::Point,
|
||||
model_tt::constant,
|
||||
model_tt::{component::WelcomeScreen, constant},
|
||||
},
|
||||
};
|
||||
use heapless::String;
|
||||
@ -16,6 +16,7 @@ mod connect;
|
||||
pub mod intro;
|
||||
pub mod menu;
|
||||
pub mod theme;
|
||||
pub mod welcome;
|
||||
|
||||
use crate::{
|
||||
strutil::hexlify,
|
||||
@ -23,7 +24,7 @@ use crate::{
|
||||
component::text::paragraphs::{Paragraph, ParagraphVecShort, Paragraphs, VecExt},
|
||||
constant::screen,
|
||||
display::{Color, Icon},
|
||||
geometry::{Alignment, LinearPlacement, CENTER},
|
||||
geometry::{Alignment, LinearPlacement, TOP_CENTER},
|
||||
model_tt::{
|
||||
bootloader::{
|
||||
connect::Connect,
|
||||
@ -33,6 +34,7 @@ use crate::{
|
||||
CHECK40, DOWNLOAD32, FIRE32, FIRE40, LOGO_EMPTY, TEXT_WIPE_BOLD,
|
||||
TEXT_WIPE_NORMAL, WARNING40, WELCOME_COLOR, WELCOME_HIGHLIGHT_COLOR, X24,
|
||||
},
|
||||
welcome::Welcome,
|
||||
},
|
||||
component::{Button, ResultScreen},
|
||||
theme::{
|
||||
@ -401,7 +403,7 @@ extern "C" fn screen_boot_empty(firmware_present: bool, fading: bool) {
|
||||
};
|
||||
display::rect_fill(constant::screen(), bg);
|
||||
let icon = Icon::new(LOGO_EMPTY);
|
||||
icon.draw(screen().center(), CENTER, fg, bg);
|
||||
icon.draw(Point::new(screen().center().x, 48), TOP_CENTER, fg, bg);
|
||||
|
||||
if fading {
|
||||
fadein();
|
||||
@ -502,16 +504,13 @@ extern "C" fn screen_install_success(
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn screen_welcome() {
|
||||
fadeout();
|
||||
display::rect_fill(screen(), WELCOME_COLOR);
|
||||
|
||||
let mut messages = ParagraphVecShort::new();
|
||||
messages.add(Paragraph::new(&theme::TEXT_WELCOME, "Get started with").centered());
|
||||
messages.add(Paragraph::new(&theme::TEXT_WELCOME, "your trezor at").centered());
|
||||
messages.add(Paragraph::new(&theme::TEXT_WELCOME_URL, "trezor.io/start").centered());
|
||||
let mut frame =
|
||||
Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center());
|
||||
show(&mut frame, false);
|
||||
fadein();
|
||||
extern "C" fn screen_welcome_model() {
|
||||
let mut frame = WelcomeScreen::new();
|
||||
show(&mut frame, true);
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn screen_welcome() {
|
||||
let mut frame = Welcome::new();
|
||||
show(&mut frame, true);
|
||||
}
|
||||
|
@ -69,7 +69,9 @@ pub const WARNING40: &[u8] = include_res!("model_tt/res/warning40.toif");
|
||||
pub const CHECK24: &[u8] = include_res!("model_tt/res/check24.toif");
|
||||
pub const CHECK40: &[u8] = include_res!("model_tt/res/check40.toif");
|
||||
|
||||
pub const LOGO_EMPTY: &[u8] = include_res!("model_tt/res/trezor_empty.toif");
|
||||
pub const LOGO_EMPTY: &[u8] = include_res!("model_tt/res/lock_empty.toif");
|
||||
pub const DEVICE_NAME: &[u8] = include_res!("model_tt/res/device_name_T.toif");
|
||||
pub const START_URL: &[u8] = include_res!("model_tt/res/start.toif");
|
||||
|
||||
pub fn button_confirm() -> ButtonStyleSheet {
|
||||
ButtonStyleSheet {
|
||||
|
59
core/embed/rust/src/ui/model_tt/bootloader/welcome.rs
Normal file
59
core/embed/rust/src/ui/model_tt/bootloader/welcome.rs
Normal file
@ -0,0 +1,59 @@
|
||||
use crate::ui::{
|
||||
component::{Component, Event, EventCtx, Never, Pad},
|
||||
constant::screen,
|
||||
display::{self, Font, Icon},
|
||||
geometry::{Offset, Rect, TOP_CENTER},
|
||||
model_tt::{
|
||||
bootloader::theme::{START_URL, WELCOME_COLOR},
|
||||
theme::{BLACK, GREY_MEDIUM, WHITE},
|
||||
},
|
||||
};
|
||||
|
||||
pub struct Welcome {
|
||||
bg: Pad,
|
||||
}
|
||||
|
||||
impl Welcome {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
bg: Pad::with_background(WELCOME_COLOR).with_clear(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Component for Welcome {
|
||||
type Msg = Never;
|
||||
|
||||
fn place(&mut self, bounds: Rect) -> Rect {
|
||||
self.bg.place(screen());
|
||||
bounds
|
||||
}
|
||||
|
||||
fn event(&mut self, _ctx: &mut EventCtx, _event: Event) -> Option<Self::Msg> {
|
||||
None
|
||||
}
|
||||
|
||||
fn paint(&mut self) {
|
||||
self.bg.paint();
|
||||
display::text_center(
|
||||
screen().top_center() + Offset::y(102),
|
||||
"Get started with",
|
||||
Font::NORMAL,
|
||||
GREY_MEDIUM,
|
||||
BLACK,
|
||||
);
|
||||
display::text_center(
|
||||
screen().top_center() + Offset::y(126),
|
||||
"your Trezor at",
|
||||
Font::NORMAL,
|
||||
GREY_MEDIUM,
|
||||
BLACK,
|
||||
);
|
||||
Icon::new(START_URL).draw(
|
||||
screen().top_center() + Offset::y(135),
|
||||
TOP_CENTER,
|
||||
WHITE,
|
||||
BLACK,
|
||||
);
|
||||
}
|
||||
}
|
@ -1,3 +1,5 @@
|
||||
#[cfg(feature = "bootloader")]
|
||||
use crate::ui::model_tt::bootloader::theme::DEVICE_NAME;
|
||||
use crate::ui::{
|
||||
component::{Component, Event, EventCtx, Never},
|
||||
display::{self, Icon},
|
||||
@ -33,6 +35,13 @@ impl Component for WelcomeScreen {
|
||||
}
|
||||
|
||||
fn paint(&mut self) {
|
||||
Icon::new(theme::ICON_LOGO).draw(
|
||||
self.area.top_center() + Offset::y(ICON_TOP_MARGIN),
|
||||
geometry::TOP_CENTER,
|
||||
theme::FG,
|
||||
theme::BG,
|
||||
);
|
||||
#[cfg(not(feature = "bootloader"))]
|
||||
display::text_center(
|
||||
self.area.bottom_center() - Offset::y(TEXT_BOTTOM_MARGIN),
|
||||
MODEL_NAME,
|
||||
@ -40,9 +49,10 @@ impl Component for WelcomeScreen {
|
||||
theme::FG,
|
||||
theme::BG,
|
||||
);
|
||||
Icon::new(theme::ICON_LOGO).draw(
|
||||
self.area.top_center() + Offset::y(ICON_TOP_MARGIN),
|
||||
geometry::TOP_CENTER,
|
||||
#[cfg(feature = "bootloader")]
|
||||
Icon::new(DEVICE_NAME).draw(
|
||||
self.area.bottom_center() - Offset::y(TEXT_BOTTOM_MARGIN) + Offset::y(1),
|
||||
geometry::BOTTOM_CENTER,
|
||||
theme::FG,
|
||||
theme::BG,
|
||||
);
|
||||
|
BIN
core/embed/rust/src/ui/model_tt/res/device_name_T.toif
Normal file
BIN
core/embed/rust/src/ui/model_tt/res/device_name_T.toif
Normal file
Binary file not shown.
BIN
core/embed/rust/src/ui/model_tt/res/lock_empty.toif
Normal file
BIN
core/embed/rust/src/ui/model_tt/res/lock_empty.toif
Normal file
Binary file not shown.
BIN
core/embed/rust/src/ui/model_tt/res/lock_full.toif
Normal file
BIN
core/embed/rust/src/ui/model_tt/res/lock_full.toif
Normal file
Binary file not shown.
Binary file not shown.
BIN
core/embed/rust/src/ui/model_tt/res/start.toif
Normal file
BIN
core/embed/rust/src/ui/model_tt/res/start.toif
Normal file
Binary file not shown.
@ -98,7 +98,7 @@ pub const IMAGE_BG_BACK_BTN: &[u8] = include_res!("model_tt/res/bg-back40.toif")
|
||||
pub const IMAGE_BG_BACK_BTN_TALL: &[u8] = include_res!("model_tt/res/bg-back52.toif");
|
||||
|
||||
// Welcome screen.
|
||||
pub const ICON_LOGO: &[u8] = include_res!("model_tt/res/logo.toif");
|
||||
pub const ICON_LOGO: &[u8] = include_res!("model_tt/res/lock_full.toif");
|
||||
|
||||
// Default homescreen
|
||||
pub const IMAGE_HOMESCREEN: &[u8] = include_res!("model_tt/res/bg.jpg");
|
||||
|
@ -647,20 +647,18 @@ void display_reinit(void) {
|
||||
// important for model T as this is not set in boardloader
|
||||
display_set_little_endian();
|
||||
|
||||
// enable PWM timer
|
||||
TIM_HandleTypeDef TIM1_Handle;
|
||||
TIM1_Handle.Instance = TIM1;
|
||||
TIM1_Handle.Init.Period = LED_PWM_TIM_PERIOD - 1;
|
||||
// TIM1/APB2 source frequency equals to SystemCoreClock in our configuration,
|
||||
// we want 1 MHz
|
||||
TIM1_Handle.Init.Prescaler = SystemCoreClock / 1000000 - 1;
|
||||
TIM1_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
TIM1_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
TIM1_Handle.Init.RepetitionCounter = 0;
|
||||
HAL_TIM_PWM_Init(&TIM1_Handle);
|
||||
uint32_t prev_arr = TIM1->ARR;
|
||||
uint32_t prev_ccr1 = TIM1->CCR1;
|
||||
|
||||
uint8_t prev_val = (prev_ccr1 * 255) / prev_arr;
|
||||
DISPLAY_BACKLIGHT = prev_val;
|
||||
DISPLAY_ORIENTATION = 0;
|
||||
|
||||
pwm_period = LED_PWM_TIM_PERIOD;
|
||||
display_backlight(DISPLAY_BACKLIGHT);
|
||||
TIM1->CR1 |= TIM_CR1_ARPE;
|
||||
TIM1->CR2 |= TIM_CR2_CCPC;
|
||||
TIM1->CCR1 = pwm_period * prev_val / 255;
|
||||
TIM1->ARR = LED_PWM_TIM_PERIOD - 1;
|
||||
}
|
||||
|
||||
void display_sync(void) {
|
||||
@ -678,20 +676,16 @@ void display_sync(void) {
|
||||
void display_refresh(void) {}
|
||||
|
||||
void display_set_slow_pwm(void) {
|
||||
// enable PWM timer
|
||||
TIM_HandleTypeDef TIM1_Handle;
|
||||
TIM1_Handle.Instance = TIM1;
|
||||
TIM1_Handle.Init.Period = LED_PWM_SLOW_TIM_PERIOD - 1;
|
||||
// TIM1/APB2 source frequency equals to SystemCoreClock in our configuration,
|
||||
// we want 1 MHz
|
||||
TIM1_Handle.Init.Prescaler = SystemCoreClock / 1000000 - 1;
|
||||
TIM1_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
TIM1_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
TIM1_Handle.Init.RepetitionCounter = 0;
|
||||
HAL_TIM_PWM_Init(&TIM1_Handle);
|
||||
uint32_t prev_arr = TIM1->ARR;
|
||||
uint32_t prev_ccr1 = TIM1->CCR1;
|
||||
|
||||
uint8_t prev_val = (prev_ccr1 * 255) / prev_arr;
|
||||
|
||||
pwm_period = LED_PWM_SLOW_TIM_PERIOD;
|
||||
display_backlight(DISPLAY_BACKLIGHT);
|
||||
TIM1->CR1 |= TIM_CR1_ARPE;
|
||||
TIM1->CR2 |= TIM_CR2_CCPC;
|
||||
TIM1->ARR = LED_PWM_SLOW_TIM_PERIOD - 1;
|
||||
TIM1->CCR1 = pwm_period * prev_val / 255;
|
||||
}
|
||||
|
||||
void display_set_little_endian(void) {
|
||||
|
@ -21,7 +21,7 @@ from trezor.ui.layouts.homescreen import Lockscreen
|
||||
|
||||
from apps.common.request_pin import can_lock_device, verify_user_pin
|
||||
|
||||
_WELCOME_SCREEN_MS = 1500 # how long do we want to show welcome screen (minimum)
|
||||
_WELCOME_SCREEN_MS = 1200 # how long do we want to show welcome screen (minimum)
|
||||
|
||||
|
||||
def enforce_welcome_screen_duration() -> None:
|
||||
|
Loading…
Reference in New Issue
Block a user