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