blob: 1151b1f7db1fa03f7cabb159f2671ac7404132f9 [file] [edit]
#include "tlbmc/thermal/sensor_info/sensor_info.h"
#include <cmath>
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "absl/synchronization/mutex.h"
#include "tlbmc/thermal/thermal_control_utils.h"
namespace milotic_tlbmc {
namespace thermal {
void SensorInfo::AddSensor(absl::string_view sensor_name,
const SensorMetadata& sensor_metadata) {
absl::MutexLock lock(mutex_);
sensor_name_to_readings_[sensor_name] =
SensorValues(kDefaultSensorValue, kDefaultSensorValue);
sensor_name_to_metadata_.insert_or_assign(sensor_name, sensor_metadata);
}
void SensorInfo::SetSensorValuesImpl(absl::string_view sensor_name,
double sensor_reading) {
if (!sensor_name_to_readings_.contains(sensor_name)) {
return;
}
auto& reading = sensor_name_to_readings_[sensor_name];
if (!std::isfinite(sensor_reading)) {
reading.unscaled_value = sensor_reading;
reading.scaled_value = sensor_reading;
return;
}
reading.unscaled_value = sensor_reading;
reading.scaled_value =
sensor_reading * pow(10, sensor_name_to_metadata_[sensor_name].scale);
}
void SensorInfo::SetSensorValues(absl::string_view sensor_name,
double sensor_reading,
ThreadSafetyMode thread_safety_mode) {
if (thread_safety_mode == ThreadSafetyMode::EnforceThreadSafety) {
absl::MutexLock lock(mutex_);
SetSensorValuesImpl(sensor_name, sensor_reading);
return;
}
SetSensorValuesImpl(sensor_name, sensor_reading);
}
SensorValues SensorInfo::GetSensorValues(absl::string_view sensor_name,
ThreadSafetyMode thread_safety_mode) {
if (thread_safety_mode == ThreadSafetyMode::EnforceThreadSafety) {
absl::MutexLock lock(mutex_);
auto it = sensor_name_to_readings_.find(sensor_name);
return it != sensor_name_to_readings_.end() ? it->second : SensorValues();
}
auto it = sensor_name_to_readings_.find(sensor_name);
return it != sensor_name_to_readings_.end() ? it->second : SensorValues();
}
absl::StatusOr<const SensorMetadata&> SensorInfo::GetSensorMetadata(
absl::string_view sensor_name) {
auto it = sensor_name_to_metadata_.find(sensor_name);
if (it == sensor_name_to_metadata_.end()) {
return absl::NotFoundError(
absl::StrCat("Sensor `", sensor_name, "` not found."));
}
return it->second;
}
bool SensorInfo::IsSensorMissingAcceptable(absl::string_view sensor_name) {
auto it = sensor_name_to_metadata_.find(sensor_name);
return it != sensor_name_to_metadata_.end() &&
it->second.is_missing_acceptable;
}
double SensorInfo::GetSensorScale(absl::string_view sensor_name) {
auto it = sensor_name_to_metadata_.find(sensor_name);
return it != sensor_name_to_metadata_.end() ? it->second.scale
: kDefaultSensorScale;
}
double SensorInfo::GetFailsafePercent(absl::string_view sensor_name) {
auto it = sensor_name_to_metadata_.find(sensor_name);
return it != sensor_name_to_metadata_.end() ? it->second.failsafe_percent
: kDefaultSensorFailsafePercent;
}
SensorThresholds SensorInfo::GetCriticalThresholds(
absl::string_view sensor_name) {
auto it = sensor_name_to_metadata_.find(sensor_name);
return it != sensor_name_to_metadata_.end() ? it->second.critical_thresholds
: SensorThresholds();
}
} // namespace thermal
} // namespace milotic_tlbmc