core/debug: add "show arbitrary screen" capability, for easier prototyping
@ -57,6 +57,33 @@ message DebugLinkRecordScreen {
|
|||||||
optional string target_directory = 1; // empty or missing to stop recording
|
optional string target_directory = 1; // empty or missing to stop recording
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request: Show text on the screen
|
||||||
|
* @start
|
||||||
|
* @next Success
|
||||||
|
*/
|
||||||
|
message DebugLinkShowText {
|
||||||
|
optional string header_text = 1; // screen header text
|
||||||
|
repeated DebugLinkShowTextItem body_text = 2; // body text segments
|
||||||
|
optional string header_icon = 3; // icon name in ui.style
|
||||||
|
optional string icon_color = 4; // color name in ui.style
|
||||||
|
|
||||||
|
message DebugLinkShowTextItem {
|
||||||
|
optional DebugLinkShowTextStyle style = 1;
|
||||||
|
optional string content = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum DebugLinkShowTextStyle {
|
||||||
|
NORMAL = 0;
|
||||||
|
BOLD = 1;
|
||||||
|
MONO = 2;
|
||||||
|
MONO_BOLD = 3;
|
||||||
|
BR = 4;
|
||||||
|
BR_HALF = 5;
|
||||||
|
SET_COLOR = 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request: Computer asks for device state
|
* Request: Computer asks for device state
|
||||||
* @start
|
* @start
|
||||||
|
@ -109,6 +109,7 @@ enum MessageType {
|
|||||||
MessageType_DebugLinkLayout = 9001 [(wire_debug_out) = true];
|
MessageType_DebugLinkLayout = 9001 [(wire_debug_out) = true];
|
||||||
MessageType_DebugLinkReseedRandom = 9002 [(wire_debug_in) = true];
|
MessageType_DebugLinkReseedRandom = 9002 [(wire_debug_in) = true];
|
||||||
MessageType_DebugLinkRecordScreen = 9003 [(wire_debug_in) = true];
|
MessageType_DebugLinkRecordScreen = 9003 [(wire_debug_in) = true];
|
||||||
|
MessageType_DebugLinkShowText = 9004 [(wire_debug_in) = true];
|
||||||
|
|
||||||
// Ethereum
|
// Ethereum
|
||||||
MessageType_EthereumGetPublicKey = 450 [(wire_in) = true];
|
MessageType_EthereumGetPublicKey = 450 [(wire_in) = true];
|
||||||
|
@ -145,6 +145,7 @@ if __debug__:
|
|||||||
config.wipe()
|
config.wipe()
|
||||||
|
|
||||||
wire.add(MessageType.LoadDevice, __name__, "load_device")
|
wire.add(MessageType.LoadDevice, __name__, "load_device")
|
||||||
|
wire.add(MessageType.DebugLinkShowText, __name__, "show_text")
|
||||||
wire.register(MessageType.DebugLinkDecision, dispatch_DebugLinkDecision)
|
wire.register(MessageType.DebugLinkDecision, dispatch_DebugLinkDecision)
|
||||||
wire.register(MessageType.DebugLinkGetState, dispatch_DebugLinkGetState)
|
wire.register(MessageType.DebugLinkGetState, dispatch_DebugLinkGetState)
|
||||||
wire.register(MessageType.DebugLinkReseedRandom, dispatch_DebugLinkReseedRandom)
|
wire.register(MessageType.DebugLinkReseedRandom, dispatch_DebugLinkReseedRandom)
|
||||||
|
50
core/src/apps/debug/show_text.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import trezor.messages.DebugLinkShowTextStyle as S
|
||||||
|
from trezor import ui, wire
|
||||||
|
from trezor.messages.DebugLinkShowText import DebugLinkShowText
|
||||||
|
from trezor.messages.Success import Success
|
||||||
|
from trezor.ui import style, text
|
||||||
|
from trezor.ui.text import Text
|
||||||
|
|
||||||
|
from apps.common.confirm import confirm
|
||||||
|
|
||||||
|
STYLES = {
|
||||||
|
S.NORMAL: ui.NORMAL,
|
||||||
|
S.BOLD: ui.BOLD,
|
||||||
|
S.MONO: ui.MONO,
|
||||||
|
S.MONO_BOLD: ui.MONO_BOLD,
|
||||||
|
S.BR: text.BR,
|
||||||
|
S.BR_HALF: text.BR_HALF,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def show_text(ctx: wire.Context, msg: DebugLinkShowText) -> Success:
|
||||||
|
if msg.header_icon is not None:
|
||||||
|
icon_name = "ICON_" + msg.header_icon
|
||||||
|
icon = getattr(style, icon_name)
|
||||||
|
if not isinstance(icon, str):
|
||||||
|
raise wire.DataError("Invalid icon name: {}".format(msg.header_icon))
|
||||||
|
else:
|
||||||
|
icon = style.ICON_DEFAULT
|
||||||
|
|
||||||
|
if msg.icon_color is not None:
|
||||||
|
color = getattr(style, msg.icon_color)
|
||||||
|
if not isinstance(color, int):
|
||||||
|
raise wire.DataError("Invalid color name: {}".format(msg.icon_color))
|
||||||
|
else:
|
||||||
|
color = style.ORANGE_ICON
|
||||||
|
|
||||||
|
dlg = Text(msg.header_text, icon, color, new_lines=False)
|
||||||
|
for item in msg.body_text:
|
||||||
|
if item.style in STYLES:
|
||||||
|
dlg.content.append(STYLES[item.style])
|
||||||
|
elif item.style == S.SET_COLOR:
|
||||||
|
color = getattr(style, item.content)
|
||||||
|
if not isinstance(color, int):
|
||||||
|
raise wire.DataError("Invalid color name: {}".format(item.content))
|
||||||
|
dlg.content.append(color)
|
||||||
|
|
||||||
|
elif item.content is not None:
|
||||||
|
dlg.content.append(item.content)
|
||||||
|
|
||||||
|
await confirm(ctx, dlg)
|
||||||
|
return Success("text shown")
|
37
core/src/trezor/messages/DebugLinkShowText.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Automatically generated by pb2py
|
||||||
|
# fmt: off
|
||||||
|
import protobuf as p
|
||||||
|
|
||||||
|
from .DebugLinkShowTextItem import DebugLinkShowTextItem
|
||||||
|
|
||||||
|
if __debug__:
|
||||||
|
try:
|
||||||
|
from typing import Dict, List # noqa: F401
|
||||||
|
from typing_extensions import Literal # noqa: F401
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DebugLinkShowText(p.MessageType):
|
||||||
|
MESSAGE_WIRE_TYPE = 9004
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
header_text: str = None,
|
||||||
|
body_text: List[DebugLinkShowTextItem] = None,
|
||||||
|
header_icon: str = None,
|
||||||
|
icon_color: str = None,
|
||||||
|
) -> None:
|
||||||
|
self.header_text = header_text
|
||||||
|
self.body_text = body_text if body_text is not None else []
|
||||||
|
self.header_icon = header_icon
|
||||||
|
self.icon_color = icon_color
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_fields(cls) -> Dict:
|
||||||
|
return {
|
||||||
|
1: ('header_text', p.UnicodeType, 0),
|
||||||
|
2: ('body_text', DebugLinkShowTextItem, p.FLAG_REPEATED),
|
||||||
|
3: ('header_icon', p.UnicodeType, 0),
|
||||||
|
4: ('icon_color', p.UnicodeType, 0),
|
||||||
|
}
|
29
core/src/trezor/messages/DebugLinkShowTextItem.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# Automatically generated by pb2py
|
||||||
|
# fmt: off
|
||||||
|
import protobuf as p
|
||||||
|
|
||||||
|
if __debug__:
|
||||||
|
try:
|
||||||
|
from typing import Dict, List # noqa: F401
|
||||||
|
from typing_extensions import Literal # noqa: F401
|
||||||
|
EnumTypeDebugLinkShowTextStyle = Literal[0, 1, 2, 3, 4, 5, 6]
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DebugLinkShowTextItem(p.MessageType):
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
style: EnumTypeDebugLinkShowTextStyle = None,
|
||||||
|
content: str = None,
|
||||||
|
) -> None:
|
||||||
|
self.style = style
|
||||||
|
self.content = content
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_fields(cls) -> Dict:
|
||||||
|
return {
|
||||||
|
1: ('style', p.EnumType("DebugLinkShowTextStyle", (0, 1, 2, 3, 4, 5, 6)), 0),
|
||||||
|
2: ('content', p.UnicodeType, 0),
|
||||||
|
}
|
12
core/src/trezor/messages/DebugLinkShowTextStyle.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Automatically generated by pb2py
|
||||||
|
# fmt: off
|
||||||
|
if False:
|
||||||
|
from typing_extensions import Literal
|
||||||
|
|
||||||
|
NORMAL = 0 # type: Literal[0]
|
||||||
|
BOLD = 1 # type: Literal[1]
|
||||||
|
MONO = 2 # type: Literal[2]
|
||||||
|
MONO_BOLD = 3 # type: Literal[3]
|
||||||
|
BR = 4 # type: Literal[4]
|
||||||
|
BR_HALF = 5 # type: Literal[5]
|
||||||
|
SET_COLOR = 6 # type: Literal[6]
|
@ -76,6 +76,7 @@ DebugLinkFlashErase = 113 # type: Literal[113]
|
|||||||
DebugLinkLayout = 9001 # type: Literal[9001]
|
DebugLinkLayout = 9001 # type: Literal[9001]
|
||||||
DebugLinkReseedRandom = 9002 # type: Literal[9002]
|
DebugLinkReseedRandom = 9002 # type: Literal[9002]
|
||||||
DebugLinkRecordScreen = 9003 # type: Literal[9003]
|
DebugLinkRecordScreen = 9003 # type: Literal[9003]
|
||||||
|
DebugLinkShowText = 9004 # type: Literal[9004]
|
||||||
if not utils.BITCOIN_ONLY:
|
if not utils.BITCOIN_ONLY:
|
||||||
EthereumGetPublicKey = 450 # type: Literal[450]
|
EthereumGetPublicKey = 450 # type: Literal[450]
|
||||||
EthereumPublicKey = 451 # type: Literal[451]
|
EthereumPublicKey = 451 # type: Literal[451]
|
||||||
|
BIN
docs/python/show-text-01.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
docs/python/show-text-02.png
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
docs/python/show-text-03.png
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
docs/python/show-text-04.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
BIN
docs/python/show-text-05.png
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
docs/python/show-text-06.png
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
docs/python/show-text-07.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
138
docs/python/show-text.md
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
# Displaying text screens on Trezor T
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
For this feature, you will need a debug-enabled firmware for Trezor T. Usually that
|
||||||
|
will be the emulator.
|
||||||
|
|
||||||
|
You will also need `trezorctl` 0.12 or later. Best bet is to run the version from github
|
||||||
|
master.
|
||||||
|
|
||||||
|
## Trezor T text capabilities
|
||||||
|
|
||||||
|
The Trezor T screen has a _header_, with an icon and text. Below it is _body_, which
|
||||||
|
can fit up to 5 lines of text.
|
||||||
|
|
||||||
|
Text can be in one of several colors, and in one of four styles: NORMAL, BOLD, MONO
|
||||||
|
and MONO_BOLD.
|
||||||
|
|
||||||
|
It is possible to have multiple styles on the same line, but different styles must be
|
||||||
|
separated by a space.
|
||||||
|
|
||||||
|
I.e., this works fine:
|
||||||
|
|
||||||
|
> This word is **bold** and this is `monospaced`.
|
||||||
|
|
||||||
|
This will not work:
|
||||||
|
|
||||||
|
> Em**bold**ened middle, mono`space`d middle.
|
||||||
|
|
||||||
|
A line that is too long to fit on screen will automatically break, using a hyphen (`-`)
|
||||||
|
character. This is usually undesirable. Instead, a manual line-break should be inserted
|
||||||
|
in the appropriate place.
|
||||||
|
|
||||||
|
## Command line syntax
|
||||||
|
|
||||||
|
The most basic way to put words on screen is this:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
trezorctl debug show-text "My hovercraft is full of eels, call the porter, there is a frog in my bidet."
|
||||||
|
```
|
||||||
|
|
||||||
|
The above command will show:
|
||||||
|
|
||||||
|
![Screenshot01](show-text-01.png)
|
||||||
|
|
||||||
|
Notice the "quotes" around the text. The whole body text must be enquoted.
|
||||||
|
|
||||||
|
To use quotes inside the text, prefix them with backslashes `\`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
trezorctl debug show-text "My \"hovercraft\" is full of eels."
|
||||||
|
```
|
||||||
|
|
||||||
|
![Screenshot02](show-text-02.png)
|
||||||
|
|
||||||
|
### Line breaks
|
||||||
|
|
||||||
|
Let's insert some line breaks. Do that by placing `@@BR` in the appropriate place
|
||||||
|
in the text:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
trezorctl debug show-text "My hovercraft is full of @@BR eels, call the porter, @@BR there is a frog in my @@BR bidet."
|
||||||
|
```
|
||||||
|
|
||||||
|
![Screenshot03](show-text-03.png)
|
||||||
|
|
||||||
|
Better!
|
||||||
|
|
||||||
|
### Text styles
|
||||||
|
|
||||||
|
Now let's add some style. Use `@@BOLD` to start printing in bold. Use `@@NORMAL`
|
||||||
|
to go back to normal text. `@@MONO` and `@@MONO_BOLD` works similarly.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
trezorctl debug show-text "My hovercraft is @@BOLD full of @@BR eels. @@NORMAL Call the porter, @@BR there is a @@MONO frog @@NORMAL in my @@BR bidet."
|
||||||
|
```
|
||||||
|
|
||||||
|
![Screenshot04](show-text-04.png)
|
||||||
|
|
||||||
|
### Line spacing
|
||||||
|
|
||||||
|
Adding another `@@BR` after a `@@BR` will leave one line empty -- just like pressing
|
||||||
|
\<Enter\> twice.
|
||||||
|
|
||||||
|
If you don't want a full empty line, you can make a half-break with `@@BR_HALF`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
trezorctl debug show-text "Line one. @@BR @@BR Line two. @@BR @@BR_HALF Line three."
|
||||||
|
```
|
||||||
|
|
||||||
|
![Screenshot05](show-text-05.png)
|
||||||
|
|
||||||
|
|
||||||
|
### Text colors
|
||||||
|
|
||||||
|
To switch to one of the [available colors](../../core/src/trezor/ui/style.py#L14-L47),
|
||||||
|
use the color name prefixed with `%%`: e.g., `%%RED`, `%%LIGHT_BLUE`...
|
||||||
|
|
||||||
|
To switch back to the default color, you can use `%%FG`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
trezorctl debug show-text "My %%RED hovercraft is @@BOLD full %%GREEN of @@BR eels. @@NORMAL Call %%ORANGE the %%FG porter."
|
||||||
|
```
|
||||||
|
|
||||||
|
![Screenshot06](show-text-06.png)
|
||||||
|
|
||||||
|
### Headers
|
||||||
|
|
||||||
|
The default header says "Showing text" with an orange gear icon. It is possible to
|
||||||
|
change all of that.
|
||||||
|
|
||||||
|
To change the text, use `-h` option:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
trezorctl debug show-text -h "Hello world" "My hovercraft is full."
|
||||||
|
```
|
||||||
|
|
||||||
|
To change the icon, you can pick [an icon name from here](../../core/src/trezor/ui/style.py#L50-L70) and specify it with the `-i` option:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
trezorctl debug show-text -i RECEIVE "My hovercraft is full."
|
||||||
|
```
|
||||||
|
|
||||||
|
The icons are defined as shapes, and you can specify a custom color [from the list](../../core/src/trezor/ui/style.py#L14-L47) with the `-c` option:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
trezorctl debug show-text -c RED "My hovercraft is full."
|
||||||
|
```
|
||||||
|
|
||||||
|
### Putting it all together
|
||||||
|
|
||||||
|
Here is how to reproduce the confirmation screen after the wallet is created:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
trezorctl debug show-text -h "Success" -i CONFIRM -c GREEN "@@BOLD New wallet created @@BR successfully! @@BR @@BR_HALF @@NORMAL You should back up your @@BR new wallet right now."
|
||||||
|
```
|
||||||
|
|
||||||
|
![Screenshot07](show-text-07.png)
|
@ -2,7 +2,8 @@ ifneq ($(V),1)
|
|||||||
Q := @
|
Q := @
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SKIPPED_MESSAGES := Binance Cardano DebugMonero Eos Monero Ontology Ripple SdProtect Tezos WebAuthn DebugLinkRecordScreen DebugLinkReseedRandom
|
SKIPPED_MESSAGES := Binance Cardano DebugMonero Eos Monero Ontology Ripple SdProtect Tezos WebAuthn \
|
||||||
|
DebugLinkRecordScreen DebugLinkReseedRandom DebugLinkShowText
|
||||||
|
|
||||||
ifeq ($(BITCOIN_ONLY), 1)
|
ifeq ($(BITCOIN_ONLY), 1)
|
||||||
SKIPPED_MESSAGES += Ethereum Lisk NEM Stellar
|
SKIPPED_MESSAGES += Ethereum Lisk NEM Stellar
|
||||||
|
@ -17,4 +17,3 @@ DebugLinkMemoryWrite.memory max_size:1024
|
|||||||
# unused fields
|
# unused fields
|
||||||
DebugLinkState.layout_lines max_count:10 max_size:30
|
DebugLinkState.layout_lines max_count:10 max_size:30
|
||||||
DebugLinkLayout.lines max_count:10 max_size:30
|
DebugLinkLayout.lines max_count:10 max_size:30
|
||||||
DebugLinkRecordScreen.target_directory max_size:16
|
|
||||||
|
73
python/src/trezorlib/cli/debug.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# This file is part of the Trezor project.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012-2019 SatoshiLabs and contributors
|
||||||
|
#
|
||||||
|
# This library is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License version 3
|
||||||
|
# as published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the License along with this library.
|
||||||
|
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
|
||||||
|
|
||||||
|
import click
|
||||||
|
|
||||||
|
from .. import debuglink
|
||||||
|
from ..messages import DebugLinkShowTextStyle as S
|
||||||
|
|
||||||
|
|
||||||
|
@click.group(name="debug")
|
||||||
|
def cli():
|
||||||
|
"""Miscellaneous debug features."""
|
||||||
|
|
||||||
|
|
||||||
|
STYLES = {
|
||||||
|
"@@NORMAL": S.NORMAL,
|
||||||
|
"@@BOLD": S.BOLD,
|
||||||
|
"@@MONO": S.MONO,
|
||||||
|
"@@MONO_BOLD": S.MONO_BOLD,
|
||||||
|
"@@BR": S.BR,
|
||||||
|
"@@BR_HALF": S.BR_HALF,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command()
|
||||||
|
@click.option("-i", "--icon", help="Header icon name")
|
||||||
|
@click.option("-c", "--color", help="Header icon color")
|
||||||
|
@click.option("-h", "--header", help="Header text", default="Showing text")
|
||||||
|
@click.argument("body")
|
||||||
|
@click.pass_obj
|
||||||
|
def show_text(connect, icon, color, header, body):
|
||||||
|
"""Show text on Trezor display.
|
||||||
|
|
||||||
|
For usage instructions, see:
|
||||||
|
https://github.com/trezor/trezor-firmware/blob/master/docs/python/show-text.md
|
||||||
|
"""
|
||||||
|
body = body.split()
|
||||||
|
body_text = []
|
||||||
|
words = []
|
||||||
|
|
||||||
|
def _flush():
|
||||||
|
if words:
|
||||||
|
body_text.append((None, " ".join(words)))
|
||||||
|
words.clear()
|
||||||
|
|
||||||
|
for word in body:
|
||||||
|
if word in STYLES:
|
||||||
|
_flush()
|
||||||
|
body_text.append((STYLES[word], None))
|
||||||
|
elif word.startswith("%%"):
|
||||||
|
_flush()
|
||||||
|
body_text.append((S.SET_COLOR, word[2:]))
|
||||||
|
else:
|
||||||
|
words.append(word)
|
||||||
|
|
||||||
|
_flush()
|
||||||
|
|
||||||
|
return debuglink.show_text(
|
||||||
|
connect(), header, body_text, icon=icon, icon_color=color
|
||||||
|
)
|
@ -33,6 +33,7 @@ from . import (
|
|||||||
cardano,
|
cardano,
|
||||||
cosi,
|
cosi,
|
||||||
crypto,
|
crypto,
|
||||||
|
debug,
|
||||||
device,
|
device,
|
||||||
eos,
|
eos,
|
||||||
ethereum,
|
ethereum,
|
||||||
@ -59,6 +60,7 @@ COMMAND_ALIASES = {
|
|||||||
"sd-protect": device.sd_protect,
|
"sd-protect": device.sd_protect,
|
||||||
"load-device": device.load,
|
"load-device": device.load,
|
||||||
"self-test": device.self_test,
|
"self-test": device.self_test,
|
||||||
|
"show-text": debug.show_text,
|
||||||
"get-entropy": crypto.get_entropy,
|
"get-entropy": crypto.get_entropy,
|
||||||
"encrypt-keyvalue": crypto.encrypt_keyvalue,
|
"encrypt-keyvalue": crypto.encrypt_keyvalue,
|
||||||
"decrypt-keyvalue": crypto.decrypt_keyvalue,
|
"decrypt-keyvalue": crypto.decrypt_keyvalue,
|
||||||
@ -296,7 +298,7 @@ cli.add_command(stellar.cli)
|
|||||||
cli.add_command(tezos.cli)
|
cli.add_command(tezos.cli)
|
||||||
|
|
||||||
cli.add_command(firmware.firmware_update)
|
cli.add_command(firmware.firmware_update)
|
||||||
|
cli.add_command(debug.cli)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Main
|
# Main
|
||||||
|
@ -510,3 +510,18 @@ def self_test(client):
|
|||||||
payload=b"\x00\xFF\x55\xAA\x66\x99\x33\xCCABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\x00\xFF\x55\xAA\x66\x99\x33\xCC"
|
payload=b"\x00\xFF\x55\xAA\x66\x99\x33\xCCABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\x00\xFF\x55\xAA\x66\x99\x33\xCC"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@expect(proto.Success, field="message")
|
||||||
|
def show_text(client, header_text, body_text, icon=None, icon_color=None):
|
||||||
|
body_text = [
|
||||||
|
proto.DebugLinkShowTextItem(style=style, content=content)
|
||||||
|
for style, content in body_text
|
||||||
|
]
|
||||||
|
msg = proto.DebugLinkShowText(
|
||||||
|
header_text=header_text,
|
||||||
|
body_text=body_text,
|
||||||
|
header_icon=icon,
|
||||||
|
icon_color=icon_color,
|
||||||
|
)
|
||||||
|
return client.call(msg)
|
||||||
|
37
python/src/trezorlib/messages/DebugLinkShowText.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Automatically generated by pb2py
|
||||||
|
# fmt: off
|
||||||
|
from .. import protobuf as p
|
||||||
|
|
||||||
|
from .DebugLinkShowTextItem import DebugLinkShowTextItem
|
||||||
|
|
||||||
|
if __debug__:
|
||||||
|
try:
|
||||||
|
from typing import Dict, List # noqa: F401
|
||||||
|
from typing_extensions import Literal # noqa: F401
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DebugLinkShowText(p.MessageType):
|
||||||
|
MESSAGE_WIRE_TYPE = 9004
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
header_text: str = None,
|
||||||
|
body_text: List[DebugLinkShowTextItem] = None,
|
||||||
|
header_icon: str = None,
|
||||||
|
icon_color: str = None,
|
||||||
|
) -> None:
|
||||||
|
self.header_text = header_text
|
||||||
|
self.body_text = body_text if body_text is not None else []
|
||||||
|
self.header_icon = header_icon
|
||||||
|
self.icon_color = icon_color
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_fields(cls) -> Dict:
|
||||||
|
return {
|
||||||
|
1: ('header_text', p.UnicodeType, 0),
|
||||||
|
2: ('body_text', DebugLinkShowTextItem, p.FLAG_REPEATED),
|
||||||
|
3: ('header_icon', p.UnicodeType, 0),
|
||||||
|
4: ('icon_color', p.UnicodeType, 0),
|
||||||
|
}
|
29
python/src/trezorlib/messages/DebugLinkShowTextItem.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# Automatically generated by pb2py
|
||||||
|
# fmt: off
|
||||||
|
from .. import protobuf as p
|
||||||
|
|
||||||
|
if __debug__:
|
||||||
|
try:
|
||||||
|
from typing import Dict, List # noqa: F401
|
||||||
|
from typing_extensions import Literal # noqa: F401
|
||||||
|
EnumTypeDebugLinkShowTextStyle = Literal[0, 1, 2, 3, 4, 5, 6]
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DebugLinkShowTextItem(p.MessageType):
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
style: EnumTypeDebugLinkShowTextStyle = None,
|
||||||
|
content: str = None,
|
||||||
|
) -> None:
|
||||||
|
self.style = style
|
||||||
|
self.content = content
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_fields(cls) -> Dict:
|
||||||
|
return {
|
||||||
|
1: ('style', p.EnumType("DebugLinkShowTextStyle", (0, 1, 2, 3, 4, 5, 6)), 0),
|
||||||
|
2: ('content', p.UnicodeType, 0),
|
||||||
|
}
|
12
python/src/trezorlib/messages/DebugLinkShowTextStyle.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Automatically generated by pb2py
|
||||||
|
# fmt: off
|
||||||
|
if False:
|
||||||
|
from typing_extensions import Literal
|
||||||
|
|
||||||
|
NORMAL = 0 # type: Literal[0]
|
||||||
|
BOLD = 1 # type: Literal[1]
|
||||||
|
MONO = 2 # type: Literal[2]
|
||||||
|
MONO_BOLD = 3 # type: Literal[3]
|
||||||
|
BR = 4 # type: Literal[4]
|
||||||
|
BR_HALF = 5 # type: Literal[5]
|
||||||
|
SET_COLOR = 6 # type: Literal[6]
|
@ -74,6 +74,7 @@ DebugLinkFlashErase = 113 # type: Literal[113]
|
|||||||
DebugLinkLayout = 9001 # type: Literal[9001]
|
DebugLinkLayout = 9001 # type: Literal[9001]
|
||||||
DebugLinkReseedRandom = 9002 # type: Literal[9002]
|
DebugLinkReseedRandom = 9002 # type: Literal[9002]
|
||||||
DebugLinkRecordScreen = 9003 # type: Literal[9003]
|
DebugLinkRecordScreen = 9003 # type: Literal[9003]
|
||||||
|
DebugLinkShowText = 9004 # type: Literal[9004]
|
||||||
EthereumGetPublicKey = 450 # type: Literal[450]
|
EthereumGetPublicKey = 450 # type: Literal[450]
|
||||||
EthereumPublicKey = 451 # type: Literal[451]
|
EthereumPublicKey = 451 # type: Literal[451]
|
||||||
EthereumGetAddress = 56 # type: Literal[56]
|
EthereumGetAddress = 56 # type: Literal[56]
|
||||||
|
@ -49,6 +49,8 @@ from .DebugLinkMemoryRead import DebugLinkMemoryRead
|
|||||||
from .DebugLinkMemoryWrite import DebugLinkMemoryWrite
|
from .DebugLinkMemoryWrite import DebugLinkMemoryWrite
|
||||||
from .DebugLinkRecordScreen import DebugLinkRecordScreen
|
from .DebugLinkRecordScreen import DebugLinkRecordScreen
|
||||||
from .DebugLinkReseedRandom import DebugLinkReseedRandom
|
from .DebugLinkReseedRandom import DebugLinkReseedRandom
|
||||||
|
from .DebugLinkShowText import DebugLinkShowText
|
||||||
|
from .DebugLinkShowTextItem import DebugLinkShowTextItem
|
||||||
from .DebugLinkState import DebugLinkState
|
from .DebugLinkState import DebugLinkState
|
||||||
from .DebugLinkStop import DebugLinkStop
|
from .DebugLinkStop import DebugLinkStop
|
||||||
from .DebugMoneroDiagAck import DebugMoneroDiagAck
|
from .DebugMoneroDiagAck import DebugMoneroDiagAck
|
||||||
@ -270,6 +272,7 @@ from . import BinanceOrderType
|
|||||||
from . import BinanceTimeInForce
|
from . import BinanceTimeInForce
|
||||||
from . import ButtonRequestType
|
from . import ButtonRequestType
|
||||||
from . import Capability
|
from . import Capability
|
||||||
|
from . import DebugLinkShowTextStyle
|
||||||
from . import DebugSwipeDirection
|
from . import DebugSwipeDirection
|
||||||
from . import FailureType
|
from . import FailureType
|
||||||
from . import InputScriptType
|
from . import InputScriptType
|
||||||
|