1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-26 16:18:22 +00:00

core/debug: reading layouts, inserting synthetic events

This commit is contained in:
matejcik 2019-09-27 15:36:44 +02:00
parent 8c3d93619e
commit 3664a5f06f
9 changed files with 106 additions and 9 deletions

View File

@ -4,12 +4,13 @@ if not __debug__:
halt("debug mode inactive") halt("debug mode inactive")
if __debug__: if __debug__:
from trezor import config, log, loop, utils from trezor import config, io, log, loop, ui, utils
from trezor.messages import MessageType, DebugSwipeDirection from trezor.messages import MessageType, DebugSwipeDirection
from trezor.messages.DebugLinkLayout import DebugLinkLayout
from trezor.wire import register from trezor.wire import register
if False: if False:
from typing import Optional from typing import List, Optional
from trezor import wire from trezor import wire
from trezor.messages.DebugLinkDecision import DebugLinkDecision from trezor.messages.DebugLinkDecision import DebugLinkDecision
from trezor.messages.DebugLinkGetState import DebugLinkGetState from trezor.messages.DebugLinkGetState import DebugLinkGetState
@ -28,6 +29,15 @@ if __debug__:
debuglink_decision_chan = loop.chan() debuglink_decision_chan = loop.chan()
layout_change_chan = loop.chan()
current_content = [] # type: List[str]
def notify_layout_change(layout: ui.Layout) -> None:
global current_content
current_content = layout.read_content()
if layout_change_chan.takers:
layout_change_chan.publish(current_content)
async def debuglink_decision_dispatcher() -> None: async def debuglink_decision_dispatcher() -> None:
from trezor.ui import confirm, swipe from trezor.ui import confirm, swipe
@ -53,12 +63,21 @@ if __debug__:
async def dispatch_DebugLinkDecision( async def dispatch_DebugLinkDecision(
ctx: wire.Context, msg: DebugLinkDecision ctx: wire.Context, msg: DebugLinkDecision
) -> None: ) -> Optional[DebugLinkLayout]:
if debuglink_decision_chan.putters: if debuglink_decision_chan.putters:
log.warning(__name__, "DebugLinkDecision queue is not empty") log.warning(__name__, "DebugLinkDecision queue is not empty")
debuglink_decision_chan.publish(msg) if msg.x is not None:
evt_down = io.TOUCH_START, msg.x, msg.y
evt_up = io.TOUCH_END, msg.x, msg.y
loop.synthetic_events.append((io.TOUCH, evt_down))
loop.synthetic_events.append((io.TOUCH, evt_up))
else:
debuglink_decision_chan.publish(msg)
if msg.wait:
content = await layout_change_chan.take()
return DebugLinkLayout(lines=content)
async def dispatch_DebugLinkGetState( async def dispatch_DebugLinkGetState(
ctx: wire.Context, msg: DebugLinkGetState ctx: wire.Context, msg: DebugLinkGetState
@ -72,6 +91,7 @@ if __debug__:
m.mnemonic_type = mnemonic.get_type() m.mnemonic_type = mnemonic.get_type()
m.passphrase_protection = has_passphrase() m.passphrase_protection = has_passphrase()
m.reset_entropy = reset_internal_entropy m.reset_entropy = reset_internal_entropy
m.layout_lines = current_content
if msg.wait_word_pos: if msg.wait_word_pos:
m.reset_word_pos = await reset_word_index.take() m.reset_word_pos = await reset_word_index.take()

View File

@ -310,6 +310,11 @@ class RecoveryHomescreen(ui.Component):
self.repaint = False self.repaint = False
if __debug__:
def read_content(self):
return [self.__class__.__name__, self.text, self.subtext or ""]
async def homescreen_dialog( async def homescreen_dialog(
ctx: wire.GenericContext, ctx: wire.GenericContext,

View File

@ -643,6 +643,11 @@ class MnemonicWordSelect(ui.Layout):
return fn return fn
if __debug__:
def read_content(self):
return self.text.read_content() + [b.text for b in self.buttons]
async def show_reset_device_warning(ctx, backup_type: BackupType = BackupType.Bip39): async def show_reset_device_warning(ctx, backup_type: BackupType = BackupType.Bip39):
text = Text("Create new wallet", ui.ICON_RESET, new_lines=False) text = Text("Create new wallet", ui.ICON_RESET, new_lines=False)

View File

@ -5,6 +5,9 @@ from trezorui import Display
from trezor import io, loop, res, utils from trezor import io, loop, res, utils
if __debug__:
from apps.debug import notify_layout_change
if False: if False:
from typing import Any, Awaitable, Generator, Tuple, TypeVar from typing import Any, Awaitable, Generator, Tuple, TypeVar
@ -226,6 +229,11 @@ class Component:
def on_touch_end(self, x: int, y: int) -> None: def on_touch_end(self, x: int, y: int) -> None:
pass pass
if __debug__:
def read_content(self) -> List[str]:
return [self.__class__.__name__]
class Result(Exception): class Result(Exception):
""" """
@ -279,6 +287,8 @@ class Layout(Component):
# layout channel. This allows other layouts to cancel us, and the # layout channel. This allows other layouts to cancel us, and the
# layout tasks to trigger restart by exiting (new tasks are created # layout tasks to trigger restart by exiting (new tasks are created
# and we continue, because we are in a loop). # and we continue, because we are in a loop).
if __debug__:
notify_layout_change(self)
while True: while True:
await loop.race(layout_chan.take(), *self.create_tasks()) await loop.race(layout_chan.take(), *self.create_tasks())
except Result as result: except Result as result:

View File

@ -4,7 +4,7 @@ from trezor import ui
from trezor.ui import display, in_area from trezor.ui import display, in_area
if False: if False:
from typing import Type, Union, Optional from typing import List, Type, Union
class ButtonDefault: class ButtonDefault:
@ -239,3 +239,8 @@ class Button(ui.Component):
def on_click(self) -> None: def on_click(self) -> None:
pass pass
if __debug__:
def read_content(self) -> List[str]:
return ["<Button: {}>".format(self.text)]

View File

@ -8,7 +8,7 @@ if __debug__:
from apps.debug import swipe_signal from apps.debug import swipe_signal
if False: if False:
from typing import Any, Optional, Tuple from typing import Any, Optional, List, Tuple
from trezor.ui.button import ButtonContent, ButtonStyleType from trezor.ui.button import ButtonContent, ButtonStyleType
from trezor.ui.loader import LoaderStyleType from trezor.ui.loader import LoaderStyleType
@ -74,6 +74,11 @@ class Confirm(ui.Layout):
def on_cancel(self) -> None: def on_cancel(self) -> None:
raise ui.Result(CANCELLED) raise ui.Result(CANCELLED)
if __debug__:
def read_content(self) -> List[str]:
return self.content.read_content()
class Pageable: class Pageable:
def __init__(self) -> None: def __init__(self) -> None:
@ -201,6 +206,11 @@ class InfoConfirm(ui.Layout):
def on_info(self) -> None: def on_info(self) -> None:
raise ui.Result(INFO) raise ui.Result(INFO)
if __debug__:
def read_content(self) -> List[str]:
return self.content.read_content()
class HoldToConfirm(ui.Layout): class HoldToConfirm(ui.Layout):
DEFAULT_CONFIRM = "Hold To Confirm" DEFAULT_CONFIRM = "Hold To Confirm"
@ -250,3 +260,8 @@ class HoldToConfirm(ui.Layout):
def on_confirm(self) -> None: def on_confirm(self) -> None:
raise ui.Result(CONFIRMED) raise ui.Result(CONFIRMED)
if __debug__:
def read_content(self) -> List[str]:
return self.content.read_content()

View File

@ -1,5 +1,8 @@
from trezor import ui from trezor import ui
if False:
from typing import List
class Container(ui.Component): class Container(ui.Component):
def __init__(self, *children: ui.Component): def __init__(self, *children: ui.Component):
@ -8,3 +11,8 @@ class Container(ui.Component):
def dispatch(self, event: int, x: int, y: int) -> None: def dispatch(self, event: int, x: int, y: int) -> None:
for child in self.children: for child in self.children:
child.dispatch(event, x, y) child.dispatch(event, x, y)
if __debug__:
def read_content(self) -> List[str]:
return sum((c.read_content() for c in self.children), [])

View File

@ -6,10 +6,10 @@ from trezor.ui.confirm import CANCELLED, CONFIRMED
from trezor.ui.swipe import SWIPE_DOWN, SWIPE_UP, SWIPE_VERTICAL, Swipe from trezor.ui.swipe import SWIPE_DOWN, SWIPE_UP, SWIPE_VERTICAL, Swipe
if __debug__: if __debug__:
from apps.debug import swipe_signal from apps.debug import swipe_signal, notify_layout_change
if False: if False:
from typing import Tuple, List from typing import List, Tuple
def render_scrollbar(pages: int, page: int) -> None: def render_scrollbar(pages: int, page: int) -> None:
@ -89,6 +89,9 @@ class Paginated(ui.Layout):
self.pages[self.page].dispatch(ui.REPAINT, 0, 0) self.pages[self.page].dispatch(ui.REPAINT, 0, 0)
self.repaint = True self.repaint = True
if __debug__:
notify_layout_change(self)
self.on_change() self.on_change()
def create_tasks(self) -> Tuple[loop.Task, ...]: def create_tasks(self) -> Tuple[loop.Task, ...]:
@ -98,6 +101,11 @@ class Paginated(ui.Layout):
if self.one_by_one: if self.one_by_one:
raise ui.Result(self.page) raise ui.Result(self.page)
if __debug__:
def read_content(self) -> List[str]:
return self.pages[self.page].read_content()
class PageWithButtons(ui.Component): class PageWithButtons(ui.Component):
def __init__( def __init__(
@ -154,6 +162,11 @@ class PageWithButtons(ui.Component):
else: else:
self.paginated.on_down() self.paginated.on_down()
if __debug__:
def read_content(self) -> List[str]:
return self.content.read_content()
class PaginatedWithButtons(ui.Layout): class PaginatedWithButtons(ui.Layout):
def __init__( def __init__(
@ -191,3 +204,8 @@ class PaginatedWithButtons(ui.Layout):
def on_change(self) -> None: def on_change(self) -> None:
if self.one_by_one: if self.one_by_one:
raise ui.Result(self.page) raise ui.Result(self.page)
if __debug__:
def read_content(self) -> List[str]:
return self.pages[self.page].read_content()

View File

@ -171,6 +171,12 @@ class Text(ui.Component):
render_text(self.content, self.new_lines, self.max_lines) render_text(self.content, self.new_lines, self.max_lines)
self.repaint = False self.repaint = False
if __debug__:
def read_content(self) -> List[str]:
lines = [w for w in self.content if isinstance(w, str)]
return [self.header_text] + lines[: self.max_lines]
LABEL_LEFT = const(0) LABEL_LEFT = const(0)
LABEL_CENTER = const(1) LABEL_CENTER = const(1)
@ -209,6 +215,11 @@ class Label(ui.Component):
) )
self.repaint = False self.repaint = False
if __debug__:
def read_content(self) -> List[str]:
return [self.content]
def text_center_trim_left( def text_center_trim_left(
x: int, y: int, text: str, font: int = ui.NORMAL, width: int = ui.WIDTH - 16 x: int, y: int, text: str, font: int = ui.NORMAL, width: int = ui.WIDTH - 16