diff --git a/firmware/application/apps/ui_looking_glass_app.cpp b/firmware/application/apps/ui_looking_glass_app.cpp index a9d5a19fa..0d87072e1 100644 --- a/firmware/application/apps/ui_looking_glass_app.cpp +++ b/firmware/application/apps/ui_looking_glass_app.cpp @@ -31,6 +31,7 @@ using namespace portapack; namespace ui { + void GlassView::focus() { range_presets.focus(); } @@ -44,7 +45,7 @@ GlassView::~GlassView() { // Function to map the value from one range to another int32_t GlassView::map(int32_t value, int32_t fromLow, int32_t fromHigh, int32_t toLow, int32_t toHigh) { - return toLow + (value - fromLow) * (toHigh - toLow) / (fromHigh - fromLow); + return toLow + ((value - fromLow) * (toHigh - toLow) + (fromHigh - fromLow) / 2) / (fromHigh - fromLow); } void GlassView::update_display_beep() { @@ -128,8 +129,9 @@ void GlassView::reset_live_view() { max_freq_power = -1000; // Clear screen in peak mode. + const int spectrum_height = screen_height - spectrum_y; if (live_frequency_view == 2) - display.fill_rectangle({{0, 108 + 16}, {screen_width, screen_height - (108 + 16)}}, {0, 0, 0}); + display.fill_rectangle({{0, spectrum_y}, {screen_width, spectrum_height}}, {0, 0, 0}); } void GlassView::add_spectrum_pixel(uint8_t power) { @@ -144,11 +146,9 @@ void GlassView::add_spectrum_pixel(uint8_t power) { constexpr float rssi_voltage_min = 0.4; constexpr float rssi_voltage_max = 2.2; constexpr float adc_voltage_max = 3.3; - constexpr int raw_min = rssi_sample_range * rssi_voltage_min / adc_voltage_max; - constexpr int raw_max = rssi_sample_range * rssi_voltage_max / adc_voltage_max; - constexpr int raw_delta = raw_max - raw_min; - const range_t y_max_range{0, screen_height - (108 + 16)}; - + constexpr int raw_min = 0.5f + rssi_sample_range * rssi_voltage_min / adc_voltage_max; + constexpr int raw_max = 0.5f + rssi_sample_range * rssi_voltage_max / adc_voltage_max; + const int spectrum_height = screen_height - spectrum_y; // drawing and keeping track of max freq for (uint16_t xpos = 0; xpos < screen_width; xpos++) { // save max powerwull freq @@ -156,14 +156,16 @@ void GlassView::add_spectrum_pixel(uint8_t power) { max_freq_power = spectrum_data[xpos]; max_freq_hold = get_freq_from_bin_pos(xpos); } - int16_t point = y_max_range.clip(((spectrum_data[xpos] - raw_min) * (screen_height - (108 + 16))) / raw_delta); - uint8_t color_gradient = (point * 255) / 212; + int16_t point = map(spectrum_data[xpos], 0, 255, 0, spectrum_height); // clear if not in peak view if (live_frequency_view != 2) { - display.fill_rectangle({{xpos, 108 + 16}, {1, screen_height - point}}, {0, 0, 0}); + display.fill_rectangle({{xpos, spectrum_y}, {1, screen_height - point}}, {0, 0, 0}); } - display.fill_rectangle({{xpos, screen_height - point}, {1, point}}, {color_gradient, 0, uint8_t(255 - color_gradient)}); + display.fill_rectangle({{xpos, screen_height - point}, {1, point}}, gradient.lut[spectrum_data[xpos]]); } + // indicate RSSI min and max power + display.fill_rectangle({{0, screen_height - map(raw_min, 0, 255, 0, spectrum_height)}, {screen_width, 1}}, -gradient.lut[raw_min]); + display.fill_rectangle({{0, screen_height - map(raw_max, 0, 255, 0, spectrum_height)}, {screen_width, 1}}, -gradient.lut[raw_max]); if (last_max_freq != max_freq_hold) { last_max_freq = max_freq_hold; freq_stats.set("MAX HOLD: " + to_string_short_freq(max_freq_hold)); diff --git a/firmware/application/apps/ui_looking_glass_app.hpp b/firmware/application/apps/ui_looking_glass_app.hpp index fee8b2c87..168b28763 100644 --- a/firmware/application/apps/ui_looking_glass_app.hpp +++ b/firmware/application/apps/ui_looking_glass_app.hpp @@ -104,6 +104,7 @@ class GlassView : public View { }; void on_freqchg(int64_t freq); + // Function to map the value from one range to another int32_t map(int32_t value, int32_t fromLow, int32_t fromHigh, int32_t toLow, int32_t toHigh); std::vector presets_db{}; void manage_beep_audio(); @@ -164,6 +165,9 @@ class GlassView : public View { uint8_t offset = 0; uint8_t ignore_dc = 0; + // start of spectrum area + static constexpr int spectrum_y = (108 + 16); + Labels labels{ {{0, UI_POS_Y(0)}, "MIN: MAX: LNA VGA ", Theme::getInstance()->fg_light->foreground}, {{0, 1 * 16}, "RANGE: FILTER: AMP:", Theme::getInstance()->fg_light->foreground},