add management app skeleton and ConfirmDialog

We might rewrite PinDialog as a content for ConfirmDialog in the
future. Also, I'm beginning to hit memory issues on a 64-bit system.
This commit is contained in:
Jan Pochyla 2016-06-01 15:06:00 +02:00 committed by Pavol Rusnak
parent 9c34491e20
commit 6a647b124d
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D
9 changed files with 111 additions and 10 deletions

View File

@ -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()])

View File

@ -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)

View File

@ -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))

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

42
src/trezor/ui/confirm.py Normal file
View File

@ -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

View File

@ -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