1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2022 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 "input_interfaces_impl.h"
17094332d3Sopenharmony_ci#include <hdf_base.h>
18094332d3Sopenharmony_ci#include <iproxy_broker.h>
19094332d3Sopenharmony_ci#include <mutex>
20094332d3Sopenharmony_ci#include <securec.h>
21094332d3Sopenharmony_ci#include "input_uhdf_log.h"
22094332d3Sopenharmony_ci#include "input_manager.h"
23094332d3Sopenharmony_ci#include "input_type.h"
24094332d3Sopenharmony_ci#include "osal_mem.h"
25094332d3Sopenharmony_ci
26094332d3Sopenharmony_ci#define HDF_LOG_TAG InputInterfacesImpl
27094332d3Sopenharmony_ci
28094332d3Sopenharmony_cinamespace OHOS {
29094332d3Sopenharmony_cinamespace HDI {
30094332d3Sopenharmony_cinamespace Input {
31094332d3Sopenharmony_cinamespace V1_0 {
32094332d3Sopenharmony_cinamespace {
33094332d3Sopenharmony_ci    constexpr uint32_t MAX_DEVICES = 32;
34094332d3Sopenharmony_ci    InputEventCb eventCb;
35094332d3Sopenharmony_ci    InputHostCb hostCb;
36094332d3Sopenharmony_ci    sptr<IInputCallback> g_inputEventCallback = nullptr;
37094332d3Sopenharmony_ci    sptr<IInputCallback> g_hotplugEventCallback = nullptr;
38094332d3Sopenharmony_ci    std::mutex g_mutex;
39094332d3Sopenharmony_ci}
40094332d3Sopenharmony_ci
41094332d3Sopenharmony_ciextern "C" IInputInterfaces *InputInterfacesImplGetInstance(void)
42094332d3Sopenharmony_ci{
43094332d3Sopenharmony_ci    using OHOS::HDI::Input::V1_0::InputInterfacesImpl;
44094332d3Sopenharmony_ci    InputInterfacesImpl *service = new (std::nothrow) InputInterfacesImpl();
45094332d3Sopenharmony_ci    if (service == nullptr) {
46094332d3Sopenharmony_ci        return nullptr;
47094332d3Sopenharmony_ci    }
48094332d3Sopenharmony_ci
49094332d3Sopenharmony_ci    service->Init();
50094332d3Sopenharmony_ci    return service;
51094332d3Sopenharmony_ci}
52094332d3Sopenharmony_ci
53094332d3Sopenharmony_cistatic struct DeviceInfo TransferDevInfo(InputDeviceInfo &halDevInfo)
54094332d3Sopenharmony_ci{
55094332d3Sopenharmony_ci    DeviceInfo hdiDevInfo;
56094332d3Sopenharmony_ci    hdiDevInfo.devIndex = halDevInfo.devIndex;
57094332d3Sopenharmony_ci    hdiDevInfo.devType = halDevInfo.devType;
58094332d3Sopenharmony_ci    hdiDevInfo.chipInfo = halDevInfo.chipInfo;
59094332d3Sopenharmony_ci    hdiDevInfo.vendorName = halDevInfo.vendorName;
60094332d3Sopenharmony_ci    hdiDevInfo.chipName = halDevInfo.chipName;
61094332d3Sopenharmony_ci    hdiDevInfo.attrSet.devName = halDevInfo.attrSet.devName;
62094332d3Sopenharmony_ci    hdiDevInfo.attrSet.id.busType = halDevInfo.attrSet.id.busType;
63094332d3Sopenharmony_ci    hdiDevInfo.attrSet.id.vendor = halDevInfo.attrSet.id.vendor;
64094332d3Sopenharmony_ci    hdiDevInfo.attrSet.id.product = halDevInfo.attrSet.id.product;
65094332d3Sopenharmony_ci    hdiDevInfo.attrSet.id.version = halDevInfo.attrSet.id.version;
66094332d3Sopenharmony_ci    hdiDevInfo.attrSet.axisInfo.resize(ABS_CNT);
67094332d3Sopenharmony_ci    for (int32_t i = 0; i < ABS_CNT; i++) {
68094332d3Sopenharmony_ci        hdiDevInfo.attrSet.axisInfo[i].axis = halDevInfo.attrSet.axisInfo[i].axis;
69094332d3Sopenharmony_ci        hdiDevInfo.attrSet.axisInfo[i].min = halDevInfo.attrSet.axisInfo[i].min;
70094332d3Sopenharmony_ci        hdiDevInfo.attrSet.axisInfo[i].max = halDevInfo.attrSet.axisInfo[i].max;
71094332d3Sopenharmony_ci        hdiDevInfo.attrSet.axisInfo[i].fuzz = halDevInfo.attrSet.axisInfo[i].fuzz;
72094332d3Sopenharmony_ci        hdiDevInfo.attrSet.axisInfo[i].flat = halDevInfo.attrSet.axisInfo[i].flat;
73094332d3Sopenharmony_ci        hdiDevInfo.attrSet.axisInfo[i].range = halDevInfo.attrSet.axisInfo[i].range;
74094332d3Sopenharmony_ci    }
75094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.devProp.assign(halDevInfo.abilitySet.devProp,
76094332d3Sopenharmony_ci        halDevInfo.abilitySet.devProp + BITS_TO_UINT64(INPUT_PROP_CNT));
77094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.eventType.assign(halDevInfo.abilitySet.eventType,
78094332d3Sopenharmony_ci        halDevInfo.abilitySet.eventType + BITS_TO_UINT64(EV_CNT));
79094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.absCode.assign(halDevInfo.abilitySet.absCode,
80094332d3Sopenharmony_ci        halDevInfo.abilitySet.absCode + BITS_TO_UINT64(ABS_CNT));
81094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.relCode.assign(halDevInfo.abilitySet.relCode,
82094332d3Sopenharmony_ci        halDevInfo.abilitySet.relCode + BITS_TO_UINT64(REL_CNT));
83094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.keyCode.assign(halDevInfo.abilitySet.keyCode,
84094332d3Sopenharmony_ci        halDevInfo.abilitySet.keyCode + BITS_TO_UINT64(KEY_CNT));
85094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.ledCode.assign(halDevInfo.abilitySet.ledCode,
86094332d3Sopenharmony_ci        halDevInfo.abilitySet.ledCode + BITS_TO_UINT64(LED_CNT));
87094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.miscCode.assign(halDevInfo.abilitySet.miscCode,
88094332d3Sopenharmony_ci        halDevInfo.abilitySet.miscCode + BITS_TO_UINT64(MSC_CNT));
89094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.soundCode.assign(halDevInfo.abilitySet.soundCode,
90094332d3Sopenharmony_ci        halDevInfo.abilitySet.soundCode + BITS_TO_UINT64(SND_CNT));
91094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.forceCode.assign(halDevInfo.abilitySet.forceCode,
92094332d3Sopenharmony_ci        halDevInfo.abilitySet.forceCode + BITS_TO_UINT64(HDF_FF_CNT));
93094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.switchCode.assign(halDevInfo.abilitySet.switchCode,
94094332d3Sopenharmony_ci        halDevInfo.abilitySet.switchCode + BITS_TO_UINT64(SW_CNT));
95094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.keyType.assign(halDevInfo.abilitySet.keyType,
96094332d3Sopenharmony_ci        halDevInfo.abilitySet.keyType + BITS_TO_UINT64(KEY_CNT));
97094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.ledType.assign(halDevInfo.abilitySet.ledType,
98094332d3Sopenharmony_ci        halDevInfo.abilitySet.ledType + BITS_TO_UINT64(LED_CNT));
99094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.soundType.assign(halDevInfo.abilitySet.soundType,
100094332d3Sopenharmony_ci        halDevInfo.abilitySet.soundType + BITS_TO_UINT64(SND_CNT));
101094332d3Sopenharmony_ci    hdiDevInfo.abilitySet.switchType.assign(halDevInfo.abilitySet.switchType,
102094332d3Sopenharmony_ci        halDevInfo.abilitySet.switchType + BITS_TO_UINT64(SW_CNT));
103094332d3Sopenharmony_ci    return hdiDevInfo;
104094332d3Sopenharmony_ci}
105094332d3Sopenharmony_ci
106094332d3Sopenharmony_civoid InputEventDataCallback(const InputEventPackage **pkgs, uint32_t count, uint32_t devIndex)
107094332d3Sopenharmony_ci{
108094332d3Sopenharmony_ci    if (pkgs == nullptr || *pkgs == nullptr) {
109094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, pkgs is nullptr", __func__);
110094332d3Sopenharmony_ci        return;
111094332d3Sopenharmony_ci    }
112094332d3Sopenharmony_ci
113094332d3Sopenharmony_ci    std::vector<EventPackage> tmp;
114094332d3Sopenharmony_ci    for (uint32_t i = 0; i < count; i++) {
115094332d3Sopenharmony_ci        if (pkgs[i] == nullptr) {
116094332d3Sopenharmony_ci            HDF_LOGE("%{public}s failed, pkgs[%{public}u] is nullptr", __func__, i);
117094332d3Sopenharmony_ci            return;
118094332d3Sopenharmony_ci        }
119094332d3Sopenharmony_ci        EventPackage InputEvents;
120094332d3Sopenharmony_ci        InputEvents.type = pkgs[i]->type;
121094332d3Sopenharmony_ci        InputEvents.code = pkgs[i]->code;
122094332d3Sopenharmony_ci        InputEvents.value = pkgs[i]->value;
123094332d3Sopenharmony_ci        InputEvents.timestamp = pkgs[i]->timestamp;
124094332d3Sopenharmony_ci        tmp.push_back(InputEvents);
125094332d3Sopenharmony_ci    }
126094332d3Sopenharmony_ci
127094332d3Sopenharmony_ci    if (g_inputEventCallback == nullptr) {
128094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: g_inputEventCallback is nullptr", __func__);
129094332d3Sopenharmony_ci        return;
130094332d3Sopenharmony_ci    }
131094332d3Sopenharmony_ci    g_inputEventCallback->EventPkgCallback(tmp, devIndex);
132094332d3Sopenharmony_ci}
133094332d3Sopenharmony_ci
134094332d3Sopenharmony_civoid HotplugEventDataCallback(const InputHotPlugEvent *event)
135094332d3Sopenharmony_ci{
136094332d3Sopenharmony_ci    if (event == nullptr) {
137094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, pkgs is nullptr", __func__);
138094332d3Sopenharmony_ci        return;
139094332d3Sopenharmony_ci    }
140094332d3Sopenharmony_ci
141094332d3Sopenharmony_ci    HotPlugEvent HotPlugEvent;
142094332d3Sopenharmony_ci    HotPlugEvent.devIndex = event->devIndex;
143094332d3Sopenharmony_ci    HotPlugEvent.devType = event->devType;
144094332d3Sopenharmony_ci    HotPlugEvent.status = event->status;
145094332d3Sopenharmony_ci
146094332d3Sopenharmony_ci    if (g_hotplugEventCallback == nullptr) {
147094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: g_hotplugEventCallback is nullptr", __func__);
148094332d3Sopenharmony_ci        return;
149094332d3Sopenharmony_ci    }
150094332d3Sopenharmony_ci    g_hotplugEventCallback->HotPlugCallback(HotPlugEvent);
151094332d3Sopenharmony_ci}
152094332d3Sopenharmony_ci
153094332d3Sopenharmony_civoid InputInterfacesImpl::Init()
154094332d3Sopenharmony_ci{
155094332d3Sopenharmony_ci    int32_t ret = GetInputInterface(&inputInterface_);
156094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || ret != HDF_SUCCESS) {
157094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input Module instance failed", __func__);
158094332d3Sopenharmony_ci    }
159094332d3Sopenharmony_ci
160094332d3Sopenharmony_ci    eventCb.EventPkgCallback = InputEventDataCallback;
161094332d3Sopenharmony_ci    hostCb.HotPlugCallback = HotplugEventDataCallback;
162094332d3Sopenharmony_ci}
163094332d3Sopenharmony_ci
164094332d3Sopenharmony_ciint32_t InputInterfacesImpl::ScanInputDevice(std::vector<DevDesc> &staArr)
165094332d3Sopenharmony_ci{
166094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputManager == nullptr ||
167094332d3Sopenharmony_ci        inputInterface_->iInputManager->ScanInputDevice == nullptr) {
168094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
169094332d3Sopenharmony_ci        return HDF_FAILURE;
170094332d3Sopenharmony_ci    }
171094332d3Sopenharmony_ci
172094332d3Sopenharmony_ci    InputDevDesc staArrHdf[MAX_DEVICES];
173094332d3Sopenharmony_ci    int32_t ret = memset_s(staArrHdf, MAX_DEVICES * sizeof(InputDevDesc), 0, MAX_DEVICES * sizeof(InputDevDesc));
174094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
175094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: memset failed", __func__);
176094332d3Sopenharmony_ci        return HDF_FAILURE;
177094332d3Sopenharmony_ci    }
178094332d3Sopenharmony_ci
179094332d3Sopenharmony_ci    ret = inputInterface_->iInputManager->ScanInputDevice(staArrHdf, MAX_DEVICES);
180094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
181094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
182094332d3Sopenharmony_ci        return HDF_FAILURE;
183094332d3Sopenharmony_ci    }
184094332d3Sopenharmony_ci
185094332d3Sopenharmony_ci    for (uint32_t i = 0; i < MAX_DEVICES; i++) {
186094332d3Sopenharmony_ci        DevDesc StaArr;
187094332d3Sopenharmony_ci        StaArr.devIndex = staArrHdf[i].devIndex;
188094332d3Sopenharmony_ci        StaArr.devType = staArrHdf[i].devType;
189094332d3Sopenharmony_ci        staArr.push_back(StaArr);
190094332d3Sopenharmony_ci    }
191094332d3Sopenharmony_ci
192094332d3Sopenharmony_ci    return ret;
193094332d3Sopenharmony_ci}
194094332d3Sopenharmony_ci
195094332d3Sopenharmony_ciint32_t InputInterfacesImpl::OpenInputDevice(uint32_t devIndex)
196094332d3Sopenharmony_ci{
197094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputManager == nullptr ||
198094332d3Sopenharmony_ci        inputInterface_->iInputManager->OpenInputDevice == nullptr) {
199094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
200094332d3Sopenharmony_ci        return HDF_FAILURE;
201094332d3Sopenharmony_ci    }
202094332d3Sopenharmony_ci
203094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputManager->OpenInputDevice(devIndex);
204094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
205094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
206094332d3Sopenharmony_ci    }
207094332d3Sopenharmony_ci
208094332d3Sopenharmony_ci    return ret;
209094332d3Sopenharmony_ci}
210094332d3Sopenharmony_ci
211094332d3Sopenharmony_ciint32_t InputInterfacesImpl::CloseInputDevice(uint32_t devIndex)
212094332d3Sopenharmony_ci{
213094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputManager == nullptr ||
214094332d3Sopenharmony_ci        inputInterface_->iInputManager->CloseInputDevice == nullptr) {
215094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
216094332d3Sopenharmony_ci        return HDF_FAILURE;
217094332d3Sopenharmony_ci    }
218094332d3Sopenharmony_ci
219094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputManager->CloseInputDevice(devIndex);
220094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
221094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
222094332d3Sopenharmony_ci    }
223094332d3Sopenharmony_ci
224094332d3Sopenharmony_ci    return ret;
225094332d3Sopenharmony_ci}
226094332d3Sopenharmony_ci
227094332d3Sopenharmony_ciint32_t InputInterfacesImpl::GetInputDevice(uint32_t devIndex, DeviceInfo &devInfo)
228094332d3Sopenharmony_ci{
229094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputManager == nullptr ||
230094332d3Sopenharmony_ci        inputInterface_->iInputManager->GetInputDevice == nullptr) {
231094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
232094332d3Sopenharmony_ci        return HDF_FAILURE;
233094332d3Sopenharmony_ci    }
234094332d3Sopenharmony_ci
235094332d3Sopenharmony_ci    InputDeviceInfo *deviceInfo = nullptr;
236094332d3Sopenharmony_ci
237094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputManager->GetInputDevice(devIndex, &deviceInfo);
238094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
239094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
240094332d3Sopenharmony_ci        return ret;
241094332d3Sopenharmony_ci    }
242094332d3Sopenharmony_ci
243094332d3Sopenharmony_ci    if (deviceInfo == nullptr) {
244094332d3Sopenharmony_ci        HDF_LOGE("%{public}s get deviceInfo failed, info is null", __func__);
245094332d3Sopenharmony_ci        return HDF_FAILURE;
246094332d3Sopenharmony_ci    }
247094332d3Sopenharmony_ci    devInfo = TransferDevInfo(*deviceInfo);
248094332d3Sopenharmony_ci#ifdef DRIVERS_PERIPHERAL_INPUT_FEATURE_UDRIVER
249094332d3Sopenharmony_ci    OsalMemFree(deviceInfo);
250094332d3Sopenharmony_ci#endif /* DRIVERS_PERIPHERAL_INPUT_FEATURE_UDRIVER */
251094332d3Sopenharmony_ci    return ret;
252094332d3Sopenharmony_ci}
253094332d3Sopenharmony_ci
254094332d3Sopenharmony_ciint32_t InputInterfacesImpl::GetInputDeviceList(uint32_t &devNum, std::vector<DeviceInfo> &devList, uint32_t size)
255094332d3Sopenharmony_ci{
256094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputManager == nullptr ||
257094332d3Sopenharmony_ci        inputInterface_->iInputManager->GetInputDeviceList == nullptr) {
258094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
259094332d3Sopenharmony_ci        return HDF_FAILURE;
260094332d3Sopenharmony_ci    }
261094332d3Sopenharmony_ci
262094332d3Sopenharmony_ci    InputDeviceInfo *deviceList = nullptr;
263094332d3Sopenharmony_ci    InputDeviceInfo *tmp = nullptr;
264094332d3Sopenharmony_ci    DeviceInfo hdfDevInfo;
265094332d3Sopenharmony_ci
266094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputManager->GetInputDeviceList(&devNum, &deviceList, size);
267094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
268094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
269094332d3Sopenharmony_ci        return HDF_FAILURE;
270094332d3Sopenharmony_ci    }
271094332d3Sopenharmony_ci
272094332d3Sopenharmony_ci    tmp = deviceList;
273094332d3Sopenharmony_ci    if (tmp == nullptr) {
274094332d3Sopenharmony_ci        HDF_LOGE("%{public}s deviceList is null", __func__);
275094332d3Sopenharmony_ci        return HDF_FAILURE;
276094332d3Sopenharmony_ci    }
277094332d3Sopenharmony_ci
278094332d3Sopenharmony_ci    devList.reserve(devNum);
279094332d3Sopenharmony_ci    for (uint32_t i = 0; i < devNum; i++) {
280094332d3Sopenharmony_ci        hdfDevInfo = TransferDevInfo(*tmp);
281094332d3Sopenharmony_ci        devList.push_back(hdfDevInfo);
282094332d3Sopenharmony_ci        tmp++;
283094332d3Sopenharmony_ci    }
284094332d3Sopenharmony_ci#ifdef DRIVERS_PERIPHERAL_INPUT_FEATURE_UDRIVER
285094332d3Sopenharmony_ci    OsalMemFree(deviceList);
286094332d3Sopenharmony_ci#endif /* DRIVERS_PERIPHERAL_INPUT_FEATURE_UDRIVER */
287094332d3Sopenharmony_ci    return ret;
288094332d3Sopenharmony_ci}
289094332d3Sopenharmony_ci
290094332d3Sopenharmony_ciint32_t InputInterfacesImpl::SetPowerStatus(uint32_t devIndex, uint32_t status)
291094332d3Sopenharmony_ci{
292094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputController == nullptr ||
293094332d3Sopenharmony_ci        inputInterface_->iInputController->SetPowerStatus == nullptr) {
294094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
295094332d3Sopenharmony_ci        return HDF_FAILURE;
296094332d3Sopenharmony_ci    }
297094332d3Sopenharmony_ci
298094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputController->SetPowerStatus(devIndex, status);
299094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
300094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
301094332d3Sopenharmony_ci    }
302094332d3Sopenharmony_ci
303094332d3Sopenharmony_ci    return ret;
304094332d3Sopenharmony_ci}
305094332d3Sopenharmony_ci
306094332d3Sopenharmony_ciint32_t InputInterfacesImpl::GetPowerStatus(uint32_t devIndex, uint32_t &status)
307094332d3Sopenharmony_ci{
308094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputController == nullptr ||
309094332d3Sopenharmony_ci        inputInterface_->iInputController->GetPowerStatus == nullptr) {
310094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
311094332d3Sopenharmony_ci        return HDF_FAILURE;
312094332d3Sopenharmony_ci    }
313094332d3Sopenharmony_ci
314094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputController->GetPowerStatus(devIndex, &status);
315094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
316094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
317094332d3Sopenharmony_ci    }
318094332d3Sopenharmony_ci
319094332d3Sopenharmony_ci    return ret;
320094332d3Sopenharmony_ci}
321094332d3Sopenharmony_ci
322094332d3Sopenharmony_ciint32_t InputInterfacesImpl::GetDeviceType(uint32_t devIndex, uint32_t &deviceType)
323094332d3Sopenharmony_ci{
324094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputController == nullptr ||
325094332d3Sopenharmony_ci        inputInterface_->iInputController->GetDeviceType == nullptr) {
326094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
327094332d3Sopenharmony_ci        return HDF_FAILURE;
328094332d3Sopenharmony_ci    }
329094332d3Sopenharmony_ci
330094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputController->GetDeviceType(devIndex, &deviceType);
331094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
332094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
333094332d3Sopenharmony_ci    }
334094332d3Sopenharmony_ci
335094332d3Sopenharmony_ci    return ret;
336094332d3Sopenharmony_ci}
337094332d3Sopenharmony_ci
338094332d3Sopenharmony_ciint32_t InputInterfacesImpl::GetChipInfo(uint32_t devIndex, std::string &chipInfo)
339094332d3Sopenharmony_ci{
340094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputController == nullptr ||
341094332d3Sopenharmony_ci        inputInterface_->iInputController->GetChipInfo == nullptr) {
342094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
343094332d3Sopenharmony_ci        return HDF_FAILURE;
344094332d3Sopenharmony_ci    }
345094332d3Sopenharmony_ci
346094332d3Sopenharmony_ci    char infoStr[CHIP_INFO_LEN] = {0};
347094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputController->GetChipInfo(devIndex, infoStr, CHIP_INFO_LEN);
348094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
349094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
350094332d3Sopenharmony_ci        return HDF_FAILURE;
351094332d3Sopenharmony_ci    }
352094332d3Sopenharmony_ci
353094332d3Sopenharmony_ci    chipInfo.assign(infoStr);
354094332d3Sopenharmony_ci    return ret;
355094332d3Sopenharmony_ci}
356094332d3Sopenharmony_ci
357094332d3Sopenharmony_ciint32_t InputInterfacesImpl::GetVendorName(uint32_t devIndex, std::string &vendorName)
358094332d3Sopenharmony_ci{
359094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputController == nullptr ||
360094332d3Sopenharmony_ci        inputInterface_->iInputController->GetVendorName == nullptr) {
361094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
362094332d3Sopenharmony_ci        return HDF_FAILURE;
363094332d3Sopenharmony_ci    }
364094332d3Sopenharmony_ci
365094332d3Sopenharmony_ci    char infoStr[VENDOR_NAME_LEN] = {0};
366094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputController->GetVendorName(devIndex, infoStr, VENDOR_NAME_LEN);
367094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
368094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
369094332d3Sopenharmony_ci        return HDF_FAILURE;
370094332d3Sopenharmony_ci    }
371094332d3Sopenharmony_ci
372094332d3Sopenharmony_ci    vendorName.assign(infoStr);
373094332d3Sopenharmony_ci    return ret;
374094332d3Sopenharmony_ci}
375094332d3Sopenharmony_ci
376094332d3Sopenharmony_ciint32_t InputInterfacesImpl::GetChipName(uint32_t devIndex, std::string &chipName)
377094332d3Sopenharmony_ci{
378094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputController == nullptr ||
379094332d3Sopenharmony_ci        inputInterface_->iInputController->GetChipName == nullptr) {
380094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
381094332d3Sopenharmony_ci        return HDF_FAILURE;
382094332d3Sopenharmony_ci    }
383094332d3Sopenharmony_ci
384094332d3Sopenharmony_ci    char infoStr[CHIP_NAME_LEN] = {0};
385094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputController->GetChipName(devIndex, infoStr, CHIP_NAME_LEN);
386094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
387094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
388094332d3Sopenharmony_ci        return HDF_FAILURE;
389094332d3Sopenharmony_ci    }
390094332d3Sopenharmony_ci
391094332d3Sopenharmony_ci    chipName.assign(infoStr);
392094332d3Sopenharmony_ci    return ret;
393094332d3Sopenharmony_ci}
394094332d3Sopenharmony_ci
395094332d3Sopenharmony_ciint32_t InputInterfacesImpl::SetGestureMode(uint32_t devIndex, uint32_t gestureMode)
396094332d3Sopenharmony_ci{
397094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputController == nullptr ||
398094332d3Sopenharmony_ci        inputInterface_->iInputController->SetGestureMode == nullptr) {
399094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
400094332d3Sopenharmony_ci        return HDF_FAILURE;
401094332d3Sopenharmony_ci    }
402094332d3Sopenharmony_ci
403094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputController->SetGestureMode(devIndex, gestureMode);
404094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
405094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
406094332d3Sopenharmony_ci    }
407094332d3Sopenharmony_ci
408094332d3Sopenharmony_ci    return ret;
409094332d3Sopenharmony_ci}
410094332d3Sopenharmony_ci
411094332d3Sopenharmony_ciint32_t InputInterfacesImpl::RunCapacitanceTest(uint32_t devIndex, uint32_t testType, std::string &result,
412094332d3Sopenharmony_ci    uint32_t length)
413094332d3Sopenharmony_ci{
414094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputController == nullptr ||
415094332d3Sopenharmony_ci        inputInterface_->iInputController->RunCapacitanceTest == nullptr) {
416094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
417094332d3Sopenharmony_ci        return HDF_FAILURE;
418094332d3Sopenharmony_ci    }
419094332d3Sopenharmony_ci
420094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputController->RunCapacitanceTest(devIndex, testType, result.data(), length);
421094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
422094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
423094332d3Sopenharmony_ci    }
424094332d3Sopenharmony_ci
425094332d3Sopenharmony_ci    return ret;
426094332d3Sopenharmony_ci}
427094332d3Sopenharmony_ci
428094332d3Sopenharmony_ciint32_t InputInterfacesImpl::RunExtraCommand(uint32_t devIndex, const ExtraCmd &cmd)
429094332d3Sopenharmony_ci{
430094332d3Sopenharmony_ci    InputExtraCmd cmdInfo;
431094332d3Sopenharmony_ci    cmdInfo.cmdCode = cmd.cmdCode.c_str();
432094332d3Sopenharmony_ci    cmdInfo.cmdValue = cmd.cmdValue.c_str();
433094332d3Sopenharmony_ci
434094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputController == nullptr ||
435094332d3Sopenharmony_ci        inputInterface_->iInputController->RunExtraCommand == nullptr) {
436094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
437094332d3Sopenharmony_ci        return HDF_FAILURE;
438094332d3Sopenharmony_ci    }
439094332d3Sopenharmony_ci
440094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputController->RunExtraCommand(devIndex, &cmdInfo);
441094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
442094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
443094332d3Sopenharmony_ci    }
444094332d3Sopenharmony_ci
445094332d3Sopenharmony_ci    return ret;
446094332d3Sopenharmony_ci}
447094332d3Sopenharmony_ci
448094332d3Sopenharmony_ciint32_t InputInterfacesImpl::RegisterReportCallback(uint32_t devIndex, const sptr<IInputCallback> &eventPkgCallback)
449094332d3Sopenharmony_ci{
450094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputReporter == nullptr ||
451094332d3Sopenharmony_ci        inputInterface_->iInputReporter->RegisterReportCallback == nullptr) {
452094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
453094332d3Sopenharmony_ci        return HDF_FAILURE;
454094332d3Sopenharmony_ci    }
455094332d3Sopenharmony_ci
456094332d3Sopenharmony_ci    if (devIndex >= MAX_INPUT_DEV_NUM) {
457094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: devIndex [%{public}d] out of range", __func__, devIndex);
458094332d3Sopenharmony_ci        return INPUT_INVALID_PARAM;
459094332d3Sopenharmony_ci    }
460094332d3Sopenharmony_ci
461094332d3Sopenharmony_ci    if (eventPkgCallback == nullptr) {
462094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: eventPkgCallback is null", __func__);
463094332d3Sopenharmony_ci        return HDF_FAILURE;
464094332d3Sopenharmony_ci    }
465094332d3Sopenharmony_ci
466094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
467094332d3Sopenharmony_ci    ret = inputInterface_->iInputReporter->RegisterReportCallback(devIndex, &eventCb);
468094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
469094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, ret[%{public}d]", __func__, ret);
470094332d3Sopenharmony_ci        return ret;
471094332d3Sopenharmony_ci    }
472094332d3Sopenharmony_ci
473094332d3Sopenharmony_ci    std::lock_guard<std::mutex> lock(g_mutex);
474094332d3Sopenharmony_ci    g_inputEventCallback = eventPkgCallback;
475094332d3Sopenharmony_ci
476094332d3Sopenharmony_ci    return ret;
477094332d3Sopenharmony_ci}
478094332d3Sopenharmony_ci
479094332d3Sopenharmony_ciint32_t InputInterfacesImpl::UnregisterReportCallback(uint32_t devIndex)
480094332d3Sopenharmony_ci{
481094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputReporter == nullptr ||
482094332d3Sopenharmony_ci        inputInterface_->iInputReporter->UnregisterReportCallback == nullptr) {
483094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
484094332d3Sopenharmony_ci        return HDF_FAILURE;
485094332d3Sopenharmony_ci    }
486094332d3Sopenharmony_ci
487094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputReporter->UnregisterReportCallback(devIndex);
488094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
489094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
490094332d3Sopenharmony_ci        return ret;
491094332d3Sopenharmony_ci    }
492094332d3Sopenharmony_ci    return ret;
493094332d3Sopenharmony_ci}
494094332d3Sopenharmony_ci
495094332d3Sopenharmony_ciint32_t InputInterfacesImpl::RegisterHotPlugCallback(const sptr<IInputCallback> &hotPlugCallback)
496094332d3Sopenharmony_ci{
497094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputReporter == nullptr ||
498094332d3Sopenharmony_ci        inputInterface_->iInputReporter->UnregisterReportCallback == nullptr) {
499094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
500094332d3Sopenharmony_ci        return HDF_FAILURE;
501094332d3Sopenharmony_ci    }
502094332d3Sopenharmony_ci
503094332d3Sopenharmony_ci    if (hotPlugCallback == nullptr) {
504094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: hotPlugCallback is null", __func__);
505094332d3Sopenharmony_ci        return HDF_FAILURE;
506094332d3Sopenharmony_ci    }
507094332d3Sopenharmony_ci
508094332d3Sopenharmony_ci    if (g_hotplugEventCallback != nullptr) {
509094332d3Sopenharmony_ci        return g_hotplugEventCallback == hotPlugCallback;
510094332d3Sopenharmony_ci    }
511094332d3Sopenharmony_ci
512094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
513094332d3Sopenharmony_ci    ret = inputInterface_->iInputReporter->RegisterHotPlugCallback(&hostCb);
514094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
515094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, ret[%{public}d]", __func__, ret);
516094332d3Sopenharmony_ci        return ret;
517094332d3Sopenharmony_ci    }
518094332d3Sopenharmony_ci
519094332d3Sopenharmony_ci    std::lock_guard<std::mutex> lock(g_mutex);
520094332d3Sopenharmony_ci    g_hotplugEventCallback = hotPlugCallback;
521094332d3Sopenharmony_ci
522094332d3Sopenharmony_ci    return ret;
523094332d3Sopenharmony_ci}
524094332d3Sopenharmony_ci
525094332d3Sopenharmony_ciint32_t InputInterfacesImpl::UnregisterHotPlugCallback()
526094332d3Sopenharmony_ci{
527094332d3Sopenharmony_ci    if (inputInterface_ == nullptr || inputInterface_->iInputReporter == nullptr ||
528094332d3Sopenharmony_ci        inputInterface_->iInputReporter->UnregisterHotPlugCallback == nullptr) {
529094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get input device Module instance failed", __func__);
530094332d3Sopenharmony_ci        return HDF_FAILURE;
531094332d3Sopenharmony_ci    }
532094332d3Sopenharmony_ci
533094332d3Sopenharmony_ci    int32_t ret = inputInterface_->iInputReporter->UnregisterHotPlugCallback();
534094332d3Sopenharmony_ci    if (ret != INPUT_SUCCESS) {
535094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret);
536094332d3Sopenharmony_ci        return ret;
537094332d3Sopenharmony_ci    }
538094332d3Sopenharmony_ci
539094332d3Sopenharmony_ci    std::lock_guard<std::mutex> lock(g_mutex);
540094332d3Sopenharmony_ci    g_hotplugEventCallback = nullptr;
541094332d3Sopenharmony_ci
542094332d3Sopenharmony_ci    return ret;
543094332d3Sopenharmony_ci}
544094332d3Sopenharmony_ci} // V1_0
545094332d3Sopenharmony_ci} // Input
546094332d3Sopenharmony_ci} // HDI
547094332d3Sopenharmony_ci} // OHOS
548