mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-27 08:38:07 +00:00
core/debug: reading layouts, inserting synthetic events
This commit is contained in:
parent
8c3d93619e
commit
3664a5f06f
@ -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()
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
@ -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)]
|
||||||
|
@ -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()
|
||||||
|
@ -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), [])
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user