| // Copyright 2017 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "thd/source/ectool_temps_source.h" |
| |
| #include <memory> |
| #include <string> |
| |
| #include <base/logging.h> |
| #include <base/process/launch.h> |
| #include <base/strings/string_number_conversions.h> |
| #include <base/strings/string_util.h> |
| |
| namespace thd { |
| |
| namespace { |
| |
| // Command line tool to interact with the EC. The 1st argument. |
| const char kEctoolCmd[] = "ectool"; |
| |
| // Option to read temperature values using ectool. The 2nd argument. |
| const char kTempsArg[] = "temps"; |
| |
| // Ectool temps x outputs this prefix followed by the actual temperature. |
| // This consant is used to parse out the number properly. |
| const char kOutputPrefix[] = "Reading temperature..."; |
| |
| // Output temperature values are in Kelvin, so they should always be |
| // 3 characters long. |
| const int kOutputTempLength = 3; |
| |
| int64_t KelvinToCelcius(int64_t ktemp) { |
| return ktemp - 273; |
| } |
| |
| } // namespace |
| |
| EctoolTempsSource::EctoolTempsSource(int sensor_id) |
| : cmd_args_({kEctoolCmd, kTempsArg, std::to_string(sensor_id)}) {} |
| |
| EctoolTempsSource::~EctoolTempsSource() {} |
| |
| bool EctoolTempsSource::ReadValue(int64_t* value) { |
| std::string cmd_output; |
| if (!base::GetAppOutput(cmd_args_, &cmd_output)) { |
| std::string cmd_line = base::JoinString(cmd_args_, " "); |
| PLOG(ERROR) << "Running the command \"" << cmd_line << "\" failed."; |
| return false; |
| } |
| if (!base::StartsWith(cmd_output, kOutputPrefix, |
| base::CompareCase::SENSITIVE)) { |
| LOG(ERROR) |
| << "Ectool temps source was unable to parse the command line output." |
| << "Output: " << cmd_output << "."; |
| return false; |
| } |
| std::string value_str = |
| cmd_output.substr(strlen(kOutputPrefix), kOutputTempLength); |
| int64_t temperature_in_kelvin = -1; |
| if (!base::StringToInt64(value_str, &temperature_in_kelvin)) { |
| LOG(ERROR) << "Unable to parse an integer from the output \"" << value_str |
| << "\"."; |
| return false; |
| } |
| *value = KelvinToCelcius(temperature_in_kelvin); |
| return true; |
| } |
| |
| } // namespace thd |