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