ThermalController: events for overheating
Some checks failed
EIVE/eive-obsw/pipeline/pr-develop There was a failure building this commit
Some checks failed
EIVE/eive-obsw/pipeline/pr-develop There was a failure building this commit
This commit is contained in:
parent
e46b4c51d5
commit
519d55af4b
@ -9,25 +9,16 @@
|
|||||||
#include <fsfw_hal/linux/spi/SpiComIF.h>
|
#include <fsfw_hal/linux/spi/SpiComIF.h>
|
||||||
#include <fsfw_hal/linux/spi/SpiCookie.h>
|
#include <fsfw_hal/linux/spi/SpiCookie.h>
|
||||||
#include <linux/callbacks/gpioCallbacks.h>
|
#include <linux/callbacks/gpioCallbacks.h>
|
||||||
#include <linux/devices/Max31865RtdLowlevelHandler.h>
|
|
||||||
#include <mission/controller/AcsController.h>
|
#include <mission/controller/AcsController.h>
|
||||||
#include <mission/devices/Max31865EiveHandler.h>
|
|
||||||
#include <mission/devices/ScexDeviceHandler.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 "OBSWConfig.h"
|
||||||
#include "devConf.h"
|
#include "devConf.h"
|
||||||
#include "devices/addresses.h"
|
#include "devices/addresses.h"
|
||||||
#include "devices/gpioIds.h"
|
#include "devices/gpioIds.h"
|
||||||
#include "eive/definitions.h"
|
#include "eive/definitions.h"
|
||||||
#include "mission/controller/ThermalController.h"
|
|
||||||
#include "mission/system/tree/acsModeTree.h"
|
#include "mission/system/tree/acsModeTree.h"
|
||||||
#include "mission/system/tree/payloadModeTree.h"
|
#include "mission/system/tree/payloadModeTree.h"
|
||||||
#include "mission/system/tree/tcsModeTree.h"
|
|
||||||
|
|
||||||
void ObjectFactory::createSunSensorComponents(GpioIF* gpioComIF, SpiComIF* spiComIF,
|
void ObjectFactory::createSunSensorComponents(GpioIF* gpioComIF, SpiComIF* spiComIF,
|
||||||
PowerSwitchIF* pwrSwitcher, std::string spiDev,
|
PowerSwitchIF* pwrSwitcher, std::string spiDev,
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
#include <bsp_q7s/core/CoreDefinitions.h>
|
#include <bsp_q7s/core/CoreDefinitions.h>
|
||||||
#include <fsfw/datapool/PoolReadGuard.h>
|
#include <fsfw/datapool/PoolReadGuard.h>
|
||||||
#include <fsfw/thermal/ThermalComponentIF.h>
|
#include <fsfw/thermal/ThermalComponentIF.h>
|
||||||
#include <fsfw/thermal/ThermalModuleIF.h>
|
|
||||||
#include <fsfw_hal/devicehandlers/devicedefinitions/MgmLIS3HandlerDefs.h>
|
#include <fsfw_hal/devicehandlers/devicedefinitions/MgmLIS3HandlerDefs.h>
|
||||||
#include <linux/devices/devicedefinitions/StarTrackerDefinitions.h>
|
#include <linux/devices/devicedefinitions/StarTrackerDefinitions.h>
|
||||||
#include <mission/devices/devicedefinitions/BpxBatteryDefinitions.h>
|
#include <mission/devices/devicedefinitions/BpxBatteryDefinitions.h>
|
||||||
@ -989,16 +988,14 @@ void ThermalController::ctrlAcsBoard() {
|
|||||||
|
|
||||||
if (heaterAvailable) {
|
if (heaterAvailable) {
|
||||||
// A side
|
// A side
|
||||||
chooseOf5Sensors(switchNr, deviceTemperatures.gyro0SideA, deviceTemperatures.mgm0SideA,
|
chooseOf4Sensors(switchNr, deviceTemperatures.gyro0SideA, deviceTemperatures.mgm0SideA,
|
||||||
deviceTemperatures.gyro1SideA, deviceTemperatures.mgm0SideA,
|
deviceTemperatures.gyro1SideA, sensorTemperatures.sensor_tcs_board);
|
||||||
sensorTemperatures.sensor_tcs_board);
|
|
||||||
if (sensorTempAvailable) {
|
if (sensorTempAvailable) {
|
||||||
ctrlHeater(switchNr, redSwitchNr, &acsBoardLimits);
|
ctrlHeater(switchNr, redSwitchNr, &acsBoardLimits);
|
||||||
}
|
}
|
||||||
// B side
|
// B side
|
||||||
chooseOf5Sensors(switchNr, deviceTemperatures.gyro2SideB, deviceTemperatures.mgm2SideB,
|
chooseOf4Sensors(switchNr, deviceTemperatures.gyro2SideB, deviceTemperatures.mgm2SideB,
|
||||||
deviceTemperatures.gyro3SideB, deviceTemperatures.mgm2SideB,
|
deviceTemperatures.gyro3SideB, sensorTemperatures.sensor_tcs_board);
|
||||||
sensorTemperatures.sensor_tcs_board);
|
|
||||||
if (sensorTempAvailable) {
|
if (sensorTempAvailable) {
|
||||||
ctrlHeater(switchNr, redSwitchNr, &acsBoardLimits);
|
ctrlHeater(switchNr, redSwitchNr, &acsBoardLimits);
|
||||||
}
|
}
|
||||||
@ -1151,6 +1148,9 @@ void ThermalController::ctrlObc() {
|
|||||||
ctrlComponentTemperature(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD,
|
ctrlComponentTemperature(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD,
|
||||||
deviceTemperatures.q7s, sensorTemperatures.tmp1075Tcs1,
|
deviceTemperatures.q7s, sensorTemperatures.tmp1075Tcs1,
|
||||||
sensorTemperatures.tmp1075Tcs0, &obcLimits);
|
sensorTemperatures.tmp1075Tcs0, &obcLimits);
|
||||||
|
if (componentOverheating) {
|
||||||
|
triggerEvent(OBC_OVERHEATING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThermalController::ctrlObcIfBoard() {
|
void ThermalController::ctrlObcIfBoard() {
|
||||||
@ -1164,6 +1164,9 @@ void ThermalController::ctrlSBandTransceiver() {
|
|||||||
deviceTemperatures.syrlinksPowerAmplifier,
|
deviceTemperatures.syrlinksPowerAmplifier,
|
||||||
deviceTemperatures.syrlinksBasebandBoard,
|
deviceTemperatures.syrlinksBasebandBoard,
|
||||||
sensorTemperatures.sensor_4k_camera, &sBandTransceiverLimits);
|
sensorTemperatures.sensor_4k_camera, &sBandTransceiverLimits);
|
||||||
|
if (componentOverheating) {
|
||||||
|
triggerEvent(SYRLINKS_OVERHEATING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void ThermalController::ctrlPcduP60Board() {
|
void ThermalController::ctrlPcduP60Board() {
|
||||||
ctrlComponentTemperature(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD,
|
ctrlComponentTemperature(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD,
|
||||||
@ -1219,6 +1222,9 @@ void ThermalController::ctrlPlPcduBoard() {
|
|||||||
sensorTemperatures.sensor_plpcdu_heatspreader);
|
sensorTemperatures.sensor_plpcdu_heatspreader);
|
||||||
if (sensorTempAvailable) {
|
if (sensorTempAvailable) {
|
||||||
ctrlHeater(switchNr, redSwitchNr, &plPcduBoardLimits);
|
ctrlHeater(switchNr, redSwitchNr, &plPcduBoardLimits);
|
||||||
|
if (componentOverheating) {
|
||||||
|
triggerEvent(PLPCDU_OVERHEATING, switchNr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1228,6 +1234,9 @@ void ThermalController::ctrlPlocMissionBoard() {
|
|||||||
sensorTemperatures.sensor_ploc_heatspreader,
|
sensorTemperatures.sensor_ploc_heatspreader,
|
||||||
sensorTemperatures.sensor_ploc_missionboard,
|
sensorTemperatures.sensor_ploc_missionboard,
|
||||||
sensorTemperatures.sensor_dac_heatspreader, &plocMissionBoardLimits);
|
sensorTemperatures.sensor_dac_heatspreader, &plocMissionBoardLimits);
|
||||||
|
if (componentOverheating) {
|
||||||
|
triggerEvent(PLOC_OVERHEATING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThermalController::ctrlPlocProcessingBoard() {
|
void ThermalController::ctrlPlocProcessingBoard() {
|
||||||
@ -1278,6 +1287,9 @@ void ThermalController::ctrlHpa() {
|
|||||||
ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA,
|
ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA,
|
||||||
sensorTemperatures.sensor_hpa, sensorTemperatures.sensor_x8,
|
sensorTemperatures.sensor_hpa, sensorTemperatures.sensor_x8,
|
||||||
sensorTemperatures.sensor_mpa, &hpaLimits);
|
sensorTemperatures.sensor_mpa, &hpaLimits);
|
||||||
|
if (componentOverheating) {
|
||||||
|
triggerEvent(HPA_OVERHEATING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThermalController::ctrlScexBoard() {
|
void ThermalController::ctrlScexBoard() {
|
||||||
@ -1288,20 +1300,25 @@ void ThermalController::ctrlScexBoard() {
|
|||||||
|
|
||||||
void ThermalController::ctrlHeater(heater::Switchers switchNr, heater::Switchers redSwitchNr,
|
void ThermalController::ctrlHeater(heater::Switchers switchNr, heater::Switchers redSwitchNr,
|
||||||
struct TempLimits* tempLimit) {
|
struct TempLimits* tempLimit) {
|
||||||
|
componentOverheating = false;
|
||||||
// Heater off
|
// Heater off
|
||||||
if (not heaterHandler.checkSwitchState(switchNr)) {
|
if (not heaterHandler.checkSwitchState(switchNr)) {
|
||||||
if (sensorTemp < (*tempLimit).opLowerLimit) {
|
if (sensorTemp < (*tempLimit).opLowerLimit) {
|
||||||
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::ON);
|
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::ON);
|
||||||
|
sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " ON" << std::endl;
|
||||||
}
|
}
|
||||||
// Heater on
|
// Heater on
|
||||||
} else if (heaterHandler.checkSwitchState(switchNr)) {
|
} else if (heaterHandler.checkSwitchState(switchNr)) {
|
||||||
if (sensorTemp >= (*tempLimit).opLowerLimit + TEMP_OFFSET) {
|
if (sensorTemp >= (*tempLimit).opLowerLimit + TEMP_OFFSET) {
|
||||||
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
|
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
|
||||||
|
sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl;
|
||||||
}
|
}
|
||||||
} else if (not redSwitchNrInUse) {
|
} else if (not redSwitchNrInUse) {
|
||||||
if (heaterHandler.checkSwitchState(redSwitchNr)) {
|
if (heaterHandler.checkSwitchState(redSwitchNr)) {
|
||||||
if (sensorTemp >= (*tempLimit).cutOffLimit) {
|
if (sensorTemp >= (*tempLimit).cutOffLimit) {
|
||||||
|
componentOverheating = true;
|
||||||
heaterHandler.switchHeater(redSwitchNr, HeaterHandler::SwitchState::OFF);
|
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) {
|
const lp_float_t& sensor2, const lp_float_t& sensor3) {
|
||||||
sensorTempAvailable = true;
|
sensorTempAvailable = true;
|
||||||
|
|
||||||
if (sensor1.isValid()) {
|
if (sensor1.isValid() and sensor1.value != INVALID_TEMPERATURE) {
|
||||||
sensorTemp = sensor1.value;
|
sensorTemp = sensor1.value;
|
||||||
} else if (sensor2.isValid()) {
|
} else if (sensor2.isValid() and sensor2.value != INVALID_TEMPERATURE) {
|
||||||
sensorTemp = sensor2.value;
|
sensorTemp = sensor2.value;
|
||||||
} else if (sensor3.isValid()) {
|
} else if (sensor3.isValid() and sensor3.value != INVALID_TEMPERATURE) {
|
||||||
sensorTemp = sensor3.value;
|
sensorTemp = sensor3.value;
|
||||||
} else {
|
} else {
|
||||||
if (heaterHandler.checkSwitchState(switchNr)) {
|
if (heaterHandler.checkSwitchState(switchNr)) {
|
||||||
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
|
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
|
||||||
|
sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl;
|
||||||
}
|
}
|
||||||
triggerEvent(NO_VALID_SENSOR_TEMPERATURE, switchNr);
|
triggerEvent(NO_VALID_SENSOR_TEMPERATURE, switchNr);
|
||||||
sensorTempAvailable = false;
|
sensorTempAvailable = false;
|
||||||
@ -1363,40 +1381,18 @@ void ThermalController::chooseOf4Sensors(heater::Switchers switchNr, const lp_fl
|
|||||||
const lp_float_t& sensor4) {
|
const lp_float_t& sensor4) {
|
||||||
sensorTempAvailable = true;
|
sensorTempAvailable = true;
|
||||||
|
|
||||||
if (sensor1.isValid()) {
|
if (sensor1.isValid() and sensor1.value != INVALID_TEMPERATURE) {
|
||||||
sensorTemp = sensor1.value;
|
sensorTemp = sensor1.value;
|
||||||
} else if (sensor2.isValid()) {
|
} else if (sensor2.isValid() and sensor2.value != INVALID_TEMPERATURE) {
|
||||||
sensorTemp = sensor2.value;
|
sensorTemp = sensor2.value;
|
||||||
} else if (sensor3.isValid()) {
|
} else if (sensor3.isValid() and sensor3.value != INVALID_TEMPERATURE) {
|
||||||
sensorTemp = sensor3.value;
|
sensorTemp = sensor3.value;
|
||||||
} else if (sensor4.isValid()) {
|
} else if (sensor4.isValid() and sensor4.value != INVALID_TEMPERATURE) {
|
||||||
sensorTemp = sensor4.value;
|
sensorTemp = sensor4.value;
|
||||||
} else {
|
} else {
|
||||||
if (heaterHandler.checkSwitchState(switchNr)) {
|
if (heaterHandler.checkSwitchState(switchNr)) {
|
||||||
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
|
heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF);
|
||||||
}
|
sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
triggerEvent(NO_VALID_SENSOR_TEMPERATURE, switchNr);
|
triggerEvent(NO_VALID_SENSOR_TEMPERATURE, switchNr);
|
||||||
sensorTempAvailable = false;
|
sensorTempAvailable = false;
|
||||||
|
@ -58,6 +58,11 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::TCS_CONTROLLER;
|
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_VALID_SENSOR_TEMPERATURE = MAKE_EVENT(0, severity::MEDIUM);
|
||||||
static constexpr Event NO_HEALTHY_HEATER_AVAILABLE = MAKE_EVENT(1, 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 DELAY = 500;
|
||||||
|
|
||||||
@ -143,6 +148,7 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
bool sensorTempAvailable = true;
|
bool sensorTempAvailable = true;
|
||||||
bool heaterAvailable = true;
|
bool heaterAvailable = true;
|
||||||
bool redSwitchNrInUse = false;
|
bool redSwitchNrInUse = false;
|
||||||
|
bool componentOverheating = false;
|
||||||
|
|
||||||
// Initial delay to make sure all pool variables have been initialized their owners
|
// Initial delay to make sure all pool variables have been initialized their owners
|
||||||
Countdown initialCountdown = Countdown(DELAY);
|
Countdown initialCountdown = Countdown(DELAY);
|
||||||
@ -169,9 +175,6 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
void chooseOf4Sensors(heater::Switchers switchNr, const lp_float_t& sensor1,
|
void chooseOf4Sensors(heater::Switchers switchNr, const lp_float_t& sensor1,
|
||||||
const lp_float_t& sensor2, const lp_float_t& sensor3,
|
const lp_float_t& sensor2, const lp_float_t& sensor3,
|
||||||
const lp_float_t& sensor4);
|
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 ctrlAcsBoard();
|
||||||
void ctrlMgt();
|
void ctrlMgt();
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
#include "devices/gpioIds.h"
|
|
||||||
#include "devices/powerSwitcherList.h"
|
#include "devices/powerSwitcherList.h"
|
||||||
|
|
||||||
HeaterHandler::HeaterHandler(object_id_t setObjectId_, GpioIF* gpioInterface_, HeaterHelper helper,
|
HeaterHandler::HeaterHandler(object_id_t setObjectId_, GpioIF* gpioInterface_, HeaterHelper helper,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user