You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
trezor-firmware/core/embed/rust/src/ui/demo/demo_core.rs

104 lines
2.6 KiB

use super::anim_timer::AnimTimer;
use crate::ui::{
component::Event,
display::{self, Color, Font},
event::TouchEvent,
geometry::{Offset, Point, Rect},
shape::{self, Viewport},
};
use crate::{time, trezorhal::io::io_touch_read};
use core::fmt::Write;
use heapless::String;
use super::{screen1::build_screen1, screen2::build_screen2};
fn render_time_overlay(duration: time::Duration) {
shape::render_on_display(
Some(Viewport::new(Rect::new(
Point::new(200, 0),
Point::new(240, 20),
))),
Some(Color::rgb(0, 0, 255)),
|target| {
let text_color = Color::rgb(255, 255, 0);
let mut info = String::<128>::new();
write!(info, "{}", duration.to_millis() as f32 / 1.0).unwrap();
let font = Font::NORMAL;
let pt = Point::new(200, font.vert_center(0, 20, "A"));
shape::Text::new(pt, info.as_str())
.with_fg(text_color)
.with_font(font)
.render(target);
},
);
}
fn touch_event() -> Option<TouchEvent> {
let event = io_touch_read();
if event == 0 {
return None;
}
let event_type = event >> 24;
let ex = ((event >> 12) & 0xFFF) as i16;
let ey = (event & 0xFFF) as i16;
TouchEvent::new(event_type, ex as _, ey as _).ok()
}
// Returns the split point between two screens
// (ranging from -240 to 0)
fn anim_screen_transition(timer: &AnimTimer) -> i16 {
let anim = pareen::constant(0.0)
.seq_ease_in_out(
0.0,
pareen::easer::functions::Back,
1.5,
pareen::constant(-240.0),
)
.seq_ease_in_out(
5.0,
pareen::easer::functions::Back,
0.75,
pareen::constant(0.0),
)
.repeat(10.0);
anim.eval(timer.elapsed()) as i16
}
#[no_mangle]
extern "C" fn drawlib_demo() {
let screen1 = build_screen1().unwrap();
let screen2 = build_screen2().unwrap();
let mut timer = AnimTimer::new();
timer.start();
loop {
if let Some(e) = touch_event() {
screen1.obj_event(Event::Touch(e)).unwrap();
screen2.obj_event(Event::Touch(e)).unwrap();
}
let split = anim_screen_transition(&timer);
display::sync();
let start_time = time::Instant::now();
screen1.obj_render(Offset::x(split));
screen2.obj_render(Offset::x(240 + split));
let duration = time::Instant::now()
.checked_duration_since(start_time)
.unwrap();
render_time_overlay(duration);
display::refresh();
}
}