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 "power_supply_provider.h" 17094332d3Sopenharmony_ci#include <dirent.h> 18094332d3Sopenharmony_ci#include <fcntl.h> 19094332d3Sopenharmony_ci#include <fstream> 20094332d3Sopenharmony_ci#include <securec.h> 21094332d3Sopenharmony_ci#include <sys/stat.h> 22094332d3Sopenharmony_ci#include <sys/types.h> 23094332d3Sopenharmony_ci#include <unistd.h> 24094332d3Sopenharmony_ci#include "battery_log.h" 25094332d3Sopenharmony_ci#include "battery_config.h" 26094332d3Sopenharmony_ci#include "osal_mem.h" 27094332d3Sopenharmony_ci 28094332d3Sopenharmony_cinamespace OHOS { 29094332d3Sopenharmony_cinamespace HDI { 30094332d3Sopenharmony_cinamespace Battery { 31094332d3Sopenharmony_cinamespace V2_0 { 32094332d3Sopenharmony_cinamespace { 33094332d3Sopenharmony_ciconstexpr int32_t MAX_SYSFS_SIZE = 64; 34094332d3Sopenharmony_ciconstexpr int32_t MAX_BUFF_SIZE = 128; 35094332d3Sopenharmony_ciconstexpr int32_t INVALID_BATT_INT_VALUE = -1; 36094332d3Sopenharmony_ciconstexpr int32_t STR_TO_LONG_LEN = 10; 37094332d3Sopenharmony_ciconstexpr int32_t UVOL_TO_MVOL = 1000; 38094332d3Sopenharmony_ciconstexpr int32_t MKDIR_WAIT_TIME = 1; 39094332d3Sopenharmony_ciconstexpr int32_t NUM_ZERO = 0; 40094332d3Sopenharmony_ciconst std::string POWER_SUPPLY_BASE_PATH = "/sys/class/power_supply"; 41094332d3Sopenharmony_ciconst std::string MOCK_POWER_SUPPLY_BASE_PATH = "/data/service/el0/battery"; 42094332d3Sopenharmony_ciconst std::string POWER_SUPPLY_BATTERY = "Battery"; 43094332d3Sopenharmony_ciconst std::string BATTERY_KEY_CAPACITY = "POWER_SUPPLY_CAPACITY="; 44094332d3Sopenharmony_ciconst std::string BATTERY_KEY_VOLTAGE = "POWER_SUPPLY_VOLTAGE_NOW="; 45094332d3Sopenharmony_ciconst std::string BATTERY_KEY_TEMPERATURE = "POWER_SUPPLY_TEMP="; 46094332d3Sopenharmony_ciconst std::string BATTERY_KEY_HEALTH = "POWER_SUPPLY_HEALTH="; 47094332d3Sopenharmony_ciconst std::string BATTERY_KEY_CHARGE_STATUS = "POWER_SUPPLY_STATUS="; 48094332d3Sopenharmony_ciconst std::string BATTERY_KEY_PRESENT = "POWER_SUPPLY_PRESENT="; 49094332d3Sopenharmony_ciconst std::string BATTERY_KEY_TECHNOLOGY = "POWER_SUPPLY_TECHNOLOGY="; 50094332d3Sopenharmony_ciconst std::string BATTERY_KEY_CHARGE_COUNTER = "POWER_SUPPLY_CHARGE_COUNTER="; 51094332d3Sopenharmony_ciconst std::string BATTERY_KEY_TOTAL_ENERGY = "POWER_SUPPLY_TOTAL_ENERGY="; 52094332d3Sopenharmony_ciconst std::string BATTERY_KEY_REMAIN_ENERGY = "POWER_SUPPLY_REMAIN_ENERGY="; 53094332d3Sopenharmony_ciconst std::string BATTERY_KEY_CURRENT_AVERAGE = "POWER_SUPPLY_CURRENT_AVERAGE="; 54094332d3Sopenharmony_ciconst std::string BATTERY_KEY_CURRENT_NOW = "POWER_SUPPLY_CURRENT_NOW="; 55094332d3Sopenharmony_ciconst std::string INVALID_STRING_VALUE = "invalid"; 56094332d3Sopenharmony_ciconst std::string BATTERY_NODE_PATH = "battery"; 57094332d3Sopenharmony_ci} 58094332d3Sopenharmony_ci 59094332d3Sopenharmony_ciBatterydInfo g_batteryInfo; 60094332d3Sopenharmony_ci 61094332d3Sopenharmony_cistruct StringEnumMap { 62094332d3Sopenharmony_ci const char* str; 63094332d3Sopenharmony_ci int32_t enumVal; 64094332d3Sopenharmony_ci}; 65094332d3Sopenharmony_ci 66094332d3Sopenharmony_cistruct BatteryAssigner { 67094332d3Sopenharmony_ci const char* prefix; 68094332d3Sopenharmony_ci const size_t prefixLen; 69094332d3Sopenharmony_ci void (*Assigner)(const char*, struct BatterydInfo*); 70094332d3Sopenharmony_ci}; 71094332d3Sopenharmony_ci 72094332d3Sopenharmony_ciPowerSupplyProvider::PowerSupplyProvider() 73094332d3Sopenharmony_ci{ 74094332d3Sopenharmony_ci path_ = POWER_SUPPLY_BASE_PATH; 75094332d3Sopenharmony_ci index_ = 0; 76094332d3Sopenharmony_ci} 77094332d3Sopenharmony_ci 78094332d3Sopenharmony_ciPowerSupplyProvider::~PowerSupplyProvider() 79094332d3Sopenharmony_ci{ 80094332d3Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 81094332d3Sopenharmony_ci for (auto it = nodeCacheFiles_.begin(); it != nodeCacheFiles_.end();) { 82094332d3Sopenharmony_ci int32_t fd = it->second; 83094332d3Sopenharmony_ci close(fd); 84094332d3Sopenharmony_ci it++; 85094332d3Sopenharmony_ci } 86094332d3Sopenharmony_ci nodeCacheFiles_.clear(); 87094332d3Sopenharmony_ci} 88094332d3Sopenharmony_ci 89094332d3Sopenharmony_ciinline int32_t PowerSupplyProvider::ParseInt(const char* str) 90094332d3Sopenharmony_ci{ 91094332d3Sopenharmony_ci return static_cast<int32_t>(strtol(str, nullptr, STR_TO_LONG_LEN)); 92094332d3Sopenharmony_ci} 93094332d3Sopenharmony_ci 94094332d3Sopenharmony_ciinline void PowerSupplyProvider::Trim(char* str) 95094332d3Sopenharmony_ci{ 96094332d3Sopenharmony_ci if (str == nullptr) { 97094332d3Sopenharmony_ci return; 98094332d3Sopenharmony_ci } 99094332d3Sopenharmony_ci 100094332d3Sopenharmony_ci size_t strc = strcspn(str, "\n"); 101094332d3Sopenharmony_ci if (strc >= strlen(str)) { 102094332d3Sopenharmony_ci return; 103094332d3Sopenharmony_ci } 104094332d3Sopenharmony_ci 105094332d3Sopenharmony_ci str[strc] = 0; 106094332d3Sopenharmony_ci} 107094332d3Sopenharmony_ci 108094332d3Sopenharmony_ciinline void PowerSupplyProvider::CapacityAssigner(const char* str, struct BatterydInfo* info) 109094332d3Sopenharmony_ci{ 110094332d3Sopenharmony_ci info->capacity_ = ParseInt(str); // default in percent format 111094332d3Sopenharmony_ci} 112094332d3Sopenharmony_ci 113094332d3Sopenharmony_ciinline void PowerSupplyProvider::TotalEnergyAssigner(const char* str, struct BatterydInfo* info) 114094332d3Sopenharmony_ci{ 115094332d3Sopenharmony_ci info->totalEnergy_ = ParseInt(str); 116094332d3Sopenharmony_ci} 117094332d3Sopenharmony_ci 118094332d3Sopenharmony_ciinline void PowerSupplyProvider::RemainEnergyAssigner(const char* str, struct BatterydInfo* info) 119094332d3Sopenharmony_ci{ 120094332d3Sopenharmony_ci info->remainEnergy_ = ParseInt(str); 121094332d3Sopenharmony_ci} 122094332d3Sopenharmony_ci 123094332d3Sopenharmony_ciinline void PowerSupplyProvider::VoltageAssigner(const char* str, struct BatterydInfo* info) 124094332d3Sopenharmony_ci{ 125094332d3Sopenharmony_ci info->voltage_ = ParseInt(str) / UVOL_TO_MVOL; // convert to millivolt(mV) format 126094332d3Sopenharmony_ci} 127094332d3Sopenharmony_ci 128094332d3Sopenharmony_ciinline void PowerSupplyProvider::TemperatureAssigner(const char* str, struct BatterydInfo* info) 129094332d3Sopenharmony_ci{ 130094332d3Sopenharmony_ci info->temperature_ = ParseInt(str); 131094332d3Sopenharmony_ci} 132094332d3Sopenharmony_ci 133094332d3Sopenharmony_ciint32_t PowerSupplyProvider::HealthStateEnumConverter(const char* str) 134094332d3Sopenharmony_ci{ 135094332d3Sopenharmony_ci struct StringEnumMap healthStateEnumMap[] = { 136094332d3Sopenharmony_ci { "Good", BATTERY_HEALTH_GOOD }, 137094332d3Sopenharmony_ci { "Cold", BATTERY_HEALTH_COLD }, 138094332d3Sopenharmony_ci { "Warm", BATTERY_HEALTH_GOOD }, // JEITA specification 139094332d3Sopenharmony_ci { "Cool", BATTERY_HEALTH_GOOD }, // JEITA specification 140094332d3Sopenharmony_ci { "Hot", BATTERY_HEALTH_OVERHEAT }, // JEITA specification 141094332d3Sopenharmony_ci { "Overheat", BATTERY_HEALTH_OVERHEAT }, 142094332d3Sopenharmony_ci { "Over voltage", BATTERY_HEALTH_OVERVOLTAGE }, 143094332d3Sopenharmony_ci { "Dead", BATTERY_HEALTH_DEAD }, 144094332d3Sopenharmony_ci { "Unknown", BATTERY_HEALTH_UNKNOWN }, 145094332d3Sopenharmony_ci { "Unspecified failure", BATTERY_HEALTH_UNKNOWN }, 146094332d3Sopenharmony_ci { nullptr, BATTERY_HEALTH_UNKNOWN }, 147094332d3Sopenharmony_ci }; 148094332d3Sopenharmony_ci 149094332d3Sopenharmony_ci for (int32_t i = 0; healthStateEnumMap[i].str; ++i) { 150094332d3Sopenharmony_ci if (strcmp(str, healthStateEnumMap[i].str) == 0) { 151094332d3Sopenharmony_ci return healthStateEnumMap[i].enumVal; 152094332d3Sopenharmony_ci } 153094332d3Sopenharmony_ci } 154094332d3Sopenharmony_ci 155094332d3Sopenharmony_ci return BATTERY_HEALTH_UNKNOWN; 156094332d3Sopenharmony_ci} 157094332d3Sopenharmony_ci 158094332d3Sopenharmony_ciinline void PowerSupplyProvider::HealthStateAssigner(const char* str, struct BatterydInfo* info) 159094332d3Sopenharmony_ci{ 160094332d3Sopenharmony_ci info->healthState_ = HealthStateEnumConverter(str); 161094332d3Sopenharmony_ci} 162094332d3Sopenharmony_ci 163094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ChargeStateEnumConverter(const char* str) 164094332d3Sopenharmony_ci{ 165094332d3Sopenharmony_ci struct StringEnumMap chargeStateEnumMap[] = { 166094332d3Sopenharmony_ci { "Discharging", CHARGE_STATE_NONE }, 167094332d3Sopenharmony_ci { "Charging", CHARGE_STATE_ENABLE }, 168094332d3Sopenharmony_ci { "Full", CHARGE_STATE_FULL }, 169094332d3Sopenharmony_ci { "Not charging", CHARGE_STATE_DISABLE }, 170094332d3Sopenharmony_ci { "Unknown", CHARGE_STATE_RESERVED }, 171094332d3Sopenharmony_ci { nullptr, CHARGE_STATE_RESERVED }, 172094332d3Sopenharmony_ci }; 173094332d3Sopenharmony_ci 174094332d3Sopenharmony_ci for (int32_t i = 0; chargeStateEnumMap[i].str; ++i) { 175094332d3Sopenharmony_ci if (strcmp(str, chargeStateEnumMap[i].str) == 0) { 176094332d3Sopenharmony_ci return chargeStateEnumMap[i].enumVal; 177094332d3Sopenharmony_ci } 178094332d3Sopenharmony_ci } 179094332d3Sopenharmony_ci 180094332d3Sopenharmony_ci return CHARGE_STATE_RESERVED; 181094332d3Sopenharmony_ci} 182094332d3Sopenharmony_ci 183094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ChargeTypeEumConverter(const char* str) 184094332d3Sopenharmony_ci{ 185094332d3Sopenharmony_ci struct StringEnumMap chargeTypeEnumMap[] = { 186094332d3Sopenharmony_ci { "0", CHARGE_TYPE_NONE }, 187094332d3Sopenharmony_ci { "1", CHARGE_TYPE_WIRED_NORMAL }, 188094332d3Sopenharmony_ci { "2", CHARGE_TYPE_WIRED_QUICK }, 189094332d3Sopenharmony_ci { "3", CHARGE_TYPE_WIRED_SUPER_QUICK }, 190094332d3Sopenharmony_ci { "4", CHARGE_TYPE_WIRELESS_NORMAL }, 191094332d3Sopenharmony_ci { "5", CHARGE_TYPE_WIRELESS_QUICK }, 192094332d3Sopenharmony_ci { "6", CHARGE_TYPE_WIRELESS_SUPER_QUICK }, 193094332d3Sopenharmony_ci { nullptr, CHARGE_TYPE_NONE }, 194094332d3Sopenharmony_ci }; 195094332d3Sopenharmony_ci 196094332d3Sopenharmony_ci for (int32_t i = 0; chargeTypeEnumMap[i].str; ++i) { 197094332d3Sopenharmony_ci if (strcmp(str, chargeTypeEnumMap[i].str) == 0) { 198094332d3Sopenharmony_ci return chargeTypeEnumMap[i].enumVal; 199094332d3Sopenharmony_ci } 200094332d3Sopenharmony_ci } 201094332d3Sopenharmony_ci 202094332d3Sopenharmony_ci return CHARGE_TYPE_NONE; 203094332d3Sopenharmony_ci} 204094332d3Sopenharmony_ci 205094332d3Sopenharmony_ciinline void PowerSupplyProvider::ChargeStateAssigner(const char* str, struct BatterydInfo* info) 206094332d3Sopenharmony_ci{ 207094332d3Sopenharmony_ci info->chargeState_ = ChargeStateEnumConverter(str); 208094332d3Sopenharmony_ci} 209094332d3Sopenharmony_ci 210094332d3Sopenharmony_ciinline void PowerSupplyProvider::PresentAssigner(const char* str, struct BatterydInfo* info) 211094332d3Sopenharmony_ci{ 212094332d3Sopenharmony_ci info->present_ = static_cast<int8_t>(ParseInt(str)); 213094332d3Sopenharmony_ci} 214094332d3Sopenharmony_ci 215094332d3Sopenharmony_ciinline void PowerSupplyProvider::TechnologyAssigner(const char* str, struct BatterydInfo* info) 216094332d3Sopenharmony_ci{ 217094332d3Sopenharmony_ci info->technology_ = str; 218094332d3Sopenharmony_ci} 219094332d3Sopenharmony_ci 220094332d3Sopenharmony_ciinline void PowerSupplyProvider::ChargeCounterAssigner(const char* str, struct BatterydInfo* info) 221094332d3Sopenharmony_ci{ 222094332d3Sopenharmony_ci info->chargeCounter_ = ParseInt(str); 223094332d3Sopenharmony_ci} 224094332d3Sopenharmony_ci 225094332d3Sopenharmony_ciinline void PowerSupplyProvider::CurrentAverageAssigner(const char* str, struct BatterydInfo* info) 226094332d3Sopenharmony_ci{ 227094332d3Sopenharmony_ci info->curAverage_ = ParseInt(str); 228094332d3Sopenharmony_ci} 229094332d3Sopenharmony_ci 230094332d3Sopenharmony_ciinline void PowerSupplyProvider::CurrentNowAssigner(const char* str, struct BatterydInfo* info) 231094332d3Sopenharmony_ci{ 232094332d3Sopenharmony_ci info->curNow_ = ParseInt(str); 233094332d3Sopenharmony_ci} 234094332d3Sopenharmony_ci 235094332d3Sopenharmony_civoid PowerSupplyProvider::FormatPath(std::string& path, 236094332d3Sopenharmony_ci size_t size, const char* format, const char* basePath, const char* name) const 237094332d3Sopenharmony_ci{ 238094332d3Sopenharmony_ci char buff[PATH_MAX] = {0}; 239094332d3Sopenharmony_ci if (strcpy_s(buff, PATH_MAX, path.c_str()) != EOK) { 240094332d3Sopenharmony_ci BATTERY_HILOGW(FEATURE_BATT_INFO, "failed to copy path of %{public}s", name); 241094332d3Sopenharmony_ci return; 242094332d3Sopenharmony_ci } 243094332d3Sopenharmony_ci 244094332d3Sopenharmony_ci if (snprintf_s(buff, PATH_MAX, size - 1, format, basePath, name) == -1) { 245094332d3Sopenharmony_ci BATTERY_HILOGW(FEATURE_BATT_INFO, "failed to format path of %{public}s", name); 246094332d3Sopenharmony_ci return; 247094332d3Sopenharmony_ci } 248094332d3Sopenharmony_ci path.assign(buff, strlen(buff)); 249094332d3Sopenharmony_ci} 250094332d3Sopenharmony_ci 251094332d3Sopenharmony_civoid PowerSupplyProvider::FormatSysfsPaths() 252094332d3Sopenharmony_ci{ 253094332d3Sopenharmony_ci // Format paths for power supply types 254094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.capacityPath, PATH_MAX, "%s/%s/capacity", path_.c_str(), 255094332d3Sopenharmony_ci nodeNamePathMap_["capacity"].c_str()); 256094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.voltagePath, PATH_MAX, "%s/%s/voltage_now", path_.c_str(), 257094332d3Sopenharmony_ci nodeNamePathMap_["voltage_now"].c_str()); 258094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.temperaturePath, PATH_MAX, "%s/%s/temp", path_.c_str(), 259094332d3Sopenharmony_ci nodeNamePathMap_["temp"].c_str()); 260094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.healthStatePath, PATH_MAX, "%s/%s/health", path_.c_str(), 261094332d3Sopenharmony_ci nodeNamePathMap_["health"].c_str()); 262094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.chargeStatePath, PATH_MAX, "%s/%s/status", path_.c_str(), 263094332d3Sopenharmony_ci nodeNamePathMap_["status"].c_str()); 264094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.presentPath, PATH_MAX, "%s/%s/present", path_.c_str(), 265094332d3Sopenharmony_ci nodeNamePathMap_["present"].c_str()); 266094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.chargeCounterPath, PATH_MAX, "%s/%s/charge_counter", path_.c_str(), 267094332d3Sopenharmony_ci nodeNamePathMap_["charge_counter"].c_str()); 268094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.technologyPath, PATH_MAX, "%s/%s/technology", path_.c_str(), 269094332d3Sopenharmony_ci nodeNamePathMap_["technology"].c_str()); 270094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.totalEnergyPath, PATH_MAX, "%s/%s/charge_full", path_.c_str(), 271094332d3Sopenharmony_ci nodeNamePathMap_["charge_full"].c_str()); 272094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.curAveragePath, PATH_MAX, "%s/%s/current_avg", path_.c_str(), 273094332d3Sopenharmony_ci nodeNamePathMap_["current_avg"].c_str()); 274094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.curNowPath, PATH_MAX, "%s/%s/current_now", path_.c_str(), 275094332d3Sopenharmony_ci nodeNamePathMap_["current_now"].c_str()); 276094332d3Sopenharmony_ci FormatPath(batterySysfsInfo_.remainEnergyPath, PATH_MAX, "%s/%s/charge_now", path_.c_str(), 277094332d3Sopenharmony_ci nodeNamePathMap_["charge_now"].c_str()); 278094332d3Sopenharmony_ci} 279094332d3Sopenharmony_ci 280094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ReadSysfsFile(const char* path, char* buf, size_t size) 281094332d3Sopenharmony_ci{ 282094332d3Sopenharmony_ci int32_t fd = -1; 283094332d3Sopenharmony_ci 284094332d3Sopenharmony_ci { 285094332d3Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 286094332d3Sopenharmony_ci auto item = nodeCacheFiles_.find(path); 287094332d3Sopenharmony_ci if (item != nodeCacheFiles_.end()) { 288094332d3Sopenharmony_ci fd = item->second; 289094332d3Sopenharmony_ci } 290094332d3Sopenharmony_ci } 291094332d3Sopenharmony_ci 292094332d3Sopenharmony_ci if (fd != -1) { 293094332d3Sopenharmony_ci ssize_t readSize = pread(fd, buf, size - 1, 0); 294094332d3Sopenharmony_ci buf[readSize] = '\0'; 295094332d3Sopenharmony_ci Trim(buf); 296094332d3Sopenharmony_ci return HDF_SUCCESS; 297094332d3Sopenharmony_ci } 298094332d3Sopenharmony_ci 299094332d3Sopenharmony_ci fd = open(path, O_RDONLY, S_IRUSR | S_IRGRP | S_IROTH); 300094332d3Sopenharmony_ci if (fd < NUM_ZERO) { 301094332d3Sopenharmony_ci BATTERY_HILOGD(FEATURE_BATT_INFO, "failed to open file %{public}s, errno: %{public}d", path, errno); 302094332d3Sopenharmony_ci return HDF_ERR_IO; 303094332d3Sopenharmony_ci } 304094332d3Sopenharmony_ci 305094332d3Sopenharmony_ci ssize_t readSize = read(fd, buf, size - 1); 306094332d3Sopenharmony_ci buf[readSize] = '\0'; 307094332d3Sopenharmony_ci Trim(buf); 308094332d3Sopenharmony_ci { 309094332d3Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 310094332d3Sopenharmony_ci nodeCacheFiles_.insert(std::make_pair(path, fd)); 311094332d3Sopenharmony_ci } 312094332d3Sopenharmony_ci 313094332d3Sopenharmony_ci return HDF_SUCCESS; 314094332d3Sopenharmony_ci} 315094332d3Sopenharmony_ci 316094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ReadBatterySysfsToBuff(const char* path, char* buf, size_t size) 317094332d3Sopenharmony_ci{ 318094332d3Sopenharmony_ci int32_t ret = ReadSysfsFile(path, buf, size); 319094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 320094332d3Sopenharmony_ci BATTERY_HILOGW(FEATURE_BATT_INFO, "read path(%{public}s) failed, ret: %{public}d", 321094332d3Sopenharmony_ci (path != nullptr ? path : "NULL"), ret); 322094332d3Sopenharmony_ci return ret; 323094332d3Sopenharmony_ci } 324094332d3Sopenharmony_ci 325094332d3Sopenharmony_ci return HDF_SUCCESS; 326094332d3Sopenharmony_ci} 327094332d3Sopenharmony_ci 328094332d3Sopenharmony_civoid PowerSupplyProvider::GetPluggedTypeName(char* buf, size_t size) 329094332d3Sopenharmony_ci{ 330094332d3Sopenharmony_ci std::string onlineNode = "USB"; 331094332d3Sopenharmony_ci int32_t ret; 332094332d3Sopenharmony_ci int32_t online; 333094332d3Sopenharmony_ci std::string onlinePath = path_ + "/" + onlineNode + "/" + "online"; 334094332d3Sopenharmony_ci ret = ReadSysfsFile(onlinePath.c_str(), buf, size); 335094332d3Sopenharmony_ci online = ParseInt(buf); 336094332d3Sopenharmony_ci auto iter = nodeNames_.begin(); 337094332d3Sopenharmony_ci while (!online && iter != nodeNames_.end()) { 338094332d3Sopenharmony_ci if (*iter == "USB") { 339094332d3Sopenharmony_ci iter++; 340094332d3Sopenharmony_ci continue; 341094332d3Sopenharmony_ci } 342094332d3Sopenharmony_ci onlinePath = path_ + "/" + *iter + "/" + "online"; 343094332d3Sopenharmony_ci ret = ReadSysfsFile(onlinePath.c_str(), buf, size); 344094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 345094332d3Sopenharmony_ci BATTERY_HILOGD(FEATURE_BATT_INFO, "read online path failed in loop, ret: %{public}d", ret); 346094332d3Sopenharmony_ci } 347094332d3Sopenharmony_ci online = ParseInt(buf); 348094332d3Sopenharmony_ci if (online) { 349094332d3Sopenharmony_ci onlineNode = *iter; 350094332d3Sopenharmony_ci break; 351094332d3Sopenharmony_ci } 352094332d3Sopenharmony_ci iter++; 353094332d3Sopenharmony_ci } 354094332d3Sopenharmony_ci 355094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 356094332d3Sopenharmony_ci BATTERY_HILOGD(FEATURE_BATT_INFO, "read online path failed, ret: %{public}d", ret); 357094332d3Sopenharmony_ci return; 358094332d3Sopenharmony_ci } 359094332d3Sopenharmony_ci 360094332d3Sopenharmony_ci if (!online) { 361094332d3Sopenharmony_ci BATTERY_HILOGW(FEATURE_BATT_INFO, "charger is not online, so no type return"); 362094332d3Sopenharmony_ci return; 363094332d3Sopenharmony_ci } 364094332d3Sopenharmony_ci 365094332d3Sopenharmony_ci std::string typeNode = onlineNode; 366094332d3Sopenharmony_ci std::string typePath = path_ + "/" + typeNode + "/" + "type"; 367094332d3Sopenharmony_ci ret = ReadSysfsFile(typePath.c_str(), buf, size); 368094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 369094332d3Sopenharmony_ci BATTERY_HILOGW(FEATURE_BATT_INFO, "read type path failed, ret: %{public}d", ret); 370094332d3Sopenharmony_ci return; 371094332d3Sopenharmony_ci } 372094332d3Sopenharmony_ci Trim(buf); 373094332d3Sopenharmony_ci} 374094332d3Sopenharmony_ci 375094332d3Sopenharmony_ciint32_t PowerSupplyProvider::PluggedTypeEnumConverter(const char* str) const 376094332d3Sopenharmony_ci{ 377094332d3Sopenharmony_ci struct StringEnumMap pluggedTypeEnumMap[] = { 378094332d3Sopenharmony_ci { "USB", PLUGGED_TYPE_USB }, 379094332d3Sopenharmony_ci { "USB_PD_DRP", PLUGGED_TYPE_USB }, 380094332d3Sopenharmony_ci { "Wireless", PLUGGED_TYPE_WIRELESS }, 381094332d3Sopenharmony_ci { "Mains", PLUGGED_TYPE_AC }, 382094332d3Sopenharmony_ci { "UPS", PLUGGED_TYPE_AC }, 383094332d3Sopenharmony_ci { "USB_ACA", PLUGGED_TYPE_AC }, 384094332d3Sopenharmony_ci { "USB_C", PLUGGED_TYPE_AC }, 385094332d3Sopenharmony_ci { "USB_CDP", PLUGGED_TYPE_AC }, 386094332d3Sopenharmony_ci { "USB_DCP", PLUGGED_TYPE_AC }, 387094332d3Sopenharmony_ci { "USB_HVDCP", PLUGGED_TYPE_AC }, 388094332d3Sopenharmony_ci { "USB_PD", PLUGGED_TYPE_AC }, 389094332d3Sopenharmony_ci { "Unknown", PLUGGED_TYPE_BUTT }, 390094332d3Sopenharmony_ci { nullptr, PLUGGED_TYPE_BUTT }, 391094332d3Sopenharmony_ci }; 392094332d3Sopenharmony_ci 393094332d3Sopenharmony_ci for (int32_t i = 0; pluggedTypeEnumMap[i].str; ++i) { 394094332d3Sopenharmony_ci if (strcmp(str, pluggedTypeEnumMap[i].str) == 0) { 395094332d3Sopenharmony_ci return pluggedTypeEnumMap[i].enumVal; 396094332d3Sopenharmony_ci } 397094332d3Sopenharmony_ci } 398094332d3Sopenharmony_ci return PLUGGED_TYPE_BUTT; 399094332d3Sopenharmony_ci} 400094332d3Sopenharmony_ci 401094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParsePluggedMaxCurrent(int32_t* maxCurrent) 402094332d3Sopenharmony_ci{ 403094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 404094332d3Sopenharmony_ci GetPluggedTypeName(buf, sizeof(buf)); 405094332d3Sopenharmony_ci std::string currentMaxNode = POWER_SUPPLY_BATTERY; 406094332d3Sopenharmony_ci 407094332d3Sopenharmony_ci const auto& item = nodeNamePathMap_.find("current_max"); 408094332d3Sopenharmony_ci if (item != nodeNamePathMap_.end()) { 409094332d3Sopenharmony_ci currentMaxNode = item->second; 410094332d3Sopenharmony_ci } 411094332d3Sopenharmony_ci 412094332d3Sopenharmony_ci std::string currentMaxPath = POWER_SUPPLY_BASE_PATH + "/" + currentMaxNode + "/" + "current_max"; 413094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(currentMaxPath.c_str(), buf, sizeof(buf)); 414094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 415094332d3Sopenharmony_ci return ret; 416094332d3Sopenharmony_ci } 417094332d3Sopenharmony_ci int32_t value = ParseInt(buf); 418094332d3Sopenharmony_ci *maxCurrent = value; 419094332d3Sopenharmony_ci 420094332d3Sopenharmony_ci return HDF_SUCCESS; 421094332d3Sopenharmony_ci} 422094332d3Sopenharmony_ci 423094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParsePluggedMaxVoltage(int32_t* maxVoltage) 424094332d3Sopenharmony_ci{ 425094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 426094332d3Sopenharmony_ci GetPluggedTypeName(buf, sizeof(buf)); 427094332d3Sopenharmony_ci std::string voltageMaxNode = POWER_SUPPLY_BATTERY; 428094332d3Sopenharmony_ci 429094332d3Sopenharmony_ci const auto& item = nodeNamePathMap_.find("voltage_max"); 430094332d3Sopenharmony_ci if (item != nodeNamePathMap_.end()) { 431094332d3Sopenharmony_ci voltageMaxNode = item->second; 432094332d3Sopenharmony_ci } 433094332d3Sopenharmony_ci 434094332d3Sopenharmony_ci std::string voltageMaxPath = POWER_SUPPLY_BASE_PATH + "/" + voltageMaxNode + "/" + "voltage_max"; 435094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(voltageMaxPath.c_str(), buf, sizeof(buf)); 436094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 437094332d3Sopenharmony_ci return ret; 438094332d3Sopenharmony_ci } 439094332d3Sopenharmony_ci int32_t value = ParseInt(buf); 440094332d3Sopenharmony_ci *maxVoltage = value; 441094332d3Sopenharmony_ci 442094332d3Sopenharmony_ci return HDF_SUCCESS; 443094332d3Sopenharmony_ci} 444094332d3Sopenharmony_ci 445094332d3Sopenharmony_civoid PowerSupplyProvider::UpdateInfoByReadSysFile(struct BatterydInfo* info) 446094332d3Sopenharmony_ci{ 447094332d3Sopenharmony_ci ParseCapacity(&info->capacity_); 448094332d3Sopenharmony_ci ParseVoltage(&info->voltage_); 449094332d3Sopenharmony_ci ParseTemperature(&info->temperature_); 450094332d3Sopenharmony_ci ParseHealthState(&info->healthState_); 451094332d3Sopenharmony_ci ParseChargeState(&info->chargeState_); 452094332d3Sopenharmony_ci ParseChargeCounter(&info->chargeCounter_); 453094332d3Sopenharmony_ci ParseCurrentNow(&info->curNow_); 454094332d3Sopenharmony_ci ParseCurrentAverage(&info->curAverage_); 455094332d3Sopenharmony_ci ParseRemainEnergy(&info->remainEnergy_); 456094332d3Sopenharmony_ci ParseTotalEnergy(&info->totalEnergy_); 457094332d3Sopenharmony_ci ParsePresent(&info->present_); 458094332d3Sopenharmony_ci 459094332d3Sopenharmony_ci info->pluggedType_ = PLUGGED_TYPE_NONE; 460094332d3Sopenharmony_ci ParsePluggedType(&info->pluggedType_); 461094332d3Sopenharmony_ci 462094332d3Sopenharmony_ci info->pluggedMaxCurrent_ = INVALID_BATT_INT_VALUE; 463094332d3Sopenharmony_ci ParsePluggedMaxCurrent(&info->pluggedMaxCurrent_); 464094332d3Sopenharmony_ci 465094332d3Sopenharmony_ci info->pluggedMaxVoltage_ = INVALID_BATT_INT_VALUE; 466094332d3Sopenharmony_ci ParsePluggedMaxVoltage(&info->pluggedMaxVoltage_); 467094332d3Sopenharmony_ci 468094332d3Sopenharmony_ci info->technology_ = INVALID_STRING_VALUE; 469094332d3Sopenharmony_ci ParseTechnology(info->technology_); 470094332d3Sopenharmony_ci 471094332d3Sopenharmony_ci CopyBatteryInfo(info); 472094332d3Sopenharmony_ci} 473094332d3Sopenharmony_ci 474094332d3Sopenharmony_civoid PowerSupplyProvider::ParseUeventToBatterydInfo(const char* msg, struct BatterydInfo* info) 475094332d3Sopenharmony_ci{ 476094332d3Sopenharmony_ci static struct BatteryAssigner batteryAssigners[] = { 477094332d3Sopenharmony_ci { BATTERY_KEY_CAPACITY.c_str(), BATTERY_KEY_CAPACITY.length(), CapacityAssigner }, 478094332d3Sopenharmony_ci { BATTERY_KEY_TOTAL_ENERGY.c_str(), BATTERY_KEY_TOTAL_ENERGY.length(), TotalEnergyAssigner }, 479094332d3Sopenharmony_ci { BATTERY_KEY_REMAIN_ENERGY.c_str(), BATTERY_KEY_REMAIN_ENERGY.length(), RemainEnergyAssigner }, 480094332d3Sopenharmony_ci { BATTERY_KEY_VOLTAGE.c_str(), BATTERY_KEY_VOLTAGE.length(), VoltageAssigner }, 481094332d3Sopenharmony_ci { BATTERY_KEY_TEMPERATURE.c_str(), BATTERY_KEY_TEMPERATURE.length(), TemperatureAssigner }, 482094332d3Sopenharmony_ci { BATTERY_KEY_HEALTH.c_str(), BATTERY_KEY_HEALTH.length(), HealthStateAssigner }, 483094332d3Sopenharmony_ci { BATTERY_KEY_CHARGE_STATUS.c_str(), BATTERY_KEY_CHARGE_STATUS.length(), ChargeStateAssigner }, 484094332d3Sopenharmony_ci { BATTERY_KEY_PRESENT.c_str(), BATTERY_KEY_PRESENT.length(), PresentAssigner }, 485094332d3Sopenharmony_ci { BATTERY_KEY_TECHNOLOGY.c_str(), BATTERY_KEY_TECHNOLOGY.length(), TechnologyAssigner }, 486094332d3Sopenharmony_ci { BATTERY_KEY_CHARGE_COUNTER.c_str(), BATTERY_KEY_CHARGE_COUNTER.length(), ChargeCounterAssigner }, 487094332d3Sopenharmony_ci { BATTERY_KEY_CURRENT_AVERAGE.c_str(), BATTERY_KEY_CURRENT_AVERAGE.length(), CurrentAverageAssigner }, 488094332d3Sopenharmony_ci { BATTERY_KEY_CURRENT_NOW.c_str(), BATTERY_KEY_CURRENT_NOW.length(), CurrentNowAssigner }, 489094332d3Sopenharmony_ci { nullptr, 0, nullptr } // end of the array 490094332d3Sopenharmony_ci }; 491094332d3Sopenharmony_ci 492094332d3Sopenharmony_ci while (*msg) { 493094332d3Sopenharmony_ci for (int32_t i = 0; batteryAssigners[i].prefix; ++i) { 494094332d3Sopenharmony_ci if (!strncmp(msg, batteryAssigners[i].prefix, batteryAssigners[i].prefixLen)) { 495094332d3Sopenharmony_ci BATTERY_HILOGD(FEATURE_BATT_INFO, "msg: %{public}s", msg); 496094332d3Sopenharmony_ci msg += batteryAssigners[i].prefixLen; 497094332d3Sopenharmony_ci batteryAssigners[i].Assigner(msg, info); 498094332d3Sopenharmony_ci break; 499094332d3Sopenharmony_ci } 500094332d3Sopenharmony_ci } 501094332d3Sopenharmony_ci while (*msg++) {} // move to next 502094332d3Sopenharmony_ci } 503094332d3Sopenharmony_ci 504094332d3Sopenharmony_ci info->pluggedType_ = PLUGGED_TYPE_NONE; 505094332d3Sopenharmony_ci ParsePluggedType(&info->pluggedType_); 506094332d3Sopenharmony_ci 507094332d3Sopenharmony_ci info->pluggedMaxCurrent_ = INVALID_BATT_INT_VALUE; 508094332d3Sopenharmony_ci ParsePluggedMaxCurrent(&info->pluggedMaxCurrent_); 509094332d3Sopenharmony_ci 510094332d3Sopenharmony_ci info->pluggedMaxVoltage_ = INVALID_BATT_INT_VALUE; 511094332d3Sopenharmony_ci ParsePluggedMaxVoltage(&info->pluggedMaxVoltage_); 512094332d3Sopenharmony_ci 513094332d3Sopenharmony_ci info->technology_ = INVALID_STRING_VALUE; 514094332d3Sopenharmony_ci ParseTechnology(info->technology_); 515094332d3Sopenharmony_ci 516094332d3Sopenharmony_ci CopyBatteryInfo(info); 517094332d3Sopenharmony_ci} 518094332d3Sopenharmony_ci 519094332d3Sopenharmony_civoid PowerSupplyProvider::CopyBatteryInfo(const struct BatterydInfo* info) const 520094332d3Sopenharmony_ci{ 521094332d3Sopenharmony_ci g_batteryInfo.capacity_ = info->capacity_; 522094332d3Sopenharmony_ci g_batteryInfo.voltage_ = info->voltage_; 523094332d3Sopenharmony_ci g_batteryInfo.temperature_ = info->temperature_; 524094332d3Sopenharmony_ci g_batteryInfo.healthState_ = info->healthState_; 525094332d3Sopenharmony_ci g_batteryInfo.pluggedType_ = info->pluggedType_; 526094332d3Sopenharmony_ci g_batteryInfo.pluggedMaxCurrent_ = info->pluggedMaxCurrent_; 527094332d3Sopenharmony_ci g_batteryInfo.pluggedMaxVoltage_ = info->pluggedMaxVoltage_; 528094332d3Sopenharmony_ci g_batteryInfo.chargeState_ = info->chargeState_; 529094332d3Sopenharmony_ci g_batteryInfo.chargeCounter_ = info->chargeCounter_; 530094332d3Sopenharmony_ci g_batteryInfo.curNow_ = info->curNow_; 531094332d3Sopenharmony_ci g_batteryInfo.curAverage_ = info->curAverage_; 532094332d3Sopenharmony_ci g_batteryInfo.totalEnergy_ = info->totalEnergy_; 533094332d3Sopenharmony_ci g_batteryInfo.remainEnergy_ = info->remainEnergy_; 534094332d3Sopenharmony_ci g_batteryInfo.present_ = info->present_; 535094332d3Sopenharmony_ci g_batteryInfo.technology_ = info->technology_; 536094332d3Sopenharmony_ci} 537094332d3Sopenharmony_ci 538094332d3Sopenharmony_civoid PowerSupplyProvider::SetSysFilePath(const std::string& path) 539094332d3Sopenharmony_ci{ 540094332d3Sopenharmony_ci if (path.empty()) { 541094332d3Sopenharmony_ci BATTERY_HILOGI(FEATURE_BATT_INFO, "path is empty"); 542094332d3Sopenharmony_ci return; 543094332d3Sopenharmony_ci } 544094332d3Sopenharmony_ci path_ = path; 545094332d3Sopenharmony_ci} 546094332d3Sopenharmony_ci 547094332d3Sopenharmony_civoid PowerSupplyProvider::CreateFile(const std::string& path, const std::string& content) 548094332d3Sopenharmony_ci{ 549094332d3Sopenharmony_ci if (access(path.c_str(), F_OK) == 0) { 550094332d3Sopenharmony_ci return; 551094332d3Sopenharmony_ci } 552094332d3Sopenharmony_ci 553094332d3Sopenharmony_ci std::ofstream stream(path.c_str()); 554094332d3Sopenharmony_ci if (!stream.is_open()) { 555094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "cannot create file"); 556094332d3Sopenharmony_ci return; 557094332d3Sopenharmony_ci } 558094332d3Sopenharmony_ci stream << content.c_str() << std::endl; 559094332d3Sopenharmony_ci stream.close(); 560094332d3Sopenharmony_ci} 561094332d3Sopenharmony_ci 562094332d3Sopenharmony_civoid PowerSupplyProvider::InitBatteryPath() 563094332d3Sopenharmony_ci{ 564094332d3Sopenharmony_ci std::string sysLowercaseBatteryPath = "/sys/class/power_supply/battery"; 565094332d3Sopenharmony_ci 566094332d3Sopenharmony_ci if (access(sysLowercaseBatteryPath.c_str(), F_OK) == 0) { 567094332d3Sopenharmony_ci BATTERY_HILOGI(FEATURE_BATT_INFO, "system battery path is exist"); 568094332d3Sopenharmony_ci return; 569094332d3Sopenharmony_ci } else { 570094332d3Sopenharmony_ci std::string sysCapitalBatteryPath = "/sys/class/power_supply/Battery"; 571094332d3Sopenharmony_ci if (access(sysCapitalBatteryPath.c_str(), F_OK) == 0) { 572094332d3Sopenharmony_ci BATTERY_HILOGI(FEATURE_BATT_INFO, "system Battery path is exist"); 573094332d3Sopenharmony_ci return; 574094332d3Sopenharmony_ci } 575094332d3Sopenharmony_ci InitDefaultSysfs(); 576094332d3Sopenharmony_ci } 577094332d3Sopenharmony_ci InitChargerSysfs(); 578094332d3Sopenharmony_ci} 579094332d3Sopenharmony_ci 580094332d3Sopenharmony_ciint32_t PowerSupplyProvider::InitPowerSupplySysfs() 581094332d3Sopenharmony_ci{ 582094332d3Sopenharmony_ci DIR* dir = nullptr; 583094332d3Sopenharmony_ci struct dirent* entry = nullptr; 584094332d3Sopenharmony_ci index_ = 0; 585094332d3Sopenharmony_ci 586094332d3Sopenharmony_ci dir = opendir(path_.c_str()); 587094332d3Sopenharmony_ci if (dir == nullptr) { 588094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "cannot open path_"); 589094332d3Sopenharmony_ci return HDF_ERR_IO; 590094332d3Sopenharmony_ci } 591094332d3Sopenharmony_ci 592094332d3Sopenharmony_ci while (true) { 593094332d3Sopenharmony_ci entry = readdir(dir); 594094332d3Sopenharmony_ci if (entry == nullptr) { 595094332d3Sopenharmony_ci break; 596094332d3Sopenharmony_ci } 597094332d3Sopenharmony_ci 598094332d3Sopenharmony_ci if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { 599094332d3Sopenharmony_ci continue; 600094332d3Sopenharmony_ci } 601094332d3Sopenharmony_ci 602094332d3Sopenharmony_ci if (entry->d_type == DT_DIR || entry->d_type == DT_LNK) { 603094332d3Sopenharmony_ci if (index_ >= MAX_SYSFS_SIZE) { 604094332d3Sopenharmony_ci BATTERY_HILOGW(FEATURE_BATT_INFO, "too many power supply types"); 605094332d3Sopenharmony_ci break; 606094332d3Sopenharmony_ci } 607094332d3Sopenharmony_ci nodeNames_.emplace_back(entry->d_name); 608094332d3Sopenharmony_ci index_++; 609094332d3Sopenharmony_ci } 610094332d3Sopenharmony_ci } 611094332d3Sopenharmony_ci nodeNamePathMap_.clear(); 612094332d3Sopenharmony_ci TraversalNode(); 613094332d3Sopenharmony_ci FormatSysfsPaths(); 614094332d3Sopenharmony_ci BATTERY_HILOGD(FEATURE_BATT_INFO, "init power supply sysfs nodes, total count %{public}d", index_); 615094332d3Sopenharmony_ci closedir(dir); 616094332d3Sopenharmony_ci 617094332d3Sopenharmony_ci return HDF_SUCCESS; 618094332d3Sopenharmony_ci} 619094332d3Sopenharmony_ci 620094332d3Sopenharmony_civoid PowerSupplyProvider::InitChargerSysfs() 621094332d3Sopenharmony_ci{ 622094332d3Sopenharmony_ci auto& batteryConfig = BatteryConfig::GetInstance(); 623094332d3Sopenharmony_ci batteryConfig.ParseConfig(); 624094332d3Sopenharmony_ci BatteryConfig::ChargerConfig chargerConfig = batteryConfig.GetChargerConfig(); 625094332d3Sopenharmony_ci 626094332d3Sopenharmony_ci std::string mockCurrentLimitPath = chargerConfig.currentPath; 627094332d3Sopenharmony_ci if (access(mockCurrentLimitPath.c_str(), 0) == -1) { 628094332d3Sopenharmony_ci CreateFile(mockCurrentLimitPath, "0"); 629094332d3Sopenharmony_ci } 630094332d3Sopenharmony_ci 631094332d3Sopenharmony_ci std::string mockVoltageLimitPath = chargerConfig.voltagePath; 632094332d3Sopenharmony_ci if (access(mockVoltageLimitPath.c_str(), 0) == -1) { 633094332d3Sopenharmony_ci CreateFile(mockVoltageLimitPath, "0"); 634094332d3Sopenharmony_ci } 635094332d3Sopenharmony_ci 636094332d3Sopenharmony_ci std::string mockChargeTypePath = chargerConfig.chargeTypePath; 637094332d3Sopenharmony_ci if (access(mockChargeTypePath.c_str(), 0) == -1) { 638094332d3Sopenharmony_ci CreateFile(mockChargeTypePath, "0"); 639094332d3Sopenharmony_ci } 640094332d3Sopenharmony_ci} 641094332d3Sopenharmony_ci 642094332d3Sopenharmony_civoid PowerSupplyProvider::TraversalNode() 643094332d3Sopenharmony_ci{ 644094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("type", "")); 645094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("online", "")); 646094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("current_max", "")); 647094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("voltage_max", "")); 648094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("capacity", "")); 649094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("voltage_now", "")); 650094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("temp", "")); 651094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("health", "")); 652094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("status", "")); 653094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("present", "")); 654094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("charge_counter", "")); 655094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("technology", "")); 656094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("charge_full", "")); 657094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("current_avg", "")); 658094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("current_now", "")); 659094332d3Sopenharmony_ci nodeNamePathMap_.insert(std::make_pair("charge_now", "")); 660094332d3Sopenharmony_ci 661094332d3Sopenharmony_ci auto iter = nodeNames_.begin(); 662094332d3Sopenharmony_ci while (iter != nodeNames_.end()) { 663094332d3Sopenharmony_ci if (*iter == "battery") { 664094332d3Sopenharmony_ci CheckSubfolderNode(*iter); 665094332d3Sopenharmony_ci iter = nodeNames_.erase(iter); 666094332d3Sopenharmony_ci } else { 667094332d3Sopenharmony_ci iter++; 668094332d3Sopenharmony_ci } 669094332d3Sopenharmony_ci } 670094332d3Sopenharmony_ci 671094332d3Sopenharmony_ci iter = nodeNames_.begin(); 672094332d3Sopenharmony_ci while (iter != nodeNames_.end()) { 673094332d3Sopenharmony_ci if (*iter == POWER_SUPPLY_BATTERY) { 674094332d3Sopenharmony_ci CheckSubfolderNode(*iter); 675094332d3Sopenharmony_ci iter = nodeNames_.erase(iter); 676094332d3Sopenharmony_ci } else { 677094332d3Sopenharmony_ci iter++; 678094332d3Sopenharmony_ci } 679094332d3Sopenharmony_ci } 680094332d3Sopenharmony_ci 681094332d3Sopenharmony_ci for (auto& nodeName : nodeNames_) { 682094332d3Sopenharmony_ci CheckSubfolderNode(nodeName); 683094332d3Sopenharmony_ci } 684094332d3Sopenharmony_ci} 685094332d3Sopenharmony_ci 686094332d3Sopenharmony_civoid PowerSupplyProvider::CheckSubfolderNode(const std::string& path) 687094332d3Sopenharmony_ci{ 688094332d3Sopenharmony_ci DIR *dir = nullptr; 689094332d3Sopenharmony_ci struct dirent* entry = nullptr; 690094332d3Sopenharmony_ci std::string batteryPath = path_ + "/" + path; 691094332d3Sopenharmony_ci if (batteryPath.c_str() == nullptr) { 692094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "the batteryPath is empty."); 693094332d3Sopenharmony_ci return; 694094332d3Sopenharmony_ci } 695094332d3Sopenharmony_ci dir = opendir(batteryPath.c_str()); 696094332d3Sopenharmony_ci if (dir == nullptr) { 697094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "subfolder file is not exist."); 698094332d3Sopenharmony_ci return; 699094332d3Sopenharmony_ci } 700094332d3Sopenharmony_ci 701094332d3Sopenharmony_ci while (true) { 702094332d3Sopenharmony_ci entry = readdir(dir); 703094332d3Sopenharmony_ci if (entry == nullptr) { 704094332d3Sopenharmony_ci break; 705094332d3Sopenharmony_ci } 706094332d3Sopenharmony_ci 707094332d3Sopenharmony_ci if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { 708094332d3Sopenharmony_ci continue; 709094332d3Sopenharmony_ci } 710094332d3Sopenharmony_ci 711094332d3Sopenharmony_ci if (entry->d_type == DT_DIR || entry->d_type == DT_LNK) { 712094332d3Sopenharmony_ci continue; 713094332d3Sopenharmony_ci } 714094332d3Sopenharmony_ci 715094332d3Sopenharmony_ci if ((strcmp(entry->d_name, "type") == 0) && (nodeNamePathMap_["type"].empty()) && 716094332d3Sopenharmony_ci (strcasecmp(path.c_str(), BATTERY_NODE_PATH.c_str()) != 0)) { 717094332d3Sopenharmony_ci nodeNamePathMap_["type"] = path; 718094332d3Sopenharmony_ci } 719094332d3Sopenharmony_ci 720094332d3Sopenharmony_ci for (auto& iter : nodeNamePathMap_) { 721094332d3Sopenharmony_ci if ((strcmp(entry->d_name, iter.first.c_str()) == 0) && (nodeNamePathMap_[iter.first].empty())) { 722094332d3Sopenharmony_ci nodeNamePathMap_[iter.first] = path; 723094332d3Sopenharmony_ci } 724094332d3Sopenharmony_ci } 725094332d3Sopenharmony_ci } 726094332d3Sopenharmony_ci closedir(dir); 727094332d3Sopenharmony_ci} 728094332d3Sopenharmony_ci 729094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseCapacity(int32_t* capacity) 730094332d3Sopenharmony_ci{ 731094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 732094332d3Sopenharmony_ci 733094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.capacityPath.c_str(), buf, sizeof(buf)); 734094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 735094332d3Sopenharmony_ci return ret; 736094332d3Sopenharmony_ci } 737094332d3Sopenharmony_ci 738094332d3Sopenharmony_ci int32_t value = ParseInt(buf); 739094332d3Sopenharmony_ci *capacity = value; 740094332d3Sopenharmony_ci 741094332d3Sopenharmony_ci return HDF_SUCCESS; 742094332d3Sopenharmony_ci} 743094332d3Sopenharmony_ci 744094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseTotalEnergy(int32_t* totalEnergy) 745094332d3Sopenharmony_ci{ 746094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 747094332d3Sopenharmony_ci 748094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.totalEnergyPath.c_str(), buf, sizeof(buf)); 749094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 750094332d3Sopenharmony_ci return ret; 751094332d3Sopenharmony_ci } 752094332d3Sopenharmony_ci 753094332d3Sopenharmony_ci int32_t value = ParseInt(buf); 754094332d3Sopenharmony_ci *totalEnergy = value; 755094332d3Sopenharmony_ci 756094332d3Sopenharmony_ci return HDF_SUCCESS; 757094332d3Sopenharmony_ci} 758094332d3Sopenharmony_ci 759094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseCurrentAverage(int32_t* curAverage) 760094332d3Sopenharmony_ci{ 761094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 762094332d3Sopenharmony_ci 763094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.curAveragePath.c_str(), buf, sizeof(buf)); 764094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 765094332d3Sopenharmony_ci return ret; 766094332d3Sopenharmony_ci } 767094332d3Sopenharmony_ci 768094332d3Sopenharmony_ci int32_t value = ParseInt(buf); 769094332d3Sopenharmony_ci *curAverage = value; 770094332d3Sopenharmony_ci 771094332d3Sopenharmony_ci return HDF_SUCCESS; 772094332d3Sopenharmony_ci} 773094332d3Sopenharmony_ci 774094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseCurrentNow(int32_t* curNow) 775094332d3Sopenharmony_ci{ 776094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 777094332d3Sopenharmony_ci 778094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.curNowPath.c_str(), buf, sizeof(buf)); 779094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 780094332d3Sopenharmony_ci return ret; 781094332d3Sopenharmony_ci } 782094332d3Sopenharmony_ci 783094332d3Sopenharmony_ci int32_t value = ParseInt(buf); 784094332d3Sopenharmony_ci *curNow = value; 785094332d3Sopenharmony_ci 786094332d3Sopenharmony_ci return HDF_SUCCESS; 787094332d3Sopenharmony_ci} 788094332d3Sopenharmony_ci 789094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseRemainEnergy(int32_t* remainEnergy) 790094332d3Sopenharmony_ci{ 791094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 792094332d3Sopenharmony_ci 793094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.remainEnergyPath.c_str(), buf, sizeof(buf)); 794094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 795094332d3Sopenharmony_ci return ret; 796094332d3Sopenharmony_ci } 797094332d3Sopenharmony_ci 798094332d3Sopenharmony_ci int32_t value = ParseInt(buf); 799094332d3Sopenharmony_ci *remainEnergy = value; 800094332d3Sopenharmony_ci 801094332d3Sopenharmony_ci return HDF_SUCCESS; 802094332d3Sopenharmony_ci} 803094332d3Sopenharmony_ci 804094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseVoltage(int32_t* voltage) 805094332d3Sopenharmony_ci{ 806094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 807094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.voltagePath.c_str(), buf, sizeof(buf)); 808094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 809094332d3Sopenharmony_ci return ret; 810094332d3Sopenharmony_ci } 811094332d3Sopenharmony_ci 812094332d3Sopenharmony_ci int32_t value = ParseInt(buf); 813094332d3Sopenharmony_ci *voltage = value; 814094332d3Sopenharmony_ci 815094332d3Sopenharmony_ci return HDF_SUCCESS; 816094332d3Sopenharmony_ci} 817094332d3Sopenharmony_ci 818094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseTemperature(int32_t* temperature) 819094332d3Sopenharmony_ci{ 820094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 821094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.temperaturePath.c_str(), buf, sizeof(buf)); 822094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 823094332d3Sopenharmony_ci return ret; 824094332d3Sopenharmony_ci } 825094332d3Sopenharmony_ci 826094332d3Sopenharmony_ci int32_t value = ParseInt(buf); 827094332d3Sopenharmony_ci *temperature = value; 828094332d3Sopenharmony_ci 829094332d3Sopenharmony_ci return HDF_SUCCESS; 830094332d3Sopenharmony_ci} 831094332d3Sopenharmony_ci 832094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseHealthState(int32_t* healthState) 833094332d3Sopenharmony_ci{ 834094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 835094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.healthStatePath.c_str(), buf, sizeof(buf)); 836094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 837094332d3Sopenharmony_ci return ret; 838094332d3Sopenharmony_ci } 839094332d3Sopenharmony_ci 840094332d3Sopenharmony_ci Trim(buf); 841094332d3Sopenharmony_ci *healthState = HealthStateEnumConverter(buf); 842094332d3Sopenharmony_ci return HDF_SUCCESS; 843094332d3Sopenharmony_ci} 844094332d3Sopenharmony_ci 845094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParsePluggedType(int32_t* pluggedType) 846094332d3Sopenharmony_ci{ 847094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 848094332d3Sopenharmony_ci GetPluggedTypeName(buf, sizeof(buf)); 849094332d3Sopenharmony_ci int32_t type = PluggedTypeEnumConverter(buf); 850094332d3Sopenharmony_ci if (type == PLUGGED_TYPE_BUTT) { 851094332d3Sopenharmony_ci BATTERY_HILOGD(FEATURE_BATT_INFO, "not support the online type %{public}s", buf); 852094332d3Sopenharmony_ci return HDF_ERR_NOT_SUPPORT; 853094332d3Sopenharmony_ci } 854094332d3Sopenharmony_ci 855094332d3Sopenharmony_ci *pluggedType = type; 856094332d3Sopenharmony_ci return HDF_SUCCESS; 857094332d3Sopenharmony_ci} 858094332d3Sopenharmony_ci 859094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseChargeState(int32_t* chargeState) 860094332d3Sopenharmony_ci{ 861094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 862094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.chargeStatePath.c_str(), buf, sizeof(buf)); 863094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 864094332d3Sopenharmony_ci return ret; 865094332d3Sopenharmony_ci } 866094332d3Sopenharmony_ci 867094332d3Sopenharmony_ci Trim(buf); 868094332d3Sopenharmony_ci *chargeState = ChargeStateEnumConverter(buf); 869094332d3Sopenharmony_ci return HDF_SUCCESS; 870094332d3Sopenharmony_ci} 871094332d3Sopenharmony_ci 872094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParsePresent(int8_t* present) 873094332d3Sopenharmony_ci{ 874094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 875094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.presentPath.c_str(), buf, sizeof(buf)); 876094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 877094332d3Sopenharmony_ci return ret; 878094332d3Sopenharmony_ci } 879094332d3Sopenharmony_ci 880094332d3Sopenharmony_ci auto value = static_cast<int8_t>(ParseInt(buf)); 881094332d3Sopenharmony_ci *present = value; 882094332d3Sopenharmony_ci return HDF_SUCCESS; 883094332d3Sopenharmony_ci} 884094332d3Sopenharmony_ci 885094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseChargeCounter(int32_t* chargeCounter) 886094332d3Sopenharmony_ci{ 887094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 888094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.chargeCounterPath.c_str(), buf, sizeof(buf)); 889094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 890094332d3Sopenharmony_ci return ret; 891094332d3Sopenharmony_ci } 892094332d3Sopenharmony_ci 893094332d3Sopenharmony_ci int32_t value = ParseInt(buf); 894094332d3Sopenharmony_ci *chargeCounter = value; 895094332d3Sopenharmony_ci 896094332d3Sopenharmony_ci return HDF_SUCCESS; 897094332d3Sopenharmony_ci} 898094332d3Sopenharmony_ci 899094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseTechnology(std::string& technology) 900094332d3Sopenharmony_ci{ 901094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 902094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(batterySysfsInfo_.technologyPath.c_str(), buf, sizeof(buf)); 903094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 904094332d3Sopenharmony_ci return ret; 905094332d3Sopenharmony_ci } 906094332d3Sopenharmony_ci 907094332d3Sopenharmony_ci technology.assign(buf, strlen(buf)); 908094332d3Sopenharmony_ci return HDF_SUCCESS; 909094332d3Sopenharmony_ci} 910094332d3Sopenharmony_ci 911094332d3Sopenharmony_ciint32_t PowerSupplyProvider::ParseChargeType(int32_t* chargeType, std::string& chargeTypePath) 912094332d3Sopenharmony_ci{ 913094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 914094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(chargeTypePath.c_str(), buf, sizeof(buf)); 915094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 916094332d3Sopenharmony_ci return ret; 917094332d3Sopenharmony_ci } 918094332d3Sopenharmony_ci 919094332d3Sopenharmony_ci Trim(buf); 920094332d3Sopenharmony_ci *chargeType = ChargeTypeEumConverter(buf); 921094332d3Sopenharmony_ci return HDF_SUCCESS; 922094332d3Sopenharmony_ci} 923094332d3Sopenharmony_ci 924094332d3Sopenharmony_ciBatterydInfo PowerSupplyProvider::GetBatteryInfo() 925094332d3Sopenharmony_ci{ 926094332d3Sopenharmony_ci UpdateInfoByReadSysFile(&g_batteryInfo); 927094332d3Sopenharmony_ci return g_batteryInfo; 928094332d3Sopenharmony_ci} 929094332d3Sopenharmony_ci 930094332d3Sopenharmony_civoid PowerSupplyProvider::CreateMockTechPath(std::string& mockTechPath) 931094332d3Sopenharmony_ci{ 932094332d3Sopenharmony_ci BATTERY_HILOGI(FEATURE_BATT_INFO, "create mockFilePath path"); 933094332d3Sopenharmony_ci CreateFile(mockTechPath + "/capacity", "1000"); 934094332d3Sopenharmony_ci CreateFile(mockTechPath + "/current_avg", "1000"); 935094332d3Sopenharmony_ci CreateFile(mockTechPath + "/current_now", "1000"); 936094332d3Sopenharmony_ci CreateFile(mockTechPath + "/health", "Over voltage"); 937094332d3Sopenharmony_ci CreateFile(mockTechPath + "/present", "0"); 938094332d3Sopenharmony_ci CreateFile(mockTechPath + "/status", "Not charging"); 939094332d3Sopenharmony_ci CreateFile(mockTechPath + "/type", "Unknown"); 940094332d3Sopenharmony_ci CreateFile(mockTechPath + "/temp", "345"); 941094332d3Sopenharmony_ci CreateFile(mockTechPath + "/technology", "Li-ion"); 942094332d3Sopenharmony_ci} 943094332d3Sopenharmony_ci 944094332d3Sopenharmony_civoid PowerSupplyProvider::CreateMockChargerPath(std::string& mockChargerPath) 945094332d3Sopenharmony_ci{ 946094332d3Sopenharmony_ci BATTERY_HILOGI(FEATURE_BATT_INFO, "create mockFilePath path"); 947094332d3Sopenharmony_ci CreateFile(mockChargerPath + "/type", "USB"); 948094332d3Sopenharmony_ci CreateFile(mockChargerPath + "/constant_charge_current", "0"); 949094332d3Sopenharmony_ci CreateFile(mockChargerPath + "/health", "Good"); 950094332d3Sopenharmony_ci CreateFile(mockChargerPath + "/online", "1"); 951094332d3Sopenharmony_ci CreateFile(mockChargerPath + "/status", "Charging"); 952094332d3Sopenharmony_ci} 953094332d3Sopenharmony_ci 954094332d3Sopenharmony_civoid PowerSupplyProvider::CreateMockBatteryPath(std::string& mockBatteryPath) 955094332d3Sopenharmony_ci{ 956094332d3Sopenharmony_ci BATTERY_HILOGI(FEATURE_BATT_INFO, "create mockFilePath path"); 957094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/capacity", "11"); 958094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/charge_control_limit", "0"); 959094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/charge_counter", "4000000"); 960094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/charge_full", "4000000"); 961094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/charge_now", "4000000"); 962094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/constant_charge_current", "0"); 963094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/current_avg", "1000"); 964094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/current_now", "1000"); 965094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/health", "Good"); 966094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/input_current_limit", "0"); 967094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/online", "1"); 968094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/present", "0"); 969094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/status", "Charging"); 970094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/temp", "222"); 971094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/voltage_avg", "4123456"); 972094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/voltage_now", "4123456"); 973094332d3Sopenharmony_ci CreateFile(mockBatteryPath + "/type", "Battery"); 974094332d3Sopenharmony_ci} 975094332d3Sopenharmony_ci 976094332d3Sopenharmony_civoid PowerSupplyProvider::InitDefaultSysfs() 977094332d3Sopenharmony_ci{ 978094332d3Sopenharmony_ci std::string mockBatteryPath = MOCK_POWER_SUPPLY_BASE_PATH + "/battery"; 979094332d3Sopenharmony_ci std::string mockChargerPath = MOCK_POWER_SUPPLY_BASE_PATH + "/ohos_charger"; 980094332d3Sopenharmony_ci std::string mockTechPath = MOCK_POWER_SUPPLY_BASE_PATH + "/ohos-fgu"; 981094332d3Sopenharmony_ci 982094332d3Sopenharmony_ci if (access(mockBatteryPath.c_str(), 0) == -1) { 983094332d3Sopenharmony_ci mkdir(mockBatteryPath.c_str(), S_IRWXU | S_IRWXG); 984094332d3Sopenharmony_ci sleep(MKDIR_WAIT_TIME); 985094332d3Sopenharmony_ci } 986094332d3Sopenharmony_ci 987094332d3Sopenharmony_ci if (access(mockChargerPath.c_str(), 0) == -1) { 988094332d3Sopenharmony_ci mkdir(mockChargerPath.c_str(), S_IRWXU); 989094332d3Sopenharmony_ci sleep(MKDIR_WAIT_TIME); 990094332d3Sopenharmony_ci } 991094332d3Sopenharmony_ci 992094332d3Sopenharmony_ci if (access(mockTechPath.c_str(), 0) == -1) { 993094332d3Sopenharmony_ci mkdir(mockTechPath.c_str(), S_IRWXU); 994094332d3Sopenharmony_ci sleep(MKDIR_WAIT_TIME); 995094332d3Sopenharmony_ci } 996094332d3Sopenharmony_ci 997094332d3Sopenharmony_ci CreateMockTechPath(mockTechPath); 998094332d3Sopenharmony_ci CreateMockChargerPath(mockChargerPath); 999094332d3Sopenharmony_ci CreateMockBatteryPath(mockBatteryPath); 1000094332d3Sopenharmony_ci path_ = MOCK_POWER_SUPPLY_BASE_PATH; 1001094332d3Sopenharmony_ci} 1002094332d3Sopenharmony_ci 1003094332d3Sopenharmony_ciint32_t PowerSupplyProvider::SetChargingLimit(const std::vector<ChargingLimit>& chargerLimitList, 1004094332d3Sopenharmony_ci std::string& currentPath, std::string& voltagePath) 1005094332d3Sopenharmony_ci{ 1006094332d3Sopenharmony_ci BATTERY_HILOGD(FEATURE_BATT_INFO, "enter"); 1007094332d3Sopenharmony_ci if (chargerLimitList.empty()) { 1008094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "the parameter is empty"); 1009094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1010094332d3Sopenharmony_ci } 1011094332d3Sopenharmony_ci 1012094332d3Sopenharmony_ci std::string limitPath; 1013094332d3Sopenharmony_ci std::string chargeLimitStr; 1014094332d3Sopenharmony_ci for (const auto& iter : chargerLimitList) { 1015094332d3Sopenharmony_ci if (iter.type == ChargingLimitType::TYPE_CURRENT) { 1016094332d3Sopenharmony_ci limitPath = currentPath; 1017094332d3Sopenharmony_ci } else if (iter.type == ChargingLimitType::TYPE_VOLTAGE) { 1018094332d3Sopenharmony_ci limitPath = voltagePath; 1019094332d3Sopenharmony_ci } 1020094332d3Sopenharmony_ci chargeLimitStr = chargeLimitStr + (iter.protocol + " " + std::to_string(iter.value) + "\n"); 1021094332d3Sopenharmony_ci } 1022094332d3Sopenharmony_ci 1023094332d3Sopenharmony_ci int32_t ret = SetConfigByPath(limitPath, chargeLimitStr); 1024094332d3Sopenharmony_ci if (ret < HDF_SUCCESS) { 1025094332d3Sopenharmony_ci return ret; 1026094332d3Sopenharmony_ci } 1027094332d3Sopenharmony_ci BATTERY_HILOGD(FEATURE_BATT_INFO, "Exit"); 1028094332d3Sopenharmony_ci return HDF_SUCCESS; 1029094332d3Sopenharmony_ci} 1030094332d3Sopenharmony_ci 1031094332d3Sopenharmony_ciint32_t PowerSupplyProvider::SetConfigByPath(const std::string& path, const std::string& value) 1032094332d3Sopenharmony_ci{ 1033094332d3Sopenharmony_ci BATTERY_HILOGI(FEATURE_BATT_INFO, "SetConfigByPath enter, path: %{public}s, value:%{public}s", 1034094332d3Sopenharmony_ci path.c_str(), value.c_str()); 1035094332d3Sopenharmony_ci if (path.empty()) { 1036094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "the featurePath is empty"); 1037094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1038094332d3Sopenharmony_ci } 1039094332d3Sopenharmony_ci 1040094332d3Sopenharmony_ci int32_t fd = open(path.c_str(), O_TRUNC | O_WRONLY); 1041094332d3Sopenharmony_ci if (fd < NUM_ZERO) { 1042094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "failed to open file %{public}s, errno: %{public}d", 1043094332d3Sopenharmony_ci path.c_str(), errno); 1044094332d3Sopenharmony_ci return HDF_ERR_IO; 1045094332d3Sopenharmony_ci } 1046094332d3Sopenharmony_ci 1047094332d3Sopenharmony_ci ssize_t size = static_cast<ssize_t>(value.length()); 1048094332d3Sopenharmony_ci if (write(fd, value.c_str(), size) != size) { 1049094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "failed to write file %{public}s, errno: %{public}d", 1050094332d3Sopenharmony_ci path.c_str(), errno); 1051094332d3Sopenharmony_ci close(fd); 1052094332d3Sopenharmony_ci return HDF_ERR_IO; 1053094332d3Sopenharmony_ci } 1054094332d3Sopenharmony_ci close(fd); 1055094332d3Sopenharmony_ci 1056094332d3Sopenharmony_ci BATTERY_HILOGD(FEATURE_BATT_INFO, "SetConfigByPath exit"); 1057094332d3Sopenharmony_ci return HDF_SUCCESS; 1058094332d3Sopenharmony_ci} 1059094332d3Sopenharmony_ci 1060094332d3Sopenharmony_ciint32_t PowerSupplyProvider::GetConfigByPath(const std::string& path, std::string& result) 1061094332d3Sopenharmony_ci{ 1062094332d3Sopenharmony_ci if (path.empty()) { 1063094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "the featurePath is empty"); 1064094332d3Sopenharmony_ci result = ""; 1065094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1066094332d3Sopenharmony_ci } 1067094332d3Sopenharmony_ci 1068094332d3Sopenharmony_ci char buf[MAX_BUFF_SIZE] = {0}; 1069094332d3Sopenharmony_ci int32_t ret = ReadBatterySysfsToBuff(path.c_str(), buf, sizeof(buf)); 1070094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 1071094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "read config failed, path: %{public}s", path.c_str()); 1072094332d3Sopenharmony_ci result = ""; 1073094332d3Sopenharmony_ci return ret; 1074094332d3Sopenharmony_ci } 1075094332d3Sopenharmony_ci Trim(buf); 1076094332d3Sopenharmony_ci result = buf; 1077094332d3Sopenharmony_ci BATTERY_HILOGI(FEATURE_BATT_INFO, "GetConfigByPath(%{public}s) exit, value:%{public}s", 1078094332d3Sopenharmony_ci path.c_str(), result.c_str()); 1079094332d3Sopenharmony_ci return HDF_SUCCESS; 1080094332d3Sopenharmony_ci} 1081094332d3Sopenharmony_ci 1082094332d3Sopenharmony_ciint32_t PowerSupplyProvider::CheckPathExists(const std::string& path, bool& result) 1083094332d3Sopenharmony_ci{ 1084094332d3Sopenharmony_ci if (path.empty()) { 1085094332d3Sopenharmony_ci BATTERY_HILOGE(FEATURE_BATT_INFO, "the path is empty"); 1086094332d3Sopenharmony_ci result = false; 1087094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 1088094332d3Sopenharmony_ci } 1089094332d3Sopenharmony_ci result = access(path.c_str(), F_OK) == 0; 1090094332d3Sopenharmony_ci BATTERY_HILOGI(FEATURE_BATT_INFO, "CheckPathExists(%{public}s) exit, value:%{public}d", path.c_str(), result); 1091094332d3Sopenharmony_ci return HDF_SUCCESS; 1092094332d3Sopenharmony_ci} 1093094332d3Sopenharmony_ci} // namespace V2_0 1094094332d3Sopenharmony_ci} // namespace Battery 1095094332d3Sopenharmony_ci} // namespace HDI 1096094332d3Sopenharmony_ci} // namespace OHOS 1097