1/* 2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "battery_led.h" 17#include "charger_log.h" 18 19using namespace OHOS::HDI::Battery::V2_0; 20using namespace OHOS::HDI::Light::V1_0; 21using namespace std; 22 23namespace OHOS { 24namespace PowerMgr { 25namespace { 26constexpr uint32_t MOVE_RIGHT_16 = 16; 27constexpr uint32_t MOVE_RIGHT_8 = 8; 28} // namespace 29void BatteryLed::InitLight() 30{ 31 batteryLight_ = ILightInterface::Get(); 32 if (batteryLight_ == nullptr) { 33 BATTERY_HILOGW(FEATURE_CHARGING, "Light interface is null"); 34 return; 35 } 36 37 vector<HdfLightInfo> lightInfo; 38 if (batteryLight_->GetLightInfo(lightInfo) < HDF_SUCCESS) { 39 BATTERY_HILOGW(FEATURE_CHARGING, "Get battert light failed"); 40 return; 41 } 42 43 available_ = std::any_of(lightInfo.begin(), lightInfo.end(), [](const auto &item) { 44 return item.lightId == HdfLightId::HDF_LIGHT_ID_BATTERY; 45 }); 46 BATTERY_HILOGI(FEATURE_CHARGING, "Battery light is available: %{public}d", available_); 47} 48 49void BatteryLed::TurnOff() 50{ 51 if (!available_) { 52 return; 53 } 54 int32_t ret = batteryLight_->TurnOffLight(HdfLightId::HDF_LIGHT_ID_BATTERY); 55 if (ret < HDF_SUCCESS) { 56 BATTERY_HILOGW(FEATURE_CHARGING, "Failed to turn off the battery light"); 57 } 58 lightColor_ = (ret < HDF_SUCCESS) ? lightColor_ : 0; 59} 60 61void BatteryLed::TurnOn(uint32_t color) 62{ 63 if (!available_) { 64 return; 65 } 66 struct HdfLightEffect effect; 67 effect.lightColor.colorValue.rgbColor.r = static_cast<uint8_t>((color >> MOVE_RIGHT_16) & 0xFF); 68 effect.lightColor.colorValue.rgbColor.g = static_cast<uint8_t>((color >> MOVE_RIGHT_8) & 0xFF); 69 effect.lightColor.colorValue.rgbColor.b = static_cast<uint8_t>(color & 0xFF); 70 71 BATTERY_HILOGD(FEATURE_CHARGING, "battery light color is %{public}d", color); 72 int32_t ret = batteryLight_->TurnOnLight(HdfLightId::HDF_LIGHT_ID_BATTERY, effect); 73 if (ret < HDF_SUCCESS) { 74 BATTERY_HILOGW(FEATURE_CHARGING, "Failed to turn on the battery light"); 75 } 76 lightColor_ = (ret < HDF_SUCCESS) ? lightColor_ : color; 77} 78 79bool BatteryLed::UpdateColor(int32_t chargeState, int32_t capacity) 80{ 81 if ((chargeState == static_cast<int32_t>(BatteryChargeState::CHARGE_STATE_NONE)) || 82 (chargeState == static_cast<int32_t>(BatteryChargeState::CHARGE_STATE_RESERVED)) || !available_) { 83 BATTERY_HILOGD(FEATURE_CHARGING, "not in charging state, turn off battery light"); 84 TurnOff(); 85 return false; 86 } 87 88 const auto& lightConf = BatteryConfig::GetInstance().GetLightConf(); 89 for (const auto& it : lightConf) { 90 if ((capacity >= it.beginSoc) && (capacity <= it.endSoc)) { 91 if (lightColor_ == it.rgb) { 92 return true; 93 } 94 TurnOff(); 95 TurnOn(it.rgb); 96 return true; 97 } 98 } 99 return false; 100} 101 102bool BatteryLed::IsAvailable() const 103{ 104 return available_; 105} 106 107uint32_t BatteryLed::GetLightColor() const 108{ 109 return lightColor_; 110} 111} // namespace PowerMgr 112} // namespace OHOS 113