From 0cb754529776f0c0be909e08d1076bdd31c26e04 Mon Sep 17 00:00:00 2001
From: Fabrizio Monti <fabrizio.monti@skywarder.eu>
Date: Mon, 24 Mar 2025 22:40:20 +0100
Subject: [PATCH] [ENGINE] Updated actuators and can handler with Orion servo
 valves.

---
 src/Motor/Actuators/Actuators.cpp   | 38 ++++++++++++++++----
 src/Motor/Actuators/Actuators.h     |  4 +--
 src/Motor/CanHandler/CanHandler.cpp | 55 +++++++++++++++++++++++++----
 src/common/CanConfig.h              |  6 ++--
 4 files changed, 86 insertions(+), 17 deletions(-)

diff --git a/src/Motor/Actuators/Actuators.cpp b/src/Motor/Actuators/Actuators.cpp
index 8582d035f..592999f9c 100644
--- a/src/Motor/Actuators/Actuators.cpp
+++ b/src/Motor/Actuators/Actuators.cpp
@@ -74,24 +74,46 @@ float Actuators::ServoInfo::getServoPosition()
 Actuators::Actuators()
 {
     infos[0].servo = std::make_unique<Servo>(
-        MIOSIX_SERVOS_1_TIM, TimerUtils::Channel::MIOSIX_SERVOS_1_CHANNEL,
+        MIOSIX_SERVOS_0_TIM, TimerUtils::Channel::MIOSIX_SERVOS_0_CHANNEL,
         Config::Servos::MIN_PULSE, Config::Servos::MAX_PULSE,
         Config::Servos::FREQUENCY);
     infos[1].servo = std::make_unique<Servo>(
+        MIOSIX_SERVOS_1_TIM, TimerUtils::Channel::MIOSIX_SERVOS_1_CHANNEL,
+        Config::Servos::MIN_PULSE, Config::Servos::MAX_PULSE,
+        Config::Servos::FREQUENCY);
+    infos[2].servo = std::make_unique<Servo>(
         MIOSIX_SERVOS_2_TIM, TimerUtils::Channel::MIOSIX_SERVOS_2_CHANNEL,
         Config::Servos::MIN_PULSE, Config::Servos::MAX_PULSE,
         Config::Servos::FREQUENCY);
+    infos[3].servo = std::make_unique<Servo>(
+        MIOSIX_SERVOS_3_TIM, TimerUtils::Channel::MIOSIX_SERVOS_3_CHANNEL,
+        Config::Servos::MIN_PULSE, Config::Servos::MAX_PULSE,
+        Config::Servos::FREQUENCY);
 
     ServoInfo* info;
     info          = getServo(ServosList::MAIN_VALVE);
     info->limit   = Config::Servos::MAIN_LIMIT;
     info->flipped = Config::Servos::MAIN_FLIPPED;
     info->unsafeSetServoPosition(0.0f);
+    // TODO: is the configuration correct? Same as lyra
+
+    info          = getServo(ServosList::OX_VENTING_VALVE);
+    info->limit   = Config::Servos::VENTING_LIMIT;
+    info->flipped = Config::Servos::VENTING_FLIPPED;
+    info->unsafeSetServoPosition(0.0f);
+    // TODO: is the configuration correct? Same as lyra
+
+    info          = getServo(ServosList::NITROGEN_VALVE);
+    info->limit   = Config::Servos::VENTING_LIMIT;
+    info->flipped = Config::Servos::VENTING_FLIPPED;
+    info->unsafeSetServoPosition(0.0f);
+    // TODO: is the configuration correct?
 
-    info          = getServo(ServosList::VENTING_VALVE);
+    info          = getServo(ServosList::N2_QUENCHING_VALVE);
     info->limit   = Config::Servos::VENTING_LIMIT;
     info->flipped = Config::Servos::VENTING_FLIPPED;
     info->unsafeSetServoPosition(0.0f);
+    // TODO: is the configuration correct?
 }
 
 bool Actuators::start()
@@ -99,8 +121,8 @@ bool Actuators::start()
     TaskScheduler& scheduler =
         getModule<BoardScheduler>()->getActuatorsScheduler();
 
