diff --git a/firmware/application/CMakeLists.txt b/firmware/application/CMakeLists.txt index eae7fa53d..36f6607b5 100644 --- a/firmware/application/CMakeLists.txt +++ b/firmware/application/CMakeLists.txt @@ -285,7 +285,6 @@ set(CPPSRC apps/capture_app.cpp apps/pocsag_app.cpp apps/ui_about_simple.cpp - apps/ui_aprs_rx.cpp apps/ui_aprs_tx.cpp apps/ui_battinfo.cpp apps/ui_bmp_file_viewer.cpp diff --git a/firmware/application/external/aprs_rx/main.cpp b/firmware/application/external/aprs_rx/main.cpp new file mode 100644 index 000000000..518f37ce7 --- /dev/null +++ b/firmware/application/external/aprs_rx/main.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2026 PortaPack Mayhem + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "ui_aprs_rx.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::aprs_rx { + +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} + +} // namespace ui::external_app::aprs_rx + +extern "C" { + +__attribute__((section(".external_app.app_aprs_rx.application_information"), used)) application_information_t _application_information_aprs_rx = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::aprs_rx::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "APRS", + /*.bitmap_data = */ { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, + 0x4C, 0x32, 0xFE, 0x7F, 0x25, 0xA4, 0x25, 0xA4, + 0xFF, 0xFF, 0x25, 0xA4, 0x25, 0xA4, 0xFE, 0x7F, + 0x4C, 0x32, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, + }, + /*.icon_color = */ ui::Color::green().v, + /*.menu_location = */ app_location_t::RX, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_aprs_rx */ {'P', 'A', 'P', 'R'}, + /*.m4_app_offset = */ 0x00000000, +}; + +} // extern "C" diff --git a/firmware/application/apps/ui_aprs_rx.cpp b/firmware/application/external/aprs_rx/ui_aprs_rx.cpp similarity index 97% rename from firmware/application/apps/ui_aprs_rx.cpp rename to firmware/application/external/aprs_rx/ui_aprs_rx.cpp index bada71afa..020032382 100644 --- a/firmware/application/apps/ui_aprs_rx.cpp +++ b/firmware/application/external/aprs_rx/ui_aprs_rx.cpp @@ -31,19 +31,25 @@ using namespace portapack; +namespace ui::external_app::aprs_rx { + void APRSLogger::log_raw_data(const std::string& data) { log_file.write_entry(data); } +} // namespace ui::external_app::aprs_rx + namespace ui { template <> -void RecentEntriesTable::draw( +void RecentEntriesTable::draw( const Entry& entry, const Rect& target_rect, Painter& painter, const Style& style, RecentEntriesColumns& columns) { + using namespace external_app::aprs_rx; + Color target_color; // auto entry_age = entry.age; @@ -68,6 +74,10 @@ void RecentEntriesTable::draw( } } +} // namespace ui + +namespace ui::external_app::aprs_rx { + void APRSRxView::focus() { options_region.focus(); } @@ -402,4 +412,4 @@ void APRSRXView::focus() { APRSRXView::~APRSRXView() { } -} /* namespace ui */ +} // namespace ui::external_app::aprs_rx diff --git a/firmware/application/apps/ui_aprs_rx.hpp b/firmware/application/external/aprs_rx/ui_aprs_rx.hpp similarity index 99% rename from firmware/application/apps/ui_aprs_rx.hpp rename to firmware/application/external/aprs_rx/ui_aprs_rx.hpp index bcb10b07c..08685619d 100644 --- a/firmware/application/apps/ui_aprs_rx.hpp +++ b/firmware/application/external/aprs_rx/ui_aprs_rx.hpp @@ -38,6 +38,8 @@ #include "utility.hpp" #include "file_path.hpp" +namespace ui::external_app::aprs_rx { + class APRSLogger { public: Optional append(const std::filesystem::path& filename) { @@ -50,8 +52,6 @@ class APRSLogger { LogFile log_file{}; }; -namespace ui { - struct APRSRecentEntry { using Key = uint64_t; @@ -290,6 +290,6 @@ class APRSRXView : public View { }}; }; -} /* namespace ui */ +} // namespace ui::external_app::aprs_rx #endif /*__UI_APRS_RX_H__*/ diff --git a/firmware/application/external/external.cmake b/firmware/application/external/external.cmake index ac1d01e43..bdcf023d7 100644 --- a/firmware/application/external/external.cmake +++ b/firmware/application/external/external.cmake @@ -399,6 +399,10 @@ set(EXTCPPSRC external/ais_rx/main.cpp external/ais_rx/ais_app.cpp + #aprs rx + external/aprs_rx/main.cpp + external/aprs_rx/ui_aprs_rx.cpp + ) set(EXTAPPLIST @@ -495,6 +499,7 @@ set(EXTAPPLIST tetra_rx adsbrx ais_rx + aprs_rx ) # sdusb has type conflicts with PRALINE (HackRF Pro) - add only for non-PRALINE builds diff --git a/firmware/application/external/external.ld b/firmware/application/external/external.ld index 911d3d793..b370bdcaf 100644 --- a/firmware/application/external/external.ld +++ b/firmware/application/external/external.ld @@ -117,6 +117,7 @@ MEMORY ram_external_app_tetra_rx (rwx) : org = 0xAE0C0000, len = 32k ram_external_app_adsbrx (rwx) : org = 0xAE0D0000, len = 32k ram_external_app_ais_rx (rwx) : org = 0xAE0E0000, len = 32k + ram_external_app_aprs_rx (rwx) : org = 0xAE0F0000, len = 32k } SECTIONS @@ -685,6 +686,12 @@ SECTIONS *(*ui*external_app*ais_rx*); } > ram_external_app_ais_rx + .external_app_aprs_rx : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_aprs_rx.application_information)); + *(*ui*external_app*aprs_rx*); + } > ram_external_app_aprs_rx + } diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 7a3d901e2..ca5440d36 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -30,7 +30,6 @@ #include "portapack.hpp" #include "ui_about_simple.hpp" -#include "ui_aprs_rx.hpp" #include "ui_aprs_tx.hpp" #include "ui_btle_rx.hpp" #include "ui_debug.hpp" @@ -97,7 +96,6 @@ const NavigationView::AppList NavigationView::appList = { {nullptr, "Games", HOME, Color::cyan(), &bitmap_icon_games, new ViewFactory()}, {nullptr, "Settings", HOME, Color::cyan(), &bitmap_icon_setup, new ViewFactory()}, /* RX ********************************************************************/ - {"aprsrx", "APRS", RX, Color::green(), &bitmap_icon_aprs, new ViewFactory()}, {"audio", "Audio", RX, Color::green(), &bitmap_icon_speaker, new ViewFactory()}, {"blerx", "BLE Rx", RX, Color::green(), &bitmap_icon_btle, new ViewFactory()}, {"pocsag", "POCSAG", RX, Color::green(), &bitmap_icon_pocsag, new ViewFactory()}, diff --git a/firmware/tools/external_app_info.py b/firmware/tools/external_app_info.py index fb82f3716..dab932f97 100644 --- a/firmware/tools/external_app_info.py +++ b/firmware/tools/external_app_info.py @@ -24,4 +24,4 @@ # external app address ranges below must match those in linker file "external.ld" maximum_application_size = 32*1024 external_apps_address_start = 0xADB00000 -external_apps_address_end = 0xAE0F0000 +external_apps_address_end = 0xAE100000