blob: e7b5c6109fafbdbfce90ff78627e0b5631a4828d [file]
#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_THERMAL_STEPWISE_CONTROLLER_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_THERMAL_STEPWISE_CONTROLLER_H_
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "absl/base/attributes.h"
#include "absl/base/nullability.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "thermal_config.pb.h"
#include "tlbmc/thermal/controller/algorithm/stepwise.h"
#include "tlbmc/thermal/controller/controller.h"
#include "tlbmc/thermal/zone_manager.h"
namespace milotic_tlbmc {
namespace thermal {
struct StepwiseControllerParameters {
std::string id;
ZoneManager* absl_nonnull zone_manager ABSL_REQUIRE_EXPLICIT_INIT;
std::unique_ptr<StepwiseThermalLoop> absl_nonnull stepwise_loop
ABSL_REQUIRE_EXPLICIT_INIT;
std::vector<std::string> input_sensors;
bool is_ceiling = false;
};
/**
* `StepwiseController` provides a connection between the thermal zone manager
* and the stepwise thermal loop. It will
* handle the sensor reading & fan output process, and the stepwise thermal loop
* calculations.
*
* There will be, and should be, exactly one configured stepwise thermal
* loop assigned to each stepwise controller object, which may be shared,
* however, by multiple controllers.
*
* This class is not thread-safe.
*
* This class is created based on `stepwisecontroller.*` files at
* https://source.corp.google.com/piper///depot/google3/third_party/openbmc_phosphor_pid_control/pid/
*/
class StepwiseController : public ThermalController {
public:
~StepwiseController() final = default;
static absl::StatusOr<std::unique_ptr<StepwiseController>> Create(
StepwiseControllerParameters params);
void ProcessThermalLoop() final;
double ProcessInput() final;
void ProcessOutput(double output) final;
std::string GetId() const final { return id_; }
bool IsFanController() const final { return false; }
bool IsSupportiveController() const final { return false; }
const std::vector<std::string>& GetAffectedControllerIds() const final {
return empty_affected_controller_ids_;
}
// Stepwise controller has no setpoint to be adjusted.
void AdjustSetpoint([[maybe_unused]] double offset) final {}
ZoneManager* GetZoneManager() const { return zone_owner_; }
StepwiseThermalLoop* GetStepwiseLoop() const { return stepwise_loop_.get(); }
void AddInputSensor(const std::string& input_sensor) {
input_sensors_.push_back(input_sensor);
}
const std::vector<std::string>& GetInputSensors() const {
return input_sensors_;
}
void SetIsCeiling(bool is_ceiling) { is_ceiling_ = is_ceiling; }
bool GetIsCeiling() const { return is_ceiling_; }
protected:
explicit StepwiseController(
absl::string_view id, ZoneManager* absl_nonnull zone_manager,
std::unique_ptr<StepwiseThermalLoop> absl_nonnull stepwise_loop,
std::vector<std::string> input_sensors, bool is_ceiling = false)
: ThermalController(),
id_(id),
zone_owner_(zone_manager),
stepwise_loop_(std::move(stepwise_loop)),
input_sensors_(std::move(input_sensors)),
is_ceiling_(is_ceiling) {}
private:
const std::string id_;
ZoneManager* zone_owner_;
std::unique_ptr<StepwiseThermalLoop> stepwise_loop_;
std::vector<std::string> input_sensors_;
bool is_ceiling_ = false;
// An empty vector to return by reference for `GetAffectedControllerIds`.
const std::vector<std::string> empty_affected_controller_ids_;
};
} // namespace thermal
} // namespace milotic_tlbmc
#endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_THERMAL_STEPWISE_CONTROLLER_H_