From 847e3bb51df0e4919007d5e43a69eef705f5d75b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 2 Apr 2023 20:12:24 +0200 Subject: [PATCH 1/6] prep imtq startup handling --- linux/acs/ImtqPollingTask.cpp | 56 +++++++++++++++++++++-------------- linux/acs/ImtqPollingTask.h | 12 +++++--- mission/acs/ImtqHandler.cpp | 8 ++--- mission/acs/acsBoardPolling.h | 4 +-- mission/acs/defs.h | 2 ++ mission/acs/imtqHelpers.h | 4 ++- 6 files changed, 53 insertions(+), 33 deletions(-) diff --git a/linux/acs/ImtqPollingTask.cpp b/linux/acs/ImtqPollingTask.cpp index ca7c75ff..cfa4e337 100644 --- a/linux/acs/ImtqPollingTask.cpp +++ b/linux/acs/ImtqPollingTask.cpp @@ -27,7 +27,7 @@ ReturnValue_t ImtqPollingTask::performOperation(uint8_t operationCode) { comStatus = returnvalue::OK; // Stopwatch watch; - switch (currentRequest) { + switch (currentRequest.requestType) { case imtq::RequestType::MEASURE_NO_ACTUATION: { // Measured to take 24 ms for debug and release builds. // Stopwatch watch; @@ -51,6 +51,9 @@ void ImtqPollingTask::handleMeasureStep() { uint8_t* replyPtr; ImtqRepliesDefault replies(replyBuf.data()); // If some startup handling is added later, set configured after it was done once. + if (performStartup) { + performStartup = false; + } replies.setConfigured(); // Can be used later to verify correct timing (e.g. all data has been read) @@ -73,7 +76,7 @@ void ImtqPollingTask::handleMeasureStep() { return; } - if (specialRequest != imtq::SpecialRequest::NONE) { + if (currentRequest.specialRequest != imtq::SpecialRequest::NONE) { auto executeSelfTest = [&](imtq::selfTest::Axis axis) { cmdBuf[0] = imtq::CC::SELF_TEST_CMD; cmdBuf[1] = axis; @@ -81,7 +84,7 @@ void ImtqPollingTask::handleMeasureStep() { }; // If a self-test is already ongoing, ignore the request. if (replies.getSystemState()[2] != static_cast(imtq::mode::SELF_TEST)) { - switch (specialRequest) { + switch (currentRequest.specialRequest) { case (imtq::SpecialRequest::DO_SELF_TEST_POS_X): { executeSelfTest(imtq::selfTest::Axis::X_POSITIVE); break; @@ -234,18 +237,21 @@ ReturnValue_t ImtqPollingTask::initializeInterface(CookieIF* cookie) { ReturnValue_t ImtqPollingTask::sendMessage(CookieIF* cookie, const uint8_t* sendData, size_t sendLen) { const auto* imtqReq = reinterpret_cast(sendData); + if (sendLen != sizeof(imtq::Request)) { + return returnvalue::FAILED; + } { MutexGuard mg(ipcLock); - if (imtqReq->request == imtq::RequestType::ACTUATE) { - std::memcpy(dipoles, imtqReq->dipoles, sizeof(dipoles)); - torqueDuration = imtqReq->torqueDuration; - } - currentRequest = imtqReq->request; - specialRequest = imtqReq->specialRequest; if (state != InternalState::IDLE) { return returnvalue::FAILED; } state = InternalState::IS_BUSY; + if (currentRequest.mode != imtqReq->mode) { + if (imtqReq->mode == acs::SimpleSensorMode::NORMAL) { + performStartup = true; + } + } + std::memcpy(¤tRequest, imtqReq, sendLen); } semaphore->release(); @@ -345,10 +351,10 @@ void ImtqPollingTask::buildDipoleCommand() { uint8_t* serPtr = cmdBuf.data() + 1; size_t serLen = 0; for (uint8_t idx = 0; idx < 3; idx++) { - SerializeAdapter::serialize(&dipoles[idx], &serPtr, &serLen, cmdBuf.size(), + SerializeAdapter::serialize(¤tRequest.dipoles[idx], &serPtr, &serLen, cmdBuf.size(), SerializeIF::Endianness::LITTLE); } - SerializeAdapter::serialize(&torqueDuration, &serPtr, &serLen, cmdBuf.size(), + SerializeAdapter::serialize(¤tRequest.torqueDuration, &serPtr, &serLen, cmdBuf.size(), SerializeIF::Endianness::LITTLE); // sif::debug << "Dipole X: " << dipoles[0] << std::endl; // sif::debug << "Torqeu Dur: " << torqueDuration << std::endl; @@ -357,22 +363,28 @@ void ImtqPollingTask::buildDipoleCommand() { ReturnValue_t ImtqPollingTask::readReceivedMessage(CookieIF* cookie, uint8_t** buffer, size_t* size) { - imtq::RequestType currentRequest; + imtq::Request currentRequest; { MutexGuard mg(ipcLock); - currentRequest = this->currentRequest; + std::memcpy(¤tRequest, &this->currentRequest, sizeof(currentRequest)); } size_t replyLen = 0; - MutexGuard mg(bufLock); - if (currentRequest == imtq::RequestType::MEASURE_NO_ACTUATION) { - replyLen = getExchangeBufLen(specialRequest); - memcpy(exchangeBuf.data(), replyBuf.data(), replyLen); - } else if (currentRequest == imtq::RequestType::ACTUATE) { - replyLen = ImtqRepliesWithTorque::BASE_LEN; - memcpy(exchangeBuf.data(), replyBufActuation.data(), replyLen); - } else { - *size = 0; + { + MutexGuard mg(bufLock); + if (currentRequest.requestType == imtq::RequestType::MEASURE_NO_ACTUATION) { + replyLen = getExchangeBufLen(currentRequest.specialRequest); + memcpy(exchangeBuf.data(), replyBuf.data(), replyLen); + } else if (currentRequest.requestType == imtq::RequestType::ACTUATE) { + replyLen = ImtqRepliesWithTorque::BASE_LEN; + memcpy(exchangeBuf.data(), replyBufActuation.data(), replyLen); + } else { + *size = 0; + } + } + { + MutexGuard mg(ipcLock); + this->currentRequest.requestType = imtq::RequestType::DO_NOTHING; } *buffer = exchangeBuf.data(); *size = replyLen; diff --git a/linux/acs/ImtqPollingTask.h b/linux/acs/ImtqPollingTask.h index 50778ffa..f4190658 100644 --- a/linux/acs/ImtqPollingTask.h +++ b/linux/acs/ImtqPollingTask.h @@ -3,6 +3,7 @@ #include #include +#include #include @@ -24,7 +25,6 @@ class ImtqPollingTask : public SystemObject, static constexpr ReturnValue_t NO_REPLY_AVAILABLE = returnvalue::makeCode(2, 0); enum class InternalState { IDLE, IS_BUSY } state = InternalState::IDLE; - imtq::RequestType currentRequest = imtq::RequestType::MEASURE_NO_ACTUATION; SemaphoreIF* semaphore; ReturnValue_t comStatus = returnvalue::OK; @@ -38,10 +38,14 @@ class ImtqPollingTask : public SystemObject, // Required in addition to integration time, otherwise old data might be read. static constexpr uint32_t MGM_READ_BUFFER_TIME_MS = 6; bool ignoreNextActuateRequest = false; + bool performStartup = false; - imtq::SpecialRequest specialRequest = imtq::SpecialRequest::NONE; - int16_t dipoles[3] = {}; - uint16_t torqueDuration = 0; + imtq::Request currentRequest{}; + // int16_t dipoles[3] = {}; + // uint16_t torqueDuration = 0; + // imtq::RequestType currentRequest = imtq::RequestType::MEASURE_NO_ACTUATION; + // imtq::SpecialRequest specialRequest = imtq::SpecialRequest::NONE; + // acs::SimpleSensorMode mode = acs::SimpleSensorMode::OFF; std::array cmdBuf; std::array replyBuf; diff --git a/mission/acs/ImtqHandler.cpp b/mission/acs/ImtqHandler.cpp index fdf53611..1168ed33 100644 --- a/mission/acs/ImtqHandler.cpp +++ b/mission/acs/ImtqHandler.cpp @@ -178,7 +178,7 @@ ReturnValue_t ImtqHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { } default: { *id = imtq::cmdIds::REQUEST; - request.request = imtq::RequestType::DO_NOTHING; + request.requestType = imtq::RequestType::DO_NOTHING; request.specialRequest = imtq::SpecialRequest::NONE; expectedReply = DeviceHandlerIF::NO_COMMAND_ID; rawPacket = reinterpret_cast(&request); @@ -201,7 +201,7 @@ ReturnValue_t ImtqHandler::buildCommandFromCommand(DeviceCommandId_t deviceComma const uint8_t* commandData, size_t commandDataLen) { auto genericSpecialRequest = [&](imtq::SpecialRequest specialRequest) { - request.request = imtq::RequestType::MEASURE_NO_ACTUATION; + request.requestType = imtq::RequestType::MEASURE_NO_ACTUATION; request.specialRequest = specialRequest; expectedReply = imtq::cmdIds::REPLY_NO_TORQUE; specialRequestActive = true; @@ -238,7 +238,7 @@ ReturnValue_t ImtqHandler::buildCommandFromCommand(DeviceCommandId_t deviceComma return returnvalue::OK; } case (imtq::cmdIds::REQUEST): { - request.request = imtq::RequestType::MEASURE_NO_ACTUATION; + request.requestType = imtq::RequestType::MEASURE_NO_ACTUATION; request.specialRequest = imtq::SpecialRequest::NONE; expectedReply = imtq::cmdIds::REPLY_NO_TORQUE; rawPacket = reinterpret_cast(&request); @@ -267,7 +267,7 @@ ReturnValue_t ImtqHandler::buildCommandFromCommand(DeviceCommandId_t deviceComma } expectedReply = imtq::cmdIds::REPLY_WITH_TORQUE; - request.request = imtq::RequestType::ACTUATE; + request.requestType = imtq::RequestType::ACTUATE; request.specialRequest = imtq::SpecialRequest::NONE; std::memcpy(request.dipoles, dipoleSet.dipoles.value, sizeof(request.dipoles)); request.torqueDuration = dipoleSet.currentTorqueDurationMs.value; diff --git a/mission/acs/acsBoardPolling.h b/mission/acs/acsBoardPolling.h index 612512a7..90f0f19c 100644 --- a/mission/acs/acsBoardPolling.h +++ b/mission/acs/acsBoardPolling.h @@ -1,13 +1,13 @@ #ifndef MISSION_DEVICES_DEVICEDEFINITIONS_ACSPOLLING_H_ #define MISSION_DEVICES_DEVICEDEFINITIONS_ACSPOLLING_H_ +#include + #include "fsfw/thermal/tcsDefinitions.h" #include "gyroAdisHelpers.h" namespace acs { -enum SimpleSensorMode { NORMAL = 0, OFF = 1 }; - struct Adis1650XRequest { SimpleSensorMode mode; adis1650x::Type type; diff --git a/mission/acs/defs.h b/mission/acs/defs.h index dcfc17b0..bfa37cdc 100644 --- a/mission/acs/defs.h +++ b/mission/acs/defs.h @@ -6,6 +6,8 @@ namespace acs { +enum class SimpleSensorMode { NORMAL = 0, OFF = 1 }; + // These modes are the submodes of the ACS controller and the modes of the ACS subsystem. enum AcsMode : Mode_t { OFF = HasModesIF::MODE_OFF, diff --git a/mission/acs/imtqHelpers.h b/mission/acs/imtqHelpers.h index 8fa2ebf0..cd39c907 100644 --- a/mission/acs/imtqHelpers.h +++ b/mission/acs/imtqHelpers.h @@ -5,6 +5,7 @@ #include #include #include +#include class ImtqHandler; @@ -27,7 +28,8 @@ enum class SpecialRequest : uint8_t { }; struct Request { - imtq::RequestType request = imtq::RequestType::MEASURE_NO_ACTUATION; + acs::SimpleSensorMode mode = acs::SimpleSensorMode::OFF; + imtq::RequestType requestType = imtq::RequestType::MEASURE_NO_ACTUATION; imtq::SpecialRequest specialRequest = imtq::SpecialRequest::NONE; uint8_t integrationTimeSel = 3; int16_t dipoles[3]{}; -- 2.43.0 From 7522eac9ebfdd01f7aa01e511eacd056f8155cf1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 2 Apr 2023 23:43:41 +0200 Subject: [PATCH 2/6] done --- linux/acs/ImtqPollingTask.cpp | 20 ++++++++++++++++++++ linux/acs/ImtqPollingTask.h | 7 +------ mission/acs/ImtqHandler.cpp | 2 ++ mission/acs/imtqHelpers.cpp | 21 +++++++++++++++++++++ mission/acs/imtqHelpers.h | 12 +++++++++++- 5 files changed, 55 insertions(+), 7 deletions(-) diff --git a/linux/acs/ImtqPollingTask.cpp b/linux/acs/ImtqPollingTask.cpp index cfa4e337..dc2af7dd 100644 --- a/linux/acs/ImtqPollingTask.cpp +++ b/linux/acs/ImtqPollingTask.cpp @@ -52,6 +52,26 @@ void ImtqPollingTask::handleMeasureStep() { ImtqRepliesDefault replies(replyBuf.data()); // If some startup handling is added later, set configured after it was done once. if (performStartup) { + // Set integration time for the MGM. + cmdBuf[0] = imtq::CC::SET_PARAM; + size_t dummy = 0; + SerializeAdapter::serialize(&imtq::param::INTEGRATION_TIME_SELECT, cmdBuf.data() + 1, &dummy, + cmdBuf.size(), SerializeIF::Endianness::LITTLE); + cmdBuf[3] = currentRequest.integrationTimeSel; + ReturnValue_t result = performI2cFullRequest(replyBuf.data(), 5); + if (result != returnvalue::OK) { + comStatus = imtq::STARTUP_CFG_ERROR; + } + if (replyBuf[0] != imtq::CC::SET_PARAM) { + sif::error << "ImtqPollingTask: First byte of reply not equal to sent CC" << std::endl; + comStatus = imtq::STARTUP_CFG_ERROR; + } + if (replyBuf[4] != currentRequest.integrationTimeSel) { + sif::error << "ImtqPollingTask: Integration time confiuration failed" << std::endl; + comStatus = imtq::STARTUP_CFG_ERROR; + } + currentIntegrationTimeMs = + imtq::integrationTimeFromSelectValue(currentRequest.integrationTimeSel); performStartup = false; } replies.setConfigured(); diff --git a/linux/acs/ImtqPollingTask.h b/linux/acs/ImtqPollingTask.h index f4190658..378a8e38 100644 --- a/linux/acs/ImtqPollingTask.h +++ b/linux/acs/ImtqPollingTask.h @@ -36,16 +36,11 @@ class ImtqPollingTask : public SystemObject, address_t i2cAddr = 0; uint32_t currentIntegrationTimeMs = 10; // Required in addition to integration time, otherwise old data might be read. - static constexpr uint32_t MGM_READ_BUFFER_TIME_MS = 6; + static constexpr uint32_t MGM_READ_BUFFER_TIME_MS = 4; bool ignoreNextActuateRequest = false; bool performStartup = false; imtq::Request currentRequest{}; - // int16_t dipoles[3] = {}; - // uint16_t torqueDuration = 0; - // imtq::RequestType currentRequest = imtq::RequestType::MEASURE_NO_ACTUATION; - // imtq::SpecialRequest specialRequest = imtq::SpecialRequest::NONE; - // acs::SimpleSensorMode mode = acs::SimpleSensorMode::OFF; std::array cmdBuf; std::array replyBuf; diff --git a/mission/acs/ImtqHandler.cpp b/mission/acs/ImtqHandler.cpp index 1168ed33..e38af787 100644 --- a/mission/acs/ImtqHandler.cpp +++ b/mission/acs/ImtqHandler.cpp @@ -240,6 +240,8 @@ ReturnValue_t ImtqHandler::buildCommandFromCommand(DeviceCommandId_t deviceComma case (imtq::cmdIds::REQUEST): { request.requestType = imtq::RequestType::MEASURE_NO_ACTUATION; request.specialRequest = imtq::SpecialRequest::NONE; + // 6 ms integration time instead of 10 ms. + request.integrationTimeSel = 2; expectedReply = imtq::cmdIds::REPLY_NO_TORQUE; rawPacket = reinterpret_cast(&request); rawPacketLen = sizeof(imtq::Request); diff --git a/mission/acs/imtqHelpers.cpp b/mission/acs/imtqHelpers.cpp index 758cfe23..a222eb76 100644 --- a/mission/acs/imtqHelpers.cpp +++ b/mission/acs/imtqHelpers.cpp @@ -1,5 +1,26 @@ #include "imtqHelpers.h" +uint16_t imtq::integrationTimeFromSelectValue(uint8_t value) { + switch (value) { + case (0): + return 2; + case (1): + return 3; + case (2): + return 6; + case (3): + return 10; + case (4): + return 20; + case (5): + return 40; + case (6): + return 80; + default: + return 10; + } +} + size_t imtq::getReplySize(CC::CC cc, size_t* optSecondSize) { switch (cc) { // Software reset is a bit special and can also cause a I2C NAK because diff --git a/mission/acs/imtqHelpers.h b/mission/acs/imtqHelpers.h index cd39c907..38530d3c 100644 --- a/mission/acs/imtqHelpers.h +++ b/mission/acs/imtqHelpers.h @@ -14,6 +14,8 @@ class ImtqHandler; namespace imtq { +uint16_t integrationTimeFromSelectValue(uint8_t value); + enum class RequestType : uint8_t { MEASURE_NO_ACTUATION, ACTUATE, DO_NOTHING }; enum class SpecialRequest : uint8_t { @@ -59,9 +61,10 @@ static const ReturnValue_t CC_UNAVAILABLE = MAKE_RETURN_CODE(5); static const ReturnValue_t INTERNAL_PROCESSING_ERROR = MAKE_RETURN_CODE(6); static const ReturnValue_t REJECTED_WITHOUT_REASON = MAKE_RETURN_CODE(7); static const ReturnValue_t CMD_ERR_UNKNOWN = MAKE_RETURN_CODE(8); +static constexpr ReturnValue_t STARTUP_CFG_ERROR = MAKE_RETURN_CODE(9); //! [EXPORT] : [COMMENT] The status reply to a self test command was received but no self test //! command has been sent. This should normally never happen. -static const ReturnValue_t UNEXPECTED_SELF_TEST_REPLY = MAKE_RETURN_CODE(0xA7); +static const ReturnValue_t UNEXPECTED_SELF_TEST_REPLY = MAKE_RETURN_CODE(10); namespace cmdIds { @@ -164,6 +167,13 @@ enum CC : uint8_t { } // namespace CC +namespace param { + +static constexpr uint16_t SEL_MTM = 0x2002; +static constexpr uint16_t INTEGRATION_TIME_SELECT = 0x2003; + +} // namespace param + size_t getReplySize(CC::CC cc, size_t* optSecondSize = nullptr); namespace mode { -- 2.43.0 From 5dcafa1de0e5a9ecb31d393609570b7cb4f7cde0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 3 Apr 2023 10:12:19 +0200 Subject: [PATCH 3/6] lower integration time --- linux/acs/ImtqPollingTask.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/acs/ImtqPollingTask.h b/linux/acs/ImtqPollingTask.h index 378a8e38..8ffe307b 100644 --- a/linux/acs/ImtqPollingTask.h +++ b/linux/acs/ImtqPollingTask.h @@ -36,7 +36,7 @@ class ImtqPollingTask : public SystemObject, address_t i2cAddr = 0; uint32_t currentIntegrationTimeMs = 10; // Required in addition to integration time, otherwise old data might be read. - static constexpr uint32_t MGM_READ_BUFFER_TIME_MS = 4; + static constexpr uint32_t MGM_READ_BUFFER_TIME_MS = 6; bool ignoreNextActuateRequest = false; bool performStartup = false; -- 2.43.0 From 958abadd65e7cb02a49dbbcdae45f729794449c5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 3 Apr 2023 15:16:53 +0200 Subject: [PATCH 4/6] somethings buggy --- CHANGELOG.md | 10 +++++---- linux/acs/ImtqPollingTask.cpp | 4 +++- mission/acs/ImtqHandler.cpp | 40 +++++++++++++++++++++++------------ mission/tcs/HeaterHandler.cpp | 2 +- tmtc | 2 +- 5 files changed, 38 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 918b6534..7d80f83d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ will consitute of a breaking change warranting a new major release: - q7s-package: v2.4.0 +## Added + +- Version of thermal controller which performs basic control tasks. + ## Fixed - PTME was not reset after configuration changes. @@ -26,6 +30,8 @@ will consitute of a breaking change warranting a new major release: - Poll threshold configuration of the PTME IP core is now configurable via a parameter command and is set to 0b010 (4 polls) instead of 0b001 (1 poll) per default. +- EIVE system fallback and COM system fallback: Perform general subsystem handling first, then + event reception, and finally any new transition handling. # [v1.42.0] 2023-04-01 @@ -100,7 +106,6 @@ will consitute of a breaking change warranting a new major release: ## Added -- Version of thermal controller which performs basic control tasks. - The event `MEKF_RECOVERY` will be triggered in case the `MEKF` does manage to recover itself. - The persistent TM stores now have low priorities and behave like background threads now. This should prevent them from blocking or slowing down the system even during dumps @@ -112,8 +117,6 @@ will consitute of a breaking change warranting a new major release: ## Changed -- EIVE system fallback and COM system fallback: Perform general subsystem handling first, then - event reception, and finally any new transition handling. - Rework FSFW OSALs to properly support regular scheduling (NICE priorities) and real-time scheduling. - STR: Move datalink layer to `StrComHandler` completely. DLL is now completely hidden from @@ -137,7 +140,6 @@ will consitute of a breaking change warranting a new major release: - Bugfix for STR: Some action commands wrongfully declined. - STR: No normal command handling while a special request like an image upload is active. - RS485 data line was not enabled when the transmitter was switched on. ->>>>>>> origin/develop # [v1.39.0] 2023-03-21 diff --git a/linux/acs/ImtqPollingTask.cpp b/linux/acs/ImtqPollingTask.cpp index dc2af7dd..efa65735 100644 --- a/linux/acs/ImtqPollingTask.cpp +++ b/linux/acs/ImtqPollingTask.cpp @@ -58,6 +58,7 @@ void ImtqPollingTask::handleMeasureStep() { SerializeAdapter::serialize(&imtq::param::INTEGRATION_TIME_SELECT, cmdBuf.data() + 1, &dummy, cmdBuf.size(), SerializeIF::Endianness::LITTLE); cmdBuf[3] = currentRequest.integrationTimeSel; + cmdLen = 4; ReturnValue_t result = performI2cFullRequest(replyBuf.data(), 5); if (result != returnvalue::OK) { comStatus = imtq::STARTUP_CFG_ERROR; @@ -67,7 +68,7 @@ void ImtqPollingTask::handleMeasureStep() { comStatus = imtq::STARTUP_CFG_ERROR; } if (replyBuf[4] != currentRequest.integrationTimeSel) { - sif::error << "ImtqPollingTask: Integration time confiuration failed" << std::endl; + sif::error << "ImtqPollingTask: Integration time configuration failed" << std::endl; comStatus = imtq::STARTUP_CFG_ERROR; } currentIntegrationTimeMs = @@ -449,6 +450,7 @@ void ImtqPollingTask::clearReadFlagsWithTorque(ImtqRepliesWithTorque& replies) { ReturnValue_t ImtqPollingTask::performI2cFullRequest(uint8_t* reply, size_t replyLen) { int fd = 0; if (cmdLen == 0 or reply == nullptr) { + sif::error << "ImtqPollingTask: Command lenght is zero or reply PTR is invalid" << std::endl; return returnvalue::FAILED; } diff --git a/mission/acs/ImtqHandler.cpp b/mission/acs/ImtqHandler.cpp index e38af787..f1f1bcf6 100644 --- a/mission/acs/ImtqHandler.cpp +++ b/mission/acs/ImtqHandler.cpp @@ -151,19 +151,25 @@ void ImtqHandler::doStartUp() { } void ImtqHandler::doShutDown() { - updatePeriodicReply(false, imtq::cmdIds::REPLY_NO_TORQUE); - updatePeriodicReply(false, imtq::cmdIds::REPLY_WITH_TORQUE); - specialRequestActive = false; - firstReplyCycle = true; - internalState = InternalState::NONE; - commandExecuted = false; - statusSet.setValidity(false, true); - rawMtmNoTorque.setValidity(false, true); - rawMtmWithTorque.setValidity(false, true); - hkDatasetNoTorque.setValidity(false, true); - hkDatasetWithTorque.setValidity(false, true); - calMtmMeasurementSet.setValidity(false, true); - setMode(_MODE_POWER_DOWN); + if (internalState != InternalState::SHUTDOWN) { + commandExecuted = false; + internalState = InternalState::SHUTDOWN; + } + if (internalState == InternalState::SHUTDOWN and commandExecuted) { + updatePeriodicReply(false, imtq::cmdIds::REPLY_NO_TORQUE); + updatePeriodicReply(false, imtq::cmdIds::REPLY_WITH_TORQUE); + specialRequestActive = false; + firstReplyCycle = true; + internalState = InternalState::NONE; + commandExecuted = false; + statusSet.setValidity(false, true); + rawMtmNoTorque.setValidity(false, true); + rawMtmWithTorque.setValidity(false, true); + hkDatasetNoTorque.setValidity(false, true); + hkDatasetWithTorque.setValidity(false, true); + calMtmMeasurementSet.setValidity(false, true); + setMode(_MODE_POWER_DOWN); + } } ReturnValue_t ImtqHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { @@ -243,6 +249,11 @@ ReturnValue_t ImtqHandler::buildCommandFromCommand(DeviceCommandId_t deviceComma // 6 ms integration time instead of 10 ms. request.integrationTimeSel = 2; expectedReply = imtq::cmdIds::REPLY_NO_TORQUE; + if (internalState == InternalState::SHUTDOWN) { + request.mode = acs::SimpleSensorMode::OFF; + } else { + request.mode = acs::SimpleSensorMode::NORMAL; + } rawPacket = reinterpret_cast(&request); rawPacketLen = sizeof(imtq::Request); return returnvalue::OK; @@ -311,6 +322,9 @@ ReturnValue_t ImtqHandler::scanForReply(const uint8_t* start, size_t remainingSi if (getMode() == _MODE_WAIT_OFF or getMode() == _MODE_WAIT_ON or getMode() == _MODE_POWER_DOWN) { return IGNORE_FULL_PACKET; } + if (internalState == InternalState::SHUTDOWN) { + commandExecuted = true; + } if (remainingSize > 0) { *foundLen = remainingSize; *foundId = expectedReply; diff --git a/mission/tcs/HeaterHandler.cpp b/mission/tcs/HeaterHandler.cpp index 529fe698..4ec82c08 100644 --- a/mission/tcs/HeaterHandler.cpp +++ b/mission/tcs/HeaterHandler.cpp @@ -293,7 +293,7 @@ void HeaterHandler::handleSwitchOnCommand(heater::Switchers heaterIdx) { // Just waiting for the main switch being set on return; } else if (mainSwitchState == PowerSwitchIF::SWITCH_OFF or - mainSwitchState == PowerSwitchIF::SWITCH_UNKNOWN) { + mainSwitchState == PowerSwitchIF::SWITCH_UNKNOWN) { mainLineSwitcher->sendSwitchCommand(mainLineSwitch, PowerSwitchIF::SWITCH_ON); heater.mainSwitchCountdown.setTimeout(mainLineSwitcher->getSwitchDelayMs()); heater.waitMainSwitchOn = true; diff --git a/tmtc b/tmtc index cef8d623..b72dad49 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit cef8d623c9fa11237fc8e51e5fd4dab750a5602b +Subproject commit b72dad49a9c05a37c094a22d5fdaa15643b5ca7f -- 2.43.0 From 8585114041a3b46d9a94040414b26910fd167c0d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 3 Apr 2023 15:27:06 +0200 Subject: [PATCH 5/6] missing state check --- mission/acs/ImtqHandler.cpp | 2 +- mission/controller/ThermalController.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mission/acs/ImtqHandler.cpp b/mission/acs/ImtqHandler.cpp index f1f1bcf6..f3d04a36 100644 --- a/mission/acs/ImtqHandler.cpp +++ b/mission/acs/ImtqHandler.cpp @@ -196,7 +196,7 @@ ReturnValue_t ImtqHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { } ReturnValue_t ImtqHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { - if (internalState == InternalState::STARTUP) { + if (internalState == InternalState::STARTUP or internalState == InternalState::SHUTDOWN) { *id = imtq::cmdIds::REQUEST; return buildCommandFromCommand(*id, nullptr, 0); } diff --git a/mission/controller/ThermalController.cpp b/mission/controller/ThermalController.cpp index fcbdcc6e..40732968 100644 --- a/mission/controller/ThermalController.cpp +++ b/mission/controller/ThermalController.cpp @@ -129,7 +129,7 @@ void ThermalController::performControlOperation() { hpaLimits.opUpperLimit = 0; hpaLimits.nopUpperLimit = 0; #endif - if(changedLimits) { + if (changedLimits) { sif::debug << "ThermalController: changing limits" << std::endl; // TODO: rausschmeissen } } -- 2.43.0 From 99eae0df51485e1197b52f3fd533e8782583bcc4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 3 Apr 2023 15:31:46 +0200 Subject: [PATCH 6/6] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d80f83d..9830c767 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ will consitute of a breaking change warranting a new major release: and is set to 0b010 (4 polls) instead of 0b001 (1 poll) per default. - EIVE system fallback and COM system fallback: Perform general subsystem handling first, then event reception, and finally any new transition handling. +- IMTQ MGM integration time lowered to 6 ms. This relaxes scheduling requirements a bit. # [v1.42.0] 2023-04-01 -- 2.43.0