diff --git a/.idea/cmake.xml b/.idea/cmake.xml
index 3be3a2b0..f890b357 100644
--- a/.idea/cmake.xml
+++ b/.idea/cmake.xml
@@ -10,6 +10,7 @@
+
\ No newline at end of file
diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp
index 702264ab..085d27de 100644
--- a/bsp_q7s/core/CoreController.cpp
+++ b/bsp_q7s/core/CoreController.cpp
@@ -32,8 +32,13 @@ xsc::Chip CoreController::CURRENT_CHIP = xsc::Chip::NO_CHIP;
xsc::Copy CoreController::CURRENT_COPY = xsc::Copy::NO_COPY;
CoreController::CoreController(object_id_t objectId)
- : ExtendedControllerBase(objectId, 5), cmdExecutor(4096), cmdReplyBuf(4096, true), cmdRepliesSizes(128),
- opDivider5(5), opDivider10(10), hkSet(this) {
+ : ExtendedControllerBase(objectId, 5),
+ cmdExecutor(4096),
+ cmdReplyBuf(4096, true),
+ cmdRepliesSizes(128),
+ opDivider5(5),
+ opDivider10(10),
+ hkSet(this) {
cmdExecutor.setRingBuffer(&cmdReplyBuf, &cmdRepliesSizes);
try {
sdcMan = SdCardManager::instance();
@@ -102,14 +107,14 @@ void CoreController::performControlOperation() {
sdStateMachine();
performMountedSdCardOperations();
readHkData();
- if(shellCmdIsExecuting) {
+ if (shellCmdIsExecuting) {
bool replyReceived = false;
// TODO: We could read the data in the ring buffer and send it as an action data reply.
- if(cmdExecutor.check(replyReceived) == CommandExecutor::EXECUTION_FINISHED) {
+ if (cmdExecutor.check(replyReceived) == CommandExecutor::EXECUTION_FINISHED) {
actionHelper.finish(true, successRecipient, EXECUTE_SHELL_CMD);
shellCmdIsExecuting = false;
cmdReplyBuf.clear();
- while(not cmdRepliesSizes.empty()) {
+ while (not cmdRepliesSizes.empty()) {
cmdRepliesSizes.pop();
}
successRecipient = MessageQueueIF::NO_QUEUE;
@@ -316,14 +321,15 @@ ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_
// Warning: This function will never return, because it reboots the system
return actionReboot(data, size);
}
- case(EXECUTE_SHELL_CMD): {
+ case (EXECUTE_SHELL_CMD): {
std::string cmd = std::string(cmd, size);
- if(cmdExecutor.getCurrentState() == CommandExecutor::States::PENDING or shellCmdIsExecuting) {
+ if (cmdExecutor.getCurrentState() == CommandExecutor::States::PENDING or
+ shellCmdIsExecuting) {
return HasActionsIF::IS_BUSY;
}
cmdExecutor.load(cmd, false, false);
ReturnValue_t result = cmdExecutor.execute();
- if(result != returnvalue::OK) {
+ if (result != returnvalue::OK) {
return result;
}
shellCmdIsExecuting = true;
diff --git a/mission/controller/ThermalController.cpp b/mission/controller/ThermalController.cpp
index 7703b8ab..0c8f9c3d 100644
--- a/mission/controller/ThermalController.cpp
+++ b/mission/controller/ThermalController.cpp
@@ -1,6 +1,7 @@
#include "ThermalController.h"
#include
+#include
#include
#include
#include
@@ -14,7 +15,6 @@
#include
#include
#include
-#include
ThermalController::ThermalController(object_id_t objectId, HeaterHandler& heater)
: ExtendedControllerBase(objectId),
@@ -65,8 +65,12 @@ ThermalController::ThermalController(object_id_t objectId, HeaterHandler& heater
}
ReturnValue_t ThermalController::initialize() {
- auto result = ExtendedControllerBase::initialize();
- return result;
+ auto* camSwitcher = ObjectManager::instance()->get(objects::CAM_SWITCHER);
+ if (camSwitcher == nullptr) {
+ return ObjectManagerIF::CHILD_INIT_FAILED;
+ }
+ camId = camSwitcher->getCommandQueue();
+ return ExtendedControllerBase::initialize();
}
ReturnValue_t ThermalController::handleCommandMessage(CommandMessage* message) {
@@ -992,7 +996,8 @@ void ThermalController::ctrlAcsBoard() {
if (chooseHeater(switchNr, redSwitchNr)) {
if (heaterHandler.checkSwitchState(switchNr)) {
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
- sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl;
+ sif::info << "ThermalController::ctrlHeater: Heater" << static_cast(thermalComponent)
+ << " OFF" << std::endl;
}
}
}
@@ -1082,9 +1087,7 @@ void ThermalController::ctrlStr() {
sensors[2].second = sensorTemperatures.sensor_dro.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_5_STR, heater::HEATER_6_DRO, strLimits);
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::STAR_TRACKER, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
- }
+ tooHotHandler(objects::STAR_TRACKER, strTooHotFlag);
}
void ThermalController::ctrlIfBoard() {
@@ -1121,8 +1124,11 @@ void ThermalController::ctrlObc() {
sensors[2].second = sensorTemperatures.tmp1075Tcs0.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD, obcLimits);
- if (componentAboveCutOffLimit) {
- triggerEvent(OBC_OVERHEATING);
+ if (componentAboveUpperLimit and not obcTooHotFlag) {
+ triggerEvent(tcsCtrl::OBC_OVERHEATING);
+ obcTooHotFlag = true;
+ } else if (not componentAboveUpperLimit) {
+ obcTooHotFlag = false;
}
}
@@ -1136,6 +1142,12 @@ void ThermalController::ctrlObcIfBoard() {
sensors[2].second = sensorTemperatures.tmp1075Tcs1.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD, obcIfBoardLimits);
+ if (componentAboveUpperLimit and not obcTooHotFlag) {
+ triggerEvent(tcsCtrl::OBC_OVERHEATING);
+ obcTooHotFlag = true;
+ } else if (not componentAboveUpperLimit) {
+ obcTooHotFlag = false;
+ }
}
void ThermalController::ctrlSBandTransceiver() {
@@ -1149,13 +1161,12 @@ void ThermalController::ctrlSBandTransceiver() {
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_7_S_BAND, heater::HEATER_4_CAMERA,
sBandTransceiverLimits);
- if (componentAboveCutOffLimit) {
- float sensorTempAsFloat = sensorTemp;
-
- SerializeIF::serialize()
- triggerEvent(SYRLINKS_OVERHEATING, static_cast(sensorTemp)); //TODO: TEMP mitgeben
+ if (componentAboveUpperLimit and not syrlinksTooHotFlag) {
+ triggerEvent(tcsCtrl::SYRLINKS_OVERHEATING, tempFloatToU32());
+ syrlinksTooHotFlag = true;
+ } else if (not componentAboveUpperLimit) {
+ pcduSystemTooHotFlag = false;
}
-
}
void ThermalController::ctrlPcduP60Board() {
thermalComponent = PCDUP60_BOARD;
@@ -1165,6 +1176,12 @@ void ThermalController::ctrlPcduP60Board() {
sensors[1].second = deviceTemperatures.temp2P60dock.value;
numSensors = 2;
ctrlComponentTemperature(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD, pcduP60BoardLimits);
+ if (componentAboveUpperLimit and not pcduSystemTooHotFlag) {
+ triggerEvent(tcsCtrl::PCDU_SYSTEM_OVERHEATING, tempFloatToU32());
+ pcduSystemTooHotFlag = true;
+ } else if (not componentAboveUpperLimit) {
+ pcduSystemTooHotFlag = false;
+ }
}
void ThermalController::ctrlPcduAcu() {
@@ -1175,8 +1192,7 @@ void ThermalController::ctrlPcduAcu() {
if (chooseHeater(switchNr, redSwitchNr)) {
bool sensorTempAvailable = true;
- if (deviceTemperatures.acu.value[0] !=
- INVALID_TEMPERATURE) {
+ if (deviceTemperatures.acu.value[0] != INVALID_TEMPERATURE) {
sensorTemp = deviceTemperatures.acu.value[0];
} else if (deviceTemperatures.acu.value[1] != INVALID_TEMPERATURE) {
sensorTemp = deviceTemperatures.acu.value[1];
@@ -1185,15 +1201,18 @@ void ThermalController::ctrlPcduAcu() {
} else if (sensorTemperatures.sensor_acu.isValid()) {
sensorTemp = sensorTemperatures.sensor_acu.value;
} else {
- triggerEvent(NO_VALID_SENSOR_TEMPERATURE, thermalComponent);
+ triggerEvent(tcsCtrl::NO_VALID_SENSOR_TEMPERATURE, thermalComponent);
sensorTempAvailable = false;
}
if (sensorTempAvailable) {
ctrlHeater(switchNr, redSwitchNr, pcduAcuLimits);
}
}
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::PCDU_HANDLER, ThermalComponentIF::COMPONENT_TEMP_HIGH);
+ if (componentAboveUpperLimit and not pcduSystemTooHotFlag) {
+ triggerEvent(tcsCtrl::PCDU_SYSTEM_OVERHEATING, tempFloatToU32());
+ pcduSystemTooHotFlag = true;
+ } else if (not componentAboveUpperLimit) {
+ pcduSystemTooHotFlag = false;
}
}
@@ -1207,10 +1226,11 @@ void ThermalController::ctrlPcduPdu() {
sensors[2].second = sensorTemperatures.tmp1075Tcs0.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD, pcduPduLimits);
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::PCDU_HANDLER, ThermalComponentIF::COMPONENT_TEMP_HIGH);
- }else if(componentAboveOpUpperLimit){ //TODO: NOp bool
- EventManagerIF::triggerEvent(objects::PCDU_HANDLER, ThermalComponentIF::COMPONENT_TEMP_HIGH);
+ if (componentAboveUpperLimit and not pcduSystemTooHotFlag) {
+ triggerEvent(tcsCtrl::PCDU_SYSTEM_OVERHEATING, tempFloatToU32());
+ pcduSystemTooHotFlag = true;
+ } else if (not componentAboveUpperLimit) {
+ pcduSystemTooHotFlag = false;
}
}
@@ -1226,9 +1246,7 @@ void ThermalController::ctrlPlPcduBoard() {
sensors[3].second = sensorTemperatures.sensor_plpcdu_heatspreader.value;
numSensors = 4;
ctrlComponentTemperature(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD, plPcduBoardLimits);
- if (componentAboveCutOffLimit) {
- triggerEvent(PLPCDU_OVERHEATING);
- }
+ tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag);
}
void ThermalController::ctrlPlocMissionBoard() {
@@ -1242,12 +1260,7 @@ void ThermalController::ctrlPlocMissionBoard() {
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_1_PLOC_PROC_BRD, heater::HEATER_0_OBC_BRD,
plocMissionBoardLimits);
- if (componentAboveCutOffLimit) {
- triggerEvent(PLOC_OVERHEATING);
- }
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::PLOC_MPSOC_HANDLER, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
- }
+ tooHotHandler(objects::PLOC_MPSOC_HANDLER, plocTooHotFlag);
}
void ThermalController::ctrlPlocProcessingBoard() {
@@ -1261,9 +1274,7 @@ void ThermalController::ctrlPlocProcessingBoard() {
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_1_PLOC_PROC_BRD, heater::HEATER_0_OBC_BRD,
plocProcessingBoardLimits);
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::PLOC_MPSOC_HANDLER, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
- }
+ tooHotHandler(objects::PLOC_MPSOC_HANDLER, plocTooHotFlag);
}
void ThermalController::ctrlDac() {
@@ -1276,9 +1287,7 @@ void ThermalController::ctrlDac() {
sensors[2].second = sensorTemperatures.sensor_ploc_heatspreader.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_1_PLOC_PROC_BRD, heater::HEATER_0_OBC_BRD, dacLimits);
- if (componentAboveOpUpperLimit){
- //EventManagerIF::triggerEvent(objects::, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
- }
+ tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag);
}
void ThermalController::ctrlCameraBody() {
@@ -1291,9 +1300,19 @@ void ThermalController::ctrlCameraBody() {
sensors[2].second = sensorTemperatures.sensor_mpa.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_4_CAMERA, heater::HEATER_6_DRO, cameraLimits);
-// if (componentAboveOpUpperLimit){
-// EventManagerIF::triggerEvent(objects::, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
-// }
+ if (componentAboveUpperLimit and not camTooHotOneShotFlag) {
+ triggerEvent(tcsCtrl::CAMERA_OVERHEATING, tempFloatToU32());
+ CommandMessage msg;
+ HealthMessage::setHealthMessage(&msg, HealthMessage::HEALTH_SET, HealthState::FAULTY);
+ ReturnValue_t result = commandQueue->sendMessage(camId, &msg);
+ if (result != returnvalue::OK) {
+ sif::error << "ThermalController::ctrlCameraBody(): Sending health message failed"
+ << std::endl;
+ }
+ camTooHotOneShotFlag = true;
+ } else if (not componentAboveUpperLimit) {
+ camTooHotOneShotFlag = false;
+ }
}
void ThermalController::ctrlDro() {
@@ -1306,9 +1325,7 @@ void ThermalController::ctrlDro() {
sensors[2].second = sensorTemperatures.sensor_mpa.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, droLimits);
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::PLPCDU_HANDLER, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
- }
+ tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag);
}
void ThermalController::ctrlX8() {
@@ -1321,9 +1338,7 @@ void ThermalController::ctrlX8() {
sensors[2].second = sensorTemperatures.sensor_tx_modul.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, x8Limits);
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::PLPCDU_HANDLER, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
- }
+ tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag);
}
void ThermalController::ctrlTx() {
@@ -1336,9 +1351,7 @@ void ThermalController::ctrlTx() {
sensors[2].second = sensorTemperatures.sensor_mpa.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, txLimits);
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::PLPCDU_HANDLER, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
- }
+ tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag);
}
void ThermalController::ctrlMpa() {
@@ -1351,9 +1364,7 @@ void ThermalController::ctrlMpa() {
sensors[2].second = sensorTemperatures.sensor_tx_modul.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, mpaLimits);
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::PLPCDU_HANDLER, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
- }
+ tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag);
}
void ThermalController::ctrlHpa() {
@@ -1366,12 +1377,7 @@ void ThermalController::ctrlHpa() {
sensors[2].second = sensorTemperatures.sensor_mpa.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, hpaLimits);
- if (componentAboveCutOffLimit) {
- triggerEvent(HPA_OVERHEATING);
- }
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::PLPCDU_HANDLER, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
- }
+ tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag);
}
void ThermalController::ctrlScexBoard() {
@@ -1384,9 +1390,7 @@ void ThermalController::ctrlScexBoard() {
sensors[2].second = sensorTemperatures.sensor_hpa.value;
numSensors = 3;
ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_5_STR, scexBoardLimits);
- if (componentAboveOpUpperLimit){
- EventManagerIF::triggerEvent(objects::SCEX, ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH);
- }
+ tooHotHandler(objects::SCEX, scexTooHotFlag);
}
void ThermalController::performThermalModuleCtrl() {
@@ -1427,7 +1431,8 @@ void ThermalController::ctrlComponentTemperature(heater::Switchers switchNr,
redSwitchNr)) { // TODO: muss der Heater dann wirklich abgeschalten werden?
if (heaterHandler.checkSwitchState(switchNr)) {
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
- sif::info << "ThermalController::ctrlHeater: Heater" << static_cast(switchNr) << " OFF" << std::endl; // TODO: printouts löschen
+ sif::info << "ThermalController::ctrlHeater: Heater" << static_cast(switchNr)
+ << " OFF" << std::endl; // TODO: printouts löschen
}
}
}
@@ -1445,11 +1450,11 @@ bool ThermalController::selectAndReadSensorTemp() {
thermalStates[thermalComponent].errorCounter++;
if (thermalComponent != RW and thermalComponent != ACS_BOARD) {
if (thermalStates[thermalComponent].errorCounter <= 3) {
- triggerEvent(NO_VALID_SENSOR_TEMPERATURE, thermalComponent);
+ triggerEvent(tcsCtrl::NO_VALID_SENSOR_TEMPERATURE, thermalComponent);
}
} else {
if (thermalStates[thermalComponent].errorCounter <= 8) {
- triggerEvent(NO_VALID_SENSOR_TEMPERATURE, thermalComponent);
+ triggerEvent(tcsCtrl::NO_VALID_SENSOR_TEMPERATURE, thermalComponent);
}
}
@@ -1464,7 +1469,7 @@ bool ThermalController::chooseHeater(heater::Switchers& switchNr, heater::Switch
redSwitchNrInUse = true;
} else {
heaterAvailable = false;
- triggerEvent(NO_HEALTHY_HEATER_AVAILABLE, switchNr, redSwitchNr);
+ triggerEvent(tcsCtrl::NO_HEALTHY_HEATER_AVAILABLE, switchNr, redSwitchNr);
}
} else {
redSwitchNrInUse = false;
@@ -1474,17 +1479,16 @@ bool ThermalController::chooseHeater(heater::Switchers& switchNr, heater::Switch
void ThermalController::ctrlHeater(heater::Switchers switchNr, heater::Switchers redSwitchNr,
struct TempLimits& tempLimit) {
componentAboveCutOffLimit = false;
- componentAboveOpUpperLimit = false;
+ componentAboveUpperLimit = false;
// if Heater off
if (not heaterStates[switchNr].switchTransition) {
if (not heaterHandler.checkSwitchState(switchNr)) {
if (sensorTemp < tempLimit.opLowerLimit) {
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::ON);
- sif::info << "ThermalController::ctrlHeater: Heater " << static_cast(thermalComponent) << " ON"
- << std::endl;
+ sif::info << "ThermalController::ctrlHeater: Heater " << static_cast(thermalComponent)
+ << " ON" << std::endl;
heaterStates[switchNr].switchTransition = true;
thermalStates[thermalComponent].heating = true;
- // TODO: EVENT; aber heaterHandler erstellt schon event
} else {
thermalStates[thermalComponent].heating = false;
}
@@ -1494,36 +1498,34 @@ void ThermalController::ctrlHeater(heater::Switchers switchNr, heater::Switchers
if (thermalStates[thermalComponent].heating) {
if (sensorTemp >= tempLimit.opLowerLimit + TEMP_OFFSET) {
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
- sif::info << "ThermalController::ctrlHeater: Heater " << static_cast(thermalComponent) << " OFF"
- << std::endl;
+ sif::info << "ThermalController::ctrlHeater: Heater "
+ << static_cast(thermalComponent) << " OFF" << std::endl;
heaterStates[switchNr].switchTransition = true;
thermalStates[thermalComponent].heating = false;
}
} else {
- // TODO: if >= opLimit -> Event; nicht für syrlinks
- if (sensorTemp >= tempLimit.opUpperLimit) {
- componentAboveOpUpperLimit = true;
+ auto tempTooHighHandler = [&](const char* whatLimit) {
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
- sif::info << "ThermalController::ctrlHeater: Reached CutOffLimit: Heater "
- << static_cast(thermalComponent) << " OFF" << std::endl;
+ sif::info << "ThermalController::ctrlHeater: Reached " << whatLimit << ": Heater "
+ << static_cast(thermalComponent) << " OFF" << std::endl;
heaterStates[switchNr].switchTransition = true;
if (heaterHandler.checkSwitchState(redSwitchNr)) {
heaterHandler.switchHeater(redSwitchNr, HeaterHandler::SwitchState::OFF);
heaterStates[redSwitchNr].switchTransition = true;
}
+ };
+ if (sensorTemp >= tempLimit.nopUpperLimit) {
+ componentAboveUpperLimit = true;
+ tempTooHighHandler("NOP-Limit");
+ overHeatEventToTrigger = ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH;
+ } else if (sensorTemp >= tempLimit.opUpperLimit) {
+ componentAboveUpperLimit = true;
+ tempTooHighHandler("OP-Limit");
+ overHeatEventToTrigger = ThermalComponentIF::COMPONENT_TEMP_HIGH;
}
if (sensorTemp >= tempLimit.cutOffLimit) {
componentAboveCutOffLimit = true;
- heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
- sif::info << "ThermalController::ctrlHeater: Reached CutOffLimit: Heater "
- << thermalComponent << " OFF" << std::endl;
- heaterStates[switchNr].switchTransition = true;
- if (heaterHandler.checkSwitchState(redSwitchNr)) {
- heaterHandler.switchHeater(redSwitchNr, HeaterHandler::SwitchState::OFF);
- sif::info << "ThermalController::ctrlHeater: Reached CutOffLimit: RedundantHeater "
- << thermalComponent << " OFF" << std::endl;
- heaterStates[redSwitchNr].switchTransition = true;
- }
+ tempTooHighHandler("CutOff-Limit");
}
}
}
@@ -1548,3 +1550,19 @@ void ThermalController::heaterTransitionControl() {
}
}
}
+uint32_t ThermalController::tempFloatToU32() {
+ auto sensorTempAsFloat = static_cast(sensorTemp);
+ uint32_t tempRaw = 0;
+ size_t dummyLen = 0;
+ SerializeAdapter::serialize(&sensorTempAsFloat, reinterpret_cast(&tempRaw), &dummyLen,
+ sizeof(tempRaw), SerializeIF::Endianness::NETWORK);
+ return tempRaw;
+}
+void ThermalController::tooHotHandler(object_id_t object, bool& oneShotFlag) {
+ if (componentAboveUpperLimit and not oneShotFlag) {
+ EventManagerIF::triggerEvent(object, overHeatEventToTrigger, tempFloatToU32());
+ oneShotFlag = true;
+ } else if (not componentAboveUpperLimit) {
+ oneShotFlag = false;
+ }
+}
diff --git a/mission/controller/ThermalController.h b/mission/controller/ThermalController.h
index 7adaa2d3..3da82c22 100644
--- a/mission/controller/ThermalController.h
+++ b/mission/controller/ThermalController.h
@@ -4,7 +4,7 @@
#include
#include
#include
-#include
+#include
#include
#include
#include
@@ -97,15 +97,6 @@ class ThermalController : public ExtendedControllerBase {
uint32_t* msToReachTheMode) override;
private:
- static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::TCS_CONTROLLER;
- static constexpr Event NO_VALID_SENSOR_TEMPERATURE = MAKE_EVENT(0, severity::MEDIUM);
- static constexpr Event NO_HEALTHY_HEATER_AVAILABLE = MAKE_EVENT(1, severity::MEDIUM);
- static constexpr Event SYRLINKS_OVERHEATING = MAKE_EVENT(2, severity::HIGH);
- static constexpr Event PLOC_OVERHEATING = MAKE_EVENT(3, severity::HIGH);
- static constexpr Event OBC_OVERHEATING = MAKE_EVENT(4, severity::HIGH);
- static constexpr Event HPA_OVERHEATING = MAKE_EVENT(5, severity::HIGH);
- static constexpr Event PLPCDU_OVERHEATING = MAKE_EVENT(6, severity::HIGH);
-
static const uint32_t DELAY = 500;
static const uint32_t TEMP_OFFSET = 5;
@@ -192,8 +183,18 @@ class ThermalController : public ExtendedControllerBase {
double sensorTemp = INVALID_TEMPERATURE;
ThermalComponents thermalComponent = NONE;
bool redSwitchNrInUse = false;
+ MessageQueueId_t camId = MessageQueueIF::NO_QUEUE;
bool componentAboveCutOffLimit = false;
- bool componentAboveOpUpperLimit = false;
+ bool componentAboveUpperLimit = false;
+ Event overHeatEventToTrigger;
+ bool eBandTooHotFlag = false;
+ bool camTooHotOneShotFlag = false;
+ bool scexTooHotFlag = false;
+ bool plocTooHotFlag = false;
+ bool pcduSystemTooHotFlag = false;
+ bool syrlinksTooHotFlag = false;
+ bool obcTooHotFlag = false;
+ bool strTooHotFlag = false;
std::array thermalStates{};
std::array heaterStates{};
@@ -252,6 +253,8 @@ class ThermalController : public ExtendedControllerBase {
void ctrlMpa();
void ctrlScexBoard();
void heaterTransitionControl();
+ uint32_t tempFloatToU32();
+ void tooHotHandler(object_id_t object, bool& oneShotFlag);
};
#endif /* MISSION_CONTROLLER_THERMALCONTROLLER_H_ */
diff --git a/mission/controller/acs/ActuatorCmd.cpp b/mission/controller/acs/ActuatorCmd.cpp
index 457cacce..d2fe2d65 100644
--- a/mission/controller/acs/ActuatorCmd.cpp
+++ b/mission/controller/acs/ActuatorCmd.cpp
@@ -49,7 +49,7 @@ void ActuatorCmd::cmdSpeedToRws(int32_t speedRw0, int32_t speedRw1, int32_t spee
} else if (rwCmdSpeed[i] < -maxRwSpeed) {
rwCmdSpeed[i] = -maxRwSpeed;
}
- }
+ }
}
void ActuatorCmd::cmdDipolMtq(const double *dipolMoment, int16_t *dipolMomentActuator,
diff --git a/mission/controller/controllerdefinitions/ThermalControllerDefinitions.h b/mission/controller/controllerdefinitions/tcsCtrlDefs.h
similarity index 88%
rename from mission/controller/controllerdefinitions/ThermalControllerDefinitions.h
rename to mission/controller/controllerdefinitions/tcsCtrlDefs.h
index e7c95218..aa1fb4a1 100644
--- a/mission/controller/controllerdefinitions/ThermalControllerDefinitions.h
+++ b/mission/controller/controllerdefinitions/tcsCtrlDefs.h
@@ -5,9 +5,19 @@
#include
#include "devices/heaterSwitcherList.h"
+#include "eive/eventSubsystemIds.h"
namespace tcsCtrl {
+static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::TCS_CONTROLLER;
+static constexpr Event NO_VALID_SENSOR_TEMPERATURE = MAKE_EVENT(0, severity::MEDIUM);
+static constexpr Event NO_HEALTHY_HEATER_AVAILABLE = MAKE_EVENT(1, severity::MEDIUM);
+static constexpr Event SYRLINKS_OVERHEATING = MAKE_EVENT(2, severity::HIGH);
+static constexpr Event PLOC_OVERHEATING = MAKE_EVENT(3, severity::HIGH);
+static constexpr Event OBC_OVERHEATING = MAKE_EVENT(4, severity::HIGH);
+static constexpr Event CAMERA_OVERHEATING = MAKE_EVENT(5, severity::HIGH);
+static constexpr Event PCDU_SYSTEM_OVERHEATING = MAKE_EVENT(6, severity::HIGH);
+
enum SetId : uint32_t {
SENSOR_TEMPERATURES = 0,
DEVICE_TEMPERATURES = 1,
@@ -93,9 +103,10 @@ static const uint8_t ENTRIES_SUS_TEMPERATURE_SET = 12;
*/
class SensorTemperatures : public StaticLocalDataSet {
public:
- SensorTemperatures(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, SENSOR_TEMPERATURES) {}
+ explicit SensorTemperatures(HasLocalDataPoolIF* owner)
+ : StaticLocalDataSet(owner, SENSOR_TEMPERATURES) {}
- SensorTemperatures(object_id_t objectId)
+ explicit SensorTemperatures(object_id_t objectId)
: StaticLocalDataSet(sid_t(objectId, SENSOR_TEMPERATURES)) {}
lp_var_t sensor_ploc_heatspreader =
@@ -137,9 +148,10 @@ class SensorTemperatures : public StaticLocalDataSet {
public:
- DeviceTemperatures(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, DEVICE_TEMPERATURES) {}
+ explicit DeviceTemperatures(HasLocalDataPoolIF* owner)
+ : StaticLocalDataSet(owner, DEVICE_TEMPERATURES) {}
- DeviceTemperatures(object_id_t objectId)
+ explicit DeviceTemperatures(object_id_t objectId)
: StaticLocalDataSet(sid_t(objectId, DEVICE_TEMPERATURES)) {}
lp_var_t q7s = lp_var_t(sid.objectId, PoolIds::TEMP_Q7S, this);
@@ -178,9 +190,11 @@ class DeviceTemperatures : public StaticLocalDataSet {
public:
- SusTemperatures(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, SUS_TEMPERATURES) {}
+ explicit SusTemperatures(HasLocalDataPoolIF* owner)
+ : StaticLocalDataSet(owner, SUS_TEMPERATURES) {}
- SusTemperatures(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, SUS_TEMPERATURES)) {}
+ explicit SusTemperatures(object_id_t objectId)
+ : StaticLocalDataSet(sid_t(objectId, SUS_TEMPERATURES)) {}
lp_var_t sus_0_n_loc_xfyfzm_pt_xf =
lp_var_t(sid.objectId, PoolIds::SUS_0_N_LOC_XFYFZM_PT_XF, this);
diff --git a/mission/system/objects/CamSwitcher.cpp b/mission/system/objects/CamSwitcher.cpp
index b995e211..90a78945 100644
--- a/mission/system/objects/CamSwitcher.cpp
+++ b/mission/system/objects/CamSwitcher.cpp
@@ -3,3 +3,8 @@
CamSwitcher::CamSwitcher(object_id_t objectId, PowerSwitchIF &pwrSwitcher,
power::Switch_t pwrSwitch)
: PowerSwitcherComponent(objectId, &pwrSwitcher, pwrSwitch) {}
+void CamSwitcher::performFaultyOperation() {
+ if (not switcher.active() and switcher.getState() != PowerSwitcher::SWITCH_IS_OFF) {
+ switcher.turnOff();
+ }
+}
diff --git a/mission/system/objects/CamSwitcher.h b/mission/system/objects/CamSwitcher.h
index 672b884b..57f371ce 100644
--- a/mission/system/objects/CamSwitcher.h
+++ b/mission/system/objects/CamSwitcher.h
@@ -8,6 +8,7 @@ class CamSwitcher : public PowerSwitcherComponent {
CamSwitcher(object_id_t objectId, PowerSwitchIF &pwrSwitcher, power::Switch_t pwrSwitch);
private:
+ void performFaultyOperation() override;
};
#endif /* MISSION_SYSTEM_OBJECTS_CAMSWITCHER_H_ */
diff --git a/mission/system/objects/EiveSystem.cpp b/mission/system/objects/EiveSystem.cpp
index bb2a229d..4b330a89 100644
--- a/mission/system/objects/EiveSystem.cpp
+++ b/mission/system/objects/EiveSystem.cpp
@@ -51,7 +51,7 @@ void EiveSystem::performChildOperation() {
}
ReturnValue_t EiveSystem::initialize() {
- EventManagerIF* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER);
+ auto* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER);
if (manager == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "AcsSubsystem::initialize: Invalid event manager" << std::endl;
@@ -67,6 +67,7 @@ ReturnValue_t EiveSystem::initialize() {
#endif
return ObjectManagerIF::CHILD_INIT_FAILED;
}
+ // TODO: manager->subscribeToEvent(eventQueue->getId(), )
return Subsystem::initialize();
}
diff --git a/thirdparty/lwgps b/thirdparty/lwgps
index 52999ddf..22d86566 160000
--- a/thirdparty/lwgps
+++ b/thirdparty/lwgps
@@ -1 +1 @@
-Subproject commit 52999ddfe5177493b96b55871961a8a97131596d
+Subproject commit 22d865662eb7be6c9849275da9166f6b410f906a
diff --git a/tmtc b/tmtc
index a40c881b..d8367f7e 160000
--- a/tmtc
+++ b/tmtc
@@ -1 +1 @@
-Subproject commit a40c881b9fc292fe598204280db38720a784b71f
+Subproject commit d8367f7e62a47516d7772c129c18ee8f7b07703b