diff --git a/firmware/application/apps/ui_looking_glass_app.cpp b/firmware/application/apps/ui_looking_glass_app.cpp index c41409bba..6e03eda2c 100644 --- a/firmware/application/apps/ui_looking_glass_app.cpp +++ b/firmware/application/apps/ui_looking_glass_app.cpp @@ -43,11 +43,6 @@ namespace ui 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) { int64_t span = *f_max - *f_min; int64_t num_intervals = span / width; @@ -144,6 +139,8 @@ namespace ui // Each having the radio signal power for it's corresponding frequency slot void GlassView::on_channel_spectrum(const ChannelSpectrum &spectrum) { + // default fast scan offset + uint8_t offset = 2 ; baseband::spectrum_streaming_stop(); if( fast_scan || ( LOOKING_GLASS_SLICE_WIDTH < LOOKING_GLASS_SLICE_WIDTH_MAX ) ) { @@ -181,8 +178,15 @@ namespace ui max_power = spectrum.db[bin - 118]; } } - - bins_Hz_size += each_bin_size; // add this bin Hz count into the "pixel fulfilled bag of Hz" + + if( bin == 120 ) + { + bins_Hz_size += 12 * each_bin_size; // add DC bin Hz count into the "pixel fulfilled bag of Hz" + } + else + { + bins_Hz_size += each_bin_size; // add this bin Hz count into the "pixel fulfilled bag of Hz" + } if (bins_Hz_size >= marker_pixel_step) // new pixel fullfilled { @@ -196,7 +200,7 @@ namespace ui 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" - f_center = f_center_ini - 2 * each_bin_size ; // Start a new sweep + f_center = f_center_ini - offset * 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 chThdSleepMilliseconds(10); baseband::spectrum_streaming_start(); // Do the RX @@ -205,14 +209,25 @@ namespace ui bins_Hz_size -= marker_pixel_step; // reset bins size, but carrying the eventual excess Hz into next pixel } } - f_center += 238 * each_bin_size ; // Move into the next bandwidth slice NOTE: spectrum.sampling_rate = LOOKING_GLASS_SLICE_WIDTH + f_center += ( 256 - ( 2 * offset ) ) * each_bin_size ; // Move into the next bandwidth slice NOTE: spectrum.sampling_rate = LOOKING_GLASS_SLICE_WIDTH + // lost bins are taken in account so next slice first ignored bins overlap previous kept ones } else //slow scan { - for (uint8_t bin = 0 ; bin < 80 ; bin++) + offset = 32 ; + uint8_t bin_length = 80 ; + for (uint8_t bin = offset ; bin < bin_length + offset ; bin++) { - if (spectrum.db[134 + bin] > max_power) // 134 - max_power = spectrum.db[134 + bin]; + if (bin < 120) + { + if (spectrum.db[134 + bin] > max_power) // 134 + max_power = spectrum.db[134 + bin]; + } + else + { + if (spectrum.db[bin - 118] > max_power) // 118 + max_power = spectrum.db[bin - 118]; + } bins_Hz_size += each_bin_size; // add this bin Hz count into the "pixel fulfilled bag of Hz" @@ -228,7 +243,7 @@ namespace ui 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" - f_center = f_center_ini - 2 * each_bin_size ; // Start a new sweep + f_center = f_center_ini - offset * 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 chThdSleepMilliseconds(10); baseband::spectrum_streaming_start(); // Do the RX @@ -237,7 +252,7 @@ namespace ui bins_Hz_size -= marker_pixel_step; // reset bins size, but carrying the eventual excess Hz into next pixel } } - f_center += 80 * each_bin_size ; + f_center += bin_length * each_bin_size ; } radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving chThdSleepMilliseconds(5); @@ -277,19 +292,16 @@ namespace ui adjust_range( &f_min , &f_max , 240 ); marker_pixel_step = (f_max - f_min) / 240; // Each pixel value in Hz - - f_center_ini = f_min + (LOOKING_GLASS_SLICE_WIDTH / 2); // Initial center frequency for sweep marker = f_min + (f_max - f_min) / 2 ; button_marker.set_text( to_string_short_freq( marker ) ); PlotMarker( marker ); // Refresh marker on screen - pixel_index = 0; // reset pixel counter max_power = 0; 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 ) + if( (f_max - f_min) <= LOOKING_GLASS_SLICE_WIDTH_MAX ) { - LOOKING_GLASS_SLICE_WIDTH = next_mult_of( (f_max - f_min) , 240 ); + LOOKING_GLASS_SLICE_WIDTH = (f_max - f_min) ; receiver_model.set_sampling_rate(LOOKING_GLASS_SLICE_WIDTH); receiver_model.set_baseband_bandwidth(LOOKING_GLASS_SLICE_WIDTH/2); } @@ -299,9 +311,15 @@ namespace ui receiver_model.set_sampling_rate(LOOKING_GLASS_SLICE_WIDTH); receiver_model.set_baseband_bandwidth(LOOKING_GLASS_SLICE_WIDTH); } + if( next_mult_of( LOOKING_GLASS_SLICE_WIDTH , 256 ) > LOOKING_GLASS_SLICE_WIDTH_MAX ) + LOOKING_GLASS_SLICE_WIDTH = LOOKING_GLASS_SLICE_WIDTH_MAX ; + else + LOOKING_GLASS_SLICE_WIDTH = next_mult_of( LOOKING_GLASS_SLICE_WIDTH , 256 ); + receiver_model.set_squelch_level(0); - each_bin_size = LOOKING_GLASS_SLICE_WIDTH / 240 ; - f_center = f_center_ini - 2 * each_bin_size ; // Reset sweep into first slice + each_bin_size = LOOKING_GLASS_SLICE_WIDTH / 256 ; + f_center_ini = f_min + (LOOKING_GLASS_SLICE_WIDTH / 2) ; // Initial center frequency for sweep + f_center = f_center_ini ; // Reset sweep into first slice baseband::set_spectrum(LOOKING_GLASS_SLICE_WIDTH, field_trigger.value()); receiver_model.set_tuning_frequency(f_center_ini); // tune rx for this slice } diff --git a/firmware/application/apps/ui_looking_glass_app.hpp b/firmware/application/apps/ui_looking_glass_app.hpp index cea5caf0e..3b05edb76 100644 --- a/firmware/application/apps/ui_looking_glass_app.hpp +++ b/firmware/application/apps/ui_looking_glass_app.hpp @@ -37,7 +37,7 @@ namespace ui { -#define LOOKING_GLASS_SLICE_WIDTH_MAX 19999920 +#define LOOKING_GLASS_SLICE_WIDTH_MAX 20000000 #define MHZ_DIV 1000000 #define X2_MHZ_DIV 2000000 @@ -81,14 +81,13 @@ namespace ui std::vector<preset_entry> presets_db{}; - // Each slice bandwidth 20 MHz and a multiple of 240 - // since we are using LOOKING_GLASS_SLICE_WIDTH/240 as the each_bin_size + // Each slice bandwidth 20 MHz and a multiple of 256 + // since we are using LOOKING_GLASS_SLICE_WIDTH/256 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 - int64_t LOOKING_GLASS_SLICE_WIDTH = 19999920; + int64_t LOOKING_GLASS_SLICE_WIDTH = 20000000; // 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 on_channel_spectrum(const ChannelSpectrum& spectrum); @@ -110,7 +109,7 @@ namespace ui rf::Frequency f_center_ini { 0 }; rf::Frequency marker { 0 }; rf::Frequency marker_pixel_step { 0 }; - rf::Frequency each_bin_size { LOOKING_GLASS_SLICE_WIDTH / 240 }; + rf::Frequency each_bin_size { LOOKING_GLASS_SLICE_WIDTH / 256 }; rf::Frequency bins_Hz_size { 0 }; uint8_t min_color_power { 0 }; uint32_t pixel_index { 0 };