Home | History | Annotate | Download | only in health
      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 
     28 LearnedCapacityBackupRestore::LearnedCapacityBackupRestore() {}
     29 
     30 void LearnedCapacityBackupRestore::Restore() {
     31     ReadFromStorage();
     32     ReadFromSRAM();
     33     UpdateAndSave();
     34 }
     35 
     36 void LearnedCapacityBackupRestore::Backup() {
     37     ReadFromSRAM();
     38     UpdateAndSave();
     39 }
     40 
     41 void LearnedCapacityBackupRestore::ReadFromStorage() {
     42     std::string buffer;
     43 
     44     if (!android::base::ReadFileToString(std::string(kSysCFPersistFile), &buffer)) {
     45         LOG(ERROR) << "Cannot read the storage file";
     46         return;
     47     }
     48 
     49     if (sscanf(buffer.c_str(), "%d", &sw_cap_) < 1)
     50         LOG(ERROR) << "data format is wrong in the storage file: " << buffer;
     51     else
     52         LOG(INFO) << "Storage data: " << buffer;
     53 }
     54 
     55 void LearnedCapacityBackupRestore::SaveToStorage() {
     56     char strData[kBuffSize];
     57 
     58     snprintf(strData, kBuffSize, "%d", sw_cap_);
     59 
     60     LOG(INFO) << "Save to Storage: " << strData;
     61 
     62     if (!android::base::WriteStringToFile(strData, std::string(kSysCFPersistFile)))
     63         LOG(ERROR) << "Write file error: " << strerror(errno);
     64 }
     65 
     66 void LearnedCapacityBackupRestore::ReadFromSRAM() {
     67     std::string buffer;
     68 
     69     if (!android::base::ReadFileToString(std::string(kChgFullFile), &buffer)) {
     70         LOG(ERROR) << "Read cycle counter error: " << strerror(errno);
     71         return;
     72     }
     73 
     74     buffer = android::base::Trim(buffer);
     75 
     76     if (sscanf(buffer.c_str(), "%d", &hw_cap_) < 1)
     77         LOG(ERROR) << "Failed to parse SRAM bins: " << buffer;
     78     else
     79         LOG(INFO) << "SRAM data: " << buffer;
     80 }
     81 
     82 void LearnedCapacityBackupRestore::SaveToSRAM() {
     83     char strData[kBuffSize];
     84 
     85     snprintf(strData, kBuffSize, "%d", hw_cap_);
     86 
     87     LOG(INFO) << "Save to SRAM: " << strData;
     88 
     89     if (!android::base::WriteStringToFile(strData, std::string(kChgFullFile)))
     90         LOG(ERROR) << "Write data error: " << strerror(errno);
     91 }
     92 
     93 void LearnedCapacityBackupRestore::UpdateAndSave() {
     94     bool backup = false;
     95     bool restore = false;
     96     if (hw_cap_) {
     97         if ((hw_cap_ < sw_cap_) || (sw_cap_ == 0)) {
     98             sw_cap_ = hw_cap_;
     99             backup = true;
    100         } else if (hw_cap_ > sw_cap_) {
    101             hw_cap_ = sw_cap_;
    102             restore = true;
    103         }
    104     }
    105     if (restore)
    106         SaveToSRAM();
    107     if (backup)
    108         SaveToStorage();
    109 }
    110 
    111 }  // namespace health
    112 }  // namespace wahoo
    113 }  // namespace google
    114 }  // namespace device
    115