diff --git a/firmware/application/apps/ui_adsb_rx.cpp b/firmware/application/apps/ui_adsb_rx.cpp index 9fb60cd8..596734f8 100644 --- a/firmware/application/apps/ui_adsb_rx.cpp +++ b/firmware/application/apps/ui_adsb_rx.cpp @@ -32,9 +32,12 @@ #include "rtc_time.hpp" #include "string_format.hpp" #include "file_path.hpp" +#include "audio.hpp" using namespace portapack; +namespace pmem = portapack::persistent_memory; + namespace ui { static std::string get_map_tag(const AircraftRecentEntry& entry) { @@ -373,7 +376,8 @@ ADSBRxView::ADSBRxView(NavigationView& nav) { &rssi, &recent_entries_view, &status_frame, - &status_good_frame}); + &status_good_frame, + &field_volume}); recent_entries_view.set_parent_rect({0, 16, 240, 272}); recent_entries_view.on_select = [this, &nav](const AircraftRecentEntry& entry) { @@ -395,10 +399,16 @@ ADSBRxView::ADSBRxView(NavigationView& nav) { receiver_model.enable(); baseband::set_adsb(); + + if (pmem::beep_on_packets()) { + audio::set_rate(audio::Rate::Hz_24000); + audio::output::start(); + } } ADSBRxView::~ADSBRxView() { rtc_time::signal_tick_second -= signal_token_tick_second; + audio::output::stop(); receiver_model.disable(); baseband::shutdown(); } @@ -473,6 +483,10 @@ void ADSBRxView::on_frame(const ADSBFrameMessage* message) { } logger->log(log_entry); + + if (pmem::beep_on_packets()) { + baseband::request_audio_beep(1000, 24000, 60); + } } void ADSBRxView::on_tick_second() { diff --git a/firmware/application/apps/ui_adsb_rx.hpp b/firmware/application/apps/ui_adsb_rx.hpp index 3e3f6e15..329bbc45 100644 --- a/firmware/application/apps/ui_adsb_rx.hpp +++ b/firmware/application/apps/ui_adsb_rx.hpp @@ -421,19 +421,22 @@ class ADSBRxView : public View { {18 * 8, 0 * 16}}; RSSI rssi{ - {20 * 8, 4, 10 * 7, 8}, + {20 * 8, 4, 7 * 8, 8}, }; ActivityDot status_frame{ - {screen_width - 3, 5, 2, 2}, + {27 * 8 + 2, 5, 2, 2}, Color::white(), }; ActivityDot status_good_frame{ - {screen_width - 3, 9, 2, 2}, + {27 * 8 + 2, 9, 2, 2}, Color::green(), }; + AudioVolumeField field_volume{ + {28 * 8, 0 * 16}}; + MessageHandlerRegistration message_handler_frame{ Message::ID::ADSBFrame, [this](Message* const p) { diff --git a/firmware/baseband/proc_adsbrx.cpp b/firmware/baseband/proc_adsbrx.cpp index 19abe04e..2b5c5cf8 100644 --- a/firmware/baseband/proc_adsbrx.cpp +++ b/firmware/baseband/proc_adsbrx.cpp @@ -26,6 +26,7 @@ #include "portapack_shared_memory.hpp" #include "sine_table_int8.hpp" #include "event_m4.hpp" +#include "audio_dma.hpp" #include #include @@ -144,16 +145,30 @@ void ADSBRXProcessor::execute(const buffer_c8_t& buffer) { } void ADSBRXProcessor::on_message(const Message* const message) { - if (message->id == Message::ID::ADSBConfigure) { - bit_count = 0; - sample_count = 0; - decoding = false; - configured = true; + switch (message->id) { + case Message::ID::ADSBConfigure: + bit_count = 0; + sample_count = 0; + decoding = false; + configured = true; + break; + + case Message::ID::AudioBeep: + on_beep_message(*reinterpret_cast(message)); + break; + + default: + break; } } +void ADSBRXProcessor::on_beep_message(const AudioBeepMessage& message) { + audio::dma::beep_start(message.freq, message.sample_rate, message.duration_ms); +} + #ifndef _WIN32 int main() { + audio::dma::init_audio_out(); EventDispatcher event_dispatcher{std::make_unique()}; event_dispatcher.run(); return 0; diff --git a/firmware/baseband/proc_adsbrx.hpp b/firmware/baseband/proc_adsbrx.hpp index c96e596c..3e65a345 100644 --- a/firmware/baseband/proc_adsbrx.hpp +++ b/firmware/baseband/proc_adsbrx.hpp @@ -53,6 +53,8 @@ class ADSBRXProcessor : public BasebandProcessor { uint32_t shifter[ADSB_PREAMBLE_LENGTH + 1]; + void on_beep_message(const AudioBeepMessage& message); + /* NB: Threads should be the last members in the class definition. */ BasebandThread baseband_thread{baseband_fs, this, baseband::Direction::Receive}; RSSIThread rssi_thread{};