diff --git a/CHANGELOG.md b/CHANGELOG.md index 152bbead..d42efd7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ list yields a list of all related PRs for each release. ## Added -- The Q7S SW now checks for a file named `boot_delay_secs.stxt` in the home directory. +- The Q7S SW now checks for a file named `boot_delay_secs.txt` in the home directory. If it exists and the file is empty, it will delay for 6 seconds before continuing with the regular boot. It can also try to read delay seconds from the file. PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/340. @@ -22,6 +22,15 @@ 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: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/347 + TMTC PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/127 +- `Max31865RtdLowlevelHandler.cpp`: For each RTD device, the config is now re-written before + every read. This seems to fix some issue with invalid temperature sensor readings. + PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/345 ## Fixed @@ -31,7 +40,7 @@ list yields a list of all related PRs for each release. on shut-down. PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/342 -# [v1.19.0] 10.01.2023 +# [v1.19.0] 2023-01-10 ## Changed @@ -53,7 +62,7 @@ list yields a list of all related PRs for each release. - Add automatic 5V stack commanding for all connected devices PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/335 -# [v1.18.0] 01.12.2022 +# [v1.18.0] 2022-12-01 ## Changed @@ -62,7 +71,7 @@ list yields a list of all related PRs for each release. - Renamed `/dev/i2c_eive` to `/dev/i2c_pl` and `/dev/i2c-2` to `/dev/i2c_ps`. PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/328 -# [v1.17.0] 28.11.2022 +# [v1.17.0] 2022-11-28 ## Added @@ -71,7 +80,7 @@ list yields a list of all related PRs for each release. PR 2: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/324 PR 3: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/326 -# [v1.16.0] 18.11.2022 +# [v1.16.0] 2022-11-18 - It is now possible to compile Linux components for the hosted build conditionally PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/322 @@ -88,7 +97,7 @@ list yields a list of all related PRs for each release. - Add remaining missing TMP1075 device handlers. PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/318 -# [v1.15.0] 27.10.2022 +# [v1.15.0] 2022-10-27 - Consistent device file naming - Remove rad sensor from EM build, lead to weird bugs on EM which 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/linux/devices/Max31865RtdLowlevelHandler.cpp b/linux/devices/Max31865RtdLowlevelHandler.cpp index 38a9ac11..14ef9659 100644 --- a/linux/devices/Max31865RtdLowlevelHandler.cpp +++ b/linux/devices/Max31865RtdLowlevelHandler.cpp @@ -143,7 +143,7 @@ ReturnValue_t Max31865RtdReader::periodicReadHandling() { auto result = returnvalue::OK; MutexGuard mg(readerMutex); if (mg.getLockResult() != returnvalue::OK) { - sif::warning << "Max31865RtdReader::periodicReadReqHandling: Mutex lock failed" << std::endl; + sif::warning << "Max31865RtdReader::periodicReadHandling: Mutex lock failed" << std::endl; return returnvalue::FAILED; } // Now read the RTD values @@ -154,6 +154,10 @@ ReturnValue_t Max31865RtdReader::periodicReadHandling() { if (rtdIsActive(rtd->idx)) { uint16_t rtdVal = 0; bool faultBitSet = false; + result = writeCfgReg(rtd->spiCookie, BASE_CFG); + if (result != returnvalue::OK) { + handleSpiError(rtd, result, "writeCfgReg"); + } result = readRtdVal(rtd->spiCookie, rtdVal, faultBitSet); if (result != returnvalue::OK) { handleSpiError(rtd, result, "readRtdVal"); @@ -282,7 +286,13 @@ ReturnValue_t Max31865RtdReader::sendMessage(CookieIF* cookie, const uint8_t* se } break; } - case (EiveMax31855::RtdCommands::CFG): + case (EiveMax31855::RtdCommands::CFG): { + ReturnValue_t result = writeCfgReg(rtdCookie->spiCookie, BASE_CFG); + if (result != returnvalue::OK) { + handleSpiError(rtdCookie, result, "writeCfgReg"); + } + break; + } default: { // TODO: Only implement if needed break; diff --git a/linux/ipcore/PdecConfig.cpp b/linux/ipcore/PdecConfig.cpp index 321e5940..21de4610 100644 --- a/linux/ipcore/PdecConfig.cpp +++ b/linux/ipcore/PdecConfig.cpp @@ -9,8 +9,12 @@ PdecConfig::~PdecConfig() {} void PdecConfig::initialize() { uint32_t word = 0; word |= (VERSION_ID << 30); + + // Setting the bypass flag and the control command flag should not have any + // implication on the operation of the PDEC IP Core word |= (BYPASS_FLAG << 29); word |= (CONTROL_COMMAND_FLAG << 28); + word |= (RESERVED_FIELD_A << 26); word |= (SPACECRAFT_ID << 16); word |= (VIRTUAL_CHANNEL << 10); diff --git a/mission/devices/Max31865EiveHandler.cpp b/mission/devices/Max31865EiveHandler.cpp index db6f5a83..433f7b58 100644 --- a/mission/devices/Max31865EiveHandler.cpp +++ b/mission/devices/Max31865EiveHandler.cpp @@ -69,7 +69,8 @@ ReturnValue_t Max31865EiveHandler::buildCommandFromCommand(DeviceCommandId_t dev switch (cmdTyped) { case (EiveMax31855::RtdCommands::ON): case (EiveMax31855::RtdCommands::ACTIVE): - case (EiveMax31855::RtdCommands::OFF): { + case (EiveMax31855::RtdCommands::OFF): + case (EiveMax31855::RtdCommands::CFG): { simpleCommand(cmdTyped); break; } @@ -77,9 +78,6 @@ ReturnValue_t Max31865EiveHandler::buildCommandFromCommand(DeviceCommandId_t dev case (EiveMax31855::RtdCommands::HIGH_TRESHOLD): { break; } - case (EiveMax31855::RtdCommands::CFG): { - break; - } default: return NOTHING_TO_SEND; } @@ -100,6 +98,7 @@ void Max31865EiveHandler::simpleCommand(EiveMax31855::RtdCommands cmd) { rawPacket = cmdBuf.data(); rawPacketLen = 1; } + void Max31865EiveHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { if (getMode() == _MODE_TO_NORMAL) { if (state != InternalState::ACTIVE) { @@ -117,6 +116,7 @@ void Max31865EiveHandler::fillCommandAndReplyMap() { insertInCommandMap(EiveMax31855::RtdCommands::ON); insertInCommandMap(EiveMax31855::RtdCommands::ACTIVE); insertInCommandMap(EiveMax31855::RtdCommands::OFF); + insertInCommandMap(EiveMax31855::RtdCommands::CFG); insertInReplyMap(EiveMax31855::RtdCommands::EXCHANGE_SET_ID, 200, &sensorDataset, 0, true); } diff --git a/mission/devices/SolarArrayDeploymentHandler.cpp b/mission/devices/SolarArrayDeploymentHandler.cpp index 5656692d..2b4e22ac 100644 --- a/mission/devices/SolarArrayDeploymentHandler.cpp +++ b/mission/devices/SolarArrayDeploymentHandler.cpp @@ -97,12 +97,19 @@ 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); + channelAlternationCd.resetTimer(); stateMachine = BURNING; } if (stateMachine == BURNING) { @@ -219,7 +226,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, 0, + dryRun); } else if (deplState == AutonomousDeplState::WAIT or deplState == AutonomousDeplState::DONE or deplState == AutonomousDeplState::INIT) { startFsmOff(); @@ -283,15 +291,19 @@ bool SolarArrayDeploymentHandler::checkMainPower(bool onOff) { return false; } -bool SolarArrayDeploymentHandler::startFsmOn(uint32_t burnCountdownSecs, bool dryRun) { +bool SolarArrayDeploymentHandler::startFsmOn(uint32_t burnCountdownSecs, + uint32_t channelAlternationIntervalMs, + uint8_t initChannel, 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; } fsmInfo.dryRun = dryRun; fsmInfo.burnCountdownMs = burnCountdownSecs * 1000; + fsmInfo.initChannel = initChannel; stateMachine = StateMachine::MAIN_POWER_ON; retryCounter = 0; return true; @@ -354,8 +366,9 @@ 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.getInitChannel(), + cmd.isDryRun())) { return HasActionsIF::IS_BUSY; } actionActive = true; diff --git a/mission/devices/SolarArrayDeploymentHandler.h b/mission/devices/SolarArrayDeploymentHandler.h index b935b096..63f1d3de 100644 --- a/mission/devices/SolarArrayDeploymentHandler.h +++ b/mission/devices/SolarArrayDeploymentHandler.h @@ -28,16 +28,24 @@ class ManualDeploymentCommand : public SerialLinkedListAdapter { ManualDeploymentCommand() { setLinks(); } void setLinks() { - setStart(&burnTime); - burnTime.setNext(&dryRun); + setStart(&burnTimeSecs); + burnTimeSecs.setNext(&switchIntervalMs); + switchIntervalMs.setNext(&initChannel); + initChannel.setNext(&dryRun); } - uint32_t getBurnTime() const { return burnTime.entry; } + 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 burnTime; + SerializeElement burnTimeSecs; + SerializeElement switchIntervalMs; + SerializeElement initChannel; SerializeElement dryRun; }; @@ -50,7 +58,16 @@ 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, 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. 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 + //! application logic. static constexpr DeviceCommandId_t DEPLOY_SOLAR_ARRAYS_MANUALLY = 0x05; static constexpr DeviceCommandId_t SWITCH_OFF_DEPLOYMENT = 0x06; @@ -119,6 +136,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; }; @@ -157,7 +175,8 @@ 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, + uint8_t initChannel, bool dryRun); void startFsmOff(); void finishFsm(ReturnValue_t resultForActionHelper); @@ -175,8 +194,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..2f33a439 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit f3c0b7567aec22db02a07d76548617b8d163fb29 +Subproject commit 2f33a4393774a3d6905f2239bd72cb0c4cc2060a