diff --git a/firmware/application/apps/ais_app.cpp b/firmware/application/apps/ais_app.cpp index 0be21bda..3e28fb4e 100644 --- a/firmware/application/apps/ais_app.cpp +++ b/firmware/application/apps/ais_app.cpp @@ -20,6 +20,7 @@ */ #include "ais_app.hpp" +#include "audio.hpp" #include "string_format.hpp" #include "database.hpp" @@ -32,6 +33,8 @@ using namespace portapack; #include +namespace pmem = portapack::persistent_memory; + namespace ais { namespace format { @@ -190,6 +193,10 @@ void AISLogger::on_packet(const ais::Packet& packet) { } log_file.write_entry(packet.received_at(), entry); + + if (pmem::beep_on_packets()) { + baseband::request_audio_beep(1000, 24000, 60); + } } void AISRecentEntry::update(const ais::Packet& packet) { @@ -377,6 +384,7 @@ AISAppView::AISAppView(NavigationView& nav) &field_lna, &field_vga, &rssi, + &field_volume, &channel, &recent_entries_view, &recent_entry_detail_view, @@ -402,9 +410,15 @@ AISAppView::AISAppView(NavigationView& nav) if (logger) { logger->append(logs_dir / u"AIS.TXT"); } + + if (pmem::beep_on_packets()) { + audio::set_rate(audio::Rate::Hz_24000); + audio::output::start(); + } } AISAppView::~AISAppView() { + audio::output::stop(); receiver_model.disable(); baseband::shutdown(); } diff --git a/firmware/application/apps/ais_app.hpp b/firmware/application/apps/ais_app.hpp index 175ef463..17aa700d 100644 --- a/firmware/application/apps/ais_app.hpp +++ b/firmware/application/apps/ais_app.hpp @@ -209,6 +209,9 @@ class AISAppView : public View { {21 * 8, 0, 6 * 8, 4}, }; + AudioVolumeField field_volume{ + {28 * 8, 0 * 16}}; + Channel channel{ {21 * 8, 5, 6 * 8, 4}, }; diff --git a/firmware/baseband/proc_ais.cpp b/firmware/baseband/proc_ais.cpp index 6bb4a4aa..d5b2ed86 100644 --- a/firmware/baseband/proc_ais.cpp +++ b/firmware/baseband/proc_ais.cpp @@ -20,6 +20,7 @@ */ #include "proc_ais.hpp" +#include "audio_dma.hpp" #include "portapack_shared_memory.hpp" @@ -64,7 +65,17 @@ void AISProcessor::payload_handler( shared_memory.application_queue.push(message); } +void AISProcessor::on_message(const Message* const message) { + if (message->id == Message::ID::AudioBeep) + on_beep_message(*reinterpret_cast(message)); +} + +void AISProcessor::on_beep_message(const AudioBeepMessage& message) { + audio::dma::beep_start(message.freq, message.sample_rate, message.duration_ms); +} + int main() { + audio::dma::init_audio_out(); EventDispatcher event_dispatcher{std::make_unique()}; event_dispatcher.run(); return 0; diff --git a/firmware/baseband/proc_ais.hpp b/firmware/baseband/proc_ais.hpp index e6e2727d..93c4ef35 100644 --- a/firmware/baseband/proc_ais.hpp +++ b/firmware/baseband/proc_ais.hpp @@ -74,13 +74,15 @@ class AISProcessor : public BasebandProcessor { this->payload_handler(packet); }}; + void consume_symbol(const float symbol); + void payload_handler(const baseband::Packet& packet); + void on_message(const Message* const message); + 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, /*auto_start*/ false}; RSSIThread rssi_thread{}; - - void consume_symbol(const float symbol); - void payload_handler(const baseband::Packet& packet); }; #endif /*__PROC_AIS_H__*/