diff --git a/firmware.bin b/firmware.bin index 2aa820a..50c397e 100644 Binary files a/firmware.bin and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin index 5f3bb55..39d82ae 100644 Binary files a/firmware.packed.bin and b/firmware.packed.bin differ diff --git a/panadapter.c b/panadapter.c index dd17fe0..292bf38 100644 --- a/panadapter.c +++ b/panadapter.c @@ -35,8 +35,10 @@ bool PAN_scanning(void) void PAN_set_freq(void) { // set the frequency - const uint32_t step_size = g_tx_vfo->step_freq; - uint32_t freq = g_tx_vfo->p_rx->frequency; + uint32_t freq = g_tx_vfo->p_rx->frequency; + + uint32_t step_size = g_tx_vfo->step_freq; + step_size = (step_size < PANADAPTER_MIN_STEP) ? PANADAPTER_MIN_STEP : (step_size > PANADAPTER_MAX_STEP) ? PANADAPTER_MAX_STEP : step_size; if (g_panadapter_enabled && g_panadapter_vfo_mode <= 0) { // panadapter mode .. add the bin offset @@ -163,15 +165,22 @@ void PAN_process_10ms(void) #ifdef ENABLE_PANADAPTER_PEAK_FREQ { // find the peak freq - const int32_t step_size = g_tx_vfo->step_freq; const int32_t center_freq = g_tx_vfo->p_rx->frequency; + int32_t step_size = g_tx_vfo->step_freq; + uint8_t peak_rssi = 0; uint8_t threshold_rssi; + uint8_t span_rssi = g_panadapter_max_rssi - g_panadapter_min_rssi; if (span_rssi < 80) span_rssi = 80; + + step_size = (step_size < PANADAPTER_MIN_STEP) ? PANADAPTER_MIN_STEP : (step_size > PANADAPTER_MAX_STEP) ? PANADAPTER_MAX_STEP : step_size; + threshold_rssi = g_panadapter_min_rssi + (span_rssi / 4); + g_panadapter_peak_freq = 0; + for (i = 0; i < (int)ARRAY_SIZE(g_panadapter_rssi); i++) { const uint8_t rssi = g_panadapter_rssi[i]; diff --git a/panadapter.h b/panadapter.h index 2f263dc..ee25d1b 100644 --- a/panadapter.h +++ b/panadapter.h @@ -25,6 +25,9 @@ // number of bins either side of the VFO RX frequency #define PANADAPTER_BINS ((LCD_WIDTH / 2) - 1) +#define PANADAPTER_MAX_STEP 2500 +#define PANADAPTER_MIN_STEP 625 + extern bool g_panadapter_enabled; extern uint32_t g_panadapter_peak_freq; extern int g_panadapter_vfo_mode; diff --git a/ui/main.c b/ui/main.c index f37993b..558e1a2 100644 --- a/ui/main.c +++ b/ui/main.c @@ -424,14 +424,11 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int g_current_function == FUNCTION_TRANSMIT || g_current_function == FUNCTION_POWER_SAVE || g_monitor_enabled) - { + { // don't draw the panadapter return; } -// if (g_squelch_open) -// return; - - // auto scale + // auto vertical scale max_rssi = g_panadapter_max_rssi; min_rssi = g_panadapter_min_rssi; span_rssi = max_rssi - min_rssi; @@ -450,7 +447,7 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int #ifdef ENABLE_PANADAPTER_PEAK_FREQ if (g_panadapter_peak_freq > 0) - { + { // print the peak frequency char str[16]; sprintf(str, "%u.%05u", g_panadapter_peak_freq / 100000, g_panadapter_peak_freq % 100000); NUMBER_trim_trailing_zeros(str); @@ -458,10 +455,10 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int } #endif - // center marker (the VFO frequency) - base_line[PANADAPTER_BINS - (LCD_WIDTH * 2)] = 0x07; + // draw top center vertical marker (the VFO frequency) + base_line[PANADAPTER_BINS - (LCD_WIDTH * 2)] = 0x0F; - // top horizontal line + // draw top horizontal dotted line for (i = 0; i < PANADAPTER_BINS; i += 4) { const unsigned int k = PANADAPTER_BINS - (LCD_WIDTH * 2); @@ -469,25 +466,25 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int base_line[k + i] |= 1u; } - // draw the vertical bins + // draw the panadapter vertical bins for (i = 0; i < ARRAY_SIZE(g_panadapter_rssi); i++) { - uint8_t rssi = g_panadapter_rssi[i]; uint32_t pixels; + uint8_t rssi = g_panadapter_rssi[i]; #if 0 rssi = (rssi < ((-129 + 160) * 2)) ? 0 : rssi - ((-129 + 160) * 2); // min of -129dBm (S3) rssi = rssi >> 2; #else - rssi = ((rssi - min_rssi) * 20) / span_rssi; // 0 ~ 20 + rssi = ((uint16_t)(rssi - min_rssi) * 20) / span_rssi; // 0 ~ 20 #endif - rssi += 2; - if (rssi > 21) - rssi = 21; + rssi += 2; // offset from the bottom + if (rssi > 22) + rssi = 22; // limit peak value - pixels = (1u << rssi) - 1; - pixels &= 0xfffffffe; + pixels = (1u << rssi) - 1; // set the line pixels + pixels &= 0xfffffffe; // clear the bottom line base_line[i - (LCD_WIDTH * 2)] |= bit_reverse_8(pixels >> 16); base_line[i - (LCD_WIDTH * 1)] |= bit_reverse_8(pixels >> 8);