From 63eced449e894eb134bbc17efc89313611bb5327 Mon Sep 17 00:00:00 2001 From: DerSkythe Date: Wed, 19 Oct 2022 09:39:11 +0400 Subject: [PATCH 1/7] Applied OFW version but not yet resized to correct view --- .../subghz_frequency_analyzer_worker.c | 24 +- .../subghz_frequency_analyzer_worker.h | 7 +- .../scenes/subghz_scene_frequency_analyzer.c | 35 ++- .../subghz/views/subghz_frequency_analyzer.c | 253 +++++++++++------- .../subghz/views/subghz_frequency_analyzer.h | 10 +- 5 files changed, 221 insertions(+), 108 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.c b/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.c index 88aa4a18c..d95c6655a 100644 --- a/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.c +++ b/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.c @@ -72,6 +72,8 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { .frequency_coarse = 0, .rssi_coarse = 0, .frequency_fine = 0, .rssi_fine = 0}; float rssi = 0; uint32_t frequency = 0; + float rssi_temp = 0; + uint32_t frequency_temp = 0; CC1101Status status; //Start CC1101 @@ -195,6 +197,9 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { TAG, "=:%lu:%f", frequency_rssi.frequency_fine, (double)frequency_rssi.rssi_fine); instance->sample_hold_counter = 20; + rssi_temp = frequency_rssi.rssi_fine; + frequency_temp = frequency_rssi.frequency_fine; + if(instance->filVal) { frequency_rssi.frequency_fine = subghz_frequency_analyzer_worker_expRunningAverageAdaptive( @@ -203,7 +208,10 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { // Deliver callback if(instance->pair_callback) { instance->pair_callback( - instance->context, frequency_rssi.frequency_fine, frequency_rssi.rssi_fine); + instance->context, + frequency_rssi.frequency_fine, + frequency_rssi.rssi_fine, + true); } } else if( // Deliver results coarse (frequency_rssi.rssi_coarse > instance->trigger_level) && @@ -215,6 +223,8 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { (double)frequency_rssi.rssi_coarse); instance->sample_hold_counter = 20; + rssi_temp = frequency_rssi.rssi_coarse; + frequency_temp = frequency_rssi.frequency_coarse; if(instance->filVal) { frequency_rssi.frequency_coarse = subghz_frequency_analyzer_worker_expRunningAverageAdaptive( @@ -225,14 +235,22 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { instance->pair_callback( instance->context, frequency_rssi.frequency_coarse, - frequency_rssi.rssi_coarse); + frequency_rssi.rssi_coarse, + true); } } else { if(instance->sample_hold_counter > 0) { instance->sample_hold_counter--; + if(instance->sample_hold_counter == 18) { + if(instance->pair_callback) { + instance->pair_callback( + instance->context, frequency_temp, rssi_temp, false); + } + } } else { instance->filVal = 0; - if(instance->pair_callback) instance->pair_callback(instance->context, 0, 0); + if(instance->pair_callback) + instance->pair_callback(instance->context, 0, 0, false); } } } diff --git a/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.h b/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.h index 3b93f60ad..eba4409ce 100644 --- a/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.h +++ b/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.h @@ -5,8 +5,11 @@ typedef struct SubGhzFrequencyAnalyzerWorker SubGhzFrequencyAnalyzerWorker; -typedef void ( - *SubGhzFrequencyAnalyzerWorkerPairCallback)(void* context, uint32_t frequency, float rssi); +typedef void (*SubGhzFrequencyAnalyzerWorkerPairCallback)( + void* context, + uint32_t frequency, + float rssi, + bool signal); typedef struct { uint32_t frequency_coarse; diff --git a/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c b/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c index 1a0992f94..eef646356 100644 --- a/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c +++ b/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c @@ -1,8 +1,20 @@ #include "../subghz_i.h" +#include "../views/subghz_frequency_analyzer.h" #include #define TAG "SubGhzSceneFrequencyAnalyzer" +static const NotificationSequence sequence_saved = { + &message_blink_stop, + &message_blue_0, + &message_green_255, + &message_red_0, + &message_vibro_on, + &message_delay_100, + &message_vibro_off, + NULL, +}; + void subghz_scene_frequency_analyzer_callback(SubGhzCustomEvent event, void* context) { furi_assert(context); SubGhz* subghz = context; @@ -24,7 +36,28 @@ void subghz_scene_frequency_analyzer_on_enter(void* context) { bool subghz_scene_frequency_analyzer_on_event(void* context, SceneManagerEvent event) { SubGhz* subghz = context; if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubGhzCustomEventViewReceiverOK) { + if(event.event == SubGhzCustomEventSceneAnalyzerLock) { + notification_message(subghz->notifications, &sequence_set_green_255); + switch(subghz_frequency_analyzer_feedback_level( + subghz->subghz_frequency_analyzer, + SubGHzFrequencyAnalyzerFeedbackLevelAll, + false)) { + case SubGHzFrequencyAnalyzerFeedbackLevelAll: + notification_message(subghz->notifications, &sequence_success); + break; + case SubGHzFrequencyAnalyzerFeedbackLevelVibro: + notification_message(subghz->notifications, &sequence_single_vibro); + break; + case SubGHzFrequencyAnalyzerFeedbackLevelMute: + break; + } + notification_message(subghz->notifications, &sequence_display_backlight_on); + return true; + } else if(event.event == SubGhzCustomEventSceneAnalyzerUnlock) { + notification_message(subghz->notifications, &sequence_reset_rgb); + return true; + } else if(event.event == SubGhzCustomEventViewReceiverOK) { + notification_message(subghz->notifications, &sequence_saved); uint32_t frequency = subghz_frequency_analyzer_get_frequency_to_save(subghz->subghz_frequency_analyzer); if(frequency > 0) { diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index aed21b698..bf0ed6f5b 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -18,46 +18,35 @@ #define RSSI_SCALE 2 #define TRIGGER_STEP 1 -static const NotificationSequence sequence_hw_blink = { - &message_blink_start_10, - &message_blink_set_color_cyan, - &message_do_not_reset, - NULL, -}; +// static const NotificationSequence sequence_hw_blink = { +// &message_blink_start_10, +// &message_blink_set_color_cyan, +// &message_do_not_reset, +// NULL, +// }; -static const NotificationSequence sequence_hw_blink_stop = { - &message_blink_stop, - NULL, -}; +// static const NotificationSequence sequence_hw_blink_stop = { +// &message_blink_stop, +// NULL, +// }; -static const NotificationSequence sequence_saved = { - &message_blink_stop, - &message_blue_0, - &message_green_255, - &message_red_0, - &message_vibro_on, - &message_delay_100, - &message_vibro_off, - NULL, -}; - -static const NotificationSequence sequence_frequency = { - &message_display_backlight_on, - &message_green_255, - &message_vibro_on, - &message_delay_100, - &message_green_0, - &message_blue_255, - &message_vibro_off, - &message_delay_100, - &message_blue_0, - &message_green_255, - &message_vibro_on, - &message_delay_100, - &message_green_0, - &message_vibro_off, - NULL, -}; +// static const NotificationSequence sequence_frequency = { +// &message_display_backlight_on, +// &message_green_255, +// &message_vibro_on, +// &message_delay_100, +// &message_green_0, +// &message_blue_255, +// &message_vibro_off, +// &message_delay_100, +// &message_blue_0, +// &message_green_255, +// &message_vibro_on, +// &message_delay_100, +// &message_green_0, +// &message_vibro_off, +// NULL, +// }; //static const NotificationSequence sequence_not_saved = { // &message_blink_stop, @@ -85,7 +74,8 @@ struct SubGhzFrequencyAnalyzer { SubGhzFrequencyAnalyzerCallback callback; void* context; bool locked; - uint8_t feedback_level; // 0 - no feedback, 1 - vibro only, 2 - vibro and sound + SubGHzFrequencyAnalyzerFeedbackLevel + feedback_level; // 0 - no feedback, 1 - vibro only, 2 - vibro and sound float rssi_last; uint32_t frequency_last; uint32_t frequency_last_vis; @@ -97,9 +87,11 @@ typedef struct { uint32_t frequency_last; uint32_t frequency_to_save; float rssi; + uint32_t history_frequency[3]; + bool signal; float rssi_last; float trigger; - uint8_t feedback_level; + SubGHzFrequencyAnalyzerFeedbackLevel feedback_level; } SubGhzFrequencyAnalyzerModel; void subghz_frequency_analyzer_set_callback( @@ -121,7 +113,9 @@ void subghz_frequency_analyzer_draw_rssi( uint8_t y) { // Current RSSI if(rssi) { - if(rssi > RSSI_MAX) rssi = RSSI_MAX; + if(rssi > RSSI_MAX) { + rssi = RSSI_MAX; + } rssi = (rssi - RSSI_MIN) / RSSI_SCALE; uint8_t column_number = 0; for(size_t i = 0; i <= (uint8_t)rssi; i++) { @@ -151,6 +145,31 @@ void subghz_frequency_analyzer_draw_rssi( canvas_draw_line(canvas, x, y + 3, x + (RSSI_MAX - RSSI_MIN) * 2 / RSSI_SCALE, y + 3); } +static void subghz_frequency_analyzer_history_frequency_draw( + Canvas* canvas, + SubGhzFrequencyAnalyzerModel* model) { + char buffer[64]; + uint8_t x = 66; + uint8_t y = 43; + + canvas_set_font(canvas, FontKeyboard); + for(uint8_t i = 0; i < 3; i++) { + if(model->history_frequency[i]) { + snprintf( + buffer, + sizeof(buffer), + "%03ld.%03ld", + model->history_frequency[i] / 1000000 % 1000, + model->history_frequency[i] / 1000 % 1000); + canvas_draw_str(canvas, x, y + i * 10, buffer); + } else { + canvas_draw_str(canvas, x, y + i * 10, "---.---"); + } + canvas_draw_str(canvas, x + 44, y + i * 10, "MHz"); + } + canvas_set_font(canvas, FontSecondary); +} + void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel* model) { char buffer[64]; @@ -164,6 +183,9 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel subghz_frequency_analyzer_draw_rssi( canvas, model->rssi, model->rssi_last, model->trigger, 57, 58); + // Last detected frequency + subghz_frequency_analyzer_history_frequency_draw(canvas, model); + // Frequency canvas_set_font(canvas, FontBigNumbers); snprintf( @@ -172,31 +194,37 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel "%03ld.%03ld", model->frequency / 1000000 % 1000, model->frequency / 1000 % 1000); + if(model->signal) { + canvas_draw_box(canvas, 4, 12, 121, 22); + canvas_set_color(canvas, ColorWhite); + } else { + } + canvas_draw_str(canvas, 8, 30, buffer); canvas_draw_icon(canvas, 96, 19, &I_MHz_25x11); // Last detected frequency - canvas_set_font(canvas, FontSecondary); - if(model->frequency_last) { - snprintf( - buffer, - sizeof(buffer), - "Last: %03ld.%03ld MHz", - model->frequency_last / 1000000 % 1000, - model->frequency_last / 1000 % 1000); - } else { - strcpy(buffer, "Last: ---.--- MHz"); - } - canvas_draw_str(canvas, 9, 42, buffer); + // canvas_set_font(canvas, FontSecondary); + // if(model->frequency_last) { + // snprintf( + // buffer, + // sizeof(buffer), + // "Last: %03ld.%03ld MHz", + // model->frequency_last / 1000000 % 1000, + // model->frequency_last / 1000 % 1000); + // } else { + // strcpy(buffer, "Last: ---.--- MHz"); + // } + // canvas_draw_str(canvas, 9, 42, buffer); switch(model->feedback_level) { - case 2: + case SubGHzFrequencyAnalyzerFeedbackLevelMute: canvas_draw_icon(canvas, 128 - 8 - 1, 1, &I_Volup_8x6); break; - case 1: + case SubGHzFrequencyAnalyzerFeedbackLevelVibro: canvas_draw_icon(canvas, 128 - 8 - 1, 1, &I_Voldwn_6x6); break; - case 0: + case SubGHzFrequencyAnalyzerFeedbackLevelAll: canvas_draw_icon(canvas, 128 - 8 - 1, 1, &I_Voldwn_6x6); canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 128 - 2 - 1 - 2, 1, 2, 6); @@ -242,7 +270,9 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { bool need_redraw = false; - if(event->key == InputKeyBack) return false; + if(event->key == InputKeyBack) { + return false; + } if(((event->type == InputTypePress) || (event->type == InputTypeRepeat)) && ((event->key == InputKeyLeft) || (event->key == InputKeyRight))) { @@ -303,8 +333,8 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { frequency_candidate); #endif model->frequency_to_save = frequency_candidate; - notification_message(instance->notifications, &sequence_saved); - notification_message(instance->notifications, &sequence_hw_blink); + // notification_message(instance->notifications, &sequence_saved); + // notification_message(instance->notifications, &sequence_hw_blink); updated = true; } }, @@ -326,10 +356,10 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { // First device receive short, then when user release button we get long if(event->type == InputTypeLong) { #ifdef FURI_DEBUG - FURI_LOG_I(TAG, "Longpress!"); + FURI_LOG_I(TAG, "Long press!"); #endif // Stop blinking - notification_message(instance->notifications, &sequence_hw_blink_stop); + //notification_message(instance->notifications, &sequence_hw_blink_stop); // Stop worker if(subghz_frequency_analyzer_worker_is_running(instance->worker)) { @@ -369,43 +399,63 @@ uint32_t round_int(uint32_t value, uint8_t n) { return value; } -void subghz_frequency_analyzer_pair_callback(void* context, uint32_t frequency, float rssi) { - furi_assert(context); +void subghz_frequency_analyzer_pair_callback( + void* context, + uint32_t frequency, + float rssi, + bool signal) { SubGhzFrequencyAnalyzer* instance = context; - if((rssi == 0.f) && (instance->locked)) { - notification_message(instance->notifications, &sequence_hw_blink); - instance->frequency_last_vis = instance->frequency_last; - } - - if((rssi != 0.f) && (frequency != 0)) { - // Threre is some signal + if(instance->callback) { + instance->callback(SubGhzCustomEventSceneAnalyzerUnlock, instance->context); + } + //update history + with_view_model( + instance->view, + SubGhzFrequencyAnalyzerModel * model, + { + model->history_frequency[2] = model->history_frequency[1]; + model->history_frequency[1] = model->history_frequency[0]; + model->history_frequency[0] = model->frequency; + }, + false); + } else if((rssi != 0.f) && (!instance->locked)) { + // There is some signal FURI_LOG_I(TAG, "rssi = %.2f, frequency = %ld Hz", (double)rssi, frequency); frequency = round_int(frequency, 3); // Round 299999990Hz to 300000000Hz - if(!instance->locked) { - // Triggered! - instance->rssi_last = rssi; - notification_message(instance->notifications, &sequence_hw_blink_stop); - switch(instance->feedback_level) { - case 1: // 1 - only vibro - notification_message(instance->notifications, &sequence_frequency); - break; - case 2: // 2 - vibro and beep - notification_message(instance->notifications, &sequence_success); - break; - default: // 0 - no feedback - notification_message(instance->notifications, &sequence_display_backlight_on); - break; - } + // Triggered! + instance->rssi_last = rssi; + if(instance->callback) { + instance->callback(SubGhzCustomEventSceneAnalyzerLock, instance->context); + } + } - FURI_LOG_D(TAG, "triggered"); - } - // Update values - if(rssi >= instance->rssi_last) { - instance->rssi_last = rssi; - instance->frequency_last = frequency; - } + // Added code + // if((rssi != 0.f) && (frequency != 0)) { + // if(!instance->locked) { + // // Triggered! + // instance->rssi_last = rssi; + // notification_message(instance->notifications, &sequence_hw_blink_stop); + // + // switch(instance->feedback_level) { + // case 1: // 1 - only vibro + // notification_message(instance->notifications, &sequence_frequency); + // break; + // case 2: // 2 - vibro and beep + // notification_message(instance->notifications, &sequence_success); + // break; + // default: // 0 - no feedback + // notification_message(instance->notifications, &sequence_display_backlight_on); + // break; + // } + // } + // } + + // Update values + if(rssi >= instance->rssi_last && (frequency != 0)) { + instance->rssi_last = rssi; + instance->frequency_last = frequency; } instance->locked = (rssi != 0.f); @@ -416,6 +466,7 @@ void subghz_frequency_analyzer_pair_callback(void* context, uint32_t frequency, model->rssi = rssi; model->rssi_last = instance->rssi_last; model->frequency = frequency; + model->signal = signal; model->frequency_last = instance->frequency_last_vis; model->trigger = subghz_frequency_analyzer_worker_get_trigger_level(instance->worker); model->feedback_level = instance->feedback_level; @@ -427,9 +478,9 @@ void subghz_frequency_analyzer_enter(void* context) { furi_assert(context); SubGhzFrequencyAnalyzer* instance = context; - // Notifications - instance->notifications = furi_record_open(RECORD_NOTIFICATION); - notification_message(instance->notifications, &sequence_hw_blink); + // TODO: check Notifications + //instance->notifications = furi_record_open(RECORD_NOTIFICATION); + //notification_message(instance->notifications, &sequence_hw_blink); //Start worker instance->worker = subghz_frequency_analyzer_worker_alloc(instance->context); @@ -453,6 +504,9 @@ void subghz_frequency_analyzer_enter(void* context) { model->rssi = 0; model->rssi_last = 0; model->frequency = 0; + model->history_frequency[2] = 0; + model->history_frequency[1] = 0; + model->history_frequency[0] = 0; model->frequency_last = 0; model->frequency_to_save = 0; model->trigger = RSSI_MIN; @@ -464,8 +518,8 @@ void subghz_frequency_analyzer_exit(void* context) { furi_assert(context); SubGhzFrequencyAnalyzer* instance = context; - // Stop blinking - notification_message(instance->notifications, &sequence_hw_blink_stop); + // TODO: Check Stop blinking + //notification_message(instance->notifications, &sequence_hw_blink_stop); // Stop worker if(subghz_frequency_analyzer_worker_is_running(instance->worker)) { @@ -478,7 +532,6 @@ void subghz_frequency_analyzer_exit(void* context) { SubGhzFrequencyAnalyzer* subghz_frequency_analyzer_alloc() { SubGhzFrequencyAnalyzer* instance = malloc(sizeof(SubGhzFrequencyAnalyzer)); - furi_assert(instance); instance->feedback_level = 2; @@ -519,9 +572,9 @@ uint32_t subghz_frequency_analyzer_get_frequency_to_save(SubGhzFrequencyAnalyzer return frequency; } -uint8_t subghz_frequency_analyzer_feedback_level( +SubGHzFrequencyAnalyzerFeedbackLevel subghz_frequency_analyzer_feedback_level( SubGhzFrequencyAnalyzer* instance, - uint8_t level, + SubGHzFrequencyAnalyzerFeedbackLevel level, bool update) { furi_assert(instance); if(update) { diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.h b/applications/main/subghz/views/subghz_frequency_analyzer.h index 196d69c79..928fae770 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.h +++ b/applications/main/subghz/views/subghz_frequency_analyzer.h @@ -3,6 +3,12 @@ #include #include "../helpers/subghz_custom_event.h" +typedef enum { + SubGHzFrequencyAnalyzerFeedbackLevelAll, + SubGHzFrequencyAnalyzerFeedbackLevelVibro, + SubGHzFrequencyAnalyzerFeedbackLevelMute +} SubGHzFrequencyAnalyzerFeedbackLevel; + typedef struct SubGhzFrequencyAnalyzer SubGhzFrequencyAnalyzer; typedef void (*SubGhzFrequencyAnalyzerCallback)(SubGhzCustomEvent event, void* context); @@ -20,7 +26,7 @@ View* subghz_frequency_analyzer_get_view(SubGhzFrequencyAnalyzer* subghz_static) uint32_t subghz_frequency_analyzer_get_frequency_to_save(SubGhzFrequencyAnalyzer* instance); -uint8_t subghz_frequency_analyzer_feedback_level( +SubGHzFrequencyAnalyzerFeedbackLevel subghz_frequency_analyzer_feedback_level( SubGhzFrequencyAnalyzer* instance, - uint8_t level, + SubGHzFrequencyAnalyzerFeedbackLevel level, bool update); From f0e8da98ee107db14a3fb1e1e560c4b0cbcbe8e2 Mon Sep 17 00:00:00 2001 From: DerSkythe Date: Wed, 19 Oct 2022 12:20:58 +0400 Subject: [PATCH 2/7] Fix interface and add extra history field --- .../subghz/views/subghz_frequency_analyzer.c | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index bf0ed6f5b..6b03aacfa 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -15,7 +15,7 @@ #define RSSI_MIN -97 #define RSSI_MAX -60 -#define RSSI_SCALE 2 +#define RSSI_SCALE 3 #define TRIGGER_STEP 1 // static const NotificationSequence sequence_hw_blink = { @@ -87,7 +87,7 @@ typedef struct { uint32_t frequency_last; uint32_t frequency_to_save; float rssi; - uint32_t history_frequency[3]; + uint32_t history_frequency[4]; bool signal; float rssi_last; float trigger; @@ -128,7 +128,9 @@ void subghz_frequency_analyzer_draw_rssi( // Last RSSI if(rssi_last) { - if(rssi_last > RSSI_MAX) rssi_last = RSSI_MAX; + if(rssi_last > RSSI_MAX) { + rssi_last = RSSI_MAX; + } int max_x = (int)((rssi_last - RSSI_MIN) / RSSI_SCALE) * 2; //if(!(max_x % 8)) max_x -= 2; int max_h = (int)((rssi_last - RSSI_MIN) / RSSI_SCALE) + 4; @@ -149,11 +151,22 @@ static void subghz_frequency_analyzer_history_frequency_draw( Canvas* canvas, SubGhzFrequencyAnalyzerModel* model) { char buffer[64]; - uint8_t x = 66; - uint8_t y = 43; + const uint8_t x1 = 0; + const uint8_t x2 = 66; + const uint8_t y = 41; canvas_set_font(canvas, FontKeyboard); - for(uint8_t i = 0; i < 3; i++) { + uint8_t line = 0; + for(uint8_t i = 0; i < 4; i++) { + uint8_t current_x; + uint8_t current_y = y + line * 9; + + if(i % 2 == 0) { + current_x = x1; + } else { + current_x = x2; + line++; + } if(model->history_frequency[i]) { snprintf( buffer, @@ -161,11 +174,11 @@ static void subghz_frequency_analyzer_history_frequency_draw( "%03ld.%03ld", model->history_frequency[i] / 1000000 % 1000, model->history_frequency[i] / 1000 % 1000); - canvas_draw_str(canvas, x, y + i * 10, buffer); + canvas_draw_str(canvas, current_x, current_y, buffer); } else { - canvas_draw_str(canvas, x, y + i * 10, "---.---"); + canvas_draw_str(canvas, current_x, current_y, "---.---"); } - canvas_draw_str(canvas, x + 44, y + i * 10, "MHz"); + canvas_draw_str(canvas, current_x + 44, current_y, "MHz"); } canvas_set_font(canvas, FontSecondary); } @@ -195,13 +208,13 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel model->frequency / 1000000 % 1000, model->frequency / 1000 % 1000); if(model->signal) { - canvas_draw_box(canvas, 4, 12, 121, 22); + canvas_draw_box(canvas, 4, 12, 121, 20); canvas_set_color(canvas, ColorWhite); } else { } - canvas_draw_str(canvas, 8, 30, buffer); - canvas_draw_icon(canvas, 96, 19, &I_MHz_25x11); + canvas_draw_str(canvas, 8, 29, buffer); + canvas_draw_icon(canvas, 96, 18, &I_MHz_25x11); // Last detected frequency // canvas_set_font(canvas, FontSecondary); @@ -217,14 +230,16 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel // } // canvas_draw_str(canvas, 9, 42, buffer); + canvas_set_color(canvas, ColorBlack); + canvas_set_font(canvas, FontKeyboard); switch(model->feedback_level) { - case SubGHzFrequencyAnalyzerFeedbackLevelMute: + case SubGHzFrequencyAnalyzerFeedbackLevelAll: canvas_draw_icon(canvas, 128 - 8 - 1, 1, &I_Volup_8x6); break; case SubGHzFrequencyAnalyzerFeedbackLevelVibro: canvas_draw_icon(canvas, 128 - 8 - 1, 1, &I_Voldwn_6x6); break; - case SubGHzFrequencyAnalyzerFeedbackLevelAll: + case SubGHzFrequencyAnalyzerFeedbackLevelMute: canvas_draw_icon(canvas, 128 - 8 - 1, 1, &I_Voldwn_6x6); canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 128 - 2 - 1 - 2, 1, 2, 6); @@ -414,6 +429,7 @@ void subghz_frequency_analyzer_pair_callback( instance->view, SubGhzFrequencyAnalyzerModel * model, { + model->history_frequency[3] = model->history_frequency[2]; model->history_frequency[2] = model->history_frequency[1]; model->history_frequency[1] = model->history_frequency[0]; model->history_frequency[0] = model->frequency; @@ -504,6 +520,7 @@ void subghz_frequency_analyzer_enter(void* context) { model->rssi = 0; model->rssi_last = 0; model->frequency = 0; + model->history_frequency[3] = 0; model->history_frequency[2] = 0; model->history_frequency[1] = 0; model->history_frequency[0] = 0; From 4f6d27a2144df65bb3f6370e969deed872ef7e9c Mon Sep 17 00:00:00 2001 From: derskythe Date: Wed, 19 Oct 2022 13:12:47 +0400 Subject: [PATCH 3/7] Don't add to to array if value already exists --- .../subghz/views/subghz_frequency_analyzer.c | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index 6b03aacfa..193a9e589 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -17,6 +17,7 @@ #define RSSI_MAX -60 #define RSSI_SCALE 3 #define TRIGGER_STEP 1 +#define MAX_HISTORY 4 // static const NotificationSequence sequence_hw_blink = { // &message_blink_start_10, @@ -87,7 +88,7 @@ typedef struct { uint32_t frequency_last; uint32_t frequency_to_save; float rssi; - uint32_t history_frequency[4]; + uint32_t history_frequency[MAX_HISTORY]; bool signal; float rssi_last; float trigger; @@ -157,7 +158,7 @@ static void subghz_frequency_analyzer_history_frequency_draw( canvas_set_font(canvas, FontKeyboard); uint8_t line = 0; - for(uint8_t i = 0; i < 4; i++) { + for(uint8_t i = 0; i < MAX_HISTORY; i++) { uint8_t current_x; uint8_t current_y = y + line * 9; @@ -315,7 +316,9 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { } else { instance->feedback_level--; } +#ifdef FURI_DEBUG FURI_LOG_D(TAG, "feedback_level = %d", instance->feedback_level); +#endif need_redraw = true; } @@ -429,10 +432,20 @@ void subghz_frequency_analyzer_pair_callback( instance->view, SubGhzFrequencyAnalyzerModel * model, { - model->history_frequency[3] = model->history_frequency[2]; - model->history_frequency[2] = model->history_frequency[1]; - model->history_frequency[1] = model->history_frequency[0]; - model->history_frequency[0] = model->frequency; + bool in_array = false; + for(size_t i = 0; i < MAX_HISTORY; i++) { + if(model->history_frequency[i] == model->frequency) { + in_array = true; + break; + } + } + + if(!in_array) { + model->history_frequency[3] = model->history_frequency[2]; + model->history_frequency[2] = model->history_frequency[1]; + model->history_frequency[1] = model->history_frequency[0]; + model->history_frequency[0] = model->frequency; + } }, false); } else if((rssi != 0.f) && (!instance->locked)) { From ab55ddbfb18730c10e98799f80481d2860a430f6 Mon Sep 17 00:00:00 2001 From: derskythe Date: Wed, 19 Oct 2022 19:29:48 +0400 Subject: [PATCH 4/7] fix position and sort array taking latest to first --- .../subghz/views/subghz_frequency_analyzer.c | 113 ++++-------------- 1 file changed, 21 insertions(+), 92 deletions(-) diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index 193a9e589..db815b817 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -15,48 +15,10 @@ #define RSSI_MIN -97 #define RSSI_MAX -60 -#define RSSI_SCALE 3 +#define RSSI_SCALE 2.5 #define TRIGGER_STEP 1 #define MAX_HISTORY 4 -// static const NotificationSequence sequence_hw_blink = { -// &message_blink_start_10, -// &message_blink_set_color_cyan, -// &message_do_not_reset, -// NULL, -// }; - -// static const NotificationSequence sequence_hw_blink_stop = { -// &message_blink_stop, -// NULL, -// }; - -// static const NotificationSequence sequence_frequency = { -// &message_display_backlight_on, -// &message_green_255, -// &message_vibro_on, -// &message_delay_100, -// &message_green_0, -// &message_blue_255, -// &message_vibro_off, -// &message_delay_100, -// &message_blue_0, -// &message_green_255, -// &message_vibro_on, -// &message_delay_100, -// &message_green_0, -// &message_vibro_off, -// NULL, -// }; - -//static const NotificationSequence sequence_not_saved = { -// &message_blink_stop, -// &message_green_255, -// &message_blue_255, -// &message_red_255, -// NULL, -//}; - static const uint32_t subghz_frequency_list[] = { 300000000, 302757000, 303875000, 304250000, 307000000, 307500000, 307800000, 309000000, 310000000, 312000000, 312100000, 313000000, 313850000, 314000000, @@ -154,13 +116,13 @@ static void subghz_frequency_analyzer_history_frequency_draw( char buffer[64]; const uint8_t x1 = 0; const uint8_t x2 = 66; - const uint8_t y = 41; + const uint8_t y = 38; canvas_set_font(canvas, FontKeyboard); uint8_t line = 0; for(uint8_t i = 0; i < MAX_HISTORY; i++) { uint8_t current_x; - uint8_t current_y = y + line * 9; + uint8_t current_y = y + line * 10; if(i % 2 == 0) { current_x = x1; @@ -209,30 +171,19 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel model->frequency / 1000000 % 1000, model->frequency / 1000 % 1000); if(model->signal) { - canvas_draw_box(canvas, 4, 12, 121, 20); + canvas_draw_box(canvas, 4, 11, 121, 19); canvas_set_color(canvas, ColorWhite); } else { + // TODO: Disable this + //canvas_draw_box(canvas, 4, 11, 121, 19); + //canvas_set_color(canvas, ColorWhite); } - canvas_draw_str(canvas, 8, 29, buffer); - canvas_draw_icon(canvas, 96, 18, &I_MHz_25x11); - - // Last detected frequency - // canvas_set_font(canvas, FontSecondary); - // if(model->frequency_last) { - // snprintf( - // buffer, - // sizeof(buffer), - // "Last: %03ld.%03ld MHz", - // model->frequency_last / 1000000 % 1000, - // model->frequency_last / 1000 % 1000); - // } else { - // strcpy(buffer, "Last: ---.--- MHz"); - // } - // canvas_draw_str(canvas, 9, 42, buffer); + canvas_draw_str(canvas, 8, 27, buffer); + canvas_draw_icon(canvas, 96, 16, &I_MHz_25x11); canvas_set_color(canvas, ColorBlack); - canvas_set_font(canvas, FontKeyboard); + canvas_set_font(canvas, FontSecondary); switch(model->feedback_level) { case SubGHzFrequencyAnalyzerFeedbackLevelAll: canvas_draw_icon(canvas, 128 - 8 - 1, 1, &I_Volup_8x6); @@ -351,8 +302,6 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { frequency_candidate); #endif model->frequency_to_save = frequency_candidate; - // notification_message(instance->notifications, &sequence_saved); - // notification_message(instance->notifications, &sequence_hw_blink); updated = true; } }, @@ -376,9 +325,6 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { #ifdef FURI_DEBUG FURI_LOG_I(TAG, "Long press!"); #endif - // Stop blinking - //notification_message(instance->notifications, &sequence_hw_blink_stop); - // Stop worker if(subghz_frequency_analyzer_worker_is_running(instance->worker)) { subghz_frequency_analyzer_worker_stop(instance->worker); @@ -436,6 +382,17 @@ void subghz_frequency_analyzer_pair_callback( for(size_t i = 0; i < MAX_HISTORY; i++) { if(model->history_frequency[i] == model->frequency) { in_array = true; + if(i > 0) { + size_t offset = 0; + + for(size_t j = MAX_HISTORY - 1; j > 0; j--) { + if(j == i) { + offset++; + } + model->history_frequency[j] = model->history_frequency[j - offset]; + } + model->history_frequency[0] = model->frequency; + } break; } } @@ -460,27 +417,6 @@ void subghz_frequency_analyzer_pair_callback( } } - // Added code - // if((rssi != 0.f) && (frequency != 0)) { - // if(!instance->locked) { - // // Triggered! - // instance->rssi_last = rssi; - // notification_message(instance->notifications, &sequence_hw_blink_stop); - // - // switch(instance->feedback_level) { - // case 1: // 1 - only vibro - // notification_message(instance->notifications, &sequence_frequency); - // break; - // case 2: // 2 - vibro and beep - // notification_message(instance->notifications, &sequence_success); - // break; - // default: // 0 - no feedback - // notification_message(instance->notifications, &sequence_display_backlight_on); - // break; - // } - // } - // } - // Update values if(rssi >= instance->rssi_last && (frequency != 0)) { instance->rssi_last = rssi; @@ -507,10 +443,6 @@ void subghz_frequency_analyzer_enter(void* context) { furi_assert(context); SubGhzFrequencyAnalyzer* instance = context; - // TODO: check Notifications - //instance->notifications = furi_record_open(RECORD_NOTIFICATION); - //notification_message(instance->notifications, &sequence_hw_blink); - //Start worker instance->worker = subghz_frequency_analyzer_worker_alloc(instance->context); @@ -548,9 +480,6 @@ void subghz_frequency_analyzer_exit(void* context) { furi_assert(context); SubGhzFrequencyAnalyzer* instance = context; - // TODO: Check Stop blinking - //notification_message(instance->notifications, &sequence_hw_blink_stop); - // Stop worker if(subghz_frequency_analyzer_worker_is_running(instance->worker)) { subghz_frequency_analyzer_worker_stop(instance->worker); From 0139891d6470b8db8a0cee6444e8250d38697e3f Mon Sep 17 00:00:00 2001 From: DerSkythe Date: Wed, 19 Oct 2022 23:29:46 +0400 Subject: [PATCH 5/7] Add cursor frame to selected preferred signal --- .../subghz/views/subghz_frequency_analyzer.c | 138 +++++++++++------- 1 file changed, 89 insertions(+), 49 deletions(-) diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index db815b817..fedbe9c4d 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -42,7 +42,9 @@ struct SubGhzFrequencyAnalyzer { float rssi_last; uint32_t frequency_last; uint32_t frequency_last_vis; - NotificationApp* notifications; + uint8_t selected_index; + uint8_t max_index; + bool show_frame; }; typedef struct { @@ -55,6 +57,9 @@ typedef struct { float rssi_last; float trigger; SubGHzFrequencyAnalyzerFeedbackLevel feedback_level; + uint8_t selected_index; + uint8_t max_index; + bool show_frame; } SubGhzFrequencyAnalyzerModel; void subghz_frequency_analyzer_set_callback( @@ -114,15 +119,16 @@ static void subghz_frequency_analyzer_history_frequency_draw( Canvas* canvas, SubGhzFrequencyAnalyzerModel* model) { char buffer[64]; - const uint8_t x1 = 0; + const uint8_t x1 = 2; const uint8_t x2 = 66; - const uint8_t y = 38; + const uint8_t y = 37; - canvas_set_font(canvas, FontKeyboard); + canvas_set_font(canvas, FontSecondary); uint8_t line = 0; + bool show_frame = model->show_frame && model->max_index > 0; for(uint8_t i = 0; i < MAX_HISTORY; i++) { uint8_t current_x; - uint8_t current_y = y + line * 10; + uint8_t current_y = y + line * 11; if(i % 2 == 0) { current_x = x1; @@ -141,9 +147,12 @@ static void subghz_frequency_analyzer_history_frequency_draw( } else { canvas_draw_str(canvas, current_x, current_y, "---.---"); } - canvas_draw_str(canvas, current_x + 44, current_y, "MHz"); + canvas_draw_str(canvas, current_x + 41, current_y, "MHz"); + + if(show_frame && i == model->selected_index) { + elements_frame(canvas, current_x - 2, current_y - 9, 63, 11); + } } - canvas_set_font(canvas, FontSecondary); } void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel* model) { @@ -152,7 +161,7 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel // Title canvas_set_color(canvas, ColorBlack); canvas_set_font(canvas, FontSecondary); - canvas_draw_str(canvas, 20, 8, "Frequency Analyzer"); + canvas_draw_str(canvas, 20, 7, "Frequency Analyzer"); // RSSI canvas_draw_str(canvas, 33, 62, "RSSI"); @@ -171,7 +180,7 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel model->frequency / 1000000 % 1000, model->frequency / 1000 % 1000); if(model->signal) { - canvas_draw_box(canvas, 4, 11, 121, 19); + canvas_draw_box(canvas, 4, 10, 121, 19); canvas_set_color(canvas, ColorWhite); } else { // TODO: Disable this @@ -179,27 +188,29 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel //canvas_set_color(canvas, ColorWhite); } - canvas_draw_str(canvas, 8, 27, buffer); - canvas_draw_icon(canvas, 96, 16, &I_MHz_25x11); + canvas_draw_str(canvas, 8, 26, buffer); + canvas_draw_icon(canvas, 96, 15, &I_MHz_25x11); canvas_set_color(canvas, ColorBlack); canvas_set_font(canvas, FontSecondary); + const uint8_t icon_x = 119; switch(model->feedback_level) { case SubGHzFrequencyAnalyzerFeedbackLevelAll: - canvas_draw_icon(canvas, 128 - 8 - 1, 1, &I_Volup_8x6); + canvas_draw_icon(canvas, icon_x, 1, &I_Volup_8x6); break; case SubGHzFrequencyAnalyzerFeedbackLevelVibro: - canvas_draw_icon(canvas, 128 - 8 - 1, 1, &I_Voldwn_6x6); + canvas_draw_icon(canvas, icon_x, 1, &I_Voldwn_6x6); break; case SubGHzFrequencyAnalyzerFeedbackLevelMute: - canvas_draw_icon(canvas, 128 - 8 - 1, 1, &I_Voldwn_6x6); + canvas_draw_icon(canvas, icon_x, 1, &I_Voldwn_6x6); canvas_set_color(canvas, ColorWhite); - canvas_draw_box(canvas, 128 - 2 - 1 - 2, 1, 2, 6); + canvas_draw_box(canvas, 123, 1, 2, 6); canvas_set_color(canvas, ColorBlack); break; } // Buttons hint + canvas_set_font(canvas, FontSecondary); elements_button_left(canvas, "T-"); elements_button_right(canvas, "T+"); } @@ -248,20 +259,22 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { switch(event->key) { case InputKeyLeft: trigger_level -= TRIGGER_STEP; - if(trigger_level < RSSI_MIN) trigger_level = RSSI_MIN; + if(trigger_level < RSSI_MIN) { + trigger_level = RSSI_MIN; + } break; default: case InputKeyRight: trigger_level += TRIGGER_STEP; - if(trigger_level > RSSI_MAX) trigger_level = RSSI_MAX; + if(trigger_level > RSSI_MAX) { + trigger_level = RSSI_MAX; + } break; } subghz_frequency_analyzer_worker_set_trigger_level(instance->worker, trigger_level); FURI_LOG_I(TAG, "trigger = %.1f", (double)trigger_level); need_redraw = true; - } - - if(event->type == InputTypePress && event->key == InputKeyDown) { + } else if(event->type == InputTypePress && event->key == InputKeyDown) { if(instance->feedback_level == 0) { instance->feedback_level = 2; } else { @@ -271,38 +284,45 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { FURI_LOG_D(TAG, "feedback_level = %d", instance->feedback_level); #endif need_redraw = true; - } - - if(event->key == InputKeyOk) { + } else if( + ((event->type == InputTypeShort) || (event->type == InputTypeRepeat)) && + event->key == InputKeyUp) { + instance->show_frame = instance->max_index > 0; + if(instance->show_frame) { + instance->selected_index = (instance->selected_index + 1) % instance->max_index; + } + need_redraw = true; + } else if(event->key == InputKeyOk) { + need_redraw = true; bool updated = false; + uint32_t frequency_to_save; with_view_model( instance->view, SubGhzFrequencyAnalyzerModel * model, { - uint32_t prev_freq_to_save = model->frequency_to_save; - uint32_t frequency_candidate = 0; - if(model->frequency != 0) { - frequency_candidate = model->frequency; - } else if(model->frequency_last != 0) { - frequency_candidate = model->frequency_last; - } - if(frequency_candidate == 0 || - !furi_hal_subghz_is_frequency_valid(frequency_candidate) || - prev_freq_to_save == frequency_candidate) { - frequency_candidate = 0; - } else { - frequency_candidate = subghz_frequency_find_correct(frequency_candidate); - } - if(frequency_candidate > 0 && frequency_candidate != model->frequency_to_save) { + frequency_to_save = model->frequency_to_save; + if(model->show_frame) { + uint32_t prev_freq_to_save = model->frequency_to_save; + uint32_t frequency_candidate = model->history_frequency[model->selected_index]; + if(frequency_candidate == 0 || + !furi_hal_subghz_is_frequency_valid(frequency_candidate) || + prev_freq_to_save == frequency_candidate) { + frequency_candidate = 0; + } else { + frequency_candidate = subghz_frequency_find_correct(frequency_candidate); + } + if(frequency_candidate > 0 && + frequency_candidate != model->frequency_to_save) { #ifdef FURI_DEBUG - FURI_LOG_D( - TAG, - "frequency_to_save: %ld, candidate: %ld", - model->frequency_to_save, - frequency_candidate); + FURI_LOG_D( + TAG, + "frequency_to_save: %ld, candidate: %ld", + model->frequency_to_save, + frequency_candidate); #endif - model->frequency_to_save = frequency_candidate; - updated = true; + model->frequency_to_save = frequency_candidate; + updated = true; + } } }, true); @@ -321,7 +341,7 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { } // First device receive short, then when user release button we get long - if(event->type == InputTypeLong) { + if(event->type == InputTypeLong && frequency_to_save > 0) { #ifdef FURI_DEBUG FURI_LOG_I(TAG, "Long press!"); #endif @@ -374,13 +394,15 @@ void subghz_frequency_analyzer_pair_callback( instance->callback(SubGhzCustomEventSceneAnalyzerUnlock, instance->context); } //update history + instance->show_frame = true; with_view_model( instance->view, SubGhzFrequencyAnalyzerModel * model, { bool in_array = false; + uint32_t normal_frequency = subghz_frequency_find_correct(model->frequency); for(size_t i = 0; i < MAX_HISTORY; i++) { - if(model->history_frequency[i] == model->frequency) { + if(model->history_frequency[i] == normal_frequency) { in_array = true; if(i > 0) { size_t offset = 0; @@ -391,8 +413,9 @@ void subghz_frequency_analyzer_pair_callback( } model->history_frequency[j] = model->history_frequency[j - offset]; } - model->history_frequency[0] = model->frequency; + model->history_frequency[0] = normal_frequency; } + break; } } @@ -401,7 +424,15 @@ void subghz_frequency_analyzer_pair_callback( model->history_frequency[3] = model->history_frequency[2]; model->history_frequency[2] = model->history_frequency[1]; model->history_frequency[1] = model->history_frequency[0]; - model->history_frequency[0] = model->frequency; + model->history_frequency[0] = normal_frequency; + } + + if(instance->max_index < MAX_HISTORY) { + for(size_t i = 0; i < MAX_HISTORY; i++) { + if(model->history_frequency[i] > 0) { + instance->max_index = i + 1; + } + } } }, false); @@ -435,6 +466,9 @@ void subghz_frequency_analyzer_pair_callback( model->frequency_last = instance->frequency_last_vis; model->trigger = subghz_frequency_analyzer_worker_get_trigger_level(instance->worker); model->feedback_level = instance->feedback_level; + model->max_index = instance->max_index; + model->show_frame = instance->show_frame; + model->selected_index = instance->selected_index; }, true); } @@ -462,6 +496,9 @@ void subghz_frequency_analyzer_enter(void* context) { instance->view, SubGhzFrequencyAnalyzerModel * model, { + model->selected_index = 0; + model->max_index = 0; + model->show_frame = false; model->rssi = 0; model->rssi_last = 0; model->frequency = 0; @@ -493,6 +530,9 @@ SubGhzFrequencyAnalyzer* subghz_frequency_analyzer_alloc() { SubGhzFrequencyAnalyzer* instance = malloc(sizeof(SubGhzFrequencyAnalyzer)); instance->feedback_level = 2; + instance->selected_index = 0; + instance->max_index = 0; + instance->show_frame = false; // View allocation and configuration instance->view = view_alloc(); From 6d86629e9a2fc7f73e5b77c2423344fb02759e46 Mon Sep 17 00:00:00 2001 From: DerSkythe Date: Wed, 19 Oct 2022 23:31:04 +0400 Subject: [PATCH 6/7] minor changes --- applications/main/subghz/views/subghz_frequency_analyzer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index fedbe9c4d..632488389 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -295,7 +295,7 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { } else if(event->key == InputKeyOk) { need_redraw = true; bool updated = false; - uint32_t frequency_to_save; + uint32_t frequency_to_save = 0; with_view_model( instance->view, SubGhzFrequencyAnalyzerModel * model, From 26dfa9b9a5a70dabffdca6d87b2ee00b19662967 Mon Sep 17 00:00:00 2001 From: DerSkythe Date: Thu, 20 Oct 2022 00:18:40 +0400 Subject: [PATCH 7/7] fix for update cursor --- .../subghz/views/subghz_frequency_analyzer.c | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index 632488389..b6e8fecd5 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -40,8 +40,6 @@ struct SubGhzFrequencyAnalyzer { SubGHzFrequencyAnalyzerFeedbackLevel feedback_level; // 0 - no feedback, 1 - vibro only, 2 - vibro and sound float rssi_last; - uint32_t frequency_last; - uint32_t frequency_last_vis; uint8_t selected_index; uint8_t max_index; bool show_frame; @@ -49,7 +47,6 @@ struct SubGhzFrequencyAnalyzer { typedef struct { uint32_t frequency; - uint32_t frequency_last; uint32_t frequency_to_save; float rssi; uint32_t history_frequency[MAX_HISTORY]; @@ -285,13 +282,13 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { #endif need_redraw = true; } else if( - ((event->type == InputTypeShort) || (event->type == InputTypeRepeat)) && + ((event->type == InputTypePress) || (event->type == InputTypeRepeat)) && event->key == InputKeyUp) { instance->show_frame = instance->max_index > 0; if(instance->show_frame) { instance->selected_index = (instance->selected_index + 1) % instance->max_index; + need_redraw = true; } - need_redraw = true; } else if(event->key == InputKeyOk) { need_redraw = true; bool updated = false; @@ -360,10 +357,12 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { SubGhzFrequencyAnalyzerModel * model, { model->rssi_last = instance->rssi_last; - model->frequency_last = instance->frequency_last; model->trigger = subghz_frequency_analyzer_worker_get_trigger_level(instance->worker); model->feedback_level = instance->feedback_level; + model->max_index = instance->max_index; + model->show_frame = instance->show_frame; + model->selected_index = instance->selected_index; }, true); } @@ -395,6 +394,7 @@ void subghz_frequency_analyzer_pair_callback( } //update history instance->show_frame = true; + uint8_t max_index = instance->max_index; with_view_model( instance->view, SubGhzFrequencyAnalyzerModel * model, @@ -427,15 +427,16 @@ void subghz_frequency_analyzer_pair_callback( model->history_frequency[0] = normal_frequency; } - if(instance->max_index < MAX_HISTORY) { + if(max_index < MAX_HISTORY) { for(size_t i = 0; i < MAX_HISTORY; i++) { if(model->history_frequency[i] > 0) { - instance->max_index = i + 1; + max_index = i + 1; } } } }, false); + instance->max_index = max_index; } else if((rssi != 0.f) && (!instance->locked)) { // There is some signal FURI_LOG_I(TAG, "rssi = %.2f, frequency = %ld Hz", (double)rssi, frequency); @@ -451,7 +452,6 @@ void subghz_frequency_analyzer_pair_callback( // Update values if(rssi >= instance->rssi_last && (frequency != 0)) { instance->rssi_last = rssi; - instance->frequency_last = frequency; } instance->locked = (rssi != 0.f); @@ -463,7 +463,6 @@ void subghz_frequency_analyzer_pair_callback( model->rssi_last = instance->rssi_last; model->frequency = frequency; model->signal = signal; - model->frequency_last = instance->frequency_last_vis; model->trigger = subghz_frequency_analyzer_worker_get_trigger_level(instance->worker); model->feedback_level = instance->feedback_level; model->max_index = instance->max_index; @@ -488,8 +487,9 @@ void subghz_frequency_analyzer_enter(void* context) { subghz_frequency_analyzer_worker_start(instance->worker); instance->rssi_last = 0; - instance->frequency_last = 0; - instance->frequency_last_vis = 0; + instance->selected_index = 0; + instance->max_index = 0; + instance->show_frame = false; subghz_frequency_analyzer_worker_set_trigger_level(instance->worker, RSSI_MIN); with_view_model( @@ -506,7 +506,6 @@ void subghz_frequency_analyzer_enter(void* context) { model->history_frequency[2] = 0; model->history_frequency[1] = 0; model->history_frequency[0] = 0; - model->frequency_last = 0; model->frequency_to_save = 0; model->trigger = RSSI_MIN; }, @@ -530,9 +529,6 @@ SubGhzFrequencyAnalyzer* subghz_frequency_analyzer_alloc() { SubGhzFrequencyAnalyzer* instance = malloc(sizeof(SubGhzFrequencyAnalyzer)); instance->feedback_level = 2; - instance->selected_index = 0; - instance->max_index = 0; - instance->show_frame = false; // View allocation and configuration instance->view = view_alloc();