diff --git a/firmware/baseband/audio_dma.cpp b/firmware/baseband/audio_dma.cpp index 39df845d..56c70c42 100644 --- a/firmware/baseband/audio_dma.cpp +++ b/firmware/baseband/audio_dma.cpp @@ -149,9 +149,14 @@ static volatile const gpdma::channel::LLI* tx_next_lli = nullptr; static volatile const gpdma::channel::LLI* rx_next_lli = nullptr; static bool single_tx_buffer = false; +static uint32_t beep_duration_downcounter = 0; static void tx_transfer_complete() { tx_next_lli = gpdma_channel_i2s0_tx.next_lli(); + + if (beep_duration_downcounter != 0) + if (--beep_duration_downcounter == 0) + beep_stop(); } static void tx_error() { @@ -233,11 +238,16 @@ void shrink_tx_buffer(bool shrink) { lli_tx_loop[0].lli = lli_pointer(&lli_tx_loop[1]); } -void beep_start(uint32_t freq, uint32_t sample_rate) { +void beep_start(uint32_t freq, uint32_t sample_rate, uint32_t beep_duration_ms) { tone_gen.configure_beep(freq, sample_rate); for (size_t i = 0; i < buffer_samples; i++) buffer_tx[i].left = buffer_tx[i].right = tone_gen.process_beep(); + + uint32_t beep_interrupt_count = beep_duration_ms * sample_rate / (1000 * transfer_samples); + if ((beep_duration_ms != 0) && (beep_interrupt_count == 0)) + beep_interrupt_count = 1; + beep_duration_downcounter = beep_interrupt_count; } void beep_stop() { diff --git a/firmware/baseband/audio_dma.hpp b/firmware/baseband/audio_dma.hpp index 2174cd1e..4c98042f 100644 --- a/firmware/baseband/audio_dma.hpp +++ b/firmware/baseband/audio_dma.hpp @@ -47,7 +47,7 @@ void init_audio_in(); void init_audio_out(); void disable(); void shrink_tx_buffer(bool shrink); -void beep_start(uint32_t freq, uint32_t sample_rate); +void beep_start(uint32_t freq, uint32_t sample_rate, uint32_t beep_duration_ms); void beep_stop(); audio::buffer_t tx_empty_buffer(); diff --git a/firmware/baseband/proc_sonde.cpp b/firmware/baseband/proc_sonde.cpp index d89859b0..1f43be2e 100644 --- a/firmware/baseband/proc_sonde.cpp +++ b/firmware/baseband/proc_sonde.cpp @@ -59,7 +59,7 @@ void SondeProcessor::on_message(const Message* const msg) { case Message::ID::RequestSignal: if ((*reinterpret_cast(msg)).signal == RequestSignalMessage::Signal::BeepRequest) { float rssi_ratio = (float)last_rssi / (float)RSSI_CEILING; - int beep_duration = 0; + uint32_t beep_duration = 0; if (rssi_ratio <= PROPORTIONAL_BEEP_THRES) { beep_duration = BEEP_MIN_DURATION; @@ -69,9 +69,7 @@ void SondeProcessor::on_message(const Message* const msg) { beep_duration = BEEP_DURATION_RANGE + BEEP_MIN_DURATION; } - audio::dma::beep_start(beep_freq, AUDIO_SAMPLE_RATE); - chThdSleepMilliseconds(beep_duration); - audio::dma::beep_stop(); + audio::dma::beep_start(beep_freq, AUDIO_SAMPLE_RATE, beep_duration); } break;