diff --git a/src/apps/homescreen/layout_homescreen.py b/src/apps/homescreen/layout_homescreen.py index 98d2274e..0959c456 100644 --- a/src/apps/homescreen/layout_homescreen.py +++ b/src/apps/homescreen/layout_homescreen.py @@ -29,7 +29,7 @@ def layout_homescreen(initialize_msg=None): features.device_id = 'DEADBEEF' features.coins = [] features.imported = False - features.initialized = True + features.initialized = False features.label = 'My TREZOR' features.major_version = 2 features.minor_version = 0 @@ -39,7 +39,7 @@ def layout_homescreen(initialize_msg=None): features.passphrase_cached = False features.passphrase_protection = False features.vendor = 'bitcointrezor.com' - wire.write_msg(features) + wire.write(features) yield loop.Wait([dispatcher.dispatch(), swipe_to_rotate(), animate_logo()]) diff --git a/src/apps/management/__init__.py b/src/apps/management/__init__.py new file mode 100644 index 00000000..29479f35 --- /dev/null +++ b/src/apps/management/__init__.py @@ -0,0 +1,17 @@ +from trezor.dispatcher import register +from trezor.utils import unimport_func + + +@unimport_func +def dispatch_LoadDevice(mtype, mbuf): + from trezor.messages.LoadDevice import LoadDevice + + message = LoadDevice.loads(mbuf) + + from .layout_load_device import layout_load_device + return layout_load_device(message) + + +def boot(): + LoadDevice = 13 + register(LoadDevice, dispatch_LoadDevice) diff --git a/src/apps/management/layout_load_device.py b/src/apps/management/layout_load_device.py new file mode 100644 index 00000000..e61afca3 --- /dev/null +++ b/src/apps/management/layout_load_device.py @@ -0,0 +1,37 @@ +from trezor import wire +from trezor import ui +from trezor.utils import unimport_gen + + +@unimport_gen +def confirm(): + from trezor.ui.confirm import ConfirmDialog, CONFIRMED + from trezor.messages.ButtonRequest import ButtonRequest + from trezor.messages.ButtonRequestType import Other + from trezor.messages.ButtonAck import ButtonAck + + dialog = ConfirmDialog() + dialog.render() + + ack = yield from wire.call(ButtonRequest(code=Other), ButtonAck) + res = yield from dialog.wait() + + return res == CONFIRMED + + +@unimport_gen +def layout_load_device(message): + + ui.clear() + ui.display.text_center(120, 40, 'Really load device?', ui.BOLD, ui.WHITE, ui.BLACK) + ui.display.text_center(120, 100, 'Never do this, please.', ui.NORMAL, ui.WHITE, ui.BLACK) + + confirmed = yield from confirm() + + if confirmed: + from trezor.messages.Success import Success + wire.write(Success(message='Loaded')) + else: + from trezor.messages.Failure import Failure + from trezor.messages.FailureType import ActionCancelled + wire.write(Failure(message='Cancelled', code=ActionCancelled)) diff --git a/src/apps/playground/__init__.py b/src/apps/playground/__init__.py index 12ac00c8..01eabff1 100644 --- a/src/apps/playground/__init__.py +++ b/src/apps/playground/__init__.py @@ -2,11 +2,11 @@ from trezor import loop from trezor import ui from trezor import msg from trezor.ui.pin import PinDialog, PIN_CONFIRMED, PIN_CANCELLED -from trezor.utils import unimport_func +from trezor.utils import unimport_gen from trezor.res import loadres -@unimport_func +@unimport_gen def layout_tap_to_confirm(address, amount, currency): # ui.display.bar(0, 0, 240, 40, ui.GREEN) diff --git a/src/apps/wallet/layout_get_public_key.py b/src/apps/wallet/layout_get_public_key.py index 1a3fb5a3..aeb62e14 100644 --- a/src/apps/wallet/layout_get_public_key.py +++ b/src/apps/wallet/layout_get_public_key.py @@ -1,7 +1,6 @@ from trezor import wire from trezor import ui from trezor.ui.button import Button, CONFIRM_BUTTON, CONFIRM_BUTTON_ACTIVE -from trezor.ui.pin import PinDialog from trezor.utils import unimport_gen diff --git a/src/main.py b/src/main.py index 64b8cbb3..b9a416f2 100644 --- a/src/main.py +++ b/src/main.py @@ -4,15 +4,17 @@ from trezor import msg # Load all applications from apps import playground from apps import homescreen +from apps import management from apps import wallet # Initialize all applications playground.boot() homescreen.boot() +management.boot() wallet.boot() # just a demo to show how to register USB ifaces -msg.setup( [ (1, 0xF53C), (2, 0xF1D0) ] ) +msg.setup([(1, 0xF53C), (2, 0xF1D0)]) # Load default homescreen from apps.homescreen.layout_homescreen import layout_homescreen diff --git a/src/trezor/ui/__init__.py b/src/trezor/ui/__init__.py index 79f6a609..ba86b359 100644 --- a/src/trezor/ui/__init__.py +++ b/src/trezor/ui/__init__.py @@ -39,6 +39,10 @@ NORMAL = const(1) BOLD = const(2) +def clear(color=BLACK): + display.bar(0, 0, 240, 240, color) + + def in_area(pos: tuple, area: tuple) -> bool: x, y = pos ax, ay, aw, ah = area diff --git a/src/trezor/ui/confirm.py b/src/trezor/ui/confirm.py new file mode 100644 index 00000000..1cf5a529 --- /dev/null +++ b/src/trezor/ui/confirm.py @@ -0,0 +1,42 @@ +from .button import Button, BTN_CLICKED +from .button import CONFIRM_BUTTON, CONFIRM_BUTTON_ACTIVE +from .button import CANCEL_BUTTON, CANCEL_BUTTON_ACTIVE +from trezor import loop + + +CONFIRMED = const(1) +CANCELLED = const(2) + + +class ConfirmDialog(): + + def __init__(self, content=None, confirm='Confirm', cancel='Cancel'): + self.content = content + self.confirm = Button((0, 240 - 60, 120, 60), confirm, + normal_style=CONFIRM_BUTTON, + active_style=CONFIRM_BUTTON_ACTIVE) + self.cancel = Button((120, 240 - 60, 120, 60), cancel, + normal_style=CANCEL_BUTTON, + active_style=CANCEL_BUTTON_ACTIVE) + + def render(self): + if self.content is not None: + self.content.render() + self.confirm.render() + self.cancel.render() + + def send(self, event, pos): + if self.confirm.send(event, pos) == BTN_CLICKED: + return CONFIRMED + if self.cancel.send(event, pos) == BTN_CLICKED: + return CANCELLED + if self.content is not None: + return self.content.send(event, pos) + + def wait(self): + while True: + self.render() + event, *pos = yield loop.Select(loop.TOUCH) + result = self.send(event, pos) + if result is not None: + return result diff --git a/src/trezor/wire.py b/src/trezor/wire.py index 539e98d9..97229c16 100644 --- a/src/trezor/wire.py +++ b/src/trezor/wire.py @@ -69,7 +69,7 @@ def write_wire_msg(mtype, mbuf): data = rep[1:] -def read_msg(*types): +def read(*types): mtype, mbuf = yield from read_wire_msg() for t in types: if t.wire_type == mtype: @@ -78,13 +78,13 @@ def read_msg(*types): raise Exception('Unexpected message') -def write_msg(m): +def write(m): mbuf = m.dumps() mtype = m.message_type.wire_type write_wire_msg(mtype, mbuf) def call(req, *types): - write_msg(req) - res = yield from read_msg(*types) + write(req) + res = yield from read(*types) return res