1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "light_if_service.h" 17094332d3Sopenharmony_ci#include <hdf_base.h> 18094332d3Sopenharmony_ci#include "light_uhdf_log.h" 19094332d3Sopenharmony_ci#include "hitrace_meter.h" 20094332d3Sopenharmony_ci 21094332d3Sopenharmony_ci#define HDF_LOG_TAG "uhdf_light_service" 22094332d3Sopenharmony_ci 23094332d3Sopenharmony_cinamespace OHOS { 24094332d3Sopenharmony_cinamespace HDI { 25094332d3Sopenharmony_cinamespace Light { 26094332d3Sopenharmony_cinamespace V1_0 { 27094332d3Sopenharmony_ciLightIfService::LightIfService() 28094332d3Sopenharmony_ci{ 29094332d3Sopenharmony_ci int32_t ret = GetLightVdiImpl(); 30094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 31094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get light vdi instance failed", __func__); 32094332d3Sopenharmony_ci } 33094332d3Sopenharmony_ci} 34094332d3Sopenharmony_ci 35094332d3Sopenharmony_ciLightIfService::~LightIfService() 36094332d3Sopenharmony_ci{ 37094332d3Sopenharmony_ci if (vdi_ != nullptr) { 38094332d3Sopenharmony_ci HdfCloseVdi(vdi_); 39094332d3Sopenharmony_ci } 40094332d3Sopenharmony_ci} 41094332d3Sopenharmony_ci 42094332d3Sopenharmony_ciint32_t LightIfService::GetLightVdiImpl() 43094332d3Sopenharmony_ci{ 44094332d3Sopenharmony_ci struct VdiWrapperLight *vdiWrapperLight = nullptr; 45094332d3Sopenharmony_ci uint32_t version = 0; 46094332d3Sopenharmony_ci vdi_ = HdfLoadVdi(HDI_LIGHT_VDI_LIBNAME); 47094332d3Sopenharmony_ci if (vdi_ == nullptr || vdi_->vdiBase == nullptr) { 48094332d3Sopenharmony_ci HDF_LOGE("%{public}s: load light vdi failed", __func__); 49094332d3Sopenharmony_ci return HDF_FAILURE; 50094332d3Sopenharmony_ci } 51094332d3Sopenharmony_ci 52094332d3Sopenharmony_ci version = HdfGetVdiVersion(vdi_); 53094332d3Sopenharmony_ci if (version != 1) { 54094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get light vdi version failed", __func__); 55094332d3Sopenharmony_ci return HDF_FAILURE; 56094332d3Sopenharmony_ci } 57094332d3Sopenharmony_ci 58094332d3Sopenharmony_ci vdiWrapperLight = reinterpret_cast<struct VdiWrapperLight *>(vdi_->vdiBase); 59094332d3Sopenharmony_ci lightVdiImpl_ = vdiWrapperLight->lightModule; 60094332d3Sopenharmony_ci if (lightVdiImpl_ == nullptr) { 61094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get light impl failed", __func__); 62094332d3Sopenharmony_ci return HDF_FAILURE; 63094332d3Sopenharmony_ci } 64094332d3Sopenharmony_ci 65094332d3Sopenharmony_ci return HDF_SUCCESS; 66094332d3Sopenharmony_ci} 67094332d3Sopenharmony_ci 68094332d3Sopenharmony_ciint32_t LightIfService::Init() 69094332d3Sopenharmony_ci{ 70094332d3Sopenharmony_ci if (lightVdiImpl_ == nullptr) { 71094332d3Sopenharmony_ci HDF_LOGE("%{public}s: lightVdiImpl_ is nullptr", __func__); 72094332d3Sopenharmony_ci return HDF_FAILURE; 73094332d3Sopenharmony_ci } 74094332d3Sopenharmony_ci int32_t ret = lightVdiImpl_->Init(); 75094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 76094332d3Sopenharmony_ci HDF_LOGE("%{public}s Init failed, error code is %{public}d", __func__, ret); 77094332d3Sopenharmony_ci } 78094332d3Sopenharmony_ci 79094332d3Sopenharmony_ci return ret; 80094332d3Sopenharmony_ci} 81094332d3Sopenharmony_ci 82094332d3Sopenharmony_ciint32_t LightIfService::GetLightInfo(std::vector<HdfLightInfo>& info) 83094332d3Sopenharmony_ci{ 84094332d3Sopenharmony_ci HDF_LOGD("%{public}s: Enter the GetLightInfo function.", __func__); 85094332d3Sopenharmony_ci if (lightVdiImpl_ == nullptr) { 86094332d3Sopenharmony_ci HDF_LOGE("%{public}s: lightVdiImpl_ is nullptr", __func__); 87094332d3Sopenharmony_ci return HDF_FAILURE; 88094332d3Sopenharmony_ci } 89094332d3Sopenharmony_ci 90094332d3Sopenharmony_ci std::vector<HdfLightInfoVdi> lightInfoVdi; 91094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_HDF, "GetLightInfo"); 92094332d3Sopenharmony_ci int32_t ret = lightVdiImpl_->GetLightInfo(lightInfoVdi); 93094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 94094332d3Sopenharmony_ci HDF_LOGE("%{public}s: GetLightInfo failed, error code is %{public}d", __func__, ret); 95094332d3Sopenharmony_ci return ret; 96094332d3Sopenharmony_ci } 97094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_HDF); 98094332d3Sopenharmony_ci 99094332d3Sopenharmony_ci if (lightInfoVdi.empty()) { 100094332d3Sopenharmony_ci HDF_LOGE("%{public}s: no sensor info in list", __func__); 101094332d3Sopenharmony_ci return HDF_FAILURE; 102094332d3Sopenharmony_ci } 103094332d3Sopenharmony_ci 104094332d3Sopenharmony_ci for (const auto &iter : lightInfoVdi) { 105094332d3Sopenharmony_ci HdfLightInfo hdfLightInfo; 106094332d3Sopenharmony_ci hdfLightInfo.lightId = iter.lightId; 107094332d3Sopenharmony_ci hdfLightInfo.lightType = iter.lightType; 108094332d3Sopenharmony_ci hdfLightInfo.lightName = iter.lightName; 109094332d3Sopenharmony_ci hdfLightInfo.lightNumber = iter.lightNumber; 110094332d3Sopenharmony_ci info.push_back(std::move(hdfLightInfo)); 111094332d3Sopenharmony_ci } 112094332d3Sopenharmony_ci return HDF_SUCCESS; 113094332d3Sopenharmony_ci} 114094332d3Sopenharmony_ci 115094332d3Sopenharmony_ciint32_t LightIfService::TurnOnLight(int32_t lightId, const HdfLightEffect& effect) 116094332d3Sopenharmony_ci{ 117094332d3Sopenharmony_ci HDF_LOGD("%{public}s: Enter the TurnOnLight function, lightId is %{public}d", __func__, lightId); 118094332d3Sopenharmony_ci if (lightVdiImpl_ == nullptr) { 119094332d3Sopenharmony_ci HDF_LOGE("%{public}s: lightVdiImpl_ is nullptr", __func__); 120094332d3Sopenharmony_ci return HDF_FAILURE; 121094332d3Sopenharmony_ci } 122094332d3Sopenharmony_ci 123094332d3Sopenharmony_ci HdfLightEffectVdi lightEffectVdi; 124094332d3Sopenharmony_ci lightEffectVdi.lightColor.colorValue.rgbColor.b = effect.lightColor.colorValue.rgbColor.b; 125094332d3Sopenharmony_ci lightEffectVdi.lightColor.colorValue.rgbColor.g = effect.lightColor.colorValue.rgbColor.g; 126094332d3Sopenharmony_ci lightEffectVdi.lightColor.colorValue.rgbColor.r = effect.lightColor.colorValue.rgbColor.r; 127094332d3Sopenharmony_ci lightEffectVdi.lightColor.colorValue.wrgbColor.b = effect.lightColor.colorValue.wrgbColor.b; 128094332d3Sopenharmony_ci lightEffectVdi.lightColor.colorValue.wrgbColor.g = effect.lightColor.colorValue.wrgbColor.g; 129094332d3Sopenharmony_ci lightEffectVdi.lightColor.colorValue.wrgbColor.r = effect.lightColor.colorValue.wrgbColor.r; 130094332d3Sopenharmony_ci lightEffectVdi.lightColor.colorValue.wrgbColor.w = effect.lightColor.colorValue.wrgbColor.w; 131094332d3Sopenharmony_ci lightEffectVdi.flashEffect.flashMode = effect.flashEffect.flashMode; 132094332d3Sopenharmony_ci lightEffectVdi.flashEffect.onTime = effect.flashEffect.onTime; 133094332d3Sopenharmony_ci lightEffectVdi.flashEffect.offTime = effect.flashEffect.offTime; 134094332d3Sopenharmony_ci 135094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_HDF, "TurnOnLight"); 136094332d3Sopenharmony_ci int32_t ret = lightVdiImpl_->TurnOnLight(lightId, lightEffectVdi); 137094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 138094332d3Sopenharmony_ci HDF_LOGE("%{public}s TurnOnLight failed, error code is %{public}d", __func__, ret); 139094332d3Sopenharmony_ci } 140094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_HDF); 141094332d3Sopenharmony_ci 142094332d3Sopenharmony_ci return ret; 143094332d3Sopenharmony_ci} 144094332d3Sopenharmony_ci 145094332d3Sopenharmony_ciint32_t LightIfService::TurnOnMultiLights(int32_t lightId, const std::vector<HdfLightColor>& colors) 146094332d3Sopenharmony_ci{ 147094332d3Sopenharmony_ci HDF_LOGD("%{public}s: Enter the TurnOnMultiLights function, lightId is %{public}d", __func__, lightId); 148094332d3Sopenharmony_ci std::vector<HdfLightColorVdi> colorVdi; 149094332d3Sopenharmony_ci if (lightVdiImpl_ == nullptr) { 150094332d3Sopenharmony_ci HDF_LOGE("%{public}s: lightVdiImpl_ is nullptr", __func__); 151094332d3Sopenharmony_ci return HDF_FAILURE; 152094332d3Sopenharmony_ci } 153094332d3Sopenharmony_ci 154094332d3Sopenharmony_ci for (auto iter : colors) { 155094332d3Sopenharmony_ci HdfLightColorVdi lightColorVdi; 156094332d3Sopenharmony_ci lightColorVdi.colorValue.rgbColor.b = iter.colorValue.rgbColor.b; 157094332d3Sopenharmony_ci lightColorVdi.colorValue.rgbColor.g = iter.colorValue.rgbColor.g; 158094332d3Sopenharmony_ci lightColorVdi.colorValue.rgbColor.r = iter.colorValue.rgbColor.r; 159094332d3Sopenharmony_ci lightColorVdi.colorValue.wrgbColor.b = iter.colorValue.wrgbColor.b; 160094332d3Sopenharmony_ci lightColorVdi.colorValue.wrgbColor.g = iter.colorValue.wrgbColor.g; 161094332d3Sopenharmony_ci lightColorVdi.colorValue.wrgbColor.r = iter.colorValue.wrgbColor.r; 162094332d3Sopenharmony_ci lightColorVdi.colorValue.wrgbColor.w = iter.colorValue.wrgbColor.w; 163094332d3Sopenharmony_ci colorVdi.push_back(std::move(lightColorVdi)); 164094332d3Sopenharmony_ci } 165094332d3Sopenharmony_ci 166094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_HDF, "TurnOnMultiLights"); 167094332d3Sopenharmony_ci int32_t ret = lightVdiImpl_->TurnOnMultiLights(lightId, colorVdi); 168094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 169094332d3Sopenharmony_ci HDF_LOGE("%{public}s TurnOnMultiLights failed, error code is %{public}d", __func__, ret); 170094332d3Sopenharmony_ci } 171094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_HDF); 172094332d3Sopenharmony_ci 173094332d3Sopenharmony_ci return ret; 174094332d3Sopenharmony_ci} 175094332d3Sopenharmony_ci 176094332d3Sopenharmony_ciint32_t LightIfService::TurnOffLight(int32_t lightId) 177094332d3Sopenharmony_ci{ 178094332d3Sopenharmony_ci HDF_LOGD("%{public}s: Enter the TurnOffLight function, lightId is %{public}d", __func__, lightId); 179094332d3Sopenharmony_ci if (lightVdiImpl_ == nullptr) { 180094332d3Sopenharmony_ci HDF_LOGE("%{public}s: lightVdiImpl_ is nullptr", __func__); 181094332d3Sopenharmony_ci return HDF_FAILURE; 182094332d3Sopenharmony_ci } 183094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_HDF, "TurnOffLight"); 184094332d3Sopenharmony_ci int32_t ret = lightVdiImpl_->TurnOffLight(lightId); 185094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 186094332d3Sopenharmony_ci HDF_LOGE("%{public}s TurnOffLight failed, error code is %{public}d", __func__, ret); 187094332d3Sopenharmony_ci } 188094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_HDF); 189094332d3Sopenharmony_ci 190094332d3Sopenharmony_ci return ret; 191094332d3Sopenharmony_ci} 192094332d3Sopenharmony_ci 193094332d3Sopenharmony_ciextern "C" ILightInterface *LightInterfaceImplGetInstance(void) 194094332d3Sopenharmony_ci{ 195094332d3Sopenharmony_ci LightIfService *impl = new (std::nothrow) LightIfService(); 196094332d3Sopenharmony_ci if (impl == nullptr) { 197094332d3Sopenharmony_ci HDF_LOGE("%{public}s: impl nullptr", __func__); 198094332d3Sopenharmony_ci return nullptr; 199094332d3Sopenharmony_ci } 200094332d3Sopenharmony_ci 201094332d3Sopenharmony_ci int32_t ret = impl->Init(); 202094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 203094332d3Sopenharmony_ci HDF_LOGE("%{public}s: service init failed, error code is %{public}d", __func__, ret); 204094332d3Sopenharmony_ci delete impl; 205094332d3Sopenharmony_ci return nullptr; 206094332d3Sopenharmony_ci } 207094332d3Sopenharmony_ci 208094332d3Sopenharmony_ci return impl; 209094332d3Sopenharmony_ci} 210094332d3Sopenharmony_ci} // V1_0 211094332d3Sopenharmony_ci} // Light 212094332d3Sopenharmony_ci} // HDI 213094332d3Sopenharmony_ci} // OHOS 214