From 49bda2407919b2b850cb1982db9f3b5ac23501ad Mon Sep 17 00:00:00 2001 From: GullCode Date: Thu, 16 Mar 2023 10:33:36 +0100 Subject: [PATCH 1/5] added steps config and thus possibility to adjust config / see under 240 MHz --- .../application/apps/ui_looking_glass_app.cpp | 46 ++- .../application/apps/ui_looking_glass_app.hpp | 350 +++++++++--------- 2 files changed, 220 insertions(+), 176 deletions(-) diff --git a/firmware/application/apps/ui_looking_glass_app.cpp b/firmware/application/apps/ui_looking_glass_app.cpp index 8854b9740..0df793faa 100644 --- a/firmware/application/apps/ui_looking_glass_app.cpp +++ b/firmware/application/apps/ui_looking_glass_app.cpp @@ -184,6 +184,7 @@ namespace ui &field_lna, &field_vga, &text_range, + &steps_config, &filter_config, &field_rf_amp, &range_presets, @@ -194,21 +195,51 @@ namespace ui load_Presets(); // Load available presets from TXT files (or default) field_frequency_min.set_value(presets_db[0].min); // Defaults to first preset + field_frequency_min.set_step( steps ); field_frequency_min.on_change = [this](int32_t v) { - if (v >= field_frequency_max.value()) - field_frequency_max.set_value(v + 240); + if( v > 7200 - steps ) + v = 7200 - steps ; + if (v >= (field_frequency_max.value() - steps ) ) + field_frequency_max.set_value( v + steps ); this->on_range_changed(); }; + field_frequency_min.on_select = [this, &nav](NumberField& field) { + auto new_view = nav_.push(field_frequency_min.value()*1000000); + new_view->on_changed = [this, &field](rf::Frequency f) { + int32_t freq = f / 1000000 ; + if( freq > (7200 - steps ) ) + freq= 7200 - steps ; + field_frequency_min.set_value( freq ); + if( field_frequency_max.value() < ( freq + steps ) ) + field_frequency_max.set_value( freq + steps ); + }; + }; + field_frequency_max.set_value(presets_db[0].max); // Defaults to first preset + field_frequency_max.set_step( steps ); field_frequency_max.on_change = [this](int32_t v) { - if (v <= field_frequency_min.value()) - field_frequency_min.set_value(v - 240); + if( v < steps ) + v = steps ; + if (v < (field_frequency_min.value() + steps) ) + field_frequency_min.set_value(v - steps); this->on_range_changed(); }; + field_frequency_max.on_select = [this, &nav](NumberField& field) { + auto new_view = nav_.push(field_frequency_max.value()*1000000); + new_view->on_changed = [this, &field](rf::Frequency f) { + int32_t freq = f / 1000000 ; + if( freq < steps ) + freq= steps ; + field_frequency_max.set_value( freq ); + if( field_frequency_min.value() > ( freq - steps) ) + field_frequency_min.set_value( freq - steps ); + }; + }; + field_lna.set_value(receiver_model.lna()); field_lna.on_change = [this](int32_t v) { @@ -221,11 +252,12 @@ namespace ui this->on_vga_changed(v_db); }; - filter_config.set_selected_index(0); - filter_config.on_change = [this](size_t n, OptionsField::value_t v) + steps_config.set_selected_index(3); //default of 250 Mhz steps + steps_config.on_change = [this](size_t n, OptionsField::value_t v) { (void)n; - min_color_power = v; + field_frequency_min.set_step( v ); + field_frequency_max.set_step( v ); }; range_presets.on_change = [this](size_t n, OptionsField::value_t v) diff --git a/firmware/application/apps/ui_looking_glass_app.hpp b/firmware/application/apps/ui_looking_glass_app.hpp index 33e4c9371..f9089b1ed 100644 --- a/firmware/application/apps/ui_looking_glass_app.hpp +++ b/firmware/application/apps/ui_looking_glass_app.hpp @@ -1,190 +1,202 @@ /* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2020 euquiq - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2020 euquiq + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ #ifndef _UI_GLASS #define _UI_GLASS - #include "ui.hpp" - #include "portapack.hpp" - #include "baseband_api.hpp" - #include "receiver_model.hpp" - #include "ui_widget.hpp" - #include "ui_navigation.hpp" - #include "ui_receiver.hpp" - #include "string_format.hpp" - #include "analog_audio_app.hpp" - #include "spectrum_color_lut.hpp" +#include "ui.hpp" +#include "portapack.hpp" +#include "baseband_api.hpp" +#include "receiver_model.hpp" +#include "ui_widget.hpp" +#include "ui_navigation.hpp" +#include "ui_receiver.hpp" +#include "string_format.hpp" +#include "analog_audio_app.hpp" +#include "spectrum_color_lut.hpp" - namespace ui - { - #define LOOKING_GLASS_SLICE_WIDTH 20000000 // Each slice bandwidth 20 MHz - #define MHZ_DIV 1000000 - #define X2_MHZ_DIV 2000000 +namespace ui +{ +#define LOOKING_GLASS_SLICE_WIDTH 20000000 // Each slice bandwidth 20 MHz +#define MHZ_DIV 1000000 +#define X2_MHZ_DIV 2000000 - class GlassView : public View - { - public: - GlassView(NavigationView &nav); + class GlassView : public View + { + public: + GlassView(NavigationView &nav); - GlassView( const GlassView &); - GlassView& operator=(const GlassView &nav); + GlassView( const GlassView &); + GlassView& operator=(const GlassView &nav); - ~GlassView(); - std::string title() const override { return "Looking Glass"; }; + ~GlassView(); + std::string title() const override { return "Looking Glass"; }; - void on_show() override; - void on_hide() override; - void focus() override; + void on_show() override; + void on_hide() override; + void focus() override; - private: - NavigationView& nav_; + private: + NavigationView& nav_; - struct preset_entry - { - rf::Frequency min{}; - rf::Frequency max{}; - std::string label{}; - }; - - std::vector presets_db{}; - - void on_channel_spectrum(const ChannelSpectrum& spectrum); - void do_timers(); - void on_range_changed(); - void on_lna_changed(int32_t v_db); - void on_vga_changed(int32_t v_db); - void add_spectrum_pixel(Color color); - void PlotMarker(rf::Frequency pos); - void load_Presets(); - void txtline_process(std::string& line); - void populate_Presets(); - void presets_Default(); - - rf::Frequency f_min { 0 }, f_max { 0 }; - rf::Frequency search_span { 0 }; - rf::Frequency f_center { 0 }; - rf::Frequency f_center_ini { 0 }; - rf::Frequency marker_pixel_step { 0 }; - rf::Frequency each_bin_size { LOOKING_GLASS_SLICE_WIDTH / 240 }; - rf::Frequency bins_Hz_size { 0 }; - uint8_t min_color_power { 0 }; - uint32_t pixel_index { 0 }; - std::array spectrum_row = { 0 }; - ChannelSpectrumFIFO* fifo { nullptr }; - uint8_t max_power = 0; - - Labels labels{ - {{0, 0}, "MIN: MAX: LNA VGA ", Color::light_grey()}, - {{0, 1 * 16}, " RANGE: FILTER: AMP:", Color::light_grey()}, - {{0, 2 * 16}, "PRESET:", Color::light_grey()}, - {{0, 3 * 16}, "MARKER: MHz +/- MHz", Color::light_grey()}, - {{0, 4 * 16}, "RESOLUTION: (fft trigger)", Color::light_grey()} - }; - - NumberField field_frequency_min { - { 4 * 8, 0 * 16 }, - 4, - { 0, 6960 }, - 240, - ' ' - }; - - NumberField field_frequency_max { - { 13 * 8, 0 * 16 }, - 4, - { 240, 7200 }, - 240, - ' ' - }; - - LNAGainField field_lna { - { 21 * 8, 0 * 16 } - }; - - VGAGainField field_vga { - { 27 * 8, 0 * 16 } - }; - - Text text_range{ - {7 * 8, 1 * 16, 4 * 8, 16}, - ""}; - - OptionsField filter_config{ - {19 * 8, 1 * 16}, - 4, + struct preset_entry { - {"OFF ", 0}, - {"MID ", 118}, //85 +25 (110) + a bit more to kill all blue - {"HIGH", 202}, //168 + 25 (193) - }}; + rf::Frequency min{}; + rf::Frequency max{}; + std::string label{}; + }; - RFAmpField field_rf_amp{ - {29 * 8, 1 * 16}}; + std::vector presets_db{}; - OptionsField range_presets{ - {7 * 8, 2 * 16}, - 20, - { - {" NONE (WIFI 2.4GHz)", 0}, - }}; + void on_channel_spectrum(const ChannelSpectrum& spectrum); + void do_timers(); + void on_range_changed(); + void on_lna_changed(int32_t v_db); + void on_vga_changed(int32_t v_db); + void add_spectrum_pixel(Color color); + void PlotMarker(rf::Frequency pos); + void load_Presets(); + void txtline_process(std::string& line); + void populate_Presets(); + void presets_Default(); - NumberField field_marker{ - {7 * 8, 3 * 16}, - 4, - {0, 7200}, - 25, - ' '}; + rf::Frequency f_min { 0 }, f_max { 0 }; + rf::Frequency search_span { 0 }; + rf::Frequency f_center { 0 }; + rf::Frequency f_center_ini { 0 }; + rf::Frequency marker_pixel_step { 0 }; + rf::Frequency each_bin_size { LOOKING_GLASS_SLICE_WIDTH / 240 }; + rf::Frequency bins_Hz_size { 0 }; + uint8_t min_color_power { 0 }; + uint32_t pixel_index { 0 }; + std::array spectrum_row = { 0 }; + ChannelSpectrumFIFO* fifo { nullptr }; + uint8_t max_power = 0; + int32_t steps = 250 ; // default of 250 Mhz steps - Text text_marker_pm{ - {20 * 8, 3 * 16, 2 * 8, 16}, - ""}; + Labels labels{ + {{0, 0}, "MIN: MAX: LNA VGA ", Color::light_grey()}, + {{0, 1 * 16}, " RANGE: FILTER: AMP:", Color::light_grey()}, + {{0, 2 * 16}, "PRESET:", Color::light_grey()}, + {{0, 3 * 16}, "MARKER: MHz +/- MHz", Color::light_grey()}, + {{0, 4 * 16}, "RESOLUTION: STEPS:", Color::light_grey()} + }; - NumberField field_trigger{ - {11 * 8, 4 * 16}, - 3, - {2, 128}, - 2, - ' '}; + NumberField field_frequency_min { + { 4 * 8, 0 * 16 }, + 4, + { 0, 7199 }, + 1, // number of steps by encoder delta + ' ' + }; + + NumberField field_frequency_max { + { 13 * 8, 0 * 16 }, + 4, + { 1, 7200 }, + 1, // number of steps by encoder delta + ' ' + }; + + LNAGainField field_lna { + { 21 * 8, 0 * 16 } + }; + + VGAGainField field_vga { + { 27 * 8, 0 * 16 } + }; + + Text text_range{ + {7 * 8, 1 * 16, 4 * 8, 16}, + ""}; + + OptionsField steps_config{ + { 22 * 8, 4 * 16}, + 4, + { + {"1", 1}, + {"50", 50}, + {"100", 100}, + {"250", 250}, + {"500", 500}, + {"1000", 1000}, + }}; + + OptionsField filter_config{ + {19 * 8, 1 * 16}, + 4, + { + {"OFF ", 0}, + {"MID ", 118}, //85 +25 (110) + a bit more to kill all blue + {"HIGH", 202}, //168 + 25 (193) + }}; + + RFAmpField field_rf_amp{ + {29 * 8, 1 * 16}}; + + OptionsField range_presets{ + {7 * 8, 2 * 16}, + 20, + { + {" NONE (WIFI 2.4GHz)", 0}, + }}; + + NumberField field_marker{ + {7 * 8, 3 * 16}, + 4, + {0, 7200}, + 25, + ' '}; + + Text text_marker_pm{ + {20 * 8, 3 * 16, 2 * 8, 16}, + ""}; + + NumberField field_trigger{ + {11 * 8, 4 * 16}, + 3, + {2, 128}, + 2, + ' '}; - MessageHandlerRegistration message_handler_spectrum_config { - Message::ID::ChannelSpectrumConfig, - [this](const Message* const p) { - const auto message = *reinterpret_cast(p); - this->fifo = message.fifo; - } - }; - MessageHandlerRegistration message_handler_frame_sync { - Message::ID::DisplayFrameSync, - [this](const Message* const) { - if( this->fifo ) { - ChannelSpectrum channel_spectrum; - while( fifo->out(channel_spectrum) ) { - this->on_channel_spectrum(channel_spectrum); - } - } - } - }; - - }; - } + MessageHandlerRegistration message_handler_spectrum_config { + Message::ID::ChannelSpectrumConfig, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + this->fifo = message.fifo; + } + }; + MessageHandlerRegistration message_handler_frame_sync { + Message::ID::DisplayFrameSync, + [this](const Message* const) { + if( this->fifo ) { + ChannelSpectrum channel_spectrum; + while( fifo->out(channel_spectrum) ) { + this->on_channel_spectrum(channel_spectrum); + } + } + } + }; + }; +} #endif From 63d0201b71ae6490af0a43f65ffb6fe41f936437 Mon Sep 17 00:00:00 2001 From: GullCode Date: Thu, 16 Mar 2023 11:32:26 +0100 Subject: [PATCH 2/5] Fixing set freq and min step value --- firmware/application/apps/ui_looking_glass_app.cpp | 9 +++++++++ firmware/application/apps/ui_looking_glass_app.hpp | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/firmware/application/apps/ui_looking_glass_app.cpp b/firmware/application/apps/ui_looking_glass_app.cpp index 0df793faa..417fc5e48 100644 --- a/firmware/application/apps/ui_looking_glass_app.cpp +++ b/firmware/application/apps/ui_looking_glass_app.cpp @@ -199,7 +199,10 @@ namespace ui field_frequency_min.on_change = [this](int32_t v) { if( v > 7200 - steps ) + { v = 7200 - steps ; + field_frequency_min.set_value( v ); + } if (v >= (field_frequency_max.value() - steps ) ) field_frequency_max.set_value( v + steps ); this->on_range_changed(); @@ -214,6 +217,7 @@ namespace ui field_frequency_min.set_value( freq ); if( field_frequency_max.value() < ( freq + steps ) ) field_frequency_max.set_value( freq + steps ); + this->on_range_changed(); }; }; @@ -222,7 +226,10 @@ namespace ui field_frequency_max.on_change = [this](int32_t v) { if( v < steps ) + { v = steps ; + field_frequency_max.set_value( v ); + } if (v < (field_frequency_min.value() + steps) ) field_frequency_min.set_value(v - steps); this->on_range_changed(); @@ -237,6 +244,7 @@ namespace ui field_frequency_max.set_value( freq ); if( field_frequency_min.value() > ( freq - steps) ) field_frequency_min.set_value( freq - steps ); + this->on_range_changed(); }; }; @@ -258,6 +266,7 @@ namespace ui (void)n; field_frequency_min.set_step( v ); field_frequency_max.set_step( v ); + steps = v ; }; range_presets.on_change = [this](size_t n, OptionsField::value_t v) diff --git a/firmware/application/apps/ui_looking_glass_app.hpp b/firmware/application/apps/ui_looking_glass_app.hpp index f9089b1ed..05f950d13 100644 --- a/firmware/application/apps/ui_looking_glass_app.hpp +++ b/firmware/application/apps/ui_looking_glass_app.hpp @@ -133,7 +133,7 @@ namespace ui { 22 * 8, 4 * 16}, 4, { - {"1", 1}, + {"20", 20}, {"50", 50}, {"100", 100}, {"250", 250}, From 149cd755caab0ebd876e594b6881ce00364aceb7 Mon Sep 17 00:00:00 2001 From: GullCode Date: Thu, 16 Mar 2023 11:56:24 +0100 Subject: [PATCH 3/5] Restoring min step of 1, forcing 20Mhz minimum wide view --- .../application/apps/ui_looking_glass_app.cpp | 26 ++++++++++++------- .../application/apps/ui_looking_glass_app.hpp | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/firmware/application/apps/ui_looking_glass_app.cpp b/firmware/application/apps/ui_looking_glass_app.cpp index 417fc5e48..94127d245 100644 --- a/firmware/application/apps/ui_looking_glass_app.cpp +++ b/firmware/application/apps/ui_looking_glass_app.cpp @@ -198,13 +198,17 @@ namespace ui field_frequency_min.set_step( steps ); field_frequency_min.on_change = [this](int32_t v) { - if( v > 7200 - steps ) + int32_t steps_ = steps ; + if( steps_ < 20 ) + steps_ = 20 ; + + if( v > 7200 - steps_ ) { - v = 7200 - steps ; + v = 7200 - steps_ ; field_frequency_min.set_value( v ); } - if (v >= (field_frequency_max.value() - steps ) ) - field_frequency_max.set_value( v + steps ); + if (v >= (field_frequency_max.value() - steps_ ) ) + field_frequency_max.set_value( v + steps_ ); this->on_range_changed(); }; @@ -224,14 +228,18 @@ namespace ui field_frequency_max.set_value(presets_db[0].max); // Defaults to first preset field_frequency_max.set_step( steps ); field_frequency_max.on_change = [this](int32_t v) - { - if( v < steps ) + { + int32_t steps_ = steps ; + if( steps_ < 20 ) + steps_ = 20 ; + + if( v < steps_ ) { - v = steps ; + v = steps_ ; field_frequency_max.set_value( v ); } - if (v < (field_frequency_min.value() + steps) ) - field_frequency_min.set_value(v - steps); + if (v < (field_frequency_min.value() + steps_) ) + field_frequency_min.set_value(v - steps_); this->on_range_changed(); }; diff --git a/firmware/application/apps/ui_looking_glass_app.hpp b/firmware/application/apps/ui_looking_glass_app.hpp index 05f950d13..f9089b1ed 100644 --- a/firmware/application/apps/ui_looking_glass_app.hpp +++ b/firmware/application/apps/ui_looking_glass_app.hpp @@ -133,7 +133,7 @@ namespace ui { 22 * 8, 4 * 16}, 4, { - {"20", 20}, + {"1", 1}, {"50", 50}, {"100", 100}, {"250", 250}, From 7b5f138dfb962810957ea6baa7ce282b33b758b0 Mon Sep 17 00:00:00 2001 From: GullCode Date: Thu, 16 Mar 2023 12:03:00 +0100 Subject: [PATCH 4/5] Fixing max(field_frequency_max.value()*1000000); new_view->on_changed = [this, &field](rf::Frequency f) { int32_t freq = f / 1000000 ; - if( freq < steps ) - freq= steps ; + if( freq < 20 ) + freq = 20 ; field_frequency_max.set_value( freq ); if( field_frequency_min.value() > ( freq - steps) ) field_frequency_min.set_value( freq - steps ); From 93f966bdcda716813d096f95e75467423f20454f Mon Sep 17 00:00:00 2001 From: GullCode Date: Thu, 16 Mar 2023 12:09:13 +0100 Subject: [PATCH 5/5] Fixing 20MHz boudaries --- .../application/apps/ui_looking_glass_app.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/firmware/application/apps/ui_looking_glass_app.cpp b/firmware/application/apps/ui_looking_glass_app.cpp index a80667a31..35c852cec 100644 --- a/firmware/application/apps/ui_looking_glass_app.cpp +++ b/firmware/application/apps/ui_looking_glass_app.cpp @@ -201,7 +201,6 @@ namespace ui int32_t steps_ = steps ; if( steps_ < 20 ) steps_ = 20 ; - if( v > 7200 - steps_ ) { v = 7200 - steps_ ; @@ -216,11 +215,14 @@ namespace ui auto new_view = nav_.push(field_frequency_min.value()*1000000); new_view->on_changed = [this, &field](rf::Frequency f) { int32_t freq = f / 1000000 ; - if( freq > (7200 - steps ) ) - freq= 7200 - steps ; + int32_t steps_ = steps ; + if( steps_ < 20 ) + steps_ = 20 ; + if( freq > (7200 - steps_ ) ) + freq= 7200 - steps_ ; field_frequency_min.set_value( freq ); - if( field_frequency_max.value() < ( freq + steps ) ) - field_frequency_max.set_value( freq + steps ); + if( field_frequency_max.value() < ( freq + steps_ ) ) + field_frequency_max.set_value( freq + steps_ ); this->on_range_changed(); }; }; @@ -232,7 +234,6 @@ namespace ui int32_t steps_ = steps ; if( steps_ < 20 ) steps_ = 20 ; - if( v < steps_ ) { v = steps_ ; @@ -246,6 +247,9 @@ namespace ui field_frequency_max.on_select = [this, &nav](NumberField& field) { auto new_view = nav_.push(field_frequency_max.value()*1000000); new_view->on_changed = [this, &field](rf::Frequency f) { + int32_t steps_ = steps ; + if( steps_ < 20 ) + steps_ = 20 ; int32_t freq = f / 1000000 ; if( freq < 20 ) freq = 20 ;