1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-23 14:58:09 +00:00

fix(core): fix usb disconnected warning in new homescreen

[no changelog]
This commit is contained in:
tychovrahe 2022-10-13 13:44:31 +02:00 committed by TychoVrahe
parent 02e2b50d3f
commit 12f87aa01e
6 changed files with 24 additions and 33 deletions

View File

@ -329,7 +329,9 @@ fn generate_trezorhal_bindings() {
.allowlist_function("buffers_get_line_buffer_4bpp") .allowlist_function("buffers_get_line_buffer_4bpp")
.allowlist_function("buffers_get_text_buffer") .allowlist_function("buffers_get_text_buffer")
.allowlist_var("text_buffer_height") .allowlist_var("text_buffer_height")
.allowlist_var("buffer_width"); .allowlist_var("buffer_width")
//usb
.allowlist_function("usb_configured");
// Write the bindings to a file in the OUR_DIR. // Write the bindings to a file in the OUR_DIR.
bindings bindings
.generate() .generate()

View File

@ -13,6 +13,7 @@ pub mod random;
pub mod rgb_led; pub mod rgb_led;
pub mod slip39; pub mod slip39;
pub mod storage; pub mod storage;
pub mod usb;
pub mod uzlib; pub mod uzlib;
pub mod buffers; pub mod buffers;

View File

@ -0,0 +1,5 @@
use super::ffi;
pub fn usb_configured() -> bool {
unsafe { ffi::usb_configured() == ffi::sectrue }
}

View File

@ -1,5 +1,6 @@
use crate::{ use crate::{
time::{Duration, Instant}, time::{Duration, Instant},
trezorhal::usb::usb_configured,
ui::{ ui::{
component::{Component, Empty, Event, EventCtx, Pad, TimerToken}, component::{Component, Empty, Event, EventCtx, Pad, TimerToken},
display::{self, Color, Font}, display::{self, Color, Font},
@ -45,7 +46,6 @@ where
label, label,
notification, notification,
hold_to_lock, hold_to_lock,
usb_connected: true,
loader: Loader::new().with_durations(LOADER_DURATION, LOADER_DURATION / 3), loader: Loader::new().with_durations(LOADER_DURATION, LOADER_DURATION / 3),
pad: Pad::with_background(theme::BG), pad: Pad::with_background(theme::BG),
delay: None, delay: None,
@ -61,7 +61,7 @@ where
} }
fn paint_notification(&self) { fn paint_notification(&self) {
if !self.usb_connected { if !usb_configured() {
let (color, icon) = Self::level_to_style(0); let (color, icon) = Self::level_to_style(0);
NotificationFrame::<Empty, T>::paint_notification( NotificationFrame::<Empty, T>::paint_notification(
AREA, AREA,
@ -91,12 +91,13 @@ where
self.loader.paint() self.loader.paint()
} }
pub fn set_paint_notification(&mut self) {
self.paint_notification_only = true;
}
fn event_usb(&mut self, ctx: &mut EventCtx, event: Event) { fn event_usb(&mut self, ctx: &mut EventCtx, event: Event) {
if let Event::USB(USBEvent::Connected(is_connected)) = event { if let Event::USB(USBEvent::Connected(_)) = event {
if self.usb_connected != is_connected { ctx.request_paint();
self.usb_connected = is_connected;
ctx.request_paint();
}
} }
} }
@ -122,6 +123,7 @@ where
Event::Timer(token) if Some(token) == self.delay => { Event::Timer(token) if Some(token) == self.delay => {
self.delay = None; self.delay = None;
self.pad.clear(); self.pad.clear();
self.paint_notification_only = false;
self.loader.start_growing(ctx, Instant::now()); self.loader.start_growing(ctx, Instant::now());
} }
_ => {} _ => {}

View File

@ -9,6 +9,7 @@
#include "rgb_led.h" #include "rgb_led.h"
#include "secbool.h" #include "secbool.h"
#include "storage.h" #include "storage.h"
#include "usb.h"
#include "bip39.h" #include "bip39.h"
#include "rand.h" #include "rand.h"

View File

@ -17,33 +17,16 @@ class HomescreenBase(RustLayout):
def __init__(self, layout: Any) -> None: def __init__(self, layout: Any) -> None:
super().__init__(layout=layout) super().__init__(layout=layout)
self.is_connected = True
async def __iter__(self) -> Any: def _paint(self) -> None:
# We need to catch the ui.Cancelled exception that kills us, because that means self.layout.paint()
# that we will need to draw on screen again after restart.
try:
return await super().__iter__()
except ui.Cancelled:
storage_cache.homescreen_shown = None
raise
def _first_paint(self) -> None: def _first_paint(self) -> None:
from trezor import utils
if storage_cache.homescreen_shown is not self.RENDER_INDICATOR: if storage_cache.homescreen_shown is not self.RENDER_INDICATOR:
super()._first_paint() super()._first_paint()
storage_cache.homescreen_shown = self.RENDER_INDICATOR storage_cache.homescreen_shown = self.RENDER_INDICATOR
else:
# - RENDER_INDICATOR is set -> USB warning is not displayed
# - RENDER_INDICATOR is not set -> initially homescreen does not display warning
# - usb_checker_task only handles state changes
# Here we need to handle the case when homescreen is started with USB disconnected.
if not utils.usb_data_connected():
msg = self.layout.usb_event(False)
self._paint() self._paint()
if msg is not None:
raise ui.Result(msg)
# In __debug__ mode, ignore {confirm,swipe,input}_signal. # In __debug__ mode, ignore {confirm,swipe,input}_signal.
def create_tasks(self) -> tuple[loop.AwaitableTask, ...]: def create_tasks(self) -> tuple[loop.AwaitableTask, ...]:
@ -85,11 +68,8 @@ class Homescreen(HomescreenBase):
usbcheck = loop.wait(io.USB_CHECK) usbcheck = loop.wait(io.USB_CHECK)
while True: while True:
is_connected = await usbcheck is_connected = await usbcheck
if is_connected != self.is_connected: self.layout.usb_event(is_connected)
self.is_connected = is_connected self.layout.paint()
self.layout.usb_event(is_connected)
self.layout.paint()
storage_cache.homescreen_shown = None
def create_tasks(self) -> Tuple[loop.AwaitableTask, ...]: def create_tasks(self) -> Tuple[loop.AwaitableTask, ...]:
return super().create_tasks() + (self.usb_checker_task(),) return super().create_tasks() + (self.usb_checker_task(),)