Merge pull request #913 from gullradriel/looking-glass-zoom

Looking glass zoom update
This commit is contained in:
gullradriel 2023-04-24 13:56:04 +02:00 committed by GitHub
commit cffc72c516
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 23 deletions

View File

@ -1,7 +1,6 @@
/* /*
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
* Copyright (C) 2020 euquiq * Copyright (C) 2020 euquiq
* Copyright (C) 2023 gullradriel, Nilorea Studio Inc.
* *
* This file is part of PortaPack. * This file is part of PortaPack.
* *
@ -39,6 +38,16 @@ namespace ui
baseband::shutdown(); baseband::shutdown();
} }
// Returns the next multiple of num that is a multiple of multiplier
int64_t GlassView::next_mult_of(int64_t num, int64_t multiplier) {
return ((num / multiplier) + 1) * multiplier;
}
// Returns the previous multiple of num that is a multiple of multiplier
//int64_t GlassView::prev_mult_of(int64_t num, int64_t multiplier) {
// return (num / multiplier) * multiplier;
//}
void GlassView::adjust_range(int64_t* f_min, int64_t* f_max, int64_t width) { void GlassView::adjust_range(int64_t* f_min, int64_t* f_max, int64_t width) {
int64_t span = *f_max - *f_min; int64_t span = *f_max - *f_min;
int64_t num_intervals = span / width; int64_t num_intervals = span / width;
@ -136,7 +145,7 @@ namespace ui
void GlassView::on_channel_spectrum(const ChannelSpectrum &spectrum) void GlassView::on_channel_spectrum(const ChannelSpectrum &spectrum)
{ {
baseband::spectrum_streaming_stop(); baseband::spectrum_streaming_stop();
if( fast_scan ) if( fast_scan || ( LOOKING_GLASS_SLICE_WIDTH < LOOKING_GLASS_SLICE_WIDTH_MAX ) )
{ {
// Convert bins of this spectrum slice into a representative max_power and when enough, into pixels // Convert bins of this spectrum slice into a representative max_power and when enough, into pixels
// Spectrum.db has 256 bins. Center 12 bins are ignored (DC spike is blanked) Leftmost and rightmost 2 bins are ignored // Spectrum.db has 256 bins. Center 12 bins are ignored (DC spike is blanked) Leftmost and rightmost 2 bins are ignored
@ -168,7 +177,7 @@ namespace ui
if (!pixel_index) // Received indication that a waterfall line has been completed if (!pixel_index) // Received indication that a waterfall line has been completed
{ {
bins_Hz_size = 0; // Since this is an entire pixel line, we don't carry "Pixels into next bin" bins_Hz_size = 0; // Since this is an entire pixel line, we don't carry "Pixels into next bin"
f_center = f_center_ini; // Start a new sweep f_center = f_center_ini - 2 * each_bin_size ; // Start a new sweep
radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving
chThdSleepMilliseconds(10); chThdSleepMilliseconds(10);
baseband::spectrum_streaming_start(); // Do the RX baseband::spectrum_streaming_start(); // Do the RX
@ -177,12 +186,11 @@ namespace ui
bins_Hz_size -= marker_pixel_step; // reset bins size, but carrying the eventual excess Hz into next pixel bins_Hz_size -= marker_pixel_step; // reset bins size, but carrying the eventual excess Hz into next pixel
} }
} }
f_center += 240 * each_bin_size ; // Move into the next bandwidth slice NOTE: spectrum.sampling_rate = LOOKING_GLASS_SLICE_WIDTH
f_center += LOOKING_GLASS_SLICE_WIDTH; // Move into the next bandwidth slice NOTE: spectrum.sampling_rate = LOOKING_GLASS_SLICE_WIDTH
} }
else //slow scan else //slow scan
{ {
for( int16_t bin = 0 ; bin < 120 ; bin++) for (uint8_t bin = 0; bin < 120 ; bin++)
{ {
if (spectrum.db[134 + bin] > max_power) // 134 if (spectrum.db[134 + bin] > max_power) // 134
max_power = spectrum.db[134 + bin]; max_power = spectrum.db[134 + bin];
@ -201,7 +209,7 @@ namespace ui
if (!pixel_index) // Received indication that a waterfall line has been completed if (!pixel_index) // Received indication that a waterfall line has been completed
{ {
bins_Hz_size = 0; // Since this is an entire pixel line, we don't carry "Pixels into next bin" bins_Hz_size = 0; // Since this is an entire pixel line, we don't carry "Pixels into next bin"
f_center = f_center_ini; // Start a new sweep f_center = f_center_ini - 2 * each_bin_size ; // Start a new sweep
radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving
chThdSleepMilliseconds(10); chThdSleepMilliseconds(10);
baseband::spectrum_streaming_start(); // Do the RX baseband::spectrum_streaming_start(); // Do the RX
@ -210,11 +218,10 @@ namespace ui
bins_Hz_size -= marker_pixel_step; // reset bins size, but carrying the eventual excess Hz into next pixel bins_Hz_size -= marker_pixel_step; // reset bins size, but carrying the eventual excess Hz into next pixel
} }
} }
f_center += LOOKING_GLASS_SLICE_WIDTH / 2 ; f_center += 120 * each_bin_size ;
} }
radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving
chThdSleepMilliseconds(5); chThdSleepMilliseconds(5);
// receiver_model.set_tuning_frequency(f_center); //tune rx for this slice
baseband::spectrum_streaming_start(); // Do the RX baseband::spectrum_streaming_start(); // Do the RX
} }
@ -269,7 +276,20 @@ namespace ui
pixel_index = 0; // reset pixel counter pixel_index = 0; // reset pixel counter
max_power = 0; max_power = 0;
bins_Hz_size = 0; // reset amount of Hz filled up by pixels bins_Hz_size = 0; // reset amount of Hz filled up by pixels
if( next_mult_of( (f_max - f_min) , 240 ) <= LOOKING_GLASS_SLICE_WIDTH_MAX )
{
LOOKING_GLASS_SLICE_WIDTH = next_mult_of( (f_max - f_min) , 240 );
receiver_model.set_sampling_rate(LOOKING_GLASS_SLICE_WIDTH);
receiver_model.set_baseband_bandwidth(LOOKING_GLASS_SLICE_WIDTH/2);
}
else if( LOOKING_GLASS_SLICE_WIDTH != LOOKING_GLASS_SLICE_WIDTH_MAX )
{
LOOKING_GLASS_SLICE_WIDTH = LOOKING_GLASS_SLICE_WIDTH_MAX ;
receiver_model.set_sampling_rate(LOOKING_GLASS_SLICE_WIDTH);
receiver_model.set_baseband_bandwidth(LOOKING_GLASS_SLICE_WIDTH);
}
receiver_model.set_squelch_level(0);
each_bin_size = LOOKING_GLASS_SLICE_WIDTH / 240 ;
baseband::set_spectrum(LOOKING_GLASS_SLICE_WIDTH, field_trigger.value()); baseband::set_spectrum(LOOKING_GLASS_SLICE_WIDTH, field_trigger.value());
receiver_model.set_tuning_frequency(f_center_ini); // tune rx for this slice receiver_model.set_tuning_frequency(f_center_ini); // tune rx for this slice
} }
@ -324,8 +344,8 @@ namespace ui
int32_t min_size = steps ; int32_t min_size = steps ;
if( locked_range ) if( locked_range )
min_size = search_span ; min_size = search_span ;
if( min_size < 20 ) if( min_size < 2 )
min_size = 20 ; min_size = 2 ;
if( v > 7200 - min_size ) if( v > 7200 - min_size )
{ {
v = 7200 - min_size ; v = 7200 - min_size ;
@ -347,8 +367,8 @@ namespace ui
int32_t min_size = steps ; int32_t min_size = steps ;
if( locked_range ) if( locked_range )
min_size = search_span ; min_size = search_span ;
if( min_size < 20 ) if( min_size < 2 )
min_size = 20 ; min_size = 2 ;
if( freq > (7200 - min_size ) ) if( freq > (7200 - min_size ) )
freq = 7200 - min_size ; freq = 7200 - min_size ;
field_frequency_min.set_value( freq ); field_frequency_min.set_value( freq );
@ -364,8 +384,8 @@ namespace ui
int32_t min_size = steps ; int32_t min_size = steps ;
if( locked_range ) if( locked_range )
min_size = search_span ; min_size = search_span ;
if( min_size < 20 ) if( min_size < 2 )
min_size = 20 ; min_size = 2 ;
if( v < min_size ) if( v < min_size )
{ {
v = min_size ; v = min_size ;
@ -386,8 +406,8 @@ namespace ui
int32_t min_size = steps ; int32_t min_size = steps ;
if( locked_range ) if( locked_range )
min_size = search_span ; min_size = search_span ;
if( min_size < 20 ) if( min_size < 2 )
min_size = 20 ; min_size = 2 ;
int32_t freq = f / 1000000 ; int32_t freq = f / 1000000 ;
if( freq < min_size ) if( freq < min_size )
freq = min_size ; freq = min_size ;

View File

@ -37,6 +37,7 @@
namespace ui namespace ui
{ {
#define LOOKING_GLASS_SLICE_WIDTH_MAX 19999920
#define MHZ_DIV 1000000 #define MHZ_DIV 1000000
#define X2_MHZ_DIV 2000000 #define X2_MHZ_DIV 2000000
@ -80,11 +81,16 @@ namespace ui
std::vector<preset_entry> presets_db{}; std::vector<preset_entry> presets_db{};
int64_t LOOKING_GLASS_SLICE_WIDTH = 19999920; // Each slice bandwidth 20 MHz and a multiple of 240 // Each slice bandwidth 20 MHz and a multiple of 240
// since we are using LOOKING_GLASS_SLICE_WIDTH/240 as the each_bin_size // since we are using LOOKING_GLASS_SLICE_WIDTH/240 as the each_bin_size
// it should also be a multiple of 2 since we are using LOOKING_GLASS_SLICE_WIDTH / 2 as centering freq // it should also be a multiple of 2 since we are using LOOKING_GLASS_SLICE_WIDTH / 2 as centering freq
int64_t LOOKING_GLASS_SLICE_WIDTH = 19999920;
// frequency rounding helpers
int64_t next_mult_of(int64_t num, int64_t multiplier);
//int64_t prev_mult_of(int64_t num, int64_t multiplier);
void adjust_range(int64_t* f_min, int64_t* f_max, int64_t width); void adjust_range(int64_t* f_min, int64_t* f_max, int64_t width);
void on_channel_spectrum(const ChannelSpectrum& spectrum); void on_channel_spectrum(const ChannelSpectrum& spectrum);
void do_timers(); void do_timers();
void on_range_changed(); void on_range_changed();