1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "thermal_simulation_node.h" 17094332d3Sopenharmony_ci 18094332d3Sopenharmony_ci#include <iostream> 19094332d3Sopenharmony_ci#include <cstring> 20094332d3Sopenharmony_ci#include <dirent.h> 21094332d3Sopenharmony_ci#include <fcntl.h> 22094332d3Sopenharmony_ci#include <unistd.h> 23094332d3Sopenharmony_ci#include <sys/stat.h> 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_ci#include "hdf_base.h" 26094332d3Sopenharmony_ci#include "securec.h" 27094332d3Sopenharmony_ci#include "thermal_log.h" 28094332d3Sopenharmony_ci 29094332d3Sopenharmony_cinamespace OHOS { 30094332d3Sopenharmony_cinamespace HDI { 31094332d3Sopenharmony_cinamespace Thermal { 32094332d3Sopenharmony_cinamespace V1_1 { 33094332d3Sopenharmony_cinamespace { 34094332d3Sopenharmony_ciconst int32_t MAX_PATH = 256; 35094332d3Sopenharmony_ciconst int32_t ARG_0 = 0; 36094332d3Sopenharmony_ciconst int32_t ARG_1 = 1; 37094332d3Sopenharmony_ciconst int32_t ARG_2 = 2; 38094332d3Sopenharmony_ciconst int32_t ARG_3 = 3; 39094332d3Sopenharmony_ciconst int32_t ARG_4 = 4; 40094332d3Sopenharmony_ciconst int32_t NUM_ZERO = 0; 41094332d3Sopenharmony_ciconst std::string THERMAL_DIR = "/data/service/el0/thermal/sensor/"; 42094332d3Sopenharmony_ciconst std::string THERMAL_NODE_DIR = "/data/service/el0/thermal/sensor/%s"; 43094332d3Sopenharmony_ciconst std::string THERMAL_TYPE_DIR = "/data/service/el0/thermal/sensor/%s/type"; 44094332d3Sopenharmony_ciconst std::string THERMAL_TEMP_DIR = "/data/service/el0/thermal/sensor/%s/temp"; 45094332d3Sopenharmony_ciconst std::string MITIGATION_DIR = "/data/service/el0/thermal/cooling"; 46094332d3Sopenharmony_ciconst std::string MITIGATION_NODE_DIR = "/data/service/el0/thermal/cooling/%s"; 47094332d3Sopenharmony_ciconst std::string MITIGATION_NODE_FILE = "%s/%s"; 48094332d3Sopenharmony_ci} 49094332d3Sopenharmony_ciint32_t ThermalSimulationNode::NodeInit() 50094332d3Sopenharmony_ci{ 51094332d3Sopenharmony_ci int32_t ret = AddSensorTypeTemp(); 52094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 53094332d3Sopenharmony_ci return ret; 54094332d3Sopenharmony_ci } 55094332d3Sopenharmony_ci ret = AddFanSensorNode(); 56094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 57094332d3Sopenharmony_ci return ret; 58094332d3Sopenharmony_ci } 59094332d3Sopenharmony_ci ret = AddMitigationDevice(); 60094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 61094332d3Sopenharmony_ci return ret; 62094332d3Sopenharmony_ci } 63094332d3Sopenharmony_ci return HDF_SUCCESS; 64094332d3Sopenharmony_ci} 65094332d3Sopenharmony_ci 66094332d3Sopenharmony_ciint32_t ThermalSimulationNode::CreateNodeDir(std::string dir) 67094332d3Sopenharmony_ci{ 68094332d3Sopenharmony_ci if (access(dir.c_str(), 0) != NUM_ZERO) { 69094332d3Sopenharmony_ci int32_t flag = mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH| S_IXOTH); 70094332d3Sopenharmony_ci if (flag == NUM_ZERO) { 71094332d3Sopenharmony_ci THERMAL_HILOGI(COMP_HDI, "Create directory successfully."); 72094332d3Sopenharmony_ci } else { 73094332d3Sopenharmony_ci THERMAL_HILOGE(COMP_HDI, "Fail to create directory, flag: %{public}d", flag); 74094332d3Sopenharmony_ci return flag; 75094332d3Sopenharmony_ci } 76094332d3Sopenharmony_ci } else { 77094332d3Sopenharmony_ci THERMAL_HILOGD(COMP_HDI, "This directory already exists."); 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci return HDF_SUCCESS; 80094332d3Sopenharmony_ci} 81094332d3Sopenharmony_ci 82094332d3Sopenharmony_ciint32_t ThermalSimulationNode::CreateNodeFile(std::string filePath) 83094332d3Sopenharmony_ci{ 84094332d3Sopenharmony_ci if (access(filePath.c_str(), 0) != 0) { 85094332d3Sopenharmony_ci int32_t fd = open(filePath.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP| S_IROTH); 86094332d3Sopenharmony_ci if (fd < NUM_ZERO) { 87094332d3Sopenharmony_ci THERMAL_HILOGE(COMP_HDI, "open failed to file."); 88094332d3Sopenharmony_ci return fd; 89094332d3Sopenharmony_ci } 90094332d3Sopenharmony_ci close(fd); 91094332d3Sopenharmony_ci } else { 92094332d3Sopenharmony_ci THERMAL_HILOGD(COMP_HDI, "the file already exists."); 93094332d3Sopenharmony_ci } 94094332d3Sopenharmony_ci return HDF_SUCCESS; 95094332d3Sopenharmony_ci} 96094332d3Sopenharmony_ci 97094332d3Sopenharmony_ciint32_t ThermalSimulationNode::AddSensorTypeTemp() 98094332d3Sopenharmony_ci{ 99094332d3Sopenharmony_ci std::vector<std::string> vFile = {"type", "temp"}; 100094332d3Sopenharmony_ci std::map<std::string, int32_t> sensor; 101094332d3Sopenharmony_ci char nodeBuf[MAX_PATH] = {0}; 102094332d3Sopenharmony_ci char fileBuf[MAX_PATH] = {0}; 103094332d3Sopenharmony_ci char typeBuf[MAX_PATH] = {0}; 104094332d3Sopenharmony_ci char tempBuf[MAX_PATH] = {0}; 105094332d3Sopenharmony_ci sensor["battery"] = 0; 106094332d3Sopenharmony_ci sensor["charger"] = 0; 107094332d3Sopenharmony_ci sensor["pa"] = 0; 108094332d3Sopenharmony_ci sensor["ap"] = 0; 109094332d3Sopenharmony_ci sensor["ambient"] = 0; 110094332d3Sopenharmony_ci sensor["cpu"] = 0; 111094332d3Sopenharmony_ci sensor["soc"] = 0; 112094332d3Sopenharmony_ci sensor["shell"] = 0; 113094332d3Sopenharmony_ci sensor["gpu"] = 0; 114094332d3Sopenharmony_ci CreateNodeDir(THERMAL_DIR); 115094332d3Sopenharmony_ci for (auto dir : sensor) { 116094332d3Sopenharmony_ci int32_t ret = snprintf_s(nodeBuf, MAX_PATH, sizeof(nodeBuf) - ARG_1, 117094332d3Sopenharmony_ci THERMAL_NODE_DIR.c_str(), dir.first.c_str()); 118094332d3Sopenharmony_ci if (ret < EOK) { 119094332d3Sopenharmony_ci return HDF_FAILURE; 120094332d3Sopenharmony_ci } 121094332d3Sopenharmony_ci THERMAL_HILOGI(COMP_HDI, "node name: %{public}s", nodeBuf); 122094332d3Sopenharmony_ci CreateNodeDir(static_cast<std::string>(nodeBuf)); 123094332d3Sopenharmony_ci for (const auto& file : vFile) { 124094332d3Sopenharmony_ci ret = snprintf_s(fileBuf, MAX_PATH, sizeof(fileBuf) - ARG_1, "%s/%s", nodeBuf, file.c_str()); 125094332d3Sopenharmony_ci if (ret < EOK) { 126094332d3Sopenharmony_ci return HDF_FAILURE; 127094332d3Sopenharmony_ci } 128094332d3Sopenharmony_ci THERMAL_HILOGI(COMP_HDI, "file name: %{public}s", fileBuf); 129094332d3Sopenharmony_ci CreateNodeFile(static_cast<std::string>(fileBuf)); 130094332d3Sopenharmony_ci } 131094332d3Sopenharmony_ci ret = snprintf_s(typeBuf, MAX_PATH, sizeof(typeBuf) - ARG_1, THERMAL_TYPE_DIR.c_str(), dir.first.c_str()); 132094332d3Sopenharmony_ci if (ret < EOK) { 133094332d3Sopenharmony_ci return HDF_FAILURE; 134094332d3Sopenharmony_ci } 135094332d3Sopenharmony_ci std::string type = dir.first; 136094332d3Sopenharmony_ci WriteFile(typeBuf, type, type.length()); 137094332d3Sopenharmony_ci ret = snprintf_s(tempBuf, MAX_PATH, sizeof(tempBuf) - ARG_1, THERMAL_TEMP_DIR.c_str(), dir.first.c_str()); 138094332d3Sopenharmony_ci if (ret < EOK) { 139094332d3Sopenharmony_ci return HDF_FAILURE; 140094332d3Sopenharmony_ci } 141094332d3Sopenharmony_ci std::string temp = std::to_string(dir.second); 142094332d3Sopenharmony_ci WriteFile(tempBuf, temp, temp.length()); 143094332d3Sopenharmony_ci } 144094332d3Sopenharmony_ci return HDF_SUCCESS; 145094332d3Sopenharmony_ci} 146094332d3Sopenharmony_ci 147094332d3Sopenharmony_ciint32_t ThermalSimulationNode::AddFanSensorNode() 148094332d3Sopenharmony_ci{ 149094332d3Sopenharmony_ci char nodePath[MAX_PATH] = {0}; 150094332d3Sopenharmony_ci char typePath[MAX_PATH] = {0}; 151094332d3Sopenharmony_ci char speedPath[MAX_PATH] = {0}; 152094332d3Sopenharmony_ci 153094332d3Sopenharmony_ci int32_t ret = snprintf_s(nodePath, MAX_PATH, sizeof(nodePath) - ARG_1, 154094332d3Sopenharmony_ci THERMAL_NODE_DIR.c_str(), "fan"); 155094332d3Sopenharmony_ci if (ret < EOK) { 156094332d3Sopenharmony_ci return HDF_FAILURE; 157094332d3Sopenharmony_ci } 158094332d3Sopenharmony_ci CreateNodeDir(static_cast<std::string>(nodePath)); 159094332d3Sopenharmony_ci 160094332d3Sopenharmony_ci ret = snprintf_s(typePath, MAX_PATH, sizeof(typePath) - ARG_1, "%s/%s", nodePath, "type"); 161094332d3Sopenharmony_ci if (ret < EOK) { 162094332d3Sopenharmony_ci return HDF_FAILURE; 163094332d3Sopenharmony_ci } 164094332d3Sopenharmony_ci CreateNodeFile(static_cast<std::string>(typePath)); 165094332d3Sopenharmony_ci std::string type = "fan"; 166094332d3Sopenharmony_ci WriteFile(typePath, type, type.length()); 167094332d3Sopenharmony_ci 168094332d3Sopenharmony_ci ret = snprintf_s(speedPath, MAX_PATH, sizeof(speedPath) - ARG_1, "%s/%s", nodePath, "speed"); 169094332d3Sopenharmony_ci if (ret < EOK) { 170094332d3Sopenharmony_ci return HDF_FAILURE; 171094332d3Sopenharmony_ci } 172094332d3Sopenharmony_ci CreateNodeFile(static_cast<std::string>(speedPath)); 173094332d3Sopenharmony_ci std::string speed = "0"; 174094332d3Sopenharmony_ci WriteFile(speedPath, speed, speed.length()); 175094332d3Sopenharmony_ci 176094332d3Sopenharmony_ci return HDF_SUCCESS; 177094332d3Sopenharmony_ci} 178094332d3Sopenharmony_ci 179094332d3Sopenharmony_ciint32_t ThermalSimulationNode::AddMitigationDevice() 180094332d3Sopenharmony_ci{ 181094332d3Sopenharmony_ci int32_t ret; 182094332d3Sopenharmony_ci std::string sensor[] = {"cpu", "charger", "gpu", "battery"}; 183094332d3Sopenharmony_ci std::vector<std::string> vSensor(sensor, sensor + ARG_4); 184094332d3Sopenharmony_ci std::string cpu = "freq"; 185094332d3Sopenharmony_ci std::string charger = "current"; 186094332d3Sopenharmony_ci std::string gpu = "freq"; 187094332d3Sopenharmony_ci std::string battery[] = {"current", "voltage"}; 188094332d3Sopenharmony_ci std::vector<std::string> vFile; 189094332d3Sopenharmony_ci char nodeBuf[MAX_PATH] = {0}; 190094332d3Sopenharmony_ci char fileBuf[MAX_PATH] = {0}; 191094332d3Sopenharmony_ci int32_t temp = 0; 192094332d3Sopenharmony_ci std::string sTemp = std::to_string(temp); 193094332d3Sopenharmony_ci CreateNodeDir(MITIGATION_DIR); 194094332d3Sopenharmony_ci for (auto dir : vSensor) { 195094332d3Sopenharmony_ci ret = snprintf_s(nodeBuf, MAX_PATH, sizeof(nodeBuf) - ARG_1, MITIGATION_NODE_DIR.c_str(), dir.c_str()); 196094332d3Sopenharmony_ci if (ret < EOK) return HDF_FAILURE; 197094332d3Sopenharmony_ci CreateNodeDir(static_cast<std::string>(nodeBuf)); 198094332d3Sopenharmony_ci vFile.push_back(nodeBuf); 199094332d3Sopenharmony_ci } 200094332d3Sopenharmony_ci ret = snprintf_s(fileBuf, MAX_PATH, sizeof(fileBuf) - ARG_1, MITIGATION_NODE_FILE.c_str(), vFile[ARG_0].c_str(), 201094332d3Sopenharmony_ci cpu.c_str()); 202094332d3Sopenharmony_ci if (ret < EOK) return HDF_FAILURE; 203094332d3Sopenharmony_ci CreateNodeFile(static_cast<std::string>(fileBuf)); 204094332d3Sopenharmony_ci WriteFile(fileBuf, sTemp, sTemp.length()); 205094332d3Sopenharmony_ci ret = snprintf_s(fileBuf, MAX_PATH, sizeof(fileBuf) - ARG_1, MITIGATION_NODE_FILE.c_str(), vFile[ARG_1].c_str(), 206094332d3Sopenharmony_ci charger.c_str()); 207094332d3Sopenharmony_ci if (ret < EOK) return HDF_FAILURE; 208094332d3Sopenharmony_ci CreateNodeFile(static_cast<std::string>(fileBuf)); 209094332d3Sopenharmony_ci WriteFile(fileBuf, sTemp, sTemp.length()); 210094332d3Sopenharmony_ci ret = snprintf_s(fileBuf, MAX_PATH, sizeof(fileBuf) - ARG_1, MITIGATION_NODE_FILE.c_str(), vFile[ARG_2].c_str(), 211094332d3Sopenharmony_ci gpu.c_str()); 212094332d3Sopenharmony_ci if (ret < EOK) { 213094332d3Sopenharmony_ci return HDF_FAILURE; 214094332d3Sopenharmony_ci } 215094332d3Sopenharmony_ci CreateNodeFile(static_cast<std::string>(fileBuf)); 216094332d3Sopenharmony_ci WriteFile(fileBuf, sTemp, sTemp.length()); 217094332d3Sopenharmony_ci std::vector<std::string> vBattery(battery, battery + ARG_2); 218094332d3Sopenharmony_ci for (auto b : vBattery) { 219094332d3Sopenharmony_ci ret = snprintf_s(fileBuf, MAX_PATH, sizeof(fileBuf) - ARG_1, MITIGATION_NODE_FILE.c_str(), 220094332d3Sopenharmony_ci vFile[ARG_3].c_str(), b.c_str()); 221094332d3Sopenharmony_ci if (ret < EOK) { 222094332d3Sopenharmony_ci return HDF_FAILURE; 223094332d3Sopenharmony_ci } 224094332d3Sopenharmony_ci CreateNodeFile(static_cast<std::string>(fileBuf)); 225094332d3Sopenharmony_ci WriteFile(fileBuf, sTemp, sTemp.length()); 226094332d3Sopenharmony_ci } 227094332d3Sopenharmony_ci return HDF_SUCCESS; 228094332d3Sopenharmony_ci} 229094332d3Sopenharmony_ci 230094332d3Sopenharmony_ciint32_t ThermalSimulationNode::WriteFile(std::string path, std::string buf, size_t size) 231094332d3Sopenharmony_ci{ 232094332d3Sopenharmony_ci int32_t fd = open(path.c_str(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 233094332d3Sopenharmony_ci if (fd < NUM_ZERO) { 234094332d3Sopenharmony_ci THERMAL_HILOGE(COMP_HDI, "open failed to file."); 235094332d3Sopenharmony_ci } 236094332d3Sopenharmony_ci write(fd, buf.c_str(), size); 237094332d3Sopenharmony_ci close(fd); 238094332d3Sopenharmony_ci return HDF_SUCCESS; 239094332d3Sopenharmony_ci} 240094332d3Sopenharmony_ci} // V1_1 241094332d3Sopenharmony_ci} // Thermal 242094332d3Sopenharmony_ci} // HDI 243094332d3Sopenharmony_ci} // OHOS 244