From e997e11a5b5fc968508075709a1eb242422fb04e Mon Sep 17 00:00:00 2001 From: "R. van Twisk" Date: Sat, 13 Jun 2026 00:30:19 +0200 Subject: [PATCH 1/3] Added support for two named AceSPI instances --- CHANGELOG.md | 2 +- src/SystemGUI/src/components/modules.js | 6 +- src/lib/acespi/ace/acespi.hpp | 43 +- src/lib/bmp280/ace/bmp280.hpp | 25 +- src/lib/bmp280/ace/src/bmp280.cpp | 2 +- src/lib/config/config_tests/CMakeLists.txt | 1 + src/lib/config/config_tests/config_test.cpp | 12 + src/lib/core/ace/basemodule.hpp | 5 +- src/lib/core/ace/models.hpp | 3 +- src/lib/core/ace/src/basemodule.cpp | 2 +- src/lib/core/ace/src/models.cpp | 3 +- src/lib/sx1262/ace/src/sx1262.cpp | 4 +- src/lib/sx1262/ace/sx1262.hpp | 14 + src/lib/webserver/gatas_fsdata.c | 1241 ++++++++++--------- src/pico/gatas_default_config.json | 21 +- src/pico/main.cpp | 49 +- 16 files changed, 762 insertions(+), 671 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d05fc14..b27b2f94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- +- Added support for two named AceSPI instances, `AceSpi_0` and `AceSpi_1`, with matching SPI provider names `_SPI_0` and `_SPI_1`. ### Changed diff --git a/src/SystemGUI/src/components/modules.js b/src/SystemGUI/src/components/modules.js index da315c21..ede6c6ff 100644 --- a/src/SystemGUI/src/components/modules.js +++ b/src/SystemGUI/src/components/modules.js @@ -17,7 +17,8 @@ class GaTasModules extends El { // Modules we want to hide because they where never tested, or don't provide any usefull information now this.hide = [ "Idle", - "AceSpi", + "AceSpi_0", + "AceSpi_1", "SerialADSB" ]; @@ -97,7 +98,8 @@ class GaTasModules extends El { SerialADSB: (html) => html`Receives ADS-B messages from hardware like the GNS5892. Requires an ADSB Decoder to process messages.`, Dump1090Client: (html) => html`Receives ADS-B messages from Dump1090. Requires an ADSB Decoder to process messages.`, Bmp280: (html) => html`Reads atmospheric pressure using the Bmp280 hardware.`, - AceSpi: (html) => html`Core module for controlling SPI access between different modules.`, + AceSpi_0: (html) => html`Core module for controlling SPI access between different modules.`, + AceSpi_1: (html) => html`Core module for controlling SPI access between different modules.`, Config: (html) => html`Core module for receiving and storing configurations.`, GpsDecoder: (html) => html`Core module for decoding GPS NMEA messages.`, UbloxM8N: (html) => html`Configures uBlox GPS devices`, diff --git a/src/lib/acespi/ace/acespi.hpp b/src/lib/acespi/ace/acespi.hpp index 1b6d5adf..f3553680 100644 --- a/src/lib/acespi/ace/acespi.hpp +++ b/src/lib/acespi/ace/acespi.hpp @@ -17,9 +17,12 @@ #include "ace/messages.hpp" #include "ace/semaphoreguard.hpp" +#ifndef GATAS_SPI_DEFAULT_BUS_FREQUENCY +#define GATAS_SPI_DEFAULT_BUS_FREQUENCY (15) +#endif + /** - * Class that is responsible for managing the Single SPI bus between various devices - * TODO: Add support for two SPI buses + * Class that is responsible for managing an SPI bus between various devices. */ class AceSpi : public SpiModule, public etl::message_router { @@ -40,17 +43,34 @@ class AceSpi : public SpiModule, public etl::message_router SemaphoreHandle_t mutex; public: static constexpr const etl::string_view NAME = "AceSpi"; - AceSpi(etl::imessage_bus &bus, const GATAS::PinTypeMap &pins) : SpiModule(bus), - clk(pins.at(GATAS::PinType::CLK)), - mosi(pins.at(GATAS::PinType::MOSI)), - miso(pins.at(GATAS::PinType::MISO)), - rst(pins.at(GATAS::PinType::RST)), - spi(pins.at(GATAS::PinType::SPI)), - lastBusFrequency(GATAS_SPI_DEFAULT_BUS_FREQUENCY) + static constexpr uint8_t MAX_SPI_MODULES = SpiModule::MAX_SPI_MODULES; + static constexpr etl::array NAMES{"AceSpi_0", "AceSpi_1"}; + + static const GATAS::PinTypeMap pinMap(const Configuration &config, uint8_t device) + { + const auto map = config.pinMap(NAMES[device]); + if (!map.empty()) + { + return map; + } + if (device == 0) + { + return config.pinMap(NAME); + } + return map; + } + + AceSpi(etl::imessage_bus &bus, const GATAS::PinTypeMap &pins, uint8_t device) : SpiModule(bus, SpiModule::NAMES[device]), + clk(pins.at(GATAS::PinType::CLK)), + mosi(pins.at(GATAS::PinType::MOSI)), + miso(pins.at(GATAS::PinType::MISO)), + rst(pins.at(GATAS::PinType::RST)), + spi(pins.at(GATAS::PinType::SPI)), + lastBusFrequency(GATAS_SPI_DEFAULT_BUS_FREQUENCY) { } - AceSpi(etl::imessage_bus &bus, const Configuration &config) : AceSpi(bus, config.pinMap(NAME)) + AceSpi(etl::imessage_bus &bus, const Configuration &config, uint8_t device) : AceSpi(bus, pinMap(config, device), device) { } @@ -76,7 +96,8 @@ class AceSpi : public SpiModule, public etl::message_router virtual SpiGuard getLock(bool &locked) override; - virtual uint8_t spiNum() const { + virtual uint8_t spiNum() const override + { return spi; } diff --git a/src/lib/bmp280/ace/bmp280.hpp b/src/lib/bmp280/ace/bmp280.hpp index 79be31f5..0eb8960e 100644 --- a/src/lib/bmp280/ace/bmp280.hpp +++ b/src/lib/bmp280/ace/bmp280.hpp @@ -7,6 +7,7 @@ #include "ace/constants.hpp" #include "ace/basemodule.hpp" +#include "ace/coreutils.hpp" #include "ace/messages.hpp" /** @@ -24,6 +25,7 @@ class Bmp280 : public BaseModule, public etl::message_router(it->second); + } + return 0; + } + public: static constexpr const etl::string_view NAME = "Bmp280"; - Bmp280(etl::imessage_bus &bus, const Configuration &config) : BaseModule(bus, NAME), - cs(config.pinMap(NAME).at(GATAS::PinType::CS)) + Bmp280(etl::imessage_bus &bus, const GATAS::PinTypeMap &pins, int16_t compensation_) : BaseModule(bus, NAME), + cs(pins.at(GATAS::PinType::CS)), + device(getPin(pins, GATAS::PinType::DEV)), + compensation(compensation_) + { + } + + Bmp280(etl::imessage_bus &bus, const Configuration &config) : Bmp280(bus, config.pinMap(NAME), config.valueByPath(0, NAME, "compensation")) { - compensation = config.valueByPath(0, NAME, "compensation"); } virtual ~Bmp280() = default; diff --git a/src/lib/bmp280/ace/src/bmp280.cpp b/src/lib/bmp280/ace/src/bmp280.cpp index a70fb7b6..be74a373 100644 --- a/src/lib/bmp280/ace/src/bmp280.cpp +++ b/src/lib/bmp280/ace/src/bmp280.cpp @@ -89,7 +89,7 @@ void Bmp280::read_compensation_parameters() GATAS::PostConstruct Bmp280::postConstruct() { - aceSpi = static_cast(BaseModule::moduleByName(*this, SpiModule::NAME)); + aceSpi = static_cast(BaseModule::moduleByName(*this, SpiModule::NAMES[device])); if (aceSpi == nullptr) { return GATAS::PostConstruct::DEP_NOT_FOUND; diff --git a/src/lib/config/config_tests/CMakeLists.txt b/src/lib/config/config_tests/CMakeLists.txt index e39a726b..e7fbf5ff 100644 --- a/src/lib/config/config_tests/CMakeLists.txt +++ b/src/lib/config/config_tests/CMakeLists.txt @@ -25,6 +25,7 @@ FetchContent_MakeAvailable(Catch2) include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/core") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../ace") +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/acespi") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/mocks") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/utils") diff --git a/src/lib/config/config_tests/config_test.cpp b/src/lib/config/config_tests/config_test.cpp index 0481206c..f3380546 100644 --- a/src/lib/config/config_tests/config_test.cpp +++ b/src/lib/config/config_tests/config_test.cpp @@ -18,6 +18,7 @@ const uint8_t DEFAULT_GATAS_CONFIG[] = R"=( #include "inmemorystore.hpp" #include "config.hpp" +#include "ace/acespi.hpp" GATAS::ThreadSafeBus<50> bus; @@ -95,6 +96,17 @@ TEST_CASE("Fully Configured", "[single-file]") REQUIRE(map[GATAS::PinType::SPI] == 0); } + SECTION("AceSpi_0 falls back to legacy AceSpi") + { + GATAS::PinTypeMap map = AceSpi::pinMap(config, 0); + REQUIRE(map.size() == 5); + REQUIRE(map[GATAS::PinType::CLK] == 2); + REQUIRE(map[GATAS::PinType::MOSI] == 3); + REQUIRE(map[GATAS::PinType::MISO] == 4); + REQUIRE(map[GATAS::PinType::RST] == 5); + REQUIRE(map[GATAS::PinType::SPI] == 0); + } + SECTION("NoPort andInvalidPort") { GATAS::PinTypeMap map = config.pinMap("NoPort"); diff --git a/src/lib/core/ace/basemodule.hpp b/src/lib/core/ace/basemodule.hpp index 82a65cf8..d27d24f0 100644 --- a/src/lib/core/ace/basemodule.hpp +++ b/src/lib/core/ace/basemodule.hpp @@ -224,9 +224,10 @@ class SpiModule : public BaseModule { public: static constexpr uint32_t SPI_BUS_READY = 1 << 30; - static constexpr const etl::string_view NAME = "_SPI"; + static constexpr uint8_t MAX_SPI_MODULES = 2; + static constexpr etl::array NAMES{"_SPI_0", "_SPI_1"}; - SpiModule(etl::imessage_bus &bus) : BaseModule(bus, NAME) + SpiModule(etl::imessage_bus &bus, const etl::string_view name) : BaseModule(bus, name) { } virtual ~SpiModule() = default; diff --git a/src/lib/core/ace/models.hpp b/src/lib/core/ace/models.hpp index 99884c90..e71a9bb9 100644 --- a/src/lib/core/ace/models.hpp +++ b/src/lib/core/ace/models.hpp @@ -49,7 +49,8 @@ namespace GATAS P0, P1, P2, - AD0 + AD0, + DEV }; // PinType alias to uint8_t diff --git a/src/lib/core/ace/src/basemodule.cpp b/src/lib/core/ace/src/basemodule.cpp index 4a4f7c53..73323214 100644 --- a/src/lib/core/ace/src/basemodule.cpp +++ b/src/lib/core/ace/src/basemodule.cpp @@ -79,7 +79,7 @@ BaseModule *BaseModule::moduleByName(const BaseModule &that, const etl::string_v // Look for it's provider name eg: _SPI for (auto it = BaseModule::moduleLoaderMap.cbegin(); it != BaseModule::moduleLoaderMap.cend(); it++) { - if (it->second.module->name() == requesting) + if ((it->second.module != nullptr) && (it->second.module->name() == requesting)) { return it->second.module; } diff --git a/src/lib/core/ace/src/models.cpp b/src/lib/core/ace/src/models.cpp index 9ca45aeb..80f377e5 100644 --- a/src/lib/core/ace/src/models.cpp +++ b/src/lib/core/ace/src/models.cpp @@ -25,7 +25,8 @@ namespace GATAS {PinType::P1, "P1"}, {PinType::P2, "P2"}, {PinType::AD0, "AD0"}, - {PinType::SPI, "SPI"}}; + {PinType::SPI, "SPI"}, + {PinType::DEV, "DEV"}}; PinType stringToPinType(const char *str) { diff --git a/src/lib/sx1262/ace/src/sx1262.cpp b/src/lib/sx1262/ace/src/sx1262.cpp index 231bd1af..85def844 100644 --- a/src/lib/sx1262/ace/src/sx1262.cpp +++ b/src/lib/sx1262/ace/src/sx1262.cpp @@ -22,7 +22,7 @@ void Sx1262::start() GATAS::PostConstruct Sx1262::postConstruct() { - spiHall = static_cast(BaseModule::moduleByName(*this, SpiModule::NAME)); + spiHall = static_cast(BaseModule::moduleByName(*this, SpiModule::NAMES[device])); if (spiHall == nullptr) { @@ -648,7 +648,7 @@ void Sx1262::sx1262Trampoline(void *arg) void Sx1262::sx1262Task(void *arg) { (void)arg; - SpiModule *aceSpi = static_cast(BaseModule::moduleByName(*this, SpiModule::NAME)); + SpiModule *aceSpi = spiHall; uint32_t keepTransmittingUntill = 0; bool doListen = false; while (true) diff --git a/src/lib/sx1262/ace/sx1262.hpp b/src/lib/sx1262/ace/sx1262.hpp index f3c5c686..108038a0 100644 --- a/src/lib/sx1262/ace/sx1262.hpp +++ b/src/lib/sx1262/ace/sx1262.hpp @@ -23,6 +23,7 @@ /* GaTas Libraries */ #include "ace/constants.hpp" #include "ace/basemodule.hpp" +#include "ace/coreutils.hpp" #include "ace/messages.hpp" #include "rxdataframequeue.hpp" @@ -154,6 +155,7 @@ class Sx1262 : public Radio, public etl::message_router(it->second); + } + return 0; + } + public: static constexpr etl::array NAMES{"Sx1262_0", "Sx1262_1", "Sx1262_2", "Sx1262_3"}; @@ -180,6 +193,7 @@ class Sx1262 : public Radio, public etl::message_router bus; static Config config(bus, volatileStore, permanentStore, binaryStore, DEFAULT_GATAS_CONFIG); volatile static bool loadIndicator = false; volatile static int8_t ledStatusIndicatorPin = -1; + +static bool hasHardwareConfiguration(const etl::string_view moduleName, const Configuration &config) +{ + if (!config.pinMap(moduleName).empty()) + { + return true; + } + + if (moduleName.ends_with(etl::string_view("_0"))) + { + return !config.pinMap(moduleName.substr(0, moduleName.size() - 2)).empty(); + } + + return false; +} + static void load(const etl::string_view str, etl::imessage_bus &bus, Configuration &config, bool force = false) { if (ledStatusIndicatorPin > -1) @@ -251,7 +263,7 @@ static void load(const etl::string_view str, etl::imessage_bus &bus, Configurati printf("\nLoading %s ... ", str.cbegin()); - if (registeredModules[str].hwCheck && config.pinMap(str).empty()) + if (registeredModules[str].hwCheck && !hasHardwareConfiguration(str, config)) { BaseModule::setModuleStatus(str, GATAS::PostConstruct::HARDWARE_NOT_CONFIGURED); printf("not configured for this device, skipping "); @@ -316,7 +328,8 @@ static void loadModules(void *arg) load(Bluetooth::NAME, bus, config, true); } load(AircraftTracker::NAME, bus, config, true); - load(AceSpi::NAME, bus, config, true); + load(AceSpi::NAMES[0], bus, config, true); + load(AceSpi::NAMES[1], bus, config, true); // Hardware timings, GPS and connectivity load(PicoRtc::NAME, bus, config, true); From a8060a0f52c32e8bd45c5cce417b857ebbde95a3 Mon Sep 17 00:00:00 2001 From: "R. van Twisk" Date: Sat, 13 Jun 2026 10:10:48 +0200 Subject: [PATCH 2/3] Cleanup pins --- src/lib/acespi/ace/acespi.hpp | 11 +---------- src/lib/bmp280/ace/bmp280.hpp | 12 +----------- src/lib/config/ace/config.hpp | 2 +- src/lib/config/ace/src/config.cpp | 18 ++++++++++++++++-- src/lib/config/config_tests/config_test.cpp | 15 +++++++++++++-- src/lib/config/config_tests/test.json | 7 +++++++ src/lib/core/ace/basemodule.hpp | 2 +- src/lib/core/ace/coreutils.hpp | 19 ++++++++++++++++++- src/lib/mocks/mockconfig.h | 2 +- src/lib/sx1262/ace/sx1262.hpp | 12 +----------- src/pico/main.cpp | 9 ++------- 11 files changed, 62 insertions(+), 47 deletions(-) diff --git a/src/lib/acespi/ace/acespi.hpp b/src/lib/acespi/ace/acespi.hpp index f3553680..42ad3d0f 100644 --- a/src/lib/acespi/ace/acespi.hpp +++ b/src/lib/acespi/ace/acespi.hpp @@ -48,16 +48,7 @@ class AceSpi : public SpiModule, public etl::message_router static const GATAS::PinTypeMap pinMap(const Configuration &config, uint8_t device) { - const auto map = config.pinMap(NAMES[device]); - if (!map.empty()) - { - return map; - } - if (device == 0) - { - return config.pinMap(NAME); - } - return map; + return config.pinMap(NAMES[device], device == 0 ? NAME : etl::string_view()); } AceSpi(etl::imessage_bus &bus, const GATAS::PinTypeMap &pins, uint8_t device) : SpiModule(bus, SpiModule::NAMES[device]), diff --git a/src/lib/bmp280/ace/bmp280.hpp b/src/lib/bmp280/ace/bmp280.hpp index 0eb8960e..85ddadd1 100644 --- a/src/lib/bmp280/ace/bmp280.hpp +++ b/src/lib/bmp280/ace/bmp280.hpp @@ -52,21 +52,11 @@ class Bmp280 : public BaseModule, public etl::message_router(it->second); - } - return 0; - } - public: static constexpr const etl::string_view NAME = "Bmp280"; Bmp280(etl::imessage_bus &bus, const GATAS::PinTypeMap &pins, int16_t compensation_) : BaseModule(bus, NAME), cs(pins.at(GATAS::PinType::CS)), - device(getPin(pins, GATAS::PinType::DEV)), + device(CoreUtils::getPin(pins, GATAS::PinType::DEV, 0)), compensation(compensation_) { } diff --git a/src/lib/config/ace/config.hpp b/src/lib/config/ace/config.hpp index 211a4311..3159f3f2 100644 --- a/src/lib/config/ace/config.hpp +++ b/src/lib/config/ace/config.hpp @@ -184,7 +184,7 @@ class Config : public Configuration, public etl::message_router /** * Retreives the pin mapping for a given module, usually used for hardware configurations */ - virtual const GATAS::PinTypeMap pinMap(const etl::string_view moduleName) const override; + virtual const GATAS::PinTypeMap pinMap(const etl::string_view moduleName, const etl::string_view fallback = etl::string_view()) const override; virtual int valueByPath(int defaultValue, const etl::string_view pathToValue, const etl::string_view key) const override; diff --git a/src/lib/config/ace/src/config.cpp b/src/lib/config/ace/src/config.cpp index b96d2b41..7f0487ba 100644 --- a/src/lib/config/ace/src/config.cpp +++ b/src/lib/config/ace/src/config.cpp @@ -292,12 +292,19 @@ void Config::on_receive_unknown(const etl::imessage &msg) (void)msg; } -const GATAS::PinTypeMap Config::pinMap(const etl::string_view moduleName) const +const GATAS::PinTypeMap Config::pinMap(const etl::string_view moduleName, const etl::string_view fallback) const { GATAS::PinTypeMap map; ccharptr hardware = (ccharptr)doc["hardware"]["type"]; - if (JsonObjectConst moduleConfig = doc[hardware][moduleName]; !moduleConfig.isNull()) + + auto loadPinMap = [&](const etl::string_view name) -> bool { + JsonObjectConst moduleConfig = doc[hardware][name]; + if (moduleConfig.isNull()) + { + return false; + } + for (JsonPairConst kv : moduleConfig) { auto pinType = GATAS::stringToPinType(kv.key().c_str()); @@ -306,7 +313,14 @@ const GATAS::PinTypeMap Config::pinMap(const etl::string_view moduleName) const map[pinType] = kv.value().as(); } } + return true; + }; + + if (!loadPinMap(moduleName) && !fallback.empty()) + { + loadPinMap(fallback); } + return map; } diff --git a/src/lib/config/config_tests/config_test.cpp b/src/lib/config/config_tests/config_test.cpp index f3380546..86270f7d 100644 --- a/src/lib/config/config_tests/config_test.cpp +++ b/src/lib/config/config_tests/config_test.cpp @@ -96,9 +96,9 @@ TEST_CASE("Fully Configured", "[single-file]") REQUIRE(map[GATAS::PinType::SPI] == 0); } - SECTION("AceSpi_0 falls back to legacy AceSpi") + SECTION("fallback") { - GATAS::PinTypeMap map = AceSpi::pinMap(config, 0); + GATAS::PinTypeMap map = config.pinMap("AceSpi_1", "AceSpi"); REQUIRE(map.size() == 5); REQUIRE(map[GATAS::PinType::CLK] == 2); REQUIRE(map[GATAS::PinType::MOSI] == 3); @@ -107,6 +107,17 @@ TEST_CASE("Fully Configured", "[single-file]") REQUIRE(map[GATAS::PinType::SPI] == 0); } + SECTION("No fallback") + { + GATAS::PinTypeMap map = config.pinMap("AceSpi_0", "AceSpi"); + REQUIRE(map.size() == 5); + REQUIRE(map[GATAS::PinType::CLK] == 12); + REQUIRE(map[GATAS::PinType::MOSI] == 13); + REQUIRE(map[GATAS::PinType::MISO] == 14); + REQUIRE(map[GATAS::PinType::RST] == 15); + REQUIRE(map[GATAS::PinType::SPI] == 10); + } + SECTION("NoPort andInvalidPort") { GATAS::PinTypeMap map = config.pinMap("NoPort"); diff --git a/src/lib/config/config_tests/test.json b/src/lib/config/config_tests/test.json index 3c867b22..f39a76b7 100644 --- a/src/lib/config/config_tests/test.json +++ b/src/lib/config/config_tests/test.json @@ -102,6 +102,13 @@ "rst": 5, "spi": 0 }, + "AceSpi_0": { + "clk": 12, + "mosi": 13, + "miso": 14, + "rst": 15, + "spi": 10 + }, "UbloxM8N": { "tx": 0, "rx": 1, diff --git a/src/lib/core/ace/basemodule.hpp b/src/lib/core/ace/basemodule.hpp index d27d24f0..393cf07f 100644 --- a/src/lib/core/ace/basemodule.hpp +++ b/src/lib/core/ace/basemodule.hpp @@ -277,7 +277,7 @@ class Configuration : public BaseModule virtual ~Configuration() = default; virtual const GATAS::Config::GaTasConfiguration gaTasConfig() const = 0; - virtual const GATAS::PinTypeMap pinMap(const etl::string_view moduleName) const = 0; + virtual const GATAS::PinTypeMap pinMap(const etl::string_view moduleName, const etl::string_view fallback = etl::string_view()) const = 0; virtual bool deleteData(const etl::string_view fullPath) = 0; virtual int valueByPath(int defaultValue, const etl::string_view pathToValue, const etl::string_view key) const = 0; diff --git a/src/lib/core/ace/coreutils.hpp b/src/lib/core/ace/coreutils.hpp index 4efecef8..98cecb12 100644 --- a/src/lib/core/ace/coreutils.hpp +++ b/src/lib/core/ace/coreutils.hpp @@ -328,7 +328,8 @@ namespace CoreUtils { float theta = atan2f(east, north); float deg = theta * 180.f / M_PI; - if (deg < 0.f) { + if (deg < 0.f) + { deg += 360.f; } return deg; @@ -656,4 +657,20 @@ namespace CoreUtils return speedMs > GATAS::GROUNDSPEED_CONSIDERING_AIRBORN; // 10 m/s threshold for others } } + + /** + * Find a pin number and if not found, return the default + * @param pinMap + * @param pin + * @param defaultNum + */ + inline uint8_t getPin(const GATAS::PinTypeMap &pinMap, GATAS::PinType pin, uint8_t defaultNum) + { + auto it = pinMap.find(pin); + if (it != pinMap.end()) + { + return static_cast(it->second); + } + return defaultNum; + } } diff --git a/src/lib/mocks/mockconfig.h b/src/lib/mocks/mockconfig.h index 18cc07e8..6523c105 100644 --- a/src/lib/mocks/mockconfig.h +++ b/src/lib/mocks/mockconfig.h @@ -31,7 +31,7 @@ class MockConfig : public Configuration {{GATAS::DataSource::OGN, GATAS::DataSourceMode::RX_TX}}}; } - virtual const GATAS::PinTypeMap pinMap(const etl::string_view moduleName) const override + virtual const GATAS::PinTypeMap pinMap(const etl::string_view moduleName, const etl::string_view fallback = etl::string_view()) const override { GATAS::PinTypeMap m; return m; diff --git a/src/lib/sx1262/ace/sx1262.hpp b/src/lib/sx1262/ace/sx1262.hpp index 108038a0..559c24f6 100644 --- a/src/lib/sx1262/ace/sx1262.hpp +++ b/src/lib/sx1262/ace/sx1262.hpp @@ -176,16 +176,6 @@ class Sx1262 : public Radio, public etl::message_router(it->second); - } - return 0; - } - public: static constexpr etl::array NAMES{"Sx1262_0", "Sx1262_1", "Sx1262_2", "Sx1262_3"}; @@ -193,7 +183,7 @@ class Sx1262 : public Radio, public etl::message_router Date: Sat, 13 Jun 2026 11:49:18 +0200 Subject: [PATCH 3/3] Code cleanup --- src/lib/acespi/ace/acespi.hpp | 1 + src/lib/config/config_tests/CMakeLists.txt | 7 +++---- src/lib/config/config_tests/config_test.cpp | 1 - src/lib/sx1262/ace/sx1262.hpp | 1 - 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/lib/acespi/ace/acespi.hpp b/src/lib/acespi/ace/acespi.hpp index 42ad3d0f..be42e170 100644 --- a/src/lib/acespi/ace/acespi.hpp +++ b/src/lib/acespi/ace/acespi.hpp @@ -46,6 +46,7 @@ class AceSpi : public SpiModule, public etl::message_router static constexpr uint8_t MAX_SPI_MODULES = SpiModule::MAX_SPI_MODULES; static constexpr etl::array NAMES{"AceSpi_0", "AceSpi_1"}; + // Only fallback to AceSpi for AceSpi_0 static const GATAS::PinTypeMap pinMap(const Configuration &config, uint8_t device) { return config.pinMap(NAMES[device], device == 0 ? NAME : etl::string_view()); diff --git a/src/lib/config/config_tests/CMakeLists.txt b/src/lib/config/config_tests/CMakeLists.txt index e7fbf5ff..20f40c94 100644 --- a/src/lib/config/config_tests/CMakeLists.txt +++ b/src/lib/config/config_tests/CMakeLists.txt @@ -25,7 +25,6 @@ FetchContent_MakeAvailable(Catch2) include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/core") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../ace") -include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/acespi") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/mocks") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/utils") @@ -69,9 +68,9 @@ set(ALL_EXAMPLE_TARGETS ) foreach( name ${ALL_EXAMPLE_TARGETS} ) - target_link_libraries( - ${name} - Catch2WithMain + target_link_libraries( + ${name} + Catch2WithMain etl ArduinoJson ) diff --git a/src/lib/config/config_tests/config_test.cpp b/src/lib/config/config_tests/config_test.cpp index 86270f7d..371d14b3 100644 --- a/src/lib/config/config_tests/config_test.cpp +++ b/src/lib/config/config_tests/config_test.cpp @@ -18,7 +18,6 @@ const uint8_t DEFAULT_GATAS_CONFIG[] = R"=( #include "inmemorystore.hpp" #include "config.hpp" -#include "ace/acespi.hpp" GATAS::ThreadSafeBus<50> bus; diff --git a/src/lib/sx1262/ace/sx1262.hpp b/src/lib/sx1262/ace/sx1262.hpp index 559c24f6..82697b5b 100644 --- a/src/lib/sx1262/ace/sx1262.hpp +++ b/src/lib/sx1262/ace/sx1262.hpp @@ -175,7 +175,6 @@ class Sx1262 : public Radio, public etl::message_router NAMES{"Sx1262_0", "Sx1262_1", "Sx1262_2", "Sx1262_3"};