diff --git a/core/SConscript.firmware b/core/SConscript.firmware index 386d7aa330..719135e29c 100644 --- a/core/SConscript.firmware +++ b/core/SConscript.firmware @@ -67,6 +67,7 @@ FEATURES_WANTED = [ "serial_number", "storage", "suspend", + 'telemetry', "tropic", "usb", "usb_iface_wire", @@ -748,6 +749,8 @@ if FROZEN: )) ) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/misc/*.py')) + if 'telemetry' in FEATURES_AVAILABLE: + SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/telemetry/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/bitcoin/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/bitcoin/*/*.py', exclude=[ diff --git a/core/embed/rust/Cargo.toml b/core/embed/rust/Cargo.toml index 9ebd6bab87..40595f0edd 100644 --- a/core/embed/rust/Cargo.toml +++ b/core/embed/rust/Cargo.toml @@ -54,6 +54,7 @@ smp = [] tropic = [] serial_number = [] storage = [] +telemetry = [] translations = ["crypto"] secmon_layout = [] dbg_console = [] diff --git a/core/embed/upymod/modtrezorutils/modtrezorutils.c b/core/embed/upymod/modtrezorutils/modtrezorutils.c index 44ac582b2c..2db078fe59 100644 --- a/core/embed/upymod/modtrezorutils/modtrezorutils.c +++ b/core/embed/upymod/modtrezorutils/modtrezorutils.c @@ -46,6 +46,10 @@ #include "blake2s.h" #include "memzero.h" +#ifdef USE_TELEMETRY +#include +#endif + #ifdef USE_BLE #include #endif @@ -63,6 +67,30 @@ /// from trezor import utils +#ifdef USE_TELEMETRY +/// def telemetry_get() -> tuple[int, int, int] | None: +/// """ +/// Retrieves the stored telemetry data. Returns a tuple +/// (min_temp_milli_c, max_temp_milli_c, battery_errors) +/// or None if telemetry is not available. +/// """ +STATIC mp_obj_t mod_trezorutils_telemetry_get(void) { + telemetry_data_t data; + if (!telemetry_get(&data)) { + return mp_const_none; + } + + mp_obj_t tuple[3]; + tuple[0] = mp_obj_new_int((int32_t)(data.min_temp_c * 1000.0f)); + tuple[1] = mp_obj_new_int((int32_t)(data.max_temp_c * 1000.0f)); + tuple[2] = mp_obj_new_int(data.battery_errors.all); + + return mp_obj_new_tuple(3, tuple); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_trezorutils_telemetry_get_obj, + mod_trezorutils_telemetry_get); +#endif + /// def consteq(sec: AnyBytes, pub: AnyBytes) -> bool: /// """ /// Compares the private information in `sec` with public, user-provided @@ -763,6 +791,8 @@ STATIC const mp_obj_tuple_t mod_trezorutils_version_obj = { /// """Whether a debug console is enabled.""" /// USE_APP_LOADING: bool /// """Whether the firmware supports loading 3rd-party applications.""" +/// USE_TELEMETRY: bool +/// """Whether a telemetry is supported.""" /// MODEL: str /// """Model name.""" /// MODEL_FULL_NAME: str @@ -831,6 +861,13 @@ STATIC const mp_rom_map_elem_t mp_module_trezorutils_globals_table[] = { MP_ROM_PTR(&mod_trezorutils_bootloader_locked_obj)}, {MP_ROM_QSTR(MP_QSTR_notify_send), MP_ROM_PTR(&mod_trezorutils_notify_send_obj)}, +#ifdef USE_TELEMETRY + {MP_ROM_QSTR(MP_QSTR_telemetry_get), + MP_ROM_PTR(&mod_trezorutils_telemetry_get_obj)}, + {MP_ROM_QSTR(MP_QSTR_USE_TELEMETRY), mp_const_true}, +#else + {MP_ROM_QSTR(MP_QSTR_USE_TELEMETRY), mp_const_false}, +#endif {MP_ROM_QSTR(MP_QSTR_NOTIFY_BOOT), MP_ROM_INT(NOTIFY_BOOT)}, {MP_ROM_QSTR(MP_QSTR_NOTIFY_UNLOCK), MP_ROM_INT(NOTIFY_UNLOCK)}, {MP_ROM_QSTR(MP_QSTR_NOTIFY_LOCK), MP_ROM_INT(NOTIFY_LOCK)}, diff --git a/core/mocks/generated/trezorutils.pyi b/core/mocks/generated/trezorutils.pyi index d59a0c5fac..942b2a8bc4 100644 --- a/core/mocks/generated/trezorutils.pyi +++ b/core/mocks/generated/trezorutils.pyi @@ -10,6 +10,15 @@ def meminfo(filename: str | None) -> None: from trezor import utils +# upymod/modtrezorutils/modtrezorutils.c +def telemetry_get() -> tuple[int, int, int] | None: + """ + Retrieves the stored telemetry data. Returns a tuple + (min_temp_milli_c, max_temp_milli_c, battery_errors) + or None if telemetry is not available. + """ + + # upymod/modtrezorutils/modtrezorutils.c def consteq(sec: AnyBytes, pub: AnyBytes) -> bool: """ @@ -268,6 +277,8 @@ USE_DBG_CONSOLE: bool """Whether a debug console is enabled.""" USE_APP_LOADING: bool """Whether the firmware supports loading 3rd-party applications.""" +USE_TELEMETRY: bool +"""Whether a telemetry is supported.""" MODEL: str """Model name.""" MODEL_FULL_NAME: str diff --git a/core/site_scons/models/T3W1/trezor_t3w1_revC.py b/core/site_scons/models/T3W1/trezor_t3w1_revC.py index f05ed85aa8..b559fd60ae 100644 --- a/core/site_scons/models/T3W1/trezor_t3w1_revC.py +++ b/core/site_scons/models/T3W1/trezor_t3w1_revC.py @@ -241,6 +241,7 @@ def configure( sources += ["embed/sec/telemetry/telemetry.c"] paths += ["embed/sec/telemetry/inc"] defines += [("USE_TELEMETRY", "1")] + features_available.append("telemetry") defines += [ "FRAMEBUFFER", diff --git a/core/src/apps/telemetry/__init__.py b/core/src/apps/telemetry/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core/src/apps/telemetry/get_telemetry.py b/core/src/apps/telemetry/get_telemetry.py new file mode 100644 index 0000000000..143b061c6a --- /dev/null +++ b/core/src/apps/telemetry/get_telemetry.py @@ -0,0 +1,20 @@ +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from trezor.messages import Telemetry, TelemetryGet + + +async def get_telemetry(msg: TelemetryGet) -> Telemetry: + from trezor.messages import Telemetry + from trezor.utils import telemetry_get + + data = telemetry_get() + if data: + min_temp_c, max_temp_c, battery_errors = data + return Telemetry( + min_temp_c=min_temp_c, + max_temp_c=max_temp_c, + battery_errors=battery_errors, + ) + else: + return Telemetry() diff --git a/core/src/apps/workflow_handlers.py b/core/src/apps/workflow_handlers.py index b18596b3ac..59f64429f1 100644 --- a/core/src/apps/workflow_handlers.py +++ b/core/src/apps/workflow_handlers.py @@ -64,6 +64,9 @@ def _find_message_handler_module(msg_type: int) -> str: if msg_type == MessageType.ShowDeviceTutorial: return "apps.management.show_tutorial" + if utils.USE_TELEMETRY and msg_type == MessageType.TelemetryGet: + return "apps.telemetry.get_telemetry" + if utils.USE_BACKLIGHT and msg_type == MessageType.SetBrightness: return "apps.management.set_brightness" diff --git a/core/src/trezor/utils.py b/core/src/trezor/utils.py index 062be0a3d1..6a495f2e03 100644 --- a/core/src/trezor/utils.py +++ b/core/src/trezor/utils.py @@ -33,6 +33,7 @@ from trezorutils import ( # noqa: F401 USE_RGB_LED, USE_SD_CARD, USE_SERIAL_NUMBER, + USE_TELEMETRY, USE_THP, USE_TOUCH, USE_TROPIC, @@ -57,6 +58,9 @@ from trezorutils import ( # noqa: F401 unit_production_date, ) +if USE_TELEMETRY: + from trezorutils import telemetry_get # noqa: F401 + if USE_NRF: from trezorutils import nrf_get_version # noqa: F401