From 646260706e3c29f02d78da8eda11381d1fcb6df5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nicol=C3=B2=20Caruso?= <niccolo.caruso@skywarder.eu>
Date: Wed, 2 Oct 2024 15:17:11 +0200
Subject: [PATCH] [GS] Fixes and dipSwitch now read in initial part of the
 entrypoint

Submodules: Update on skyward-boardcore
Dipswitch: Removed from the radio and created custom constructor to pass its parameters
CMakeList: Added also Base things to the entrypoint of lyra-s

TODO: The Interrupts of the radio must be changed.
---
 CMakeLists.txt                                |  2 +-
 .../Groundstation/Automated/Radio/Radio.cpp   | 20 ++++++---------
 .../Groundstation/Automated/Radio/Radio.h     |  9 +++++++
 src/boards/Groundstation/Base/Radio/Radio.cpp | 25 ++++++++-----------
 src/boards/Groundstation/Base/Radio/Radio.h   | 18 +++++++++++++
 src/boards/Groundstation/DipReader.h          | 21 +++++++---------
 6 files changed, 56 insertions(+), 39 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4bb168dbf..e2d327a37 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -126,7 +126,7 @@ sbs_target(test-actuators stm32f767zi_automated_antennas)
 
 add_executable(lyra-gs-entry
     src/entrypoints/Groundstation/lyra-gs-entry.cpp
-    ${ANTENNAS} ${GROUNDSTATION_COMMON} ${GROUNDSTATION_AUTOMATED}
+    ${ANTENNAS} ${GROUNDSTATION_COMMON} ${GROUNDSTATION_AUTOMATED} ${GROUNDSTATION_BASE}
 )
 target_include_directories(lyra-gs-entry PRIVATE ${OBSW_INCLUDE_DIRS})
 sbs_target(lyra-gs-entry stm32f767zi_lyra_gs)
diff --git a/src/boards/Groundstation/Automated/Radio/Radio.cpp b/src/boards/Groundstation/Automated/Radio/Radio.cpp
index fcfc6e95e..c652e9ea2 100644
--- a/src/boards/Groundstation/Automated/Radio/Radio.cpp
+++ b/src/boards/Groundstation/Automated/Radio/Radio.cpp
@@ -26,7 +26,6 @@
 #include <Groundstation/Automated/Buses.h>
 #include <Groundstation/Automated/Hub.h>
 #include <Groundstation/Common/Ports/Serial.h>
-#include <Groundstation/DipReader.h>
 #include <interfaces-impl/hwmapping.h>
 #include <radio/SX1278/SX1278Frontends.h>
 
@@ -54,23 +53,20 @@ namespace Antennas
 
 bool RadioMain::start()
 {
-    DipReader dipSwitch;
-    DipStatus dipStatus = dipSwitch.readDip();
+    std::unique_ptr<Boardcore::SX1278Fsk> sx1278;
 
     std::unique_ptr<SX1278::ISX1278Frontend> frontend;
 
-    if (dipStatus.hasBackup)
-        frontend = std::make_unique<EbyteFrontend>(radio1::txen::getPin(),
-                                                   radio1::rxen::getPin());
+    if (hasBackup)
+        frontend = std::make_unique<EbyteFrontend>(radio::txen::getPin(),
+                                                   radio::rxen::getPin());
     else
         frontend = std::make_unique<Skyward433Frontend>();
 
-    std::unique_ptr<Boardcore::SX1278Fsk> sx1278 =
-        std::make_unique<Boardcore::SX1278Fsk>(
-            ModuleManager::getInstance().get<Antennas::Buses>()->radio_bus,
-            radio::cs::getPin(), radio::dio0::getPin(), radio::dio1::getPin(),
-            radio::dio3::getPin(), SPI::ClockDivider::DIV_64,
-            std::move(frontend));
+    sx1278 = std::make_unique<Boardcore::SX1278Fsk>(
+        ModuleManager::getInstance().get<Antennas::Buses>()->radio_bus,
+        radio::cs::getPin(), radio::dio0::getPin(), radio::dio1::getPin(),
+        radio::dio3::getPin(), SPI::ClockDivider::DIV_64, std::move(frontend));
 
     // First check if the device is even connected
     bool present = sx1278->checkVersion();
diff --git a/src/boards/Groundstation/Automated/Radio/Radio.h b/src/boards/Groundstation/Automated/Radio/Radio.h
index 4feaa8738..fbf769656 100644
--- a/src/boards/Groundstation/Automated/Radio/Radio.h
+++ b/src/boards/Groundstation/Automated/Radio/Radio.h
@@ -31,6 +31,15 @@ class RadioMain : public Groundstation::RadioBase, public Boardcore::Module
 {
 public:
     [[nodiscard]] bool start();
+
+    RadioMain(bool hasBackup, uint8_t ipConfig)
+        : hasBackup{hasBackup}, ipConfig{ipConfig} {};
+
+    RadioMain() : hasBackup{false}, ipConfig{0} {};
+
+private:
+    bool hasBackup   = false;
+    uint8_t ipConfig = 0;
 };
 
 }  // namespace Antennas
\ No newline at end of file
diff --git a/src/boards/Groundstation/Base/Radio/Radio.cpp b/src/boards/Groundstation/Base/Radio/Radio.cpp
index 3996b0999..d7c763f90 100644
--- a/src/boards/Groundstation/Base/Radio/Radio.cpp
+++ b/src/boards/Groundstation/Base/Radio/Radio.cpp
@@ -26,7 +26,6 @@
 #include <Groundstation/Base/Buses.h>
 #include <Groundstation/Base/Hub.h>
 #include <Groundstation/Common/Ports/Serial.h>
