From 694d6260817f0c5fb8448dffa6731e9967736705 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Jan 2023 11:51:29 +0100 Subject: [PATCH 1/7] some fixes, this should work now --- common/config/eive/definitions.h | 2 +- fsfw | 2 +- .../devices/SolarArrayDeploymentHandler.cpp | 12 ++++++--- mission/devices/SolarArrayDeploymentHandler.h | 26 ++++++++++++++----- tmtc | 2 +- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/common/config/eive/definitions.h b/common/config/eive/definitions.h index 33d37812..1bf2fc77 100644 --- a/common/config/eive/definitions.h +++ b/common/config/eive/definitions.h @@ -39,7 +39,7 @@ static constexpr uint32_t SA_DEPL_INIT_BUFFER_SECS = 120; static constexpr uint32_t SA_DEPL_BURN_TIME_SECS = 180; static constexpr uint32_t SA_DEPL_WAIT_TIME_SECS = 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; +static constexpr uint32_t LEGACY_SA_DEPL_CHANNEL_ALTERNATION_INTERVAL_SECS = 5; // Maximum allowed burn time allowed by the software. static constexpr uint32_t SA_DEPL_MAX_BURN_TIME = 180; diff --git a/fsfw b/fsfw index accaf855..bd189518 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit accaf855ee53d3dc429d7bcdf1b7b89768c166b6 +Subproject commit bd189518b6f91f25db1845e2657101e6bf46eec0 diff --git a/mission/devices/SolarArrayDeploymentHandler.cpp b/mission/devices/SolarArrayDeploymentHandler.cpp index 5656692d..26ae987f 100644 --- a/mission/devices/SolarArrayDeploymentHandler.cpp +++ b/mission/devices/SolarArrayDeploymentHandler.cpp @@ -103,6 +103,7 @@ void SolarArrayDeploymentHandler::handleStateMachine() { } sif::info << "S/A Deployment: Burning" << std::endl; triggerEvent(BURN_PHASE_START, fsmInfo.burnCountdownMs, fsmInfo.dryRun); + channelAlternationCd.resetTimer(); stateMachine = BURNING; } if (stateMachine == BURNING) { @@ -219,7 +220,8 @@ bool SolarArrayDeploymentHandler::autonomousDeplForFile(sd::SdCard sdCard, const if (stateSwitch or firstAutonomousCycle) { if (deplState == AutonomousDeplState::FIRST_BURN or deplState == AutonomousDeplState::SECOND_BURN) { - startFsmOn(config::SA_DEPL_BURN_TIME_SECS, dryRun); + startFsmOn(config::SA_DEPL_BURN_TIME_SECS, (config::SA_DEPL_BURN_TIME_SECS / 2) * 1000, + dryRun); } else if (deplState == AutonomousDeplState::WAIT or deplState == AutonomousDeplState::DONE or deplState == AutonomousDeplState::INIT) { startFsmOff(); @@ -283,10 +285,12 @@ bool SolarArrayDeploymentHandler::checkMainPower(bool onOff) { return false; } -bool SolarArrayDeploymentHandler::startFsmOn(uint32_t burnCountdownSecs, bool dryRun) { +bool SolarArrayDeploymentHandler::startFsmOn(uint32_t burnCountdownSecs, + uint32_t channelAlternationIntervalMs, bool dryRun) { if (stateMachine != StateMachine::IDLE) { return false; } + channelAlternationCd.setTimeout(channelAlternationIntervalMs); if (burnCountdownSecs > config::SA_DEPL_MAX_BURN_TIME) { burnCountdownSecs = config::SA_DEPL_MAX_BURN_TIME; } @@ -354,8 +358,8 @@ ReturnValue_t SolarArrayDeploymentHandler::executeAction(ActionId_t actionId, if (result != returnvalue::OK) { return result; } - uint32_t burnCountdown = cmd.getBurnTime(); - if (not startFsmOn(burnCountdown, cmd.isDryRun())) { + uint32_t burnCountdown = cmd.getBurnTimeSecs(); + if (not startFsmOn(burnCountdown, cmd.getSwitchIntervalMs(), cmd.isDryRun())) { return HasActionsIF::IS_BUSY; } actionActive = true; diff --git a/mission/devices/SolarArrayDeploymentHandler.h b/mission/devices/SolarArrayDeploymentHandler.h index b935b096..ddb91ab9 100644 --- a/mission/devices/SolarArrayDeploymentHandler.h +++ b/mission/devices/SolarArrayDeploymentHandler.h @@ -28,16 +28,20 @@ class ManualDeploymentCommand : public SerialLinkedListAdapter { ManualDeploymentCommand() { setLinks(); } void setLinks() { - setStart(&burnTime); - burnTime.setNext(&dryRun); + setStart(&burnTimeSecs); + burnTimeSecs.setNext(&switchIntervalMs); + burnTimeSecs.setNext(&dryRun); } - uint32_t getBurnTime() const { return burnTime.entry; } + uint32_t getBurnTimeSecs() const { return burnTimeSecs.entry; } + + uint32_t getSwitchIntervalMs() const { return switchIntervalMs.entry; }; bool isDryRun() const { return dryRun.entry; } private: - SerializeElement burnTime; + SerializeElement burnTimeSecs; + SerializeElement switchIntervalMs; SerializeElement dryRun; }; @@ -50,7 +54,14 @@ class SolarArrayDeploymentHandler : public ExecutableObjectIF, public SystemObject, public HasActionsIF { public: - //! Manual deployment of the solar arrays. Burn time and channels are supplied with TC parameters + //! Manual deployment of the solar arrays. Burn time, channel switch interval and dry run flag + //! are supplied as parameters. There are following cases to consider + //! + //! - Channel switch interval greater or equal to burn time: Only burn one channel + //! - Channel switch interval half of burn time: Burn each channel for half of the burn time. + //! + //! The dry run flag can be used to avoid actually toggling IO pins and only test the + //! application logic. static constexpr DeviceCommandId_t DEPLOY_SOLAR_ARRAYS_MANUALLY = 0x05; static constexpr DeviceCommandId_t SWITCH_OFF_DEPLOYMENT = 0x06; @@ -157,7 +168,7 @@ class SolarArrayDeploymentHandler : public ExecutableObjectIF, PeriodicOperationDivider opDivider = PeriodicOperationDivider(5); uint8_t retryCounter = 3; - bool startFsmOn(uint32_t burnCountdownSecs, bool dryRun); + bool startFsmOn(uint32_t burnCountdownSecs, uint32_t channelAlternationIntervalMs, bool dryRun); void startFsmOff(); void finishFsm(ReturnValue_t resultForActionHelper); @@ -175,8 +186,9 @@ class SolarArrayDeploymentHandler : public ExecutableObjectIF, */ Countdown burnCountdown; + // Only initial value, new approach is to burn each channel half of the total burn time. Countdown channelAlternationCd = - Countdown(config::SA_DEPL_CHANNEL_ALTERNATION_INTERVAL_SECS * 1000); + Countdown(config::LEGACY_SA_DEPL_CHANNEL_ALTERNATION_INTERVAL_SECS * 1000); /** * The message queue id of the component commanding an action will be stored in this variable. diff --git a/tmtc b/tmtc index f3c0b756..2b5ad32f 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit f3c0b7567aec22db02a07d76548617b8d163fb29 +Subproject commit 2b5ad32fdd56d38e8318027b67d091d9e0ea3aba -- 2.34.1 From f8196de0891351c2aa2f32d22bb7539b43fe1231 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Jan 2023 12:24:19 +0100 Subject: [PATCH 2/7] update changelog --- CHANGELOG.md | 5 +++++ .../devices/SolarArrayDeploymentHandler.cpp | 21 +++++++++++++------ mission/devices/SolarArrayDeploymentHandler.h | 10 +++++++-- tmtc | 2 +- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 152bbead..6a857d28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,11 @@ list yields a list of all related PRs for each release. - The ACS Controller Gyro Sets (raw and processed) and the MEKF dataset are diagnostics now. - Bumped FSFW for Service 11 improvement which includes size and CRC check for contained TC - Syrlinks module now always included for both EM and FM +- SA Deployment: Allow specifying the switch interval and the initial channel. This allows testing + the new deployment procedure where each channel is burned for half of the whole burn duration. + It also allows burning only one channel for the whole burn duration. The autonomous mechanism + was adapted to burn each channel for half of the burn time by default. + PR: ## Fixed diff --git a/mission/devices/SolarArrayDeploymentHandler.cpp b/mission/devices/SolarArrayDeploymentHandler.cpp index 26ae987f..2b4e22ac 100644 --- a/mission/devices/SolarArrayDeploymentHandler.cpp +++ b/mission/devices/SolarArrayDeploymentHandler.cpp @@ -97,9 +97,15 @@ void SolarArrayDeploymentHandler::handleStateMachine() { // This should never fail channelAlternationCd.resetTimer(); if (not fsmInfo.dryRun) { - sa2Off(); - sa1On(); - fsmInfo.alternationDummy = true; + if (fsmInfo.initChannel == 0) { + sa2Off(); + sa1On(); + fsmInfo.alternationDummy = true; + } else { + sa1Off(); + sa2On(); + fsmInfo.alternationDummy = false; + } } sif::info << "S/A Deployment: Burning" << std::endl; triggerEvent(BURN_PHASE_START, fsmInfo.burnCountdownMs, fsmInfo.dryRun); @@ -220,7 +226,7 @@ bool SolarArrayDeploymentHandler::autonomousDeplForFile(sd::SdCard sdCard, const if (stateSwitch or firstAutonomousCycle) { if (deplState == AutonomousDeplState::FIRST_BURN or deplState == AutonomousDeplState::SECOND_BURN) { - startFsmOn(config::SA_DEPL_BURN_TIME_SECS, (config::SA_DEPL_BURN_TIME_SECS / 2) * 1000, + startFsmOn(config::SA_DEPL_BURN_TIME_SECS, (config::SA_DEPL_BURN_TIME_SECS / 2) * 1000, 0, dryRun); } else if (deplState == AutonomousDeplState::WAIT or deplState == AutonomousDeplState::DONE or deplState == AutonomousDeplState::INIT) { @@ -286,7 +292,8 @@ bool SolarArrayDeploymentHandler::checkMainPower(bool onOff) { } bool SolarArrayDeploymentHandler::startFsmOn(uint32_t burnCountdownSecs, - uint32_t channelAlternationIntervalMs, bool dryRun) { + uint32_t channelAlternationIntervalMs, + uint8_t initChannel, bool dryRun) { if (stateMachine != StateMachine::IDLE) { return false; } @@ -296,6 +303,7 @@ bool SolarArrayDeploymentHandler::startFsmOn(uint32_t burnCountdownSecs, } fsmInfo.dryRun = dryRun; fsmInfo.burnCountdownMs = burnCountdownSecs * 1000; + fsmInfo.initChannel = initChannel; stateMachine = StateMachine::MAIN_POWER_ON; retryCounter = 0; return true; @@ -359,7 +367,8 @@ ReturnValue_t SolarArrayDeploymentHandler::executeAction(ActionId_t actionId, return result; } uint32_t burnCountdown = cmd.getBurnTimeSecs(); - if (not startFsmOn(burnCountdown, cmd.getSwitchIntervalMs(), cmd.isDryRun())) { + if (not startFsmOn(burnCountdown, cmd.getSwitchIntervalMs(), cmd.getInitChannel(), + cmd.isDryRun())) { return HasActionsIF::IS_BUSY; } actionActive = true; diff --git a/mission/devices/SolarArrayDeploymentHandler.h b/mission/devices/SolarArrayDeploymentHandler.h index ddb91ab9..8e5c32ad 100644 --- a/mission/devices/SolarArrayDeploymentHandler.h +++ b/mission/devices/SolarArrayDeploymentHandler.h @@ -30,18 +30,22 @@ class ManualDeploymentCommand : public SerialLinkedListAdapter { void setLinks() { setStart(&burnTimeSecs); burnTimeSecs.setNext(&switchIntervalMs); - burnTimeSecs.setNext(&dryRun); + switchIntervalMs.setNext(&initChannel); + initChannel.setNext(&dryRun); } uint32_t getBurnTimeSecs() const { return burnTimeSecs.entry; } uint32_t getSwitchIntervalMs() const { return switchIntervalMs.entry; }; + uint8_t getInitChannel() const { return initChannel.entry; }; + bool isDryRun() const { return dryRun.entry; } private: SerializeElement burnTimeSecs; SerializeElement switchIntervalMs; + SerializeElement initChannel; SerializeElement dryRun; }; @@ -130,6 +134,7 @@ class SolarArrayDeploymentHandler : public ExecutableObjectIF, // DeploymentChannels channel; bool dryRun; bool alternationDummy = false; + uint8_t initChannel = 0; uint32_t burnCountdownMs = config::SA_DEPL_MAX_BURN_TIME; }; @@ -168,7 +173,8 @@ class SolarArrayDeploymentHandler : public ExecutableObjectIF, PeriodicOperationDivider opDivider = PeriodicOperationDivider(5); uint8_t retryCounter = 3; - bool startFsmOn(uint32_t burnCountdownSecs, uint32_t channelAlternationIntervalMs, bool dryRun); + bool startFsmOn(uint32_t burnCountdownSecs, uint32_t channelAlternationIntervalMs, + uint8_t initChannel, bool dryRun); void startFsmOff(); void finishFsm(ReturnValue_t resultForActionHelper); diff --git a/tmtc b/tmtc index 2b5ad32f..91272847 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 2b5ad32fdd56d38e8318027b67d091d9e0ea3aba +Subproject commit 912728474a11b6ccb86ce61c3aa802d931caac68 -- 2.34.1 From 09381ee86bd7a8a9048404ef5109a4310056712a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Jan 2023 12:25:14 +0100 Subject: [PATCH 3/7] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a857d28..87cf0178 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,7 @@ list yields a list of all related PRs for each release. the new deployment procedure where each channel is burned for half of the whole burn duration. It also allows burning only one channel for the whole burn duration. The autonomous mechanism was adapted to burn each channel for half of the burn time by default. - PR: + PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/347 ## Fixed -- 2.34.1 From fee8282cc5fb400ba629621526be89ca68ef24e0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Jan 2023 12:26:45 +0100 Subject: [PATCH 4/7] bump changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87cf0178..56cf7e33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ list yields a list of all related PRs for each release. It also allows burning only one channel for the whole burn duration. The autonomous mechanism was adapted to burn each channel for half of the burn time by default. PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/347 + TMTC PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/127 ## Fixed -- 2.34.1 From 45413726e7b3528b1fb96869a4f5ef12d767f3e7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Jan 2023 12:31:42 +0100 Subject: [PATCH 5/7] update docs --- mission/devices/SolarArrayDeploymentHandler.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mission/devices/SolarArrayDeploymentHandler.h b/mission/devices/SolarArrayDeploymentHandler.h index 8e5c32ad..63f1d3de 100644 --- a/mission/devices/SolarArrayDeploymentHandler.h +++ b/mission/devices/SolarArrayDeploymentHandler.h @@ -58,10 +58,12 @@ class SolarArrayDeploymentHandler : public ExecutableObjectIF, public SystemObject, public HasActionsIF { public: - //! Manual deployment of the solar arrays. Burn time, channel switch interval and dry run flag - //! are supplied as parameters. There are following cases to consider + //! Manual deployment of the solar arrays. Burn time, channel switch interval, initial + //! burn channel and dry run flag are supplied as parameters. There are following cases to + //! consider. //! - //! - Channel switch interval greater or equal to burn time: Only burn one channel + //! - Channel switch interval greater or equal to burn time: Only burn one channel. The init + //! burn channel parameter can be used to select which channel is burned. //! - Channel switch interval half of burn time: Burn each channel for half of the burn time. //! //! The dry run flag can be used to avoid actually toggling IO pins and only test the -- 2.34.1 From 96525d4aef34241d273255d14191530061776103 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Jan 2023 13:55:21 +0100 Subject: [PATCH 6/7] bump tmtc --- tmtc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtc b/tmtc index 91272847..5a0feff2 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 912728474a11b6ccb86ce61c3aa802d931caac68 +Subproject commit 5a0feff2847e033ad65b5d1619c398869ead5fd4 -- 2.34.1 From c03b6c92687e08c050972187c360e49f9e9236b7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Jan 2023 14:23:09 +0100 Subject: [PATCH 7/7] bump tmtc --- tmtc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtc b/tmtc index 5a0feff2..2f33a439 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 5a0feff2847e033ad65b5d1619c398869ead5fd4 +Subproject commit 2f33a4393774a3d6905f2239bd72cb0c4cc2060a -- 2.34.1