diff --git a/firmware/application/apps/ui_sonde.cpp b/firmware/application/apps/ui_sonde.cpp index b3691f1b..25bac356 100644 --- a/firmware/application/apps/ui_sonde.cpp +++ b/firmware/application/apps/ui_sonde.cpp @@ -72,6 +72,8 @@ SondeView::SondeView(NavigationView& nav) check_beep.on_select = [this](Checkbox&, bool v) { beep = v; + if (v) + baseband::request_beep(); }; check_log.on_select = [this](Checkbox&, bool v) { diff --git a/firmware/baseband/audio_dma.cpp b/firmware/baseband/audio_dma.cpp index f8e843b0..39df845d 100644 --- a/firmware/baseband/audio_dma.cpp +++ b/firmware/baseband/audio_dma.cpp @@ -25,9 +25,11 @@ #include #include #include +#include #include "hal.h" #include "gpdma.hpp" +#include "tone_gen.hpp" using namespace lpc43xx; @@ -36,6 +38,8 @@ using namespace lpc43xx; namespace audio { namespace dma { +ToneGen tone_gen{}; + constexpr uint32_t gpdma_ahb_master_peripheral = 1; constexpr uint32_t gpdma_ahb_master_memory = 0; constexpr uint32_t gpdma_ahb_master_lli_fetch = 0; @@ -229,6 +233,17 @@ 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) { + 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(); +} + +void beep_stop() { + memset(&buffer_tx, 0, buffer_bytes); +} + buffer_t tx_empty_buffer() { const auto next_lli = tx_next_lli; if (next_lli) { diff --git a/firmware/baseband/audio_dma.hpp b/firmware/baseband/audio_dma.hpp index 41573524..2174cd1e 100644 --- a/firmware/baseband/audio_dma.hpp +++ b/firmware/baseband/audio_dma.hpp @@ -47,6 +47,8 @@ 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_stop(); audio::buffer_t tx_empty_buffer(); audio::buffer_t rx_empty_buffer(); diff --git a/firmware/baseband/proc_sonde.cpp b/firmware/baseband/proc_sonde.cpp index 7c145ed3..d89859b0 100644 --- a/firmware/baseband/proc_sonde.cpp +++ b/firmware/baseband/proc_sonde.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2017 Furrtek + * Copyright (C) 2024 Mark Thompson * * This file is part of PortaPack. * @@ -26,16 +27,12 @@ #include "event_m4.hpp" -#include "audio_output.hpp" #include "audio_dma.hpp" SondeProcessor::SondeProcessor() { decim_0.configure(taps_11k0_decim_0.taps); decim_1.configure(taps_11k0_decim_1.taps); - audio_output.configure(false); - - tone_gen.configure(BEEP_BASE_FREQ, 1.0, ToneGen::tone_type::sine, AUDIO_SAMPLE_RATE); baseband_thread.start(); } @@ -55,23 +52,6 @@ void SondeProcessor::execute(const buffer_c8_t& buffer) { clock_recovery_fsk_4800(mf.get_output()); } } - - if (pitch_rssi_enabled) { - if (beep_play) { - // if we let the buffer underrun, for some reason - // once it starts looping it ignores zero (silence) - // samples, so we need to keep feeding the buffer - // and not be able to take advantage of the circular - // buffer loop: - // beep_play = false; - generate_beep(); - } - - if (silence_play) { - // silence_play = false; - generate_silence(); - } - } } void SondeProcessor::on_message(const Message* const msg) { @@ -89,9 +69,9 @@ void SondeProcessor::on_message(const Message* const msg) { beep_duration = BEEP_DURATION_RANGE + BEEP_MIN_DURATION; } - play_beep(); + audio::dma::beep_start(beep_freq, AUDIO_SAMPLE_RATE); chThdSleepMilliseconds(beep_duration); - stop_beep(); + audio::dma::beep_stop(); } break; @@ -104,41 +84,11 @@ void SondeProcessor::on_message(const Message* const msg) { } } -void SondeProcessor::play_beep() { - beep_play = true; - silence_play = false; -} - -void SondeProcessor::stop_beep() { - beep_play = false; - silence_play = true; -} - -void SondeProcessor::generate_beep() { - // here we let the samples be created using the ToneGen class: - - for (uint8_t i = 0; i < sizeof(audio_buffer.p); i++) { - audio_buffer.p[i] = (int16_t)((tone_gen.process(0) >> 16) & 0x0000FFFF); - } - - audio_output.write(audio_buffer); -} - -void SondeProcessor::generate_silence() { - for (uint8_t i = 0; i < sizeof(audio_buffer.p); i++) { - audio_buffer.p[i] = 0; - } - - audio_output.write(audio_buffer); -} - void SondeProcessor::pitch_rssi_config(const PitchRSSIConfigureMessage& message) { pitch_rssi_enabled = message.enabled; - uint32_t freq = (int)((float)message.rssi * (float)RSSI_PITCH_WEIGHT + (float)BEEP_BASE_FREQ); - + beep_freq = (int)((float)message.rssi * (float)RSSI_PITCH_WEIGHT + (float)BEEP_BASE_FREQ); last_rssi = message.rssi; - tone_gen.configure(freq, 1.0, ToneGen::tone_type::sine, AUDIO_SAMPLE_RATE); } int main() { diff --git a/firmware/baseband/proc_sonde.hpp b/firmware/baseband/proc_sonde.hpp index 93ed22e1..8f9283e3 100644 --- a/firmware/baseband/proc_sonde.hpp +++ b/firmware/baseband/proc_sonde.hpp @@ -2,6 +2,7 @@ * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2017 Furrtek * Copyright (C) 2014 zilog80 + * Copyright (C) 2024 Mark Thompson * * This file is part of PortaPack. * @@ -88,9 +89,6 @@ #include "message.hpp" #include "portapack_shared_memory.hpp" -#include "audio_output.hpp" -#include "tone_gen.hpp" - #include "buffer.hpp" #include @@ -115,21 +113,10 @@ class SondeProcessor : public BasebandProcessor { private: static constexpr size_t baseband_fs = 2457600; - std::array audio{}; - - const buffer_s16_t audio_buffer{ - (int16_t*)audio.data(), - sizeof(audio) / sizeof(int16_t)}; - - AudioOutput audio_output{}; - - bool beep_play{false}; - bool silence_play{false}; bool pitch_rssi_enabled{false}; uint32_t last_rssi{0}; - - ToneGen tone_gen{}; + uint32_t beep_freq{0}; std::array dst{}; const buffer_c16_t dst_buffer{ @@ -181,21 +168,6 @@ class SondeProcessor : public BasebandProcessor { baseband_fs, this, baseband::Direction::Receive, /*auto_start*/ false}; RSSIThread rssi_thread{}; - void play_beep(); - void stop_beep(); - - /** - * Used for filling the audio buffer with the waveform - * generated by the ToneGen class: - * - */ - void generate_beep(); - - /** - * Used for filling the audio buffer with silence: - */ - void generate_silence(); - void pitch_rssi_config(const PitchRSSIConfigureMessage& message); }; diff --git a/firmware/baseband/tone_gen.cpp b/firmware/baseband/tone_gen.cpp index 44737663..f1b7565d 100644 --- a/firmware/baseband/tone_gen.cpp +++ b/firmware/baseband/tone_gen.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2017 Furrtek + * Copyright (C) 2024 Mark Thompson * * This file is part of PortaPack. * @@ -23,53 +24,18 @@ #include "tone_gen.hpp" #include "sine_table_int8.hpp" -/* -int32_t ToneGen::tone_sine() { - // TODO : Added for Sonde App. We keep it by now , but it needs to be reviewed in Sonde - // Hoepfully we can manage without it , same as previous fw 1.3.1 - int32_t tone_sample = sine_table_i8[tone_phase_] * 0x1000000; - tone_phase_ += delta_; - - return tone_sample; +// Functions for audio beep (used by Sonde RSSI) +void ToneGen::configure_beep(const uint32_t freq, const uint32_t sample_rate) { + f_delta_ = (float)(freq * sizeof(sine_table_i8)) / sample_rate; } -*/ -int32_t ToneGen::tone_square() { - // TODO : Added for Sonde App. We keep it by now , but it needs to be reviewed in Sonde - int32_t tone_sample = 0; - - if (tone_phase_ < (UINT32_MAX / 2)) { - tone_sample = INT32_MAX; - } else { - tone_sample = INT32_MIN; - } - - tone_phase_ += delta_; +int16_t ToneGen::process_beep() { + int16_t tone_sample = sine_table_i8[(uint32_t)f_tone_phase_ & 0xFF] * 256; + f_tone_phase_ += f_delta_; return tone_sample; } -/* -void ToneGen::configure(const uint32_t delta, const float tone_mix_weight) { - // Confirmed ! It is not working well in the fw 1.4.4 Mic App , CTCSS generation, (but added for Sonde App) - // I Think it should be deleted or modified but not use it as it is in Mic App . - - delta_ = (uint8_t) ((delta & 0xFF000000U) >> 24); - delta_ = delta; - tone_mix_weight_ = tone_mix_weight; - input_mix_weight_ = 1.0 - tone_mix_weight; - current_tone_type_ = sine; -} -*/ - -void ToneGen::configure(const uint32_t freq, const float tone_mix_weight, const tone_type tone_type, const uint32_t sample_rate) { - // TODO : Added for Sonde App. We keep it by now to avoid compile errors, but it needs to be reviewed in Sonde - delta_ = (uint8_t)((freq * sizeof(sine_table_i8)) / sample_rate); - tone_mix_weight_ = tone_mix_weight; - input_mix_weight_ = 1.0 - tone_mix_weight; - current_tone_type_ = tone_type; -} - // ----Original available core SW code from fw 1.3.1 , Working also well in Mic App CTCSS Gen from fw 1.4.0 onwards // Original direct-look-up synthesis algorithm with Fractional delta phase. It is OK @@ -90,17 +56,4 @@ int32_t ToneGen::process(const int32_t sample_in) { tone_phase_ += delta_; return (sample_in * input_mix_weight_) + (tone_sample * tone_mix_weight_); -} -// ------------------------------------------------------------- - -int32_t ToneGen::process_square(const int32_t sample_in) { - // TODO : Added for Sonde App. We keep it by now , but it needs to be reviewed in Sonde - if (!delta_) - return sample_in; - - int32_t tone_sample = 0; - - tone_sample = tone_square(); - - return (sample_in * input_mix_weight_) + (tone_sample * tone_mix_weight_); -} +} \ No newline at end of file diff --git a/firmware/baseband/tone_gen.hpp b/firmware/baseband/tone_gen.hpp index 2bbb7a5a..d688e254 100644 --- a/firmware/baseband/tone_gen.hpp +++ b/firmware/baseband/tone_gen.hpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2017 Furrtek + * Copyright (C) 2024 Mark Thompson * * This file is part of PortaPack. * @@ -28,40 +29,21 @@ class ToneGen { public: - enum tone_type { sine, - square }; // TODO: Added for Radio Sonde.cpp PR 376, 381 , we need to check if keep or not. - - /*ToneGen(const size_t sample_rate - ) : sample_rate_ { sample_rate } - {};*/ - void configure(const uint32_t delta, const float tone_mix_weight); - void configure(const uint32_t freq, const float tone_mix_weight, const tone_type tone_type, const uint32_t sample_rate); - int32_t process(const int32_t sample_in); - int32_t process_square(const int32_t sample_in); + + void configure_beep(const uint32_t freq, const uint32_t sample_rate); + int16_t process_beep(); private: - tone_type current_tone_type_{sine}; - float input_mix_weight_{1}; float tone_mix_weight_{0}; + float f_delta_{0.0}; + float f_tone_phase_{0.0}; + uint32_t delta_{0}; uint32_t tone_phase_{0}; - - // uint8_t delta_ { 0 }; // TODO: Added for Radio Sonde.cpp PR 376, 381 , we need to check if keep or not. - // uint8_t tone_phase_ { 0 }; // TODO: Added for Radio Sonde.cpp PR 376, 381 , we need to check if keep or not. - - /** - * Generator function which selects every other sample from the reference sine waveform to the output sample: - */ - int32_t tone_sine(); // TODO: Added for Radio Sonde.cpp PR 376, 381 , we need to check if keep or not. - - /** - * Generator function for square waves: - */ - int32_t tone_square(); // TODO: Added for Radio Sonde.cpp PR 376, 381 , we need to check if keep or not. }; #endif /* __TONE_GEN_H__ */