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