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