| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "otautil/thermalutil.h" |
| |
| #include <dirent.h> |
| #include <stdio.h> |
| |
| #include <algorithm> |
| #include <string> |
| #include <vector> |
| |
| #include <android-base/file.h> |
| #include <android-base/logging.h> |
| #include <android-base/parseint.h> |
| #include <android-base/strings.h> |
| |
| static constexpr auto THERMAL_PREFIX = "/sys/class/thermal/"; |
| |
| static int thermal_filter(const dirent* de) { |
| if (android::base::StartsWith(de->d_name, "thermal_zone")) { |
| return 1; |
| } |
| return 0; |
| } |
| |
| static std::vector<std::string> InitThermalPaths() { |
| dirent** namelist; |
| int n = scandir(THERMAL_PREFIX, &namelist, thermal_filter, alphasort); |
| if (n == -1) { |
| PLOG(ERROR) << "Failed to scandir " << THERMAL_PREFIX; |
| return {}; |
| } |
| if (n == 0) { |
| LOG(ERROR) << "Failed to find CPU thermal info in " << THERMAL_PREFIX; |
| return {}; |
| } |
| |
| std::vector<std::string> thermal_paths; |
| while (n--) { |
| thermal_paths.push_back(THERMAL_PREFIX + std::string(namelist[n]->d_name) + "/temp"); |
| free(namelist[n]); |
| } |
| free(namelist); |
| return thermal_paths; |
| } |
| |
| int GetMaxValueFromThermalZone() { |
| static std::vector<std::string> thermal_paths = InitThermalPaths(); |
| int max_temperature = -1; |
| for (const auto& path : thermal_paths) { |
| std::string content; |
| if (!android::base::ReadFileToString(path, &content)) { |
| PLOG(WARNING) << "Failed to read " << path; |
| continue; |
| } |
| |
| int temperature; |
| if (!android::base::ParseInt(android::base::Trim(content), &temperature)) { |
| LOG(WARNING) << "Failed to parse integer in " << content; |
| continue; |
| } |
| max_temperature = std::max(temperature, max_temperature); |
| } |
| LOG(INFO) << "current maximum temperature: " << max_temperature; |
| return max_temperature; |
| } |