diff --git a/CHANGELOG.md b/CHANGELOG.md index 426b41ca..197daafd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,11 +30,18 @@ will consitute of a breaking change warranting a new major release: - Important bugfix for STR solution set. - Fix for STR image download. - Possible fix for STR image upload. +- Fixed regression where the reply result for ACS board and SUS board devices was set to FAILED + even when going to OFF mode. In that case, it has to be set to OK so the device handler can + complete the OFF transition. ## Changed - STR `wire` library updated to v10.3. Submodule renamed to `sagittactl`. +## Changed + +- Reject `NEEDS_RECOVERY` health commands for the heater health devices. + ## Added - Add a way for the MAX31865 RTD handlers to recognize faulty/broken/off sensor devices. diff --git a/linux/acs/AcsBoardPolling.cpp b/linux/acs/AcsBoardPolling.cpp index bc3dff74..e525bf53 100644 --- a/linux/acs/AcsBoardPolling.cpp +++ b/linux/acs/AcsBoardPolling.cpp @@ -122,13 +122,14 @@ ReturnValue_t AcsBoardPolling::sendMessage(CookieIF* cookie, const uint8_t* send } else { sif::warning << "AcsBoardPolling: Unknown ADIS type" << std::endl; } + adis.replyResult = returnvalue::FAILED; adis.performStartup = true; } else if (req->mode == acs::SimpleSensorMode::OFF) { adis.performStartup = false; adis.ownReply.cfgWasSet = false; adis.ownReply.dataWasSet = false; + adis.replyResult = returnvalue::OK; } - adis.replyResult = returnvalue::FAILED; adis.mode = req->mode; } return returnvalue::OK; @@ -144,10 +145,11 @@ ReturnValue_t AcsBoardPolling::sendMessage(CookieIF* cookie, const uint8_t* send if (req->mode == acs::SimpleSensorMode::NORMAL) { std::memcpy(gyro.sensorCfg, req->ctrlRegs, 5); gyro.performStartup = true; + gyro.replyResult = returnvalue::FAILED; } else { gyro.ownReply.cfgWasSet = false; + gyro.replyResult = returnvalue::OK; } - gyro.replyResult = returnvalue::FAILED; gyro.mode = req->mode; } return returnvalue::OK; @@ -162,11 +164,12 @@ ReturnValue_t AcsBoardPolling::sendMessage(CookieIF* cookie, const uint8_t* send if (req->mode != mgm.mode) { if (req->mode == acs::SimpleSensorMode::NORMAL) { mgm.performStartup = true; + mgm.replyResult = returnvalue::FAILED; } else { mgm.ownReply.dataWasSet = false; + mgm.replyResult = returnvalue::OK; mgm.ownReply.temperatureWasSet = false; } - mgm.replyResult = returnvalue::FAILED; mgm.mode = req->mode; } return returnvalue::OK; @@ -181,10 +184,11 @@ ReturnValue_t AcsBoardPolling::sendMessage(CookieIF* cookie, const uint8_t* send if (req->mode != mgm.mode) { if (req->mode == acs::SimpleSensorMode::NORMAL) { mgm.performStartup = true; + mgm.replyResult = returnvalue::FAILED; } else { mgm.ownReply.dataWasRead = false; + mgm.replyResult = returnvalue::OK; } - mgm.replyResult = returnvalue::FAILED; mgm.mode = req->mode; } return returnvalue::OK; diff --git a/linux/acs/SusPolling.cpp b/linux/acs/SusPolling.cpp index 1da5ef5e..2ef02f43 100644 --- a/linux/acs/SusPolling.cpp +++ b/linux/acs/SusPolling.cpp @@ -69,11 +69,13 @@ ReturnValue_t SusPolling::sendMessage(CookieIF* cookie, const uint8_t* sendData, if (susDevs[susIdx].mode != susReq->mode) { if (susReq->mode == acs::SimpleSensorMode::NORMAL) { susDevs[susIdx].performStartup = true; + susDevs[susIdx].replyResult = returnvalue::FAILED; } else { susDevs[susIdx].ownReply.cfgWasSet = false; susDevs[susIdx].ownReply.dataWasSet = false; + // We are off now, but DHB wants a proper reply. + susDevs[susIdx].replyResult = returnvalue::OK; } - susDevs[susIdx].replyResult = returnvalue::FAILED; susDevs[susIdx].mode = susReq->mode; } if (state == InternalState::IDLE) { diff --git a/mission/genericFactory.cpp b/mission/genericFactory.cpp index 9889fe9e..b0b8e8f5 100644 --- a/mission/genericFactory.cpp +++ b/mission/genericFactory.cpp @@ -287,15 +287,17 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_, PusTmFun void ObjectFactory::createGenericHeaterComponents(GpioIF& gpioIF, PowerSwitchIF& pwrSwitcher, HeaterHandler*& heaterHandler) { HeaterHelper helper({{ - {new HealthDevice(objects::HEATER_0_PLOC_PROC_BRD, MessageQueueIF::NO_QUEUE), + {new HeaterHealthDev(objects::HEATER_0_PLOC_PROC_BRD, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_0}, - {new HealthDevice(objects::HEATER_1_PCDU_BRD, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_1}, - {new HealthDevice(objects::HEATER_2_ACS_BRD, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_2}, - {new HealthDevice(objects::HEATER_3_OBC_BRD, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_3}, - {new HealthDevice(objects::HEATER_4_CAMERA, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_4}, - {new HealthDevice(objects::HEATER_5_STR, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_5}, - {new HealthDevice(objects::HEATER_6_DRO, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_6}, - {new HealthDevice(objects::HEATER_7_SYRLINKS, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_7}, + {new HeaterHealthDev(objects::HEATER_1_PCDU_BRD, MessageQueueIF::NO_QUEUE), + gpioIds::HEATER_1}, + {new HeaterHealthDev(objects::HEATER_2_ACS_BRD, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_2}, + {new HeaterHealthDev(objects::HEATER_3_OBC_BRD, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_3}, + {new HeaterHealthDev(objects::HEATER_4_CAMERA, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_4}, + {new HeaterHealthDev(objects::HEATER_5_STR, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_5}, + {new HeaterHealthDev(objects::HEATER_6_DRO, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_6}, + {new HeaterHealthDev(objects::HEATER_7_SYRLINKS, MessageQueueIF::NO_QUEUE), + gpioIds::HEATER_7}, }}); heaterHandler = new HeaterHandler(objects::HEATER_HANDLER, &gpioIF, helper, &pwrSwitcher, power::Switches::PDU2_CH3_TCS_BOARD_HEATER_IN_8V); diff --git a/mission/tcs/CMakeLists.txt b/mission/tcs/CMakeLists.txt index ea077050..c23e9c18 100644 --- a/mission/tcs/CMakeLists.txt +++ b/mission/tcs/CMakeLists.txt @@ -1,3 +1,4 @@ target_sources( - ${LIB_EIVE_MISSION} PRIVATE HeaterHandler.cpp max1227.cpp - Max31865EiveHandler.cpp Tmp1075Handler.cpp) + ${LIB_EIVE_MISSION} + PRIVATE HeaterHandler.cpp max1227.cpp Max31865EiveHandler.cpp + Tmp1075Handler.cpp HeaterHealthDev.cpp) diff --git a/mission/tcs/HeaterHandler.h b/mission/tcs/HeaterHandler.h index c3ea4afa..609ac725 100644 --- a/mission/tcs/HeaterHandler.h +++ b/mission/tcs/HeaterHandler.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -27,7 +28,7 @@ class PowerSwitchIF; class HealthTableIF; -using HeaterPair = std::pair; +using HeaterPair = std::pair; struct HeaterHelper { public: diff --git a/mission/tcs/HeaterHealthDev.cpp b/mission/tcs/HeaterHealthDev.cpp new file mode 100644 index 00000000..6be56a09 --- /dev/null +++ b/mission/tcs/HeaterHealthDev.cpp @@ -0,0 +1,12 @@ +#include "HeaterHealthDev.h" + +HeaterHealthDev::HeaterHealthDev(object_id_t setObjectId, MessageQueueId_t parentQueue) + : HealthDevice(setObjectId, parentQueue) {} + +ReturnValue_t HeaterHealthDev::setHealth(HealthState health) { + // Does not make sense for a simple heater. + if (health == HealthState::NEEDS_RECOVERY) { + return returnvalue::FAILED; + } + return HealthDevice::setHealth(health); +} diff --git a/mission/tcs/HeaterHealthDev.h b/mission/tcs/HeaterHealthDev.h new file mode 100644 index 00000000..8d15836c --- /dev/null +++ b/mission/tcs/HeaterHealthDev.h @@ -0,0 +1,12 @@ +#ifndef MISSION_TCS_HEATERHEALTHDEV_H_ +#define MISSION_TCS_HEATERHEALTHDEV_H_ +#include + +class HeaterHealthDev : public HealthDevice { + public: + HeaterHealthDev(object_id_t setObjectId, MessageQueueId_t parentQueue); + + ReturnValue_t setHealth(HealthState health) override; +}; + +#endif /* MISSION_TCS_HEATERHEALTHDEV_H_ */