1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 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#include "input_reporter.h" 16094332d3Sopenharmony_ci#include <stdio.h> 17094332d3Sopenharmony_ci#include <unistd.h> 18094332d3Sopenharmony_ci#include <malloc.h> 19094332d3Sopenharmony_ci#include <sys/ioctl.h> 20094332d3Sopenharmony_ci#include <securec.h> 21094332d3Sopenharmony_ci#include "hdf_io_service_if.h" 22094332d3Sopenharmony_ci#include "osal_time.h" 23094332d3Sopenharmony_ci#include "input_common.h" 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_ci#define POLL_WAIT_MS 100 26094332d3Sopenharmony_ci#define MOUSE_DATA_LEN 4 27094332d3Sopenharmony_ci#define REL_X_BYTE 1 28094332d3Sopenharmony_ci#define REL_Y_BYTE 2 29094332d3Sopenharmony_ci#define MAX_EVENT_PKG_NUM 100 30094332d3Sopenharmony_ci 31094332d3Sopenharmony_ciInputDevManager *GetDevManager(void); 32094332d3Sopenharmony_ci 33094332d3Sopenharmony_cistatic int32_t EventListenerCallback(struct HdfDevEventlistener *listener, struct HdfIoService *service, 34094332d3Sopenharmony_ci uint32_t id, struct HdfSBuf *data) 35094332d3Sopenharmony_ci{ 36094332d3Sopenharmony_ci (void)listener; 37094332d3Sopenharmony_ci (void)id; 38094332d3Sopenharmony_ci int32_t count = 0; 39094332d3Sopenharmony_ci uint32_t len = 0; 40094332d3Sopenharmony_ci InputEventPackage *pkgs[MAX_EVENT_PKG_NUM] = {0}; 41094332d3Sopenharmony_ci DeviceInfoNode *pos = NULL; 42094332d3Sopenharmony_ci DeviceInfoNode *next = NULL; 43094332d3Sopenharmony_ci InputDevManager *manager = NULL; 44094332d3Sopenharmony_ci 45094332d3Sopenharmony_ci if (service == NULL || data == NULL) { 46094332d3Sopenharmony_ci HDF_LOGE("%s: invalid param", __func__); 47094332d3Sopenharmony_ci return INPUT_INVALID_PARAM; 48094332d3Sopenharmony_ci } 49094332d3Sopenharmony_ci 50094332d3Sopenharmony_ci manager = GetDevManager(); 51094332d3Sopenharmony_ci if (manager == NULL) { 52094332d3Sopenharmony_ci HDF_LOGE("%s: get manager failed", __func__); 53094332d3Sopenharmony_ci return INPUT_NULL_PTR; 54094332d3Sopenharmony_ci } 55094332d3Sopenharmony_ci 56094332d3Sopenharmony_ci while (true) { 57094332d3Sopenharmony_ci if (count >= MAX_EVENT_PKG_NUM) { 58094332d3Sopenharmony_ci break; 59094332d3Sopenharmony_ci } 60094332d3Sopenharmony_ci 61094332d3Sopenharmony_ci if (!HdfSbufReadBuffer(data, (const void **)&pkgs[count], &len)) { 62094332d3Sopenharmony_ci HDF_LOGE("%s: sbuf read finished", __func__); 63094332d3Sopenharmony_ci break; 64094332d3Sopenharmony_ci } 65094332d3Sopenharmony_ci 66094332d3Sopenharmony_ci if (pkgs[count] == NULL) { 67094332d3Sopenharmony_ci break; 68094332d3Sopenharmony_ci } 69094332d3Sopenharmony_ci count++; 70094332d3Sopenharmony_ci } 71094332d3Sopenharmony_ci 72094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) { 73094332d3Sopenharmony_ci if (pos->service == service) { 74094332d3Sopenharmony_ci if (pos->eventCb == NULL) { 75094332d3Sopenharmony_ci HDF_LOGE("%s: param is null", __func__); 76094332d3Sopenharmony_ci return INPUT_NULL_PTR; 77094332d3Sopenharmony_ci } 78094332d3Sopenharmony_ci pos->eventCb->EventPkgCallback((const InputEventPackage **)pkgs, count, pos->payload.devIndex); 79094332d3Sopenharmony_ci } 80094332d3Sopenharmony_ci } 81094332d3Sopenharmony_ci return INPUT_SUCCESS; 82094332d3Sopenharmony_ci} 83094332d3Sopenharmony_ci 84094332d3Sopenharmony_cistatic struct HdfDevEventlistener *EventListenerInstance(void) 85094332d3Sopenharmony_ci{ 86094332d3Sopenharmony_ci struct HdfDevEventlistener *listener = (struct HdfDevEventlistener *)malloc(sizeof(struct HdfDevEventlistener)); 87094332d3Sopenharmony_ci if (listener == NULL) { 88094332d3Sopenharmony_ci HDF_LOGE("%s: instance listener failed", __func__); 89094332d3Sopenharmony_ci return NULL; 90094332d3Sopenharmony_ci } 91094332d3Sopenharmony_ci 92094332d3Sopenharmony_ci (void)memset_s(listener, sizeof(struct HdfDevEventlistener), 0, sizeof(struct HdfDevEventlistener)); 93094332d3Sopenharmony_ci listener->onReceive = EventListenerCallback; 94094332d3Sopenharmony_ci return listener; 95094332d3Sopenharmony_ci} 96094332d3Sopenharmony_ci 97094332d3Sopenharmony_cistatic int32_t RegisterReportCallback(uint32_t devIndex, InputEventCb *callback) 98094332d3Sopenharmony_ci{ 99094332d3Sopenharmony_ci DeviceInfoNode *pos = NULL; 100094332d3Sopenharmony_ci DeviceInfoNode *next = NULL; 101094332d3Sopenharmony_ci InputDevManager *manager = NULL; 102094332d3Sopenharmony_ci 103094332d3Sopenharmony_ci if ((devIndex >= MAX_INPUT_DEV_NUM) || (callback == NULL) || (callback->EventPkgCallback == NULL)) { 104094332d3Sopenharmony_ci HDF_LOGE("%s: invalid param", __func__); 105094332d3Sopenharmony_ci return INPUT_INVALID_PARAM; 106094332d3Sopenharmony_ci } 107094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 108094332d3Sopenharmony_ci 109094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 110094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) { 111094332d3Sopenharmony_ci if (pos->payload.devIndex != devIndex) { 112094332d3Sopenharmony_ci continue; 113094332d3Sopenharmony_ci } 114094332d3Sopenharmony_ci struct HdfDevEventlistener *listener = EventListenerInstance(); 115094332d3Sopenharmony_ci if (listener == NULL) { 116094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 117094332d3Sopenharmony_ci return INPUT_FAILURE; 118094332d3Sopenharmony_ci } 119094332d3Sopenharmony_ci if (HdfDeviceRegisterEventListener(pos->service, listener) != INPUT_SUCCESS) { 120094332d3Sopenharmony_ci free(listener); 121094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 122094332d3Sopenharmony_ci HDF_LOGE("%s: fail to register listener", __func__); 123094332d3Sopenharmony_ci return INPUT_FAILURE; 124094332d3Sopenharmony_ci } 125094332d3Sopenharmony_ci manager->evtCallbackNum++; 126094332d3Sopenharmony_ci pos->eventCb = callback; 127094332d3Sopenharmony_ci pos->listener = listener; 128094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 129094332d3Sopenharmony_ci HDF_LOGI("%s: device%u register callback succ, evtCallbackNum = %d", __func__, 130094332d3Sopenharmony_ci devIndex, manager->evtCallbackNum); 131094332d3Sopenharmony_ci return INPUT_SUCCESS; 132094332d3Sopenharmony_ci } 133094332d3Sopenharmony_ci 134094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 135094332d3Sopenharmony_ci HDF_LOGE("%s: device%u doesn't exist, can't register callback", __func__, devIndex); 136094332d3Sopenharmony_ci return INPUT_FAILURE; 137094332d3Sopenharmony_ci} 138094332d3Sopenharmony_ci 139094332d3Sopenharmony_cistatic int32_t UnregisterReportCallback(uint32_t devIndex) 140094332d3Sopenharmony_ci{ 141094332d3Sopenharmony_ci DeviceInfoNode *pos = NULL; 142094332d3Sopenharmony_ci DeviceInfoNode *next = NULL; 143094332d3Sopenharmony_ci InputDevManager *manager = NULL; 144094332d3Sopenharmony_ci 145094332d3Sopenharmony_ci if (devIndex >= MAX_INPUT_DEV_NUM) { 146094332d3Sopenharmony_ci HDF_LOGE("%s: invalid param", __func__); 147094332d3Sopenharmony_ci return INPUT_INVALID_PARAM; 148094332d3Sopenharmony_ci } 149094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 150094332d3Sopenharmony_ci 151094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 152094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) { 153094332d3Sopenharmony_ci if (pos->payload.devIndex != devIndex) { 154094332d3Sopenharmony_ci continue; 155094332d3Sopenharmony_ci } 156094332d3Sopenharmony_ci if (pos->eventCb != NULL) { 157094332d3Sopenharmony_ci if (HdfDeviceUnregisterEventListener(pos->service, pos->listener) != INPUT_SUCCESS) { 158094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 159094332d3Sopenharmony_ci HDF_LOGE("%s: fail to unregister listener", __func__); 160094332d3Sopenharmony_ci return INPUT_FAILURE; 161094332d3Sopenharmony_ci } 162094332d3Sopenharmony_ci free(pos->listener); 163094332d3Sopenharmony_ci pos->listener = NULL; 164094332d3Sopenharmony_ci pos->eventCb = NULL; 165094332d3Sopenharmony_ci manager->evtCallbackNum--; 166094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 167094332d3Sopenharmony_ci HDF_LOGI("%s: device%u unregister callback succ", __func__, devIndex); 168094332d3Sopenharmony_ci return INPUT_SUCCESS; 169094332d3Sopenharmony_ci } else { 170094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 171094332d3Sopenharmony_ci HDF_LOGE("%s: device%u does not register callback", __func__, devIndex); 172094332d3Sopenharmony_ci return INPUT_FAILURE; 173094332d3Sopenharmony_ci } 174094332d3Sopenharmony_ci } 175094332d3Sopenharmony_ci 176094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 177094332d3Sopenharmony_ci HDF_LOGE("%s: device%u doesn't exist, can't unregister callback", __func__, devIndex); 178094332d3Sopenharmony_ci return INPUT_FAILURE; 179094332d3Sopenharmony_ci} 180094332d3Sopenharmony_ci 181094332d3Sopenharmony_cistatic int32_t HotPlugEventListenerCallback(struct HdfDevEventlistener *listener, 182094332d3Sopenharmony_ci struct HdfIoService *service, uint32_t id, struct HdfSBuf *data) 183094332d3Sopenharmony_ci{ 184094332d3Sopenharmony_ci (void)listener; 185094332d3Sopenharmony_ci (void)id; 186094332d3Sopenharmony_ci uint32_t len = 0; 187094332d3Sopenharmony_ci InputHotPlugEvent *event = NULL; 188094332d3Sopenharmony_ci InputDevManager *manager = NULL; 189094332d3Sopenharmony_ci bool ret = false; 190094332d3Sopenharmony_ci 191094332d3Sopenharmony_ci if (service == NULL || data == NULL) { 192094332d3Sopenharmony_ci HDF_LOGE("%s: invalid param", __func__); 193094332d3Sopenharmony_ci return INPUT_INVALID_PARAM; 194094332d3Sopenharmony_ci } 195094332d3Sopenharmony_ci 196094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 197094332d3Sopenharmony_ci 198094332d3Sopenharmony_ci ret = HdfSbufReadBuffer(data, (const void **)&event, &len); 199094332d3Sopenharmony_ci if (!ret) { 200094332d3Sopenharmony_ci HDF_LOGE("%s: read sbuf failed", __func__); 201094332d3Sopenharmony_ci return INPUT_FAILURE; 202094332d3Sopenharmony_ci } 203094332d3Sopenharmony_ci if (manager->hostDev.hostCb == NULL) { 204094332d3Sopenharmony_ci HDF_LOGE("%s: param is null", __func__); 205094332d3Sopenharmony_ci return INPUT_NULL_PTR; 206094332d3Sopenharmony_ci } 207094332d3Sopenharmony_ci manager->hostDev.hostCb->HotPlugCallback((const InputHotPlugEvent *)event); 208094332d3Sopenharmony_ci return INPUT_SUCCESS; 209094332d3Sopenharmony_ci} 210094332d3Sopenharmony_ci 211094332d3Sopenharmony_cistatic struct HdfDevEventlistener *HotPlugEventListenerInstance(void) 212094332d3Sopenharmony_ci{ 213094332d3Sopenharmony_ci struct HdfDevEventlistener *listener = (struct HdfDevEventlistener *)malloc(sizeof(struct HdfDevEventlistener)); 214094332d3Sopenharmony_ci if (listener == NULL) { 215094332d3Sopenharmony_ci HDF_LOGE("%s: instance listener failed", __func__); 216094332d3Sopenharmony_ci return NULL; 217094332d3Sopenharmony_ci } 218094332d3Sopenharmony_ci 219094332d3Sopenharmony_ci (void)memset_s(listener, sizeof(struct HdfDevEventlistener), 0, sizeof(struct HdfDevEventlistener)); 220094332d3Sopenharmony_ci listener->onReceive = HotPlugEventListenerCallback; 221094332d3Sopenharmony_ci return listener; 222094332d3Sopenharmony_ci} 223094332d3Sopenharmony_ci 224094332d3Sopenharmony_cistatic int32_t RegisterHotPlugCallback(InputHostCb *callback) 225094332d3Sopenharmony_ci{ 226094332d3Sopenharmony_ci InputDevManager *manager = NULL; 227094332d3Sopenharmony_ci 228094332d3Sopenharmony_ci if ((callback == NULL) || (callback->HotPlugCallback == NULL)) { 229094332d3Sopenharmony_ci HDF_LOGE("%s: invalid param", __func__); 230094332d3Sopenharmony_ci return INPUT_INVALID_PARAM; 231094332d3Sopenharmony_ci } 232094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 233094332d3Sopenharmony_ci 234094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 235094332d3Sopenharmony_ci if (manager->hostDev.service == NULL) { 236094332d3Sopenharmony_ci manager->hostDev.service = HdfIoServiceBind(DEV_MANAGER_SERVICE_NAME); 237094332d3Sopenharmony_ci if (manager->hostDev.service == NULL) { 238094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 239094332d3Sopenharmony_ci return INPUT_FAILURE; 240094332d3Sopenharmony_ci } 241094332d3Sopenharmony_ci } 242094332d3Sopenharmony_ci 243094332d3Sopenharmony_ci struct HdfDevEventlistener *listener = HotPlugEventListenerInstance(); 244094332d3Sopenharmony_ci if (listener == NULL) { 245094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 246094332d3Sopenharmony_ci HDF_LOGE("%s: fail to instance listener", __func__); 247094332d3Sopenharmony_ci return INPUT_FAILURE; 248094332d3Sopenharmony_ci } 249094332d3Sopenharmony_ci if (HdfDeviceRegisterEventListener(manager->hostDev.service, listener) != INPUT_SUCCESS) { 250094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 251094332d3Sopenharmony_ci HDF_LOGE("%s: fail to register listener", __func__); 252094332d3Sopenharmony_ci free(listener); 253094332d3Sopenharmony_ci return INPUT_FAILURE; 254094332d3Sopenharmony_ci } 255094332d3Sopenharmony_ci manager->hostDev.hostCb = callback; 256094332d3Sopenharmony_ci manager->hostDev.listener = listener; 257094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 258094332d3Sopenharmony_ci return INPUT_SUCCESS; 259094332d3Sopenharmony_ci} 260094332d3Sopenharmony_ci 261094332d3Sopenharmony_cistatic int32_t UnregisterHotPlugCallback(void) 262094332d3Sopenharmony_ci{ 263094332d3Sopenharmony_ci InputDevManager *manager = NULL; 264094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 265094332d3Sopenharmony_ci 266094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 267094332d3Sopenharmony_ci if (manager->hostDev.listener != NULL) { 268094332d3Sopenharmony_ci free(manager->hostDev.listener); 269094332d3Sopenharmony_ci manager->hostDev.listener = NULL; 270094332d3Sopenharmony_ci } 271094332d3Sopenharmony_ci manager->hostDev.hostCb = NULL; 272094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 273094332d3Sopenharmony_ci return INPUT_SUCCESS; 274094332d3Sopenharmony_ci} 275094332d3Sopenharmony_ci 276094332d3Sopenharmony_ciint32_t InstanceReporterHdi(InputReporter **reporter) 277094332d3Sopenharmony_ci{ 278094332d3Sopenharmony_ci InputReporter *reporterHdi = (InputReporter *)malloc(sizeof(InputReporter)); 279094332d3Sopenharmony_ci if (reporterHdi == NULL) { 280094332d3Sopenharmony_ci HDF_LOGE("%s: malloc fail", __func__); 281094332d3Sopenharmony_ci return INPUT_NOMEM; 282094332d3Sopenharmony_ci } 283094332d3Sopenharmony_ci 284094332d3Sopenharmony_ci (void)memset_s(reporterHdi, sizeof(InputReporter), 0, sizeof(InputReporter)); 285094332d3Sopenharmony_ci 286094332d3Sopenharmony_ci reporterHdi->RegisterReportCallback = RegisterReportCallback; 287094332d3Sopenharmony_ci reporterHdi->UnregisterReportCallback = UnregisterReportCallback; 288094332d3Sopenharmony_ci reporterHdi->RegisterHotPlugCallback = RegisterHotPlugCallback; 289094332d3Sopenharmony_ci reporterHdi->UnregisterHotPlugCallback = UnregisterHotPlugCallback; 290094332d3Sopenharmony_ci *reporter = reporterHdi; 291094332d3Sopenharmony_ci 292094332d3Sopenharmony_ci return INPUT_SUCCESS; 293094332d3Sopenharmony_ci} 294