diff --git a/common/protob/messages-management.proto b/common/protob/messages-management.proto index d0624752e9..e13857a51e 100644 --- a/common/protob/messages-management.proto +++ b/common/protob/messages-management.proto @@ -116,6 +116,7 @@ message Features { Capability_Solana = 18; Capability_Translations = 19 [(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 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 language_version_matches = 50 [default=true]; // translation blob version matches firmware 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 bool experimental_features = 10; // enable experimental message types optional bool hide_passphrase_from_host = 11; // do not show passphrase coming from host + optional bool haptic_feedback = 13; // enable haptic feedback } /** diff --git a/core/embed/extmod/modtrezorio/modtrezorio-haptic.h b/core/embed/extmod/modtrezorio/modtrezorio-haptic.h new file mode 100644 index 0000000000..9462b82614 --- /dev/null +++ b/core/embed/extmod/modtrezorio/modtrezorio-haptic.h @@ -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 . + */ + +#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, +}; diff --git a/core/embed/extmod/modtrezorio/modtrezorio.c b/core/embed/extmod/modtrezorio/modtrezorio.c index 72fa781f4f..b740a12dc9 100644 --- a/core/embed/extmod/modtrezorio/modtrezorio.c +++ b/core/embed/extmod/modtrezorio/modtrezorio.c @@ -55,9 +55,12 @@ bool usb_connected_previously = true; #include "modtrezorio-fatfs.h" #include "modtrezorio-sdcard.h" #endif +#ifdef USE_HAPTIC +#include "modtrezorio-haptic.h" +#endif /// 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_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)}, #endif +#ifdef USE_HAPTIC + {MP_ROM_QSTR(MP_QSTR_haptic), MP_ROM_PTR(&mod_trezorio_haptic_module)}, +#endif + #ifdef USE_TOUCH {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)}, diff --git a/core/embed/extmod/modtrezorutils/modtrezorutils.c b/core/embed/extmod/modtrezorutils/modtrezorutils.c index 5652c951c9..d3c711784f 100644 --- a/core/embed/extmod/modtrezorutils/modtrezorutils.c +++ b/core/embed/extmod/modtrezorutils/modtrezorutils.c @@ -416,6 +416,8 @@ STATIC mp_obj_tuple_t mod_trezorutils_version_obj = { /// """Whether the hardware supports SD card.""" /// USE_BACKLIGHT: bool /// """Whether the hardware supports backlight brightness control.""" +/// USE_HAPTIC: bool +/// """Whether the hardware supports haptic feedback.""" /// USE_OPTIGA: bool /// """Whether the hardware supports Optiga secure element.""" /// MODEL: str @@ -474,6 +476,11 @@ STATIC const mp_rom_map_elem_t mp_module_trezorutils_globals_table[] = { #else {MP_ROM_QSTR(MP_QSTR_USE_BACKLIGHT), mp_const_false}, #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 {MP_ROM_QSTR(MP_QSTR_USE_OPTIGA), mp_const_true}, #else diff --git a/core/embed/trezorhal/haptic.h b/core/embed/trezorhal/haptic.h index c54db4a285..f4f1c66bc5 100644 --- a/core/embed/trezorhal/haptic.h +++ b/core/embed/trezorhal/haptic.h @@ -30,4 +30,6 @@ void haptic_play(haptic_effect_t effect); // the creation of customized haptic effects. bool haptic_play_custom(int8_t amplitude_pct, uint16_t duration_ms); +void haptic_set_enabled(bool enable); + #endif diff --git a/core/embed/trezorhal/stm32u5/haptic/drv2625/drv2625.c b/core/embed/trezorhal/stm32u5/haptic/drv2625/drv2625.c index bcc216f218..a4cf9e6c76 100644 --- a/core/embed/trezorhal/stm32u5/haptic/drv2625/drv2625.c +++ b/core/embed/trezorhal/stm32u5/haptic/drv2625/drv2625.c @@ -81,6 +81,8 @@ #define MAX_AMPLITUDE 127 #define PRODTEST_EFFECT_AMPLITUDE 127 +bool haptic_enabled = true; + static bool set_reg(uint8_t addr, uint8_t value) { uint8_t data[] = {addr, value}; 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) { + if (!haptic_enabled) { + return; + } + switch (effect) { case HAPTIC_BUTTON_PRESS: 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) { return haptic_play_rtp(PRODTEST_EFFECT_AMPLITUDE, duration_ms); } + +void haptic_set_enabled(bool enable) { haptic_enabled = enable; } diff --git a/core/mocks/generated/trezorio/__init__.pyi b/core/mocks/generated/trezorio/__init__.pyi index 4798c4c4dc..bd360425ab 100644 --- a/core/mocks/generated/trezorio/__init__.pyi +++ b/core/mocks/generated/trezorio/__init__.pyi @@ -193,7 +193,7 @@ class WebUSB: """ 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_WRITE: int # wait until interface is writable diff --git a/core/mocks/generated/trezorio/haptic.pyi b/core/mocks/generated/trezorio/haptic.pyi new file mode 100644 index 0000000000..8820ebfa6f --- /dev/null +++ b/core/mocks/generated/trezorio/haptic.pyi @@ -0,0 +1,8 @@ +from typing import * + + +# extmod/modtrezorio/modtrezorio-haptic.h +def haptic_set_enabled(enable: bool) -> None: + """ + Enable/Disable the haptic feedback. + """ diff --git a/core/mocks/generated/trezorutils.pyi b/core/mocks/generated/trezorutils.pyi index d1a4c157d4..5c497046ba 100644 --- a/core/mocks/generated/trezorutils.pyi +++ b/core/mocks/generated/trezorutils.pyi @@ -126,6 +126,8 @@ USE_SD_CARD: bool """Whether the hardware supports SD card.""" USE_BACKLIGHT: bool """Whether the hardware supports backlight brightness control.""" +USE_HAPTIC: bool +"""Whether the hardware supports haptic feedback.""" USE_OPTIGA: bool """Whether the hardware supports Optiga secure element.""" MODEL: str diff --git a/core/src/apps/base.py b/core/src/apps/base.py index e9d5fc7352..fdf3f6afba 100644 --- a/core/src/apps/base.py +++ b/core/src/apps/base.py @@ -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: f.capabilities.append(Capability.Brightness) diff --git a/core/src/apps/management/apply_settings.py b/core/src/apps/management/apply_settings.py index 684beb35ff..0ce4ae6a77 100644 --- a/core/src/apps/management/apply_settings.py +++ b/core/src/apps/management/apply_settings.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING import storage.device as storage_device import trezorui2 -from trezor import TR +from trezor import TR, utils from trezor.enums import ButtonRequestType from trezor.ui.layouts import confirm_action 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 experimental_features = msg.experimental_features # local_cache_attribute hide_passphrase_from_host = msg.hide_passphrase_from_host # local_cache_attribute + haptic_feedback = msg.haptic_feedback if ( homescreen is None @@ -61,6 +62,7 @@ async def apply_settings(msg: ApplySettings) -> Success: and msg_safety_checks is None and experimental_features is None and hide_passphrase_from_host is None + and (haptic_feedback is None or not utils.USE_HAPTIC) ): 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) 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() return Success(message="Settings applied") @@ -255,3 +264,15 @@ async def _require_confirm_hide_passphrase_from_host(enable: bool) -> None: description=TR.passphrase__hide, 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, + ) diff --git a/core/src/boot.py b/core/src/boot.py index cffc828b07..5028bdba4d 100644 --- a/core/src/boot.py +++ b/core/src/boot.py @@ -10,7 +10,7 @@ welcome_screen_start_ms = utime.ticks_ms() import storage 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 ( allow_all_loader_messages, ignore_nonpin_loader_messages, @@ -51,6 +51,9 @@ async def bootscreen() -> None: enforce_welcome_screen_duration() ui.backlight_fade(ui.BacklightLevels.NONE) ui.display.orientation(storage.device.get_rotation()) + if utils.USE_HAPTIC: + io.haptic.haptic_set_enabled(storage.device.get_haptic_feedback()) + await lockscreen await verify_user_pin() storage.init_unlocked() @@ -61,6 +64,9 @@ async def bootscreen() -> None: storage.init_unlocked() enforce_welcome_screen_duration() rotation = storage.device.get_rotation() + if utils.USE_HAPTIC: + io.haptic.haptic_set_enabled(storage.device.get_haptic_feedback()) + if rotation != ui.display.orientation(): # there is a slight delay before next screen is shown, # so we don't fade unless there is a change of orientation diff --git a/core/src/storage/device.py b/core/src/storage/device.py index 0d01363f6d..eef8e648c3 100644 --- a/core/src/storage/device.py +++ b/core/src/storage/device.py @@ -36,12 +36,13 @@ INITIALIZED = const(0x13) # bool (0x01 or empty) _SAFETY_CHECK_LEVEL = const(0x14) # int _EXPERIMENTAL_FEATURES = const(0x15) # 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: _DEVICE_SECRET = const(0x17) # 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_PROMPT : Literal[1] = const(1) @@ -377,3 +378,17 @@ if utils.USE_THP: counter = int.from_bytes(get_cred_auth_key_counter(), "big") utils.ensure(counter < 0xFFFFFFFF, "Overflow of cred_auth_key_counter") 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) diff --git a/core/src/trezor/enums/Capability.py b/core/src/trezor/enums/Capability.py index a7472fdf30..bb26adb21b 100644 --- a/core/src/trezor/enums/Capability.py +++ b/core/src/trezor/enums/Capability.py @@ -11,6 +11,7 @@ ShamirGroups = 16 PassphraseEntry = 17 Translations = 19 Brightness = 20 +Haptic = 21 if not utils.BITCOIN_ONLY: Bitcoin_like = 2 Binance = 3 diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py index a5c314cc46..757ecf5acf 100644 --- a/core/src/trezor/enums/__init__.py +++ b/core/src/trezor/enums/__init__.py @@ -461,6 +461,7 @@ if TYPE_CHECKING: Solana = 18 Translations = 19 Brightness = 20 + Haptic = 21 class SdProtectOperationType(IntEnum): DISABLE = 0 diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py index 349be22442..e8afe64751 100644 --- a/core/src/trezor/messages.py +++ b/core/src/trezor/messages.py @@ -2163,6 +2163,7 @@ if TYPE_CHECKING: bootloader_locked: "bool | None" language_version_matches: "bool" unit_packaging: "int | None" + haptic_feedback: "bool | None" def __init__( self, @@ -2215,6 +2216,7 @@ if TYPE_CHECKING: bootloader_locked: "bool | None" = None, language_version_matches: "bool | None" = None, unit_packaging: "int | None" = None, + haptic_feedback: "bool | None" = None, ) -> None: pass @@ -2258,6 +2260,7 @@ if TYPE_CHECKING: safety_checks: "SafetyCheckLevel | None" experimental_features: "bool | None" hide_passphrase_from_host: "bool | None" + haptic_feedback: "bool | None" def __init__( self, @@ -2271,6 +2274,7 @@ if TYPE_CHECKING: safety_checks: "SafetyCheckLevel | None" = None, experimental_features: "bool | None" = None, hide_passphrase_from_host: "bool | None" = None, + haptic_feedback: "bool | None" = None, ) -> None: pass diff --git a/core/src/trezor/utils.py b/core/src/trezor/utils.py index e580b7be12..134274db6c 100644 --- a/core/src/trezor/utils.py +++ b/core/src/trezor/utils.py @@ -11,6 +11,7 @@ from trezorutils import ( # noqa: F401 SCM_REVISION, UI_LAYOUT, USE_BACKLIGHT, + USE_HAPTIC, USE_OPTIGA, USE_SD_CARD, USE_THP, diff --git a/python/src/trezorlib/cli/settings.py b/python/src/trezorlib/cli/settings.py index cc06b60d0a..276bcdc6d7 100644 --- a/python/src/trezorlib/cli/settings.py +++ b/python/src/trezorlib/cli/settings.py @@ -213,6 +213,14 @@ def brightness(client: "TrezorClient") -> str: 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() @click.argument("path_or_url", required=False) @click.option( diff --git a/python/src/trezorlib/device.py b/python/src/trezorlib/device.py index 7523235a84..af473442be 100644 --- a/python/src/trezorlib/device.py +++ b/python/src/trezorlib/device.py @@ -47,6 +47,7 @@ def apply_settings( safety_checks: Optional[messages.SafetyCheckLevel] = None, experimental_features: Optional[bool] = None, hide_passphrase_from_host: Optional[bool] = None, + haptic_feedback: Optional[bool] = None, ) -> "MessageType": if language is not None: warnings.warn( @@ -63,6 +64,7 @@ def apply_settings( safety_checks=safety_checks, experimental_features=experimental_features, hide_passphrase_from_host=hide_passphrase_from_host, + haptic_feedback=haptic_feedback, ) out = client.call(settings) diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py index 00064c3967..bd50df1918 100644 --- a/python/src/trezorlib/messages.py +++ b/python/src/trezorlib/messages.py @@ -493,6 +493,7 @@ class Capability(IntEnum): Solana = 18 Translations = 19 Brightness = 20 + Haptic = 21 class SdProtectOperationType(IntEnum): @@ -3263,6 +3264,7 @@ class Features(protobuf.MessageType): 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), 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__( @@ -3317,6 +3319,7 @@ class Features(protobuf.MessageType): bootloader_locked: Optional["bool"] = None, language_version_matches: Optional["bool"] = True, unit_packaging: Optional["int"] = None, + haptic_feedback: Optional["bool"] = None, ) -> None: self.capabilities: Sequence["Capability"] = capabilities if capabilities is not None else [] self.major_version = major_version @@ -3367,6 +3370,7 @@ class Features(protobuf.MessageType): self.bootloader_locked = bootloader_locked self.language_version_matches = language_version_matches self.unit_packaging = unit_packaging + self.haptic_feedback = haptic_feedback class LockDevice(protobuf.MessageType): @@ -3405,6 +3409,7 @@ class ApplySettings(protobuf.MessageType): 9: protobuf.Field("safety_checks", "SafetyCheckLevel", 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), + 13: protobuf.Field("haptic_feedback", "bool", repeated=False, required=False, default=None), } def __init__( @@ -3421,6 +3426,7 @@ class ApplySettings(protobuf.MessageType): safety_checks: Optional["SafetyCheckLevel"] = None, experimental_features: Optional["bool"] = None, hide_passphrase_from_host: Optional["bool"] = None, + haptic_feedback: Optional["bool"] = None, ) -> None: self.language = language self.label = label @@ -3433,6 +3439,7 @@ class ApplySettings(protobuf.MessageType): self.safety_checks = safety_checks self.experimental_features = experimental_features self.hide_passphrase_from_host = hide_passphrase_from_host + self.haptic_feedback = haptic_feedback class ChangeLanguage(protobuf.MessageType): diff --git a/rust/trezor-client/src/protos/generated/messages_management.rs b/rust/trezor-client/src/protos/generated/messages_management.rs index 50a553370d..4961d6cb78 100644 --- a/rust/trezor-client/src/protos/generated/messages_management.rs +++ b/rust/trezor-client/src/protos/generated/messages_management.rs @@ -462,6 +462,8 @@ pub struct Features { pub language_version_matches: ::std::option::Option, // @@protoc_insertion_point(field:hw.trezor.messages.management.Features.unit_packaging) pub unit_packaging: ::std::option::Option, + // @@protoc_insertion_point(field:hw.trezor.messages.management.Features.haptic_feedback) + pub haptic_feedback: ::std::option::Option, // special fields // @@protoc_insertion_point(special_field:hw.trezor.messages.management.Features.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -1569,8 +1571,27 @@ impl Features { 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 { - 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); fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( "vendor", @@ -1817,6 +1838,11 @@ impl Features { |m: &Features| { &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", fields, @@ -1994,6 +2020,9 @@ impl ::protobuf::Message for Features { 408 => { self.unit_packaging = ::std::option::Option::Some(is.read_uint32()?); }, + 416 => { + self.haptic_feedback = ::std::option::Option::Some(is.read_bool()?); + }, tag => { ::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 { 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()); self.special_fields.cached_size().set(my_size as u32); my_size @@ -2306,6 +2338,9 @@ impl ::protobuf::Message for Features { if let Some(v) = self.unit_packaging { 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())?; ::std::result::Result::Ok(()) } @@ -2372,6 +2407,7 @@ impl ::protobuf::Message for Features { self.bootloader_locked = ::std::option::Option::None; self.language_version_matches = ::std::option::Option::None; self.unit_packaging = ::std::option::Option::None; + self.haptic_feedback = ::std::option::Option::None; self.special_fields.clear(); } @@ -2426,6 +2462,7 @@ impl ::protobuf::Message for Features { bootloader_locked: ::std::option::Option::None, language_version_matches: ::std::option::Option::None, unit_packaging: ::std::option::Option::None, + haptic_feedback: ::std::option::Option::None, special_fields: ::protobuf::SpecialFields::new(), }; &instance @@ -2494,6 +2531,8 @@ pub mod features { Capability_Translations = 19, // @@protoc_insertion_point(enum_value:hw.trezor.messages.management.Features.Capability.Capability_Brightness) Capability_Brightness = 20, + // @@protoc_insertion_point(enum_value:hw.trezor.messages.management.Features.Capability.Capability_Haptic) + Capability_Haptic = 21, } impl ::protobuf::Enum for Capability { @@ -2525,6 +2564,7 @@ pub mod features { 18 => ::std::option::Option::Some(Capability::Capability_Solana), 19 => ::std::option::Option::Some(Capability::Capability_Translations), 20 => ::std::option::Option::Some(Capability::Capability_Brightness), + 21 => ::std::option::Option::Some(Capability::Capability_Haptic), _ => ::std::option::Option::None } } @@ -2551,6 +2591,7 @@ pub mod features { "Capability_Solana" => ::std::option::Option::Some(Capability::Capability_Solana), "Capability_Translations" => ::std::option::Option::Some(Capability::Capability_Translations), "Capability_Brightness" => ::std::option::Option::Some(Capability::Capability_Brightness), + "Capability_Haptic" => ::std::option::Option::Some(Capability::Capability_Haptic), _ => ::std::option::Option::None } } @@ -2576,6 +2617,7 @@ pub mod features { Capability::Capability_Solana, Capability::Capability_Translations, Capability::Capability_Brightness, + Capability::Capability_Haptic, ]; } @@ -2607,6 +2649,7 @@ pub mod features { Capability::Capability_Solana => 17, Capability::Capability_Translations => 18, Capability::Capability_Brightness => 19, + Capability::Capability_Haptic => 20, }; Self::enum_descriptor().value_by_index(index) } @@ -2999,6 +3042,8 @@ pub struct ApplySettings { pub experimental_features: ::std::option::Option, // @@protoc_insertion_point(field:hw.trezor.messages.management.ApplySettings.hide_passphrase_from_host) pub hide_passphrase_from_host: ::std::option::Option, + // @@protoc_insertion_point(field:hw.trezor.messages.management.ApplySettings.haptic_feedback) + pub haptic_feedback: ::std::option::Option, // special fields // @@protoc_insertion_point(special_field:hw.trezor.messages.management.ApplySettings.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -3278,8 +3323,27 @@ impl ApplySettings { 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 { - 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); fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( "language", @@ -3336,6 +3400,11 @@ impl ApplySettings { |m: &ApplySettings| { &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", fields, @@ -3387,6 +3456,9 @@ impl ::protobuf::Message for ApplySettings { 88 => { self.hide_passphrase_from_host = ::std::option::Option::Some(is.read_bool()?); }, + 104 => { + self.haptic_feedback = ::std::option::Option::Some(is.read_bool()?); + }, tag => { ::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 { 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()); self.special_fields.cached_size().set(my_size as u32); my_size @@ -3471,6 +3546,9 @@ impl ::protobuf::Message for ApplySettings { if let Some(v) = self.hide_passphrase_from_host { 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())?; ::std::result::Result::Ok(()) } @@ -3499,6 +3577,7 @@ impl ::protobuf::Message for ApplySettings { self.safety_checks = ::std::option::Option::None; self.experimental_features = ::std::option::Option::None; self.hide_passphrase_from_host = ::std::option::Option::None; + self.haptic_feedback = ::std::option::Option::None; self.special_fields.clear(); } @@ -3515,6 +3594,7 @@ impl ::protobuf::Message for ApplySettings { safety_checks: ::std::option::Option::None, experimental_features: ::std::option::Option::None, hide_passphrase_from_host: ::std::option::Option::None, + haptic_feedback: ::std::option::Option::None, special_fields: ::protobuf::SpecialFields::new(), }; &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\ \x20\x01(\x0cR\tsessionId\x12,\n\x10_skip_passphrase\x18\x02\x20\x01(\ \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\ 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\ @@ -10804,118 +10884,121 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x180\x20\x01(\rR\x10homescreenHeight\x12+\n\x11bootloader_locked\x181\ \x20\x01(\x08R\x10bootloaderLocked\x12>\n\x18language_version_matches\ \x182\x20\x01(\x08:\x04trueR\x16languageVersionMatches\x12%\n\x0eunit_pa\ - ckaging\x183\x20\x01(\rR\runitPackaging\"\xa5\x04\n\nCapability\x12\x1c\ - \n\x12Capability_Bitcoin\x10\x01\x1a\x04\x80\xa6\x1d\x01\x12\x1b\n\x17Ca\ - pability_Bitcoin_like\x10\x02\x12\x16\n\x12Capability_Binance\x10\x03\ - \x12\x16\n\x12Capability_Cardano\x10\x04\x12\x1b\n\x11Capability_Crypto\ - \x10\x05\x1a\x04\x80\xa6\x1d\x01\x12\x12\n\x0eCapability_EOS\x10\x06\x12\ - \x17\n\x13Capability_Ethereum\x10\x07\x12\x17\n\x0fCapability_Lisk\x10\ - \x08\x1a\x02\x08\x01\x12\x15\n\x11Capability_Monero\x10\t\x12\x12\n\x0eC\ - apability_NEM\x10\n\x12\x15\n\x11Capability_Ripple\x10\x0b\x12\x16\n\x12\ - Capability_Stellar\x10\x0c\x12\x14\n\x10Capability_Tezos\x10\r\x12\x12\n\ - \x0eCapability_U2F\x10\x0e\x12\x1b\n\x11Capability_Shamir\x10\x0f\x1a\ - \x04\x80\xa6\x1d\x01\x12!\n\x17Capability_ShamirGroups\x10\x10\x1a\x04\ - \x80\xa6\x1d\x01\x12$\n\x1aCapability_PassphraseEntry\x10\x11\x1a\x04\ - \x80\xa6\x1d\x01\x12\x15\n\x11Capability_Solana\x10\x12\x12!\n\x17Capabi\ - lity_Translations\x10\x13\x1a\x04\x80\xa6\x1d\x01\x12\x1f\n\x15Capabilit\ - y_Brightness\x10\x14\x1a\x04\x80\xa6\x1d\x01\x1a\x04\xc8\xf3\x18\x01\"\ - \x0c\n\nLockDevice\"&\n\x07SetBusy\x12\x1b\n\texpiry_ms\x18\x01\x20\x01(\ - \rR\x08expiryMs\"\x0c\n\nEndSession\"\x9b\x04\n\rApplySettings\x12\x1e\n\ - \x08language\x18\x01\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05l\ - abel\x18\x02\x20\x01(\tR\x05label\x12%\n\x0euse_passphrase\x18\x03\x20\ - \x01(\x08R\rusePassphrase\x12\x1e\n\nhomescreen\x18\x04\x20\x01(\x0cR\nh\ - omescreen\x120\n\x12_passphrase_source\x18\x05\x20\x01(\rR\x10Passphrase\ - SourceB\x02\x18\x01\x12+\n\x12auto_lock_delay_ms\x18\x06\x20\x01(\rR\x0f\ - autoLockDelayMs\x12)\n\x10display_rotation\x18\x07\x20\x01(\rR\x0fdispla\ - yRotation\x12=\n\x1bpassphrase_always_on_device\x18\x08\x20\x01(\x08R\ - \x18passphraseAlwaysOnDevice\x12T\n\rsafety_checks\x18\t\x20\x01(\x0e2/.\ - hw.trezor.messages.management.SafetyCheckLevelR\x0csafetyChecks\x123\n\ - \x15experimental_features\x18\n\x20\x01(\x08R\x14experimentalFeatures\ - \x129\n\x19hide_passphrase_from_host\x18\x0b\x20\x01(\x08R\x16hidePassph\ - raseFromHost\"T\n\x0eChangeLanguage\x12\x1f\n\x0bdata_length\x18\x01\x20\ - \x02(\rR\ndataLength\x12!\n\x0cshow_display\x18\x02\x20\x01(\x08R\x0bsho\ - wDisplay\"Z\n\x16TranslationDataRequest\x12\x1f\n\x0bdata_length\x18\x01\ - \x20\x02(\rR\ndataLength\x12\x1f\n\x0bdata_offset\x18\x02\x20\x02(\rR\nd\ - ataOffset\"3\n\x12TranslationDataAck\x12\x1d\n\ndata_chunk\x18\x01\x20\ - \x02(\x0cR\tdataChunk\"\"\n\nApplyFlags\x12\x14\n\x05flags\x18\x01\x20\ - \x02(\rR\x05flags\"#\n\tChangePin\x12\x16\n\x06remove\x18\x01\x20\x01(\ - \x08R\x06remove\"(\n\x0eChangeWipeCode\x12\x16\n\x06remove\x18\x01\x20\ - \x01(\x08R\x06remove\"\xaa\x01\n\tSdProtect\x12]\n\toperation\x18\x01\ - \x20\x02(\x0e2?.hw.trezor.messages.management.SdProtect.SdProtectOperati\ - onTypeR\toperation\">\n\x16SdProtectOperationType\x12\x0b\n\x07DISABLE\ - \x10\0\x12\n\n\x06ENABLE\x10\x01\x12\x0b\n\x07REFRESH\x10\x02\"O\n\x04Pi\ - ng\x12\x1a\n\x07message\x18\x01\x20\x01(\t:\0R\x07message\x12+\n\x11butt\ - on_protection\x18\x02\x20\x01(\x08R\x10buttonProtection\"\x08\n\x06Cance\ - l\"\x20\n\nGetEntropy\x12\x12\n\x04size\x18\x01\x20\x02(\rR\x04size\"#\n\ - \x07Entropy\x12\x18\n\x07entropy\x18\x01\x20\x02(\x0cR\x07entropy\"/\n\ - \x0fGetFirmwareHash\x12\x1c\n\tchallenge\x18\x01\x20\x01(\x0cR\tchalleng\ - e\"\"\n\x0cFirmwareHash\x12\x12\n\x04hash\x18\x01\x20\x02(\x0cR\x04hash\ - \"2\n\x12AuthenticateDevice\x12\x1c\n\tchallenge\x18\x01\x20\x02(\x0cR\t\ - challenge\"U\n\x11AuthenticityProof\x12\"\n\x0ccertificates\x18\x01\x20\ - \x03(\x0cR\x0ccertificates\x12\x1c\n\tsignature\x18\x02\x20\x02(\x0cR\ts\ - ignature\"\x0c\n\nWipeDevice\"\xad\x02\n\nLoadDevice\x12\x1c\n\tmnemonic\ - s\x18\x01\x20\x03(\tR\tmnemonics\x12\x10\n\x03pin\x18\x03\x20\x01(\tR\ - \x03pin\x123\n\x15passphrase_protection\x18\x04\x20\x01(\x08R\x14passphr\ - aseProtection\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\x08languageB\x02\ - \x18\x01\x12\x14\n\x05label\x18\x06\x20\x01(\tR\x05label\x12#\n\rskip_ch\ - ecksum\x18\x07\x20\x01(\x08R\x0cskipChecksum\x12\x1f\n\x0bu2f_counter\ - \x18\x08\x20\x01(\rR\nu2fCounter\x12!\n\x0cneeds_backup\x18\t\x20\x01(\ - \x08R\x0bneedsBackup\x12\x1b\n\tno_backup\x18\n\x20\x01(\x08R\x08noBacku\ - p\"\x99\x03\n\x0bResetDevice\x12%\n\x0edisplay_random\x18\x01\x20\x01(\ - \x08R\rdisplayRandom\x12\x1f\n\x08strength\x18\x02\x20\x01(\r:\x03256R\ - \x08strength\x123\n\x15passphrase_protection\x18\x03\x20\x01(\x08R\x14pa\ - ssphraseProtection\x12%\n\x0epin_protection\x18\x04\x20\x01(\x08R\rpinPr\ - otection\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\x08languageB\x02\x18\ - \x01\x12\x14\n\x05label\x18\x06\x20\x01(\tR\x05label\x12\x1f\n\x0bu2f_co\ - unter\x18\x07\x20\x01(\rR\nu2fCounter\x12\x1f\n\x0bskip_backup\x18\x08\ - \x20\x01(\x08R\nskipBackup\x12\x1b\n\tno_backup\x18\t\x20\x01(\x08R\x08n\ - oBackup\x12Q\n\x0bbackup_type\x18\n\x20\x01(\x0e2).hw.trezor.messages.ma\ - nagement.BackupType:\x05Bip39R\nbackupType\"\xe5\x01\n\x0cBackupDevice\ - \x12'\n\x0fgroup_threshold\x18\x01\x20\x01(\rR\x0egroupThreshold\x12O\n\ - \x06groups\x18\x02\x20\x03(\x0b27.hw.trezor.messages.management.BackupDe\ - vice.Slip39GroupR\x06groups\x1a[\n\x0bSlip39Group\x12)\n\x10member_thres\ - hold\x18\x01\x20\x02(\rR\x0fmemberThreshold\x12!\n\x0cmember_count\x18\ - \x02\x20\x02(\rR\x0bmemberCount\"\x10\n\x0eEntropyRequest\"&\n\nEntropyA\ - ck\x12\x18\n\x07entropy\x18\x01\x20\x02(\x0cR\x07entropy\"\xd8\x03\n\x0e\ - RecoveryDevice\x12\x1d\n\nword_count\x18\x01\x20\x01(\rR\twordCount\x123\ - \n\x15passphrase_protection\x18\x02\x20\x01(\x08R\x14passphraseProtectio\ - n\x12%\n\x0epin_protection\x18\x03\x20\x01(\x08R\rpinProtection\x12\x1e\ - \n\x08language\x18\x04\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\ - \x05label\x18\x05\x20\x01(\tR\x05label\x12)\n\x10enforce_wordlist\x18\ - \x06\x20\x01(\x08R\x0fenforceWordlist\x12T\n\x04type\x18\x08\x20\x01(\ - \x0e2@.hw.trezor.messages.management.RecoveryDevice.RecoveryDeviceTypeR\ - \x04type\x12\x1f\n\x0bu2f_counter\x18\t\x20\x01(\rR\nu2fCounter\x12\x17\ - \n\x07dry_run\x18\n\x20\x01(\x08R\x06dryRun\"Z\n\x12RecoveryDeviceType\ - \x12%\n!RecoveryDeviceType_ScrambledWords\x10\0\x12\x1d\n\x19RecoveryDev\ - iceType_Matrix\x10\x01\"\xc5\x01\n\x0bWordRequest\x12N\n\x04type\x18\x01\ - \x20\x02(\x0e2:.hw.trezor.messages.management.WordRequest.WordRequestTyp\ - eR\x04type\"f\n\x0fWordRequestType\x12\x19\n\x15WordRequestType_Plain\ - \x10\0\x12\x1b\n\x17WordRequestType_Matrix9\x10\x01\x12\x1b\n\x17WordReq\ - uestType_Matrix6\x10\x02\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01\ - \x20\x02(\tR\x04word\"0\n\rSetU2FCounter\x12\x1f\n\x0bu2f_counter\x18\ - \x01\x20\x02(\rR\nu2fCounter\"\x13\n\x11GetNextU2FCounter\"1\n\x0eNextU2\ - FCounter\x12\x1f\n\x0bu2f_counter\x18\x01\x20\x02(\rR\nu2fCounter\"\x11\ - \n\x0fDoPreauthorized\"\x16\n\x14PreauthorizedRequest\"\x15\n\x13CancelA\ - uthorization\"\x9a\x02\n\x12RebootToBootloader\x12o\n\x0cboot_command\ - \x18\x01\x20\x01(\x0e2=.hw.trezor.messages.management.RebootToBootloader\ - .BootCommand:\rSTOP_AND_WAITR\x0bbootCommand\x12'\n\x0ffirmware_header\ - \x18\x02\x20\x01(\x0cR\x0efirmwareHeader\x123\n\x14language_data_length\ - \x18\x03\x20\x01(\r:\x010R\x12languageDataLength\"5\n\x0bBootCommand\x12\ - \x11\n\rSTOP_AND_WAIT\x10\0\x12\x13\n\x0fINSTALL_UPGRADE\x10\x01\"\x10\n\ - \x08GetNonce:\x04\x88\xb2\x19\x01\"#\n\x05Nonce\x12\x14\n\x05nonce\x18\ - \x01\x20\x02(\x0cR\x05nonce:\x04\x88\xb2\x19\x01\";\n\nUnlockPath\x12\ - \x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12\x10\n\x03mac\x18\ - \x02\x20\x01(\x0cR\x03mac\"'\n\x13UnlockedPathRequest\x12\x10\n\x03mac\ - \x18\x01\x20\x01(\x0cR\x03mac\"\x14\n\x12ShowDeviceTutorial\"\x12\n\x10U\ - nlockBootloader\"%\n\rSetBrightness\x12\x14\n\x05value\x18\x01\x20\x01(\ - \rR\x05value*\x99\x01\n\nBackupType\x12\t\n\x05Bip39\x10\0\x12\x10\n\x0c\ - Slip39_Basic\x10\x01\x12\x13\n\x0fSlip39_Advanced\x10\x02\x12\x1c\n\x18S\ - lip39_Single_Extendable\x10\x03\x12\x1b\n\x17Slip39_Basic_Extendable\x10\ - \x04\x12\x1e\n\x1aSlip39_Advanced_Extendable\x10\x05*G\n\x10SafetyCheckL\ - evel\x12\n\n\x06Strict\x10\0\x12\x10\n\x0cPromptAlways\x10\x01\x12\x15\n\ - \x11PromptTemporarily\x10\x02*0\n\x10HomescreenFormat\x12\x08\n\x04Toif\ - \x10\x01\x12\x08\n\x04Jpeg\x10\x02\x12\x08\n\x04ToiG\x10\x03BB\n#com.sat\ - oshilabs.trezor.lib.protobufB\x17TrezorMessageManagement\x80\xa6\x1d\x01\ + ckaging\x183\x20\x01(\rR\runitPackaging\x12'\n\x0fhaptic_feedback\x184\ + \x20\x01(\x08R\x0ehapticFeedback\"\xc2\x04\n\nCapability\x12\x1c\n\x12Ca\ + pability_Bitcoin\x10\x01\x1a\x04\x80\xa6\x1d\x01\x12\x1b\n\x17Capability\ + _Bitcoin_like\x10\x02\x12\x16\n\x12Capability_Binance\x10\x03\x12\x16\n\ + \x12Capability_Cardano\x10\x04\x12\x1b\n\x11Capability_Crypto\x10\x05\ + \x1a\x04\x80\xa6\x1d\x01\x12\x12\n\x0eCapability_EOS\x10\x06\x12\x17\n\ + \x13Capability_Ethereum\x10\x07\x12\x17\n\x0fCapability_Lisk\x10\x08\x1a\ + \x02\x08\x01\x12\x15\n\x11Capability_Monero\x10\t\x12\x12\n\x0eCapabilit\ + y_NEM\x10\n\x12\x15\n\x11Capability_Ripple\x10\x0b\x12\x16\n\x12Capabili\ + ty_Stellar\x10\x0c\x12\x14\n\x10Capability_Tezos\x10\r\x12\x12\n\x0eCapa\ + bility_U2F\x10\x0e\x12\x1b\n\x11Capability_Shamir\x10\x0f\x1a\x04\x80\ + \xa6\x1d\x01\x12!\n\x17Capability_ShamirGroups\x10\x10\x1a\x04\x80\xa6\ + \x1d\x01\x12$\n\x1aCapability_PassphraseEntry\x10\x11\x1a\x04\x80\xa6\ + \x1d\x01\x12\x15\n\x11Capability_Solana\x10\x12\x12!\n\x17Capability_Tra\ + nslations\x10\x13\x1a\x04\x80\xa6\x1d\x01\x12\x1f\n\x15Capability_Bright\ + ness\x10\x14\x1a\x04\x80\xa6\x1d\x01\x12\x1b\n\x11Capability_Haptic\x10\ + \x15\x1a\x04\x80\xa6\x1d\x01\x1a\x04\xc8\xf3\x18\x01\"\x0c\n\nLockDevice\ + \"&\n\x07SetBusy\x12\x1b\n\texpiry_ms\x18\x01\x20\x01(\rR\x08expiryMs\"\ + \x0c\n\nEndSession\"\xc4\x04\n\rApplySettings\x12\x1e\n\x08language\x18\ + \x01\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x02\x20\ + \x01(\tR\x05label\x12%\n\x0euse_passphrase\x18\x03\x20\x01(\x08R\rusePas\ + sphrase\x12\x1e\n\nhomescreen\x18\x04\x20\x01(\x0cR\nhomescreen\x120\n\ + \x12_passphrase_source\x18\x05\x20\x01(\rR\x10PassphraseSourceB\x02\x18\ + \x01\x12+\n\x12auto_lock_delay_ms\x18\x06\x20\x01(\rR\x0fautoLockDelayMs\ + \x12)\n\x10display_rotation\x18\x07\x20\x01(\rR\x0fdisplayRotation\x12=\ + \n\x1bpassphrase_always_on_device\x18\x08\x20\x01(\x08R\x18passphraseAlw\ + aysOnDevice\x12T\n\rsafety_checks\x18\t\x20\x01(\x0e2/.hw.trezor.message\ + s.management.SafetyCheckLevelR\x0csafetyChecks\x123\n\x15experimental_fe\ + atures\x18\n\x20\x01(\x08R\x14experimentalFeatures\x129\n\x19hide_passph\ + rase_from_host\x18\x0b\x20\x01(\x08R\x16hidePassphraseFromHost\x12'\n\ + \x0fhaptic_feedback\x18\r\x20\x01(\x08R\x0ehapticFeedback\"T\n\x0eChange\ + Language\x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\x12!\n\ + \x0cshow_display\x18\x02\x20\x01(\x08R\x0bshowDisplay\"Z\n\x16Translatio\ + nDataRequest\x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\ + \x12\x1f\n\x0bdata_offset\x18\x02\x20\x02(\rR\ndataOffset\"3\n\x12Transl\ + ationDataAck\x12\x1d\n\ndata_chunk\x18\x01\x20\x02(\x0cR\tdataChunk\"\"\ + \n\nApplyFlags\x12\x14\n\x05flags\x18\x01\x20\x02(\rR\x05flags\"#\n\tCha\ + ngePin\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"(\n\x0eChang\ + eWipeCode\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"\xaa\x01\ + \n\tSdProtect\x12]\n\toperation\x18\x01\x20\x02(\x0e2?.hw.trezor.message\ + s.management.SdProtect.SdProtectOperationTypeR\toperation\">\n\x16SdProt\ + ectOperationType\x12\x0b\n\x07DISABLE\x10\0\x12\n\n\x06ENABLE\x10\x01\ + \x12\x0b\n\x07REFRESH\x10\x02\"O\n\x04Ping\x12\x1a\n\x07message\x18\x01\ + \x20\x01(\t:\0R\x07message\x12+\n\x11button_protection\x18\x02\x20\x01(\ + \x08R\x10buttonProtection\"\x08\n\x06Cancel\"\x20\n\nGetEntropy\x12\x12\ + \n\x04size\x18\x01\x20\x02(\rR\x04size\"#\n\x07Entropy\x12\x18\n\x07entr\ + opy\x18\x01\x20\x02(\x0cR\x07entropy\"/\n\x0fGetFirmwareHash\x12\x1c\n\t\ + challenge\x18\x01\x20\x01(\x0cR\tchallenge\"\"\n\x0cFirmwareHash\x12\x12\ + \n\x04hash\x18\x01\x20\x02(\x0cR\x04hash\"2\n\x12AuthenticateDevice\x12\ + \x1c\n\tchallenge\x18\x01\x20\x02(\x0cR\tchallenge\"U\n\x11AuthenticityP\ + roof\x12\"\n\x0ccertificates\x18\x01\x20\x03(\x0cR\x0ccertificates\x12\ + \x1c\n\tsignature\x18\x02\x20\x02(\x0cR\tsignature\"\x0c\n\nWipeDevice\"\ + \xad\x02\n\nLoadDevice\x12\x1c\n\tmnemonics\x18\x01\x20\x03(\tR\tmnemoni\ + cs\x12\x10\n\x03pin\x18\x03\x20\x01(\tR\x03pin\x123\n\x15passphrase_prot\ + ection\x18\x04\x20\x01(\x08R\x14passphraseProtection\x12\x1e\n\x08langua\ + ge\x18\x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\ + \x06\x20\x01(\tR\x05label\x12#\n\rskip_checksum\x18\x07\x20\x01(\x08R\ + \x0cskipChecksum\x12\x1f\n\x0bu2f_counter\x18\x08\x20\x01(\rR\nu2fCounte\ + r\x12!\n\x0cneeds_backup\x18\t\x20\x01(\x08R\x0bneedsBackup\x12\x1b\n\tn\ + o_backup\x18\n\x20\x01(\x08R\x08noBackup\"\x99\x03\n\x0bResetDevice\x12%\ + \n\x0edisplay_random\x18\x01\x20\x01(\x08R\rdisplayRandom\x12\x1f\n\x08s\ + trength\x18\x02\x20\x01(\r:\x03256R\x08strength\x123\n\x15passphrase_pro\ + tection\x18\x03\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_prot\ + ection\x18\x04\x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\x18\ + \x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x06\x20\ + \x01(\tR\x05label\x12\x1f\n\x0bu2f_counter\x18\x07\x20\x01(\rR\nu2fCount\ + er\x12\x1f\n\x0bskip_backup\x18\x08\x20\x01(\x08R\nskipBackup\x12\x1b\n\ + \tno_backup\x18\t\x20\x01(\x08R\x08noBackup\x12Q\n\x0bbackup_type\x18\n\ + \x20\x01(\x0e2).hw.trezor.messages.management.BackupType:\x05Bip39R\nbac\ + kupType\"\xe5\x01\n\x0cBackupDevice\x12'\n\x0fgroup_threshold\x18\x01\ + \x20\x01(\rR\x0egroupThreshold\x12O\n\x06groups\x18\x02\x20\x03(\x0b27.h\ + w.trezor.messages.management.BackupDevice.Slip39GroupR\x06groups\x1a[\n\ + \x0bSlip39Group\x12)\n\x10member_threshold\x18\x01\x20\x02(\rR\x0fmember\ + Threshold\x12!\n\x0cmember_count\x18\x02\x20\x02(\rR\x0bmemberCount\"\ + \x10\n\x0eEntropyRequest\"&\n\nEntropyAck\x12\x18\n\x07entropy\x18\x01\ + \x20\x02(\x0cR\x07entropy\"\xd8\x03\n\x0eRecoveryDevice\x12\x1d\n\nword_\ + count\x18\x01\x20\x01(\rR\twordCount\x123\n\x15passphrase_protection\x18\ + \x02\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_protection\x18\ + \x03\x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\x18\x04\x20\x01(\ + \tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x05\x20\x01(\tR\x05l\ + abel\x12)\n\x10enforce_wordlist\x18\x06\x20\x01(\x08R\x0fenforceWordlist\ + \x12T\n\x04type\x18\x08\x20\x01(\x0e2@.hw.trezor.messages.management.Rec\ + overyDevice.RecoveryDeviceTypeR\x04type\x12\x1f\n\x0bu2f_counter\x18\t\ + \x20\x01(\rR\nu2fCounter\x12\x17\n\x07dry_run\x18\n\x20\x01(\x08R\x06dry\ + Run\"Z\n\x12RecoveryDeviceType\x12%\n!RecoveryDeviceType_ScrambledWords\ + \x10\0\x12\x1d\n\x19RecoveryDeviceType_Matrix\x10\x01\"\xc5\x01\n\x0bWor\ + dRequest\x12N\n\x04type\x18\x01\x20\x02(\x0e2:.hw.trezor.messages.manage\ + ment.WordRequest.WordRequestTypeR\x04type\"f\n\x0fWordRequestType\x12\ + \x19\n\x15WordRequestType_Plain\x10\0\x12\x1b\n\x17WordRequestType_Matri\ + x9\x10\x01\x12\x1b\n\x17WordRequestType_Matrix6\x10\x02\"\x1d\n\x07WordA\ + ck\x12\x12\n\x04word\x18\x01\x20\x02(\tR\x04word\"0\n\rSetU2FCounter\x12\ + \x1f\n\x0bu2f_counter\x18\x01\x20\x02(\rR\nu2fCounter\"\x13\n\x11GetNext\ + U2FCounter\"1\n\x0eNextU2FCounter\x12\x1f\n\x0bu2f_counter\x18\x01\x20\ + \x02(\rR\nu2fCounter\"\x11\n\x0fDoPreauthorized\"\x16\n\x14Preauthorized\ + Request\"\x15\n\x13CancelAuthorization\"\x9a\x02\n\x12RebootToBootloader\ + \x12o\n\x0cboot_command\x18\x01\x20\x01(\x0e2=.hw.trezor.messages.manage\ + ment.RebootToBootloader.BootCommand:\rSTOP_AND_WAITR\x0bbootCommand\x12'\ + \n\x0ffirmware_header\x18\x02\x20\x01(\x0cR\x0efirmwareHeader\x123\n\x14\ + language_data_length\x18\x03\x20\x01(\r:\x010R\x12languageDataLength\"5\ + \n\x0bBootCommand\x12\x11\n\rSTOP_AND_WAIT\x10\0\x12\x13\n\x0fINSTALL_UP\ + GRADE\x10\x01\"\x10\n\x08GetNonce:\x04\x88\xb2\x19\x01\"#\n\x05Nonce\x12\ + \x14\n\x05nonce\x18\x01\x20\x02(\x0cR\x05nonce:\x04\x88\xb2\x19\x01\";\n\ + \nUnlockPath\x12\x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12\ + \x10\n\x03mac\x18\x02\x20\x01(\x0cR\x03mac\"'\n\x13UnlockedPathRequest\ + \x12\x10\n\x03mac\x18\x01\x20\x01(\x0cR\x03mac\"\x14\n\x12ShowDeviceTuto\ + rial\"\x12\n\x10UnlockBootloader\"%\n\rSetBrightness\x12\x14\n\x05value\ + \x18\x01\x20\x01(\rR\x05value*\x99\x01\n\nBackupType\x12\t\n\x05Bip39\ + \x10\0\x12\x10\n\x0cSlip39_Basic\x10\x01\x12\x13\n\x0fSlip39_Advanced\ + \x10\x02\x12\x1c\n\x18Slip39_Single_Extendable\x10\x03\x12\x1b\n\x17Slip\ + 39_Basic_Extendable\x10\x04\x12\x1e\n\x1aSlip39_Advanced_Extendable\x10\ + \x05*G\n\x10SafetyCheckLevel\x12\n\n\x06Strict\x10\0\x12\x10\n\x0cPrompt\ + 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