From 47b770bc3a94b6f4c6e81a6c798a3ad34c097940 Mon Sep 17 00:00:00 2001 From: GullCode Date: Thu, 23 Mar 2023 13:33:22 +0100 Subject: [PATCH 1/3] Changed RSSIGraph drawing system --- firmware/application/ui/ui_rssi.cpp | 94 ++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 3 deletions(-) diff --git a/firmware/application/ui/ui_rssi.cpp b/firmware/application/ui/ui_rssi.cpp index 6d8fd4ab..7416981e 100644 --- a/firmware/application/ui/ui_rssi.cpp +++ b/firmware/application/ui/ui_rssi.cpp @@ -238,8 +238,96 @@ namespace ui { set_dirty(); } + void RSSIGraph::paint(Painter& painter) { + const auto r = screen_rect(); - void RSSIGraph::paint(Painter& painter) { + RSSIGraph_entry& prev_entry = graph_list[0]; + int xpos = 0 , prev_xpos = r.width(); + + for( int n = 1 ; (unsigned)n <= graph_list.size() ; n++ ) + { + xpos = ( r.width() * (graph_list.size() - n ) ) / graph_list.size() ; + int size = abs( xpos - prev_xpos ); + RSSIGraph_entry& entry = graph_list[ n - 1 ]; + + // black + const Rect r0{ r.right() - prev_xpos , r.top() , size , r.height() }; + painter.fill_rectangle( + r0, + Color::black()); + + // y_max + int top_y_val = max( entry.rssi_max , prev_entry.rssi_max ); + int width_y = abs( entry.rssi_max - prev_entry.rssi_max ); + if( width_y == 0 ) + width_y = 1 ; + const Point p1v{ r.right() - prev_xpos , r.bottom() - top_y_val }; + painter.draw_vline( + p1v, + width_y, + Color::red()); + const Point p1h{ r.right() - prev_xpos , r.bottom() - entry.rssi_max }; + painter.draw_hline( + p1h, + size, + Color::red()); + + // y_avg + top_y_val = max( entry.rssi_avg , prev_entry.rssi_avg ); + width_y = abs( entry.rssi_avg - prev_entry.rssi_avg ); + if( width_y == 0 ) + width_y = 1 ; + const Point p2v{ r.right() - prev_xpos , r.bottom() - top_y_val }; + painter.draw_vline( + p2v, + width_y, + Color::white()); + const Point p2h{ r.right() - prev_xpos , r.bottom() - entry.rssi_avg }; + painter.draw_hline( + p2h, + size, + Color::white()); + + // y_min + top_y_val = max( entry.rssi_min , prev_entry.rssi_min ); + width_y = abs( entry.rssi_min - prev_entry.rssi_min ); + if( width_y == 0 ) + width_y = 1 ; + const Point p3v{ r.right() - prev_xpos , r.bottom() - top_y_val }; + painter.draw_vline( + p3v, + width_y, + Color::blue()); + const Point p3h{ r.right() - prev_xpos , r.bottom() - entry.rssi_min }; + painter.draw_hline( + p3h, + size, + Color::blue()); + + // hack to display db + top_y_val = max( entry.db , prev_entry.db ); + width_y = abs( entry.db - prev_entry.db ); + if( width_y == 0 ) + width_y = 1 ; + const Point p4v{ r.right() - prev_xpos , r.bottom() - top_y_val }; + painter.draw_vline( + p4v, + width_y, + Color::green()); + const Point p4h{ r.right() - prev_xpos , r.bottom() - entry.db }; + painter.draw_hline( + p4h, + size, + Color::green()); + + prev_entry = entry ; + prev_xpos = xpos ; + } + } + + + + /*void RSSIGraph::paintOld(Painter& painter) { const auto r = screen_rect(); int16_t size = r.width() / nb_columns ; int16_t top_y_val = 0 ; @@ -307,7 +395,7 @@ namespace ui { r5, Color::black()); } - } + }*/ void RSSIGraph::add_values(int16_t rssi_min, int16_t rssi_avg, int16_t rssi_max, int16_t db ) { @@ -340,7 +428,7 @@ namespace ui { { graph_list.erase( graph_list.begin() ); } - set_dirty(); + set_dirty(); } void RSSIGraph::set_nb_columns( int16_t nb ) From c76c6bd85720b0832a6e230a7d9d02cba2a12403 Mon Sep 17 00:00:00 2001 From: GullCode Date: Thu, 23 Mar 2023 13:33:59 +0100 Subject: [PATCH 2/3] Changed default RSSI peak value, position and size of RSSI graph --- firmware/application/apps/ui_level.cpp | 2 +- firmware/application/apps/ui_level.hpp | 323 ++++++++++++------------- 2 files changed, 161 insertions(+), 164 deletions(-) diff --git a/firmware/application/apps/ui_level.cpp b/firmware/application/apps/ui_level.cpp index 59531f5e..d69da9d1 100644 --- a/firmware/application/apps/ui_level.cpp +++ b/firmware/application/apps/ui_level.cpp @@ -180,7 +180,7 @@ namespace ui { }; // default peak value - peak_mode.set_selected_index(3); + peak_mode.set_selected_index(2); rssi_resolution.set_selected_index(1); //FILL STEP OPTIONS freqman_set_modulation_option( field_mode ); diff --git a/firmware/application/apps/ui_level.hpp b/firmware/application/apps/ui_level.hpp index 7d645f67..e23fbe69 100644 --- a/firmware/application/apps/ui_level.hpp +++ b/firmware/application/apps/ui_level.hpp @@ -41,200 +41,197 @@ namespace ui { - class LevelView : public View { - public: - LevelView(NavigationView& nav); - ~LevelView(); + class LevelView : public View { + public: + LevelView(NavigationView& nav); + ~LevelView(); - void focus() override; + void focus() override; - void big_display_freq( int64_t f ); + void big_display_freq( int64_t f ); - const Style style_grey { // level - .font = font::fixed_8x16, - .background = Color::black(), - .foreground = Color::grey(), - }; + const Style style_grey { // level + .font = font::fixed_8x16, + .background = Color::black(), + .foreground = Color::grey(), + }; - const Style style_white { // level - .font = font::fixed_8x16, - .background = Color::black(), - .foreground = Color::white(), - }; + const Style style_white { // level + .font = font::fixed_8x16, + .background = Color::black(), + .foreground = Color::white(), + }; - const Style style_yellow { //Found signal - .font = font::fixed_8x16, - .background = Color::black(), - .foreground = Color::yellow(), - }; + const Style style_yellow { //Found signal + .font = font::fixed_8x16, + .background = Color::black(), + .foreground = Color::yellow(), + }; - const Style style_green { //Found signal - .font = font::fixed_8x16, - .background = Color::black(), - .foreground = Color::green(), - }; + const Style style_green { //Found signal + .font = font::fixed_8x16, + .background = Color::black(), + .foreground = Color::green(), + }; - const Style style_red { //erasing freq - .font = font::fixed_8x16, - .background = Color::black(), - .foreground = Color::red(), - }; + const Style style_red { //erasing freq + .font = font::fixed_8x16, + .background = Color::black(), + .foreground = Color::red(), + }; - const Style style_blue { // quick level, wait == 0 - .font = font::fixed_8x16, - .background = Color::black(), - .foreground = Color::blue(), - }; + const Style style_blue { // quick level, wait == 0 + .font = font::fixed_8x16, + .background = Color::black(), + .foreground = Color::blue(), + }; - std::string title() const override { return "Level"; }; + std::string title() const override { return "Level"; }; - private: - NavigationView& nav_; + private: + NavigationView& nav_; - size_t change_mode( freqman_index_t mod_type); - void on_statistics_update(const ChannelStatistics& statistics); - void set_display_freq( int64_t freq ); - bool check_sd_card(); + size_t change_mode( freqman_index_t mod_type); + void on_statistics_update(const ChannelStatistics& statistics); + void set_display_freq( int64_t freq ); + bool check_sd_card(); - int32_t db { 0 }; - long long int MAX_UFREQ = { 7200000000 }; // maximum usable freq - bool sd_card_mounted = false ; - rf::Frequency freq = { 0 } ; + int32_t db { 0 }; + long long int MAX_UFREQ = { 7200000000 }; // maximum usable freq + bool sd_card_mounted = false ; + rf::Frequency freq = { 0 } ; - Labels labels - { - { { 0 * 8 , 0 * 16 }, "LNA: VGA: AMP: VOL: ", Color::light_grey() }, - { { 0 * 8 , 1 * 16 }, "BW: MODE: S: ", Color::light_grey() }, - }; + Labels labels + { + { { 0 * 8 , 0 * 16 }, "LNA: VGA: AMP: VOL: ", Color::light_grey() }, + { { 0 * 8 , 1 * 16 }, "BW: MODE: S: ", Color::light_grey() }, + }; - LNAGainField field_lna { - { 4 * 8, 0 * 16 } - }; + LNAGainField field_lna { + { 4 * 8, 0 * 16 } + }; - VGAGainField field_vga { - { 11 * 8, 0 * 16 } - }; + VGAGainField field_vga { + { 11 * 8, 0 * 16 } + }; - RFAmpField field_rf_amp { - { 18 * 8, 0 * 16 } - }; + RFAmpField field_rf_amp { + { 18 * 8, 0 * 16 } + }; - NumberField field_volume { - { 24 * 8, 0 * 16 }, - 2, - { 0, 99 }, - 1, - ' ', - }; + NumberField field_volume { + { 24 * 8, 0 * 16 }, + 2, + { 0, 99 }, + 1, + ' ', + }; - OptionsField field_bw { - { 3 * 8, 1 * 16 }, - 6, - { } - }; + OptionsField field_bw { + { 3 * 8, 1 * 16 }, + 6, + { } + }; - OptionsField field_mode { - { 15 * 8, 1 * 16 }, - 3, - { - } - }; + OptionsField field_mode { + { 15 * 8, 1 * 16 }, + 3, + { + } + }; - OptionsField step_mode { - { 16 * 8, 2 * 16 + 4 }, - 12, - { - } - }; + OptionsField step_mode { + { 16 * 8, 2 * 16 + 4 }, + 12, + { + } + }; - RSSIGraph rssi_graph { // 240x320 => - { 0 , 5 * 16 + 4 , 240 - 5 * 8 , 216 }, - }; + ButtonWithEncoder button_frequency { + { 0 * 8 , 2 * 16 + 8 , 15 * 8 , 1 * 8 }, + "" + }; - RSSI rssi { // 240x320 => - { 240 - 5 * 8 , 5 * 16 + 4 , 5 * 8 , 216 }, - }; + OptionsField audio_mode { + { 21 * 8, 1 * 16 }, + 9, + { + {"audio off", 0}, + {"audio on",1} + //{"tone on", 2}, + //{"tone off", 2}, + } + }; + Text text_ctcss { + { 22 * 8, 3 * 16 + 4 , 14 * 8, 1 * 8 }, + "" + }; - ButtonWithEncoder button_frequency { - { 0 * 8 , 2 * 16 + 8 , 15 * 8 , 1 * 8 }, - "" - }; + // RSSI: XX/XX/XXX,dt: XX + Text freq_stats_rssi { + { 0 * 8 , 3 * 16 + 4 , 22 * 8, 14 }, + }; - OptionsField audio_mode { - { 21 * 8, 1 * 16 }, - 9, - { - {"audio off", 0}, - {"audio on",1} - //{"tone on", 2}, - //{"tone off", 2}, - } - }; + // Power: -XXX db + Text freq_stats_db { + { 0 * 8 , 4 * 16 + 4 , 14 * 8, 14 }, + }; + OptionsField peak_mode { + { 40 + 10 * 8, 4 * 16 + 4 }, + 10, + { + {"peak:none", 0}, + {"peak:0.25s",250}, + {"peak:0.5s",500}, + {"peak:1s",1000}, + {"peak:3s",3000}, + {"peak:5s",5000}, + {"peak:10s",10000}, + } + }; + OptionsField rssi_resolution { + { 44 + 20 * 8, 4 * 16 + 4}, + 4, + { + {"16x", 16}, + {"32x", 32}, + {"64x", 64}, + {"128x", 128}, + {"240x", 240}, + } + }; - Text text_ctcss { - { 22 * 8, 3 * 16 + 4 , 14 * 8, 1 * 8 }, - "" - }; + RSSIGraph rssi_graph { // 240x320 => + { 0 , 5 * 16 + 4 , 240 - 5 * 8 , 320 - ( 5 * 16 + 4 ) }, + }; - // RSSI: XX/XX/XXX,dt: XX - Text freq_stats_rssi { - { 0 * 8 , 3 * 16 + 4 , 22 * 8, 16 }, - }; + RSSI rssi { // 240x320 => + { 240 - 5 * 8 , 5 * 16 + 4 , 5 * 8 , 320 - ( 5 * 16 + 4 ) }, + }; - Text freq_stats_db { - { 0 * 8 , 4 * 16 + 4 , 15 * 8, 16 }, - }; + void handle_coded_squelch(const uint32_t value); + void on_headphone_volume_changed(int32_t v); + MessageHandlerRegistration message_handler_coded_squelch { + Message::ID::CodedSquelch, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + this->handle_coded_squelch(message.value); + } + }; - OptionsField peak_mode { - { 40 + 10 * 8, 4 * 16 + 4 }, - 10, - { - {"peak:none", 0}, - {"peak:0.25s",250}, - {"peak:0.5s",500}, - {"peak:1s",1000}, - {"peak:3s",3000}, - {"peak:5s",5000}, - {"peak:10s",10000}, - } - }; - OptionsField rssi_resolution { - { 44 + 20 * 8, 4 * 16 + 4}, - 4, - { - {"16x", 16}, - {"32x", 32}, - {"64x", 64}, - {"128x", 128}, - {"240x", 240}, - } - }; - - - void handle_coded_squelch(const uint32_t value); - void on_headphone_volume_changed(int32_t v); - - MessageHandlerRegistration message_handler_coded_squelch { - Message::ID::CodedSquelch, - [this](const Message* const p) { - const auto message = *reinterpret_cast(p); - this->handle_coded_squelch(message.value); - } - }; - - MessageHandlerRegistration message_handler_stats { - Message::ID::ChannelStatistics, - [this](const Message* const p) { - this->on_statistics_update(static_cast(p)->statistics); - } - }; - // app save settings - std::app_settings settings { }; - std::app_settings::AppSettings app_settings { }; - }; + MessageHandlerRegistration message_handler_stats { + Message::ID::ChannelStatistics, + [this](const Message* const p) { + this->on_statistics_update(static_cast(p)->statistics); + } + }; + // app save settings + std::app_settings settings { }; + std::app_settings::AppSettings app_settings { }; + }; } /* namespace ui */ From ad11ab649ec739b1b1151e72ca4bb4cc1e29f130 Mon Sep 17 00:00:00 2001 From: GullCode Date: Thu, 23 Mar 2023 13:34:15 +0100 Subject: [PATCH 3/3] Changed default RSSI peak value --- firmware/application/apps/ui_recon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/application/apps/ui_recon.cpp b/firmware/application/apps/ui_recon.cpp index cba2df4a..9a15d502 100644 --- a/firmware/application/apps/ui_recon.cpp +++ b/firmware/application/apps/ui_recon.cpp @@ -890,7 +890,7 @@ namespace ui { rssi.set_focusable(true); - rssi.set_peak( true , 1000 ); + rssi.set_peak( true , 500 ); rssi.on_select = [this](RSSI&) { recon_thread->stop(); nav_.pop();