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