diff --git a/bsp_hosted/ObjectFactory.cpp b/bsp_hosted/ObjectFactory.cpp index 287ecd36..33b22f07 100644 --- a/bsp_hosted/ObjectFactory.cpp +++ b/bsp_hosted/ObjectFactory.cpp @@ -1,7 +1,6 @@ #include "ObjectFactory.h" #include -#include "fsfw/power/PowerSwitchIF.h" #include #include #include @@ -11,6 +10,7 @@ #include "OBSWConfig.h" #include "fsfw/platform.h" +#include "fsfw/power/PowerSwitchIF.h" #include "fsfw_tests/integration/task/TestTask.h" #if OBSW_ADD_TMTC_UDP_SERVER == 1 diff --git a/dummies/Max31865Dummy.cpp b/dummies/Max31865Dummy.cpp index e893fe1c..ae4026ba 100644 --- a/dummies/Max31865Dummy.cpp +++ b/dummies/Max31865Dummy.cpp @@ -39,7 +39,7 @@ ReturnValue_t Max31865Dummy::initializeLocalDataPool(localpool::DataPool &localD void Max31865Dummy::setTemperature(float temperature, bool valid) { PoolReadGuard pg(&set); - if(pg.getReadResult() == returnvalue::OK) { + if (pg.getReadResult() == returnvalue::OK) { set.temperatureCelcius.value = temperature; set.setValidity(valid, true); } diff --git a/dummies/P60DockDummy.h b/dummies/P60DockDummy.h index 235aa885..1ecbe9ee 100644 --- a/dummies/P60DockDummy.h +++ b/dummies/P60DockDummy.h @@ -2,6 +2,7 @@ #define DUMMIES_P60DOCKDUMMY_H_ #include + #include "mission/devices/devicedefinitions/GomspaceDefinitions.h" class P60DockDummy : public DeviceHandlerBase { diff --git a/dummies/TemperatureSensorInserter.cpp b/dummies/TemperatureSensorInserter.cpp index eb9afc12..e734b770 100644 --- a/dummies/TemperatureSensorInserter.cpp +++ b/dummies/TemperatureSensorInserter.cpp @@ -14,9 +14,7 @@ TemperatureSensorInserter::TemperatureSensorInserter(object_id_t objectId, tmp1075DummyMap(std::move(tempTmpSensorDummies_)) {} ReturnValue_t TemperatureSensorInserter::initialize() { - if (performTest) { - if (testCase == TestCase::COOL_SYRLINKS) { } } @@ -24,18 +22,18 @@ ReturnValue_t TemperatureSensorInserter::initialize() { } ReturnValue_t TemperatureSensorInserter::performOperation(uint8_t opCode) { - if(not tempsWereInitialized) { - for(auto& rtdDummy: max31865DummyMap) { + if (not tempsWereInitialized) { + for (auto& rtdDummy : max31865DummyMap) { rtdDummy.second->setTemperature(10, true); } - for(auto& tmpDummy: tmp1075DummyMap) { + for (auto& tmpDummy : tmp1075DummyMap) { tmpDummy.second->setTemperature(10, true); } tempsWereInitialized = true; } - if(cycles == 10) { - max31865DummyMap[objects::RTD_14_IC17_TCS_BOARD]->setTemperature(-100, true); + if (cycles == 10) { + max31865DummyMap[objects::RTD_2_IC5_4K_CAMERA]->setTemperature(-100, true); } /* ReturnValue_t result = max31865PlocHeatspreaderSet.read(); @@ -54,7 +52,4 @@ ReturnValue_t TemperatureSensorInserter::performOperation(uint8_t opCode) { cycles++; return returnvalue::OK; } -ReturnValue_t TemperatureSensorInserter::initializeAfterTaskCreation() { - - return returnvalue::OK; -} +ReturnValue_t TemperatureSensorInserter::initializeAfterTaskCreation() { return returnvalue::OK; } diff --git a/linux/devices/CMakeLists.txt b/linux/devices/CMakeLists.txt index 17d842ea..22b39840 100644 --- a/linux/devices/CMakeLists.txt +++ b/linux/devices/CMakeLists.txt @@ -3,8 +3,9 @@ if(EIVE_BUILD_GPSD_GPS_HANDLER) endif() target_sources( - ${OBSW_NAME} PRIVATE Max31865RtdPolling.cpp ScexUartReader.cpp ImtqPollingTask.cpp - ScexDleParser.cpp ScexHelper.cpp RwPollingTask.cpp) + ${OBSW_NAME} + PRIVATE Max31865RtdPolling.cpp ScexUartReader.cpp ImtqPollingTask.cpp + ScexDleParser.cpp ScexHelper.cpp RwPollingTask.cpp) add_subdirectory(ploc) diff --git a/mission/controller/ThermalController.cpp b/mission/controller/ThermalController.cpp index 5d929503..de6b0023 100644 --- a/mission/controller/ThermalController.cpp +++ b/mission/controller/ThermalController.cpp @@ -1344,102 +1344,31 @@ void ThermalController::ctrlScexBoard() { } void ThermalController::performThermalModuleCtrl() { - ctrlAcsBoard(); - ctrlMgt(); - ctrlRw(); - ctrlStr(); - ctrlIfBoard(); - ctrlTcsBoard(); - ctrlObc(); - ctrlObcIfBoard(); - ctrlSBandTransceiver(); - ctrlPcduP60Board(); - ctrlPcduAcu(); - ctrlPcduPdu(); - ctrlPlPcduBoard(); - ctrlPlocMissionBoard(); - ctrlPlocProcessingBoard(); - ctrlDac(); + // ctrlAcsBoard(); + // ctrlMgt(); + // ctrlRw(); + // ctrlStr(); + // ctrlIfBoard(); + // ctrlTcsBoard(); + // ctrlObc(); + // ctrlObcIfBoard(); + // ctrlSBandTransceiver(); + // ctrlPcduP60Board(); + // ctrlPcduAcu(); + // ctrlPcduPdu(); + // ctrlPlPcduBoard(); + // ctrlPlocMissionBoard(); + // ctrlPlocProcessingBoard(); + // ctrlDac(); ctrlCameraBody(); - ctrlDro(); - ctrlX8(); - ctrlHpa(); - ctrlTx(); - ctrlMpa(); - ctrlScexBoard(); + // ctrlDro(); + // ctrlX8(); + // ctrlHpa(); + // ctrlTx(); + // ctrlMpa(); + // ctrlScexBoard(); + // heaterTransitionControl(); } - -void ThermalController::ctrlHeater(heater::Switchers switchNr, heater::Switchers redSwitchNr, - struct TempLimits& tempLimit) { - componentAboveCutOffLimit = false; - // Heater off - if (not heaterHandler.checkSwitchState(switchNr) and not thermalStates[thermalComponent].heating) { - if (sensorTemp < tempLimit.opLowerLimit) { - heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::ON); - sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " ON" << std::endl; - thermalStates[thermalComponent].heating = true; - //TODO: EVENT - //TODO: merken wenn an oder ausgeschaltet und erst nach drei zyklen wieder checken? wenn in transition dann paar mal skippen mit transitionboolean; bool switchOnTransition und bool switchOffTasnition, counter 3 zyklen dabei checken ob tansition erfolgreich, bool clearen, falls drei erreicht heaterControlErrorCounter global zählen - } - // Heater on - } else if (heaterHandler.checkSwitchState(switchNr) and thermalStates[thermalComponent].heating) { - if (sensorTemp >= tempLimit.opLowerLimit + TEMP_OFFSET) { - heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF); - sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl; //TODO: array mit struct enthält infos - thermalStates[thermalComponent].heating = false; - - } - } else if (redSwitchNrInUse) { - if (heaterHandler.checkSwitchState(redSwitchNr)) { - if (sensorTemp >= tempLimit.cutOffLimit) { - componentAboveCutOffLimit = true; - heaterHandler.switchHeater(redSwitchNr, HeaterHandler::SwitchState::OFF); - sif::info << "ThermalController::ctrlHeater: Heater" << redSwitchNr << " OFF" << std::endl; - } - } - } -} - -bool ThermalController::chooseHeater(heater::Switchers& switchNr, heater::Switchers redSwitchNr) { - bool heaterAvailable = true; - - if (heaterHandler.getHealth(switchNr) != HasHealthIF::HEALTHY) { - if (heaterHandler.getHealth(redSwitchNr) == HasHealthIF::HEALTHY) { - switchNr = redSwitchNr; - redSwitchNrInUse = true; - } else { - heaterAvailable = false; - triggerEvent(NO_HEALTHY_HEATER_AVAILABLE, switchNr, redSwitchNr); - } - } else { - redSwitchNrInUse = false; - } - return heaterAvailable; -} - -bool ThermalController::selectAndReadSensorTemp() { - for (unsigned i = 0; i < numSensors; i++) { - if (sensors[i].first and sensors[i].second != INVALID_TEMPERATURE) { - sensorTemp = sensors[i].second; - thermalStates[thermalComponent].errorCounter = 0; - return true; - } - } - - thermalStates[thermalComponent].errorCounter ++; - if(thermalComponent != rw and thermalComponent != acsBoard){ - if (thermalStates[thermalComponent].errorCounter <= 3){ - triggerEvent(NO_VALID_SENSOR_TEMPERATURE, thermalComponent); - } - }else{ - if (thermalStates[thermalComponent].errorCounter <= 8){ - triggerEvent(NO_VALID_SENSOR_TEMPERATURE, thermalComponent); - } - } - - return false; -} - void ThermalController::ctrlComponentTemperature(heater::Switchers switchNr, heater::Switchers redSwitchNr, TempLimits& tempLimit) { @@ -1458,12 +1387,116 @@ void ThermalController::ctrlComponentTemperature(heater::Switchers switchNr, } resetSensorsArray(); } +bool ThermalController::selectAndReadSensorTemp() { + for (unsigned i = 0; i < numSensors; i++) { + if (sensors[i].first and sensors[i].second != INVALID_TEMPERATURE) { + sensorTemp = sensors[i].second; + thermalStates[thermalComponent].errorCounter = 0; + return true; + } + } + thermalStates[thermalComponent].errorCounter++; + if (thermalComponent != rw and thermalComponent != acsBoard) { + if (thermalStates[thermalComponent].errorCounter <= 3) { + triggerEvent(NO_VALID_SENSOR_TEMPERATURE, thermalComponent); + } + } else { + if (thermalStates[thermalComponent].errorCounter <= 8) { + triggerEvent(NO_VALID_SENSOR_TEMPERATURE, thermalComponent); + } + } + + return false; +} +bool ThermalController::chooseHeater(heater::Switchers& switchNr, heater::Switchers redSwitchNr) { + bool heaterAvailable = true; + + if (heaterHandler.getHealth(switchNr) != HasHealthIF::HEALTHY) { + if (heaterHandler.getHealth(redSwitchNr) == HasHealthIF::HEALTHY) { + switchNr = redSwitchNr; + redSwitchNrInUse = true; + } else { + heaterAvailable = false; + triggerEvent(NO_HEALTHY_HEATER_AVAILABLE, switchNr, redSwitchNr); + } + } else { + redSwitchNrInUse = false; + } + return heaterAvailable; +} +void ThermalController::ctrlHeater(heater::Switchers switchNr, heater::Switchers redSwitchNr, + struct TempLimits& tempLimit) { + componentAboveCutOffLimit = false; + // if Heater off + if (not heaterStates[switchNr].switchOnTransition and + not heaterStates[switchNr].switchOffTransition) { + if (not heaterHandler.checkSwitchState(switchNr) and + not thermalStates[thermalComponent].heating) { + if (sensorTemp < tempLimit.opLowerLimit) { + heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::ON); + heaterStates[switchNr].switchOnTransition = true; + sif::info << "ThermalController::ctrlHeater: Heater " << thermalComponent << " ON" + << std::endl; + thermalStates[thermalComponent].heating = true; + // TODO: EVENT; aber heaterHandler erstellt schon event + // TODO: merken wenn an oder ausgeschaltet und erst nach drei zyklen wieder checken? wenn in + // transition dann paar mal skippen; bool switchOnTransition und bool + // switchOffTasnition, counter 3 zyklen dabei checken ob tansition erfolgreich, bool + // clearen, falls drei erreicht heaterControlErrorCounter global zählen + } + + // if Heater on + } else if (heaterHandler.checkSwitchState(switchNr)) { + if (thermalStates[thermalComponent].heating) { + if (sensorTemp >= tempLimit.opLowerLimit + TEMP_OFFSET) { + heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF); + sif::info << "ThermalController::ctrlHeater: Heater " << thermalComponent << " OFF" + << std::endl; + heaterStates[switchNr].switchOffTransition = true; + thermalStates[thermalComponent].heating = false; + } + } else { + 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].switchOffTransition = true; + if (heaterHandler.checkSwitchState(redSwitchNr)) { + heaterHandler.switchHeater(redSwitchNr, HeaterHandler::SwitchState::OFF); + sif::info << "ThermalController::ctrlHeater: Reached CutOffLimit: RedundantHeater " + << thermalComponent << " OFF" << std::endl; + heaterStates[redSwitchNr].switchOffTransition = true; + } + } + } + } + } +} void ThermalController::resetSensorsArray() { - // TODO: müssen auch andere Variablen resettet werden? senstemp? for (auto& validValuePair : sensors) { validValuePair.first = false; validValuePair.second = INVALID_TEMPERATURE; } thermalComponent = NONE; } +void ThermalController::heaterTransitionControl() { + for (unsigned i = 0; i < 7; i++) { + if (heaterStates[i].switchOffTransition) { + if (heaterStates[i].heaterSwitchOffControlErrorCounter > 3) { + heaterStates[i].switchOffTransition = false; + heaterStates[i].heaterSwitchOffControlErrorCounter = 0; + } + heaterStates[i].heaterSwitchOffControlErrorCounter++; + } + + if (heaterStates[i].switchOnTransition) { + if (heaterStates[i].heaterSwitchOnControlErrorCounter > 3) { + heaterStates[i].switchOnTransition = false; + heaterStates[i].heaterSwitchOnControlErrorCounter = 0; + } + heaterStates[i].heaterSwitchOnControlErrorCounter++; + } + } +} diff --git a/mission/controller/ThermalController.h b/mission/controller/ThermalController.h index 590565c5..d23c8366 100644 --- a/mission/controller/ThermalController.h +++ b/mission/controller/ThermalController.h @@ -36,14 +36,21 @@ struct TempLimits { float nopUpperLimit; }; -struct ThermalState { +struct ThermalState { uint8_t errorCounter; bool heating; - uint32_t heaterStartTime; + uint32_t heaterStartTime; }; -enum ThermalComponents: uint8_t { - //TODO: Großbuchstaben +struct HeaterState { + bool switchOnTransition; + bool switchOffTransition; + uint8_t heaterSwitchOnControlErrorCounter; + uint8_t heaterSwitchOffControlErrorCounter; +}; + +enum ThermalComponents : uint8_t { + // TODO: Großbuchstaben NONE = 0, acsBoard = 1, mgt = 2, @@ -189,8 +196,8 @@ class ThermalController : public ExtendedControllerBase { ThermalComponents thermalComponent = NONE; bool redSwitchNrInUse = false; bool componentAboveCutOffLimit = false; - std::array thermalStates {}; - + std::array thermalStates{}; + std::array heaterStates{}; // Initial delay to make sure all pool variables have been initialized their owners Countdown initialCountdown = Countdown(DELAY); @@ -246,6 +253,7 @@ class ThermalController : public ExtendedControllerBase { void ctrlTx(); void ctrlMpa(); void ctrlScexBoard(); + void heaterTransitionControl(); }; #endif /* MISSION_CONTROLLER_THERMALCONTROLLER_H_ */ diff --git a/mission/devices/GyroADIS1650XHandler.cpp b/mission/devices/GyroADIS1650XHandler.cpp index e099e91f..0993e233 100644 --- a/mission/devices/GyroADIS1650XHandler.cpp +++ b/mission/devices/GyroADIS1650XHandler.cpp @@ -434,8 +434,7 @@ ReturnValue_t GyroADIS1650XHandler::spiSendCallback(SpiComIF *comIf, SpiCookie * // Prepare transfer int fileDescriptor = 0; std::string device = comIf->getSpiDev(); - UnixFileGuard fileHelper(device, - fileDescriptor, O_RDWR, "SpiComIF::sendMessage"); + UnixFileGuard fileHelper(device, fileDescriptor, O_RDWR, "SpiComIF::sendMessage"); if (fileHelper.getOpenResult() != returnvalue::OK) { return SpiComIF::OPENING_FILE_FAILED; } diff --git a/mission/devices/ImtqHandler.cpp b/mission/devices/ImtqHandler.cpp index 18c002c4..aa935ce5 100644 --- a/mission/devices/ImtqHandler.cpp +++ b/mission/devices/ImtqHandler.cpp @@ -256,7 +256,7 @@ ReturnValue_t ImtqHandler::scanForReply(const uint8_t* start, size_t remainingSi ReturnValue_t ImtqHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { ReturnValue_t result; ReturnValue_t status = returnvalue::OK; - if(getMode() != MODE_NORMAL) { + if (getMode() != MODE_NORMAL) { // Ignore replies during transitions. return returnvalue::OK; } diff --git a/mission/tmtc/CfdpTmFunnel.cpp b/mission/tmtc/CfdpTmFunnel.cpp index 779e9aa8..32dba7fe 100644 --- a/mission/tmtc/CfdpTmFunnel.cpp +++ b/mission/tmtc/CfdpTmFunnel.cpp @@ -21,7 +21,7 @@ ReturnValue_t CfdpTmFunnel::performOperation(uint8_t) { break; } count++; - if(count == 500) { + if (count == 500) { sif::error << "CfdpTmFunnel: Possible message storm detected" << std::endl; break; } diff --git a/mission/tmtc/PusTmFunnel.cpp b/mission/tmtc/PusTmFunnel.cpp index e239afc9..974cdca0 100644 --- a/mission/tmtc/PusTmFunnel.cpp +++ b/mission/tmtc/PusTmFunnel.cpp @@ -21,7 +21,7 @@ ReturnValue_t PusTmFunnel::performOperation(uint8_t) { break; } count++; - if(count == 500) { + if (count == 500) { sif::error << "PusTmFunnel: Possible message storm detected" << std::endl; break; } diff --git a/mission/tmtc/VirtualChannel.cpp b/mission/tmtc/VirtualChannel.cpp index 64c7b006..6a24cc09 100644 --- a/mission/tmtc/VirtualChannel.cpp +++ b/mission/tmtc/VirtualChannel.cpp @@ -50,7 +50,7 @@ ReturnValue_t VirtualChannel::performOperation() { } count++; - if(count == 500) { + if (count == 500) { sif::error << "VirtualChannel: Possible message storm detected" << std::endl; break; }