From 58edc59ae643bcd59a0e1be4025766fdf3f1fddf Mon Sep 17 00:00:00 2001 From: Markus Birth Date: Sat, 15 Aug 2026 01:16:00 +0100 Subject: [PATCH] Move UID and MFG below usage data and separate usage from internals Signed-off-by: Markus Birth --- scenes/sonicare_scene_read_complete.c | 46 ++++++++++++++------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/scenes/sonicare_scene_read_complete.c b/scenes/sonicare_scene_read_complete.c index 24359d9..ab17265 100644 --- a/scenes/sonicare_scene_read_complete.c +++ b/scenes/sonicare_scene_read_complete.c @@ -75,28 +75,6 @@ void sonicare_scene_read_complete_on_enter(void* context) { furi_string_cat_printf(temp_str, "\e#Unknown brush: 0x%02x\n", brush_id); } - // UID - furi_string_cat_str(temp_str, "UID:"); - format_bytes(temp_str, ul_data->iso14443_3a_data->uid, ul_data->iso14443_3a_data->uid_len); - furi_string_cat_str(temp_str, "\n"); - - // Cache UID + MFG for the reset scene's password derivation. - // MFG (10 bytes, e.g. "221214 12K") = page[0x21].data[2..3] + - // page[0x22].data[0..3] + page[0x23].data[0..3] - // (first 2 bytes of page 0x21 are the max-usage value, not MFG). - memcpy(app->sonicare_uid, ul_data->iso14443_3a_data->uid, 7); - memcpy(app->sonicare_mfg + 0, ul_data->page[0x21].data + 2, 2); - memcpy(app->sonicare_mfg + 2, ul_data->page[0x22].data, 4); - memcpy(app->sonicare_mfg + 6, ul_data->page[0x23].data, 4); - - // Manufacturing Code - furi_string_cat_str(temp_str, "MFG: "); - FuriString* serial_no = furi_string_alloc(); - furi_string_cat_str(serial_no, (char*)(ul_data->page[0x21].data)); - furi_string_right(serial_no, 2); - furi_string_cat(temp_str, serial_no); - furi_string_cat_printf(temp_str, "\n"); - // Usage uint16_t seconds = ul_data->page[0x24].data[1]*256 + ul_data->page[0x24].data[0]; uint16_t brushes = seconds / 120; // one brush = 2 minutes @@ -124,6 +102,30 @@ void sonicare_scene_read_complete_on_enter(void* context) { // TODO: Maybe show "replace soon" marker if 170 brushes or more? // TODO: Maybe show "replace head" marker if 180 brushes or more? + furi_string_cat_str(temp_str, "____________________\n"); + + // UID + furi_string_cat_str(temp_str, "UID:"); + format_bytes(temp_str, ul_data->iso14443_3a_data->uid, ul_data->iso14443_3a_data->uid_len); + furi_string_cat_str(temp_str, "\n"); + + // Cache UID + MFG for the reset scene's password derivation. + // MFG (10 bytes, e.g. "221214 12K") = page[0x21].data[2..3] + + // page[0x22].data[0..3] + page[0x23].data[0..3] + // (first 2 bytes of page 0x21 are the max-usage value, not MFG). + memcpy(app->sonicare_uid, ul_data->iso14443_3a_data->uid, 7); + memcpy(app->sonicare_mfg + 0, ul_data->page[0x21].data + 2, 2); + memcpy(app->sonicare_mfg + 2, ul_data->page[0x22].data, 4); + memcpy(app->sonicare_mfg + 6, ul_data->page[0x23].data, 4); + + // Manufacturing Code + furi_string_cat_str(temp_str, "MFG: "); + FuriString* serial_no = furi_string_alloc(); + furi_string_cat_str(serial_no, (char*)(ul_data->page[0x21].data)); + furi_string_right(serial_no, 2); + furi_string_cat(temp_str, serial_no); + furi_string_cat_printf(temp_str, "\n"); + // NFC password uint32_t unlock_pwd_big = get_sonicare_password((uint8_t*)ul_data->iso14443_3a_data->uid, (uint8_t*)furi_string_get_cstr(serial_no)); FURI_LOG_D("sonicare_scene_read_complete", "NFC unlock password: 0x%08lx", unlock_pwd_big);