1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "LearnedCapacityBackupRestore.h"
18 
19 namespace device {
20 namespace google {
21 namespace wahoo {
22 namespace health {
23 
24 static constexpr char kChgFullFile[] = "sys/class/power_supply/bms/charge_full";
25 static constexpr char kSysCFPersistFile[] = "/persist/battery/qcom_charge_full";
26 static constexpr int kBuffSize = 256;
27 
LearnedCapacityBackupRestore()28 LearnedCapacityBackupRestore::LearnedCapacityBackupRestore() : sw_cap_(0), hw_cap_(0) {}
29 
Restore()30 void LearnedCapacityBackupRestore::Restore() {
31     ReadFromStorage();
32     ReadFromSRAM();
33     if (sw_cap_ == 0) {
34         // First backup
35         sw_cap_ = hw_cap_;
36         SaveToStorage();
37     } else {
38         // Always restore backup value
39         SaveToSRAM();
40     }
41 }
42 
Backup()43 void LearnedCapacityBackupRestore::Backup() {
44     ReadFromSRAM();
45     if (sw_cap_ != hw_cap_) {
46         // Always backup the new FG computed learned capacity
47         sw_cap_ = hw_cap_;
48         SaveToStorage();
49     }
50 }
51 
ReadFromStorage()52 void LearnedCapacityBackupRestore::ReadFromStorage() {
53     std::string buffer;
54 
55     if (!android::base::ReadFileToString(std::string(kSysCFPersistFile), &buffer)) {
56         LOG(ERROR) << "Cannot read the storage file";
57         return;
58     }
59 
60     if (sscanf(buffer.c_str(), "%d", &sw_cap_) < 1)
61         LOG(ERROR) << "data format is wrong in the storage file: " << buffer;
62     else
63         LOG(INFO) << "Storage data: " << buffer;
64 }
65 
SaveToStorage()66 void LearnedCapacityBackupRestore::SaveToStorage() {
67     char strData[kBuffSize];
68 
69     snprintf(strData, kBuffSize, "%d", sw_cap_);
70 
71     LOG(INFO) << "Save to Storage: " << strData;
72 
73     if (!android::base::WriteStringToFile(strData, std::string(kSysCFPersistFile)))
74         LOG(ERROR) << "Write file error: " << strerror(errno);
75 }
76 
ReadFromSRAM()77 void LearnedCapacityBackupRestore::ReadFromSRAM() {
78     std::string buffer;
79 
80     if (!android::base::ReadFileToString(std::string(kChgFullFile), &buffer)) {
81         LOG(ERROR) << "Read cycle counter error: " << strerror(errno);
82         return;
83     }
84 
85     buffer = android::base::Trim(buffer);
86 
87     if (sscanf(buffer.c_str(), "%d", &hw_cap_) < 1)
88         LOG(ERROR) << "Failed to parse SRAM bins: " << buffer;
89     else
90         LOG(INFO) << "SRAM data: " << buffer;
91 }
92 
SaveToSRAM()93 void LearnedCapacityBackupRestore::SaveToSRAM() {
94     char strData[kBuffSize];
95 
96     snprintf(strData, kBuffSize, "%d", hw_cap_);
97 
98     LOG(INFO) << "Save to SRAM: " << strData;
99 
100     if (!android::base::WriteStringToFile(strData, std::string(kChgFullFile)))
101         LOG(ERROR) << "Write data error: " << strerror(errno);
102 }
103 
104 }  // namespace health
105 }  // namespace wahoo
106 }  // namespace google
107 }  // namespace device
108