From 3cff1c48e9c58ebd24a1573b8bb92af43a412bbf Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 14 Oct 2022 14:55:37 +0200 Subject: [PATCH] some more testing and bugfixes --- common/config/eive/definitions.h | 4 +- generators/bsp_q7s_events.csv | 1 + generators/events/translateEvents.cpp | 7 +- generators/objects/translateObjects.cpp | 2 +- linux/fsfwconfig/events/translateEvents.cpp | 7 +- linux/fsfwconfig/objects/translateObjects.cpp | 2 +- .../devices/SolarArrayDeploymentHandler.cpp | 156 +++++++++--------- mission/devices/SolarArrayDeploymentHandler.h | 6 +- tmtc | 2 +- 9 files changed, 100 insertions(+), 87 deletions(-) diff --git a/common/config/eive/definitions.h b/common/config/eive/definitions.h index 33d37812..d15b5ea6 100644 --- a/common/config/eive/definitions.h +++ b/common/config/eive/definitions.h @@ -36,8 +36,8 @@ static constexpr uint32_t MAX_FILENAME_SIZE = 50; static constexpr uint32_t SA_DEPL_INIT_BUFFER_SECS = 120; // Burn time for autonomous deployment -static constexpr uint32_t SA_DEPL_BURN_TIME_SECS = 180; -static constexpr uint32_t SA_DEPL_WAIT_TIME_SECS = 45 * 60; +static constexpr uint32_t SA_DEPL_BURN_TIME_SECS = 60; // 180; +static constexpr uint32_t SA_DEPL_WAIT_TIME_SECS = 90; // 45 * 60; // HW constraints (current limit) mean that the GPIO channels need to be switched on in alternation static constexpr uint32_t SA_DEPL_CHANNEL_ALTERNATION_INTERVAL_SECS = 5; // Maximum allowed burn time allowed by the software. diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index cff23c21..5a662fb5 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -100,6 +100,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 11505;0x2cf1;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h 11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h 11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h +11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;;mission/devices/SolarArrayDeploymentHandler.h 11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/devices/ploc/PlocMPSoCHandler.h 11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h 11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index f175b6e4..b27c54fc 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 228 translations. + * @brief Auto-generated event translation file. Contains 229 translations. * @details - * Generated on: 2022-10-14 11:53:48 + * Generated on: 2022-10-14 14:54:47 */ #include "translateEvents.h" @@ -106,6 +106,7 @@ const char *DEPL_SA1_GPIO_SWTICH_ON_FAILED_STRING = "DEPL_SA1_GPIO_SWTICH_ON_FAI const char *DEPL_SA2_GPIO_SWTICH_ON_FAILED_STRING = "DEPL_SA2_GPIO_SWTICH_ON_FAILED"; const char *DEPL_SA1_GPIO_SWTICH_OFF_FAILED_STRING = "DEPL_SA1_GPIO_SWTICH_OFF_FAILED"; const char *DEPL_SA2_GPIO_SWTICH_OFF_FAILED_STRING = "DEPL_SA2_GPIO_SWTICH_OFF_FAILED"; +const char *AUTONOMOUS_DEPLOYMENT_COMPLETED_STRING = "AUTONOMOUS_DEPLOYMENT_COMPLETED"; const char *MEMORY_READ_RPT_CRC_FAILURE_STRING = "MEMORY_READ_RPT_CRC_FAILURE"; const char *ACK_FAILURE_STRING = "ACK_FAILURE"; const char *EXE_FAILURE_STRING = "EXE_FAILURE"; @@ -434,6 +435,8 @@ const char *translateEvents(Event event) { return DEPL_SA1_GPIO_SWTICH_OFF_FAILED_STRING; case (11507): return DEPL_SA2_GPIO_SWTICH_OFF_FAILED_STRING; + case (11508): + return AUTONOMOUS_DEPLOYMENT_COMPLETED_STRING; case (11601): return MEMORY_READ_RPT_CRC_FAILURE_STRING; case (11602): diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index 19c18ca2..a855e48a 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 138 translations. - * Generated on: 2022-10-14 11:53:48 + * Generated on: 2022-10-14 14:54:47 */ #include "translateObjects.h" diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index f175b6e4..b27c54fc 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 228 translations. + * @brief Auto-generated event translation file. Contains 229 translations. * @details - * Generated on: 2022-10-14 11:53:48 + * Generated on: 2022-10-14 14:54:47 */ #include "translateEvents.h" @@ -106,6 +106,7 @@ const char *DEPL_SA1_GPIO_SWTICH_ON_FAILED_STRING = "DEPL_SA1_GPIO_SWTICH_ON_FAI const char *DEPL_SA2_GPIO_SWTICH_ON_FAILED_STRING = "DEPL_SA2_GPIO_SWTICH_ON_FAILED"; const char *DEPL_SA1_GPIO_SWTICH_OFF_FAILED_STRING = "DEPL_SA1_GPIO_SWTICH_OFF_FAILED"; const char *DEPL_SA2_GPIO_SWTICH_OFF_FAILED_STRING = "DEPL_SA2_GPIO_SWTICH_OFF_FAILED"; +const char *AUTONOMOUS_DEPLOYMENT_COMPLETED_STRING = "AUTONOMOUS_DEPLOYMENT_COMPLETED"; const char *MEMORY_READ_RPT_CRC_FAILURE_STRING = "MEMORY_READ_RPT_CRC_FAILURE"; const char *ACK_FAILURE_STRING = "ACK_FAILURE"; const char *EXE_FAILURE_STRING = "EXE_FAILURE"; @@ -434,6 +435,8 @@ const char *translateEvents(Event event) { return DEPL_SA1_GPIO_SWTICH_OFF_FAILED_STRING; case (11507): return DEPL_SA2_GPIO_SWTICH_OFF_FAILED_STRING; + case (11508): + return AUTONOMOUS_DEPLOYMENT_COMPLETED_STRING; case (11601): return MEMORY_READ_RPT_CRC_FAILURE_STRING; case (11602): diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index 19c18ca2..a855e48a 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 138 translations. - * Generated on: 2022-10-14 11:53:48 + * Generated on: 2022-10-14 14:54:47 */ #include "translateObjects.h" diff --git a/mission/devices/SolarArrayDeploymentHandler.cpp b/mission/devices/SolarArrayDeploymentHandler.cpp index 88b3d7bf..eaecae37 100644 --- a/mission/devices/SolarArrayDeploymentHandler.cpp +++ b/mission/devices/SolarArrayDeploymentHandler.cpp @@ -60,6 +60,62 @@ ReturnValue_t SolarArrayDeploymentHandler::performOperation(uint8_t operationCod return returnvalue::OK; } +void SolarArrayDeploymentHandler::handleStateMachine() { + if (stateMachine == MAIN_POWER_ON) { + mainLineSwitcher.sendSwitchCommand(mainLineSwitch, PowerSwitchIF::SWITCH_ON); + mainSwitchCountdown.setTimeout(mainLineSwitcher.getSwitchDelayMs()); + stateMachine = WAIT_MAIN_POWER_ON; + sif::info << "S/A Deployment: Deployment power line on" << std::endl; + } + if (stateMachine == MAIN_POWER_OFF) { + // These should never fail + allOff(); + stateMachine = WAIT_MAIN_POWER_OFF; + sif::info << "S/A Deployment: Deployment power line off" << std::endl; + } + if (stateMachine == WAIT_MAIN_POWER_ON) { + if (checkMainPowerOn()) { + if (DEBUG_MODE) { + sif::debug << "SA DEPL FSM: WAIT_MAIN_POWER_ON done -> SWITCH_DEPL_GPIOS" << std::endl; + } + stateMachine = SWITCH_DEPL_GPIOS; + } + } + if (stateMachine == WAIT_MAIN_POWER_OFF) { + if (checkMainPowerOff()) { + if (DEBUG_MODE) { + sif::debug << "SA DEPL FSM: WAIT_MAIN_POWER_OFF done -> FSM DONE" << std::endl; + } + sif::info << "S/A Deployment: FSM done" << std::endl; + finishFsm(returnvalue::OK); + } + } + if (stateMachine == SWITCH_DEPL_GPIOS) { + burnCountdown.setTimeout(fsmInfo.burnCountdownMs); + // This should never fail + channelAlternationCd.resetTimer(); + if (not fsmInfo.dryRun) { + sa2Off(); + sa1On(); + fsmInfo.alternationDummy = true; + } + sif::info << "S/A Deployment: Burning" << std::endl; + triggerEvent(BURN_PHASE_START, fsmInfo.burnCountdownMs, fsmInfo.dryRun); + stateMachine = BURNING; + } + if (stateMachine == BURNING) { + saGpioAlternation(); + if (burnCountdown.hasTimedOut()) { + if (DEBUG_MODE) { + sif::debug << "SA DEPL FSM: BURNING done -> WAIT_MAIN_POWER_OFF" << std::endl; + } + allOff(); + triggerEvent(BURN_PHASE_DONE, fsmInfo.burnCountdownMs, fsmInfo.dryRun); + stateMachine = WAIT_MAIN_POWER_OFF; + } + } +} + ReturnValue_t SolarArrayDeploymentHandler::performAutonomousDepl(sd::SdCard sdCard, bool dryRun) { using namespace std::filesystem; using namespace std; @@ -72,21 +128,22 @@ ReturnValue_t SolarArrayDeploymentHandler::performAutonomousDepl(sd::SdCard sdCa if (not exists(SD_0_DEPLY_INFO)) { initFile(SD_0_DEPLY_INFO); } - if (not autonomousDeplForFile(SD_0_DEPLY_INFO, dryRun)) { + if (not autonomousDeplForFile(sd::SdCard::SLOT_0, SD_0_DEPLY_INFO, dryRun)) { initFile(SD_0_DEPLY_INFO); } } else if (sdCard == sd::SdCard::SLOT_1) { if (not exists(SD_1_DEPLY_INFO)) { initFile(SD_1_DEPLY_INFO); } - if (not autonomousDeplForFile(SD_1_DEPLY_INFO, dryRun)) { + if (not autonomousDeplForFile(sd::SdCard::SLOT_1, SD_1_DEPLY_INFO, dryRun)) { initFile(SD_1_DEPLY_INFO); } } return returnvalue::OK; } -bool SolarArrayDeploymentHandler::autonomousDeplForFile(const char* filename, bool dryRun) { +bool SolarArrayDeploymentHandler::autonomousDeplForFile(sd::SdCard sdCard, const char* filename, + bool dryRun) { using namespace std; ifstream file(filename); string line; @@ -166,79 +223,31 @@ bool SolarArrayDeploymentHandler::autonomousDeplForFile(const char* filename, bo startFsmOff(); } } - std::ofstream of(filename); - of << "phase: "; - if (deplState == AutonomousDeplState::INIT) { - of << PHASE_INIT_STR << "\n"; - } else if (deplState == AutonomousDeplState::FIRST_BURN) { - of << PHASE_FIRST_BURN_STR << "\n"; - } else if (deplState == AutonomousDeplState::WAIT) { - of << PHASE_WAIT_STR << "\n"; - } else if (deplState == AutonomousDeplState::SECOND_BURN) { - of << PHASE_SECOND_BURN_STR << "\n"; - } else if (deplState == AutonomousDeplState::DONE) { - of << PHASE_DONE << "\n"; + if (deplState == AutonomousDeplState::DONE) { + remove(filename); + if (sdCard == sd::SdCard::SLOT_0) { + remove(SD_0_DEPL_FILE); + } else { + remove(SD_1_DEPL_FILE); + } + triggerEvent(AUTONOMOUS_DEPLOYMENT_COMPLETED); + } else { + std::ofstream of(filename); + of << "phase: "; + if (deplState == AutonomousDeplState::INIT) { + of << PHASE_INIT_STR << "\n"; + } else if (deplState == AutonomousDeplState::FIRST_BURN) { + of << PHASE_FIRST_BURN_STR << "\n"; + } else if (deplState == AutonomousDeplState::WAIT) { + of << PHASE_WAIT_STR << "\n"; + } else if (deplState == AutonomousDeplState::SECOND_BURN) { + of << PHASE_SECOND_BURN_STR << "\n"; + } + of << "secs_since_start: " << std::to_string(secsSinceBoot) << "\n"; } - of << "secs_since_start: " << std::to_string(secsSinceBoot) << "\n"; return true; } -void SolarArrayDeploymentHandler::handleStateMachine() { - if (stateMachine == MAIN_POWER_ON) { - mainLineSwitcher.sendSwitchCommand(mainLineSwitch, PowerSwitchIF::SWITCH_ON); - mainSwitchCountdown.setTimeout(mainLineSwitcher.getSwitchDelayMs()); - stateMachine = WAIT_MAIN_POWER_ON; - sif::info << "S/A Deployment: Deployment power line on" << std::endl; - } - if (stateMachine == MAIN_POWER_OFF) { - // These should never fail - allOff(); - stateMachine = WAIT_MAIN_POWER_OFF; - sif::info << "S/A Deployment: Deployment power line off" << std::endl; - } - if (stateMachine == WAIT_MAIN_POWER_ON) { - if (checkMainPowerOn()) { - if (DEBUG_MODE) { - sif::debug << "SA DEPL FSM: WAIT_MAIN_POWER_ON done -> SWITCH_DEPL_GPIOS" << std::endl; - } - stateMachine = SWITCH_DEPL_GPIOS; - } - } - if (stateMachine == WAIT_MAIN_POWER_OFF) { - if (checkMainPowerOff()) { - if (DEBUG_MODE) { - sif::debug << "SA DEPL FSM: WAIT_MAIN_POWER_OFF done -> FSM DONE" << std::endl; - } - sif::info << "S/A Deployment: FSM done" << std::endl; - finishFsm(returnvalue::OK); - } - } - if (stateMachine == SWITCH_DEPL_GPIOS) { - burnCountdown.setTimeout(fsmInfo.burnCountdownMs); - // This should never fail - channelAlternationCd.resetTimer(); - if (not fsmInfo.dryRun) { - sa2Off(); - sa1On(); - fsmInfo.alternationDummy = true; - } - sif::info << "S/A Deployment: Burning" << std::endl; - triggerEvent(BURN_PHASE_START, fsmInfo.burnCountdownMs, fsmInfo.dryRun); - stateMachine = BURNING; - } - if (stateMachine == BURNING) { - saGpioAlternation(); - if (burnCountdown.hasTimedOut()) { - if (DEBUG_MODE) { - sif::debug << "SA DEPL FSM: BURNING done -> WAIT_MAIN_POWER_OFF" << std::endl; - } - allOff(); - triggerEvent(BURN_PHASE_DONE, fsmInfo.burnCountdownMs, fsmInfo.dryRun); - stateMachine = WAIT_MAIN_POWER_OFF; - } - } -} - bool SolarArrayDeploymentHandler::checkMainPowerOn() { return checkMainPower(true); } bool SolarArrayDeploymentHandler::checkMainPowerOff() { return checkMainPower(false); } @@ -276,7 +285,6 @@ bool SolarArrayDeploymentHandler::startFsmOn(uint32_t burnCountdownSecs, bool dr if (burnCountdownSecs > config::SA_DEPL_MAX_BURN_TIME) { burnCountdownSecs = config::SA_DEPL_MAX_BURN_TIME; } - fsmInfo.onOff = true; fsmInfo.dryRun = dryRun; fsmInfo.burnCountdownMs = burnCountdownSecs * 1000; stateMachine = StateMachine::MAIN_POWER_ON; @@ -289,7 +297,6 @@ void SolarArrayDeploymentHandler::startFsmOff() { // off commands override the state machine. Cancel any active action commands. finishFsm(returnvalue::FAILED); } - fsmInfo.onOff = false; retryCounter = 0; stateMachine = StateMachine::MAIN_POWER_OFF; } @@ -298,7 +305,6 @@ void SolarArrayDeploymentHandler::finishFsm(ReturnValue_t resultForActionHelper) retryCounter = 0; stateMachine = StateMachine::IDLE; fsmInfo.dryRun = false; - fsmInfo.onOff = false; fsmInfo.alternationDummy = false; if (actionActive) { bool success = false; diff --git a/mission/devices/SolarArrayDeploymentHandler.h b/mission/devices/SolarArrayDeploymentHandler.h index 2e4c775e..a5b3a10e 100644 --- a/mission/devices/SolarArrayDeploymentHandler.h +++ b/mission/devices/SolarArrayDeploymentHandler.h @@ -117,8 +117,6 @@ class SolarArrayDeploymentHandler : public ExecutableObjectIF, struct FsmInfo { // Not required anymore // DeploymentChannels channel; - // false if OFF, true is ON - bool onOff; bool dryRun; bool alternationDummy = false; uint32_t burnCountdownMs = config::SA_DEPL_MAX_BURN_TIME; @@ -147,6 +145,8 @@ class SolarArrayDeploymentHandler : public ExecutableObjectIF, event::makeEvent(SUBSYSTEM_ID, 6, severity::HIGH); static constexpr Event DEPL_SA2_GPIO_SWTICH_OFF_FAILED = event::makeEvent(SUBSYSTEM_ID, 7, severity::HIGH); + static constexpr Event AUTONOMOUS_DEPLOYMENT_COMPLETED = + event::makeEvent(SUBSYSTEM_ID, 8, severity::INFO); FsmInfo fsmInfo; StateMachine stateMachine = IDLE; @@ -164,7 +164,7 @@ class SolarArrayDeploymentHandler : public ExecutableObjectIF, ReturnValue_t performAutonomousDepl(sd::SdCard sdCard, bool dryRun); bool dryRunStringInFile(const char* filename); - bool autonomousDeplForFile(const char* filename, bool dryRun); + bool autonomousDeplForFile(sd::SdCard sdCard, const char* filename, bool dryRun); /** * This countdown is used to check if the PCDU sets the 8V line on in the intended time. */ diff --git a/tmtc b/tmtc index 772c86ab..646cf1a1 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 772c86ab04c453b12459d65327fdaaf4d1472279 +Subproject commit 646cf1a14e0fa61d5e91e26a46017be557bad642