From 3157111d08912210f73e6dd0c05a940b09e217a1 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Wed, 13 Apr 2022 18:30:37 +0400 Subject: [PATCH] Bugfix in retuning rate In sweep mode, frequency switching (retuning) must occur only AFTER the requested number of samples has been received. --- firmware/hackrf_usb/usb_api_sweep.c | 46 ++++++++++++++++------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 0b3bb982..4c1cba3e 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -121,6 +121,7 @@ void sweep_mode(uint32_t seq) { // // 7. Process repeats from step 1. + unsigned int blocks_queued = 0; unsigned int phase = 0; bool odd = true; uint16_t range = 0; @@ -170,31 +171,34 @@ void sweep_mode(uint32_t seq) { // Use other buffer next time. phase = (phase + 1) % 2; - // Calculate next sweep frequency. - if(INTERLEAVED == style) { - if(!odd && ((sweep_freq + step_width) >= ((uint64_t)frequencies[1+range*2] * FREQ_GRANULARITY))) { - range = (range + 1) % num_ranges; - sweep_freq = (uint64_t)frequencies[range*2] * FREQ_GRANULARITY; - } else { - if(odd) { - sweep_freq += step_width/4; + if ( ++blocks_queued == dwell_blocks ) { + // Calculate next sweep frequency. + if(INTERLEAVED == style) { + if(!odd && ((sweep_freq + step_width) >= ((uint64_t)frequencies[1+range*2] * FREQ_GRANULARITY))) { + range = (range + 1) % num_ranges; + sweep_freq = (uint64_t)frequencies[range*2] * FREQ_GRANULARITY; } else { - sweep_freq += 3*step_width/4; + if(odd) { + sweep_freq += step_width/4; + } else { + sweep_freq += 3*step_width/4; + } + } + odd = !odd; + } else { + if((sweep_freq + step_width) >= ((uint64_t)frequencies[1+range*2] * FREQ_GRANULARITY)) { + range = (range + 1) % num_ranges; + sweep_freq = (uint64_t)frequencies[range*2] * FREQ_GRANULARITY; + } else { + sweep_freq += step_width; } } - odd = !odd; - } else { - if((sweep_freq + step_width) >= ((uint64_t)frequencies[1+range*2] * FREQ_GRANULARITY)) { - range = (range + 1) % num_ranges; - sweep_freq = (uint64_t)frequencies[range*2] * FREQ_GRANULARITY; - } else { - sweep_freq += step_width; - } + // Retune to new frequency. + nvic_disable_irq(NVIC_USB0_IRQ); + set_freq(sweep_freq + offset); + nvic_enable_irq(NVIC_USB0_IRQ); + blocks_queued = 0; } - // Retune to new frequency. - nvic_disable_irq(NVIC_USB0_IRQ); - set_freq(sweep_freq + offset); - nvic_enable_irq(NVIC_USB0_IRQ); // Wait for M0 to resume RX. while (m0_state.active_mode != M0_MODE_RX)