1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-21 22:08:08 +00:00

feat(core): add settings to turn haptic on/off

[no changelog]
This commit is contained in:
tychovrahe 2024-05-07 15:46:15 +02:00 committed by TychoVrahe
parent 2e10d440fa
commit b9a55cf2a7
21 changed files with 359 additions and 122 deletions

View File

@ -116,6 +116,7 @@ message Features {
Capability_Solana = 18; Capability_Solana = 18;
Capability_Translations = 19 [(bitcoin_only) = true]; Capability_Translations = 19 [(bitcoin_only) = true];
Capability_Brightness = 20 [(bitcoin_only) = true]; Capability_Brightness = 20 [(bitcoin_only) = true];
Capability_Haptic = 21 [(bitcoin_only) = true];
} }
optional BackupType backup_type = 31; // type of device backup (BIP-39 / SLIP-39 basic / SLIP-39 advanced) optional BackupType backup_type = 31; // type of device backup (BIP-39 / SLIP-39 basic / SLIP-39 advanced)
optional bool sd_card_present = 32; // is SD card present optional bool sd_card_present = 32; // is SD card present
@ -138,6 +139,7 @@ message Features {
optional bool bootloader_locked = 49; // bootloader is locked optional bool bootloader_locked = 49; // bootloader is locked
optional bool language_version_matches = 50 [default=true]; // translation blob version matches firmware version optional bool language_version_matches = 50 [default=true]; // translation blob version matches firmware version
optional uint32 unit_packaging = 51; // unit/device packaging version optional uint32 unit_packaging = 51; // unit/device packaging version
optional bool haptic_feedback = 52; // haptic feedback is enabled
} }
/** /**
@ -185,6 +187,7 @@ message ApplySettings {
optional SafetyCheckLevel safety_checks = 9; // Safety check level, set to Prompt to limit path namespace enforcement optional SafetyCheckLevel safety_checks = 9; // Safety check level, set to Prompt to limit path namespace enforcement
optional bool experimental_features = 10; // enable experimental message types optional bool experimental_features = 10; // enable experimental message types
optional bool hide_passphrase_from_host = 11; // do not show passphrase coming from host optional bool hide_passphrase_from_host = 11; // do not show passphrase coming from host
optional bool haptic_feedback = 13; // enable haptic feedback
} }
/** /**

View File

@ -0,0 +1,47 @@
/*
* This file is part of the Trezor project, https://trezor.io/
*
* Copyright (c) SatoshiLabs
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "haptic.h"
/// package: trezorio.haptic
/// def haptic_set_enabled(enable: bool) -> None:
/// """
/// Enable/Disable the haptic feedback.
/// """
STATIC mp_obj_t mod_trezorio_haptic_set_enabled(mp_obj_t enable) {
haptic_set_enabled(mp_obj_is_true(enable));
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_trezorio_haptic_set_enabled_obj,
mod_trezorio_haptic_set_enabled);
STATIC const mp_rom_map_elem_t mod_trezorio_haptic_globals_table[] = {
{MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_haptic)},
{MP_ROM_QSTR(MP_QSTR_haptic_set_enabled),
MP_ROM_PTR(&mod_trezorio_haptic_set_enabled_obj)},
};
STATIC MP_DEFINE_CONST_DICT(mod_trezorio_haptic_globals,
mod_trezorio_haptic_globals_table);
STATIC const mp_obj_module_t mod_trezorio_haptic_module = {
.base = {&mp_type_module},
.globals = (mp_obj_dict_t *)&mod_trezorio_haptic_globals,
};

View File

@ -55,9 +55,12 @@ bool usb_connected_previously = true;
#include "modtrezorio-fatfs.h" #include "modtrezorio-fatfs.h"
#include "modtrezorio-sdcard.h" #include "modtrezorio-sdcard.h"
#endif #endif
#ifdef USE_HAPTIC
#include "modtrezorio-haptic.h"
#endif
/// package: trezorio.__init__ /// package: trezorio.__init__
/// from . import fatfs, sdcard /// from . import fatfs, haptic, sdcard
/// POLL_READ: int # wait until interface is readable and return read data /// POLL_READ: int # wait until interface is readable and return read data
/// POLL_WRITE: int # wait until interface is writable /// POLL_WRITE: int # wait until interface is writable
@ -89,6 +92,10 @@ STATIC const mp_rom_map_elem_t mp_module_trezorio_globals_table[] = {
{MP_ROM_QSTR(MP_QSTR_sdcard), MP_ROM_PTR(&mod_trezorio_sdcard_module)}, {MP_ROM_QSTR(MP_QSTR_sdcard), MP_ROM_PTR(&mod_trezorio_sdcard_module)},
#endif #endif
#ifdef USE_HAPTIC
{MP_ROM_QSTR(MP_QSTR_haptic), MP_ROM_PTR(&mod_trezorio_haptic_module)},
#endif
#ifdef USE_TOUCH #ifdef USE_TOUCH
{MP_ROM_QSTR(MP_QSTR_TOUCH), MP_ROM_INT(TOUCH_IFACE)}, {MP_ROM_QSTR(MP_QSTR_TOUCH), MP_ROM_INT(TOUCH_IFACE)},
{MP_ROM_QSTR(MP_QSTR_TOUCH_START), MP_ROM_INT((TOUCH_START >> 24) & 0xFFU)}, {MP_ROM_QSTR(MP_QSTR_TOUCH_START), MP_ROM_INT((TOUCH_START >> 24) & 0xFFU)},

View File

@ -416,6 +416,8 @@ STATIC mp_obj_tuple_t mod_trezorutils_version_obj = {
/// """Whether the hardware supports SD card.""" /// """Whether the hardware supports SD card."""
/// USE_BACKLIGHT: bool /// USE_BACKLIGHT: bool
/// """Whether the hardware supports backlight brightness control.""" /// """Whether the hardware supports backlight brightness control."""
/// USE_HAPTIC: bool
/// """Whether the hardware supports haptic feedback."""
/// USE_OPTIGA: bool /// USE_OPTIGA: bool
/// """Whether the hardware supports Optiga secure element.""" /// """Whether the hardware supports Optiga secure element."""
/// MODEL: str /// MODEL: str
@ -474,6 +476,11 @@ STATIC const mp_rom_map_elem_t mp_module_trezorutils_globals_table[] = {
#else #else
{MP_ROM_QSTR(MP_QSTR_USE_BACKLIGHT), mp_const_false}, {MP_ROM_QSTR(MP_QSTR_USE_BACKLIGHT), mp_const_false},
#endif #endif
#ifdef USE_HAPTIC
{MP_ROM_QSTR(MP_QSTR_USE_HAPTIC), mp_const_true},
#else
{MP_ROM_QSTR(MP_QSTR_USE_HAPTIC), mp_const_false},
#endif
#ifdef USE_OPTIGA #ifdef USE_OPTIGA
{MP_ROM_QSTR(MP_QSTR_USE_OPTIGA), mp_const_true}, {MP_ROM_QSTR(MP_QSTR_USE_OPTIGA), mp_const_true},
#else #else

View File

@ -30,4 +30,6 @@ void haptic_play(haptic_effect_t effect);
// the creation of customized haptic effects. // the creation of customized haptic effects.
bool haptic_play_custom(int8_t amplitude_pct, uint16_t duration_ms); bool haptic_play_custom(int8_t amplitude_pct, uint16_t duration_ms);
void haptic_set_enabled(bool enable);
#endif #endif

View File

@ -81,6 +81,8 @@
#define MAX_AMPLITUDE 127 #define MAX_AMPLITUDE 127
#define PRODTEST_EFFECT_AMPLITUDE 127 #define PRODTEST_EFFECT_AMPLITUDE 127
bool haptic_enabled = true;
static bool set_reg(uint8_t addr, uint8_t value) { static bool set_reg(uint8_t addr, uint8_t value) {
uint8_t data[] = {addr, value}; uint8_t data[] = {addr, value};
return i2c_transmit(DRV2625_I2C_INSTANCE, DRV2625_I2C_ADDRESS, data, return i2c_transmit(DRV2625_I2C_INSTANCE, DRV2625_I2C_ADDRESS, data,
@ -184,6 +186,10 @@ static void haptic_play_lib(drv2625_lib_effect_t effect) {
} }
void haptic_play(haptic_effect_t effect) { void haptic_play(haptic_effect_t effect) {
if (!haptic_enabled) {
return;
}
switch (effect) { switch (effect) {
case HAPTIC_BUTTON_PRESS: case HAPTIC_BUTTON_PRESS:
haptic_play_rtp(PRESS_EFFECT_AMPLITUDE, PRESS_EFFECT_DURATION); haptic_play_rtp(PRESS_EFFECT_AMPLITUDE, PRESS_EFFECT_DURATION);
@ -213,3 +219,5 @@ bool haptic_play_custom(int8_t amplitude_pct, uint16_t duration_ms) {
bool haptic_test(uint16_t duration_ms) { bool haptic_test(uint16_t duration_ms) {
return haptic_play_rtp(PRODTEST_EFFECT_AMPLITUDE, duration_ms); return haptic_play_rtp(PRODTEST_EFFECT_AMPLITUDE, duration_ms);
} }
void haptic_set_enabled(bool enable) { haptic_enabled = enable; }

View File

@ -193,7 +193,7 @@ class WebUSB:
""" """
Sends message using USB WebUSB (device) or UDP (emulator). Sends message using USB WebUSB (device) or UDP (emulator).
""" """
from . import fatfs, sdcard from . import fatfs, haptic, sdcard
POLL_READ: int # wait until interface is readable and return read data POLL_READ: int # wait until interface is readable and return read data
POLL_WRITE: int # wait until interface is writable POLL_WRITE: int # wait until interface is writable

View File

@ -0,0 +1,8 @@
from typing import *
# extmod/modtrezorio/modtrezorio-haptic.h
def haptic_set_enabled(enable: bool) -> None:
"""
Enable/Disable the haptic feedback.
"""

View File

@ -126,6 +126,8 @@ USE_SD_CARD: bool
"""Whether the hardware supports SD card.""" """Whether the hardware supports SD card."""
USE_BACKLIGHT: bool USE_BACKLIGHT: bool
"""Whether the hardware supports backlight brightness control.""" """Whether the hardware supports backlight brightness control."""
USE_HAPTIC: bool
"""Whether the hardware supports haptic feedback."""
USE_OPTIGA: bool USE_OPTIGA: bool
"""Whether the hardware supports Optiga secure element.""" """Whether the hardware supports Optiga secure element."""
MODEL: str MODEL: str

View File

@ -135,6 +135,10 @@ def get_features() -> Features:
] ]
) )
if utils.USE_HAPTIC:
f.haptic_feedback = storage_device.get_haptic_feedback()
f.capabilities.append(Capability.Haptic)
if utils.USE_BACKLIGHT: if utils.USE_BACKLIGHT:
f.capabilities.append(Capability.Brightness) f.capabilities.append(Capability.Brightness)

View File

@ -2,7 +2,7 @@ from typing import TYPE_CHECKING
import storage.device as storage_device import storage.device as storage_device
import trezorui2 import trezorui2
from trezor import TR from trezor import TR, utils
from trezor.enums import ButtonRequestType from trezor.enums import ButtonRequestType
from trezor.ui.layouts import confirm_action from trezor.ui.layouts import confirm_action
from trezor.wire import DataError from trezor.wire import DataError
@ -50,6 +50,7 @@ async def apply_settings(msg: ApplySettings) -> Success:
msg_safety_checks = msg.safety_checks # local_cache_attribute msg_safety_checks = msg.safety_checks # local_cache_attribute
experimental_features = msg.experimental_features # local_cache_attribute experimental_features = msg.experimental_features # local_cache_attribute
hide_passphrase_from_host = msg.hide_passphrase_from_host # local_cache_attribute hide_passphrase_from_host = msg.hide_passphrase_from_host # local_cache_attribute
haptic_feedback = msg.haptic_feedback
if ( if (
homescreen is None homescreen is None
@ -61,6 +62,7 @@ async def apply_settings(msg: ApplySettings) -> Success:
and msg_safety_checks is None and msg_safety_checks is None
and experimental_features is None and experimental_features is None
and hide_passphrase_from_host is None and hide_passphrase_from_host is None
and (haptic_feedback is None or not utils.USE_HAPTIC)
): ):
raise ProcessError("No setting provided") raise ProcessError("No setting provided")
@ -114,6 +116,13 @@ async def apply_settings(msg: ApplySettings) -> Success:
await _require_confirm_hide_passphrase_from_host(hide_passphrase_from_host) await _require_confirm_hide_passphrase_from_host(hide_passphrase_from_host)
storage_device.set_hide_passphrase_from_host(hide_passphrase_from_host) storage_device.set_hide_passphrase_from_host(hide_passphrase_from_host)
if haptic_feedback is not None and utils.USE_HAPTIC:
from trezor import io
await _require_confirm_haptic_feedback(haptic_feedback)
io.haptic.haptic_set_enabled(haptic_feedback)
storage_device.set_haptic_feedback(haptic_feedback)
reload_settings_from_storage() reload_settings_from_storage()
return Success(message="Settings applied") return Success(message="Settings applied")
@ -255,3 +264,15 @@ async def _require_confirm_hide_passphrase_from_host(enable: bool) -> None:
description=TR.passphrase__hide, description=TR.passphrase__hide,
br_code=BRT_PROTECT_CALL, br_code=BRT_PROTECT_CALL,
) )
if utils.USE_HAPTIC:
async def _require_confirm_haptic_feedback(enable: bool) -> None:
await confirm_action(
"haptic_feedback__settings",
TR.haptic_feedback__title,
TR.haptic_feedback__enable if enable else TR.haptic_feedback__disable,
subtitle=TR.haptic_feedback__subtitle,
br_code=BRT_PROTECT_CALL,
)

View File

@ -10,7 +10,7 @@ welcome_screen_start_ms = utime.ticks_ms()
import storage import storage
import storage.device import storage.device
from trezor import config, log, loop, ui, utils, wire, translations from trezor import config, io, log, loop, ui, utils, wire, translations
from trezor.pin import ( from trezor.pin import (
allow_all_loader_messages, allow_all_loader_messages,
ignore_nonpin_loader_messages, ignore_nonpin_loader_messages,
@ -51,6 +51,9 @@ async def bootscreen() -> None:
enforce_welcome_screen_duration() enforce_welcome_screen_duration()
ui.backlight_fade(ui.BacklightLevels.NONE) ui.backlight_fade(ui.BacklightLevels.NONE)
ui.display.orientation(storage.device.get_rotation()) ui.display.orientation(storage.device.get_rotation())
if utils.USE_HAPTIC:
io.haptic.haptic_set_enabled(storage.device.get_haptic_feedback())
await lockscreen await lockscreen
await verify_user_pin() await verify_user_pin()
storage.init_unlocked() storage.init_unlocked()
@ -61,6 +64,9 @@ async def bootscreen() -> None:
storage.init_unlocked() storage.init_unlocked()
enforce_welcome_screen_duration() enforce_welcome_screen_duration()
rotation = storage.device.get_rotation() rotation = storage.device.get_rotation()
if utils.USE_HAPTIC:
io.haptic.haptic_set_enabled(storage.device.get_haptic_feedback())
if rotation != ui.display.orientation(): if rotation != ui.display.orientation():
# there is a slight delay before next screen is shown, # there is a slight delay before next screen is shown,
# so we don't fade unless there is a change of orientation # so we don't fade unless there is a change of orientation

View File

@ -36,12 +36,13 @@ INITIALIZED = const(0x13) # bool (0x01 or empty)
_SAFETY_CHECK_LEVEL = const(0x14) # int _SAFETY_CHECK_LEVEL = const(0x14) # int
_EXPERIMENTAL_FEATURES = const(0x15) # bool (0x01 or empty) _EXPERIMENTAL_FEATURES = const(0x15) # bool (0x01 or empty)
_HIDE_PASSPHRASE_FROM_HOST = const(0x16) # bool (0x01 or empty) _HIDE_PASSPHRASE_FROM_HOST = const(0x16) # bool (0x01 or empty)
# unused from python:
# _BRIGHTNESS = const(0x18) # int
if utils.USE_THP: if utils.USE_THP:
_DEVICE_SECRET = const(0x17) # bytes _DEVICE_SECRET = const(0x17) # bytes
_CRED_AUTH_KEY_COUNTER = const(0x18) # bytes _CRED_AUTH_KEY_COUNTER = const(0x18) # bytes
# unused from python:
# _BRIGHTNESS = const(0x19) # int
_DISABLE_HAPTIC_FEEDBACK = const(0x20) # bool (0x01 or empty)
SAFETY_CHECK_LEVEL_STRICT : Literal[0] = const(0) SAFETY_CHECK_LEVEL_STRICT : Literal[0] = const(0)
SAFETY_CHECK_LEVEL_PROMPT : Literal[1] = const(1) SAFETY_CHECK_LEVEL_PROMPT : Literal[1] = const(1)
@ -377,3 +378,17 @@ if utils.USE_THP:
counter = int.from_bytes(get_cred_auth_key_counter(), "big") counter = int.from_bytes(get_cred_auth_key_counter(), "big")
utils.ensure(counter < 0xFFFFFFFF, "Overflow of cred_auth_key_counter") utils.ensure(counter < 0xFFFFFFFF, "Overflow of cred_auth_key_counter")
common.set(_NAMESPACE, _CRED_AUTH_KEY_COUNTER, (counter + 1).to_bytes(4, "big")) common.set(_NAMESPACE, _CRED_AUTH_KEY_COUNTER, (counter + 1).to_bytes(4, "big"))
def set_haptic_feedback(enable: bool) -> None:
"""
Enable or disable haptic feedback.
"""
common.set_bool(_NAMESPACE, _DISABLE_HAPTIC_FEEDBACK, not enable, True)
def get_haptic_feedback() -> bool:
"""
Get haptic feedback enable, default to true if not set.
"""
return not common.get_bool(_NAMESPACE, _DISABLE_HAPTIC_FEEDBACK, True)

View File

@ -11,6 +11,7 @@ ShamirGroups = 16
PassphraseEntry = 17 PassphraseEntry = 17
Translations = 19 Translations = 19
Brightness = 20 Brightness = 20
Haptic = 21
if not utils.BITCOIN_ONLY: if not utils.BITCOIN_ONLY:
Bitcoin_like = 2 Bitcoin_like = 2
Binance = 3 Binance = 3

View File

@ -461,6 +461,7 @@ if TYPE_CHECKING:
Solana = 18 Solana = 18
Translations = 19 Translations = 19
Brightness = 20 Brightness = 20
Haptic = 21
class SdProtectOperationType(IntEnum): class SdProtectOperationType(IntEnum):
DISABLE = 0 DISABLE = 0

View File

@ -2163,6 +2163,7 @@ if TYPE_CHECKING:
bootloader_locked: "bool | None" bootloader_locked: "bool | None"
language_version_matches: "bool" language_version_matches: "bool"
unit_packaging: "int | None" unit_packaging: "int | None"
haptic_feedback: "bool | None"
def __init__( def __init__(
self, self,
@ -2215,6 +2216,7 @@ if TYPE_CHECKING:
bootloader_locked: "bool | None" = None, bootloader_locked: "bool | None" = None,
language_version_matches: "bool | None" = None, language_version_matches: "bool | None" = None,
unit_packaging: "int | None" = None, unit_packaging: "int | None" = None,
haptic_feedback: "bool | None" = None,
) -> None: ) -> None:
pass pass
@ -2258,6 +2260,7 @@ if TYPE_CHECKING:
safety_checks: "SafetyCheckLevel | None" safety_checks: "SafetyCheckLevel | None"
experimental_features: "bool | None" experimental_features: "bool | None"
hide_passphrase_from_host: "bool | None" hide_passphrase_from_host: "bool | None"
haptic_feedback: "bool | None"
def __init__( def __init__(
self, self,
@ -2271,6 +2274,7 @@ if TYPE_CHECKING:
safety_checks: "SafetyCheckLevel | None" = None, safety_checks: "SafetyCheckLevel | None" = None,
experimental_features: "bool | None" = None, experimental_features: "bool | None" = None,
hide_passphrase_from_host: "bool | None" = None, hide_passphrase_from_host: "bool | None" = None,
haptic_feedback: "bool | None" = None,
) -> None: ) -> None:
pass pass

View File

@ -11,6 +11,7 @@ from trezorutils import ( # noqa: F401
SCM_REVISION, SCM_REVISION,
UI_LAYOUT, UI_LAYOUT,
USE_BACKLIGHT, USE_BACKLIGHT,
USE_HAPTIC,
USE_OPTIGA, USE_OPTIGA,
USE_SD_CARD, USE_SD_CARD,
USE_THP, USE_THP,

View File

@ -213,6 +213,14 @@ def brightness(client: "TrezorClient") -> str:
return device.set_brightness(client) return device.set_brightness(client)
@cli.command()
@click.argument("enable", type=ChoiceType({"on": True, "off": False}))
@with_client
def haptic_feedback(client: "TrezorClient", enable: bool) -> str:
"""Enable or disable haptic feedback."""
return device.apply_settings(client, haptic_feedback=enable)
@cli.command() @cli.command()
@click.argument("path_or_url", required=False) @click.argument("path_or_url", required=False)
@click.option( @click.option(

View File

@ -47,6 +47,7 @@ def apply_settings(
safety_checks: Optional[messages.SafetyCheckLevel] = None, safety_checks: Optional[messages.SafetyCheckLevel] = None,
experimental_features: Optional[bool] = None, experimental_features: Optional[bool] = None,
hide_passphrase_from_host: Optional[bool] = None, hide_passphrase_from_host: Optional[bool] = None,
haptic_feedback: Optional[bool] = None,
) -> "MessageType": ) -> "MessageType":
if language is not None: if language is not None:
warnings.warn( warnings.warn(
@ -63,6 +64,7 @@ def apply_settings(
safety_checks=safety_checks, safety_checks=safety_checks,
experimental_features=experimental_features, experimental_features=experimental_features,
hide_passphrase_from_host=hide_passphrase_from_host, hide_passphrase_from_host=hide_passphrase_from_host,
haptic_feedback=haptic_feedback,
) )
out = client.call(settings) out = client.call(settings)

View File

@ -493,6 +493,7 @@ class Capability(IntEnum):
Solana = 18 Solana = 18
Translations = 19 Translations = 19
Brightness = 20 Brightness = 20
Haptic = 21
class SdProtectOperationType(IntEnum): class SdProtectOperationType(IntEnum):
@ -3263,6 +3264,7 @@ class Features(protobuf.MessageType):
49: protobuf.Field("bootloader_locked", "bool", repeated=False, required=False, default=None), 49: protobuf.Field("bootloader_locked", "bool", repeated=False, required=False, default=None),
50: protobuf.Field("language_version_matches", "bool", repeated=False, required=False, default=True), 50: protobuf.Field("language_version_matches", "bool", repeated=False, required=False, default=True),
51: protobuf.Field("unit_packaging", "uint32", repeated=False, required=False, default=None), 51: protobuf.Field("unit_packaging", "uint32", repeated=False, required=False, default=None),
52: protobuf.Field("haptic_feedback", "bool", repeated=False, required=False, default=None),
} }
def __init__( def __init__(
@ -3317,6 +3319,7 @@ class Features(protobuf.MessageType):
bootloader_locked: Optional["bool"] = None, bootloader_locked: Optional["bool"] = None,
language_version_matches: Optional["bool"] = True, language_version_matches: Optional["bool"] = True,
unit_packaging: Optional["int"] = None, unit_packaging: Optional["int"] = None,
haptic_feedback: Optional["bool"] = None,
) -> None: ) -> None:
self.capabilities: Sequence["Capability"] = capabilities if capabilities is not None else [] self.capabilities: Sequence["Capability"] = capabilities if capabilities is not None else []
self.major_version = major_version self.major_version = major_version
@ -3367,6 +3370,7 @@ class Features(protobuf.MessageType):
self.bootloader_locked = bootloader_locked self.bootloader_locked = bootloader_locked
self.language_version_matches = language_version_matches self.language_version_matches = language_version_matches
self.unit_packaging = unit_packaging self.unit_packaging = unit_packaging
self.haptic_feedback = haptic_feedback
class LockDevice(protobuf.MessageType): class LockDevice(protobuf.MessageType):
@ -3405,6 +3409,7 @@ class ApplySettings(protobuf.MessageType):
9: protobuf.Field("safety_checks", "SafetyCheckLevel", repeated=False, required=False, default=None), 9: protobuf.Field("safety_checks", "SafetyCheckLevel", repeated=False, required=False, default=None),
10: protobuf.Field("experimental_features", "bool", repeated=False, required=False, default=None), 10: protobuf.Field("experimental_features", "bool", repeated=False, required=False, default=None),
11: protobuf.Field("hide_passphrase_from_host", "bool", repeated=False, required=False, default=None), 11: protobuf.Field("hide_passphrase_from_host", "bool", repeated=False, required=False, default=None),
13: protobuf.Field("haptic_feedback", "bool", repeated=False, required=False, default=None),
} }
def __init__( def __init__(
@ -3421,6 +3426,7 @@ class ApplySettings(protobuf.MessageType):
safety_checks: Optional["SafetyCheckLevel"] = None, safety_checks: Optional["SafetyCheckLevel"] = None,
experimental_features: Optional["bool"] = None, experimental_features: Optional["bool"] = None,
hide_passphrase_from_host: Optional["bool"] = None, hide_passphrase_from_host: Optional["bool"] = None,
haptic_feedback: Optional["bool"] = None,
) -> None: ) -> None:
self.language = language self.language = language
self.label = label self.label = label
@ -3433,6 +3439,7 @@ class ApplySettings(protobuf.MessageType):
self.safety_checks = safety_checks self.safety_checks = safety_checks
self.experimental_features = experimental_features self.experimental_features = experimental_features
self.hide_passphrase_from_host = hide_passphrase_from_host self.hide_passphrase_from_host = hide_passphrase_from_host
self.haptic_feedback = haptic_feedback
class ChangeLanguage(protobuf.MessageType): class ChangeLanguage(protobuf.MessageType):

View File

@ -462,6 +462,8 @@ pub struct Features {
pub language_version_matches: ::std::option::Option<bool>, pub language_version_matches: ::std::option::Option<bool>,
// @@protoc_insertion_point(field:hw.trezor.messages.management.Features.unit_packaging) // @@protoc_insertion_point(field:hw.trezor.messages.management.Features.unit_packaging)
pub unit_packaging: ::std::option::Option<u32>, pub unit_packaging: ::std::option::Option<u32>,
// @@protoc_insertion_point(field:hw.trezor.messages.management.Features.haptic_feedback)
pub haptic_feedback: ::std::option::Option<bool>,
// special fields // special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.management.Features.special_fields) // @@protoc_insertion_point(special_field:hw.trezor.messages.management.Features.special_fields)
pub special_fields: ::protobuf::SpecialFields, pub special_fields: ::protobuf::SpecialFields,
@ -1569,8 +1571,27 @@ impl Features {
self.unit_packaging = ::std::option::Option::Some(v); self.unit_packaging = ::std::option::Option::Some(v);
} }
// optional bool haptic_feedback = 52;
pub fn haptic_feedback(&self) -> bool {
self.haptic_feedback.unwrap_or(false)
}
pub fn clear_haptic_feedback(&mut self) {
self.haptic_feedback = ::std::option::Option::None;
}
pub fn has_haptic_feedback(&self) -> bool {
self.haptic_feedback.is_some()
}
// Param is passed by value, moved
pub fn set_haptic_feedback(&mut self, v: bool) {
self.haptic_feedback = ::std::option::Option::Some(v);
}
fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
let mut fields = ::std::vec::Vec::with_capacity(49); let mut fields = ::std::vec::Vec::with_capacity(50);
let mut oneofs = ::std::vec::Vec::with_capacity(0); let mut oneofs = ::std::vec::Vec::with_capacity(0);
fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
"vendor", "vendor",
@ -1817,6 +1838,11 @@ impl Features {
|m: &Features| { &m.unit_packaging }, |m: &Features| { &m.unit_packaging },
|m: &mut Features| { &mut m.unit_packaging }, |m: &mut Features| { &mut m.unit_packaging },
)); ));
fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
"haptic_feedback",
|m: &Features| { &m.haptic_feedback },
|m: &mut Features| { &mut m.haptic_feedback },
));
::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Features>( ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Features>(
"Features", "Features",
fields, fields,
@ -1994,6 +2020,9 @@ impl ::protobuf::Message for Features {
408 => { 408 => {
self.unit_packaging = ::std::option::Option::Some(is.read_uint32()?); self.unit_packaging = ::std::option::Option::Some(is.read_uint32()?);
}, },
416 => {
self.haptic_feedback = ::std::option::Option::Some(is.read_bool()?);
},
tag => { tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
}, },
@ -2153,6 +2182,9 @@ impl ::protobuf::Message for Features {
if let Some(v) = self.unit_packaging { if let Some(v) = self.unit_packaging {
my_size += ::protobuf::rt::uint32_size(51, v); my_size += ::protobuf::rt::uint32_size(51, v);
} }
if let Some(v) = self.haptic_feedback {
my_size += 2 + 1;
}
my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
self.special_fields.cached_size().set(my_size as u32); self.special_fields.cached_size().set(my_size as u32);
my_size my_size
@ -2306,6 +2338,9 @@ impl ::protobuf::Message for Features {
if let Some(v) = self.unit_packaging { if let Some(v) = self.unit_packaging {
os.write_uint32(51, v)?; os.write_uint32(51, v)?;
} }
if let Some(v) = self.haptic_feedback {
os.write_bool(52, v)?;
}
os.write_unknown_fields(self.special_fields.unknown_fields())?; os.write_unknown_fields(self.special_fields.unknown_fields())?;
::std::result::Result::Ok(()) ::std::result::Result::Ok(())
} }
@ -2372,6 +2407,7 @@ impl ::protobuf::Message for Features {
self.bootloader_locked = ::std::option::Option::None; self.bootloader_locked = ::std::option::Option::None;
self.language_version_matches = ::std::option::Option::None; self.language_version_matches = ::std::option::Option::None;
self.unit_packaging = ::std::option::Option::None; self.unit_packaging = ::std::option::Option::None;
self.haptic_feedback = ::std::option::Option::None;
self.special_fields.clear(); self.special_fields.clear();
} }
@ -2426,6 +2462,7 @@ impl ::protobuf::Message for Features {
bootloader_locked: ::std::option::Option::None, bootloader_locked: ::std::option::Option::None,
language_version_matches: ::std::option::Option::None, language_version_matches: ::std::option::Option::None,
unit_packaging: ::std::option::Option::None, unit_packaging: ::std::option::Option::None,
haptic_feedback: ::std::option::Option::None,
special_fields: ::protobuf::SpecialFields::new(), special_fields: ::protobuf::SpecialFields::new(),
}; };
&instance &instance
@ -2494,6 +2531,8 @@ pub mod features {
Capability_Translations = 19, Capability_Translations = 19,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.management.Features.Capability.Capability_Brightness) // @@protoc_insertion_point(enum_value:hw.trezor.messages.management.Features.Capability.Capability_Brightness)
Capability_Brightness = 20, Capability_Brightness = 20,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.management.Features.Capability.Capability_Haptic)
Capability_Haptic = 21,
} }
impl ::protobuf::Enum for Capability { impl ::protobuf::Enum for Capability {
@ -2525,6 +2564,7 @@ pub mod features {
18 => ::std::option::Option::Some(Capability::Capability_Solana), 18 => ::std::option::Option::Some(Capability::Capability_Solana),
19 => ::std::option::Option::Some(Capability::Capability_Translations), 19 => ::std::option::Option::Some(Capability::Capability_Translations),
20 => ::std::option::Option::Some(Capability::Capability_Brightness), 20 => ::std::option::Option::Some(Capability::Capability_Brightness),
21 => ::std::option::Option::Some(Capability::Capability_Haptic),
_ => ::std::option::Option::None _ => ::std::option::Option::None
} }
} }
@ -2551,6 +2591,7 @@ pub mod features {
"Capability_Solana" => ::std::option::Option::Some(Capability::Capability_Solana), "Capability_Solana" => ::std::option::Option::Some(Capability::Capability_Solana),
"Capability_Translations" => ::std::option::Option::Some(Capability::Capability_Translations), "Capability_Translations" => ::std::option::Option::Some(Capability::Capability_Translations),
"Capability_Brightness" => ::std::option::Option::Some(Capability::Capability_Brightness), "Capability_Brightness" => ::std::option::Option::Some(Capability::Capability_Brightness),
"Capability_Haptic" => ::std::option::Option::Some(Capability::Capability_Haptic),
_ => ::std::option::Option::None _ => ::std::option::Option::None
} }
} }
@ -2576,6 +2617,7 @@ pub mod features {
Capability::Capability_Solana, Capability::Capability_Solana,
Capability::Capability_Translations, Capability::Capability_Translations,
Capability::Capability_Brightness, Capability::Capability_Brightness,
Capability::Capability_Haptic,
]; ];
} }
@ -2607,6 +2649,7 @@ pub mod features {
Capability::Capability_Solana => 17, Capability::Capability_Solana => 17,
Capability::Capability_Translations => 18, Capability::Capability_Translations => 18,
Capability::Capability_Brightness => 19, Capability::Capability_Brightness => 19,
Capability::Capability_Haptic => 20,
}; };
Self::enum_descriptor().value_by_index(index) Self::enum_descriptor().value_by_index(index)
} }
@ -2999,6 +3042,8 @@ pub struct ApplySettings {
pub experimental_features: ::std::option::Option<bool>, pub experimental_features: ::std::option::Option<bool>,
// @@protoc_insertion_point(field:hw.trezor.messages.management.ApplySettings.hide_passphrase_from_host) // @@protoc_insertion_point(field:hw.trezor.messages.management.ApplySettings.hide_passphrase_from_host)
pub hide_passphrase_from_host: ::std::option::Option<bool>, pub hide_passphrase_from_host: ::std::option::Option<bool>,
// @@protoc_insertion_point(field:hw.trezor.messages.management.ApplySettings.haptic_feedback)
pub haptic_feedback: ::std::option::Option<bool>,
// special fields // special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.management.ApplySettings.special_fields) // @@protoc_insertion_point(special_field:hw.trezor.messages.management.ApplySettings.special_fields)
pub special_fields: ::protobuf::SpecialFields, pub special_fields: ::protobuf::SpecialFields,
@ -3278,8 +3323,27 @@ impl ApplySettings {
self.hide_passphrase_from_host = ::std::option::Option::Some(v); self.hide_passphrase_from_host = ::std::option::Option::Some(v);
} }
// optional bool haptic_feedback = 13;
pub fn haptic_feedback(&self) -> bool {
self.haptic_feedback.unwrap_or(false)
}
pub fn clear_haptic_feedback(&mut self) {
self.haptic_feedback = ::std::option::Option::None;
}
pub fn has_haptic_feedback(&self) -> bool {
self.haptic_feedback.is_some()
}
// Param is passed by value, moved
pub fn set_haptic_feedback(&mut self, v: bool) {
self.haptic_feedback = ::std::option::Option::Some(v);
}
fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
let mut fields = ::std::vec::Vec::with_capacity(11); let mut fields = ::std::vec::Vec::with_capacity(12);
let mut oneofs = ::std::vec::Vec::with_capacity(0); let mut oneofs = ::std::vec::Vec::with_capacity(0);
fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
"language", "language",
@ -3336,6 +3400,11 @@ impl ApplySettings {
|m: &ApplySettings| { &m.hide_passphrase_from_host }, |m: &ApplySettings| { &m.hide_passphrase_from_host },
|m: &mut ApplySettings| { &mut m.hide_passphrase_from_host }, |m: &mut ApplySettings| { &mut m.hide_passphrase_from_host },
)); ));
fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
"haptic_feedback",
|m: &ApplySettings| { &m.haptic_feedback },
|m: &mut ApplySettings| { &mut m.haptic_feedback },
));
::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ApplySettings>( ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ApplySettings>(
"ApplySettings", "ApplySettings",
fields, fields,
@ -3387,6 +3456,9 @@ impl ::protobuf::Message for ApplySettings {
88 => { 88 => {
self.hide_passphrase_from_host = ::std::option::Option::Some(is.read_bool()?); self.hide_passphrase_from_host = ::std::option::Option::Some(is.read_bool()?);
}, },
104 => {
self.haptic_feedback = ::std::option::Option::Some(is.read_bool()?);
},
tag => { tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
}, },
@ -3432,6 +3504,9 @@ impl ::protobuf::Message for ApplySettings {
if let Some(v) = self.hide_passphrase_from_host { if let Some(v) = self.hide_passphrase_from_host {
my_size += 1 + 1; my_size += 1 + 1;
} }
if let Some(v) = self.haptic_feedback {
my_size += 1 + 1;
}
my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
self.special_fields.cached_size().set(my_size as u32); self.special_fields.cached_size().set(my_size as u32);
my_size my_size
@ -3471,6 +3546,9 @@ impl ::protobuf::Message for ApplySettings {
if let Some(v) = self.hide_passphrase_from_host { if let Some(v) = self.hide_passphrase_from_host {
os.write_bool(11, v)?; os.write_bool(11, v)?;
} }
if let Some(v) = self.haptic_feedback {
os.write_bool(13, v)?;
}
os.write_unknown_fields(self.special_fields.unknown_fields())?; os.write_unknown_fields(self.special_fields.unknown_fields())?;
::std::result::Result::Ok(()) ::std::result::Result::Ok(())
} }
@ -3499,6 +3577,7 @@ impl ::protobuf::Message for ApplySettings {
self.safety_checks = ::std::option::Option::None; self.safety_checks = ::std::option::Option::None;
self.experimental_features = ::std::option::Option::None; self.experimental_features = ::std::option::Option::None;
self.hide_passphrase_from_host = ::std::option::Option::None; self.hide_passphrase_from_host = ::std::option::Option::None;
self.haptic_feedback = ::std::option::Option::None;
self.special_fields.clear(); self.special_fields.clear();
} }
@ -3515,6 +3594,7 @@ impl ::protobuf::Message for ApplySettings {
safety_checks: ::std::option::Option::None, safety_checks: ::std::option::Option::None,
experimental_features: ::std::option::Option::None, experimental_features: ::std::option::Option::None,
hide_passphrase_from_host: ::std::option::Option::None, hide_passphrase_from_host: ::std::option::Option::None,
haptic_feedback: ::std::option::Option::None,
special_fields: ::protobuf::SpecialFields::new(), special_fields: ::protobuf::SpecialFields::new(),
}; };
&instance &instance
@ -10759,7 +10839,7 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\x0emessages.proto\"\x80\x01\n\nInitialize\x12\x1d\n\nsession_id\x18\x01\ \x0emessages.proto\"\x80\x01\n\nInitialize\x12\x1d\n\nsession_id\x18\x01\
\x20\x01(\x0cR\tsessionId\x12,\n\x10_skip_passphrase\x18\x02\x20\x01(\ \x20\x01(\x0cR\tsessionId\x12,\n\x10_skip_passphrase\x18\x02\x20\x01(\
\x08R\x0eSkipPassphraseB\x02\x18\x01\x12%\n\x0ederive_cardano\x18\x03\ \x08R\x0eSkipPassphraseB\x02\x18\x01\x12%\n\x0ederive_cardano\x18\x03\
\x20\x01(\x08R\rderiveCardano\"\r\n\x0bGetFeatures\"\x9b\x14\n\x08Featur\ \x20\x01(\x08R\rderiveCardano\"\r\n\x0bGetFeatures\"\xe1\x14\n\x08Featur\
es\x12\x16\n\x06vendor\x18\x01\x20\x01(\tR\x06vendor\x12#\n\rmajor_versi\ es\x12\x16\n\x06vendor\x18\x01\x20\x01(\tR\x06vendor\x12#\n\rmajor_versi\
on\x18\x02\x20\x02(\rR\x0cmajorVersion\x12#\n\rminor_version\x18\x03\x20\ on\x18\x02\x20\x02(\rR\x0cmajorVersion\x12#\n\rminor_version\x18\x03\x20\
\x02(\rR\x0cminorVersion\x12#\n\rpatch_version\x18\x04\x20\x02(\rR\x0cpa\ \x02(\rR\x0cminorVersion\x12#\n\rpatch_version\x18\x04\x20\x02(\rR\x0cpa\
@ -10804,118 +10884,121 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\x180\x20\x01(\rR\x10homescreenHeight\x12+\n\x11bootloader_locked\x181\ \x180\x20\x01(\rR\x10homescreenHeight\x12+\n\x11bootloader_locked\x181\
\x20\x01(\x08R\x10bootloaderLocked\x12>\n\x18language_version_matches\ \x20\x01(\x08R\x10bootloaderLocked\x12>\n\x18language_version_matches\
\x182\x20\x01(\x08:\x04trueR\x16languageVersionMatches\x12%\n\x0eunit_pa\ \x182\x20\x01(\x08:\x04trueR\x16languageVersionMatches\x12%\n\x0eunit_pa\
ckaging\x183\x20\x01(\rR\runitPackaging\"\xa5\x04\n\nCapability\x12\x1c\ ckaging\x183\x20\x01(\rR\runitPackaging\x12'\n\x0fhaptic_feedback\x184\
\n\x12Capability_Bitcoin\x10\x01\x1a\x04\x80\xa6\x1d\x01\x12\x1b\n\x17Ca\ \x20\x01(\x08R\x0ehapticFeedback\"\xc2\x04\n\nCapability\x12\x1c\n\x12Ca\
pability_Bitcoin_like\x10\x02\x12\x16\n\x12Capability_Binance\x10\x03\ pability_Bitcoin\x10\x01\x1a\x04\x80\xa6\x1d\x01\x12\x1b\n\x17Capability\
\x12\x16\n\x12Capability_Cardano\x10\x04\x12\x1b\n\x11Capability_Crypto\ _Bitcoin_like\x10\x02\x12\x16\n\x12Capability_Binance\x10\x03\x12\x16\n\
\x10\x05\x1a\x04\x80\xa6\x1d\x01\x12\x12\n\x0eCapability_EOS\x10\x06\x12\ \x12Capability_Cardano\x10\x04\x12\x1b\n\x11Capability_Crypto\x10\x05\
\x17\n\x13Capability_Ethereum\x10\x07\x12\x17\n\x0fCapability_Lisk\x10\ \x1a\x04\x80\xa6\x1d\x01\x12\x12\n\x0eCapability_EOS\x10\x06\x12\x17\n\
\x08\x1a\x02\x08\x01\x12\x15\n\x11Capability_Monero\x10\t\x12\x12\n\x0eC\ \x13Capability_Ethereum\x10\x07\x12\x17\n\x0fCapability_Lisk\x10\x08\x1a\
apability_NEM\x10\n\x12\x15\n\x11Capability_Ripple\x10\x0b\x12\x16\n\x12\ \x02\x08\x01\x12\x15\n\x11Capability_Monero\x10\t\x12\x12\n\x0eCapabilit\
Capability_Stellar\x10\x0c\x12\x14\n\x10Capability_Tezos\x10\r\x12\x12\n\ y_NEM\x10\n\x12\x15\n\x11Capability_Ripple\x10\x0b\x12\x16\n\x12Capabili\
\x0eCapability_U2F\x10\x0e\x12\x1b\n\x11Capability_Shamir\x10\x0f\x1a\ ty_Stellar\x10\x0c\x12\x14\n\x10Capability_Tezos\x10\r\x12\x12\n\x0eCapa\
\x04\x80\xa6\x1d\x01\x12!\n\x17Capability_ShamirGroups\x10\x10\x1a\x04\ bility_U2F\x10\x0e\x12\x1b\n\x11Capability_Shamir\x10\x0f\x1a\x04\x80\
\x80\xa6\x1d\x01\x12$\n\x1aCapability_PassphraseEntry\x10\x11\x1a\x04\ \xa6\x1d\x01\x12!\n\x17Capability_ShamirGroups\x10\x10\x1a\x04\x80\xa6\
\x80\xa6\x1d\x01\x12\x15\n\x11Capability_Solana\x10\x12\x12!\n\x17Capabi\ \x1d\x01\x12$\n\x1aCapability_PassphraseEntry\x10\x11\x1a\x04\x80\xa6\
lity_Translations\x10\x13\x1a\x04\x80\xa6\x1d\x01\x12\x1f\n\x15Capabilit\ \x1d\x01\x12\x15\n\x11Capability_Solana\x10\x12\x12!\n\x17Capability_Tra\
y_Brightness\x10\x14\x1a\x04\x80\xa6\x1d\x01\x1a\x04\xc8\xf3\x18\x01\"\ nslations\x10\x13\x1a\x04\x80\xa6\x1d\x01\x12\x1f\n\x15Capability_Bright\
\x0c\n\nLockDevice\"&\n\x07SetBusy\x12\x1b\n\texpiry_ms\x18\x01\x20\x01(\ ness\x10\x14\x1a\x04\x80\xa6\x1d\x01\x12\x1b\n\x11Capability_Haptic\x10\
\rR\x08expiryMs\"\x0c\n\nEndSession\"\x9b\x04\n\rApplySettings\x12\x1e\n\ \x15\x1a\x04\x80\xa6\x1d\x01\x1a\x04\xc8\xf3\x18\x01\"\x0c\n\nLockDevice\
\x08language\x18\x01\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05l\ \"&\n\x07SetBusy\x12\x1b\n\texpiry_ms\x18\x01\x20\x01(\rR\x08expiryMs\"\
abel\x18\x02\x20\x01(\tR\x05label\x12%\n\x0euse_passphrase\x18\x03\x20\ \x0c\n\nEndSession\"\xc4\x04\n\rApplySettings\x12\x1e\n\x08language\x18\
\x01(\x08R\rusePassphrase\x12\x1e\n\nhomescreen\x18\x04\x20\x01(\x0cR\nh\ \x01\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x02\x20\
omescreen\x120\n\x12_passphrase_source\x18\x05\x20\x01(\rR\x10Passphrase\ \x01(\tR\x05label\x12%\n\x0euse_passphrase\x18\x03\x20\x01(\x08R\rusePas\
SourceB\x02\x18\x01\x12+\n\x12auto_lock_delay_ms\x18\x06\x20\x01(\rR\x0f\ sphrase\x12\x1e\n\nhomescreen\x18\x04\x20\x01(\x0cR\nhomescreen\x120\n\
autoLockDelayMs\x12)\n\x10display_rotation\x18\x07\x20\x01(\rR\x0fdispla\ \x12_passphrase_source\x18\x05\x20\x01(\rR\x10PassphraseSourceB\x02\x18\
yRotation\x12=\n\x1bpassphrase_always_on_device\x18\x08\x20\x01(\x08R\ \x01\x12+\n\x12auto_lock_delay_ms\x18\x06\x20\x01(\rR\x0fautoLockDelayMs\
\x18passphraseAlwaysOnDevice\x12T\n\rsafety_checks\x18\t\x20\x01(\x0e2/.\ \x12)\n\x10display_rotation\x18\x07\x20\x01(\rR\x0fdisplayRotation\x12=\
hw.trezor.messages.management.SafetyCheckLevelR\x0csafetyChecks\x123\n\ \n\x1bpassphrase_always_on_device\x18\x08\x20\x01(\x08R\x18passphraseAlw\
\x15experimental_features\x18\n\x20\x01(\x08R\x14experimentalFeatures\ aysOnDevice\x12T\n\rsafety_checks\x18\t\x20\x01(\x0e2/.hw.trezor.message\
\x129\n\x19hide_passphrase_from_host\x18\x0b\x20\x01(\x08R\x16hidePassph\ s.management.SafetyCheckLevelR\x0csafetyChecks\x123\n\x15experimental_fe\
raseFromHost\"T\n\x0eChangeLanguage\x12\x1f\n\x0bdata_length\x18\x01\x20\ atures\x18\n\x20\x01(\x08R\x14experimentalFeatures\x129\n\x19hide_passph\
\x02(\rR\ndataLength\x12!\n\x0cshow_display\x18\x02\x20\x01(\x08R\x0bsho\ rase_from_host\x18\x0b\x20\x01(\x08R\x16hidePassphraseFromHost\x12'\n\
wDisplay\"Z\n\x16TranslationDataRequest\x12\x1f\n\x0bdata_length\x18\x01\ \x0fhaptic_feedback\x18\r\x20\x01(\x08R\x0ehapticFeedback\"T\n\x0eChange\
\x20\x02(\rR\ndataLength\x12\x1f\n\x0bdata_offset\x18\x02\x20\x02(\rR\nd\ Language\x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\x12!\n\
ataOffset\"3\n\x12TranslationDataAck\x12\x1d\n\ndata_chunk\x18\x01\x20\ \x0cshow_display\x18\x02\x20\x01(\x08R\x0bshowDisplay\"Z\n\x16Translatio\
\x02(\x0cR\tdataChunk\"\"\n\nApplyFlags\x12\x14\n\x05flags\x18\x01\x20\ nDataRequest\x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\
\x02(\rR\x05flags\"#\n\tChangePin\x12\x16\n\x06remove\x18\x01\x20\x01(\ \x12\x1f\n\x0bdata_offset\x18\x02\x20\x02(\rR\ndataOffset\"3\n\x12Transl\
\x08R\x06remove\"(\n\x0eChangeWipeCode\x12\x16\n\x06remove\x18\x01\x20\ ationDataAck\x12\x1d\n\ndata_chunk\x18\x01\x20\x02(\x0cR\tdataChunk\"\"\
\x01(\x08R\x06remove\"\xaa\x01\n\tSdProtect\x12]\n\toperation\x18\x01\ \n\nApplyFlags\x12\x14\n\x05flags\x18\x01\x20\x02(\rR\x05flags\"#\n\tCha\
\x20\x02(\x0e2?.hw.trezor.messages.management.SdProtect.SdProtectOperati\ ngePin\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"(\n\x0eChang\
onTypeR\toperation\">\n\x16SdProtectOperationType\x12\x0b\n\x07DISABLE\ eWipeCode\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"\xaa\x01\
\x10\0\x12\n\n\x06ENABLE\x10\x01\x12\x0b\n\x07REFRESH\x10\x02\"O\n\x04Pi\ \n\tSdProtect\x12]\n\toperation\x18\x01\x20\x02(\x0e2?.hw.trezor.message\
ng\x12\x1a\n\x07message\x18\x01\x20\x01(\t:\0R\x07message\x12+\n\x11butt\ s.management.SdProtect.SdProtectOperationTypeR\toperation\">\n\x16SdProt\
on_protection\x18\x02\x20\x01(\x08R\x10buttonProtection\"\x08\n\x06Cance\ ectOperationType\x12\x0b\n\x07DISABLE\x10\0\x12\n\n\x06ENABLE\x10\x01\
l\"\x20\n\nGetEntropy\x12\x12\n\x04size\x18\x01\x20\x02(\rR\x04size\"#\n\ \x12\x0b\n\x07REFRESH\x10\x02\"O\n\x04Ping\x12\x1a\n\x07message\x18\x01\
\x07Entropy\x12\x18\n\x07entropy\x18\x01\x20\x02(\x0cR\x07entropy\"/\n\ \x20\x01(\t:\0R\x07message\x12+\n\x11button_protection\x18\x02\x20\x01(\
\x0fGetFirmwareHash\x12\x1c\n\tchallenge\x18\x01\x20\x01(\x0cR\tchalleng\ \x08R\x10buttonProtection\"\x08\n\x06Cancel\"\x20\n\nGetEntropy\x12\x12\
e\"\"\n\x0cFirmwareHash\x12\x12\n\x04hash\x18\x01\x20\x02(\x0cR\x04hash\ \n\x04size\x18\x01\x20\x02(\rR\x04size\"#\n\x07Entropy\x12\x18\n\x07entr\
\"2\n\x12AuthenticateDevice\x12\x1c\n\tchallenge\x18\x01\x20\x02(\x0cR\t\ opy\x18\x01\x20\x02(\x0cR\x07entropy\"/\n\x0fGetFirmwareHash\x12\x1c\n\t\
challenge\"U\n\x11AuthenticityProof\x12\"\n\x0ccertificates\x18\x01\x20\ challenge\x18\x01\x20\x01(\x0cR\tchallenge\"\"\n\x0cFirmwareHash\x12\x12\
\x03(\x0cR\x0ccertificates\x12\x1c\n\tsignature\x18\x02\x20\x02(\x0cR\ts\ \n\x04hash\x18\x01\x20\x02(\x0cR\x04hash\"2\n\x12AuthenticateDevice\x12\
ignature\"\x0c\n\nWipeDevice\"\xad\x02\n\nLoadDevice\x12\x1c\n\tmnemonic\ \x1c\n\tchallenge\x18\x01\x20\x02(\x0cR\tchallenge\"U\n\x11AuthenticityP\
s\x18\x01\x20\x03(\tR\tmnemonics\x12\x10\n\x03pin\x18\x03\x20\x01(\tR\ roof\x12\"\n\x0ccertificates\x18\x01\x20\x03(\x0cR\x0ccertificates\x12\
\x03pin\x123\n\x15passphrase_protection\x18\x04\x20\x01(\x08R\x14passphr\ \x1c\n\tsignature\x18\x02\x20\x02(\x0cR\tsignature\"\x0c\n\nWipeDevice\"\
aseProtection\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\x08languageB\x02\ \xad\x02\n\nLoadDevice\x12\x1c\n\tmnemonics\x18\x01\x20\x03(\tR\tmnemoni\
\x18\x01\x12\x14\n\x05label\x18\x06\x20\x01(\tR\x05label\x12#\n\rskip_ch\ cs\x12\x10\n\x03pin\x18\x03\x20\x01(\tR\x03pin\x123\n\x15passphrase_prot\
ecksum\x18\x07\x20\x01(\x08R\x0cskipChecksum\x12\x1f\n\x0bu2f_counter\ ection\x18\x04\x20\x01(\x08R\x14passphraseProtection\x12\x1e\n\x08langua\
\x18\x08\x20\x01(\rR\nu2fCounter\x12!\n\x0cneeds_backup\x18\t\x20\x01(\ ge\x18\x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\
\x08R\x0bneedsBackup\x12\x1b\n\tno_backup\x18\n\x20\x01(\x08R\x08noBacku\ \x06\x20\x01(\tR\x05label\x12#\n\rskip_checksum\x18\x07\x20\x01(\x08R\
p\"\x99\x03\n\x0bResetDevice\x12%\n\x0edisplay_random\x18\x01\x20\x01(\ \x0cskipChecksum\x12\x1f\n\x0bu2f_counter\x18\x08\x20\x01(\rR\nu2fCounte\
\x08R\rdisplayRandom\x12\x1f\n\x08strength\x18\x02\x20\x01(\r:\x03256R\ r\x12!\n\x0cneeds_backup\x18\t\x20\x01(\x08R\x0bneedsBackup\x12\x1b\n\tn\
\x08strength\x123\n\x15passphrase_protection\x18\x03\x20\x01(\x08R\x14pa\ o_backup\x18\n\x20\x01(\x08R\x08noBackup\"\x99\x03\n\x0bResetDevice\x12%\
ssphraseProtection\x12%\n\x0epin_protection\x18\x04\x20\x01(\x08R\rpinPr\ \n\x0edisplay_random\x18\x01\x20\x01(\x08R\rdisplayRandom\x12\x1f\n\x08s\
otection\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\x08languageB\x02\x18\ trength\x18\x02\x20\x01(\r:\x03256R\x08strength\x123\n\x15passphrase_pro\
\x01\x12\x14\n\x05label\x18\x06\x20\x01(\tR\x05label\x12\x1f\n\x0bu2f_co\ tection\x18\x03\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_prot\
unter\x18\x07\x20\x01(\rR\nu2fCounter\x12\x1f\n\x0bskip_backup\x18\x08\ ection\x18\x04\x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\x18\
\x20\x01(\x08R\nskipBackup\x12\x1b\n\tno_backup\x18\t\x20\x01(\x08R\x08n\ \x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x06\x20\
oBackup\x12Q\n\x0bbackup_type\x18\n\x20\x01(\x0e2).hw.trezor.messages.ma\ \x01(\tR\x05label\x12\x1f\n\x0bu2f_counter\x18\x07\x20\x01(\rR\nu2fCount\
nagement.BackupType:\x05Bip39R\nbackupType\"\xe5\x01\n\x0cBackupDevice\ er\x12\x1f\n\x0bskip_backup\x18\x08\x20\x01(\x08R\nskipBackup\x12\x1b\n\
\x12'\n\x0fgroup_threshold\x18\x01\x20\x01(\rR\x0egroupThreshold\x12O\n\ \tno_backup\x18\t\x20\x01(\x08R\x08noBackup\x12Q\n\x0bbackup_type\x18\n\
\x06groups\x18\x02\x20\x03(\x0b27.hw.trezor.messages.management.BackupDe\ \x20\x01(\x0e2).hw.trezor.messages.management.BackupType:\x05Bip39R\nbac\
vice.Slip39GroupR\x06groups\x1a[\n\x0bSlip39Group\x12)\n\x10member_thres\ kupType\"\xe5\x01\n\x0cBackupDevice\x12'\n\x0fgroup_threshold\x18\x01\
hold\x18\x01\x20\x02(\rR\x0fmemberThreshold\x12!\n\x0cmember_count\x18\ \x20\x01(\rR\x0egroupThreshold\x12O\n\x06groups\x18\x02\x20\x03(\x0b27.h\
\x02\x20\x02(\rR\x0bmemberCount\"\x10\n\x0eEntropyRequest\"&\n\nEntropyA\ w.trezor.messages.management.BackupDevice.Slip39GroupR\x06groups\x1a[\n\
ck\x12\x18\n\x07entropy\x18\x01\x20\x02(\x0cR\x07entropy\"\xd8\x03\n\x0e\ \x0bSlip39Group\x12)\n\x10member_threshold\x18\x01\x20\x02(\rR\x0fmember\
RecoveryDevice\x12\x1d\n\nword_count\x18\x01\x20\x01(\rR\twordCount\x123\ Threshold\x12!\n\x0cmember_count\x18\x02\x20\x02(\rR\x0bmemberCount\"\
\n\x15passphrase_protection\x18\x02\x20\x01(\x08R\x14passphraseProtectio\ \x10\n\x0eEntropyRequest\"&\n\nEntropyAck\x12\x18\n\x07entropy\x18\x01\
n\x12%\n\x0epin_protection\x18\x03\x20\x01(\x08R\rpinProtection\x12\x1e\ \x20\x02(\x0cR\x07entropy\"\xd8\x03\n\x0eRecoveryDevice\x12\x1d\n\nword_\
\n\x08language\x18\x04\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\ count\x18\x01\x20\x01(\rR\twordCount\x123\n\x15passphrase_protection\x18\
\x05label\x18\x05\x20\x01(\tR\x05label\x12)\n\x10enforce_wordlist\x18\ \x02\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_protection\x18\
\x06\x20\x01(\x08R\x0fenforceWordlist\x12T\n\x04type\x18\x08\x20\x01(\ \x03\x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\x18\x04\x20\x01(\
\x0e2@.hw.trezor.messages.management.RecoveryDevice.RecoveryDeviceTypeR\ \tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x05\x20\x01(\tR\x05l\
\x04type\x12\x1f\n\x0bu2f_counter\x18\t\x20\x01(\rR\nu2fCounter\x12\x17\ abel\x12)\n\x10enforce_wordlist\x18\x06\x20\x01(\x08R\x0fenforceWordlist\
\n\x07dry_run\x18\n\x20\x01(\x08R\x06dryRun\"Z\n\x12RecoveryDeviceType\ \x12T\n\x04type\x18\x08\x20\x01(\x0e2@.hw.trezor.messages.management.Rec\
\x12%\n!RecoveryDeviceType_ScrambledWords\x10\0\x12\x1d\n\x19RecoveryDev\ overyDevice.RecoveryDeviceTypeR\x04type\x12\x1f\n\x0bu2f_counter\x18\t\
iceType_Matrix\x10\x01\"\xc5\x01\n\x0bWordRequest\x12N\n\x04type\x18\x01\ \x20\x01(\rR\nu2fCounter\x12\x17\n\x07dry_run\x18\n\x20\x01(\x08R\x06dry\
\x20\x02(\x0e2:.hw.trezor.messages.management.WordRequest.WordRequestTyp\ Run\"Z\n\x12RecoveryDeviceType\x12%\n!RecoveryDeviceType_ScrambledWords\
eR\x04type\"f\n\x0fWordRequestType\x12\x19\n\x15WordRequestType_Plain\ \x10\0\x12\x1d\n\x19RecoveryDeviceType_Matrix\x10\x01\"\xc5\x01\n\x0bWor\
\x10\0\x12\x1b\n\x17WordRequestType_Matrix9\x10\x01\x12\x1b\n\x17WordReq\ dRequest\x12N\n\x04type\x18\x01\x20\x02(\x0e2:.hw.trezor.messages.manage\
uestType_Matrix6\x10\x02\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01\ ment.WordRequest.WordRequestTypeR\x04type\"f\n\x0fWordRequestType\x12\
\x20\x02(\tR\x04word\"0\n\rSetU2FCounter\x12\x1f\n\x0bu2f_counter\x18\ \x19\n\x15WordRequestType_Plain\x10\0\x12\x1b\n\x17WordRequestType_Matri\
\x01\x20\x02(\rR\nu2fCounter\"\x13\n\x11GetNextU2FCounter\"1\n\x0eNextU2\ x9\x10\x01\x12\x1b\n\x17WordRequestType_Matrix6\x10\x02\"\x1d\n\x07WordA\
FCounter\x12\x1f\n\x0bu2f_counter\x18\x01\x20\x02(\rR\nu2fCounter\"\x11\ ck\x12\x12\n\x04word\x18\x01\x20\x02(\tR\x04word\"0\n\rSetU2FCounter\x12\
\n\x0fDoPreauthorized\"\x16\n\x14PreauthorizedRequest\"\x15\n\x13CancelA\ \x1f\n\x0bu2f_counter\x18\x01\x20\x02(\rR\nu2fCounter\"\x13\n\x11GetNext\
uthorization\"\x9a\x02\n\x12RebootToBootloader\x12o\n\x0cboot_command\ U2FCounter\"1\n\x0eNextU2FCounter\x12\x1f\n\x0bu2f_counter\x18\x01\x20\
\x18\x01\x20\x01(\x0e2=.hw.trezor.messages.management.RebootToBootloader\ \x02(\rR\nu2fCounter\"\x11\n\x0fDoPreauthorized\"\x16\n\x14Preauthorized\
.BootCommand:\rSTOP_AND_WAITR\x0bbootCommand\x12'\n\x0ffirmware_header\ Request\"\x15\n\x13CancelAuthorization\"\x9a\x02\n\x12RebootToBootloader\
\x18\x02\x20\x01(\x0cR\x0efirmwareHeader\x123\n\x14language_data_length\ \x12o\n\x0cboot_command\x18\x01\x20\x01(\x0e2=.hw.trezor.messages.manage\
\x18\x03\x20\x01(\r:\x010R\x12languageDataLength\"5\n\x0bBootCommand\x12\ ment.RebootToBootloader.BootCommand:\rSTOP_AND_WAITR\x0bbootCommand\x12'\
\x11\n\rSTOP_AND_WAIT\x10\0\x12\x13\n\x0fINSTALL_UPGRADE\x10\x01\"\x10\n\ \n\x0ffirmware_header\x18\x02\x20\x01(\x0cR\x0efirmwareHeader\x123\n\x14\
\x08GetNonce:\x04\x88\xb2\x19\x01\"#\n\x05Nonce\x12\x14\n\x05nonce\x18\ language_data_length\x18\x03\x20\x01(\r:\x010R\x12languageDataLength\"5\
\x01\x20\x02(\x0cR\x05nonce:\x04\x88\xb2\x19\x01\";\n\nUnlockPath\x12\ \n\x0bBootCommand\x12\x11\n\rSTOP_AND_WAIT\x10\0\x12\x13\n\x0fINSTALL_UP\
\x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12\x10\n\x03mac\x18\ GRADE\x10\x01\"\x10\n\x08GetNonce:\x04\x88\xb2\x19\x01\"#\n\x05Nonce\x12\
\x02\x20\x01(\x0cR\x03mac\"'\n\x13UnlockedPathRequest\x12\x10\n\x03mac\ \x14\n\x05nonce\x18\x01\x20\x02(\x0cR\x05nonce:\x04\x88\xb2\x19\x01\";\n\
\x18\x01\x20\x01(\x0cR\x03mac\"\x14\n\x12ShowDeviceTutorial\"\x12\n\x10U\ \nUnlockPath\x12\x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12\
nlockBootloader\"%\n\rSetBrightness\x12\x14\n\x05value\x18\x01\x20\x01(\ \x10\n\x03mac\x18\x02\x20\x01(\x0cR\x03mac\"'\n\x13UnlockedPathRequest\
\rR\x05value*\x99\x01\n\nBackupType\x12\t\n\x05Bip39\x10\0\x12\x10\n\x0c\ \x12\x10\n\x03mac\x18\x01\x20\x01(\x0cR\x03mac\"\x14\n\x12ShowDeviceTuto\
Slip39_Basic\x10\x01\x12\x13\n\x0fSlip39_Advanced\x10\x02\x12\x1c\n\x18S\ rial\"\x12\n\x10UnlockBootloader\"%\n\rSetBrightness\x12\x14\n\x05value\
lip39_Single_Extendable\x10\x03\x12\x1b\n\x17Slip39_Basic_Extendable\x10\ \x18\x01\x20\x01(\rR\x05value*\x99\x01\n\nBackupType\x12\t\n\x05Bip39\
\x04\x12\x1e\n\x1aSlip39_Advanced_Extendable\x10\x05*G\n\x10SafetyCheckL\ \x10\0\x12\x10\n\x0cSlip39_Basic\x10\x01\x12\x13\n\x0fSlip39_Advanced\
evel\x12\n\n\x06Strict\x10\0\x12\x10\n\x0cPromptAlways\x10\x01\x12\x15\n\ \x10\x02\x12\x1c\n\x18Slip39_Single_Extendable\x10\x03\x12\x1b\n\x17Slip\
\x11PromptTemporarily\x10\x02*0\n\x10HomescreenFormat\x12\x08\n\x04Toif\ 39_Basic_Extendable\x10\x04\x12\x1e\n\x1aSlip39_Advanced_Extendable\x10\
\x10\x01\x12\x08\n\x04Jpeg\x10\x02\x12\x08\n\x04ToiG\x10\x03BB\n#com.sat\ \x05*G\n\x10SafetyCheckLevel\x12\n\n\x06Strict\x10\0\x12\x10\n\x0cPrompt\
oshilabs.trezor.lib.protobufB\x17TrezorMessageManagement\x80\xa6\x1d\x01\ Always\x10\x01\x12\x15\n\x11PromptTemporarily\x10\x02*0\n\x10HomescreenF\
ormat\x12\x08\n\x04Toif\x10\x01\x12\x08\n\x04Jpeg\x10\x02\x12\x08\n\x04T\
oiG\x10\x03BB\n#com.satoshilabs.trezor.lib.protobufB\x17TrezorMessageMan\
agement\x80\xa6\x1d\x01\
"; ";
/// `FileDescriptorProto` object which was a source for this generated file /// `FileDescriptorProto` object which was a source for this generated file