From 5e8f8b0c8121a4bd7ea3b608ae82094a667672b0 Mon Sep 17 00:00:00 2001
From: Federico Lolli <federico.lolli@skywarder.eu>
Date: Sat, 11 May 2024 01:35:23 +0200
Subject: [PATCH] [ARP] Add support for TC commands in Hub

---
 src/boards/Groundstation/Automated/Hub.cpp | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/src/boards/Groundstation/Automated/Hub.cpp b/src/boards/Groundstation/Automated/Hub.cpp
index 2f1ade0af..d1b3d9845 100644
--- a/src/boards/Groundstation/Automated/Hub.cpp
+++ b/src/boards/Groundstation/Automated/Hub.cpp
@@ -30,6 +30,7 @@
 #include <Groundstation/Common/Config/GeneralConfig.h>
 #include <Groundstation/Common/Ports/Serial.h>
 #include <algorithms/NAS/NASState.h>
+#include <common/Events.h>
 #include <common/Mavlink.h>
 #include <logger/Logger.h>
 #include <sensors/SensorData.h>
@@ -37,6 +38,7 @@
 #include <iostream>
 
 using namespace Antennas;
+using namespace Common;
 using namespace Boardcore;
 using namespace Groundstation;
 using namespace miosix;
@@ -52,6 +54,39 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
 
     switch (msg.msgid)
     {
+        case MAVLINK_MSG_ID_ARP_COMMAND_TC:
+        {
+            // Create the map between the commands and the corresponding events
+            static const std::map<MavArpCommandList, Events> commandToEvent{
+                {MAV_ARP_CMD_FORCE_INIT, TMTC_ARP_FORCE_INIT},
+                {MAV_ARP_CMD_RESET_ALGORITHM, TMTC_ARP_RESET_ALGORITHM},
+                {MAV_ARP_CMD_RESET_BOARD, TMTC_ARP_RESET_BOARD},
+                {MAV_ARP_CMD_FORCE_NO_FEEDBACK, TMTC_ARP_FORCE_NO_FEEDBACK},
+                {MAV_ARP_CMD_ARM, TMTC_ARP_ARM},
+                {MAV_ARP_CMD_DISARM, TMTC_ARP_DISARM},
+                {MAV_ARP_CMD_CALIBRATE, TMTC_ARP_CALIBRATE},
+                {MAV_ARP_CMD_ENTER_TEST_MODE, TMTC_ARP_ENTER_TEST_MODE},
+                {MAV_ARP_CMD_EXIT_TEST_MODE, TMTC_ARP_EXIT_TEST_MODE},
+            };
+
+            MavArpCommandList commandId = static_cast<MavArpCommandList>(
+                mavlink_msg_arp_command_tc_get_command_id(&msg));
+
+            auto it = commandToEvent.find(commandId);
+
+            if (it != commandToEvent.end())
+            {
+                EventBroker::getInstance().post(it->second, TOPIC_TMTC);
+            }
+            else
+            {
+                return sendNack(msg);
+            }
+
+            // Acknowledge the message
+            sendAck(msg);
+            break;
+        }
         case MAVLINK_MSG_ID_SET_STEPPER_ANGLE_TC:
         {
             StepperList stepperId = static_cast<StepperList>(
-- 
GitLab