From 015ee6e7e48118b74b78c32c769b78350f20edb0 Mon Sep 17 00:00:00 2001 From: Dmitry422 Date: Fri, 9 Jan 2026 00:39:44 +0700 Subject: [PATCH] 1. Add debug status to Desktop clock like "D hh:mm" 2. Alutech_at_4n protocol acceleration --- applications/services/desktop/desktop.c | 16 +++--- lib/subghz/protocols/alutech_at_4n.c | 67 ++++++++++++++++--------- 2 files changed, 52 insertions(+), 31 deletions(-) diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index eed5537c6..41cf3f7d8 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -105,14 +105,18 @@ static void desktop_clock_draw_callback(Canvas* canvas, void* context) { } char buffer[20]; - snprintf(buffer, sizeof(buffer), "%02u:%02u", hour, desktop->clock.minute); + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { + snprintf(buffer, sizeof(buffer), "D %02u:%02u", hour, desktop->clock.minute); + } else { + snprintf(buffer, sizeof(buffer), "%02u:%02u", hour, desktop->clock.minute); + } - view_port_set_width( - desktop->clock_viewport, - canvas_string_width(canvas, buffer) - 1 + (desktop->clock.minute % 10 == 1)); + view_port_set_width( + desktop->clock_viewport, + canvas_string_width(canvas, buffer) - 1 + (desktop->clock.minute % 10 == 1)); - canvas_draw_str_aligned(canvas, 0, 8, AlignLeft, AlignBottom, buffer); -} + canvas_draw_str_aligned(canvas, 0, 8, AlignLeft, AlignBottom, buffer); + } static void desktop_stealth_mode_icon_draw_callback(Canvas* canvas, void* context) { UNUSED(context); diff --git a/lib/subghz/protocols/alutech_at_4n.c b/lib/subghz/protocols/alutech_at_4n.c index ccbe2ccf9..6175cc47b 100644 --- a/lib/subghz/protocols/alutech_at_4n.c +++ b/lib/subghz/protocols/alutech_at_4n.c @@ -9,7 +9,8 @@ #define TAG "SubGhzProtocoAlutech_at_4n" -#define SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE 0xFFFFFFFF +#define SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE 0xFFFFFFFFFFFFFFFF +#define SUBGHZ_ALUTECH_AT_4N_RAINBOW_TABLE_SIZE_BYTES 32 static const SubGhzBlockConst subghz_protocol_alutech_at_4n_const = { .te_short = 400, @@ -141,26 +142,20 @@ LevelDuration subghz_protocol_encoder_alutech_at_4n_yield(void* context) { /** * Read bytes from rainbow table - * @param file_name Full path to rainbow table the file + * @param buffer Pointer to decrypted magic data buffer * @param number_alutech_at_4n_magic_data number in the array * @return alutech_at_4n_magic_data */ -static uint32_t subghz_protocol_alutech_at_4n_get_magic_data_in_file( - const char* file_name, +static uint32_t subghz_protocol_alutech_at_4n_get_magic_data_from_buffer( + uint8_t* buffer, uint8_t number_alutech_at_4n_magic_data) { - if(!strcmp(file_name, "")) return SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE; - - uint8_t buffer[sizeof(uint32_t)] = {0}; uint32_t address = number_alutech_at_4n_magic_data * sizeof(uint32_t); uint32_t alutech_at_4n_magic_data = 0; - if(subghz_keystore_raw_get_data(file_name, address, buffer, sizeof(uint32_t))) { - for(size_t i = 0; i < sizeof(uint32_t); i++) { - alutech_at_4n_magic_data = (alutech_at_4n_magic_data << 8) | buffer[i]; - } - } else { - alutech_at_4n_magic_data = SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE; + for(size_t i = address; i < (address + sizeof(uint32_t)); i++) { + alutech_at_4n_magic_data = (alutech_at_4n_magic_data << 8) | buffer[i]; } + return alutech_at_4n_magic_data; } @@ -195,17 +190,28 @@ static uint8_t subghz_protocol_alutech_at_4n_decrypt_data_crc(uint8_t data) { } static uint64_t subghz_protocol_alutech_at_4n_decrypt(uint64_t data, const char* file_name) { + if(!strcmp(file_name, "")) return SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE; + + uint8_t buffer[SUBGHZ_ALUTECH_AT_4N_RAINBOW_TABLE_SIZE_BYTES] = {0}; + uint8_t* buffer_ptr = (uint8_t*)&buffer; + + if(subghz_keystore_raw_get_data( + file_name, 0, buffer, SUBGHZ_ALUTECH_AT_4N_RAINBOW_TABLE_SIZE_BYTES)) { + } else { + return SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE; + } + uint8_t* p = (uint8_t*)&data; uint32_t data1 = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; uint32_t data2 = p[4] << 24 | p[5] << 16 | p[6] << 8 | p[7]; uint32_t data3 = 0; uint32_t magic_data[] = { - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 0), - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 1), - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 2), - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 3), - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 4), - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 5)}; + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 0), + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 1), + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 2), + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 3), + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 4), + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 5)}; uint32_t i = magic_data[0]; do { @@ -230,17 +236,28 @@ static uint64_t subghz_protocol_alutech_at_4n_decrypt(uint64_t data, const char* } static uint64_t subghz_protocol_alutech_at_4n_encrypt(uint64_t data, const char* file_name) { + if(!strcmp(file_name, "")) return SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE; + + uint8_t buffer[SUBGHZ_ALUTECH_AT_4N_RAINBOW_TABLE_SIZE_BYTES] = {0}; + uint8_t* buffer_ptr = (uint8_t*)&buffer; + + if(subghz_keystore_raw_get_data( + file_name, 0, buffer, SUBGHZ_ALUTECH_AT_4N_RAINBOW_TABLE_SIZE_BYTES)) { + } else { + return SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE; + } + uint8_t* p = (uint8_t*)&data; uint32_t data1 = 0; uint32_t data2 = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; uint32_t data3 = p[4] << 24 | p[5] << 16 | p[6] << 8 | p[7]; uint32_t magic_data[] = { - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 6), - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 4), - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 5), - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 1), - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 2), - subghz_protocol_alutech_at_4n_get_magic_data_in_file(file_name, 0)}; + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 6), + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 4), + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 5), + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 1), + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 2), + subghz_protocol_alutech_at_4n_get_magic_data_from_buffer(buffer_ptr, 0)}; do { data1 = data1 + magic_data[0];