-    infos[0].servo->enable();
-    infos[1].servo->enable();
+    for (size_t i = 0; i < infos.size(); ++i)
+        infos[i].servo->enable();
 
     // Reset all actions
     lastActionTs = getTime();
@@ -165,10 +187,14 @@ Actuators::ServoInfo* Actuators::getServo(ServosList servo)
 {
     switch (servo)
     {
-        case VENTING_VALVE:
+        case OX_VENTING_VALVE:
             return &infos[0];
         case MAIN_VALVE:
             return &infos[1];
+        case NITROGEN_VALVE:
+            return &infos[2];
+        case N2_QUENCHING_VALVE:
+            return &infos[3];
 
         default:
             // Oh FUCK
@@ -251,7 +277,7 @@ void Actuators::updatePositionsTask()
     if (shouldVent)
     {
         // Open for at least timeout time
-        openServoWithTime(ServosList::VENTING_VALVE,
+        openServoWithTime(ServosList::OX_VENTING_VALVE,
                           Config::Servos::SERVO_ACTION_TIMEOUT + 1000);
     }
 }
diff --git a/src/Motor/Actuators/Actuators.h b/src/Motor/Actuators/Actuators.h
index 15133ade1..2cfad5c92 100644
--- a/src/Motor/Actuators/Actuators.h
+++ b/src/Motor/Actuators/Actuators.h
@@ -25,7 +25,7 @@
 #include <Motor/BoardScheduler.h>
 #include <Motor/CanHandler/CanHandler.h>
 #include <actuators/Servo/Servo.h>
-#include <common/MavlinkLyra.h>
+#include <common/MavlinkOrion.h>
 #include <utils/DependencyManager/DependencyManager.h>
 
 namespace Motor
@@ -76,7 +76,7 @@ private:
     miosix::FastMutex infosMutex;
     // Timestamp of last servo action
     long long lastActionTs = 0;
-    ServoInfo infos[2]     = {};
+    std::array<ServoInfo, 4> infos;
 };
 
 }  // namespace Motor
diff --git a/src/Motor/CanHandler/CanHandler.cpp b/src/Motor/CanHandler/CanHandler.cpp
index a110d856d..8a26ffb3d 100644
--- a/src/Motor/CanHandler/CanHandler.cpp
+++ b/src/Motor/CanHandler/CanHandler.cpp
@@ -100,18 +100,37 @@ bool CanHandler::start()
                 static_cast<uint8_t>(CanConfig::PrimaryType::SENSORS),
                 static_cast<uint8_t>(CanConfig::Board::MOTOR),
                 static_cast<uint8_t>(CanConfig::Board::BROADCAST),
-                static_cast<uint8_t>(CanConfig::SensorId::TOP_TANK_PRESSURE),
+                static_cast<uint8_t>(CanConfig::SensorId::OX_TOP_TANK_PRESSURE),
                 static_cast<PressureData>(
-                    sensors->getTopTankPressLastSample()));
+                    sensors->getOxTopTankPressLastSample()));
 
             protocol.enqueueData(
                 static_cast<uint8_t>(CanConfig::Priority::HIGH),
                 static_cast<uint8_t>(CanConfig::PrimaryType::SENSORS),
                 static_cast<uint8_t>(CanConfig::Board::MOTOR),
                 static_cast<uint8_t>(CanConfig::Board::BROADCAST),
-                static_cast<uint8_t>(CanConfig::SensorId::BOTTOM_TANK_PRESSURE),
+                static_cast<uint8_t>(
+                    CanConfig::SensorId::OX_BOTTOM_TANK_PRESSURE_0),
                 static_cast<PressureData>(
-                    sensors->getBottomTankPressLastSample()));
+                    sensors->getOxBottomTankPress0LastSample()));
+
+            protocol.enqueueData(
+                static_cast<uint8_t>(CanConfig::Priority::HIGH),
+                static_cast<uint8_t>(CanConfig::PrimaryType::SENSORS),
+                static_cast<uint8_t>(CanConfig::Board::MOTOR),
+                static_cast<uint8_t>(CanConfig::Board::BROADCAST),
+                static_cast<uint8_t>(
+                    CanConfig::SensorId::OX_BOTTOM_TANK_PRESSURE_1),
+                static_cast<PressureData>(
+                    sensors->getOxBottomTankPress1LastSample()));
+
+            protocol.enqueueData(
+                static_cast<uint8_t>(CanConfig::Priority::HIGH),
+                static_cast<uint8_t>(CanConfig::PrimaryType::SENSORS),
+                static_cast<uint8_t>(CanConfig::Board::MOTOR),
+                static_cast<uint8_t>(CanConfig::Board::BROADCAST),
+                static_cast<uint8_t>(CanConfig::SensorId::N2_TANK_PRESSURE),
+                static_cast<PressureData>(sensors->getN2TankPressLastSample()));
         },
         Config::CanHandler::PRESSURE_PERIOD);
 
