chore(core): add messages for reading out telemetry data
What changed, and why it matters
This commit only adds new message definitions for reading out device telemetry (battery temperature extremes and battery error flags). It does not include any firmware logic that actually collects or responds to these messages, so it cannot by itself be used to attack a device. It is essentially plumbing for a future feature.
No immediate action required. When the corresponding firmware handler is later added, review it for authorization, side-channel, and information-disclosure risks.
Security signals we found
New wire messages added with bitcoin_only flag
No handler/implementation code visible in the commit
Legacy firmware explicitly skips the new messages
Telemetry data is read-only and non-sensitive operational data
Evidence from the diff
The change introduces a new Protocol Buffers message file messages-telemetry.proto with TelemetryGet (request) and Telemetry (response carrying optional min_temp_c, max_temp_c, battery_errors). It registers the new message types 1100/1101 across Python, Rust, and core enum/generated code, and adds the module to build makefiles. The legacy firmware explicitly skips these messages. No handler implementation, authorization check, or data-gathering code is present in the diff.
Changed components
common/protob/messages-telemetry.protocore/src/trezor/enums/MessageType.pycore/src/trezor/messages.pypython/src/trezorlib/messages.pyrust/trezor-client/src/messages/generated.rsrust/trezor-client/src/protos/generated/messages_telemetry.rsInspect captured patch +503 / −11
diff --git a/common/protob/Makefile b/common/protob/Makefile
index 9c5e7890..54b2173a 100644
--- a/common/protob/Makefile
+++ b/common/protob/Makefile
@@ -1,4 +1,4 @@
-check: messages.pb messages-bitcoin.pb messages-ble.pb messages-bootloader.pb messages-cardano.pb messages-common.pb messages-crypto.pb messages-debug.pb messages-ethereum.pb messages-management.pb messages-monero.pb messages-nem.pb messages-ripple.pb messages-stellar.pb messages-tezos.pb messages-tron.pb messages-eos.pb messages-solana.pb messages-definitions.pb
+check: messages.pb messages-bitcoin.pb messages-ble.pb messages-bootloader.pb messages-cardano.pb messages-common.pb messages-crypto.pb messages-debug.pb messages-ethereum.pb messages-management.pb messages-monero.pb messages-nem.pb messages-ripple.pb messages-stellar.pb messages-tezos.pb messages-tron.pb messages-eos.pb messages-solana.pb messages-definitions.pb messages-telemetry.pb
%.pb: %.proto
protoc -I/usr/include -I. $< -o $@
diff --git a/common/protob/messages-telemetry.proto b/common/protob/messages-telemetry.proto
new file mode 100644
index 00000000..17e21578
--- /dev/null
+++ b/common/protob/messages-telemetry.proto
@@ -0,0 +1,29 @@
+syntax = "proto2";
+package hw.trezor.messages.telemetry;
+
+// Sugar for easier handling in Java
+option java_package = "com.satoshilabs.trezor.lib.protobuf";
+option java_outer_classname = "TrezorMessageTelemetry";
+
+import "options.proto";
+
+option (include_in_bitcoin_only) = true;
+
+/**
+ * Request: Ask device for telemetry data
+ * @start
+ * @next Telemetry
+ * @next Failure
+ */
+message TelemetryGet {
+}
+
+/**
+ * Response: Reports telemetry data
+ * @end
+ */
+message Telemetry {
+ optional sint32 min_temp_c = 1; // Minimum recorded battery temperature in milli-Celsius
+ optional sint32 max_temp_c = 2; // Maximum recorded battery temperature in milli-Celsius
+ optional uint32 battery_errors = 3; // Bitfield of battery errors
+}
diff --git a/common/protob/messages.proto b/common/protob/messages.proto
index 97a4ff83..8df88b38 100644
--- a/common/protob/messages.proto
+++ b/common/protob/messages.proto
@@ -363,4 +363,8 @@ enum MessageType {
MessageType_BenchmarkNames = 9101 [(bitcoin_only) = true];
MessageType_BenchmarkRun = 9102 [(bitcoin_only) = true];
MessageType_BenchmarkResult = 9103 [(bitcoin_only) = true];
+
+ // Telemetry
+ MessageType_TelemetryGet = 1100 [(bitcoin_only) = true, (wire_in) = true];
+ MessageType_Telemetry = 1101 [(bitcoin_only) = true, (wire_out) = true];
}
diff --git a/core/embed/upymod/qstrdefsport.h b/core/embed/upymod/qstrdefsport.h
index 923db32e..0ab382f7 100644
--- a/core/embed/upymod/qstrdefsport.h
+++ b/core/embed/upymod/qstrdefsport.h
@@ -164,6 +164,8 @@ Q(apps.misc.sign_identity)
Q(apps.nostr)
Q(apps.nostr.get_pubkey)
Q(apps.nostr.sign_event)
+Q(apps.telemetry)
+Q(apps.telemetry.get_telemetry)
Q(apps.workflow_handlers)
Q(authenticate_device)
Q(authorization)
@@ -235,6 +237,7 @@ Q(get_ownership_proof)
Q(get_pubkey)
Q(get_public_key)
Q(get_serial_number)
+Q(get_telemetry)
Q(hash_benchmark)
Q(hashlib)
Q(helpers)
@@ -314,6 +317,7 @@ Q(storage.resident_credentials)
Q(storage.sd_salt)
Q(strings)
Q(suspend)
+Q(telemetry)
Q(trezor)
Q(trezor.crypto)
Q(trezor.crypto.base32)
diff --git a/core/src/trezor/enums/MessageType.py b/core/src/trezor/enums/MessageType.py
index 8ec40389..c2627cb5 100644
--- a/core/src/trezor/enums/MessageType.py
+++ b/core/src/trezor/enums/MessageType.py
@@ -96,6 +96,8 @@ BenchmarkListNames = 9100
BenchmarkNames = 9101
BenchmarkRun = 9102
BenchmarkResult = 9103
+TelemetryGet = 1100
+Telemetry = 1101
if __debug__:
DebugLinkDecision = 100
DebugLinkGetState = 101
diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py
index 7d613c40..7824bd15 100644
--- a/core/src/trezor/enums/__init__.py
+++ b/core/src/trezor/enums/__init__.py
@@ -646,3 +646,5 @@ if TYPE_CHECKING:
BenchmarkNames = 9101
BenchmarkRun = 9102
BenchmarkResult = 9103
+ TelemetryGet = 1100
+ Telemetry = 1101
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 99b134c0..fad99ea4 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -6128,6 +6128,30 @@ if TYPE_CHECKING:
def is_type_of(cls, msg: Any) -> TypeGuard["StellarSignedTx"]:
return isinstance(msg, cls)
+ class TelemetryGet(protobuf.MessageType):
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["TelemetryGet"]:
+ return isinstance(msg, cls)
+
+ class Telemetry(protobuf.MessageType):
+ min_temp_c: "int | None"
+ max_temp_c: "int | None"
+ battery_errors: "int | None"
+
+ def __init__(
+ self,
+ *,
+ min_temp_c: "int | None" = None,
+ max_temp_c: "int | None" = None,
+ battery_errors: "int | None" = None,
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["Telemetry"]:
+ return isinstance(msg, cls)
+
class TezosGetAddress(protobuf.MessageType):
address_n: "list[int]"
show_display: "bool | None"
diff --git a/legacy/firmware/protob/Makefile b/legacy/firmware/protob/Makefile
index 4eaf22d8..130604bd 100644
--- a/legacy/firmware/protob/Makefile
+++ b/legacy/firmware/protob/Makefile
@@ -16,7 +16,8 @@ SKIPPED_MESSAGES := Cardano DebugMonero Eos Monero Ontology Ripple SdProtect Tez
BenchmarkListNames BenchmarkRun BenchmarkNames BenchmarkResult \
NostrGetPubkey NostrPubkey NostrSignEvent NostrEventSignature \
BleUnpair PaymentNotification Evolu \
- GetSerialNumber SerialNumber
+ GetSerialNumber SerialNumber \
+ TelemetryGet, Telemetry
ifeq ($(BITCOIN_ONLY), 1)
SKIPPED_MESSAGES += Ethereum NEM Stellar
diff --git a/python/src/trezorlib/mapping.py b/python/src/trezorlib/mapping.py
index 9e2b277a..525874ee 100644
--- a/python/src/trezorlib/mapping.py
+++ b/python/src/trezorlib/mapping.py
@@ -110,12 +110,12 @@ class ProtobufMapping:
msg_class = getattr(module, entry.name, None)
if msg_class is None:
raise ValueError(
- f"Implementation of protobuf message '{entry.name}' is missing"
+ f"Implementation of protobuf message '{entry.name}' is missing, {module}"
)
if msg_class.MESSAGE_WIRE_TYPE != entry.value:
raise ValueError(
- f"Inconsistent wire type and MessageType record for '{entry.name}'"
+ f"Inconsistent wire type and MessageType record for '{entry.name}': {entry.value} != {msg_class.MESSAGE_WIRE_TYPE}, {msg_class}"
)
mapping.register(msg_class)
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index 052a18f5..8ab8abc3 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -700,6 +700,8 @@ class MessageType(IntEnum):
BenchmarkNames = 9101
BenchmarkRun = 9102
BenchmarkResult = 9103
+ TelemetryGet = 1100
+ Telemetry = 1101
class BenchmarkListNames(protobuf.MessageType):
@@ -7860,6 +7862,30 @@ class StellarSignedTx(protobuf.MessageType):
self.signature = signature
+class TelemetryGet(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 1100
+
+
+class Telemetry(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 1101
+ FIELDS = {
+ 1: protobuf.Field("min_temp_c", "sint32", repeated=False, required=False, default=None),
+ 2: protobuf.Field("max_temp_c", "sint32", repeated=False, required=False, default=None),
+ 3: protobuf.Field("battery_errors", "uint32", repeated=False, required=False, default=None),
+ }
+
+ def __init__(
+ self,
+ *,
+ min_temp_c: Optional["int"] = None,
+ max_temp_c: Optional["int"] = None,
+ battery_errors: Optional["int"] = None,
+ ) -> None:
+ self.min_temp_c = min_temp_c
+ self.max_temp_c = max_temp_c
+ self.battery_errors = battery_errors
+
+
class TezosGetAddress(protobuf.MessageType):
MESSAGE_WIRE_TYPE = 150
FIELDS = {
diff --git a/rust/trezor-client/src/messages/generated.rs b/rust/trezor-client/src/messages/generated.rs
index 269fab7b..9a7020c0 100644
--- a/rust/trezor-client/src/messages/generated.rs
+++ b/rust/trezor-client/src/messages/generated.rs
@@ -99,6 +99,8 @@ trezor_message_impl! {
BenchmarkNames => MessageType_BenchmarkNames,
BenchmarkRun => MessageType_BenchmarkRun,
BenchmarkResult => MessageType_BenchmarkResult,
+ TelemetryGet => MessageType_TelemetryGet,
+ Telemetry => MessageType_Telemetry,
}
#[cfg(feature = "bitcoin")]
diff --git a/rust/trezor-client/src/protos/generated/messages.rs b/rust/trezor-client/src/protos/generated/messages.rs
index 5ac95f7d..72a7d6bf 100644
--- a/rust/trezor-client/src/protos/generated/messages.rs
+++ b/rust/trezor-client/src/protos/generated/messages.rs
@@ -567,6 +567,10 @@ pub enum MessageType {
MessageType_BenchmarkRun = 9102,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_BenchmarkResult)
MessageType_BenchmarkResult = 9103,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_TelemetryGet)
+ MessageType_TelemetryGet = 1100,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_Telemetry)
+ MessageType_Telemetry = 1101,
}
impl ::protobuf::Enum for MessageType {
@@ -848,6 +852,8 @@ impl ::protobuf::Enum for MessageType {
9101 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkNames),
9102 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkRun),
9103 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkResult),
+ 1100 => ::std::option::Option::Some(MessageType::MessageType_TelemetryGet),
+ 1101 => ::std::option::Option::Some(MessageType::MessageType_Telemetry),
_ => ::std::option::Option::None
}
}
@@ -1124,6 +1130,8 @@ impl ::protobuf::Enum for MessageType {
"MessageType_BenchmarkNames" => ::std::option::Option::Some(MessageType::MessageType_BenchmarkNames),
"MessageType_BenchmarkRun" => ::std::option::Option::Some(MessageType::MessageType_BenchmarkRun),
"MessageType_BenchmarkResult" => ::std::option::Option::Some(MessageType::MessageType_BenchmarkResult),
+ "MessageType_TelemetryGet" => ::std::option::Option::Some(MessageType::MessageType_TelemetryGet),
+ "MessageType_Telemetry" => ::std::option::Option::Some(MessageType::MessageType_Telemetry),
_ => ::std::option::Option::None
}
}
@@ -1399,6 +1407,8 @@ impl ::protobuf::Enum for MessageType {
MessageType::MessageType_BenchmarkNames,
MessageType::MessageType_BenchmarkRun,
MessageType::MessageType_BenchmarkResult,
+ MessageType::MessageType_TelemetryGet,
+ MessageType::MessageType_Telemetry,
];
}
@@ -1680,6 +1690,8 @@ impl ::protobuf::EnumFull for MessageType {
MessageType::MessageType_BenchmarkNames => 267,
MessageType::MessageType_BenchmarkRun => 268,
MessageType::MessageType_BenchmarkResult => 269,
+ MessageType::MessageType_TelemetryGet => 270,
+ MessageType::MessageType_Telemetry => 271,
};
Self::enum_descriptor().value_by_index(index)
}
@@ -1698,7 +1710,7 @@ impl MessageType {
}
static file_descriptor_proto_data: &'static [u8] = b"\
- \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xac^\
+ \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xfb^\
\n\x0bMessageType\x12(\n\x16MessageType_Initialize\x10\0\x1a\x0c\x80\xa6\
\x1d\x01\xb0\xb5\x18\x01\x90\xb5\x18\x01\x12\x1e\n\x10MessageType_Ping\
\x10\x01\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12%\n\x13MessageType_S\
@@ -2007,12 +2019,14 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\x01\x12%\n\x1aMessageType_BenchmarkNames\x10\x8dG\x1a\x04\x80\xa6\x1d\
\x01\x12#\n\x18MessageType_BenchmarkRun\x10\x8eG\x1a\x04\x80\xa6\x1d\x01\
\x12&\n\x1bMessageType_BenchmarkResult\x10\x8fG\x1a\x04\x80\xa6\x1d\x01\
- \x1a\x08\xc8\xf3\x18\x01\xd0\xf3\x18\x01\"\x04\x08Z\x10\\\"\x04\x08G\x10\
- J\"\x04\x08r\x10z\"\x05\x08{\x10\x95\x01\"\x06\x08\xdb\x01\x10\xdb\x01\"\
- \x06\x08\xe0\x01\x10\xe0\x01\"\x06\x08\xac\x02\x10\xb0\x02\"\x06\x08\xb5\
- \x02\x10\xb8\x02\"\x06\x08\xbc\x05\x10\xc5\x05\"\x06\x08\xe9\x07\x10\xf7\
- \x07\"\x06\x08\xfa\x07\x10\xcb\x08B8\n#com.satoshilabs.trezor.lib.protob\
- ufB\rTrezorMessage\x80\xa6\x1d\x01\
+ \x12'\n\x18MessageType_TelemetryGet\x10\xcc\x08\x1a\x08\x80\xa6\x1d\x01\
+ \x90\xb5\x18\x01\x12$\n\x15MessageType_Telemetry\x10\xcd\x08\x1a\x08\x80\
+ \xa6\x1d\x01\x98\xb5\x18\x01\x1a\x08\xc8\xf3\x18\x01\xd0\xf3\x18\x01\"\
+ \x04\x08Z\x10\\\"\x04\x08G\x10J\"\x04\x08r\x10z\"\x05\x08{\x10\x95\x01\"\
+ \x06\x08\xdb\x01\x10\xdb\x01\"\x06\x08\xe0\x01\x10\xe0\x01\"\x06\x08\xac\
+ \x02\x10\xb0\x02\"\x06\x08\xb5\x02\x10\xb8\x02\"\x06\x08\xbc\x05\x10\xc5\
+ \x05\"\x06\x08\xe9\x07\x10\xf7\x07\"\x06\x08\xfa\x07\x10\xcb\x08B8\n#com\
+ .satoshilabs.trezor.lib.protobufB\rTrezorMessage\x80\xa6\x1d\x01\
";
/// `FileDescriptorProto` object which was a source for this generated file
diff --git a/rust/trezor-client/src/protos/generated/messages_telemetry.rs b/rust/trezor-client/src/protos/generated/messages_telemetry.rs
new file mode 100644
index 00000000..71dabec2
--- /dev/null
+++ b/rust/trezor-client/src/protos/generated/messages_telemetry.rs
@@ -0,0 +1,383 @@
+// This file is generated by rust-protobuf 3.7.2. Do not edit
+// .proto file is parsed by protoc 3.19.6
+// @generated
+
+// https://github.com/rust-lang/rust-clippy/issues/702
+#![allow(unknown_lints)]
+#![allow(clippy::all)]
+
+#![allow(unused_attributes)]
+#![cfg_attr(rustfmt, rustfmt::skip)]
+
+#![allow(dead_code)]
+#![allow(missing_docs)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+#![allow(non_upper_case_globals)]
+#![allow(trivial_casts)]
+#![allow(unused_results)]
+#![allow(unused_mut)]
+
+//! Generated file from `messages-telemetry.proto`
+
+/// Generated files are compatible only with the same version
+/// of protobuf runtime.
+const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;
+
+// @@protoc_insertion_point(message:hw.trezor.messages.telemetry.TelemetryGet)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct TelemetryGet {
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.telemetry.TelemetryGet.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a TelemetryGet {
+ fn default() -> &'a TelemetryGet {
+ <TelemetryGet as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl TelemetryGet {
+ pub fn new() -> TelemetryGet {
+ ::std::default::Default::default()
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(0);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TelemetryGet>(
+ "TelemetryGet",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for TelemetryGet {
+ const NAME: &'static str = "TelemetryGet";
+
+ fn is_initialized(&self) -> bool {
+ true
+ }
+
+ fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+ while let Some(tag) = is.read_raw_tag_or_eof()? {
+ match tag {
+ tag => {
+ ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+ },
+ };
+ }
+ ::std::result::Result::Ok(())
+ }
+
+ // Compute sizes of nested messages
+ #[allow(unused_variables)]
+ fn compute_size(&self) -> u64 {
+ let mut my_size = 0;
+ my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+ self.special_fields.cached_size().set(my_size as u32);
+ my_size
+ }
+
+ fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+ os.write_unknown_fields(self.special_fields.unknown_fields())?;
+ ::std::result::Result::Ok(())
+ }
+
+ fn special_fields(&self) -> &::protobuf::SpecialFields {
+ &self.special_fields
+ }
+
+ fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+ &mut self.special_fields
+ }
+
+ fn new() -> TelemetryGet {
+ TelemetryGet::new()
+ }
+
+ fn clear(&mut self) {
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static TelemetryGet {
+ static instance: TelemetryGet = TelemetryGet {
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for TelemetryGet {
+ fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
+ static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
+ descriptor.get(|| file_descriptor().message_by_package_relative_name("TelemetryGet").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for TelemetryGet {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for TelemetryGet {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+// @@protoc_insertion_point(message:hw.trezor.messages.telemetry.Telemetry)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct Telemetry {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.telemetry.Telemetry.min_temp_c)
+ pub min_temp_c: ::std::option::Option<i32>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.telemetry.Telemetry.max_temp_c)
+ pub max_temp_c: ::std::option::Option<i32>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.telemetry.Telemetry.battery_errors)
+ pub battery_errors: ::std::option::Option<u32>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.telemetry.Telemetry.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a Telemetry {
+ fn default() -> &'a Telemetry {
+ <Telemetry as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl Telemetry {
+ pub fn new() -> Telemetry {
+ ::std::default::Default::default()
+ }
+
+ // optional sint32 min_temp_c = 1;
+
+ pub fn min_temp_c(&self) -> i32 {
+ self.min_temp_c.unwrap_or(0)
+ }
+
+ pub fn clear_min_temp_c(&mut self) {
+ self.min_temp_c = ::std::option::Option::None;
+ }
+
+ pub fn has_min_temp_c(&self) -> bool {
+ self.min_temp_c.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_min_temp_c(&mut self, v: i32) {
+ self.min_temp_c = ::std::option::Option::Some(v);
+ }
+
+ // optional sint32 max_temp_c = 2;
+
+ pub fn max_temp_c(&self) -> i32 {
+ self.max_temp_c.unwrap_or(0)
+ }
+
+ pub fn clear_max_temp_c(&mut self) {
+ self.max_temp_c = ::std::option::Option::None;
+ }
+
+ pub fn has_max_temp_c(&self) -> bool {
+ self.max_temp_c.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_max_temp_c(&mut self, v: i32) {
+ self.max_temp_c = ::std::option::Option::Some(v);
+ }
+
+ // optional uint32 battery_errors = 3;
+
+ pub fn battery_errors(&self) -> u32 {
+ self.battery_errors.unwrap_or(0)
+ }
+
+ pub fn clear_battery_errors(&mut self) {
+ self.battery_errors = ::std::option::Option::None;
+ }
+
+ pub fn has_battery_errors(&self) -> bool {
+ self.battery_errors.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_battery_errors(&mut self, v: u32) {
+ self.battery_errors = ::std::option::Option::Some(v);
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(3);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "min_temp_c",
+ |m: &Telemetry| { &m.min_temp_c },
+ |m: &mut Telemetry| { &mut m.min_temp_c },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "max_temp_c",
+ |m: &Telemetry| { &m.max_temp_c },
+ |m: &mut Telemetry| { &mut m.max_temp_c },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "battery_errors",
+ |m: &Telemetry| { &m.battery_errors },
+ |m: &mut Telemetry| { &mut m.battery_errors },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Telemetry>(
+ "Telemetry",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for Telemetry {
+ const NAME: &'static str = "Telemetry";
+
+ fn is_initialized(&self) -> bool {
+ true
+ }
+
+ fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+ while let Some(tag) = is.read_raw_tag_or_eof()? {
+ match tag {
+ 8 => {
+ self.min_temp_c = ::std::option::Option::Some(is.read_sint32()?);
+ },
+ 16 => {
+ self.max_temp_c = ::std::option::Option::Some(is.read_sint32()?);
+ },
+ 24 => {
+ self.battery_errors = ::std::option::Option::Some(is.read_uint32()?);
+ },
+ tag => {
+ ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+ },
+ };
+ }
+ ::std::result::Result::Ok(())
+ }
+
+ // Compute sizes of nested messages
+ #[allow(unused_variables)]
+ fn compute_size(&self) -> u64 {
+ let mut my_size = 0;
+ if let Some(v) = self.min_temp_c {
+ my_size += ::protobuf::rt::sint32_size(1, v);
+ }
+ if let Some(v) = self.max_temp_c {
+ my_size += ::protobuf::rt::sint32_size(2, v);
+ }
+ if let Some(v) = self.battery_errors {
+ my_size += ::protobuf::rt::uint32_size(3, v);
+ }
+ my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+ self.special_fields.cached_size().set(my_size as u32);
+ my_size
+ }
+
+ fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+ if let Some(v) = self.min_temp_c {
+ os.write_sint32(1, v)?;
+ }
+ if let Some(v) = self.max_temp_c {
+ os.write_sint32(2, v)?;
+ }
+ if let Some(v) = self.battery_errors {
+ os.write_uint32(3, v)?;
+ }
+ os.write_unknown_fields(self.special_fields.unknown_fields())?;
+ ::std::result::Result::Ok(())
+ }
+
+ fn special_fields(&self) -> &::protobuf::SpecialFields {
+ &self.special_fields
+ }
+
+ fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+ &mut self.special_fields
+ }
+
+ fn new() -> Telemetry {
+ Telemetry::new()
+ }
+
+ fn clear(&mut self) {
+ self.min_temp_c = ::std::option::Option::None;
+ self.max_temp_c = ::std::option::Option::None;
+ self.battery_errors = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static Telemetry {
+ static instance: Telemetry = Telemetry {
+ min_temp_c: ::std::option::Option::None,
+ max_temp_c: ::std::option::Option::None,
+ battery_errors: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for Telemetry {
+ fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
+ static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
+ descriptor.get(|| file_descriptor().message_by_package_relative_name("Telemetry").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for Telemetry {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for Telemetry {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+static file_descriptor_proto_data: &'static [u8] = b"\
+ \n\x18messages-telemetry.proto\x12\x1chw.trezor.messages.telemetry\x1a\r\
+ options.proto\"\x0e\n\x0cTelemetryGet\"n\n\tTelemetry\x12\x1c\n\nmin_tem\
+ p_c\x18\x01\x20\x01(\x11R\x08minTempC\x12\x1c\n\nmax_temp_c\x18\x02\x20\
+ \x01(\x11R\x08maxTempC\x12%\n\x0ebattery_errors\x18\x03\x20\x01(\rR\rbat\
+ teryErrorsBA\n#com.satoshilabs.trezor.lib.protobufB\x16TrezorMessageTele\
+ metry\x80\xa6\x1d\x01\
+";
+
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
+ static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();
+ file_descriptor_proto_lazy.get(|| {
+ ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+ })
+}
+
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {
+ static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();
+ static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();
+ file_descriptor.get(|| {
+ let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+ let mut deps = ::std::vec::Vec::with_capacity(1);
+ deps.push(super::options::file_descriptor().clone());
+ let mut messages = ::std::vec::Vec::with_capacity(2);
+ messages.push(TelemetryGet::generated_message_descriptor_data());
+ messages.push(Telemetry::generated_message_descriptor_data());
+ let mut enums = ::std::vec::Vec::with_capacity(0);
+ ::protobuf::reflect::GeneratedFileDescriptor::new_generated(
+ file_descriptor_proto(),
+ deps,
+ messages,
+ enums,
+ )
+ });
+ ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
+ })
+}
diff --git a/rust/trezor-client/src/protos/mod.rs b/rust/trezor-client/src/protos/mod.rs
index 3a04f0ac..35511958 100644
--- a/rust/trezor-client/src/protos/mod.rs
+++ b/rust/trezor-client/src/protos/mod.rs
@@ -25,6 +25,7 @@ mod generated {
messages_management
messages_benchmark
messages_thp
+ messages_telemetry
options
"bitcoin" => messages_bitcoin
Why this scored 19/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.