1 /*
2 * Copyright (c) 2021-2022 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_pad_device.h"
17
18 #undef MMI_LOG_TAG
19 #define MMI_LOG_TAG "ProcessingPadDevice"
20
21 namespace OHOS {
22 namespace MMI {
TransformJsonDataToInputData(const DeviceItem & fingerEventArrays,InputEventArray & inputEventArray)23 int32_t ProcessingPadDevice::TransformJsonDataToInputData(const DeviceItem& fingerEventArrays,
24 InputEventArray& inputEventArray)
25 {
26 CALL_DEBUG_ENTER;
27 std::vector<DeviceEvent> inputData = fingerEventArrays.events;
28 if (inputData.empty()) {
29 MMI_HILOGE("Manage finger array failed, inputData is empty.");
30 return RET_ERR;
31 }
32 std::vector<PadEvent> padEventArray;
33 if (AnalysisPadEvent(inputData, padEventArray) == RET_ERR) {
34 return RET_ERR;
35 }
36 TransformPadEventToInputEvent(padEventArray, inputEventArray);
37 return RET_OK;
38 }
39
TransformPadEventToInputEvent(const std::vector<PadEvent> & padEventArray,InputEventArray & inputEventArray)40 void ProcessingPadDevice::TransformPadEventToInputEvent(const std::vector<PadEvent>& padEventArray,
41 InputEventArray& inputEventArray)
42 {
43 for (const auto &item : padEventArray) {
44 if (item.eventType == "KEY_EVENT_PRESS") {
45 TransformKeyPressEvent(item, inputEventArray);
46 } else if (item.eventType == "KEY_EVENT_RELEASE") {
47 TransformKeyReleaseEvent(item, inputEventArray);
48 } else if (item.eventType == "KEY_EVENT_CLICK") {
49 TransformKeyClickEvent(item, inputEventArray);
50 } else if (item.eventType == "RING_EVENT") {
51 TransformRingEvent(item, inputEventArray);
52 } else {
53 MMI_HILOGW("Json file format error");
54 }
55 }
56 }
57
AnalysisPadEvent(const std::vector<DeviceEvent> & inputData,std::vector<PadEvent> & padEventArray)58 int32_t ProcessingPadDevice::AnalysisPadEvent(const std::vector<DeviceEvent>& inputData,
59 std::vector<PadEvent>& padEventArray)
60 {
61 PadEvent padEvent = {};
62 for (const auto &item : inputData) {
63 padEvent.eventType = item.eventType;
64 padEvent.keyValue = item.keyValue;
65 if (item.ringEvents.empty()) {
66 padEvent.ringEvents = item.ringEvents;
67 }
68 padEventArray.push_back(padEvent);
69 }
70 return RET_OK;
71 }
72
TransformKeyPressEvent(const PadEvent & padEvent,InputEventArray & inputEventArray)73 void ProcessingPadDevice::TransformKeyPressEvent(const PadEvent& padEvent, InputEventArray& inputEventArray)
74 {
75 SetKeyPressEvent(inputEventArray, 0, static_cast<uint16_t>(padEvent.keyValue));
76 SetAbsMisc(inputEventArray, 0, 1);
77 SetSynReport(inputEventArray);
78 }
79
TransformKeyReleaseEvent(const PadEvent & padEvent,InputEventArray & inputEventArray)80 void ProcessingPadDevice::TransformKeyReleaseEvent(const PadEvent& padEvent, InputEventArray& inputEventArray)
81 {
82 SetKeyReleaseEvent(inputEventArray, 0, static_cast<uint16_t>(padEvent.keyValue));
83 SetAbsMisc(inputEventArray, 0, 0);
84 SetSynReport(inputEventArray);
85 }
86
TransformKeyClickEvent(const PadEvent & padEvent,InputEventArray & inputEventArray)87 void ProcessingPadDevice::TransformKeyClickEvent(const PadEvent& padEvent, InputEventArray& inputEventArray)
88 {
89 SetKeyPressEvent(inputEventArray, 0, static_cast<uint16_t>(padEvent.keyValue));
90 SetAbsMisc(inputEventArray, 0, 1);
91 SetSynReport(inputEventArray);
92 SetKeyReleaseEvent(inputEventArray, 0, static_cast<uint16_t>(padEvent.keyValue));
93 SetAbsMisc(inputEventArray, 0, 0);
94 SetSynReport(inputEventArray);
95 }
96
TransformRingEvent(const PadEvent & padEvent,InputEventArray & inputEventArray)97 void ProcessingPadDevice::TransformRingEvent(const PadEvent& padEvent, InputEventArray& inputEventArray)
98 {
99 uint64_t eventCount = static_cast<uint64_t>(padEvent.ringEvents.size());
100 for (uint64_t i = 0; i < eventCount; i++) {
101 SetEvAbsWheel(inputEventArray, 0, padEvent.ringEvents[i]);
102 if (i == 0) {
103 SetAbsMisc(inputEventArray, 0, 1);
104 } else if (i == (eventCount - 1)) {
105 SetAbsMisc(inputEventArray, 0, 0);
106 } else {
107 // nothing to do.
108 }
109 SetSynReport(inputEventArray);
110 }
111 }
112 } // namespace MMI
113 } // namespace OHOS