fsfw/src/fsfw/thermal/ThermalModule.h

95 lines
2.4 KiB
C
Raw Normal View History

2020-12-03 18:32:32 +01:00
#ifndef FSFW_THERMAL_THERMALMODULE_H_
#define FSFW_THERMAL_THERMALMODULE_H_
2022-02-02 10:29:30 +01:00
#include <list>
2020-12-03 18:32:32 +01:00
#include "../datapoollocal/LocalPoolDataSetBase.h"
#include "../datapoollocal/LocalPoolVariable.h"
#include "../devicehandlers/HealthDevice.h"
#include "../events/EventReportingProxyIF.h"
2022-02-02 10:29:30 +01:00
#include "RedundantHeater.h"
#include "ThermalModuleIF.h"
#include "tcsDefinitions.h"
2020-12-03 18:32:32 +01:00
class PowerSwitchIF;
2020-12-03 18:32:32 +01:00
/**
* @brief Allows creation of different thermal control domains within a system.
*/
2022-02-02 10:29:30 +01:00
class ThermalModule : public ThermalModuleIF {
friend class ThermalController;
public:
struct Parameters {
float heaterOn;
float hysteresis;
};
2022-02-02 10:29:30 +01:00
ThermalModule(gp_id_t moduleTemperaturePoolId, gp_id_t currentStatePoolId,
gp_id_t targetStatePoolId, LocalPoolDataSetBase *dataSet, Parameters parameters,
RedundantHeater::Parameters heaterParameters);
2022-02-02 10:29:30 +01:00
ThermalModule(gp_id_t moduleTemperaturePoolId, LocalPoolDataSetBase *dataSet);
2022-02-02 10:29:30 +01:00
virtual ~ThermalModule();
2022-02-02 10:29:30 +01:00
void performOperation(uint8_t opCode);
2022-02-02 10:29:30 +01:00
void performMode(Strategy strategy);
2022-02-02 10:29:30 +01:00
float getTemperature();
2022-02-02 10:29:30 +01:00
void registerSensor(AbstractTemperatureSensor *sensor);
2022-02-02 10:29:30 +01:00
void registerComponent(ThermalComponentIF *component, ThermalComponentIF::Priority priority);
2022-02-02 10:29:30 +01:00
ThermalComponentIF *findComponent(object_id_t objectId);
2022-02-02 10:29:30 +01:00
void initialize(PowerSwitchIF *powerSwitch);
2022-02-02 10:29:30 +01:00
void setHeating(bool on);
2022-02-02 10:29:30 +01:00
virtual void setOutputInvalid();
2022-02-02 10:29:30 +01:00
protected:
enum Informee { ALL, SAFE, NONE };
2022-02-02 10:29:30 +01:00
struct ComponentData {
ThermalComponentIF *component;
ThermalComponentIF::Priority priority;
ThermalComponentIF::HeaterRequest request;
};
2022-02-02 10:29:30 +01:00
Strategy oldStrategy;
2022-02-02 10:29:30 +01:00
float survivalTargetTemp = 0.0;
2022-02-02 10:29:30 +01:00
float targetTemp = 0.0;
2022-02-02 10:29:30 +01:00
bool heating = false;
2022-02-02 10:29:30 +01:00
Parameters parameters;
2022-02-02 10:29:30 +01:00
lp_var_t<float> moduleTemperature;
2022-02-02 10:29:30 +01:00
RedundantHeater *heater = nullptr;
2022-02-02 10:29:30 +01:00
lp_var_t<int8_t> currentState;
lp_var_t<int8_t> targetState;
2022-02-02 10:29:30 +01:00
std::list<AbstractTemperatureSensor *> sensors;
std::list<ComponentData> components;
2022-02-02 10:29:30 +01:00
void calculateTemperature();
2022-02-02 10:29:30 +01:00
ThermalComponentIF::HeaterRequest letComponentsPerformAndDeciceIfWeNeedToHeat(bool safeOnly);
2022-02-02 10:29:30 +01:00
void informComponentsAboutHeaterState(bool heaterIsOn, Informee whomToInform);
2022-02-02 10:29:30 +01:00
bool calculateModuleHeaterRequestAndSetModuleStatus(Strategy strategy);
2022-02-02 10:29:30 +01:00
void updateTargetTemperatures(ThermalComponentIF *component, bool isSafe);
};
2020-12-03 18:32:32 +01:00
#endif /* FSFW_THERMAL_THERMALMODULE_H_ */