| #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 |