1 /*
2  * Copyright (c) 2021-2024 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 "processing_finger_device.h"
17 
18 #undef MMI_LOG_TAG
19 #define MMI_LOG_TAG "ProcessingFingerDevice"
20 
21 namespace OHOS {
22 namespace MMI {
23 namespace {
24 constexpr int64_t FINGER_BLOCK_TIME { 6 };
25 } // namespace
26 
TransformJsonDataToInputData(const DeviceItem & fingerEventArrays,InputEventArray & inputEventArray)27 int32_t ProcessingFingerDevice::TransformJsonDataToInputData(const DeviceItem &fingerEventArrays,
28     InputEventArray &inputEventArray)
29 {
30     CALL_DEBUG_ENTER;
31     std::vector<DeviceEvent> inputData = fingerEventArrays.events;
32     if (inputData.empty()) {
33         MMI_HILOGE("Manage finger array failed, inputData is empty.");
34         return RET_ERR;
35     }
36     TouchPadInputEvents touchPadInputEvents = {};
37     AnalysisTouchPadFingerDate(inputData, touchPadInputEvents);
38     TouchPadInputEvent pressEvents = touchPadInputEvents.eventArray[0];
39     AnalysisTouchPadFingerPressData(inputEventArray, pressEvents);
40     for (uint64_t i = 1; i < touchPadInputEvents.eventNumber; i++) {
41         AnalysisTouchPadFingerMoveData(inputEventArray, touchPadInputEvents.eventArray[i]);
42     }
43     uint64_t releaseEventIndex = touchPadInputEvents.eventNumber - 1;
44     TouchPadInputEvent releaseEvents = touchPadInputEvents.eventArray[releaseEventIndex];
45     AnalysisTouchPadFingerReleaseData(inputEventArray, releaseEvents);
46     return RET_OK;
47 }
48 
AnalysisTouchPadFingerDate(const std::vector<DeviceEvent> & inputData,TouchPadInputEvents & touchPadInputEvents)49 void ProcessingFingerDevice::AnalysisTouchPadFingerDate(const std::vector<DeviceEvent> &inputData,
50     TouchPadInputEvents &touchPadInputEvents)
51 {
52     TouchPadCoordinates touchPadCoordinates = {};
53     TouchPadInputEvent touchPadInputEvent = {};
54     for (const auto &item : inputData) {
55         touchPadInputEvent.groupNumber = 0;
56         for (const auto &posXYItem : item.posXY) {
57             touchPadCoordinates.xPos = posXYItem.xPos;
58             touchPadCoordinates.yPos = posXYItem.yPos;
59             touchPadInputEvent.events.push_back(touchPadCoordinates);
60             ++touchPadInputEvent.groupNumber;
61         }
62         touchPadInputEvents.eventNumber = inputData.size();
63         touchPadInputEvents.eventArray.push_back(touchPadInputEvent);
64         touchPadInputEvent.events.clear();
65     }
66 }
67 
AnalysisTouchPadFingerPressData(InputEventArray & inputEventArray,const TouchPadInputEvent & touchPadInputEvent)68 void ProcessingFingerDevice::AnalysisTouchPadFingerPressData(InputEventArray &inputEventArray,
69                                                              const TouchPadInputEvent &touchPadInputEvent)
70 {
71     int32_t yPos = 0;
72     int32_t xPos = 0;
73     for (uint64_t i = 0; i < static_cast<uint64_t>(touchPadInputEvent.groupNumber); i++) {
74         yPos = touchPadInputEvent.events[i].yPos;
75         xPos = touchPadInputEvent.events[i].xPos;
76         if (touchPadInputEvent.groupNumber > 1) {
77             SetMtSlot(inputEventArray, FINGER_BLOCK_TIME, static_cast<int32_t>(i));
78         }
79         SetTrackingId(inputEventArray, FINGER_BLOCK_TIME);
80         SetPositionX(inputEventArray, FINGER_BLOCK_TIME, xPos);
81         SetPositionY(inputEventArray, FINGER_BLOCK_TIME, yPos);
82         SetMtTouchMajor(inputEventArray, FINGER_BLOCK_TIME, 1);
83         SetMtTouchMinor(inputEventArray, FINGER_BLOCK_TIME, 1);
84         SetBtnTouch(inputEventArray, FINGER_BLOCK_TIME, 1);
85         SetMtTouchFingerType(inputEventArray, FINGER_BLOCK_TIME,
86                              static_cast<int32_t>(touchPadInputEvent.groupNumber), 1);
87         SetEvAbsX(inputEventArray, FINGER_BLOCK_TIME, xPos);
88         SetEvAbsY(inputEventArray, FINGER_BLOCK_TIME, yPos);
89     }
90     SetSynReport(inputEventArray);
91 }
92 
AnalysisTouchPadFingerMoveData(InputEventArray & inputEventArray,const TouchPadInputEvent & touchPadInputEvent)93 void ProcessingFingerDevice::AnalysisTouchPadFingerMoveData(InputEventArray &inputEventArray,
94                                                             const TouchPadInputEvent &touchPadInputEvent)
95 {
96     int32_t xPos = 0;
97     int32_t yPos = 0;
98     for (uint64_t i = 0; i < static_cast<uint64_t>(touchPadInputEvent.groupNumber); i++) {
99         xPos = touchPadInputEvent.events[i].xPos;
100         yPos = touchPadInputEvent.events[i].yPos;
101         if (touchPadInputEvent.groupNumber > 1) {
102             SetMtSlot(inputEventArray, FINGER_BLOCK_TIME, static_cast<int32_t>(i));
103         }
104         SetPositionX(inputEventArray, FINGER_BLOCK_TIME, xPos);
105         SetPositionY(inputEventArray, FINGER_BLOCK_TIME, yPos);
106         SetMtTouchMajor(inputEventArray, FINGER_BLOCK_TIME, 1);
107         SetMtTouchMinor(inputEventArray, FINGER_BLOCK_TIME, 1);
108         SetEvAbsX(inputEventArray, FINGER_BLOCK_TIME, xPos);
109         SetEvAbsY(inputEventArray, FINGER_BLOCK_TIME, yPos);
110     }
111     SetSynReport(inputEventArray);
112 }
113 
AnalysisTouchPadFingerReleaseData(InputEventArray & inputEventArray,const TouchPadInputEvent & touchPadInputEvent)114 void ProcessingFingerDevice::AnalysisTouchPadFingerReleaseData(InputEventArray &inputEventArray,
115                                                                const TouchPadInputEvent &touchPadInputEvent)
116 {
117     for (uint64_t i = 0; i < static_cast<uint64_t>(touchPadInputEvent.groupNumber); i++) {
118         if (touchPadInputEvent.groupNumber > 1) {
119             SetMtSlot(inputEventArray, FINGER_BLOCK_TIME, static_cast<int32_t>(i));
120         }
121         SetTrackingId(inputEventArray, FINGER_BLOCK_TIME, -1);
122         SetBtnTouch(inputEventArray, FINGER_BLOCK_TIME, 0);
123         SetMtTouchFingerType(inputEventArray, FINGER_BLOCK_TIME,
124                              static_cast<int32_t>(touchPadInputEvent.groupNumber), 0);
125     }
126     SetSynReport(inputEventArray);
127 }
128 } // namespace MMI
129 } // namespace OHOS
130