blob: 97e2abe47fcd89e3f02c6d580c24333c1e39ad44 [file]
#include "tlbmc/thermal/controller_info/controller_info.h"
#include <string>
#include <vector>
#include "absl/base/nullability.h"
#include "absl/strings/string_view.h"
#include "absl/synchronization/mutex.h"
#include "tlbmc/thermal/controller/controller.h"
#include "tlbmc/thermal/thermal_control_utils.h"
namespace milotic_tlbmc {
namespace thermal {
void ControllerInfo::AddThermalController(
absl::string_view controller_name,
ThermalController* absl_nonnull controller, bool is_enabled) {
{
absl::MutexLock lock(name_to_info_mutex_);
auto& thermal_controller_info = name_to_info_[controller_name];
thermal_controller_info.thermal_controller = controller;
thermal_controller_info.is_enabled = is_enabled;
}
{
absl::MutexLock lock(controllers_mutex_);
controller_names_.push_back(std::string(controller_name));
controllers_.push_back(controller);
}
}
void ControllerInfo::SetThermalControllerEnabled(
absl::string_view controller_name, bool is_enabled) {
absl::MutexLock lock(name_to_info_mutex_);
if (!name_to_info_.contains(controller_name)) {
return;
}
name_to_info_[controller_name].is_enabled = is_enabled;
}
void ControllerInfo::SetThermalControllerSetpoint(
absl::string_view controller_name, double setpoint) {
absl::MutexLock lock(name_to_info_mutex_);
if (!name_to_info_.contains(controller_name)) {
return;
}
name_to_info_[controller_name].setpoint = setpoint;
}
double ControllerInfo::GetThermalControllerSetpoint(
absl::string_view controller_name) {
absl::MutexLock lock(name_to_info_mutex_);
if (!name_to_info_.contains(controller_name)) {
return kDefaultSetpointValue;
}
return name_to_info_[controller_name].setpoint;
}
std::vector<std::string> ControllerInfo::GetControllerNames(
ThreadSafetyMode thread_safety_mode) {
if (thread_safety_mode == ThreadSafetyMode::EnforceThreadSafety) {
absl::MutexLock lock(controllers_mutex_);
return controller_names_;
}
return controller_names_;
}
bool ControllerInfo::IsControllerEnabled(absl::string_view controller_name,
ThreadSafetyMode thread_safety_mode) {
if (thread_safety_mode == ThreadSafetyMode::EnforceThreadSafety) {
absl::MutexLock lock(name_to_info_mutex_);
auto it = name_to_info_.find(controller_name);
return it != name_to_info_.end() ? it->second.is_enabled : false;
}
auto it = name_to_info_.find(controller_name);
return it != name_to_info_.end() ? it->second.is_enabled : false;
}
std::vector<ThermalController*> ControllerInfo::GetAllThermalControllers(
ThreadSafetyMode thread_safety_mode) {
if (thread_safety_mode == ThreadSafetyMode::EnforceThreadSafety) {
absl::MutexLock lock(controllers_mutex_);
std::vector<ThermalController*> thermal_controllers;
for (ThermalController* controller : controllers_) {
if (controller != nullptr && !controller->IsFanController()) {
thermal_controllers.push_back(controller);
}
}
return thermal_controllers;
}
std::vector<ThermalController*> thermal_controllers;
for (ThermalController* controller : controllers_) {
if (controller != nullptr && !controller->IsFanController()) {
thermal_controllers.push_back(controller);
}
}
return thermal_controllers;
}
std::vector<ThermalController*> ControllerInfo::GetAllFanControllers(
ThreadSafetyMode thread_safety_mode) {
if (thread_safety_mode == ThreadSafetyMode::EnforceThreadSafety) {
absl::MutexLock lock(controllers_mutex_);
std::vector<ThermalController*> fan_controllers;
for (ThermalController* controller : controllers_) {
if (controller != nullptr && controller->IsFanController()) {
fan_controllers.push_back(controller);
}
}
return fan_controllers;
}
std::vector<ThermalController*> fan_controllers;
for (ThermalController* controller : controllers_) {
if (controller != nullptr && controller->IsFanController()) {
fan_controllers.push_back(controller);
}
}
return fan_controllers;
}
ThermalController* ControllerInfo::GetThermalController(
absl::string_view controller_name, ThreadSafetyMode thread_safety_mode) {
if (thread_safety_mode == ThreadSafetyMode::EnforceThreadSafety) {
absl::MutexLock lock(name_to_info_mutex_);
auto it = name_to_info_.find(controller_name);
return it != name_to_info_.end() ? it->second.thermal_controller : nullptr;
}
auto it = name_to_info_.find(controller_name);
return it != name_to_info_.end() ? it->second.thermal_controller : nullptr;
}
void ControllerInfo::Clear() {
absl::MutexLock lock(name_to_info_mutex_);
for (auto& [name, controller_info] : name_to_info_) {
controller_info.setpoint = kDefaultSetpointValue;
}
}
} // namespace thermal
} // namespace milotic_tlbmc