diff --git a/applications/main/subghz/scenes/subghz_scene_signal_settings.c b/applications/main/subghz/scenes/subghz_scene_signal_settings.c index 382289513..cec11533b 100644 --- a/applications/main/subghz/scenes/subghz_scene_signal_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_signal_settings.c @@ -232,7 +232,14 @@ void subghz_scene_signal_settings_on_enter(void* context) { } else { place = furi_string_search_str(tmp_text, "Cnt:", 0); if(place > 0) { - furi_string_set_n(textCnt, tmp_text, place + 4, 8); + // defence from memory leaks. Check can we take 8 symbols after 'Cnt:' ? + // if from current place to end of stirngs more than 8 symbols - ok, if not - just take symbols from current place to end of string. + // +4 - its 'Cnt:' lenght + uint8_t n_symbols_taken = 8; + if(sizeof(tmp_text) - (place + 4) < 8) { + n_symbols_taken = sizeof(tmp_text) - (place + 4); + } + furi_string_set_n(textCnt, tmp_text, place + 4, n_symbols_taken); furi_string_trim(textCnt); FURI_LOG_D( TAG, @@ -278,7 +285,7 @@ void subghz_scene_signal_settings_on_enter(void* context) { }; } else { - FURI_LOG_D(TAG, "Counter not available for this protocol"); + FURI_LOG_D(TAG, "Counter editor not available for this protocol"); } } @@ -335,6 +342,7 @@ bool subghz_scene_signal_settings_on_event(void* context, SceneManagerEvent even // restore user definded counter increase value (mult) furi_hal_subghz_set_rolling_counter_mult(tmp_counter); + break; case 4: // the same for 32 bit Counter diff --git a/lib/subghz/protocols/alutech_at_4n.c b/lib/subghz/protocols/alutech_at_4n.c index fa64f89f3..730f68f2b 100644 --- a/lib/subghz/protocols/alutech_at_4n.c +++ b/lib/subghz/protocols/alutech_at_4n.c @@ -278,16 +278,10 @@ static bool subghz_protocol_alutech_at_4n_gen_data( if(alutech_at4n_counter_mode == 0) { // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - } else if( - (instance->generic.cnt >= 0xFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } } else { if((instance->generic.cnt + 0x1) > 0xFFFF) { diff --git a/lib/subghz/protocols/came_atomo.c b/lib/subghz/protocols/came_atomo.c index e829c4dfe..1343f2c45 100644 --- a/lib/subghz/protocols/came_atomo.c +++ b/lib/subghz/protocols/came_atomo.c @@ -190,16 +190,10 @@ static void subghz_protocol_encoder_came_atomo_get_upload( if(came_atomo_counter_mode == 0) { // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - } else if( - (instance->generic.cnt >= 0xFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } } else { if((instance->generic.cnt + 0x1) > 0xFFFF) { diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 9ddccad73..5f0a217f4 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -138,40 +138,35 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst uint8_t data_prg[8]; data_prg[0] = 0x00; + // faac slh protocol have 20-bit counter so we take only 20 bits from mult (by AND 0xFFFFF) if(allow_zero_seed || (instance->generic.seed != 0x0)) { + // check OFEX mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(instance->generic.cnt < 0xFFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > - 0xFFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - } else if( - (instance->generic.cnt >= 0xFFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { + if((instance->generic.cnt + + (furi_hal_subghz_get_rolling_counter_mult() & 0xFFFFF)) > 0xFFFFF) { instance->generic.cnt = 0; + } else { + instance->generic.cnt += + (furi_hal_subghz_get_rolling_counter_mult() & 0xFFFFF); } } else { + // to do OFEX mode instance->generic.cnt += 1; } if(temp_counter_backup != 0x0) { + // check OFEX mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(temp_counter_backup < 0xFFFFF) { - if((temp_counter_backup + furi_hal_subghz_get_rolling_counter_mult()) > - 0xFFFFF) { - temp_counter_backup = 0; - } else { - temp_counter_backup += furi_hal_subghz_get_rolling_counter_mult(); - } - } else if( - (temp_counter_backup >= 0xFFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { + if((temp_counter_backup + + (furi_hal_subghz_get_rolling_counter_mult() & 0xFFFFF)) > 0xFFFFF) { temp_counter_backup = 0; + } else { + temp_counter_backup += + (furi_hal_subghz_get_rolling_counter_mult() & 0xFFFFF); } } else { + // todo OFEX mode temp_counter_backup += 1; } } @@ -239,21 +234,19 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst fixx[i] = (fix >> (shiftby -= 4)) & 0xF; } + // faac slh protocol have 20-bit counter so we take only 20 bits from mult (by AND 0xFFFFF) if(allow_zero_seed || (instance->generic.seed != 0x0)) { - if(!(furi_hal_subghz_get_rolling_counter_mult() >= 0xFFFE)) { - if(instance->generic.cnt < 0xFFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > - 0xFFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - } else if( - (instance->generic.cnt >= 0xFFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { + // check OFEX mode + if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { + if((instance->generic.cnt + (furi_hal_subghz_get_rolling_counter_mult() & 0xFFFFF)) > + 0xFFFFF) { instance->generic.cnt = 0; + } else { + instance->generic.cnt += (furi_hal_subghz_get_rolling_counter_mult() & 0xFFFFF); } + } else { + // OFEX mode if(instance->generic.cnt < 0xFFFFF) { if((instance->generic.cnt + 0xFFFFF) > 0xFFFFF) { instance->generic.cnt = 0; diff --git a/lib/subghz/protocols/hay21.c b/lib/subghz/protocols/hay21.c index b6640e570..d397148bb 100644 --- a/lib/subghz/protocols/hay21.c +++ b/lib/subghz/protocols/hay21.c @@ -147,19 +147,14 @@ static void subghz_protocol_encoder_hay21_get_upload(SubGhzProtocolEncoderHay21* // Counter increment // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(instance->generic.cnt < 0xF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - if(furi_hal_subghz_get_rolling_counter_mult() >= 0xF) { - instance->generic.cnt = 0xF; - } - } else if(instance->generic.cnt >= 0xF) { + //not matter how big and long mult - we take only 4 bits ( AND 0xF) beacose hay21 counter have only 4 bits long (0..F) + if((instance->generic.cnt + (furi_hal_subghz_get_rolling_counter_mult() & 0xF)) > 0xF) { instance->generic.cnt = 0; + } else { + instance->generic.cnt += (furi_hal_subghz_get_rolling_counter_mult() & 0xF); } } else { + // OFEX mode if((instance->generic.cnt + 0x1) > 0xF) { instance->generic.cnt = 0; } else if(instance->generic.cnt >= 0x1 && instance->generic.cnt != 0xE) { diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index 70ccc2f82..71342b1d0 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -187,20 +187,11 @@ static bool subghz_protocol_keeloq_gen_data( if(keeloq_counter_mode == 0) { // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - // If counter is 0xFFFF we will reset it to 0 - if(instance->generic.cnt < 0xFFFF) { - // Increase counter with value set in global settings (mult) - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > - 0xFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - } else if( - (instance->generic.cnt >= 0xFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { - instance->generic.cnt = 0; - } + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } } else { if((instance->generic.cnt + 0x1) > 0xFFFF) { instance->generic.cnt = 0; diff --git a/lib/subghz/protocols/kia.c b/lib/subghz/protocols/kia.c index 5b1c9887d..0b882a48e 100644 --- a/lib/subghz/protocols/kia.c +++ b/lib/subghz/protocols/kia.c @@ -256,11 +256,13 @@ void subghz_protocol_decoder_kia_get_string(void* context, FuriString* output) { uint32_t code_found_hi = instance->generic.data >> 32; uint32_t code_found_lo = instance->generic.data & 0x00000000ffffffff; + // use 'Count:' instead of 'Cnt:' to exclude this protocol counter from Counter edit furi_string_cat_printf( output, "%s %dbit\r\n" "Key:%08lX%08lX\r\n" - "Sn:%07lX Btn:%X Cnt:%04lX\r\n", + "Sn:%07lX Btn:%X\r\n" + "Count:%04lX\r\n", instance->generic.protocol_name, instance->generic.data_count_bit, code_found_hi, diff --git a/lib/subghz/protocols/kinggates_stylo_4k.c b/lib/subghz/protocols/kinggates_stylo_4k.c index 83dbd5298..e864039ea 100644 --- a/lib/subghz/protocols/kinggates_stylo_4k.c +++ b/lib/subghz/protocols/kinggates_stylo_4k.c @@ -157,17 +157,11 @@ static bool subghz_protocol_kinggates_stylo_4k_gen_data( // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(instance->generic.cnt < 0xFFFF) { if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } - } else if( - (instance->generic.cnt >= 0xFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { - instance->generic.cnt = 0; - } } else { if((instance->generic.cnt + 0x1) > 0xFFFF) { instance->generic.cnt = 0; diff --git a/lib/subghz/protocols/nice_flor_s.c b/lib/subghz/protocols/nice_flor_s.c index 92ca20838..aebb97029 100644 --- a/lib/subghz/protocols/nice_flor_s.c +++ b/lib/subghz/protocols/nice_flor_s.c @@ -155,16 +155,10 @@ static void subghz_protocol_encoder_nice_flor_s_get_upload( if(nice_flors_counter_mode == 0) { // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - } else if( - (instance->generic.cnt >= 0xFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } } else { if((instance->generic.cnt + 0x1) > 0xFFFF) { diff --git a/lib/subghz/protocols/phoenix_v2.c b/lib/subghz/protocols/phoenix_v2.c index 6ee6e97d2..0bc62e487 100644 --- a/lib/subghz/protocols/phoenix_v2.c +++ b/lib/subghz/protocols/phoenix_v2.c @@ -254,17 +254,11 @@ static bool // Reconstruction of the data // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(instance->generic.cnt < 0xFFFF) { if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } - } else if( - (instance->generic.cnt >= 0xFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { - instance->generic.cnt = 0; - } } else { if((instance->generic.cnt + 0x1) > 0xFFFF) { instance->generic.cnt = 0; diff --git a/lib/subghz/protocols/scher_khan.c b/lib/subghz/protocols/scher_khan.c index 9df7c28c6..b8a4e423a 100644 --- a/lib/subghz/protocols/scher_khan.c +++ b/lib/subghz/protocols/scher_khan.c @@ -297,11 +297,12 @@ void subghz_protocol_decoder_scher_khan_get_string(void* context, FuriString* ou subghz_protocol_scher_khan_check_remote_controller( &instance->generic, &instance->protocol_name); + // use 'Count:' instead of 'Cnt:' to exclude this protocol counter from Counter edit furi_string_cat_printf( output, "%s %dbit\r\n" "Key:0x%lX%08lX\r\n" - "Sn:%07lX Btn:%X Cnt:%04lX\r\n" + "Sn:%07lX Btn:%X Count:%04lX\r\n" "Pt: %s\r\n", instance->generic.protocol_name, instance->generic.data_count_bit, diff --git a/lib/subghz/protocols/secplus_v1.c b/lib/subghz/protocols/secplus_v1.c index 21c9dbb1c..a352cae1b 100644 --- a/lib/subghz/protocols/secplus_v1.c +++ b/lib/subghz/protocols/secplus_v1.c @@ -596,10 +596,12 @@ void subghz_protocol_decoder_secplus_v1_get_string(void* context, FuriString* ou } else { furi_string_cat_printf(output, "\r\n"); } + + // use 'Count:' instead of 'Cnt:' to exclude this protocol counter from Counter edit furi_string_cat_printf( output, "Sn:0x%08lX\r\n" - "Cnt:%03lX " + "Count:%03lX " "SwID:0x%X\r\n", instance->generic.serial, instance->generic.cnt, @@ -618,7 +620,7 @@ void subghz_protocol_decoder_secplus_v1_get_string(void* context, FuriString* ou furi_string_cat_printf( output, "Sn:0x%08lX\r\n" - "Cnt:%03lX " + "Count:%03lX " "SwID:0x%X\r\n", instance->generic.serial, instance->generic.cnt, diff --git a/lib/subghz/protocols/secplus_v2.c b/lib/subghz/protocols/secplus_v2.c index ee4a19d7c..5d8980efb 100644 --- a/lib/subghz/protocols/secplus_v2.c +++ b/lib/subghz/protocols/secplus_v2.c @@ -401,10 +401,18 @@ static void subghz_protocol_secplus_v2_encode(SubGhzProtocolEncoderSecPlus_v2* i uint8_t roll_1[9] = {0}; uint8_t roll_2[9] = {0}; - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - + // ---Experemental case - we dont know counter size exactly, so just will be think that is "FF FF FF F" + if((instance->generic.cnt + (furi_hal_subghz_get_rolling_counter_mult() & 0xFFFFFFF)) > + 0xFFFFFFF) { + instance->generic.cnt = 0xE500000; + } else { + instance->generic.cnt += (furi_hal_subghz_get_rolling_counter_mult() & 0xFFFFFFF); + } + // --- instead of : + //instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); //ToDo it is not known what value the counter starts - if(instance->generic.cnt > 0xFFFFFFF) instance->generic.cnt = 0xE500000; + //if(instance->generic.cnt > 0xFFFFFFF) instance->generic.cnt = 0xE500000; + uint32_t rolling = subghz_protocol_blocks_reverse_key(instance->generic.cnt, 28); for(int8_t i = 17; i > -1; i--) { @@ -939,13 +947,14 @@ void subghz_protocol_decoder_secplus_v2_get_string(void* context, FuriString* ou SubGhzProtocolDecoderSecPlus_v2* instance = context; subghz_protocol_secplus_v2_remote_controller(&instance->generic, instance->secplus_packet_1); + // need to research or practice check how much bits in counter furi_string_cat_printf( output, "%s %db\r\n" "Pk1:0x%lX%08lX\r\n" "Pk2:0x%lX%08lX\r\n" "Sn:0x%08lX Btn:0x%01X\r\n" - "Cnt:%03lX\r\n", + "Cnt:%07lX\r\n", instance->generic.protocol_name, instance->generic.data_count_bit, diff --git a/lib/subghz/protocols/somfy_keytis.c b/lib/subghz/protocols/somfy_keytis.c index 7c00a4b71..a66ba2b15 100644 --- a/lib/subghz/protocols/somfy_keytis.c +++ b/lib/subghz/protocols/somfy_keytis.c @@ -132,16 +132,10 @@ static bool // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - } else if( - (instance->generic.cnt >= 0xFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } } else { if((instance->generic.cnt + 0x1) > 0xFFFF) { diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index cbf110053..d8ae9ad28 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -126,16 +126,10 @@ static bool subghz_protocol_somfy_telis_gen_data( // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - } else if( - (instance->generic.cnt >= 0xFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } } else { if((instance->generic.cnt + 0x1) > 0xFFFF) { diff --git a/lib/subghz/protocols/star_line.c b/lib/subghz/protocols/star_line.c index 56465481b..4f5834d17 100644 --- a/lib/subghz/protocols/star_line.c +++ b/lib/subghz/protocols/star_line.c @@ -131,16 +131,10 @@ static bool subghz_protocol_star_line_gen_data(SubGhzProtocolEncoderStarLine* instance, uint8_t btn) { // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { - if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - } else if( - (instance->generic.cnt >= 0xFFFF) && - (furi_hal_subghz_get_rolling_counter_mult() != 0)) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } } else { if((instance->generic.cnt + 0x1) > 0xFFFF) {