Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 842c7724 authored by Jack Wu's avatar Jack Wu Committed by Automerger Merge Worker
Browse files

BatteryMonitor: get battery health data from sys file nodes am: e561d03c am:...

BatteryMonitor: get battery health data from sys file nodes am: e561d03c am: 8cc0bbf6 am: cf014940

Original change: https://android-review.googlesource.com/c/platform/system/core/+/2317311



Change-Id: If79b82cc8d26547fdccc96e723c16199222a9fa3
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 5618d5ca cf014940
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -76,7 +76,7 @@ cc_library_static {
    name: "libbatterymonitor",
    name: "libbatterymonitor",
    defaults: ["libbatterymonitor_defaults"],
    defaults: ["libbatterymonitor_defaults"],
    static_libs: [
    static_libs: [
        "android.hardware.health-V1-ndk",
        "android.hardware.health-V2-ndk",
    ],
    ],
    whole_static_libs: [
    whole_static_libs: [
        // Need to translate HIDL to AIDL to support legacy APIs in
        // Need to translate HIDL to AIDL to support legacy APIs in
@@ -202,12 +202,12 @@ cc_library_static {
    defaults: ["libhealthd_charger_ui_defaults"],
    defaults: ["libhealthd_charger_ui_defaults"],


    static_libs: [
    static_libs: [
        "android.hardware.health-V1-ndk",
        "android.hardware.health-V2-ndk",
        "android.hardware.health-translate-ndk",
        "android.hardware.health-translate-ndk",
    ],
    ],


    export_static_lib_headers: [
    export_static_lib_headers: [
        "android.hardware.health-V1-ndk",
        "android.hardware.health-V2-ndk",
    ],
    ],
}
}


@@ -279,7 +279,7 @@ cc_defaults {
    static_libs: [
    static_libs: [
        // common
        // common
        "android.hardware.health@1.0-convert",
        "android.hardware.health@1.0-convert",
        "android.hardware.health-V1-ndk",
        "android.hardware.health-V2-ndk",
        "libbatterymonitor",
        "libbatterymonitor",
        "libcharger_sysprop",
        "libcharger_sysprop",
        "libhealthd_charger_nops",
        "libhealthd_charger_nops",
+155 −0
Original line number Original line Diff line number Diff line
@@ -55,7 +55,10 @@ using HealthInfo_1_0 = android::hardware::health::V1_0::HealthInfo;
using HealthInfo_2_0 = android::hardware::health::V2_0::HealthInfo;
using HealthInfo_2_0 = android::hardware::health::V2_0::HealthInfo;
using HealthInfo_2_1 = android::hardware::health::V2_1::HealthInfo;
using HealthInfo_2_1 = android::hardware::health::V2_1::HealthInfo;
using aidl::android::hardware::health::BatteryCapacityLevel;
using aidl::android::hardware::health::BatteryCapacityLevel;
using aidl::android::hardware::health::BatteryChargingPolicy;
using aidl::android::hardware::health::BatteryChargingState;
using aidl::android::hardware::health::BatteryHealth;
using aidl::android::hardware::health::BatteryHealth;
using aidl::android::hardware::health::BatteryHealthData;
using aidl::android::hardware::health::BatteryStatus;
using aidl::android::hardware::health::BatteryStatus;
using aidl::android::hardware::health::HealthInfo;
using aidl::android::hardware::health::HealthInfo;


@@ -227,6 +230,37 @@ BatteryHealth getBatteryHealth(const char* status) {
    return *ret;
    return *ret;
}
}


BatteryChargingPolicy getBatteryChargingPolicy(const char* chargingPolicy) {
    static SysfsStringEnumMap<BatteryChargingPolicy> batteryChargingPolicyMap[] = {
            {"0", BatteryChargingPolicy::INVALID},   {"1", BatteryChargingPolicy::DEFAULT},
            {"2", BatteryChargingPolicy::LONG_LIFE}, {"3", BatteryChargingPolicy::ADAPTIVE},
            {NULL, BatteryChargingPolicy::DEFAULT},
    };

    auto ret = mapSysfsString(chargingPolicy, batteryChargingPolicyMap);
    if (!ret) {
        *ret = BatteryChargingPolicy::DEFAULT;
    }

    return *ret;
}

BatteryChargingState getBatteryChargingState(const char* chargingState) {
    static SysfsStringEnumMap<BatteryChargingState> batteryChargingStateMap[] = {
            {"0", BatteryChargingState::INVALID},   {"1", BatteryChargingState::NORMAL},
            {"2", BatteryChargingState::TOO_COLD},  {"3", BatteryChargingState::TOO_HOT},
            {"4", BatteryChargingState::LONG_LIFE}, {"5", BatteryChargingState::ADAPTIVE},
            {NULL, BatteryChargingState::NORMAL},
    };

    auto ret = mapSysfsString(chargingState, batteryChargingStateMap);
    if (!ret) {
        *ret = BatteryChargingState::NORMAL;
    }

    return *ret;
}

static int readFromFile(const String8& path, std::string* buf) {
static int readFromFile(const String8& path, std::string* buf) {
    buf->clear();
    buf->clear();
    if (android::base::ReadFileToString(path.c_str(), buf)) {
    if (android::base::ReadFileToString(path.c_str(), buf)) {
@@ -235,6 +269,10 @@ static int readFromFile(const String8& path, std::string* buf) {
    return buf->length();
    return buf->length();
}
}


static bool writeToFile(const String8& path, int32_t in_value) {
    return android::base::WriteStringToFile(std::to_string(in_value), path.c_str());
}

static BatteryMonitor::PowerSupplyType readPowerSupplyType(const String8& path) {
static BatteryMonitor::PowerSupplyType readPowerSupplyType(const String8& path) {
    static SysfsStringEnumMap<int> supplyTypeMap[] = {
    static SysfsStringEnumMap<int> supplyTypeMap[] = {
            {"Unknown", BatteryMonitor::ANDROID_POWER_SUPPLY_TYPE_UNKNOWN},
            {"Unknown", BatteryMonitor::ANDROID_POWER_SUPPLY_TYPE_UNKNOWN},
@@ -336,6 +374,17 @@ void BatteryMonitor::updateValues(void) {
        mHealthInfo->batteryFullChargeDesignCapacityUah =
        mHealthInfo->batteryFullChargeDesignCapacityUah =
                getIntField(mHealthdConfig->batteryFullChargeDesignCapacityUahPath);
                getIntField(mHealthdConfig->batteryFullChargeDesignCapacityUahPath);


    if (!mHealthdConfig->batteryStateOfHealthPath.isEmpty())
        mHealthInfo->batteryStateOfHealth = getIntField(mHealthdConfig->batteryStateOfHealthPath);

    if (!mHealthdConfig->batteryManufacturingDatePath.isEmpty())
        mHealthInfo->batteryHealthData->batteryManufacturingDateSeconds =
                getIntField(mHealthdConfig->batteryManufacturingDatePath);

    if (!mHealthdConfig->batteryFirstUsageDatePath.isEmpty())
        mHealthInfo->batteryHealthData->batteryFirstUsageSeconds =
                getIntField(mHealthdConfig->batteryFirstUsageDatePath);

    mHealthInfo->batteryTemperatureTenthsCelsius =
    mHealthInfo->batteryTemperatureTenthsCelsius =
            mBatteryFixedTemperature ? mBatteryFixedTemperature
            mBatteryFixedTemperature ? mBatteryFixedTemperature
                                     : getIntField(mHealthdConfig->batteryTemperaturePath);
                                     : getIntField(mHealthdConfig->batteryTemperaturePath);
@@ -354,6 +403,12 @@ void BatteryMonitor::updateValues(void) {
    if (readFromFile(mHealthdConfig->batteryTechnologyPath, &buf) > 0)
    if (readFromFile(mHealthdConfig->batteryTechnologyPath, &buf) > 0)
        mHealthInfo->batteryTechnology = String8(buf.c_str());
        mHealthInfo->batteryTechnology = String8(buf.c_str());


    if (readFromFile(mHealthdConfig->chargingPolicyPath, &buf) > 0)
        mHealthInfo->chargingPolicy = getBatteryChargingPolicy(buf.c_str());

    if (readFromFile(mHealthdConfig->chargingStatePath, &buf) > 0)
        mHealthInfo->chargingState = getBatteryChargingState(buf.c_str());

    double MaxPower = 0;
    double MaxPower = 0;


    for (size_t i = 0; i < mChargerNames.size(); i++) {
    for (size_t i = 0; i < mChargerNames.size(); i++) {
@@ -476,6 +531,43 @@ int BatteryMonitor::getChargeStatus() {
    return static_cast<int>(result);
    return static_cast<int>(result);
}
}


status_t BatteryMonitor::setChargingPolicy(int value) {
    status_t ret = NAME_NOT_FOUND;
    bool result;
    if (!mHealthdConfig->chargingPolicyPath.isEmpty()) {
        result = writeToFile(mHealthdConfig->chargingPolicyPath, value);
        if (!result) {
            KLOG_WARNING(LOG_TAG, "setChargingPolicy fail\n");
            ret = BAD_VALUE;
        } else {
            ret = OK;
        }
    }
    return ret;
}

int BatteryMonitor::getChargingPolicy() {
    BatteryChargingPolicy result = BatteryChargingPolicy::DEFAULT;
    if (!mHealthdConfig->chargingPolicyPath.isEmpty()) {
        std::string buf;
        if (readFromFile(mHealthdConfig->chargingPolicyPath, &buf) > 0)
            result = getBatteryChargingPolicy(buf.c_str());
    }
    return static_cast<int>(result);
}

int BatteryMonitor::getBatteryHealthData(int id) {
    if (id == BATTERY_PROP_MANUFACTURING_DATE) {
        if (!mHealthdConfig->batteryManufacturingDatePath.isEmpty())
            return getIntField(mHealthdConfig->batteryManufacturingDatePath);
    }
    if (id == BATTERY_PROP_FIRST_USAGE_DATE) {
        if (!mHealthdConfig->batteryFirstUsageDatePath.isEmpty())
            return getIntField(mHealthdConfig->batteryFirstUsageDatePath);
    }
    return 0;
}

status_t BatteryMonitor::getProperty(int id, struct BatteryProperty *val) {
status_t BatteryMonitor::getProperty(int id, struct BatteryProperty *val) {
    status_t ret = BAD_VALUE;
    status_t ret = BAD_VALUE;
    std::string buf;
    std::string buf;
@@ -536,6 +628,21 @@ status_t BatteryMonitor::getProperty(int id, struct BatteryProperty *val) {
        ret = OK;
        ret = OK;
        break;
        break;


    case BATTERY_PROP_CHARGING_POLICY:
        val->valueInt64 = getChargingPolicy();
        ret = OK;
        break;

    case BATTERY_PROP_MANUFACTURING_DATE:
        val->valueInt64 = getBatteryHealthData(BATTERY_PROP_MANUFACTURING_DATE);
        ret = OK;
        break;

    case BATTERY_PROP_FIRST_USAGE_DATE:
        val->valueInt64 = getBatteryHealthData(BATTERY_PROP_FIRST_USAGE_DATE);
        ret = OK;
        break;

    default:
    default:
        break;
        break;
    }
    }
@@ -758,6 +865,44 @@ void BatteryMonitor::init(struct healthd_config *hc) {
                        mHealthdConfig->batteryTechnologyPath = path;
                        mHealthdConfig->batteryTechnologyPath = path;
                }
                }


                if (mHealthdConfig->batteryStateOfHealthPath.isEmpty()) {
                    path.clear();
                    path.appendFormat("%s/%s/state_of_health", POWER_SUPPLY_SYSFS_PATH, name);
                    if (access(path, R_OK) == 0) {
                        mHealthdConfig->batteryStateOfHealthPath = path;
                    } else {
                        path.clear();
                        path.appendFormat("%s/%s/health_index", POWER_SUPPLY_SYSFS_PATH, name);
                        if (access(path, R_OK) == 0)
                            mHealthdConfig->batteryStateOfHealthPath = path;
                    }
                }

                if (mHealthdConfig->batteryManufacturingDatePath.isEmpty()) {
                    path.clear();
                    path.appendFormat("%s/%s/manufacturing_date", POWER_SUPPLY_SYSFS_PATH, name);
                    if (access(path, R_OK) == 0)
                        mHealthdConfig->batteryManufacturingDatePath = path;
                }

                if (mHealthdConfig->batteryFirstUsageDatePath.isEmpty()) {
                    path.clear();
                    path.appendFormat("%s/%s/first_usage_date", POWER_SUPPLY_SYSFS_PATH, name);
                    if (access(path, R_OK) == 0) mHealthdConfig->batteryFirstUsageDatePath = path;
                }

                if (mHealthdConfig->chargingStatePath.isEmpty()) {
                    path.clear();
                    path.appendFormat("%s/%s/charging_state", POWER_SUPPLY_SYSFS_PATH, name);
                    if (access(path, R_OK) == 0) mHealthdConfig->chargingStatePath = path;
                }

                if (mHealthdConfig->chargingPolicyPath.isEmpty()) {
                    path.clear();
                    path.appendFormat("%s/%s/charging_policy", POWER_SUPPLY_SYSFS_PATH, name);
                    if (access(path, R_OK) == 0) mHealthdConfig->chargingPolicyPath = path;
                }

                break;
                break;


            case ANDROID_POWER_SUPPLY_TYPE_UNKNOWN:
            case ANDROID_POWER_SUPPLY_TYPE_UNKNOWN:
@@ -810,6 +955,16 @@ void BatteryMonitor::init(struct healthd_config *hc) {
            KLOG_WARNING(LOG_TAG, "batteryChargeTimeToFullNowPath. not found\n");
            KLOG_WARNING(LOG_TAG, "batteryChargeTimeToFullNowPath. not found\n");
        if (mHealthdConfig->batteryFullChargeDesignCapacityUahPath.isEmpty())
        if (mHealthdConfig->batteryFullChargeDesignCapacityUahPath.isEmpty())
            KLOG_WARNING(LOG_TAG, "batteryFullChargeDesignCapacityUahPath. not found\n");
            KLOG_WARNING(LOG_TAG, "batteryFullChargeDesignCapacityUahPath. not found\n");
        if (mHealthdConfig->batteryStateOfHealthPath.isEmpty())
            KLOG_WARNING(LOG_TAG, "batteryStateOfHealthPath not found\n");
        if (mHealthdConfig->batteryManufacturingDatePath.isEmpty())
            KLOG_WARNING(LOG_TAG, "batteryManufacturingDatePath not found\n");
        if (mHealthdConfig->batteryFirstUsageDatePath.isEmpty())
            KLOG_WARNING(LOG_TAG, "batteryFirstUsageDatePath not found\n");
        if (mHealthdConfig->chargingStatePath.isEmpty())
            KLOG_WARNING(LOG_TAG, "chargingStatePath not found\n");
        if (mHealthdConfig->chargingPolicyPath.isEmpty())
            KLOG_WARNING(LOG_TAG, "chargingPolicyPath not found\n");
    }
    }


    if (property_get("ro.boot.fake_battery", pval, NULL) > 0
    if (property_get("ro.boot.fake_battery", pval, NULL) > 0
+4 −0
Original line number Original line Diff line number Diff line
@@ -72,6 +72,10 @@ class BatteryMonitor {
    void logValues(void);
    void logValues(void);
    bool isChargerOnline();
    bool isChargerOnline();


    int setChargingPolicy(int value);
    int getChargingPolicy();
    int getBatteryHealthData(int id);

    static void logValues(const android::hardware::health::V2_1::HealthInfo& health_info,
    static void logValues(const android::hardware::health::V2_1::HealthInfo& health_info,
                          const struct healthd_config& healthd_config);
                          const struct healthd_config& healthd_config);


+5 −0
Original line number Original line Diff line number Diff line
@@ -72,6 +72,11 @@ struct healthd_config {
    android::String8 batteryCapacityLevelPath;
    android::String8 batteryCapacityLevelPath;
    android::String8 batteryChargeTimeToFullNowPath;
    android::String8 batteryChargeTimeToFullNowPath;
    android::String8 batteryFullChargeDesignCapacityUahPath;
    android::String8 batteryFullChargeDesignCapacityUahPath;
    android::String8 batteryStateOfHealthPath;
    android::String8 batteryManufacturingDatePath;
    android::String8 batteryFirstUsageDatePath;
    android::String8 chargingStatePath;
    android::String8 chargingPolicyPath;


    int (*energyCounter)(int64_t *);
    int (*energyCounter)(int64_t *);
    int boot_min_cap;
    int boot_min_cap;