| /* |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #define LOG_TAG "android.hardware.health-service.cuttlefish" |
| |
| #include <memory> |
| #include <string_view> |
| |
| #include <android-base/logging.h> |
| #include <android/binder_interface_utils.h> |
| #include <health-impl/Health.h> |
| #include <health/utils.h> |
| |
| using ::aidl::android::hardware::health::BatteryHealth; |
| using ::aidl::android::hardware::health::BatteryStatus; |
| using ::aidl::android::hardware::health::HalHealthLoop; |
| using ::aidl::android::hardware::health::Health; |
| using ::aidl::android::hardware::health::HealthInfo; |
| using ::aidl::android::hardware::health::IHealth; |
| using ::android::hardware::health::InitHealthdConfig; |
| using ::ndk::ScopedAStatus; |
| using ::ndk::SharedRefBase; |
| using namespace std::literals; |
| |
| namespace aidl::android::hardware::health { |
| |
| // Health HAL implementation for cuttlefish. Note that in this implementation, |
| // cuttlefish pretends to be a device with a battery being charged. |
| // Implementations on real devices should not insert these fake values. For |
| // example, a battery-less device should report batteryPresent = false and |
| // batteryStatus = UNKNOWN. |
| |
| class HealthImpl : public Health { |
| public: |
| // Inherit constructor. |
| using Health::Health; |
| virtual ~HealthImpl() {} |
| |
| ScopedAStatus getChargeCounterUah(int32_t* out) override; |
| ScopedAStatus getCurrentNowMicroamps(int32_t* out) override; |
| ScopedAStatus getCurrentAverageMicroamps(int32_t* out) override; |
| ScopedAStatus getCapacity(int32_t* out) override; |
| ScopedAStatus getChargeStatus(BatteryStatus* out) override; |
| |
| protected: |
| void UpdateHealthInfo(HealthInfo* health_info) override; |
| }; |
| |
| void HealthImpl::UpdateHealthInfo(HealthInfo* health_info) { |
| health_info->chargerAcOnline = true; |
| health_info->chargerUsbOnline = true; |
| health_info->chargerWirelessOnline = false; |
| health_info->maxChargingCurrentMicroamps = 500000; |
| health_info->maxChargingVoltageMicrovolts = 5000000; |
| health_info->batteryStatus = BatteryStatus::CHARGING; |
| health_info->batteryHealth = BatteryHealth::GOOD; |
| health_info->batteryPresent = true; |
| health_info->batteryLevel = 85; |
| health_info->batteryVoltageMillivolts = 3600; |
| health_info->batteryTemperatureTenthsCelsius = 350; |
| health_info->batteryCurrentMicroamps = 400000; |
| health_info->batteryCycleCount = 32; |
| health_info->batteryFullChargeUah = 4000000; |
| health_info->batteryChargeCounterUah = 1900000; |
| health_info->batteryTechnology = "Li-ion"; |
| } |
| |
| ScopedAStatus HealthImpl::getChargeCounterUah(int32_t* out) { |
| *out = 1900000; |
| return ScopedAStatus::ok(); |
| } |
| |
| ScopedAStatus HealthImpl::getCurrentNowMicroamps(int32_t* out) { |
| *out = 400000; |
| return ScopedAStatus::ok(); |
| } |
| |
| ScopedAStatus HealthImpl::getCurrentAverageMicroamps(int32_t*) { |
| return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); |
| } |
| |
| ScopedAStatus HealthImpl::getCapacity(int32_t* out) { |
| *out = 85; |
| return ScopedAStatus::ok(); |
| } |
| |
| ScopedAStatus HealthImpl::getChargeStatus(BatteryStatus* out) { |
| *out = BatteryStatus::CHARGING; |
| return ScopedAStatus::ok(); |
| } |
| |
| } // namespace aidl::android::hardware::health |
| |
| int main(int, [[maybe_unused]] char** argv) { |
| #ifdef __ANDROID_RECOVERY__ |
| android::base::InitLogging(argv, android::base::KernelLogger); |
| #endif |
| // Cuttlefish does not support offline-charging mode, hence do not handle |
| // --charger option. |
| using aidl::android::hardware::health::HealthImpl; |
| LOG(INFO) << "Starting health HAL."; |
| auto config = std::make_unique<healthd_config>(); |
| InitHealthdConfig(config.get()); |
| auto binder = SharedRefBase::make<HealthImpl>("default", std::move(config)); |
| auto hal_health_loop = std::make_shared<HalHealthLoop>(binder, binder); |
| return hal_health_loop->StartLoop(); |
| } |