From c5dfac837cc2550ae403aeced8162b644fa305e1 Mon Sep 17 00:00:00 2001 From: Alberto Nidasio <alberto.nidasio@skywarder.eu> Date: Sun, 25 Sep 2022 17:22:13 +0200 Subject: [PATCH] [FlightStatsRecorder] fixed main implementation [FlightModeManager] Implemented mission_ended state --- .../Main/Configs/FlightModeManagerConfig.h | 3 +- .../FlightStatsRecorder.cpp | 4 +- .../ADAController/ADAController.cpp | 2 + .../FlightModeManager/FlightModeManager.cpp | 58 +++++++++++++++++- .../FlightModeManager/FlightModeManager.h | 3 + .../FlightModeManager/FlightModeManagerData.h | 3 +- .../NASController/NASController.cpp | 2 + .../Payload/Configs/FlightModeManagerConfig.h | 3 +- .../FlightModeManager/FlightModeManager.cpp | 59 ++++++++++++++++--- .../FlightModeManager/FlightModeManager.h | 3 + .../FlightModeManager/FlightModeManagerData.h | 3 +- src/boards/common/events/Events.h | 1 + 12 files changed, 128 insertions(+), 16 deletions(-) diff --git a/src/boards/Main/Configs/FlightModeManagerConfig.h b/src/boards/Main/Configs/FlightModeManagerConfig.h index fbe7a40ba..857df4abf 100644 --- a/src/boards/Main/Configs/FlightModeManagerConfig.h +++ b/src/boards/Main/Configs/FlightModeManagerConfig.h @@ -26,5 +26,6 @@ namespace Main { constexpr unsigned int MISSION_TIMEOUT = 15 * 60 * 1000; +constexpr unsigned int LANDING_TIMEOUT = 2 * 60 * 1000; -} +} // namespace Main diff --git a/src/boards/Main/FlightStatsRecorder/FlightStatsRecorder.cpp b/src/boards/Main/FlightStatsRecorder/FlightStatsRecorder.cpp index e9d6d70e8..a0fe06d32 100644 --- a/src/boards/Main/FlightStatsRecorder/FlightStatsRecorder.cpp +++ b/src/boards/Main/FlightStatsRecorder/FlightStatsRecorder.cpp @@ -81,6 +81,7 @@ void FlightStatsRecorder::update(Boardcore::ADAState state) (state.x0 < stats.ada_min_pressure || stats.ada_min_pressure == -1)) { stats.ada_min_pressure = state.x0; + stats.apogee_alt = state.aglAltitude; } } @@ -112,7 +113,9 @@ void FlightStatsRecorder::update(PressureData data) if ((fmmState.state == FlightModeManagerState::ASCENDING || fmmState.state == FlightModeManagerState::DROGUE_DESCENT) && (data.pressure < stats.min_pressure || stats.min_pressure == -1)) + { stats.min_pressure = data.pressure; + } } void FlightStatsRecorder::updateDplVane(PressureData data) @@ -128,7 +131,6 @@ void FlightStatsRecorder::updateDplVane(PressureData data) void FlightStatsRecorder::setApogee(GPSData data) { - stats.apogee_alt = data.height; stats.apogee_lat = data.latitude; stats.apogee_lon = data.longitude; } diff --git a/src/boards/Main/StateMachines/ADAController/ADAController.cpp b/src/boards/Main/StateMachines/ADAController/ADAController.cpp index c7a7418f5..039f38910 100644 --- a/src/boards/Main/StateMachines/ADAController/ADAController.cpp +++ b/src/boards/Main/StateMachines/ADAController/ADAController.cpp @@ -25,6 +25,7 @@ #include <Main/BoardScheduler.h> #include <Main/Configs/AirBrakesControllerConfig.h> #include <Main/Configs/NASConfig.h> +#include <Main/FlightStatsRecorder/FlightStatsRecorder.h> #include <Main/Sensors/Sensors.h> #include <Main/StateMachines/AirBrakesController/AirBrakesController.h> #include <common/ReferenceConfig.h> @@ -209,6 +210,7 @@ void ADAController::update() } Logger::getInstance().log(ada.getState()); + FlightStatsRecorder::getInstance().update(ada.getState()); #ifdef HILSimulation // useful only for hil testing diff --git a/src/boards/Main/StateMachines/FlightModeManager/FlightModeManager.cpp b/src/boards/Main/StateMachines/FlightModeManager/FlightModeManager.cpp index 326f26e32..878d41458 100644 --- a/src/boards/Main/StateMachines/FlightModeManager/FlightModeManager.cpp +++ b/src/boards/Main/StateMachines/FlightModeManager/FlightModeManager.cpp @@ -23,7 +23,9 @@ #include "FlightModeManager.h" #include <Main/Actuators/Actuators.h> +#include <Main/CanHandler/CanHandler.h> #include <Main/Configs/FlightModeManagerConfig.h> +#include <Main/FlightStatsRecorder/FlightStatsRecorder.h> #include <Main/Sensors/Sensors.h> #include <common/events/Events.h> #include <drivers/timer/TimestampTimer.h> @@ -73,6 +75,7 @@ State FlightModeManager::state_on_ground(const Event& event) } case TMTC_RESET_BOARD: { + CanHandler::getInstance().sendCamOffCommand(); Logger::getInstance().stop(); reboot(); return HANDLED; @@ -126,8 +129,8 @@ State FlightModeManager::state_init_error(const Event& event) { case EV_ENTRY: { - Actuators::getInstance().buzzerError(); logStatus(FlightModeManagerState::INIT_ERROR); + Actuators::getInstance().buzzerError(); EventBroker::getInstance().post(FLIGHT_ERROR_DETECTED, TOPIC_FLIGHT); return HANDLED; @@ -252,6 +255,7 @@ State FlightModeManager::state_disarmed(const Event& event) case EV_ENTRY: { logStatus(FlightModeManagerState::DISARMED); + Actuators::getInstance().buzzerDisarmed(); Logger::getInstance().stop(); EventBroker::getInstance().post(FLIGHT_DISARMED, TOPIC_FLIGHT); @@ -338,6 +342,7 @@ State FlightModeManager::state_armed(const Event& event) case EV_ENTRY: { logStatus(FlightModeManagerState::ARMED); + Actuators::getInstance().buzzerArmed(); Logger::getInstance().start(); EventBroker::getInstance().post(FLIGHT_ARMED, TOPIC_FLIGHT); @@ -412,7 +417,7 @@ State FlightModeManager::state_flying(const Event& event) } case FLIGHT_MISSION_TIMEOUT: { - return transition(&FlightModeManager::state_landed); + return transition(&FlightModeManager::state_mission_ended); } default: { @@ -447,6 +452,8 @@ State FlightModeManager::state_ascending(const Event& event) case TMTC_FORCE_APOGEE: case TMTC_FORCE_EXPULSION: { + FlightStatsRecorder::getInstance().setApogee( + Sensors::getInstance().getUbxGpsLastSample()); return transition(&FlightModeManager::state_drogue_descent); } default: @@ -535,12 +542,58 @@ State FlightModeManager::state_terminal_descent(const Event& event) State FlightModeManager::state_landed(const Event& event) { + static uint16_t landingTimeoutEventId = -1; + switch (event) { case EV_ENTRY: { logStatus(FlightModeManagerState::LANDED); + landingTimeoutEventId = + EventBroker::getInstance().postDelayed<LANDING_TIMEOUT>( + FLIGHT_LANDING_TIMEOUT, TOPIC_FLIGHT); + + Actuators::getInstance().buzzerLanded(); + + return HANDLED; + } + case EV_EXIT: + { + EventBroker::getInstance().removeDelayed(landingTimeoutEventId); + return HANDLED; + } + case EV_EMPTY: + { + return tranSuper(&FlightModeManager::state_top); + } + case EV_INIT: + { + return HANDLED; + } + case FLIGHT_LANDING_TIMEOUT: + { + return transition(&FlightModeManager::state_mission_ended); + } + case TMTC_RESET_BOARD: + { + CanHandler::getInstance().sendCamOffCommand(); + Logger::getInstance().stop(); + reboot(); + return HANDLED; + } + default: + { + return UNHANDLED; + } + } +} +State FlightModeManager::state_mission_ended(const Event& event) +{ + switch (event) + { + case EV_ENTRY: + { Actuators::getInstance().buzzerLanded(); Logger::getInstance().stop(); @@ -560,6 +613,7 @@ State FlightModeManager::state_landed(const Event& event) } case TMTC_RESET_BOARD: { + CanHandler::getInstance().sendCamOffCommand(); Logger::getInstance().stop(); reboot(); return HANDLED; diff --git a/src/boards/Main/StateMachines/FlightModeManager/FlightModeManager.h b/src/boards/Main/StateMachines/FlightModeManager/FlightModeManager.h index aa21d1566..1e9449fba 100644 --- a/src/boards/Main/StateMachines/FlightModeManager/FlightModeManager.h +++ b/src/boards/Main/StateMachines/FlightModeManager/FlightModeManager.h @@ -78,6 +78,9 @@ public: /// The rocket is on the ground after the flight. Boardcore::State state_landed(const Boardcore::Event& event); + /// The rocket ended the flight and closes the log. + Boardcore::State state_mission_ended(const Boardcore::Event& event); + private: FlightModeManager(); ~FlightModeManager(); diff --git a/src/boards/Main/StateMachines/FlightModeManager/FlightModeManagerData.h b/src/boards/Main/StateMachines/FlightModeManager/FlightModeManagerData.h index 9081054d7..f0fa03db5 100644 --- a/src/boards/Main/StateMachines/FlightModeManager/FlightModeManagerData.h +++ b/src/boards/Main/StateMachines/FlightModeManager/FlightModeManagerData.h @@ -43,7 +43,8 @@ enum class FlightModeManagerState : uint8_t ASCENDING, DROGUE_DESCENT, TERMINAL_DESCENT, - LANDED + LANDED, + MISSION_ENDED, }; struct FlightModeManagerStatus diff --git a/src/boards/Main/StateMachines/NASController/NASController.cpp b/src/boards/Main/StateMachines/NASController/NASController.cpp index bd5d9bcf8..04f71543e 100644 --- a/src/boards/Main/StateMachines/NASController/NASController.cpp +++ b/src/boards/Main/StateMachines/NASController/NASController.cpp @@ -24,6 +24,7 @@ #include <Main/BoardScheduler.h> #include <Main/Configs/NASConfig.h> +#include <Main/FlightStatsRecorder/FlightStatsRecorder.h> #include <Main/Sensors/Sensors.h> #include <Main/StateMachines/FlightModeManager/FlightModeManager.h> #include <algorithms/NAS/StateInitializer.h> @@ -76,6 +77,7 @@ void NASController::update() nas.correctPitot(pitotData.deltaP, pressureData.pressure); Logger::getInstance().log(nas.getState()); + FlightStatsRecorder::getInstance().update(nas.getState()); } #ifdef HILSimulation diff --git a/src/boards/Payload/Configs/FlightModeManagerConfig.h b/src/boards/Payload/Configs/FlightModeManagerConfig.h index 95462eb05..d36b0601d 100644 --- a/src/boards/Payload/Configs/FlightModeManagerConfig.h +++ b/src/boards/Payload/Configs/FlightModeManagerConfig.h @@ -25,7 +25,8 @@ namespace Payload { -constexpr unsigned int MISSION_TIMEOUT = 15 * 60 * 1000; constexpr unsigned int APOGEE_TIMEOUT = 20 * 1000; +constexpr unsigned int MISSION_TIMEOUT = 15 * 60 * 1000; +constexpr unsigned int LANDING_TIMEOUT = 2 * 60 * 1000; } // namespace Payload diff --git a/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManager.cpp b/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManager.cpp index 9253e42d9..8e2591c63 100644 --- a/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManager.cpp +++ b/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManager.cpp @@ -84,6 +84,7 @@ State FlightModeManager::state_on_ground(const Event& event) } case TMTC_RESET_BOARD: { + Actuators::getInstance().camOff(); Logger::getInstance().stop(); reboot(); return HANDLED; @@ -247,8 +248,8 @@ State FlightModeManager::state_disarmed(const Event& event) logStatus(FlightModeManagerState::DISARMED); Actuators::getInstance().ledDisarmed(); - Logger::getInstance().stop(); Actuators::getInstance().camOff(); + Logger::getInstance().stop(); EventBroker::getInstance().post(FLIGHT_DISARMED, TOPIC_FLIGHT); return HANDLED; @@ -313,11 +314,6 @@ State FlightModeManager::state_test_mode(const Event& event) { return HANDLED; } - case TMTC_FORCE_MAIN: - { - EventBroker::getInstance().post(DPL_CUT_DROGUE, TOPIC_DPL); - return HANDLED; - } case TMTC_EXIT_TEST_MODE: { return transition(&FlightModeManager::state_disarmed); @@ -338,8 +334,8 @@ State FlightModeManager::state_armed(const Event& event) logStatus(FlightModeManagerState::ARMED); Actuators::getInstance().ledArmed(); - Logger::getInstance().start(); Actuators::getInstance().camOn(); + Logger::getInstance().start(); EventBroker::getInstance().post(FLIGHT_ARMED, TOPIC_FLIGHT); return HANDLED; @@ -407,9 +403,8 @@ State FlightModeManager::state_flying(const Event& event) case FLIGHT_MISSION_TIMEOUT: { WingController::getInstance().stop(); - Actuators::getInstance().camOff(); - return transition(&FlightModeManager::state_landed); + return transition(&FlightModeManager::state_mission_ended); } default: { @@ -543,12 +538,57 @@ State FlightModeManager::state_terminal_descent(const Event& event) State FlightModeManager::state_landed(const Event& event) { + static uint16_t landingTimeoutEventId = -1; + switch (event) { case EV_ENTRY: { logStatus(FlightModeManagerState::LANDED); + landingTimeoutEventId = + EventBroker::getInstance().postDelayed<LANDING_TIMEOUT>( + FLIGHT_LANDING_TIMEOUT, TOPIC_FLIGHT); + + return HANDLED; + } + case EV_EXIT: + { + EventBroker::getInstance().removeDelayed(landingTimeoutEventId); + return HANDLED; + } + case EV_EMPTY: + { + return tranSuper(&FlightModeManager::state_top); + } + case EV_INIT: + { + return HANDLED; + } + case FLIGHT_LANDING_TIMEOUT: + { + return transition(&FlightModeManager::state_mission_ended); + } + case TMTC_RESET_BOARD: + { + Actuators::getInstance().camOff(); + Logger::getInstance().stop(); + reboot(); + return HANDLED; + } + default: + { + return UNHANDLED; + } + } +} +State FlightModeManager::state_mission_ended(const Event& event) +{ + switch (event) + { + case EV_ENTRY: + { + Actuators::getInstance().camOff(); Logger::getInstance().stop(); return HANDLED; @@ -567,6 +607,7 @@ State FlightModeManager::state_landed(const Event& event) } case TMTC_RESET_BOARD: { + Actuators::getInstance().camOff(); Logger::getInstance().stop(); reboot(); return HANDLED; diff --git a/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManager.h b/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManager.h index a79a4031b..f5bfaeef4 100644 --- a/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManager.h +++ b/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManager.h @@ -77,6 +77,9 @@ public: /// The payload is on the ground after the flight. Boardcore::State state_landed(const Boardcore::Event& event); + /// The rocket ended the flight and closes the log. + Boardcore::State state_mission_ended(const Boardcore::Event& event); + private: FlightModeManager(); ~FlightModeManager(); diff --git a/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManagerData.h b/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManagerData.h index e46b8c158..f5ec50adc 100644 --- a/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManagerData.h +++ b/src/boards/Payload/StateMachines/FlightModeManager/FlightModeManagerData.h @@ -43,7 +43,8 @@ enum class FlightModeManagerState : uint8_t ASCENDING, DROGUE_DESCENT, TERMINAL_DESCENT, - LANDED + LANDED, + MISSION_ENDED, }; struct FlightModeManagerStatus diff --git a/src/boards/common/events/Events.h b/src/boards/common/events/Events.h index 297ccbdf9..f9a031a8e 100644 --- a/src/boards/common/events/Events.h +++ b/src/boards/common/events/Events.h @@ -59,6 +59,7 @@ enum Events : uint8_t FLIGHT_DPL_ALT_DETECTED, FLIGHT_ERROR_DETECTED, FLIGHT_LANDING_DETECTED, + FLIGHT_LANDING_TIMEOUT, FLIGHT_LAUNCH_PIN_DETACHED, FLIGHT_LIFTOFF, FLIGHT_MISSION_TIMEOUT, -- GitLab