-#include <Groundstation/DipReader.h>
 #include <radio/SX1278/SX1278Frontends.h>
 
 using namespace Groundstation;
@@ -66,12 +65,10 @@ void __attribute__((used)) MIOSIX_RADIO2_DIO3_IRQ()
 
 bool RadioMain::start()
 {
-    DipReader dipSwitch;
-    DipStatus dipStatus = dipSwitch.readDip();
 
     std::unique_ptr<SX1278::ISX1278Frontend> frontend;
 
-    if (dipStatus.hasBackup)
+    if (hasBackup)
         frontend = std::make_unique<EbyteFrontend>(radio1::txen::getPin(),
                                                    radio1::rxen::getPin());
     else
@@ -111,21 +108,21 @@ bool RadioMain::start()
 
 bool RadioPayload::start()
 {
-#ifdef SKYWARD_GS_PAYLOAD_USE_BACKUP_RF
-    std::unique_ptr<SX1278::ISX1278Frontend> frontend =
-        std::make_unique<EbyteFrontend>(radio2::txen::getPin(),
-                                        radio2::rxen::getPin());
-#else
-    std::unique_ptr<SX1278::ISX1278Frontend> frontend =
-        std::make_unique<Skyward433Frontend>();
-#endif
+    std::unique_ptr<SX1278::ISX1278Frontend> frontend;
+    std::unique_ptr<Boardcore::SX1278Fsk> sx1278;
+    if (hasBackup)
+        frontend = std::make_unique<EbyteFrontend>(radio2::txen::getPin(),
+                                                   radio2::rxen::getPin());
+    else
+    {
+        frontend = std::make_unique<Skyward433Frontend>();
 
-    std::unique_ptr<Boardcore::SX1278Fsk> sx1278 =
-        std::make_unique<Boardcore::SX1278Fsk>(
+        sx1278 = std::make_unique<Boardcore::SX1278Fsk>(
             ModuleManager::getInstance().get<Buses>()->radio2_bus,
             radio2::cs::getPin(), radio2::dio0::getPin(),
             radio2::dio1::getPin(), radio2::dio3::getPin(),
             SPI::ClockDivider::DIV_64, std::move(frontend));
+    }
 
     // First check if the device is even connected
     bool present = sx1278->checkVersion();
diff --git a/src/boards/Groundstation/Base/Radio/Radio.h b/src/boards/Groundstation/Base/Radio/Radio.h
index e09d207c9..9e4881596 100644
--- a/src/boards/Groundstation/Base/Radio/Radio.h
+++ b/src/boards/Groundstation/Base/Radio/Radio.h
@@ -31,12 +31,30 @@ class RadioMain : public Groundstation::RadioBase, public Boardcore::Module
 {
 public:
     [[nodiscard]] bool start();
+
+    RadioMain(bool hasBackup, uint8_t ipConfig)
+        : hasBackup{hasBackup}, ipConfig{ipConfig} {};
+
+    RadioMain() : hasBackup{false}, ipConfig{0} {};
+
+private:
+    bool hasBackup   = false;
+    uint8_t ipConfig = 0;
 };
 
 class RadioPayload : public Groundstation::RadioBase, public Boardcore::Module
 {
 public:
     [[nodiscard]] bool start();
+
+    RadioPayload(bool hasBackup, uint8_t ipConfig)
+        : hasBackup{hasBackup}, ipConfig{ipConfig} {};
+
+    RadioPayload() : hasBackup{false}, ipConfig{0} {};
+
+private:
+    bool hasBackup   = false;
+    uint8_t ipConfig = 0;
 };
 
 }  // namespace GroundstationBase
\ No newline at end of file
diff --git a/src/boards/Groundstation/DipReader.h b/src/boards/Groundstation/DipReader.h
index 5681b6f29..ad6878677 100644
--- a/src/boards/Groundstation/DipReader.h
+++ b/src/boards/Groundstation/DipReader.h
@@ -20,6 +20,7 @@
  * THE SOFTWARE.
  */
 
+#include <interfaces-impl/hwmapping.h>
 #include <miosix.h>
 
 /**
@@ -29,12 +30,7 @@ struct DipStatus
 {
     bool isARP;
     bool hasBackup;
-    bool ip0;
-    bool ip1;
-    bool ip2;
-    bool ip3;
-    bool ip4;
-    bool ip5;
+    uint8_t ipConfig;
 };
 
 /**
@@ -46,6 +42,7 @@ public:
     static DipStatus readDip()
     {
         DipStatus dipReading;
+        dipReading.ipConfig = 0;
 
         // Write to the shift register (CS == Not LD)
         miosix::dipSwitch::sh::low();
@@ -58,12 +55,12 @@ public:
         // Read first register GS(0)/ARP(1)
         dipReading.isARP     = readBit();
         dipReading.hasBackup = readBit();
-        dipReading.ip0       = readBit();
-        dipReading.ip1       = readBit();
-        dipReading.ip2       = readBit();
-        dipReading.ip3       = readBit();
-        dipReading.ip4       = readBit();
-        dipReading.ip5       = readBit();
+        dipReading.ipConfig |= readBit();
+        dipReading.ipConfig |= readBit() << 1;
+        dipReading.ipConfig |= readBit() << 2;
+        dipReading.ipConfig |= readBit() << 3;
+        dipReading.ipConfig |= readBit() << 4;
+        dipReading.ipConfig |= readBit() << 5;
 
         return dipReading;
     }
-- 
GitLab