@@ -172,11 +191,33 @@ bool CanHandler::start()
                 static_cast<uint8_t>(CanConfig::PrimaryType::ACTUATORS),
                 static_cast<uint8_t>(CanConfig::Board::MOTOR),
                 static_cast<uint8_t>(CanConfig::Board::BROADCAST),
-                static_cast<uint8_t>(ServosList::VENTING_VALVE),
+                static_cast<uint8_t>(ServosList::OX_VENTING_VALVE),
+                ServoFeedback{
+                    TimestampTimer::getTimestamp(),
+                    actuators->getServoPosition(ServosList::OX_VENTING_VALVE),
+                    actuators->isServoOpen(ServosList::OX_VENTING_VALVE)});
+
+            protocol.enqueueData(
+                static_cast<uint8_t>(CanConfig::Priority::HIGH),
+                static_cast<uint8_t>(CanConfig::PrimaryType::ACTUATORS),
+                static_cast<uint8_t>(CanConfig::Board::MOTOR),
+                static_cast<uint8_t>(CanConfig::Board::BROADCAST),
+                static_cast<uint8_t>(ServosList::NITROGEN_VALVE),
+                ServoFeedback{
+                    TimestampTimer::getTimestamp(),
+                    actuators->getServoPosition(ServosList::NITROGEN_VALVE),
+                    actuators->isServoOpen(ServosList::NITROGEN_VALVE)});
+
+            protocol.enqueueData(
+                static_cast<uint8_t>(CanConfig::Priority::HIGH),
+                static_cast<uint8_t>(CanConfig::PrimaryType::ACTUATORS),
+                static_cast<uint8_t>(CanConfig::Board::MOTOR),
+                static_cast<uint8_t>(CanConfig::Board::BROADCAST),
+                static_cast<uint8_t>(ServosList::N2_QUENCHING_VALVE),
                 ServoFeedback{
                     TimestampTimer::getTimestamp(),
-                    actuators->getServoPosition(ServosList::VENTING_VALVE),
-                    actuators->isServoOpen(ServosList::VENTING_VALVE)});
+                    actuators->getServoPosition(ServosList::N2_QUENCHING_VALVE),
+                    actuators->isServoOpen(ServosList::N2_QUENCHING_VALVE)});
         },
         Config::CanHandler::ACTUATORS_PERIOD);
 
diff --git a/src/common/CanConfig.h b/src/common/CanConfig.h
index 579c5c920..60fff984b 100644
--- a/src/common/CanConfig.h
+++ b/src/common/CanConfig.h
@@ -77,8 +77,10 @@ enum class SensorId : uint8_t
     PITOT_STATIC_PRESSURE,
     PITOT_TOTAL_PRESSURE,
     CC_PRESSURE,
-    BOTTOM_TANK_PRESSURE,
-    TOP_TANK_PRESSURE,
+    OX_BOTTOM_TANK_PRESSURE_0,
+    OX_BOTTOM_TANK_PRESSURE_1,
+    OX_TOP_TANK_PRESSURE,
+    N2_TANK_PRESSURE,
     TANK_TEMPERATURE,
     MOTOR_ACTUATORS_CURRENT,
     MAIN_BOARD_CURRENT,
-- 
GitLab