From 155543e5d5f9ba44f1439993e8ed3d92ead778ef Mon Sep 17 00:00:00 2001 From: GullCode Date: Tue, 14 Mar 2023 22:22:49 +0100 Subject: [PATCH 1/2] Added nb_columns, changed drawing due to column system --- firmware/application/ui/ui_rssi.cpp | 105 ++++++++++++++++------------ firmware/application/ui/ui_rssi.hpp | 28 ++++---- 2 files changed, 75 insertions(+), 58 deletions(-) diff --git a/firmware/application/ui/ui_rssi.cpp b/firmware/application/ui/ui_rssi.cpp index 8721c7151..fc22019ef 100644 --- a/firmware/application/ui/ui_rssi.cpp +++ b/firmware/application/ui/ui_rssi.cpp @@ -57,12 +57,12 @@ namespace ui { { // horizontal left to right level meters const range_t x_avg_range { 0, r.width() - 1 }; - const auto x_avg = x_avg_range.clip((avg_ - raw_min) * r.width() / raw_delta); + const int16_t x_avg = x_avg_range.clip((avg_ - raw_min) * r.width() / raw_delta); const range_t x_min_range { 0, x_avg }; - const auto x_min = x_min_range.clip((min_ - raw_min) * r.width() / raw_delta); + const int16_t x_min = x_min_range.clip((min_ - raw_min) * r.width() / raw_delta); const range_t x_max_range { x_avg + 1, r.width() - 1 }; - const auto x_max = x_max_range.clip((max_ - raw_min) * r.width() / raw_delta); - const auto peak = x_max_range.clip((peak_ - raw_min) * r.width() / raw_delta); + const int16_t x_max = x_max_range.clip((max_ - raw_min) * r.width() / raw_delta); + const int16_t peak = x_max_range.clip((peak_ - raw_min) * r.width() / raw_delta); // x_min const Rect r0 { r.left(), r.top(), x_min, r.height() }; @@ -113,13 +113,13 @@ namespace ui { { // vertical bottom to top level meters const range_t y_avg_range { 0, r.height() - 1 }; - const auto y_avg = y_avg_range.clip((avg_ - raw_min) * r.height() / raw_delta); + const int16_t y_avg = y_avg_range.clip((avg_ - raw_min) * r.height() / raw_delta); const range_t y_min_range { 0, y_avg }; - const auto y_min = y_min_range.clip((min_ - raw_min) * r.height() / raw_delta); + const int16_t y_min = y_min_range.clip((min_ - raw_min) * r.height() / raw_delta); const range_t y_max_range { y_avg + 1, r.height() - 1 }; - const auto y_max = y_max_range.clip((max_ - raw_min) * r.height() / raw_delta); + const int16_t y_max = y_max_range.clip((max_ - raw_min) * r.height() / raw_delta); const range_t peak_range { 0, r.height() - 1 }; - const auto peak = peak_range.clip((peak_ - raw_min) * r.height() / raw_delta); + const int16_t peak = peak_range.clip((peak_ - raw_min) * r.height() / raw_delta); // y_min const Rect r0 { r.left(), r.bottom() - y_min, r.width() , y_min }; @@ -180,22 +180,22 @@ namespace ui { } } - int32_t RSSI::get_min() + int16_t RSSI::get_min() { return min_ ; } - int32_t RSSI::get_avg() + int16_t RSSI::get_avg() { return avg_ ; } - int32_t RSSI::get_max() + int16_t RSSI::get_max() { return max_ ; } - int32_t RSSI::get_delta() + int16_t RSSI::get_delta() { return max_ - min_ ; } @@ -241,27 +241,32 @@ namespace ui { void RSSIGraph::paint(Painter& painter) { const auto r = screen_rect(); + int16_t size = r.width() / nb_columns ; + int16_t top_y_val = 0 ; + int16_t width_y = 0 ; + if( size < 1 ) + size = 1 ; + + int xpos = r.right() ; for ( int n = 2 ; (unsigned)n <= graph_list.size(); n++) { auto& entry = graph_list[graph_list.size()-n]; auto& prev_entry = graph_list[graph_list.size()-(n-1)]; // black - const Point p0{ r.right() - n , r.top() }; - painter.draw_vline( - p0, - r.height(), - Color::black()); + const Rect r0{ xpos - size , r.top() , size , r.height() }; + painter.fill_rectangle( + r0, + Color::black()); // y_max - int32_t top_y_val = max( entry.rssi_max , prev_entry.rssi_max ); - int32_t width_y = abs( entry.rssi_max - prev_entry.rssi_max ); + top_y_val = max( entry.rssi_max , prev_entry.rssi_max ); + width_y = abs( entry.rssi_max - prev_entry.rssi_max ); if( width_y == 0 ) width_y = 1 ; - const Point p1{ r.right() - n , r.bottom() - top_y_val }; - painter.draw_vline( - p1, - width_y, + const Rect r1{ xpos - size , r.bottom() - top_y_val , size , width_y }; + painter.fill_rectangle( + r1, Color::red()); // y_avg @@ -269,10 +274,9 @@ namespace ui { width_y = abs( entry.rssi_avg - prev_entry.rssi_avg ); if( width_y == 0 ) width_y = 1 ; - const Point p2{ r.right() - n , r.bottom() - top_y_val }; - painter.draw_vline( - p2, - width_y, + const Rect r2{ xpos - size , r.bottom() - top_y_val , size , width_y }; + painter.fill_rectangle( + r2, Color::white()); // y_min @@ -280,10 +284,9 @@ namespace ui { width_y = abs( entry.rssi_min - prev_entry.rssi_min ); if( width_y == 0 ) width_y = 1 ; - const Point p3{ r.right() - n , r.bottom() - top_y_val }; - painter.draw_vline( - p3, - width_y, + const Rect r3{ xpos - size , r.bottom() - top_y_val , size , width_y }; + painter.fill_rectangle( + r3, Color::blue()); // hack to display db @@ -291,15 +294,22 @@ namespace ui { width_y = abs( entry.db - prev_entry.db ); if( width_y == 0 ) width_y = 1 ; - const Point p4{ r.right() - n , r.bottom() - top_y_val }; - painter.draw_vline( - p4, - width_y, - Color::green() ); + const Rect r4{ xpos - size , r.bottom() - top_y_val , size , width_y }; + painter.fill_rectangle( + r4, + Color::green()); + xpos = xpos - size ; + } + if( xpos > r.left() ) + { + const Rect r5{ r.left() , r.top() , xpos - r.left() , r.height() }; + painter.fill_rectangle( + r5, + Color::black()); } } - void RSSIGraph::add_values(int32_t rssi_min, int32_t rssi_avg, int32_t rssi_max, int32_t db ) + void RSSIGraph::add_values(int16_t rssi_min, int16_t rssi_avg, int16_t rssi_max, int16_t db ) { const auto r = screen_rect(); @@ -314,25 +324,30 @@ namespace ui { // vertical bottom to top level meters const range_t y_avg_range { 0, r.height() - 1 }; - const auto y_avg = y_avg_range.clip((rssi_avg - raw_min) * r.height() / raw_delta); + const int16_t y_avg = y_avg_range.clip((rssi_avg - raw_min) * r.height() / raw_delta); const range_t y_min_range { 0, y_avg }; - const auto y_min = y_min_range.clip((rssi_min - raw_min) * r.height() / raw_delta); + const int16_t y_min = y_min_range.clip((rssi_min - raw_min) * r.height() / raw_delta); const range_t y_max_range { y_avg + 1, r.height() - 1 }; - const auto y_max = y_max_range.clip((rssi_max - raw_min) * r.height() / raw_delta); - const range_t db_range { -100 , 20 }; - auto db_ = db_range.clip( db ); - db_ = db_ - 20 ; - db_ = db_ * r.height() / 120 ; + const int16_t y_max = y_max_range.clip((rssi_max - raw_min) * r.height() / raw_delta); + const range_t db_range { -80 , 10 }; + int16_t db_ = db_range.clip( db ); + db_ = db_ - 10 ; + db_ = db_ * r.height() / 90 ; db_ = r.height() + db_ ; graph_list . push_back( { y_min, y_avg, y_max , db_ } ); - if( graph_list.size() > (unsigned)r.width() ) + while( graph_list.size() > nb_columns ) { graph_list.erase( graph_list.begin() ); } set_dirty(); } + void RSSIGraph::set_nb_columns( int16_t nb ) + { + nb_columns = nb ; + } + void RSSI::on_focus() { if( on_highlight ) on_highlight(*this); diff --git a/firmware/application/ui/ui_rssi.hpp b/firmware/application/ui/ui_rssi.hpp index d4adf6ce5..b9f357174 100644 --- a/firmware/application/ui/ui_rssi.hpp +++ b/firmware/application/ui/ui_rssi.hpp @@ -51,10 +51,10 @@ namespace ui { { } - int32_t get_min(); - int32_t get_avg(); - int32_t get_max(); - int32_t get_delta(); + int16_t get_min(); + int16_t get_avg(); + int16_t get_max(); + int16_t get_delta(); void set_vertical_rssi(bool enabled); void set_peak(bool enabled, size_t duration); @@ -64,10 +64,10 @@ namespace ui { bool on_touch(const TouchEvent event) override; private: - int32_t min_ = 0; - int32_t avg_ = 0; - int32_t max_ = 0; - int32_t peak_ = 0 ; + int16_t min_ = 0; + int16_t avg_ = 0; + int16_t max_ = 0; + int16_t peak_ = 0 ; size_t peak_duration_ = 0 ; bool instant_exec_ { false }; @@ -97,10 +97,10 @@ namespace ui { }; struct RSSIGraph_entry { - int32_t rssi_min { 0 }; - int32_t rssi_avg { 0 }; - int32_t rssi_max { 0 }; - int32_t db { 0 }; + int16_t rssi_min { 0 }; + int16_t rssi_avg { 0 }; + int16_t rssi_max { 0 }; + int16_t db { 0 }; }; using RSSIGraphList = std::vector; @@ -113,9 +113,11 @@ namespace ui { { } void paint(Painter& painter) override; - void add_values(int32_t rssi_min, int32_t rssi_avg, int32_t rssi_max, int32_t db ); + void add_values(int16_t rssi_min, int16_t rssi_avg, int16_t rssi_max, int16_t db ); + void set_nb_columns( int16_t nb ); private: + uint16_t nb_columns = 16 ; RSSIGraphList graph_list { } ; }; From a1705dd9d4aa2b432a6587088530bbb94cfe24a1 Mon Sep 17 00:00:00 2001 From: GullCode Date: Tue, 14 Mar 2023 22:23:16 +0100 Subject: [PATCH 2/2] reoganised things a little, added nb_columns management in ui --- firmware/application/apps/ui_level.cpp | 12 ++++++++++-- firmware/application/apps/ui_level.hpp | 19 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/firmware/application/apps/ui_level.cpp b/firmware/application/apps/ui_level.cpp index 51cb98cc2..cd6d80933 100644 --- a/firmware/application/apps/ui_level.cpp +++ b/firmware/application/apps/ui_level.cpp @@ -62,6 +62,7 @@ namespace ui { &field_bw, &field_mode, &step_mode, + &rssi_resolution, &button_frequency, &text_ctcss, &freq_stats_rssi, @@ -143,6 +144,13 @@ namespace ui { } }; + rssi_resolution.on_change = [this](size_t, OptionsField::value_t v) { + if( v != -1 ) + { + rssi_graph.set_nb_columns( v ); + } + }; + audio_mode.on_change = [this](size_t, OptionsField::value_t v) { if( v == 0 ) { @@ -215,7 +223,7 @@ namespace ui { last_min_rssi = rssi.get_min(); last_avg_rssi = rssi.get_avg(); last_max_rssi = rssi.get_max(); - freq_stats_rssi.set( "RSSI: "+to_string_dec_int( rssi.get_min() )+"/"+to_string_dec_int( rssi.get_avg() )+"/"+to_string_dec_int( rssi.get_max() )+" db, dt: "+to_string_dec_int( rssi.get_delta() )+" db" ); + freq_stats_rssi.set( "RSSI: "+to_string_dec_int( rssi.get_min() )+"/"+to_string_dec_int( rssi.get_avg() )+"/"+to_string_dec_int( rssi.get_max() )+",dt: "+to_string_dec_int( rssi.get_delta() ) ); } } /* on_statistic_updates */ @@ -290,7 +298,7 @@ namespace ui { { last_idx = min_idx ; if (min_diff < 40) - text_ctcss.set(tone_keys[min_idx].first); + text_ctcss.set("T: "+tone_keys[min_idx].first); else text_ctcss.set(" "); } diff --git a/firmware/application/apps/ui_level.hpp b/firmware/application/apps/ui_level.hpp index e4c573bdf..7d645f679 100644 --- a/firmware/application/apps/ui_level.hpp +++ b/firmware/application/apps/ui_level.hpp @@ -174,12 +174,13 @@ namespace ui { Text text_ctcss { - { 20 * 8, 3 * 16 + 4 , 14 * 8, 1 * 8 }, + { 22 * 8, 3 * 16 + 4 , 14 * 8, 1 * 8 }, "" }; + // RSSI: XX/XX/XXX,dt: XX Text freq_stats_rssi { - { 0 * 8 , 3 * 16 + 4 , 20 * 8, 16 }, + { 0 * 8 , 3 * 16 + 4 , 22 * 8, 16 }, }; Text freq_stats_db { @@ -188,7 +189,7 @@ namespace ui { OptionsField peak_mode { - { 44 + 10 * 8, 4 * 16 + 4 }, + { 40 + 10 * 8, 4 * 16 + 4 }, 10, { {"peak:none", 0}, @@ -200,6 +201,18 @@ namespace ui { {"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);