From 6f3ff7b354292a80437ab662d33f21571ba8647e Mon Sep 17 00:00:00 2001
From: Federico Mandelli <federico.mandelli@skywarder.eu>
Date: Thu, 5 Dec 2024 22:24:50 +0100
Subject: [PATCH] [WingController] Added progressive rotation algorithm

---
 CMakeLists.txt                                   |  7 +++++++
 src/boards/Parafoil/Configs/WingConfig.h         |  4 ++++
 .../WingController/WingController.cpp            | 16 ++++++++++++++++
 3 files changed, 27 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b2bdb2ce1..8cd13fe76 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,6 +33,13 @@ project(OnBoardSoftware)
 #                              Flight entrypoints                             #
 #-----------------------------------------------------------------------------#
 
+
+
+add_executable(parafoil-progressive-rotation src/entrypoints/Parafoil/parafoil-entry.cpp ${PARAFOIL_COMPUTER})
+target_include_directories(parafoil-progressive-rotation PRIVATE ${OBSW_INCLUDE_DIRS})
+target_compile_definitions(parafoil-progressive-rotation PRIVATE PROGRESSIVE_ROTATION MILANO)
+sbs_target(parafoil-progressive-rotation stm32f429zi_skyward_death_stack_x)
+
 add_executable(parafoil-guided-milano src/entrypoints/Parafoil/parafoil-entry.cpp ${PARAFOIL_COMPUTER})
 target_include_directories(parafoil-guided-milano PRIVATE ${OBSW_INCLUDE_DIRS})
 target_compile_definitions(parafoil-guided-milano PRIVATE CLOSED_LOOP MILANO)
diff --git a/src/boards/Parafoil/Configs/WingConfig.h b/src/boards/Parafoil/Configs/WingConfig.h
index 3d3a31e6c..c97771451 100644
--- a/src/boards/Parafoil/Configs/WingConfig.h
+++ b/src/boards/Parafoil/Configs/WingConfig.h
@@ -41,6 +41,8 @@ constexpr int SELECTED_ALGORITHM   = 1;
 constexpr int SELECTED_ALGORITHM = 2;
 #elif ROTATION
 constexpr int SELECTED_ALGORITHM = 3;
+#elif PROGRESSIVE_ROTATION
+constexpr int SELECTED_ALGORITHM = 4;
 #else
 constexpr int SELECTED_ALGORITHM = 0;
 #endif
@@ -54,6 +56,8 @@ constexpr float DEFAULT_TARGET_LON = 9.1544219;
 #endif
 
 constexpr int WING_STRAIGHT_FLIGHT_TIMEOUT = 15 * 1000;  // [ms]
+constexpr int PARAFOIL_COMMAND_PERIOD      = 5 * 1000;   // [ms]
+constexpr int PARAFOIL_WING_INCREMENT      = 10;         // [°]
 
 constexpr int WING_UPDATE_PERIOD = 1000;  // [ms]
 
diff --git a/src/boards/Parafoil/StateMachines/WingController/WingController.cpp b/src/boards/Parafoil/StateMachines/WingController/WingController.cpp
index bac52cd90..d7ca32b11 100644
--- a/src/boards/Parafoil/StateMachines/WingController/WingController.cpp
+++ b/src/boards/Parafoil/StateMachines/WingController/WingController.cpp
@@ -348,6 +348,22 @@ bool WingController::addAlgorithms()
     result &= algorithm->init();
     algorithms.push_back(algorithm);
 
+    // Algorithm 4 (Progressive rotation)
+    algorithm = new WingAlgorithm(PARAFOIL_LEFT_SERVO, PARAFOIL_RIGHT_SERVO);
+
+    step.timestamp = 0;
+    for (int i = 0; i < 80; i += PARAFOIL_WING_INCREMENT)
+    {
+        step.timestamp += PARAFOIL_COMMAND_PERIOD * 1000;  // us
+        step.servo1Angle = i;
+        step.servo2Angle = 0;
+        algorithm->addStep(step);
+        step.timestamp += PARAFOIL_COMMAND_PERIOD * 1000;  // us
+        step.servo1Angle = 0;
+        step.servo2Angle = i;
+        algorithm->addStep(step);
+    }
+
     selectAlgorithm(SELECTED_ALGORITHM);
 
     return result;
-- 
GitLab