ThermalController: events for overheating
Some checks failed
EIVE/eive-obsw/pipeline/pr-develop There was a failure building this commit

This commit is contained in:
Irini Kosmidou 2023-02-03 13:19:39 +01:00
parent e46b4c51d5
commit 519d55af4b
4 changed files with 39 additions and 50 deletions

View File

@ -9,25 +9,16 @@
#include <fsfw_hal/linux/spi/SpiComIF.h>
#include <fsfw_hal/linux/spi/SpiCookie.h>
#include <linux/callbacks/gpioCallbacks.h>
#include <linux/devices/Max31865RtdLowlevelHandler.h>
#include <mission/controller/AcsController.h>
#include <mission/devices/Max31865EiveHandler.h>
#include <mission/devices/ScexDeviceHandler.h>
#include <mission/devices/SusHandler.h>
#include <mission/system/fdir/RtdFdir.h>
#include <mission/system/fdir/SusFdir.h>
#include <mission/system/objects/SusAssembly.h>
#include <mission/system/objects/TcsBoardAssembly.h>
#include "OBSWConfig.h"
#include "devConf.h"
#include "devices/addresses.h"
#include "devices/gpioIds.h"
#include "eive/definitions.h"
#include "mission/controller/ThermalController.h"
#include "mission/system/tree/acsModeTree.h"
#include "mission/system/tree/payloadModeTree.h"
#include "mission/system/tree/tcsModeTree.h"
void ObjectFactory::createSunSensorComponents(GpioIF* gpioComIF, SpiComIF* spiComIF,
PowerSwitchIF* pwrSwitcher, std::string spiDev,

View File

@ -3,7 +3,6 @@
#include <bsp_q7s/core/CoreDefinitions.h>
#include <fsfw/datapool/PoolReadGuard.h>
#include <fsfw/thermal/ThermalComponentIF.h>
#include <fsfw/thermal/ThermalModuleIF.h>
#include <fsfw_hal/devicehandlers/devicedefinitions/MgmLIS3HandlerDefs.h>
#include <linux/devices/devicedefinitions/StarTrackerDefinitions.h>
#include <mission/devices/devicedefinitions/BpxBatteryDefinitions.h>
@ -989,16 +988,14 @@ void ThermalController::ctrlAcsBoard() {
if (heaterAvailable) {
// A side
chooseOf5Sensors(switchNr, deviceTemperatures.gyro0SideA, deviceTemperatures.mgm0SideA,
deviceTemperatures.gyro1SideA, deviceTemperatures.mgm0SideA,
sensorTemperatures.sensor_tcs_board);
chooseOf4Sensors(switchNr, deviceTemperatures.gyro0SideA, deviceTemperatures.mgm0SideA,
deviceTemperatures.gyro1SideA, sensorTemperatures.sensor_tcs_board);
if (sensorTempAvailable) {
ctrlHeater(switchNr, redSwitchNr, &acsBoardLimits);
}
// B side
chooseOf5Sensors(switchNr, deviceTemperatures.gyro2SideB, deviceTemperatures.mgm2SideB,
deviceTemperatures.gyro3SideB, deviceTemperatures.mgm2SideB,
sensorTemperatures.sensor_tcs_board);
chooseOf4Sensors(switchNr, deviceTemperatures.gyro2SideB, deviceTemperatures.mgm2SideB,
deviceTemperatures.gyro3SideB, sensorTemperatures.sensor_tcs_board);
if (sensorTempAvailable) {
ctrlHeater(switchNr, redSwitchNr, &acsBoardLimits);
}
@ -1151,6 +1148,9 @@ void ThermalController::ctrlObc() {
ctrlComponentTemperature(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD,
deviceTemperatures.q7s, sensorTemperatures.tmp1075Tcs1,
sensorTemperatures.tmp1075Tcs0, &obcLimits);
if (componentOverheating) {
triggerEvent(OBC_OVERHEATING);
}
}
void ThermalController::ctrlObcIfBoard() {
@ -1164,6 +1164,9 @@ void ThermalController::ctrlSBandTransceiver() {
deviceTemperatures.syrlinksPowerAmplifier,
deviceTemperatures.syrlinksBasebandBoard,
sensorTemperatures.sensor_4k_camera, &sBandTransceiverLimits);
if (componentOverheating) {
triggerEvent(SYRLINKS_OVERHEATING);
}
}
void ThermalController::ctrlPcduP60Board() {
ctrlComponentTemperature(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD,
@ -1219,6 +1222,9 @@ void ThermalController::ctrlPlPcduBoard() {
sensorTemperatures.sensor_plpcdu_heatspreader);
if (sensorTempAvailable) {
ctrlHeater(switchNr, redSwitchNr, &plPcduBoardLimits);
if (componentOverheating) {
triggerEvent(PLPCDU_OVERHEATING, switchNr);
}
}
}
}
@ -1228,6 +1234,9 @@ void ThermalController::ctrlPlocMissionBoard() {
sensorTemperatures.sensor_ploc_heatspreader,
sensorTemperatures.sensor_ploc_missionboard,
sensorTemperatures.sensor_dac_heatspreader, &plocMissionBoardLimits);
if (componentOverheating) {
triggerEvent(PLOC_OVERHEATING);
}
}
void ThermalController::ctrlPlocProcessingBoard() {
@ -1278,6 +1287,9 @@ void ThermalController::ctrlHpa() {
ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA,
sensorTemperatures.sensor_hpa, sensorTemperatures.sensor_x8,
sensorTemperatures.sensor_mpa, &hpaLimits);
if (componentOverheating) {
triggerEvent(HPA_OVERHEATING);
}
}
void ThermalController::ctrlScexBoard() {
@ -1288,20 +1300,25 @@ void ThermalController::ctrlScexBoard() {
void ThermalController::ctrlHeater(heater::Switchers switchNr, heater::Switchers redSwitchNr,
struct TempLimits* tempLimit) {
componentOverheating = false;
// Heater off
if (not heaterHandler.checkSwitchState(switchNr)) {
if (sensorTemp < (*tempLimit).opLowerLimit) {
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::ON);
sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " ON" << std::endl;
}
// Heater on
} else if (heaterHandler.checkSwitchState(switchNr)) {
if (sensorTemp >= (*tempLimit).opLowerLimit + TEMP_OFFSET) {
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl;
}
} else if (not redSwitchNrInUse) {
if (heaterHandler.checkSwitchState(redSwitchNr)) {
if (sensorTemp >= (*tempLimit).cutOffLimit) {
componentOverheating = true;
heaterHandler.switchHeater(redSwitchNr, HeaterHandler::SwitchState::OFF);
sif::info << "ThermalController::ctrlHeater: Heater" << redSwitchNr << " OFF" << std::endl;
}
}
}
@ -1327,15 +1344,16 @@ void ThermalController::chooseSensor(heater::Switchers switchNr, const lp_float_
const lp_float_t& sensor2, const lp_float_t& sensor3) {
sensorTempAvailable = true;
if (sensor1.isValid()) {
if (sensor1.isValid() and sensor1.value != INVALID_TEMPERATURE) {
sensorTemp = sensor1.value;
} else if (sensor2.isValid()) {
} else if (sensor2.isValid() and sensor2.value != INVALID_TEMPERATURE) {
sensorTemp = sensor2.value;
} else if (sensor3.isValid()) {
} else if (sensor3.isValid() and sensor3.value != INVALID_TEMPERATURE) {
sensorTemp = sensor3.value;
} else {
if (heaterHandler.checkSwitchState(switchNr)) {
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl;
}
triggerEvent(NO_VALID_SENSOR_TEMPERATURE, switchNr);
sensorTempAvailable = false;
@ -1363,40 +1381,18 @@ void ThermalController::chooseOf4Sensors(heater::Switchers switchNr, const lp_fl
const lp_float_t& sensor4) {
sensorTempAvailable = true;
if (sensor1.isValid()) {
if (sensor1.isValid() and sensor1.value != INVALID_TEMPERATURE) {
sensorTemp = sensor1.value;
} else if (sensor2.isValid()) {
} else if (sensor2.isValid() and sensor2.value != INVALID_TEMPERATURE) {
sensorTemp = sensor2.value;
} else if (sensor3.isValid()) {
} else if (sensor3.isValid() and sensor3.value != INVALID_TEMPERATURE) {
sensorTemp = sensor3.value;
} else if (sensor4.isValid()) {
} else if (sensor4.isValid() and sensor4.value != INVALID_TEMPERATURE) {
sensorTemp = sensor4.value;
} else {
if (heaterHandler.checkSwitchState(switchNr)) {
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
}
triggerEvent(NO_VALID_SENSOR_TEMPERATURE, switchNr);
sensorTempAvailable = false;
}
}
void ThermalController::chooseOf5Sensors(heater::Switchers switchNr, const lp_float_t& sensor1,
const lp_float_t& sensor2, const lp_float_t& sensor3,
const lp_float_t& sensor4, const lp_float_t& sensor5) {
sensorTempAvailable = true;
if (sensor1.isValid()) {
sensorTemp = sensor1.value;
} else if (sensor2.isValid()) {
sensorTemp = sensor2.value;
} else if (sensor3.isValid()) {
sensorTemp = sensor3.value;
} else if (sensor4.isValid()) {
sensorTemp = sensor4.value;
} else if (sensor5.isValid()) {
sensorTemp = sensor5.value;
} else {
if (heaterHandler.checkSwitchState(switchNr)) {
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl;
}
triggerEvent(NO_VALID_SENSOR_TEMPERATURE, switchNr);
sensorTempAvailable = false;

View File

@ -58,6 +58,11 @@ class ThermalController : public ExtendedControllerBase {
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;
@ -143,6 +148,7 @@ class ThermalController : public ExtendedControllerBase {
bool sensorTempAvailable = true;
bool heaterAvailable = true;
bool redSwitchNrInUse = false;
bool componentOverheating = false;
// Initial delay to make sure all pool variables have been initialized their owners
Countdown initialCountdown = Countdown(DELAY);
@ -169,9 +175,6 @@ class ThermalController : public ExtendedControllerBase {
void chooseOf4Sensors(heater::Switchers switchNr, const lp_float_t& sensor1,
const lp_float_t& sensor2, const lp_float_t& sensor3,
const lp_float_t& sensor4);
void chooseOf5Sensors(heater::Switchers switchNr, const lp_float_t& sensor1,
const lp_float_t& sensor2, const lp_float_t& sensor3,
const lp_float_t& sensor4, const lp_float_t& sensor5);
void ctrlAcsBoard();
void ctrlMgt();

View File

@ -7,7 +7,6 @@
#include <stdexcept>
#include "devices/gpioIds.h"
#include "devices/powerSwitcherList.h"
HeaterHandler::HeaterHandler(object_id_t setObjectId_, GpioIF* gpioInterface_, HeaterHelper helper,