mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 15:38:11 +00:00
parent
c2b7b8032a
commit
c462918e3e
@ -31,6 +31,7 @@ _UNFINISHED_BACKUP = const(0x0B) # bool (0x01 or empty)
|
|||||||
_AUTOLOCK_DELAY_MS = const(0x0C) # int
|
_AUTOLOCK_DELAY_MS = const(0x0C) # int
|
||||||
_NO_BACKUP = const(0x0D) # bool (0x01 or empty)
|
_NO_BACKUP = const(0x0D) # bool (0x01 or empty)
|
||||||
_MNEMONIC_TYPE = const(0x0E) # int
|
_MNEMONIC_TYPE = const(0x0E) # int
|
||||||
|
_ROTATION = const(0x0F) # int
|
||||||
# fmt: on
|
# fmt: on
|
||||||
|
|
||||||
|
|
||||||
@ -68,6 +69,13 @@ def get_device_id() -> str:
|
|||||||
return dev_id.decode()
|
return dev_id.decode()
|
||||||
|
|
||||||
|
|
||||||
|
def get_rotation() -> int:
|
||||||
|
rotation = config.get(_APP, _ROTATION, True) # public
|
||||||
|
if not rotation:
|
||||||
|
return 0
|
||||||
|
return int.from_bytes(rotation, "big")
|
||||||
|
|
||||||
|
|
||||||
def is_initialized() -> bool:
|
def is_initialized() -> bool:
|
||||||
return bool(config.get(_APP, _VERSION))
|
return bool(config.get(_APP, _VERSION))
|
||||||
|
|
||||||
@ -144,6 +152,7 @@ def load_settings(
|
|||||||
use_passphrase: bool = None,
|
use_passphrase: bool = None,
|
||||||
homescreen: bytes = None,
|
homescreen: bytes = None,
|
||||||
passphrase_source: int = None,
|
passphrase_source: int = None,
|
||||||
|
display_rotation: int = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
if label is not None:
|
if label is not None:
|
||||||
config.set(_APP, _LABEL, label.encode(), True) # public
|
config.set(_APP, _LABEL, label.encode(), True) # public
|
||||||
@ -156,8 +165,17 @@ def load_settings(
|
|||||||
else:
|
else:
|
||||||
config.set(_APP, _HOMESCREEN, b"", True) # public
|
config.set(_APP, _HOMESCREEN, b"", True) # public
|
||||||
if passphrase_source is not None:
|
if passphrase_source is not None:
|
||||||
if passphrase_source in [0, 1, 2]:
|
if passphrase_source in (0, 1, 2):
|
||||||
config.set(_APP, _PASSPHRASE_SOURCE, bytes([passphrase_source]))
|
config.set(_APP, _PASSPHRASE_SOURCE, bytes([passphrase_source]))
|
||||||
|
if display_rotation is not None:
|
||||||
|
if display_rotation not in (0, 90, 180, 270):
|
||||||
|
raise ValueError(
|
||||||
|
"Unsupported display rotation degrees: %d" % display_rotation
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
config.set(
|
||||||
|
_APP, _ROTATION, display_rotation.to_bytes(2, "big"), True
|
||||||
|
) # public
|
||||||
|
|
||||||
|
|
||||||
def get_flags() -> int:
|
def get_flags() -> int:
|
||||||
|
@ -1,15 +1,12 @@
|
|||||||
from trezor import config, res, ui
|
from trezor import config, res, ui
|
||||||
from trezor.ui.swipe import Swipe, degrees
|
|
||||||
|
|
||||||
from apps.common import storage
|
from apps.common import storage
|
||||||
|
|
||||||
|
|
||||||
async def homescreen():
|
async def homescreen():
|
||||||
while True:
|
|
||||||
await ui.backlight_slide(ui.BACKLIGHT_DIM)
|
await ui.backlight_slide(ui.BACKLIGHT_DIM)
|
||||||
display_homescreen()
|
display_homescreen()
|
||||||
await ui.backlight_slide(ui.BACKLIGHT_NORMAL)
|
await ui.backlight_slide(ui.BACKLIGHT_NORMAL)
|
||||||
await swipe_to_rotate()
|
|
||||||
|
|
||||||
|
|
||||||
def display_homescreen():
|
def display_homescreen():
|
||||||
@ -49,8 +46,3 @@ def display_homescreen():
|
|||||||
ui.display.bar(0, 0, ui.WIDTH, ui.HEIGHT, ui.BG)
|
ui.display.bar(0, 0, ui.WIDTH, ui.HEIGHT, ui.BG)
|
||||||
ui.display.avatar(48, 48 - 10, image, ui.WHITE, ui.BLACK)
|
ui.display.avatar(48, 48 - 10, image, ui.WHITE, ui.BLACK)
|
||||||
ui.display.text_center(ui.WIDTH // 2, 220, label, ui.BOLD, ui.FG, ui.BG)
|
ui.display.text_center(ui.WIDTH // 2, 220, label, ui.BOLD, ui.FG, ui.BG)
|
||||||
|
|
||||||
|
|
||||||
async def swipe_to_rotate():
|
|
||||||
swipe = await Swipe(absolute=True)
|
|
||||||
ui.display.orientation(degrees(swipe))
|
|
||||||
|
@ -13,6 +13,7 @@ async def apply_settings(ctx, msg):
|
|||||||
and msg.label is None
|
and msg.label is None
|
||||||
and msg.use_passphrase is None
|
and msg.use_passphrase is None
|
||||||
and msg.passphrase_source is None
|
and msg.passphrase_source is None
|
||||||
|
and msg.display_rotation is None
|
||||||
):
|
):
|
||||||
raise wire.ProcessError("No setting provided")
|
raise wire.ProcessError("No setting provided")
|
||||||
|
|
||||||
@ -30,13 +31,20 @@ async def apply_settings(ctx, msg):
|
|||||||
if msg.passphrase_source is not None:
|
if msg.passphrase_source is not None:
|
||||||
await require_confirm_change_passphrase_source(ctx, msg.passphrase_source)
|
await require_confirm_change_passphrase_source(ctx, msg.passphrase_source)
|
||||||
|
|
||||||
|
if msg.display_rotation is not None:
|
||||||
|
await require_confirm_change_display_rotation(ctx, msg.display_rotation)
|
||||||
|
|
||||||
storage.load_settings(
|
storage.load_settings(
|
||||||
label=msg.label,
|
label=msg.label,
|
||||||
use_passphrase=msg.use_passphrase,
|
use_passphrase=msg.use_passphrase,
|
||||||
homescreen=msg.homescreen,
|
homescreen=msg.homescreen,
|
||||||
passphrase_source=msg.passphrase_source,
|
passphrase_source=msg.passphrase_source,
|
||||||
|
display_rotation=msg.display_rotation,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if msg.display_rotation is not None:
|
||||||
|
ui.display.orientation(storage.get_rotation())
|
||||||
|
|
||||||
return Success(message="Settings applied")
|
return Success(message="Settings applied")
|
||||||
|
|
||||||
|
|
||||||
@ -72,3 +80,19 @@ async def require_confirm_change_passphrase_source(ctx, source):
|
|||||||
text.normal("Do you really want to", "change the passphrase", "source to")
|
text.normal("Do you really want to", "change the passphrase", "source to")
|
||||||
text.bold("ALWAYS %s?" % desc)
|
text.bold("ALWAYS %s?" % desc)
|
||||||
await require_confirm(ctx, text, code=ButtonRequestType.ProtectCall)
|
await require_confirm(ctx, text, code=ButtonRequestType.ProtectCall)
|
||||||
|
|
||||||
|
|
||||||
|
async def require_confirm_change_display_rotation(ctx, rotation):
|
||||||
|
if rotation == 0:
|
||||||
|
label = "north"
|
||||||
|
elif rotation == 90:
|
||||||
|
label = "east"
|
||||||
|
elif rotation == 180:
|
||||||
|
label = "south"
|
||||||
|
elif rotation == 270:
|
||||||
|
label = "west"
|
||||||
|
text = Text("Change rotation", ui.ICON_CONFIG, new_lines=False)
|
||||||
|
text.normal("Do you really want to", "change display rotation")
|
||||||
|
text.normal("to")
|
||||||
|
text.bold("%s?" % label)
|
||||||
|
await require_confirm(ctx, text, code=ButtonRequestType.ProtectCall)
|
||||||
|
@ -6,6 +6,7 @@ from apps.common.request_pin import request_pin
|
|||||||
|
|
||||||
|
|
||||||
async def bootscreen():
|
async def bootscreen():
|
||||||
|
ui.display.orientation(storage.get_rotation())
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
if not config.has_pin():
|
if not config.has_pin():
|
||||||
|
@ -14,17 +14,6 @@ SWIPE_ALL = const(SWIPE_VERTICAL | SWIPE_HORIZONTAL)
|
|||||||
_SWIPE_DISTANCE = const(120)
|
_SWIPE_DISTANCE = const(120)
|
||||||
|
|
||||||
|
|
||||||
def degrees(swipe: int) -> int:
|
|
||||||
if swipe == SWIPE_UP:
|
|
||||||
return 180
|
|
||||||
elif swipe == SWIPE_DOWN:
|
|
||||||
return 0
|
|
||||||
elif swipe == SWIPE_LEFT:
|
|
||||||
return 90
|
|
||||||
elif swipe == SWIPE_RIGHT:
|
|
||||||
return 270
|
|
||||||
|
|
||||||
|
|
||||||
class Swipe(ui.Widget):
|
class Swipe(ui.Widget):
|
||||||
def __init__(self, area=None, absolute=False, directions=SWIPE_ALL, treshold=30):
|
def __init__(self, area=None, absolute=False, directions=SWIPE_ALL, treshold=30):
|
||||||
self.area = area or (0, 0, ui.WIDTH, ui.HEIGHT)
|
self.area = area or (0, 0, ui.WIDTH, ui.HEIGHT)
|
||||||
|
Loading…
Reference in New Issue
Block a user