1/*
2 * Copyright (c) 2022-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 "light_interface_impl.h"
17#include <hdf_base.h>
18#include "light_uhdf_log.h"
19#include "devhost_dump_reg.h"
20#include "light_dump.h"
21#include "light_if.h"
22
23#define HDF_LOG_TAG     uhdf_light_service
24
25namespace OHOS {
26namespace HDI {
27namespace Light {
28namespace V1_0 {
29
30int32_t LightInterfaceImpl::Init()
31{
32    const struct LightInterface *lightInterface = NewLightInterfaceInstance();
33    if (lightInterface == nullptr || lightInterface->GetLightInfo == nullptr) {
34        HDF_LOGE("%{public}s: get light Module instance failed", __func__);
35        return HDF_FAILURE;
36    }
37
38    DevHostRegisterDumpHost(GetLightDump);
39
40    return HDF_SUCCESS;
41}
42
43int32_t LightInterfaceImpl::GetLightInfo(std::vector<HdfLightInfoVdi>& info)
44{
45    const struct LightInterface *lightInterface = NewLightInterfaceInstance();
46    if (lightInterface == nullptr || lightInterface->GetLightInfo == nullptr) {
47        HDF_LOGE("%{public}s: get light Module instance failed", __func__);
48        return HDF_FAILURE;
49    }
50
51    struct LightInfo *lightInfo = nullptr;
52    uint32_t count = 0;
53    int32_t ret = lightInterface->GetLightInfo(&lightInfo, &count);
54    if (ret != HDF_SUCCESS) {
55        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
56        return ret;
57    }
58
59    while (count--) {
60        HdfLightInfoVdi hdfLightInfo;
61        hdfLightInfo.lightId = static_cast<int32_t>(lightInfo->lightId);
62        hdfLightInfo.lightType = lightInfo->lightType;
63        if (strcpy_s(hdfLightInfo.lightName, LIGHT_NAME_MAX_LEN, lightInfo->lightName) != EOK) {
64            HDF_LOGE("%{public}s: Light name cpy faild", __func__);
65            return HDF_FAILURE;
66        }
67        hdfLightInfo.lightNumber = static_cast<int32_t>(lightInfo->lightNumber);
68        info.push_back(hdfLightInfo);
69        lightInfo++;
70    }
71
72    return HDF_SUCCESS;
73}
74
75int32_t LightInterfaceImpl::TurnOnLight(int32_t lightId, const HdfLightEffectVdi& effect)
76{
77    HDF_LOGI("%{public}s: Enter the TurnOnLight function, lightId is %{public}d", __func__, lightId);
78    const struct LightInterface *lightInterface = NewLightInterfaceInstance();
79    if (lightInterface == nullptr || lightInterface->TurnOnLight == nullptr) {
80        HDF_LOGE("%{public}s: get light Module instance failed", __func__);
81        return HDF_FAILURE;
82    }
83
84    LightEffect lightEffect;
85    lightEffect.lightColor.colorValue.rgbColor.b = effect.lightColor.colorValue.rgbColor.b;
86    lightEffect.lightColor.colorValue.rgbColor.g = effect.lightColor.colorValue.rgbColor.g;
87    lightEffect.lightColor.colorValue.rgbColor.r = effect.lightColor.colorValue.rgbColor.r;
88    lightEffect.lightColor.colorValue.wrgbColor.b = effect.lightColor.colorValue.wrgbColor.b;
89    lightEffect.lightColor.colorValue.wrgbColor.g = effect.lightColor.colorValue.wrgbColor.g;
90    lightEffect.lightColor.colorValue.wrgbColor.r = effect.lightColor.colorValue.wrgbColor.r;
91    lightEffect.lightColor.colorValue.wrgbColor.w = effect.lightColor.colorValue.wrgbColor.w;
92    lightEffect.flashEffect.flashMode = effect.flashEffect.flashMode;
93    lightEffect.flashEffect.onTime = effect.flashEffect.onTime;
94    lightEffect.flashEffect.offTime = effect.flashEffect.offTime;
95    int32_t ret = lightInterface->TurnOnLight(lightId, &lightEffect);
96    if (ret != HDF_SUCCESS) {
97        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
98    }
99
100    return ret;
101}
102
103int32_t LightInterfaceImpl::TurnOnMultiLights(int32_t lightId, const std::vector<HdfLightColorVdi>& colors)
104{
105    HDF_LOGI("%{public}s: Enter the TurnOnMultiLights function, lightId is %{public}d", __func__, lightId);
106    const struct LightInterface *lightInterface = NewLightInterfaceInstance();
107    if (lightInterface == nullptr || lightInterface->TurnOnMultiLights == nullptr) {
108        HDF_LOGE("%{public}s: get light module instance failed", __func__);
109        return HDF_FAILURE;
110    }
111
112    uint32_t num = colors.size();
113    LightColor lightColor[num];
114    int32_t i = 0;
115    for (auto iter : colors) {
116        lightColor[i].colorValue.rgbColor.b = iter.colorValue.rgbColor.b;
117        lightColor[i].colorValue.rgbColor.g = iter.colorValue.rgbColor.g;
118        lightColor[i].colorValue.rgbColor.r = iter.colorValue.rgbColor.r;
119        lightColor[i].colorValue.wrgbColor.b = iter.colorValue.wrgbColor.b;
120        lightColor[i].colorValue.wrgbColor.g = iter.colorValue.wrgbColor.g;
121        lightColor[i].colorValue.wrgbColor.r = iter.colorValue.wrgbColor.r;
122        lightColor[i++].colorValue.wrgbColor.w = iter.colorValue.wrgbColor.w;
123    }
124
125    int32_t ret = lightInterface->TurnOnMultiLights(lightId, lightColor, num);
126    if (ret != HDF_SUCCESS) {
127        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
128    }
129
130    return ret;
131}
132
133int32_t LightInterfaceImpl::TurnOffLight(int32_t lightId)
134{
135    HDF_LOGI("%{public}s: Enter the TurnOffLight function, lightId is %{public}d", __func__, lightId);
136    const struct LightInterface *lightInterface = NewLightInterfaceInstance();
137    if (lightInterface == nullptr || lightInterface->TurnOffLight == nullptr) {
138        HDF_LOGE("%{public}s: get light Module instance failed", __func__);
139        return HDF_FAILURE;
140    }
141    int32_t ret = lightInterface->TurnOffLight(lightId);
142    if (ret != HDF_SUCCESS) {
143        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
144    }
145
146    return ret;
147}
148
149static int32_t CreateLightVdiInstance(struct HdfVdiBase *vdiBase)
150{
151    HDF_LOGI("%{public}s: Enter the CreateLightVdiInstance function", __func__);
152    if (vdiBase == nullptr) {
153        HDF_LOGE("%{public}s parameter vdiBase is NULL", __func__);
154        return HDF_FAILURE;
155    }
156
157    struct VdiWrapperLight *lightVdi = reinterpret_cast<VdiWrapperLight *>(vdiBase);
158    lightVdi->lightModule = new LightInterfaceImpl();
159    if (lightVdi->lightModule == nullptr) {
160        HDF_LOGI("%{public}s: new lightModule failed!", __func__);
161        return HDF_FAILURE;
162    }
163    return HDF_SUCCESS;
164}
165
166static int32_t DestoryLightVdiInstance(struct HdfVdiBase *vdiBase)
167{
168    HDF_LOGI("%{public}s: Enter the DestoryLightVdiInstance function", __func__);
169    if (vdiBase == nullptr) {
170        HDF_LOGE("%{public}s parameter vdiBase is NULL", __func__);
171        return HDF_FAILURE;
172    }
173
174    struct VdiWrapperLight *lightVdi = reinterpret_cast<VdiWrapperLight *>(vdiBase);
175    LightInterfaceImpl *lightImpl = reinterpret_cast<LightInterfaceImpl *>(lightVdi->lightModule);
176    if (lightImpl != nullptr) {
177        delete lightImpl;
178        lightVdi->lightModule = nullptr;
179    }
180    return HDF_SUCCESS;
181}
182
183static struct VdiWrapperLight g_lightVdi = {
184    .base = {
185        .moduleVersion = 1,
186        .moduleName = "light_service",
187        .CreateVdiInstance = CreateLightVdiInstance,
188        .DestoryVdiInstance = DestoryLightVdiInstance,
189    },
190    .lightModule = nullptr,
191};
192
193extern "C" HDF_VDI_INIT(g_lightVdi);
194} // V1_0
195} // Light
196} // HDI
197} // OHOS
198