1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#include "input_manager_command.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include <getopt.h>
19c29fa5a6Sopenharmony_ci
20c29fa5a6Sopenharmony_ci#include <algorithm>
21c29fa5a6Sopenharmony_ci#include <chrono>
22c29fa5a6Sopenharmony_ci#include <cmath>
23c29fa5a6Sopenharmony_ci#include <cstdio>
24c29fa5a6Sopenharmony_ci#include <cstdlib>
25c29fa5a6Sopenharmony_ci#include <ctime>
26c29fa5a6Sopenharmony_ci#include <iostream>
27c29fa5a6Sopenharmony_ci#include <limits>
28c29fa5a6Sopenharmony_ci#include <thread>
29c29fa5a6Sopenharmony_ci
30c29fa5a6Sopenharmony_ci#include <sys/time.h>
31c29fa5a6Sopenharmony_ci#include <unistd.h>
32c29fa5a6Sopenharmony_ci
33c29fa5a6Sopenharmony_ci#include "string_ex.h"
34c29fa5a6Sopenharmony_ci
35c29fa5a6Sopenharmony_ci#include "error_multimodal.h"
36c29fa5a6Sopenharmony_ci#include "event_log_helper.h"
37c29fa5a6Sopenharmony_ci#include "input_manager.h"
38c29fa5a6Sopenharmony_ci#include "mmi_log.h"
39c29fa5a6Sopenharmony_ci#include "multimodal_event_handler.h"
40c29fa5a6Sopenharmony_ci#include "util.h"
41c29fa5a6Sopenharmony_ci
42c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG
43c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "InputManagerCommand"
44c29fa5a6Sopenharmony_ci
45c29fa5a6Sopenharmony_ciclass InputManagerCommand {
46c29fa5a6Sopenharmony_cipublic:
47c29fa5a6Sopenharmony_ci    int32_t ParseCommand(int32_t argc, char *argv[]);
48c29fa5a6Sopenharmony_ci    int32_t ConnectService();
49c29fa5a6Sopenharmony_ci    void ShowUsage();
50c29fa5a6Sopenharmony_ciprivate:
51c29fa5a6Sopenharmony_ci    void InitializeMouseDeathStub();
52c29fa5a6Sopenharmony_ci};
53c29fa5a6Sopenharmony_cinamespace OHOS {
54c29fa5a6Sopenharmony_cinamespace MMI {
55c29fa5a6Sopenharmony_cinamespace {
56c29fa5a6Sopenharmony_ciconstexpr int32_t SLEEPTIME = 20;
57c29fa5a6Sopenharmony_ciconstexpr int32_t MOUSE_ID = 7;
58c29fa5a6Sopenharmony_ciconstexpr int32_t JOYSTICK_BUTTON_ID = 25;
59c29fa5a6Sopenharmony_ciconstexpr int32_t TWO_MORE_COMMAND = 2;
60c29fa5a6Sopenharmony_ciconstexpr int32_t THREE_MORE_COMMAND = 3;
61c29fa5a6Sopenharmony_ciconstexpr int32_t MAX_PRESSED_COUNT = 30;
62c29fa5a6Sopenharmony_ciconstexpr int32_t ACTION_TIME = 3000;
63c29fa5a6Sopenharmony_ciconstexpr int32_t BLOCK_TIME_MS = 7;
64c29fa5a6Sopenharmony_ciconstexpr int32_t TIME_TRANSITION = 1000;
65c29fa5a6Sopenharmony_ciconstexpr int64_t MIN_TAKTTIME_MS = 1;
66c29fa5a6Sopenharmony_ciconstexpr int64_t MAX_TAKTTIME_MS = 15000;
67c29fa5a6Sopenharmony_ciconstexpr int32_t DEFAULT_DELAY = 200;
68c29fa5a6Sopenharmony_ciconstexpr int32_t KNUCKLE_PARAM_SIZE = 9;
69c29fa5a6Sopenharmony_ciconstexpr int32_t DEFAULT_POINTER_ID_FIRST = 0;
70c29fa5a6Sopenharmony_ciconstexpr int32_t TOTAL_TIME_MS = 1000;
71c29fa5a6Sopenharmony_ciconstexpr int32_t BUTTON_PARAM_SIZE = 8;
72c29fa5a6Sopenharmony_ciconstexpr int32_t KEY_PARAM_SIZE = 5;
73c29fa5a6Sopenharmony_ciconstexpr int32_t KEY_TIME_PARAM_SIZE = 6;
74c29fa5a6Sopenharmony_ciconstexpr int32_t INTERVAL_TIME_MS = 100;
75c29fa5a6Sopenharmony_ciconstexpr int32_t FINGER_LOCATION_NUMS = 4;
76c29fa5a6Sopenharmony_ciconstexpr int32_t MOVE_POS_ONE = 1;
77c29fa5a6Sopenharmony_ciconstexpr int32_t MOVE_POS_TWO = 2;
78c29fa5a6Sopenharmony_ciconstexpr int32_t MOVE_POS_THREE = 3;
79c29fa5a6Sopenharmony_ciconstexpr int32_t MAX_KEEP_TIME = 60000;
80c29fa5a6Sopenharmony_ciconstexpr int32_t NUM_KEEP_ARGC = 2;
81c29fa5a6Sopenharmony_ciconstexpr int32_t MAX_ARGC = 18;
82c29fa5a6Sopenharmony_ciconstexpr int32_t ONE_ARGC = 1;
83c29fa5a6Sopenharmony_ciconstexpr int32_t TWO_ARGC = 2;
84c29fa5a6Sopenharmony_ciconstexpr int32_t THREE_ARGC = 3;
85c29fa5a6Sopenharmony_ciconstexpr int32_t FOUR_ARGC = 4;
86c29fa5a6Sopenharmony_ci
87c29fa5a6Sopenharmony_cienum JoystickEvent {
88c29fa5a6Sopenharmony_ci    JOYSTICK_BUTTON_UP,
89c29fa5a6Sopenharmony_ci    JOYSTICK_BUTTON_PRESS,
90c29fa5a6Sopenharmony_ci    JOYSTICK_MOVE,
91c29fa5a6Sopenharmony_ci    JOYSTICK_CLICK,
92c29fa5a6Sopenharmony_ci    JOYSTICK_INTERVAL
93c29fa5a6Sopenharmony_ci};
94c29fa5a6Sopenharmony_cistruct JoystickInfo {
95c29fa5a6Sopenharmony_ci    int32_t buttonId { -1 };
96c29fa5a6Sopenharmony_ci    int32_t absValue { -1 };
97c29fa5a6Sopenharmony_ci    int32_t taktTime { 0 };
98c29fa5a6Sopenharmony_ci    PointerEvent::AxisType absType;
99c29fa5a6Sopenharmony_ci};
100c29fa5a6Sopenharmony_ci} // namespace
101c29fa5a6Sopenharmony_ci
102c29fa5a6Sopenharmony_civoid InputManagerCommand::SleepAndUpdateTime(int64_t &currentTimeMs)
103c29fa5a6Sopenharmony_ci{
104c29fa5a6Sopenharmony_ci    int64_t nowEndSysTimeMs = GetSysClockTime() / TIME_TRANSITION;
105c29fa5a6Sopenharmony_ci    int64_t sleepTimeMs = BLOCK_TIME_MS - (nowEndSysTimeMs - currentTimeMs) % BLOCK_TIME_MS;
106c29fa5a6Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(sleepTimeMs));
107c29fa5a6Sopenharmony_ci    currentTimeMs = nowEndSysTimeMs + sleepTimeMs;
108c29fa5a6Sopenharmony_ci}
109c29fa5a6Sopenharmony_ci
110c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::NextPos(int64_t begTimeMs, int64_t curtTimeMs, int32_t totalTimeMs,
111c29fa5a6Sopenharmony_ci    int32_t begPos, int32_t endPos)
112c29fa5a6Sopenharmony_ci{
113c29fa5a6Sopenharmony_ci    int64_t endTimeMs = 0;
114c29fa5a6Sopenharmony_ci    if (!AddInt64(begTimeMs, totalTimeMs, endTimeMs)) {
115c29fa5a6Sopenharmony_ci        return begPos;
116c29fa5a6Sopenharmony_ci    }
117c29fa5a6Sopenharmony_ci    if (curtTimeMs < begTimeMs || curtTimeMs > endTimeMs) {
118c29fa5a6Sopenharmony_ci        return begPos;
119c29fa5a6Sopenharmony_ci    }
120c29fa5a6Sopenharmony_ci    if (totalTimeMs == 0) {
121c29fa5a6Sopenharmony_ci        std::cout << "invalid totalTimeMs" << std::endl;
122c29fa5a6Sopenharmony_ci        return begPos;
123c29fa5a6Sopenharmony_ci    }
124c29fa5a6Sopenharmony_ci    double tmpTimeMs = static_cast<double>(curtTimeMs - begTimeMs) / totalTimeMs;
125c29fa5a6Sopenharmony_ci    int32_t offsetPos = std::ceil(tmpTimeMs * (endPos - begPos));
126c29fa5a6Sopenharmony_ci    int32_t retPos = 0;
127c29fa5a6Sopenharmony_ci    if (offsetPos == 0) {
128c29fa5a6Sopenharmony_ci        return begPos;
129c29fa5a6Sopenharmony_ci    } else if (offsetPos > 0) {
130c29fa5a6Sopenharmony_ci        if (!AddInt32(begPos, offsetPos, retPos)) {
131c29fa5a6Sopenharmony_ci            return begPos;
132c29fa5a6Sopenharmony_ci        }
133c29fa5a6Sopenharmony_ci        return retPos > endPos ? endPos : retPos;
134c29fa5a6Sopenharmony_ci    }
135c29fa5a6Sopenharmony_ci    if (!AddInt32(begPos, offsetPos, retPos)) {
136c29fa5a6Sopenharmony_ci        return begPos;
137c29fa5a6Sopenharmony_ci    }
138c29fa5a6Sopenharmony_ci    return retPos < endPos ? endPos : retPos;
139c29fa5a6Sopenharmony_ci}
140c29fa5a6Sopenharmony_ci
141c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::ParseCommand(int32_t argc, char *argv[])
142c29fa5a6Sopenharmony_ci{
143c29fa5a6Sopenharmony_ci    struct option headOptions[] = {
144c29fa5a6Sopenharmony_ci        {"mouse", no_argument, nullptr, 'M'},
145c29fa5a6Sopenharmony_ci        {"keyboard", no_argument, nullptr, 'K'},
146c29fa5a6Sopenharmony_ci        {"stylus", no_argument, nullptr, 'S'},
147c29fa5a6Sopenharmony_ci        {"touch", no_argument, nullptr, 'T'},
148c29fa5a6Sopenharmony_ci        {"touchpad", no_argument, nullptr, 'P'},
149c29fa5a6Sopenharmony_ci        {"joystick", no_argument, nullptr, 'J'},
150c29fa5a6Sopenharmony_ci        {"help", no_argument, nullptr, '?'},
151c29fa5a6Sopenharmony_ci        {nullptr, 0, nullptr, 0}
152c29fa5a6Sopenharmony_ci    };
153c29fa5a6Sopenharmony_ci
154c29fa5a6Sopenharmony_ci    struct option mouseSensorOptions[] = {
155c29fa5a6Sopenharmony_ci        {"move", required_argument, nullptr, 'm'},
156c29fa5a6Sopenharmony_ci        {"click", required_argument, nullptr, 'c'},
157c29fa5a6Sopenharmony_ci        {"double_click", required_argument, nullptr, 'b'},
158c29fa5a6Sopenharmony_ci        {"down", required_argument, nullptr, 'd'},
159c29fa5a6Sopenharmony_ci        {"up", required_argument, nullptr, 'u'},
160c29fa5a6Sopenharmony_ci        {"scroll", required_argument, nullptr, 's'},
161c29fa5a6Sopenharmony_ci        {"drag", required_argument, nullptr, 'g'},
162c29fa5a6Sopenharmony_ci        {"interval", required_argument, nullptr, 'i'},
163c29fa5a6Sopenharmony_ci        {nullptr, 0, nullptr, 0}
164c29fa5a6Sopenharmony_ci    };
165c29fa5a6Sopenharmony_ci    struct option keyboardSensorOptions[] = {
166c29fa5a6Sopenharmony_ci        {"down", required_argument, nullptr, 'd'},
167c29fa5a6Sopenharmony_ci        {"up", required_argument, nullptr, 'u'},
168c29fa5a6Sopenharmony_ci        {"long_press", required_argument, nullptr, 'l'},
169c29fa5a6Sopenharmony_ci        {"repeat", required_argument, nullptr, 'r'},
170c29fa5a6Sopenharmony_ci        {"interval", required_argument, nullptr, 'i'},
171c29fa5a6Sopenharmony_ci        {"text", required_argument, nullptr, 't'},
172c29fa5a6Sopenharmony_ci        {nullptr, 0, nullptr, 0}
173c29fa5a6Sopenharmony_ci    };
174c29fa5a6Sopenharmony_ci    struct option touchSensorOptions[] = {
175c29fa5a6Sopenharmony_ci        {"move", required_argument, nullptr, 'm'},
176c29fa5a6Sopenharmony_ci        {"down", required_argument, nullptr, 'd'},
177c29fa5a6Sopenharmony_ci        {"up", required_argument, nullptr, 'u'},
178c29fa5a6Sopenharmony_ci        {"click", required_argument, nullptr, 'c'},
179c29fa5a6Sopenharmony_ci        {"interval", required_argument, nullptr, 'i'},
180c29fa5a6Sopenharmony_ci        {"drag", required_argument, nullptr, 'g'},
181c29fa5a6Sopenharmony_ci        {"knuckle", no_argument, nullptr, 'k'},
182c29fa5a6Sopenharmony_ci        {nullptr, 0, nullptr, 0}
183c29fa5a6Sopenharmony_ci    };
184c29fa5a6Sopenharmony_ci    struct option joystickSensorOptions[] = {
185c29fa5a6Sopenharmony_ci        {"move", required_argument, nullptr, 'm'},
186c29fa5a6Sopenharmony_ci        {"down", required_argument, nullptr, 'd'},
187c29fa5a6Sopenharmony_ci        {"up", required_argument, nullptr, 'u'},
188c29fa5a6Sopenharmony_ci        {"click", required_argument, nullptr, 'c'},
189c29fa5a6Sopenharmony_ci        {"interval", required_argument, nullptr, 'i'},
190c29fa5a6Sopenharmony_ci        {nullptr, 0, nullptr, 0}
191c29fa5a6Sopenharmony_ci    };
192c29fa5a6Sopenharmony_ci    int32_t c = 0;
193c29fa5a6Sopenharmony_ci    int32_t optionIndex = 0;
194c29fa5a6Sopenharmony_ci    optind = 0;
195c29fa5a6Sopenharmony_ci    if ((c = getopt_long(argc, argv, "JKMPST?", headOptions, &optionIndex)) != -1) {
196c29fa5a6Sopenharmony_ci        switch (c) {
197c29fa5a6Sopenharmony_ci            case 'M': {
198c29fa5a6Sopenharmony_ci                int32_t px = 0;
199c29fa5a6Sopenharmony_ci                int32_t py = 0;
200c29fa5a6Sopenharmony_ci                int32_t buttonId;
201c29fa5a6Sopenharmony_ci                int32_t scrollValue;
202c29fa5a6Sopenharmony_ci                while ((c = getopt_long(argc, argv, "m:d:u:c:b:s:g:i:", mouseSensorOptions, &optionIndex)) != -1) {
203c29fa5a6Sopenharmony_ci                    switch (c) {
204c29fa5a6Sopenharmony_ci                        case 'm': {
205c29fa5a6Sopenharmony_ci                            if (argc - optind < 1) {
206c29fa5a6Sopenharmony_ci                                std::cout << "too few arguments to function" << std::endl;
207c29fa5a6Sopenharmony_ci                                return RET_ERR;
208c29fa5a6Sopenharmony_ci                            }
209c29fa5a6Sopenharmony_ci                            auto isTraceOption = [](const std::string &opt1) {
210c29fa5a6Sopenharmony_ci                                return opt1 == std::string("--trace");
211c29fa5a6Sopenharmony_ci                            };
212c29fa5a6Sopenharmony_ci                            auto traceMode = [isTraceOption](int32_t argCount, char *argvOffset[]) -> bool {
213c29fa5a6Sopenharmony_ci                                if (argCount <= 3) {
214c29fa5a6Sopenharmony_ci                                    return false;
215c29fa5a6Sopenharmony_ci                                }
216c29fa5a6Sopenharmony_ci                                std::string arg3 = argvOffset[2];
217c29fa5a6Sopenharmony_ci                                if (!arg3.empty() && arg3.at(0) == '-') {
218c29fa5a6Sopenharmony_ci                                    return false;
219c29fa5a6Sopenharmony_ci                                }
220c29fa5a6Sopenharmony_ci                                if ((argCount >= 5) && isTraceOption(std::string(argvOffset[4]))) {
221c29fa5a6Sopenharmony_ci                                    return true;
222c29fa5a6Sopenharmony_ci                                }
223c29fa5a6Sopenharmony_ci                                if ((argCount >= 6) && isTraceOption(std::string(argvOffset[5]))) {
224c29fa5a6Sopenharmony_ci                                    return true;
225c29fa5a6Sopenharmony_ci                                }
226c29fa5a6Sopenharmony_ci                                return false;
227c29fa5a6Sopenharmony_ci                            }(argc - optind + 1, &argv[optind - 1]);
228c29fa5a6Sopenharmony_ci                            if (!traceMode) {
229c29fa5a6Sopenharmony_ci                                if (!StrToInt(optarg, px) || !StrToInt(argv[optind], py)) {
230c29fa5a6Sopenharmony_ci                                    std::cout << "invalid parameter to move mouse" << std::endl;
231c29fa5a6Sopenharmony_ci                                    return RET_ERR;
232c29fa5a6Sopenharmony_ci                                }
233c29fa5a6Sopenharmony_ci                                if ((px < 0) || (py < 0)) {
234c29fa5a6Sopenharmony_ci                                    std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
235c29fa5a6Sopenharmony_ci                                    return RET_ERR;
236c29fa5a6Sopenharmony_ci                                }
237c29fa5a6Sopenharmony_ci                                std::cout << "move to " << px << " " << py << std::endl;
238c29fa5a6Sopenharmony_ci                                auto pointerEvent = PointerEvent::Create();
239c29fa5a6Sopenharmony_ci                                CHKPR(pointerEvent, ERROR_NULL_POINTER);
240c29fa5a6Sopenharmony_ci                                PointerEvent::PointerItem item;
241c29fa5a6Sopenharmony_ci                                item.SetPointerId(0);
242c29fa5a6Sopenharmony_ci                                item.SetDisplayX(px);
243c29fa5a6Sopenharmony_ci                                item.SetDisplayY(py);
244c29fa5a6Sopenharmony_ci                                pointerEvent->AddPointerItem(item);
245c29fa5a6Sopenharmony_ci                                pointerEvent->SetPointerId(0);
246c29fa5a6Sopenharmony_ci                                pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE);
247c29fa5a6Sopenharmony_ci                                pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
248c29fa5a6Sopenharmony_ci                                InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
249c29fa5a6Sopenharmony_ci                                optind++;
250c29fa5a6Sopenharmony_ci                            } else {
251c29fa5a6Sopenharmony_ci                                int32_t px1 = 0;
252c29fa5a6Sopenharmony_ci                                int32_t py1 = 0;
253c29fa5a6Sopenharmony_ci                                int32_t px2 = 0;
254c29fa5a6Sopenharmony_ci                                int32_t py2 = 0;
255c29fa5a6Sopenharmony_ci                                int32_t totalTimeMs = 1000;
256c29fa5a6Sopenharmony_ci                                bool foundTraceOption = false;
257c29fa5a6Sopenharmony_ci                                if (argc - optind >= 3) {
258c29fa5a6Sopenharmony_ci                                    if ((!StrToInt(optarg, px1)) ||
259c29fa5a6Sopenharmony_ci                                        (!StrToInt(argv[optind], py1)) ||
260c29fa5a6Sopenharmony_ci                                        (!StrToInt(argv[optind + 1], px2)) ||
261c29fa5a6Sopenharmony_ci                                        (!StrToInt(argv[optind + 2], py2))) {
262c29fa5a6Sopenharmony_ci                                            std::cout << "invalid coordinate value" << std::endl;
263c29fa5a6Sopenharmony_ci                                            return RET_ERR;
264c29fa5a6Sopenharmony_ci                                    }
265c29fa5a6Sopenharmony_ci                                    optind += 3;
266c29fa5a6Sopenharmony_ci                                }
267c29fa5a6Sopenharmony_ci                                if ((px1 < 0) || (py1 < 0) || (px2 < 0) || (py2 < 0)) {
268c29fa5a6Sopenharmony_ci                                    std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
269c29fa5a6Sopenharmony_ci                                    return RET_ERR;
270c29fa5a6Sopenharmony_ci                                }
271c29fa5a6Sopenharmony_ci                                if (argc - optind >= 1) {
272c29fa5a6Sopenharmony_ci                                    std::string arg5 = argv[optind];
273c29fa5a6Sopenharmony_ci                                    if (!arg5.empty() && arg5.at(0) == '-') {
274c29fa5a6Sopenharmony_ci                                        if (isTraceOption(arg5)) {
275c29fa5a6Sopenharmony_ci                                            foundTraceOption = true;
276c29fa5a6Sopenharmony_ci                                        } else {
277c29fa5a6Sopenharmony_ci                                            std::cout << "invalid option, the 5th position parameter must be --trace"
278c29fa5a6Sopenharmony_ci                                                << std::endl;
279c29fa5a6Sopenharmony_ci                                            return RET_ERR;
280c29fa5a6Sopenharmony_ci                                        }
281c29fa5a6Sopenharmony_ci                                    } else if (!StrToInt(arg5, totalTimeMs)) {
282c29fa5a6Sopenharmony_ci                                        std::cout << "invalid total times" << std::endl;
283c29fa5a6Sopenharmony_ci                                        return RET_ERR;
284c29fa5a6Sopenharmony_ci                                    }
285c29fa5a6Sopenharmony_ci                                    optind++;
286c29fa5a6Sopenharmony_ci                                }
287c29fa5a6Sopenharmony_ci                                if (!foundTraceOption) {
288c29fa5a6Sopenharmony_ci                                    if (argc - optind < 1) {
289c29fa5a6Sopenharmony_ci                                        std::cout << "missing 6th position parameter --trace" << std::endl;
290c29fa5a6Sopenharmony_ci                                        return RET_ERR;
291c29fa5a6Sopenharmony_ci                                    }
292c29fa5a6Sopenharmony_ci                                    std::string arg6 = argv[optind];
293c29fa5a6Sopenharmony_ci                                    if (!isTraceOption(arg6)) {
294c29fa5a6Sopenharmony_ci                                        std::cout << "invalid option, the 6th position parameter must be --trace"
295c29fa5a6Sopenharmony_ci                                            << std::endl;
296c29fa5a6Sopenharmony_ci                                        return RET_ERR;
297c29fa5a6Sopenharmony_ci                                    }
298c29fa5a6Sopenharmony_ci                                    optind++;
299c29fa5a6Sopenharmony_ci                                    foundTraceOption = true;
300c29fa5a6Sopenharmony_ci                                }
301c29fa5a6Sopenharmony_ci                                static const int64_t minTotalTimeMs = 1;
302c29fa5a6Sopenharmony_ci                                static const int64_t maxTotalTimeMs = 15000;
303c29fa5a6Sopenharmony_ci                                if ((totalTimeMs < minTotalTimeMs) || (totalTimeMs > maxTotalTimeMs)) {
304c29fa5a6Sopenharmony_ci                                    std::cout << "total time is out of range:"
305c29fa5a6Sopenharmony_ci                                        << minTotalTimeMs << " <= " << totalTimeMs << " <= " << maxTotalTimeMs
306c29fa5a6Sopenharmony_ci                                        << std::endl;
307c29fa5a6Sopenharmony_ci                                    return RET_ERR;
308c29fa5a6Sopenharmony_ci                                }
309c29fa5a6Sopenharmony_ci                                std::cout << "start coordinate: (" << px1 << ", " << py1 << ")" << std::endl;
310c29fa5a6Sopenharmony_ci                                std::cout << "  end coordinate: (" << px2 << ", " << py2 << ")" << std::endl;
311c29fa5a6Sopenharmony_ci                                std::cout << "     total times: "  << totalTimeMs << " ms"      << std::endl;
312c29fa5a6Sopenharmony_ci                                std::cout << "      trace mode: " << std::boolalpha << foundTraceOption << std::endl;
313c29fa5a6Sopenharmony_ci                                auto pointerEvent = PointerEvent::Create();
314c29fa5a6Sopenharmony_ci                                CHKPR(pointerEvent, ERROR_NULL_POINTER);
315c29fa5a6Sopenharmony_ci                                px = px1;
316c29fa5a6Sopenharmony_ci                                py = py1;
317c29fa5a6Sopenharmony_ci                                PointerEvent::PointerItem item;
318c29fa5a6Sopenharmony_ci                                item.SetPointerId(0);
319c29fa5a6Sopenharmony_ci                                item.SetDisplayX(px);
320c29fa5a6Sopenharmony_ci                                item.SetDisplayY(py);
321c29fa5a6Sopenharmony_ci                                pointerEvent->SetPointerId(0);
322c29fa5a6Sopenharmony_ci                                pointerEvent->AddPointerItem(item);
323c29fa5a6Sopenharmony_ci                                pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE);
324c29fa5a6Sopenharmony_ci                                pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
325c29fa5a6Sopenharmony_ci                                InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
326c29fa5a6Sopenharmony_ci
327c29fa5a6Sopenharmony_ci                                int64_t startTimeUs = GetSysClockTime();
328c29fa5a6Sopenharmony_ci                                int64_t startTimeMs = startTimeUs / TIME_TRANSITION;
329c29fa5a6Sopenharmony_ci                                int64_t endTimeMs = 0;
330c29fa5a6Sopenharmony_ci                                if (!AddInt64(startTimeMs, totalTimeMs, endTimeMs)) {
331c29fa5a6Sopenharmony_ci                                    std::cout << "system time error" << std::endl;
332c29fa5a6Sopenharmony_ci                                    return RET_ERR;
333c29fa5a6Sopenharmony_ci                                }
334c29fa5a6Sopenharmony_ci                                int64_t currentTimeMs = startTimeMs;
335c29fa5a6Sopenharmony_ci                                while (currentTimeMs < endTimeMs) {
336c29fa5a6Sopenharmony_ci                                    item.SetDisplayX(NextPos(startTimeMs, currentTimeMs, totalTimeMs, px1, px2));
337c29fa5a6Sopenharmony_ci                                    item.SetDisplayY(NextPos(startTimeMs, currentTimeMs, totalTimeMs, py1, py2));
338c29fa5a6Sopenharmony_ci                                    pointerEvent->SetActionTime(currentTimeMs * TIME_TRANSITION);
339c29fa5a6Sopenharmony_ci                                    pointerEvent->UpdatePointerItem(0, item);
340c29fa5a6Sopenharmony_ci                                    pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE);
341c29fa5a6Sopenharmony_ci                                    InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
342c29fa5a6Sopenharmony_ci                                    SleepAndUpdateTime(currentTimeMs);
343c29fa5a6Sopenharmony_ci                                }
344c29fa5a6Sopenharmony_ci
345c29fa5a6Sopenharmony_ci                                px = px2;
346c29fa5a6Sopenharmony_ci                                py = py2;
347c29fa5a6Sopenharmony_ci                                item.SetDisplayX(px);
348c29fa5a6Sopenharmony_ci                                item.SetDisplayY(py);
349c29fa5a6Sopenharmony_ci                                pointerEvent->SetActionTime(endTimeMs * TIME_TRANSITION);
350c29fa5a6Sopenharmony_ci                                pointerEvent->UpdatePointerItem(0, item);
351c29fa5a6Sopenharmony_ci                                pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE);
352c29fa5a6Sopenharmony_ci                                InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
353c29fa5a6Sopenharmony_ci                            }
354c29fa5a6Sopenharmony_ci                            break;
355c29fa5a6Sopenharmony_ci                        }
356c29fa5a6Sopenharmony_ci                        case 'd': {
357c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, buttonId)) {
358c29fa5a6Sopenharmony_ci                                std::cout << "invalid button press command" << std::endl;
359c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
360c29fa5a6Sopenharmony_ci                            }
361c29fa5a6Sopenharmony_ci                            if (buttonId > MOUSE_ID) {
362c29fa5a6Sopenharmony_ci                                std::cout << "invalid button press command" << std::endl;
363c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
364c29fa5a6Sopenharmony_ci                            }
365c29fa5a6Sopenharmony_ci                            std::cout << "press down" << buttonId << std::endl;
366c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
367c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
368c29fa5a6Sopenharmony_ci                            PointerEvent::PointerItem item;
369c29fa5a6Sopenharmony_ci                            item.SetPointerId(0);
370c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px);
371c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py);
372c29fa5a6Sopenharmony_ci                            item.SetPressed(true);
373c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(0);
374c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
375c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonId(buttonId);
376c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(buttonId);
377c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_DOWN);
378c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
379c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
380c29fa5a6Sopenharmony_ci                            break;
381c29fa5a6Sopenharmony_ci                        }
382c29fa5a6Sopenharmony_ci                        case 'u': {
383c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, buttonId)) {
384c29fa5a6Sopenharmony_ci                                std::cout << "invalid raise button command" << std::endl;
385c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
386c29fa5a6Sopenharmony_ci                            }
387c29fa5a6Sopenharmony_ci                            if (buttonId > MOUSE_ID) {
388c29fa5a6Sopenharmony_ci                                std::cout << "invalid raise button command" << std::endl;
389c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
390c29fa5a6Sopenharmony_ci                            }
391c29fa5a6Sopenharmony_ci                            std::cout << "lift up button " << buttonId << std::endl;
392c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
393c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
394c29fa5a6Sopenharmony_ci                            PointerEvent::PointerItem item;
395c29fa5a6Sopenharmony_ci                            item.SetPointerId(0);
396c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px);
397c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py);
398c29fa5a6Sopenharmony_ci                            item.SetPressed(false);
399c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(0);
400c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
401c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(buttonId);
402c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonId(buttonId);
403c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_UP);
404c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
405c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
406c29fa5a6Sopenharmony_ci                            break;
407c29fa5a6Sopenharmony_ci                        }
408c29fa5a6Sopenharmony_ci                        case 's': {
409c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, scrollValue)) {
410c29fa5a6Sopenharmony_ci                                std::cout << "invalid scroll button command" << std::endl;
411c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
412c29fa5a6Sopenharmony_ci                            }
413c29fa5a6Sopenharmony_ci                            std::cout << "scroll wheel " << scrollValue << std::endl;
414c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
415c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
416c29fa5a6Sopenharmony_ci                            PointerEvent::PointerItem item;
417c29fa5a6Sopenharmony_ci                            item.SetPointerId(0);
418c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px);
419c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py);
420c29fa5a6Sopenharmony_ci                            item.SetPressed(false);
421c29fa5a6Sopenharmony_ci                            int64_t time = pointerEvent->GetActionStartTime();
422c29fa5a6Sopenharmony_ci                            pointerEvent->SetActionTime(time + ACTION_TIME);
423c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(0);
424c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
425c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(buttonId);
426c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_AXIS_BEGIN);
427c29fa5a6Sopenharmony_ci                            pointerEvent->SetAxisValue(PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL,
428c29fa5a6Sopenharmony_ci                                scrollValue);
429c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
430c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
431c29fa5a6Sopenharmony_ci
432c29fa5a6Sopenharmony_ci                            time = pointerEvent->GetActionStartTime();
433c29fa5a6Sopenharmony_ci                            pointerEvent->SetActionTime(time + ACTION_TIME);
434c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(0);
435c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
436c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(buttonId);
437c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_AXIS_UPDATE);
438c29fa5a6Sopenharmony_ci                            pointerEvent->SetAxisValue(PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL,
439c29fa5a6Sopenharmony_ci                                scrollValue);
440c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
441c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
442c29fa5a6Sopenharmony_ci
443c29fa5a6Sopenharmony_ci                            time = pointerEvent->GetActionStartTime();
444c29fa5a6Sopenharmony_ci                            pointerEvent->SetActionTime(time + ACTION_TIME);
445c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(0);
446c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
447c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(buttonId);
448c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_AXIS_END);
449c29fa5a6Sopenharmony_ci                            pointerEvent->SetAxisValue(PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL,
450c29fa5a6Sopenharmony_ci                                scrollValue);
451c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
452c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
453c29fa5a6Sopenharmony_ci                            break;
454c29fa5a6Sopenharmony_ci                        }
455c29fa5a6Sopenharmony_ci                        case 'c': {
456c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, buttonId)) {
457c29fa5a6Sopenharmony_ci                                std::cout << "invalid click button command" << std::endl;
458c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
459c29fa5a6Sopenharmony_ci                            }
460c29fa5a6Sopenharmony_ci                            if (buttonId > MOUSE_ID) {
461c29fa5a6Sopenharmony_ci                                std::cout << "invalid button press command" << std::endl;
462c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
463c29fa5a6Sopenharmony_ci                            }
464c29fa5a6Sopenharmony_ci                            std::cout << "click   " << buttonId << std::endl;
465c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
466c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
467c29fa5a6Sopenharmony_ci                            PointerEvent::PointerItem item;
468c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py);
469c29fa5a6Sopenharmony_ci                            item.SetPressed(true);
470c29fa5a6Sopenharmony_ci                            item.SetPointerId(0);
471c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px);
472c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
473c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
474c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_DOWN);
475c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonId(buttonId);
476c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(buttonId);
477c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(0);
478c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
479c29fa5a6Sopenharmony_ci                            item.SetPointerId(0);
480c29fa5a6Sopenharmony_ci                            item.SetPressed(false);
481c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px);
482c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py);
483c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(0);
484c29fa5a6Sopenharmony_ci                            pointerEvent->UpdatePointerItem(0, item);
485c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(buttonId);
486c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonId(buttonId);
487c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_UP);
488c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
489c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
490c29fa5a6Sopenharmony_ci                            break;
491c29fa5a6Sopenharmony_ci                        }
492c29fa5a6Sopenharmony_ci                        case 'b': {
493c29fa5a6Sopenharmony_ci                            int32_t pressTimeMs = 50;
494c29fa5a6Sopenharmony_ci                            int32_t clickIntervalTimeMs = 300;
495c29fa5a6Sopenharmony_ci                            static constexpr int32_t minButtonId = 0;
496c29fa5a6Sopenharmony_ci                            static constexpr int32_t maxButtonId = 7;
497c29fa5a6Sopenharmony_ci                            static constexpr int32_t minPressTimeMs = 1;
498c29fa5a6Sopenharmony_ci                            static constexpr int32_t maxPressTimeMs = 300;
499c29fa5a6Sopenharmony_ci                            static constexpr int32_t minClickIntervalTimeMs = 1;
500c29fa5a6Sopenharmony_ci                            static constexpr int32_t maxClickIntervalTimeMs = 450;
501c29fa5a6Sopenharmony_ci                            if (argc < 6 || argc > 8) {
502c29fa5a6Sopenharmony_ci                                std::cout << "wrong number of parameters" << std::endl;
503c29fa5a6Sopenharmony_ci                                return RET_ERR;
504c29fa5a6Sopenharmony_ci                            }
505c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, px) ||
506c29fa5a6Sopenharmony_ci                                !StrToInt(argv[optind], py)) {
507c29fa5a6Sopenharmony_ci                                std::cout << "invalid coordinate value" << std::endl;
508c29fa5a6Sopenharmony_ci                                return RET_ERR;
509c29fa5a6Sopenharmony_ci                            }
510c29fa5a6Sopenharmony_ci                            if ((px < 0) || (py < 0)) {
511c29fa5a6Sopenharmony_ci                                std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
512c29fa5a6Sopenharmony_ci                                return RET_ERR;
513c29fa5a6Sopenharmony_ci                            }
514c29fa5a6Sopenharmony_ci                            if (!StrToInt(argv[optind + 1], buttonId)) {
515c29fa5a6Sopenharmony_ci                                std::cout << "invalid key" << std::endl;
516c29fa5a6Sopenharmony_ci                                return RET_ERR;
517c29fa5a6Sopenharmony_ci                            }
518c29fa5a6Sopenharmony_ci                            if (argc >= 7) {
519c29fa5a6Sopenharmony_ci                                if (!StrToInt(argv[optind + 2], pressTimeMs)) {
520c29fa5a6Sopenharmony_ci                                    std::cout << "invalid press time" << std::endl;
521c29fa5a6Sopenharmony_ci                                    return RET_ERR;
522c29fa5a6Sopenharmony_ci                                }
523c29fa5a6Sopenharmony_ci                            }
524c29fa5a6Sopenharmony_ci                            if (argc == BUTTON_PARAM_SIZE) {
525c29fa5a6Sopenharmony_ci                                if (!StrToInt(argv[optind + 3], clickIntervalTimeMs)) {
526c29fa5a6Sopenharmony_ci                                    std::cout << "invalid interval between hits" << std::endl;
527c29fa5a6Sopenharmony_ci                                    return RET_ERR;
528c29fa5a6Sopenharmony_ci                                }
529c29fa5a6Sopenharmony_ci                            }
530c29fa5a6Sopenharmony_ci                            if ((buttonId < minButtonId) || (buttonId > maxButtonId)) {
531c29fa5a6Sopenharmony_ci                                std::cout << "button is out of range:" << minButtonId << " < " << buttonId << " < "
532c29fa5a6Sopenharmony_ci                                    << maxButtonId << std::endl;
533c29fa5a6Sopenharmony_ci                                return RET_ERR;
534c29fa5a6Sopenharmony_ci                            }
535c29fa5a6Sopenharmony_ci                            if ((pressTimeMs < minPressTimeMs) || (pressTimeMs > maxPressTimeMs)) {
536c29fa5a6Sopenharmony_ci                                std::cout << "press time is out of range:" << minPressTimeMs << " ms" << " < "
537c29fa5a6Sopenharmony_ci                                    << pressTimeMs << " < " << maxPressTimeMs << " ms" << std::endl;
538c29fa5a6Sopenharmony_ci                                return RET_ERR;
539c29fa5a6Sopenharmony_ci                            }
540c29fa5a6Sopenharmony_ci                            if ((clickIntervalTimeMs < minClickIntervalTimeMs) ||
541c29fa5a6Sopenharmony_ci                                (clickIntervalTimeMs > maxClickIntervalTimeMs)) {
542c29fa5a6Sopenharmony_ci                                std::cout << "click interval time is out of range:" << minClickIntervalTimeMs << " ms"
543c29fa5a6Sopenharmony_ci                                    " < " << clickIntervalTimeMs << " < " << maxClickIntervalTimeMs << " ms"
544c29fa5a6Sopenharmony_ci                                    << std::endl;
545c29fa5a6Sopenharmony_ci                                return RET_ERR;
546c29fa5a6Sopenharmony_ci                            }
547c29fa5a6Sopenharmony_ci                            std::cout << "   coordinate: ("<< px << ", "  << py << ")" << std::endl;
548c29fa5a6Sopenharmony_ci                            std::cout << "    button id: " << buttonId    << std::endl;
549c29fa5a6Sopenharmony_ci                            std::cout << "   press time: " << pressTimeMs << " ms" << std::endl;
550c29fa5a6Sopenharmony_ci                            std::cout << "interval time: " << clickIntervalTimeMs  << " ms" << std::endl;
551c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
552c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
553c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
554c29fa5a6Sopenharmony_ci                            PointerEvent::PointerItem item;
555c29fa5a6Sopenharmony_ci                            item.SetPressed(true);
556c29fa5a6Sopenharmony_ci                            item.SetPointerId(0);
557c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px);
558c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py);
559c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(0);
560c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonId(buttonId);
561c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(buttonId);
562c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_DOWN);
563c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
564c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
565c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(pressTimeMs));
566c29fa5a6Sopenharmony_ci                            item.SetPressed(false);
567c29fa5a6Sopenharmony_ci                            pointerEvent->UpdatePointerItem(0, item);
568c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_UP);
569c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
570c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(clickIntervalTimeMs));
571c29fa5a6Sopenharmony_ci
572c29fa5a6Sopenharmony_ci                            item.SetPressed(true);
573c29fa5a6Sopenharmony_ci                            pointerEvent->UpdatePointerItem(0, item);
574c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_DOWN);
575c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
576c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(pressTimeMs));
577c29fa5a6Sopenharmony_ci                            item.SetPressed(false);
578c29fa5a6Sopenharmony_ci                            pointerEvent->UpdatePointerItem(0, item);
579c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_UP);
580c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
581c29fa5a6Sopenharmony_ci                            break;
582c29fa5a6Sopenharmony_ci                        }
583c29fa5a6Sopenharmony_ci                        case 'g': {
584c29fa5a6Sopenharmony_ci                            int32_t px1 = 0;
585c29fa5a6Sopenharmony_ci                            int32_t py1 = 0;
586c29fa5a6Sopenharmony_ci                            int32_t px2 = 0;
587c29fa5a6Sopenharmony_ci                            int32_t py2 = 0;
588c29fa5a6Sopenharmony_ci                            int32_t buttonsId = 0;
589c29fa5a6Sopenharmony_ci                            int32_t totalTimeMs = 1000;
590c29fa5a6Sopenharmony_ci                            if (argc < 7) {
591c29fa5a6Sopenharmony_ci                                std::cout << "argc:" << argc << std::endl;
592c29fa5a6Sopenharmony_ci                                std::cout << "Wrong number of parameters" << std::endl;
593c29fa5a6Sopenharmony_ci                                return RET_ERR;
594c29fa5a6Sopenharmony_ci                            }
595c29fa5a6Sopenharmony_ci                            if (argc >= 7) {
596c29fa5a6Sopenharmony_ci                                if ((!StrToInt(optarg, px1)) ||
597c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind], py1)) ||
598c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind + 1], px2)) ||
599c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind + 2], py2))) {
600c29fa5a6Sopenharmony_ci                                        std::cout << "Invalid coordinate value" << std::endl;
601c29fa5a6Sopenharmony_ci                                        return RET_ERR;
602c29fa5a6Sopenharmony_ci                                }
603c29fa5a6Sopenharmony_ci                            }
604c29fa5a6Sopenharmony_ci                            if ((px1 < 0) || (py1 < 0) || (px2 < 0) || (py2 < 0)) {
605c29fa5a6Sopenharmony_ci                                std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
606c29fa5a6Sopenharmony_ci                                return RET_ERR;
607c29fa5a6Sopenharmony_ci                            }
608c29fa5a6Sopenharmony_ci                            if (argc >= 8) {
609c29fa5a6Sopenharmony_ci                                if (!StrToInt(argv[optind + 3], totalTimeMs)) {
610c29fa5a6Sopenharmony_ci                                    std::cout << "Invalid total times" << std::endl;
611c29fa5a6Sopenharmony_ci                                    return RET_ERR;
612c29fa5a6Sopenharmony_ci                                }
613c29fa5a6Sopenharmony_ci                            }
614c29fa5a6Sopenharmony_ci                            static const int64_t minTotalTimeMs = 1;
615c29fa5a6Sopenharmony_ci                            static const int64_t maxTotalTimeMs = 15000;
616c29fa5a6Sopenharmony_ci                            if ((totalTimeMs < minTotalTimeMs) || (totalTimeMs > maxTotalTimeMs)) {
617c29fa5a6Sopenharmony_ci                                std::cout << "Total time is out of range:"
618c29fa5a6Sopenharmony_ci                                    << minTotalTimeMs << "ms" << " <= " << totalTimeMs << "ms" << " <= "
619c29fa5a6Sopenharmony_ci                                    << maxTotalTimeMs << "ms" << std::endl;
620c29fa5a6Sopenharmony_ci                                return RET_ERR;
621c29fa5a6Sopenharmony_ci                            }
622c29fa5a6Sopenharmony_ci                            std::cout << "start coordinate: (" << px1 << ", "  << py1 << ")" << std::endl;
623c29fa5a6Sopenharmony_ci                            std::cout << "  end coordinate: (" << px2 << ", "  << py2 << ")" << std::endl;
624c29fa5a6Sopenharmony_ci                            std::cout << "      total time: "  << totalTimeMs  << "ms"       << std::endl;
625c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
626c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
627c29fa5a6Sopenharmony_ci                            PointerEvent::PointerItem item;
628c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py1);
629c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px1);
630c29fa5a6Sopenharmony_ci                            item.SetPressed(false);
631c29fa5a6Sopenharmony_ci                            item.SetPointerId(0);
632c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(0);
633c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
634c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonId(buttonsId);
635c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(buttonsId);
636c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(0);
637c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
638c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_DOWN);
639c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
640c29fa5a6Sopenharmony_ci
641c29fa5a6Sopenharmony_ci                            int64_t startTimeMs = GetSysClockTime() / TIME_TRANSITION;
642c29fa5a6Sopenharmony_ci                            int64_t endTimeMs = 0;
643c29fa5a6Sopenharmony_ci                            if (!AddInt64(startTimeMs, totalTimeMs, endTimeMs)) {
644c29fa5a6Sopenharmony_ci                                std::cout << "System time error" << std::endl;
645c29fa5a6Sopenharmony_ci                                return RET_ERR;
646c29fa5a6Sopenharmony_ci                            }
647c29fa5a6Sopenharmony_ci                            int64_t currentTimeMs = startTimeMs;
648c29fa5a6Sopenharmony_ci                            while (currentTimeMs < endTimeMs) {
649c29fa5a6Sopenharmony_ci                                item.SetDisplayX(NextPos(startTimeMs, currentTimeMs, totalTimeMs, px1, px2));
650c29fa5a6Sopenharmony_ci                                item.SetDisplayY(NextPos(startTimeMs, currentTimeMs, totalTimeMs, py1, py2));
651c29fa5a6Sopenharmony_ci                                pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE);
652c29fa5a6Sopenharmony_ci                                pointerEvent->UpdatePointerItem(0, item);
653c29fa5a6Sopenharmony_ci                                pointerEvent->SetActionTime(currentTimeMs * TIME_TRANSITION);
654c29fa5a6Sopenharmony_ci                                InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
655c29fa5a6Sopenharmony_ci                                SleepAndUpdateTime(currentTimeMs);
656c29fa5a6Sopenharmony_ci                            }
657c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py2);
658c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px2);
659c29fa5a6Sopenharmony_ci                            pointerEvent->UpdatePointerItem(0, item);
660c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE);
661c29fa5a6Sopenharmony_ci                            pointerEvent->SetActionTime(endTimeMs * TIME_TRANSITION);
662c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
663c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(BLOCK_TIME_MS));
664c29fa5a6Sopenharmony_ci
665c29fa5a6Sopenharmony_ci                            item.SetPressed(true);
666c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py2);
667c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px2);
668c29fa5a6Sopenharmony_ci                            pointerEvent->UpdatePointerItem(0, item);
669c29fa5a6Sopenharmony_ci                            pointerEvent->SetActionTime(endTimeMs * TIME_TRANSITION);
670c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_UP);
671c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
672c29fa5a6Sopenharmony_ci                            break;
673c29fa5a6Sopenharmony_ci                        }
674c29fa5a6Sopenharmony_ci                        case 'i': {
675c29fa5a6Sopenharmony_ci                            int32_t tookTime = 0;
676c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, tookTime)) {
677c29fa5a6Sopenharmony_ci                                std::cout << "invalid command to interval time" << std::endl;
678c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
679c29fa5a6Sopenharmony_ci                            }
680c29fa5a6Sopenharmony_ci                            const int64_t minTaktTimeMs = 1;
681c29fa5a6Sopenharmony_ci                            const int64_t maxTaktTimeMs = 15000;
682c29fa5a6Sopenharmony_ci                            if ((minTaktTimeMs > tookTime) || (maxTaktTimeMs < tookTime)) {
683c29fa5a6Sopenharmony_ci                                std::cout << "tookTime is out of range" << std::endl;
684c29fa5a6Sopenharmony_ci                                std::cout << minTaktTimeMs << " < tookTime < " << maxTaktTimeMs;
685c29fa5a6Sopenharmony_ci                                std::cout << std::endl;
686c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
687c29fa5a6Sopenharmony_ci                            }
688c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(tookTime));
689c29fa5a6Sopenharmony_ci                            break;
690c29fa5a6Sopenharmony_ci                        }
691c29fa5a6Sopenharmony_ci                        default: {
692c29fa5a6Sopenharmony_ci                            std::cout << "invalid command to virtual mouse" << std::endl;
693c29fa5a6Sopenharmony_ci                            ShowUsage();
694c29fa5a6Sopenharmony_ci                            return EVENT_REG_FAIL;
695c29fa5a6Sopenharmony_ci                        }
696c29fa5a6Sopenharmony_ci                    }
697c29fa5a6Sopenharmony_ci                    std::this_thread::sleep_for(std::chrono::milliseconds(SLEEPTIME));
698c29fa5a6Sopenharmony_ci                }
699c29fa5a6Sopenharmony_ci                break;
700c29fa5a6Sopenharmony_ci            }
701c29fa5a6Sopenharmony_ci            case 'K': {
702c29fa5a6Sopenharmony_ci                std::vector<int32_t> downKey;
703c29fa5a6Sopenharmony_ci                int32_t keyCode = 0;
704c29fa5a6Sopenharmony_ci                int32_t isCombinationKey = 0;
705c29fa5a6Sopenharmony_ci                int64_t time = GetSysClockTime();
706c29fa5a6Sopenharmony_ci                int32_t count = 0;
707c29fa5a6Sopenharmony_ci                bool inputText = false;
708c29fa5a6Sopenharmony_ci                while ((c = getopt_long(argc, argv, "d:u:l:r:i:t:", keyboardSensorOptions, &optionIndex)) != -1) {
709c29fa5a6Sopenharmony_ci                    // Prompt when combining other commands after using the text command. Ex: "uinput -d 2017 -t text"
710c29fa5a6Sopenharmony_ci                    if (inputText) {
711c29fa5a6Sopenharmony_ci                        std::cout << "The text command cannot be used with other commands." << std::endl;
712c29fa5a6Sopenharmony_ci                        return RET_ERR;
713c29fa5a6Sopenharmony_ci                    }
714c29fa5a6Sopenharmony_ci                    switch (c) {
715c29fa5a6Sopenharmony_ci                        case 'd': {
716c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, keyCode)) {
717c29fa5a6Sopenharmony_ci                                std::cout << "invalid command to down key" << std::endl;
718c29fa5a6Sopenharmony_ci                            }
719c29fa5a6Sopenharmony_ci                            if (optind == isCombinationKey + TWO_MORE_COMMAND) {
720c29fa5a6Sopenharmony_ci                                downKey.push_back(keyCode);
721c29fa5a6Sopenharmony_ci                                isCombinationKey = optind;
722c29fa5a6Sopenharmony_ci                                auto KeyEvent = KeyEvent::Create();
723c29fa5a6Sopenharmony_ci                                CHKPR(KeyEvent, ERROR_NULL_POINTER);
724c29fa5a6Sopenharmony_ci                                if (downKey.size() > MAX_PRESSED_COUNT) {
725c29fa5a6Sopenharmony_ci                                    std::cout << "pressed button count should less than 30" << std::endl;
726c29fa5a6Sopenharmony_ci                                    return EVENT_REG_FAIL;
727c29fa5a6Sopenharmony_ci                                }
728c29fa5a6Sopenharmony_ci                                KeyEvent::KeyItem item[downKey.size()];
729c29fa5a6Sopenharmony_ci                                for (size_t i = 0; i < downKey.size(); i++) {
730c29fa5a6Sopenharmony_ci                                    KeyEvent->SetKeyCode(keyCode);
731c29fa5a6Sopenharmony_ci                                    KeyEvent->SetActionTime(time);
732c29fa5a6Sopenharmony_ci                                    KeyEvent->SetKeyAction(KeyEvent::KEY_ACTION_DOWN);
733c29fa5a6Sopenharmony_ci                                    item[i].SetKeyCode(downKey[i]);
734c29fa5a6Sopenharmony_ci                                    item[i].SetDownTime(time);
735c29fa5a6Sopenharmony_ci                                    item[i].SetPressed(true);
736c29fa5a6Sopenharmony_ci                                    KeyEvent->AddKeyItem(item[i]);
737c29fa5a6Sopenharmony_ci                                }
738c29fa5a6Sopenharmony_ci                                InputManager::GetInstance()->SimulateInputEvent(KeyEvent);
739c29fa5a6Sopenharmony_ci                                break;
740c29fa5a6Sopenharmony_ci                            }
741c29fa5a6Sopenharmony_ci                            downKey.push_back(keyCode);
742c29fa5a6Sopenharmony_ci                            auto KeyEvent = KeyEvent::Create();
743c29fa5a6Sopenharmony_ci                            CHKPR(KeyEvent, ERROR_NULL_POINTER);
744c29fa5a6Sopenharmony_ci                            KeyEvent->SetKeyCode(keyCode);
745c29fa5a6Sopenharmony_ci                            KeyEvent->SetActionTime(time);
746c29fa5a6Sopenharmony_ci                            KeyEvent->SetKeyAction(KeyEvent::KEY_ACTION_DOWN);
747c29fa5a6Sopenharmony_ci                            KeyEvent::KeyItem item1;
748c29fa5a6Sopenharmony_ci                            item1.SetPressed(true);
749c29fa5a6Sopenharmony_ci                            item1.SetKeyCode(keyCode);
750c29fa5a6Sopenharmony_ci                            item1.SetDownTime(time);
751c29fa5a6Sopenharmony_ci                            KeyEvent->AddKeyItem(item1);
752c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(KeyEvent);
753c29fa5a6Sopenharmony_ci                            isCombinationKey = optind;
754c29fa5a6Sopenharmony_ci                            break;
755c29fa5a6Sopenharmony_ci                        }
756c29fa5a6Sopenharmony_ci                        case 'u': {
757c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, keyCode)) {
758c29fa5a6Sopenharmony_ci                                std::cout << "invalid button press command" << std::endl;
759c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
760c29fa5a6Sopenharmony_ci                            }
761c29fa5a6Sopenharmony_ci                            std::vector<int32_t>::iterator iter = std::find(downKey.begin(), downKey.end(), keyCode);
762c29fa5a6Sopenharmony_ci                            if (iter != downKey.end()) {
763c29fa5a6Sopenharmony_ci                                std::cout << "you raised the key " << keyCode << std::endl;
764c29fa5a6Sopenharmony_ci                                auto KeyEvent = KeyEvent::Create();
765c29fa5a6Sopenharmony_ci                                CHKPR(KeyEvent, ERROR_NULL_POINTER);
766c29fa5a6Sopenharmony_ci                                KeyEvent->SetKeyCode(keyCode);
767c29fa5a6Sopenharmony_ci                                KeyEvent->SetActionTime(time);
768c29fa5a6Sopenharmony_ci                                KeyEvent->SetKeyAction(KeyEvent::KEY_ACTION_UP);
769c29fa5a6Sopenharmony_ci                                KeyEvent::KeyItem item1;
770c29fa5a6Sopenharmony_ci                                item1.SetPressed(false);
771c29fa5a6Sopenharmony_ci                                item1.SetKeyCode(keyCode);
772c29fa5a6Sopenharmony_ci                                item1.SetDownTime(time);
773c29fa5a6Sopenharmony_ci                                KeyEvent->AddKeyItem(item1);
774c29fa5a6Sopenharmony_ci                                InputManager::GetInstance()->SimulateInputEvent(KeyEvent);
775c29fa5a6Sopenharmony_ci                                iter = downKey.erase(iter);
776c29fa5a6Sopenharmony_ci                                break;
777c29fa5a6Sopenharmony_ci                            } else {
778c29fa5a6Sopenharmony_ci                                std::cout << "please press the " << keyCode << " key first "<< std::endl;
779c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
780c29fa5a6Sopenharmony_ci                            }
781c29fa5a6Sopenharmony_ci                        }
782c29fa5a6Sopenharmony_ci                        case 'l': {
783c29fa5a6Sopenharmony_ci                            if (argc < 4) {
784c29fa5a6Sopenharmony_ci                                std::cout << "argc:" << argc << std::endl;
785c29fa5a6Sopenharmony_ci                                std::cout << "wrong number of parameters" << std::endl;
786c29fa5a6Sopenharmony_ci                                return RET_ERR;
787c29fa5a6Sopenharmony_ci                            }
788c29fa5a6Sopenharmony_ci                            if (argc >= 4) {
789c29fa5a6Sopenharmony_ci                                if (!StrToInt(optarg, keyCode)) {
790c29fa5a6Sopenharmony_ci                                    std::cout << "invalid key code value" << std::endl;
791c29fa5a6Sopenharmony_ci                                    return RET_ERR;
792c29fa5a6Sopenharmony_ci                                }
793c29fa5a6Sopenharmony_ci                            }
794c29fa5a6Sopenharmony_ci                            int32_t pressTimeMs = 3000;
795c29fa5a6Sopenharmony_ci                            if (argc >= 5) {
796c29fa5a6Sopenharmony_ci                                if (!StrToInt(argv[optind], pressTimeMs)) {
797c29fa5a6Sopenharmony_ci                                    std::cout << "invalid key code value or press time" << std::endl;
798c29fa5a6Sopenharmony_ci                                    return RET_ERR;
799c29fa5a6Sopenharmony_ci                                }
800c29fa5a6Sopenharmony_ci                            }
801c29fa5a6Sopenharmony_ci                            static constexpr int32_t minKeyCode = 0;
802c29fa5a6Sopenharmony_ci                            static constexpr int32_t maxKeyCode = 5000;
803c29fa5a6Sopenharmony_ci                            if ((keyCode < minKeyCode) || (keyCode > maxKeyCode)) {
804c29fa5a6Sopenharmony_ci                                std::cout << "key code is out of range:" << minKeyCode << " <= "
805c29fa5a6Sopenharmony_ci                                    << keyCode << " <= " << maxKeyCode << std::endl;
806c29fa5a6Sopenharmony_ci                                return RET_ERR;
807c29fa5a6Sopenharmony_ci                            }
808c29fa5a6Sopenharmony_ci                            static constexpr int32_t minPressTimeMs = 3000;
809c29fa5a6Sopenharmony_ci                            static constexpr int32_t maxPressTimeMs = 15000;
810c29fa5a6Sopenharmony_ci                            if ((pressTimeMs < minPressTimeMs) || (pressTimeMs > maxPressTimeMs)) {
811c29fa5a6Sopenharmony_ci                                std::cout << "press time is out of range:" << minPressTimeMs << " ms" << " <= "
812c29fa5a6Sopenharmony_ci                                    << pressTimeMs << " <= " << maxPressTimeMs << " ms" << std::endl;
813c29fa5a6Sopenharmony_ci                                return RET_ERR;
814c29fa5a6Sopenharmony_ci                            }
815c29fa5a6Sopenharmony_ci                            std::cout << " key code: " << keyCode << std::endl
816c29fa5a6Sopenharmony_ci                                << "long press time: " << pressTimeMs << " ms" << std::endl;
817c29fa5a6Sopenharmony_ci                            auto keyEvent = KeyEvent::Create();
818c29fa5a6Sopenharmony_ci                            if (keyEvent == nullptr) {
819c29fa5a6Sopenharmony_ci                                std::cout << "failed to create input event object" << std::endl;
820c29fa5a6Sopenharmony_ci                                return RET_ERR;
821c29fa5a6Sopenharmony_ci                            }
822c29fa5a6Sopenharmony_ci                            keyEvent->SetKeyCode(keyCode);
823c29fa5a6Sopenharmony_ci                            keyEvent->SetKeyAction(KeyEvent::KEY_ACTION_DOWN);
824c29fa5a6Sopenharmony_ci                            KeyEvent::KeyItem item;
825c29fa5a6Sopenharmony_ci                            item.SetKeyCode(keyCode);
826c29fa5a6Sopenharmony_ci                            item.SetPressed(true);
827c29fa5a6Sopenharmony_ci                            auto keyEventTemp = KeyEvent::Clone(keyEvent);
828c29fa5a6Sopenharmony_ci                            if (keyEventTemp == nullptr) {
829c29fa5a6Sopenharmony_ci                                std::cout << "failed to clone key event object" << std::endl;
830c29fa5a6Sopenharmony_ci                                return RET_ERR;
831c29fa5a6Sopenharmony_ci                            }
832c29fa5a6Sopenharmony_ci                            keyEventTemp->AddKeyItem(item);
833c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(keyEventTemp);
834c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(pressTimeMs));
835c29fa5a6Sopenharmony_ci
836c29fa5a6Sopenharmony_ci                            keyEvent->SetKeyAction(KeyEvent::KEY_ACTION_UP);
837c29fa5a6Sopenharmony_ci                            item.SetPressed(false);
838c29fa5a6Sopenharmony_ci                            keyEvent->AddKeyItem(item);
839c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(keyEvent);
840c29fa5a6Sopenharmony_ci                            break;
841c29fa5a6Sopenharmony_ci                        }
842c29fa5a6Sopenharmony_ci                        case 'r': {
843c29fa5a6Sopenharmony_ci                            constexpr int32_t ARGC_MIN = 4;
844c29fa5a6Sopenharmony_ci                            if (argc < ARGC_MIN) {
845c29fa5a6Sopenharmony_ci                                std::cout << "argc:" << argc << std::endl;
846c29fa5a6Sopenharmony_ci                                std::cout << "wrong number of parameters" << std::endl;
847c29fa5a6Sopenharmony_ci                                return RET_ERR;
848c29fa5a6Sopenharmony_ci                            }
849c29fa5a6Sopenharmony_ci                            if (argc >= ARGC_MIN) {
850c29fa5a6Sopenharmony_ci                                if (!StrToInt(optarg, keyCode)) {
851c29fa5a6Sopenharmony_ci                                    std::cout << "invalid key code value" << std::endl;
852c29fa5a6Sopenharmony_ci                                    return RET_ERR;
853c29fa5a6Sopenharmony_ci                                }
854c29fa5a6Sopenharmony_ci                            }
855c29fa5a6Sopenharmony_ci                            int32_t pressTimeMs = 3000;
856c29fa5a6Sopenharmony_ci                            constexpr int32_t ARGC_MAX = 5;
857c29fa5a6Sopenharmony_ci                            if (argc >= ARGC_MAX) {
858c29fa5a6Sopenharmony_ci                                if (!StrToInt(argv[optind], pressTimeMs)) {
859c29fa5a6Sopenharmony_ci                                    std::cout << "invalid key code value or press time" << std::endl;
860c29fa5a6Sopenharmony_ci                                    return RET_ERR;
861c29fa5a6Sopenharmony_ci                                }
862c29fa5a6Sopenharmony_ci                            }
863c29fa5a6Sopenharmony_ci                            static constexpr int32_t minKeyCode = 0;
864c29fa5a6Sopenharmony_ci                            static constexpr int32_t maxKeyCode = 5000;
865c29fa5a6Sopenharmony_ci                            if ((keyCode < minKeyCode) || (keyCode > maxKeyCode)) {
866c29fa5a6Sopenharmony_ci                                std::cout << "key code is out of range:" << minKeyCode << " <= "
867c29fa5a6Sopenharmony_ci                                    << keyCode << " <= " << maxKeyCode << std::endl;
868c29fa5a6Sopenharmony_ci                                return RET_ERR;
869c29fa5a6Sopenharmony_ci                            }
870c29fa5a6Sopenharmony_ci                            static constexpr int32_t minPressTimeMs = 3000;
871c29fa5a6Sopenharmony_ci                            static constexpr int32_t maxPressTimeMs = 15000;
872c29fa5a6Sopenharmony_ci                            if ((pressTimeMs < minPressTimeMs) || (pressTimeMs > maxPressTimeMs)) {
873c29fa5a6Sopenharmony_ci                                std::cout << "press time is out of range:" << minPressTimeMs << " ms" << " <= "
874c29fa5a6Sopenharmony_ci                                    << pressTimeMs << " <= " << maxPressTimeMs << " ms" << std::endl;
875c29fa5a6Sopenharmony_ci                                return RET_ERR;
876c29fa5a6Sopenharmony_ci                            }
877c29fa5a6Sopenharmony_ci                            std::cout << " key code: " << keyCode << std::endl
878c29fa5a6Sopenharmony_ci                                << "long press time: " << pressTimeMs << " ms" << std::endl;
879c29fa5a6Sopenharmony_ci                            auto keyEvent = KeyEvent::Create();
880c29fa5a6Sopenharmony_ci                            if (keyEvent == nullptr) {
881c29fa5a6Sopenharmony_ci                                std::cout << "failed to create input event object" << std::endl;
882c29fa5a6Sopenharmony_ci                                return RET_ERR;
883c29fa5a6Sopenharmony_ci                            }
884c29fa5a6Sopenharmony_ci                            keyEvent->SetKeyCode(keyCode);
885c29fa5a6Sopenharmony_ci                            keyEvent->SetKeyAction(KeyEvent::KEY_ACTION_DOWN);
886c29fa5a6Sopenharmony_ci                            KeyEvent::KeyItem item;
887c29fa5a6Sopenharmony_ci                            item.SetKeyCode(keyCode);
888c29fa5a6Sopenharmony_ci                            int64_t time = GetSysClockTime();
889c29fa5a6Sopenharmony_ci                            item.SetPressed(true);
890c29fa5a6Sopenharmony_ci                            auto keyEventTemp = KeyEvent::Clone(keyEvent);
891c29fa5a6Sopenharmony_ci                            if (keyEventTemp == nullptr) {
892c29fa5a6Sopenharmony_ci                                std::cout << "failed to clone key event object" << std::endl;
893c29fa5a6Sopenharmony_ci                                return RET_ERR;
894c29fa5a6Sopenharmony_ci                            }
895c29fa5a6Sopenharmony_ci                            keyEventTemp->SetActionTime(time);
896c29fa5a6Sopenharmony_ci                            keyEventTemp->AddKeyItem(item);
897c29fa5a6Sopenharmony_ci                            keyEventTemp->SetRepeat(true);
898c29fa5a6Sopenharmony_ci                            std::string isRepeat = keyEventTemp->IsRepeat() ? "true" : "false";
899c29fa5a6Sopenharmony_ci                            if (!EventLogHelper::IsBetaVersion()) {
900c29fa5a6Sopenharmony_ci                                MMI_HILOGI("KeyAction:%{public}s, IsRepeat:%{public}s",
901c29fa5a6Sopenharmony_ci                                    KeyEvent::ActionToString(keyEventTemp->GetKeyAction()), isRepeat.c_str());
902c29fa5a6Sopenharmony_ci                            } else {
903c29fa5a6Sopenharmony_ci                                MMI_HILOGI("KeyCode:%{private}d, ActionTime:%{public}" PRId64
904c29fa5a6Sopenharmony_ci                                    ",KeyAction:%{public}s, IsRepeat:%{public}s",
905c29fa5a6Sopenharmony_ci                                    keyEventTemp->GetKeyCode(), keyEventTemp->GetActionTime(),
906c29fa5a6Sopenharmony_ci                                    KeyEvent::ActionToString(keyEventTemp->GetKeyAction()), isRepeat.c_str());
907c29fa5a6Sopenharmony_ci                            }
908c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(keyEventTemp);
909c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(pressTimeMs));
910c29fa5a6Sopenharmony_ci
911c29fa5a6Sopenharmony_ci                            keyEvent->SetKeyAction(KeyEvent::KEY_ACTION_UP);
912c29fa5a6Sopenharmony_ci                            item.SetPressed(false);
913c29fa5a6Sopenharmony_ci                            keyEvent->AddKeyItem(item);
914c29fa5a6Sopenharmony_ci                            time = GetSysClockTime();
915c29fa5a6Sopenharmony_ci                            keyEvent->SetActionTime(time);
916c29fa5a6Sopenharmony_ci                            keyEvent->SetRepeat(true);
917c29fa5a6Sopenharmony_ci                            isRepeat = keyEvent->IsRepeat() ? "true" : "false";
918c29fa5a6Sopenharmony_ci                            if (!OHOS::MMI::EventLogHelper::IsBetaVersion()) {
919c29fa5a6Sopenharmony_ci                                MMI_HILOGI("KeyAction:%{public}s, IsRepeat:%{public}s",
920c29fa5a6Sopenharmony_ci                                    KeyEvent::ActionToString(keyEvent->GetKeyAction()), isRepeat.c_str());
921c29fa5a6Sopenharmony_ci                            } else {
922c29fa5a6Sopenharmony_ci                                MMI_HILOGI("KeyCode:%{private}d, ActionTime:%{public}" PRId64
923c29fa5a6Sopenharmony_ci                                    ",KeyAction:%{public}s, IsRepeat:%{public}s",
924c29fa5a6Sopenharmony_ci                                    keyEvent->GetKeyCode(), keyEvent->GetActionTime(),
925c29fa5a6Sopenharmony_ci                                    KeyEvent::ActionToString(keyEvent->GetKeyAction()), isRepeat.c_str());
926c29fa5a6Sopenharmony_ci                            }
927c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(keyEvent);
928c29fa5a6Sopenharmony_ci                            break;
929c29fa5a6Sopenharmony_ci                        }
930c29fa5a6Sopenharmony_ci                        case 'i': {
931c29fa5a6Sopenharmony_ci                            int32_t taktTime = 0;
932c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, taktTime)) {
933c29fa5a6Sopenharmony_ci                                std::cout << "invalid command to interval time" << std::endl;
934c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
935c29fa5a6Sopenharmony_ci                            }
936c29fa5a6Sopenharmony_ci                            const int64_t minTaktTimeMs = 1;
937c29fa5a6Sopenharmony_ci                            const int64_t maxTaktTimeMs = 15000;
938c29fa5a6Sopenharmony_ci                            if ((minTaktTimeMs > taktTime) || (maxTaktTimeMs < taktTime)) {
939c29fa5a6Sopenharmony_ci                                std::cout << "taktTime is error" << std::endl;
940c29fa5a6Sopenharmony_ci                                std::cout << minTaktTimeMs << " < taktTime < " << maxTaktTimeMs;
941c29fa5a6Sopenharmony_ci                                std::cout << std::endl;
942c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
943c29fa5a6Sopenharmony_ci                            }
944c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(taktTime));
945c29fa5a6Sopenharmony_ci                            break;
946c29fa5a6Sopenharmony_ci                        }
947c29fa5a6Sopenharmony_ci                        case 't': {
948c29fa5a6Sopenharmony_ci                            int32_t ret = ProcessKeyboardTextInput(optarg, count);
949c29fa5a6Sopenharmony_ci                            if (ret != ERR_OK) {
950c29fa5a6Sopenharmony_ci                                return ret;
951c29fa5a6Sopenharmony_ci                            }
952c29fa5a6Sopenharmony_ci                            inputText = true;
953c29fa5a6Sopenharmony_ci                            break;
954c29fa5a6Sopenharmony_ci                        }
955c29fa5a6Sopenharmony_ci                        default: {
956c29fa5a6Sopenharmony_ci                            std::cout << "invalid command to keyboard key" << std::endl;
957c29fa5a6Sopenharmony_ci                            ShowUsage();
958c29fa5a6Sopenharmony_ci                            return EVENT_REG_FAIL;
959c29fa5a6Sopenharmony_ci                        }
960c29fa5a6Sopenharmony_ci                    }
961c29fa5a6Sopenharmony_ci                    std::this_thread::sleep_for(std::chrono::milliseconds(SLEEPTIME));
962c29fa5a6Sopenharmony_ci                    count++;
963c29fa5a6Sopenharmony_ci                }
964c29fa5a6Sopenharmony_ci                for (size_t i = 0; i < downKey.size(); i++) {
965c29fa5a6Sopenharmony_ci                    std::cout << "you have a key " << downKey[i] << " not release" << std::endl;
966c29fa5a6Sopenharmony_ci                }
967c29fa5a6Sopenharmony_ci                break;
968c29fa5a6Sopenharmony_ci            }
969c29fa5a6Sopenharmony_ci            case 'S':
970c29fa5a6Sopenharmony_ci            case 'T': {
971c29fa5a6Sopenharmony_ci                int32_t px1 = 0;
972c29fa5a6Sopenharmony_ci                int32_t py1 = 0;
973c29fa5a6Sopenharmony_ci                int32_t px2 = 0;
974c29fa5a6Sopenharmony_ci                int32_t py2 = 0;
975c29fa5a6Sopenharmony_ci                int32_t totalTimeMs = 0;
976c29fa5a6Sopenharmony_ci                int32_t moveArgcSeven = 7;
977c29fa5a6Sopenharmony_ci                int32_t firstOpt = c;
978c29fa5a6Sopenharmony_ci                while ((c = getopt_long(argc, argv, "m:d:u:c:i:g:k", touchSensorOptions, &optionIndex)) != -1) {
979c29fa5a6Sopenharmony_ci                    switch (c) {
980c29fa5a6Sopenharmony_ci                        case 'm': {
981c29fa5a6Sopenharmony_ci                            if (argc < moveArgcSeven || argc > MAX_ARGC) {
982c29fa5a6Sopenharmony_ci                                std::cout << "wrong number of parameters:" << argc << std::endl;
983c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
984c29fa5a6Sopenharmony_ci                            }
985c29fa5a6Sopenharmony_ci                            struct FingerInfo {
986c29fa5a6Sopenharmony_ci                                int32_t startX = 0;
987c29fa5a6Sopenharmony_ci                                int32_t startY = 0;
988c29fa5a6Sopenharmony_ci                                int32_t endX = 0;
989c29fa5a6Sopenharmony_ci                                int32_t endY = 0;
990c29fa5a6Sopenharmony_ci                            };
991c29fa5a6Sopenharmony_ci                            int32_t startX = 0;
992c29fa5a6Sopenharmony_ci                            int32_t startY = 0;
993c29fa5a6Sopenharmony_ci                            int32_t endX = 0;
994c29fa5a6Sopenharmony_ci                            int32_t endY = 0;
995c29fa5a6Sopenharmony_ci                            int32_t totalTimeMs = 0;
996c29fa5a6Sopenharmony_ci                            int32_t keepTimeMs = 0;
997c29fa5a6Sopenharmony_ci                            int32_t fingerCount = 0;
998c29fa5a6Sopenharmony_ci                            std::vector<FingerInfo> fingerList;
999c29fa5a6Sopenharmony_ci                            int32_t startPos = optind - MOVE_POS_ONE;
1000c29fa5a6Sopenharmony_ci                            while (true) {
1001c29fa5a6Sopenharmony_ci                                int32_t residueArgc = argc - startPos;
1002c29fa5a6Sopenharmony_ci                                if (residueArgc == 0) {
1003c29fa5a6Sopenharmony_ci                                    totalTimeMs = TOTAL_TIME_MS;
1004c29fa5a6Sopenharmony_ci                                    optind = startPos;
1005c29fa5a6Sopenharmony_ci                                    break;
1006c29fa5a6Sopenharmony_ci                                } else if (residueArgc == ONE_ARGC) {
1007c29fa5a6Sopenharmony_ci                                    if (!StrToInt(argv[startPos], totalTimeMs)) {
1008c29fa5a6Sopenharmony_ci                                        std::cout << "invalid total times" << std::endl;
1009c29fa5a6Sopenharmony_ci                                        return EVENT_REG_FAIL;
1010c29fa5a6Sopenharmony_ci                                    }
1011c29fa5a6Sopenharmony_ci                                    optind = startPos + MOVE_POS_ONE;
1012c29fa5a6Sopenharmony_ci                                    break;
1013c29fa5a6Sopenharmony_ci                                } else if (residueArgc == TWO_ARGC) {
1014c29fa5a6Sopenharmony_ci                                    totalTimeMs = TOTAL_TIME_MS;
1015c29fa5a6Sopenharmony_ci                                    if ((strlen(argv[startPos]) != NUM_KEEP_ARGC) ||
1016c29fa5a6Sopenharmony_ci                                        (argv[startPos][0] != '-') ||
1017c29fa5a6Sopenharmony_ci                                        (argv[startPos][1] != 'k') ||
1018c29fa5a6Sopenharmony_ci                                        (!StrToInt(argv[startPos + MOVE_POS_ONE], keepTimeMs))) {
1019c29fa5a6Sopenharmony_ci                                        std::cout << "invalid keep times" << std::endl;
1020c29fa5a6Sopenharmony_ci                                        return EVENT_REG_FAIL;
1021c29fa5a6Sopenharmony_ci                                    }
1022c29fa5a6Sopenharmony_ci                                    optind = startPos + MOVE_POS_TWO;
1023c29fa5a6Sopenharmony_ci                                    break;
1024c29fa5a6Sopenharmony_ci                                } else if (residueArgc == THREE_ARGC) {
1025c29fa5a6Sopenharmony_ci                                    if (strlen(argv[startPos]) == NUM_KEEP_ARGC) {
1026c29fa5a6Sopenharmony_ci                                        if ((argv[startPos][0] != '-') ||
1027c29fa5a6Sopenharmony_ci                                            (argv[startPos][1] != 'k') ||
1028c29fa5a6Sopenharmony_ci                                            (!StrToInt(argv[startPos + MOVE_POS_ONE], keepTimeMs))) {
1029c29fa5a6Sopenharmony_ci                                            std::cout << "invalid keep times" << std::endl;
1030c29fa5a6Sopenharmony_ci                                            return EVENT_REG_FAIL;
1031c29fa5a6Sopenharmony_ci                                        }
1032c29fa5a6Sopenharmony_ci                                        if (!StrToInt(argv[startPos + MOVE_POS_TWO], totalTimeMs)) {
1033c29fa5a6Sopenharmony_ci                                            std::cout << "invalid total times" << std::endl;
1034c29fa5a6Sopenharmony_ci                                            return EVENT_REG_FAIL;
1035c29fa5a6Sopenharmony_ci                                        }
1036c29fa5a6Sopenharmony_ci                                    } else {
1037c29fa5a6Sopenharmony_ci                                        if (!StrToInt(argv[startPos], totalTimeMs)) {
1038c29fa5a6Sopenharmony_ci                                            std::cout << "invalid total times" << std::endl;
1039c29fa5a6Sopenharmony_ci                                            return EVENT_REG_FAIL;
1040c29fa5a6Sopenharmony_ci                                        }
1041c29fa5a6Sopenharmony_ci                                        if ((argv[startPos + MOVE_POS_ONE][0] != '-') ||
1042c29fa5a6Sopenharmony_ci                                            (argv[startPos + MOVE_POS_ONE][1] != 'k') ||
1043c29fa5a6Sopenharmony_ci                                            (!StrToInt(argv[startPos + MOVE_POS_TWO], keepTimeMs))) {
1044c29fa5a6Sopenharmony_ci                                            std::cout << "invalid keep times" << std::endl;
1045c29fa5a6Sopenharmony_ci                                            return EVENT_REG_FAIL;
1046c29fa5a6Sopenharmony_ci                                        }
1047c29fa5a6Sopenharmony_ci                                    }
1048c29fa5a6Sopenharmony_ci                                    optind = startPos + MOVE_POS_THREE;
1049c29fa5a6Sopenharmony_ci                                    break;
1050c29fa5a6Sopenharmony_ci                                } else if (residueArgc >= FOUR_ARGC) {
1051c29fa5a6Sopenharmony_ci                                    if ((!StrToInt(argv[startPos], startX)) ||
1052c29fa5a6Sopenharmony_ci                                        (!StrToInt(argv[startPos + MOVE_POS_ONE], startY)) ||
1053c29fa5a6Sopenharmony_ci                                        (!StrToInt(argv[startPos + MOVE_POS_TWO], endX)) ||
1054c29fa5a6Sopenharmony_ci                                        (!StrToInt(argv[startPos + MOVE_POS_THREE], endY))) {
1055c29fa5a6Sopenharmony_ci                                            std::cout << "invalid coordinate value" << std::endl;
1056c29fa5a6Sopenharmony_ci                                            return EVENT_REG_FAIL;
1057c29fa5a6Sopenharmony_ci                                    }
1058c29fa5a6Sopenharmony_ci                                    if ((startX < 0) || (startY < 0) || (endX < 0) || (endY < 0)) {
1059c29fa5a6Sopenharmony_ci                                        std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
1060c29fa5a6Sopenharmony_ci                                        return RET_ERR;
1061c29fa5a6Sopenharmony_ci                                    }
1062c29fa5a6Sopenharmony_ci                                    FingerInfo fingerInfoTemp {
1063c29fa5a6Sopenharmony_ci                                        .startX = startX,
1064c29fa5a6Sopenharmony_ci                                        .startY = startY,
1065c29fa5a6Sopenharmony_ci                                        .endX = endX,
1066c29fa5a6Sopenharmony_ci                                        .endY = endY
1067c29fa5a6Sopenharmony_ci                                    };
1068c29fa5a6Sopenharmony_ci                                    fingerList.push_back(fingerInfoTemp);
1069c29fa5a6Sopenharmony_ci                                    fingerCount += 1;
1070c29fa5a6Sopenharmony_ci                                    startPos += FINGER_LOCATION_NUMS;
1071c29fa5a6Sopenharmony_ci                                    optind += THREE_MORE_COMMAND;
1072c29fa5a6Sopenharmony_ci                                } else {
1073c29fa5a6Sopenharmony_ci                                    std::cout << "invalid total times" << std::endl;
1074c29fa5a6Sopenharmony_ci                                    return EVENT_REG_FAIL;
1075c29fa5a6Sopenharmony_ci                                }
1076c29fa5a6Sopenharmony_ci                            }
1077c29fa5a6Sopenharmony_ci
1078c29fa5a6Sopenharmony_ci                            for (const auto &finger : fingerList) {
1079c29fa5a6Sopenharmony_ci                                std::cout << "startX:" << finger.startX << ", startY:" << finger.startY <<
1080c29fa5a6Sopenharmony_ci                                ", endX:" << finger.endX << ", endY:" << finger.endY << std::endl;
1081c29fa5a6Sopenharmony_ci                            }
1082c29fa5a6Sopenharmony_ci                            if (keepTimeMs > MAX_KEEP_TIME || keepTimeMs < 0) {
1083c29fa5a6Sopenharmony_ci                                std::cout << "invalid keep times" << std::endl;
1084c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1085c29fa5a6Sopenharmony_ci                            }
1086c29fa5a6Sopenharmony_ci                            if (totalTimeMs < 0) {
1087c29fa5a6Sopenharmony_ci                                std::cout << "invalid total times" << std::endl;
1088c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1089c29fa5a6Sopenharmony_ci                            }
1090c29fa5a6Sopenharmony_ci                            std::cout << "fingerCount:" << fingerCount <<std::endl;
1091c29fa5a6Sopenharmony_ci                            std::cout << "keepTimeMs:" << keepTimeMs <<std::endl;
1092c29fa5a6Sopenharmony_ci                            std::cout << "totalTimeMs:" << totalTimeMs <<std::endl;
1093c29fa5a6Sopenharmony_ci
1094c29fa5a6Sopenharmony_ci                            const int64_t minTotalTimeMs = 1;
1095c29fa5a6Sopenharmony_ci                            const int64_t maxTotalTimeMs = 15000;
1096c29fa5a6Sopenharmony_ci                            if ((totalTimeMs < minTotalTimeMs) || (totalTimeMs > maxTotalTimeMs)) {
1097c29fa5a6Sopenharmony_ci                                std::cout << "total time is out of range:" << std::endl;
1098c29fa5a6Sopenharmony_ci                                std::cout << minTotalTimeMs << " <= " << "total times" << " <= " << maxTotalTimeMs;
1099c29fa5a6Sopenharmony_ci                                std::cout << std::endl;
1100c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1101c29fa5a6Sopenharmony_ci                            }
1102c29fa5a6Sopenharmony_ci
1103c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
1104c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
1105c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN);
1106c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN);
1107c29fa5a6Sopenharmony_ci                            for (int32_t i = 0; i < fingerCount; i++) {
1108c29fa5a6Sopenharmony_ci                                PointerEvent::PointerItem item;
1109c29fa5a6Sopenharmony_ci                                item.SetDisplayX(fingerList[i].startX);
1110c29fa5a6Sopenharmony_ci                                item.SetDisplayY(fingerList[i].startY);
1111c29fa5a6Sopenharmony_ci                                item.SetRawDisplayX(fingerList[i].startX);
1112c29fa5a6Sopenharmony_ci                                item.SetRawDisplayY(fingerList[i].startY);
1113c29fa5a6Sopenharmony_ci                                item.SetPointerId(DEFAULT_POINTER_ID_FIRST + i);
1114c29fa5a6Sopenharmony_ci                                pointerEvent->AddPointerItem(item);
1115c29fa5a6Sopenharmony_ci                                pointerEvent->SetPointerId(DEFAULT_POINTER_ID_FIRST + i);
1116c29fa5a6Sopenharmony_ci                                InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1117c29fa5a6Sopenharmony_ci                            }
1118c29fa5a6Sopenharmony_ci
1119c29fa5a6Sopenharmony_ci                            int64_t startTimeUs = pointerEvent->GetActionStartTime();
1120c29fa5a6Sopenharmony_ci                            int64_t startTimeMs = startTimeUs / TIME_TRANSITION;
1121c29fa5a6Sopenharmony_ci                            int64_t endTimeMs = 0;
1122c29fa5a6Sopenharmony_ci                            if (!AddInt64(startTimeMs, totalTimeMs, endTimeMs)) {
1123c29fa5a6Sopenharmony_ci                                std::cout << "system time error." << std::endl;
1124c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1125c29fa5a6Sopenharmony_ci                            }
1126c29fa5a6Sopenharmony_ci                            int64_t currentTimeMs = startTimeMs;
1127c29fa5a6Sopenharmony_ci                            int64_t nowSysTimeUs = 0;
1128c29fa5a6Sopenharmony_ci                            int64_t nowSysTimeMs = 0;
1129c29fa5a6Sopenharmony_ci                            int64_t sleepTimeMs = 0;
1130c29fa5a6Sopenharmony_ci
1131c29fa5a6Sopenharmony_ci                            std::vector<int32_t> pointerIds = pointerEvent->GetPointerIds();
1132c29fa5a6Sopenharmony_ci                            if (pointerIds.size() != static_cast<size_t>(fingerCount)) {
1133c29fa5a6Sopenharmony_ci                                std::cout << "pointerIds size is error" << std::endl;
1134c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1135c29fa5a6Sopenharmony_ci                            }
1136c29fa5a6Sopenharmony_ci
1137c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE);
1138c29fa5a6Sopenharmony_ci                            while (currentTimeMs < endTimeMs) {
1139c29fa5a6Sopenharmony_ci                                for (size_t i = 0; i < pointerIds.size(); i++) {
1140c29fa5a6Sopenharmony_ci                                    int32_t pointerId = pointerIds[i];
1141c29fa5a6Sopenharmony_ci                                    PointerEvent::PointerItem item;
1142c29fa5a6Sopenharmony_ci                                    if (!pointerEvent->GetPointerItem(pointerId, item)) {
1143c29fa5a6Sopenharmony_ci                                        std::cout << "Invalid pointer:" << pointerId << std::endl;
1144c29fa5a6Sopenharmony_ci                                        return EVENT_REG_FAIL;
1145c29fa5a6Sopenharmony_ci                                    }
1146c29fa5a6Sopenharmony_ci                                    item.SetDisplayX(NextPos(startTimeMs, currentTimeMs, totalTimeMs,
1147c29fa5a6Sopenharmony_ci                                        fingerList[i].startX, fingerList[i].endX));
1148c29fa5a6Sopenharmony_ci                                    item.SetDisplayY(NextPos(startTimeMs, currentTimeMs, totalTimeMs,
1149c29fa5a6Sopenharmony_ci                                        fingerList[i].startY, fingerList[i].endY));
1150c29fa5a6Sopenharmony_ci                                    item.SetRawDisplayX(NextPos(startTimeMs, currentTimeMs, totalTimeMs,
1151c29fa5a6Sopenharmony_ci                                        fingerList[i].startX, fingerList[i].endX));
1152c29fa5a6Sopenharmony_ci                                    item.SetRawDisplayY(NextPos(startTimeMs, currentTimeMs, totalTimeMs,
1153c29fa5a6Sopenharmony_ci                                        fingerList[i].startY, fingerList[i].endY));
1154c29fa5a6Sopenharmony_ci                                    pointerEvent->UpdatePointerItem(pointerId, item);
1155c29fa5a6Sopenharmony_ci                                    pointerEvent->SetPointerId(pointerId);
1156c29fa5a6Sopenharmony_ci                                    pointerEvent->SetActionTime(currentTimeMs * TIME_TRANSITION);
1157c29fa5a6Sopenharmony_ci                                    InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1158c29fa5a6Sopenharmony_ci                                }
1159c29fa5a6Sopenharmony_ci                                nowSysTimeUs = GetSysClockTime();
1160c29fa5a6Sopenharmony_ci                                nowSysTimeMs = nowSysTimeUs / TIME_TRANSITION;
1161c29fa5a6Sopenharmony_ci                                sleepTimeMs = (currentTimeMs + BLOCK_TIME_MS) - nowSysTimeMs;
1162c29fa5a6Sopenharmony_ci                                std::this_thread::sleep_for(std::chrono::milliseconds(sleepTimeMs));
1163c29fa5a6Sopenharmony_ci                                currentTimeMs += BLOCK_TIME_MS;
1164c29fa5a6Sopenharmony_ci                            }
1165c29fa5a6Sopenharmony_ci
1166c29fa5a6Sopenharmony_ci                            for (size_t i = 0; i < pointerIds.size(); i++) {
1167c29fa5a6Sopenharmony_ci                                int32_t pointerId = pointerIds[i];
1168c29fa5a6Sopenharmony_ci                                PointerEvent::PointerItem item;
1169c29fa5a6Sopenharmony_ci                                if (!pointerEvent->GetPointerItem(pointerId, item)) {
1170c29fa5a6Sopenharmony_ci                                    std::cout << "Invalid pointer:" << pointerId << std::endl;
1171c29fa5a6Sopenharmony_ci                                    return EVENT_REG_FAIL;
1172c29fa5a6Sopenharmony_ci                                }
1173c29fa5a6Sopenharmony_ci                                item.SetDisplayX(fingerList[i].endX);
1174c29fa5a6Sopenharmony_ci                                item.SetDisplayY(fingerList[i].endY);
1175c29fa5a6Sopenharmony_ci                                item.SetRawDisplayX(fingerList[i].endX);
1176c29fa5a6Sopenharmony_ci                                item.SetRawDisplayY(fingerList[i].endY);
1177c29fa5a6Sopenharmony_ci                                pointerEvent->UpdatePointerItem(pointerId, item);
1178c29fa5a6Sopenharmony_ci                                pointerEvent->SetPointerId(pointerId);
1179c29fa5a6Sopenharmony_ci                                pointerEvent->SetActionTime(currentTimeMs * TIME_TRANSITION);
1180c29fa5a6Sopenharmony_ci                                InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1181c29fa5a6Sopenharmony_ci                            }
1182c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(BLOCK_TIME_MS));
1183c29fa5a6Sopenharmony_ci
1184c29fa5a6Sopenharmony_ci                            if (keepTimeMs > 0) {
1185c29fa5a6Sopenharmony_ci                                currentTimeMs = GetSysClockTime() / TIME_TRANSITION;
1186c29fa5a6Sopenharmony_ci                                int64_t keepEndTimeMs = 0;
1187c29fa5a6Sopenharmony_ci                                if (!AddInt64(currentTimeMs, keepTimeMs, keepEndTimeMs)) {
1188c29fa5a6Sopenharmony_ci                                    std::cout << "system time error." << std::endl;
1189c29fa5a6Sopenharmony_ci                                    return EVENT_REG_FAIL;
1190c29fa5a6Sopenharmony_ci                                }
1191c29fa5a6Sopenharmony_ci                                while (currentTimeMs < keepEndTimeMs) {
1192c29fa5a6Sopenharmony_ci                                    for (size_t i = 0; i < pointerIds.size(); i++) {
1193c29fa5a6Sopenharmony_ci                                        int32_t pointerId = pointerIds[i];
1194c29fa5a6Sopenharmony_ci                                        PointerEvent::PointerItem item;
1195c29fa5a6Sopenharmony_ci                                        if (!pointerEvent->GetPointerItem(pointerId, item)) {
1196c29fa5a6Sopenharmony_ci                                            std::cout << "Invalid pointer:" << pointerId << std::endl;
1197c29fa5a6Sopenharmony_ci                                            return EVENT_REG_FAIL;
1198c29fa5a6Sopenharmony_ci                                        }
1199c29fa5a6Sopenharmony_ci                                        item.SetDisplayX(fingerList[i].endX);
1200c29fa5a6Sopenharmony_ci                                        item.SetDisplayY(fingerList[i].endY);
1201c29fa5a6Sopenharmony_ci                                        item.SetRawDisplayX(fingerList[i].endX);
1202c29fa5a6Sopenharmony_ci                                        item.SetRawDisplayY(fingerList[i].endY);
1203c29fa5a6Sopenharmony_ci                                        pointerEvent->UpdatePointerItem(pointerId, item);
1204c29fa5a6Sopenharmony_ci                                        pointerEvent->SetPointerId(pointerId);
1205c29fa5a6Sopenharmony_ci                                        pointerEvent->SetActionTime(currentTimeMs * TIME_TRANSITION);
1206c29fa5a6Sopenharmony_ci                                        InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1207c29fa5a6Sopenharmony_ci                                    }
1208c29fa5a6Sopenharmony_ci                                    nowSysTimeUs = GetSysClockTime();
1209c29fa5a6Sopenharmony_ci                                    nowSysTimeMs = nowSysTimeUs / TIME_TRANSITION;
1210c29fa5a6Sopenharmony_ci                                    sleepTimeMs = (currentTimeMs + BLOCK_TIME_MS) - nowSysTimeMs;
1211c29fa5a6Sopenharmony_ci                                    std::this_thread::sleep_for(std::chrono::milliseconds(sleepTimeMs));
1212c29fa5a6Sopenharmony_ci                                    currentTimeMs += BLOCK_TIME_MS;
1213c29fa5a6Sopenharmony_ci                                }
1214c29fa5a6Sopenharmony_ci                            }
1215c29fa5a6Sopenharmony_ci
1216c29fa5a6Sopenharmony_ci                            pointerEvent->SetActionTime((endTimeMs + BLOCK_TIME_MS) * TIME_TRANSITION);
1217c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP);
1218c29fa5a6Sopenharmony_ci                            for (size_t i = 0; i < pointerIds.size(); i++) {
1219c29fa5a6Sopenharmony_ci                                int32_t pointerId = pointerIds[i];
1220c29fa5a6Sopenharmony_ci                                PointerEvent::PointerItem item;
1221c29fa5a6Sopenharmony_ci                                if (!pointerEvent->GetPointerItem(pointerId, item)) {
1222c29fa5a6Sopenharmony_ci                                    std::cout << "Invalid pointer:" << pointerId << std::endl;
1223c29fa5a6Sopenharmony_ci                                    return EVENT_REG_FAIL;
1224c29fa5a6Sopenharmony_ci                                }
1225c29fa5a6Sopenharmony_ci                                pointerEvent->UpdatePointerItem(pointerId, item);
1226c29fa5a6Sopenharmony_ci                                pointerEvent->SetPointerId(pointerId);
1227c29fa5a6Sopenharmony_ci                                InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1228c29fa5a6Sopenharmony_ci                                pointerEvent->RemovePointerItem(pointerId);
1229c29fa5a6Sopenharmony_ci                            }
1230c29fa5a6Sopenharmony_ci                            break;
1231c29fa5a6Sopenharmony_ci                        }
1232c29fa5a6Sopenharmony_ci                        case 'd': {
1233c29fa5a6Sopenharmony_ci                            if (optind >= argc) {
1234c29fa5a6Sopenharmony_ci                                std::cout << "too few arguments to function" << std::endl;
1235c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1236c29fa5a6Sopenharmony_ci                            }
1237c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, px1) || !StrToInt(argv[optind], py1)) {
1238c29fa5a6Sopenharmony_ci                                std::cout << "invalid coordinate value" << std::endl;
1239c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1240c29fa5a6Sopenharmony_ci                            }
1241c29fa5a6Sopenharmony_ci                            if ((px1 < 0) || (py1 < 0)) {
1242c29fa5a6Sopenharmony_ci                                std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
1243c29fa5a6Sopenharmony_ci                                return RET_ERR;
1244c29fa5a6Sopenharmony_ci                            }
1245c29fa5a6Sopenharmony_ci                            std::cout << "touch down " << px1 << " " << py1 << std::endl;
1246c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
1247c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
1248c29fa5a6Sopenharmony_ci                            PointerEvent::PointerItem item;
1249c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py1);
1250c29fa5a6Sopenharmony_ci                            item.SetRawDisplayY(py1);
1251c29fa5a6Sopenharmony_ci                            item.SetPointerId(DEFAULT_POINTER_ID_FIRST);
1252c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px1);
1253c29fa5a6Sopenharmony_ci                            item.SetRawDisplayX(px1);
1254c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(DEFAULT_POINTER_ID_FIRST);
1255c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN);
1256c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
1257c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN);
1258c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1259c29fa5a6Sopenharmony_ci                            optind++;
1260c29fa5a6Sopenharmony_ci                            break;
1261c29fa5a6Sopenharmony_ci                        }
1262c29fa5a6Sopenharmony_ci                        case 'u': {
1263c29fa5a6Sopenharmony_ci                            if (optind >= argc) {
1264c29fa5a6Sopenharmony_ci                                std::cout << "too few arguments to function" << std::endl;
1265c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1266c29fa5a6Sopenharmony_ci                            }
1267c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, px1) || !StrToInt(argv[optind], py1)) {
1268c29fa5a6Sopenharmony_ci                                std::cout << "invalid coordinate value" << std::endl;
1269c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1270c29fa5a6Sopenharmony_ci                            }
1271c29fa5a6Sopenharmony_ci                            if ((px1 < 0) || (py1 < 0)) {
1272c29fa5a6Sopenharmony_ci                                std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
1273c29fa5a6Sopenharmony_ci                                return RET_ERR;
1274c29fa5a6Sopenharmony_ci                            }
1275c29fa5a6Sopenharmony_ci                            std::cout << "touch up " << px1 << " " << py1 << std::endl;
1276c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
1277c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
1278c29fa5a6Sopenharmony_ci                            PointerEvent::PointerItem item;
1279c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py1);
1280c29fa5a6Sopenharmony_ci                            item.SetRawDisplayY(py1);
1281c29fa5a6Sopenharmony_ci                            item.SetPointerId(DEFAULT_POINTER_ID_FIRST);
1282c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px1);
1283c29fa5a6Sopenharmony_ci                            item.SetRawDisplayX(px1);
1284c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(DEFAULT_POINTER_ID_FIRST);
1285c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
1286c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN);
1287c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP);
1288c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1289c29fa5a6Sopenharmony_ci                            optind++;
1290c29fa5a6Sopenharmony_ci                            break;
1291c29fa5a6Sopenharmony_ci                        }
1292c29fa5a6Sopenharmony_ci                        case 'c': {
1293c29fa5a6Sopenharmony_ci                            int32_t intervalTimeMs = 0;
1294c29fa5a6Sopenharmony_ci                            if (argc == KEY_PARAM_SIZE) {
1295c29fa5a6Sopenharmony_ci                                if (!StrToInt(optarg, px1) ||
1296c29fa5a6Sopenharmony_ci                                    !StrToInt(argv[optind], py1)) {
1297c29fa5a6Sopenharmony_ci                                    std::cout << "input coordinate error" << std::endl;
1298c29fa5a6Sopenharmony_ci                                    return RET_ERR;
1299c29fa5a6Sopenharmony_ci                                }
1300c29fa5a6Sopenharmony_ci                                intervalTimeMs = INTERVAL_TIME_MS;
1301c29fa5a6Sopenharmony_ci                            } else if (argc == KEY_TIME_PARAM_SIZE) {
1302c29fa5a6Sopenharmony_ci                                if (!StrToInt(optarg, px1) ||
1303c29fa5a6Sopenharmony_ci                                    !StrToInt(argv[optind], py1) ||
1304c29fa5a6Sopenharmony_ci                                    !StrToInt(argv[optind + 1], intervalTimeMs)) {
1305c29fa5a6Sopenharmony_ci                                    std::cout << "input coordinate or time error" << std::endl;
1306c29fa5a6Sopenharmony_ci                                    return RET_ERR;
1307c29fa5a6Sopenharmony_ci                                }
1308c29fa5a6Sopenharmony_ci                                const int64_t minIntervalTimeMs = 1;
1309c29fa5a6Sopenharmony_ci                                const int64_t maxIntervalTimeMs = 450;
1310c29fa5a6Sopenharmony_ci                                if ((minIntervalTimeMs > intervalTimeMs) || (maxIntervalTimeMs < intervalTimeMs)) {
1311c29fa5a6Sopenharmony_ci                                    std::cout << "interval time is out of range: " << minIntervalTimeMs << "ms";
1312c29fa5a6Sopenharmony_ci                                    std::cout << " < interval time < " << maxIntervalTimeMs << "ms" << std::endl;
1313c29fa5a6Sopenharmony_ci                                    return RET_ERR;
1314c29fa5a6Sopenharmony_ci                                }
1315c29fa5a6Sopenharmony_ci                            } else {
1316c29fa5a6Sopenharmony_ci                                std::cout << "parameter error, unable to run" << std::endl;
1317c29fa5a6Sopenharmony_ci                                return RET_ERR;
1318c29fa5a6Sopenharmony_ci                            }
1319c29fa5a6Sopenharmony_ci                            if ((px1 < 0) || (py1 < 0)) {
1320c29fa5a6Sopenharmony_ci                                std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
1321c29fa5a6Sopenharmony_ci                                return RET_ERR;
1322c29fa5a6Sopenharmony_ci                            }
1323c29fa5a6Sopenharmony_ci                            std::cout << "   click coordinate: ("<< px1 << ", "  << py1 << ")" << std::endl;
1324c29fa5a6Sopenharmony_ci                            std::cout << "click interval time: " << intervalTimeMs      << "ms" << std::endl;
1325c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
1326c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
1327c29fa5a6Sopenharmony_ci                            PointerEvent::PointerItem item;
1328c29fa5a6Sopenharmony_ci                            item.SetPointerId(DEFAULT_POINTER_ID_FIRST);
1329c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px1);
1330c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py1);
1331c29fa5a6Sopenharmony_ci                            item.SetRawDisplayX(px1);
1332c29fa5a6Sopenharmony_ci                            item.SetRawDisplayY(py1);
1333c29fa5a6Sopenharmony_ci                            item.SetPressed(true);
1334c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(DEFAULT_POINTER_ID_FIRST);
1335c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
1336c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN);
1337c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN);
1338c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1339c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(intervalTimeMs));
1340c29fa5a6Sopenharmony_ci
1341c29fa5a6Sopenharmony_ci                            item.SetPressed(false);
1342c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py1);
1343c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px1);
1344c29fa5a6Sopenharmony_ci                            item.SetRawDisplayY(py1);
1345c29fa5a6Sopenharmony_ci                            item.SetRawDisplayX(px1);
1346c29fa5a6Sopenharmony_ci                            pointerEvent->UpdatePointerItem(DEFAULT_POINTER_ID_FIRST, item);
1347c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP);
1348c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1349c29fa5a6Sopenharmony_ci                            break;
1350c29fa5a6Sopenharmony_ci                        }
1351c29fa5a6Sopenharmony_ci                        case 'i': {
1352c29fa5a6Sopenharmony_ci                            int32_t takeTime = 0;
1353c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, takeTime)) {
1354c29fa5a6Sopenharmony_ci                                std::cout << "invalid command to interval time" << std::endl;
1355c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1356c29fa5a6Sopenharmony_ci                            }
1357c29fa5a6Sopenharmony_ci                            const int64_t minTakeTimeMs = 1;
1358c29fa5a6Sopenharmony_ci                            const int64_t maxTakeTimeMs = 15000;
1359c29fa5a6Sopenharmony_ci                            if ((minTakeTimeMs > takeTime) || (maxTakeTimeMs < takeTime)) {
1360c29fa5a6Sopenharmony_ci                                std::cout << "takeTime is out of range. ";
1361c29fa5a6Sopenharmony_ci                                std::cout << minTakeTimeMs << " < takeTime < " << maxTakeTimeMs;
1362c29fa5a6Sopenharmony_ci                                std::cout << std::endl;
1363c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1364c29fa5a6Sopenharmony_ci                            }
1365c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(takeTime));
1366c29fa5a6Sopenharmony_ci                            break;
1367c29fa5a6Sopenharmony_ci                        }
1368c29fa5a6Sopenharmony_ci                        case 'g': {
1369c29fa5a6Sopenharmony_ci                            const int32_t dragArgcSeven = 7;
1370c29fa5a6Sopenharmony_ci                            const int32_t dragArgcCommandNine = 9;
1371c29fa5a6Sopenharmony_ci                            if ((argc != dragArgcSeven) && (argc != dragArgcCommandNine)) {
1372c29fa5a6Sopenharmony_ci                                std::cout << "argc:" << argc << std::endl;
1373c29fa5a6Sopenharmony_ci                                std::cout << "wrong number of parameters" << std::endl;
1374c29fa5a6Sopenharmony_ci                                return RET_ERR;
1375c29fa5a6Sopenharmony_ci                            }
1376c29fa5a6Sopenharmony_ci                            totalTimeMs = TOTAL_TIME_MS;
1377c29fa5a6Sopenharmony_ci                            int32_t pressTimems = 500;
1378c29fa5a6Sopenharmony_ci                            if (argc == moveArgcSeven) {
1379c29fa5a6Sopenharmony_ci                                if ((!StrToInt(optarg, px1)) ||
1380c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind], py1)) ||
1381c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind + 1], px2)) ||
1382c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind + 2], py2))) {
1383c29fa5a6Sopenharmony_ci                                        std::cout << "invalid coordinate value" << std::endl;
1384c29fa5a6Sopenharmony_ci                                        return RET_ERR;
1385c29fa5a6Sopenharmony_ci                                }
1386c29fa5a6Sopenharmony_ci                            } else {
1387c29fa5a6Sopenharmony_ci                                if ((!StrToInt(optarg, px1)) ||
1388c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind], py1)) ||
1389c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind + 1], px2)) ||
1390c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind + 2], py2)) ||
1391c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind + 3], pressTimems)) ||
1392c29fa5a6Sopenharmony_ci                                    (!StrToInt(argv[optind + 4], totalTimeMs))) {
1393c29fa5a6Sopenharmony_ci                                        std::cout << "invalid input coordinate or time" << std::endl;
1394c29fa5a6Sopenharmony_ci                                        return RET_ERR;
1395c29fa5a6Sopenharmony_ci                                }
1396c29fa5a6Sopenharmony_ci                            }
1397c29fa5a6Sopenharmony_ci                            if ((px1 < 0) || (py1 < 0) || (px2 < 0) || (py2 < 0)) {
1398c29fa5a6Sopenharmony_ci                                std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
1399c29fa5a6Sopenharmony_ci                                return RET_ERR;
1400c29fa5a6Sopenharmony_ci                            }
1401c29fa5a6Sopenharmony_ci                            const int32_t minTotalTimeMs = 1000;
1402c29fa5a6Sopenharmony_ci                            const int32_t maxTotalTimeMs = 15000;
1403c29fa5a6Sopenharmony_ci                            if ((minTotalTimeMs > totalTimeMs) || (maxTotalTimeMs < totalTimeMs)) {
1404c29fa5a6Sopenharmony_ci                                std::cout << "total time input is error" << std::endl;
1405c29fa5a6Sopenharmony_ci                                return RET_ERR;
1406c29fa5a6Sopenharmony_ci                            }
1407c29fa5a6Sopenharmony_ci                            const int32_t minPressTimeMs = 500;
1408c29fa5a6Sopenharmony_ci                            const int32_t maxPressTimeMs = 14500;
1409c29fa5a6Sopenharmony_ci                            if ((minPressTimeMs > pressTimems) || (maxPressTimeMs < pressTimems)) {
1410c29fa5a6Sopenharmony_ci                                std::cout << "press time is out of range" << std::endl;
1411c29fa5a6Sopenharmony_ci                                return RET_ERR;
1412c29fa5a6Sopenharmony_ci                            }
1413c29fa5a6Sopenharmony_ci                            const int32_t minMoveTimeMs = 500;
1414c29fa5a6Sopenharmony_ci                            if ((totalTimeMs -  pressTimems) <  minMoveTimeMs) {
1415c29fa5a6Sopenharmony_ci                                std::cout << "move time is out of range" << std::endl;
1416c29fa5a6Sopenharmony_ci                                return RET_ERR;
1417c29fa5a6Sopenharmony_ci                            }
1418c29fa5a6Sopenharmony_ci                            auto pointerEvent = PointerEvent::Create();
1419c29fa5a6Sopenharmony_ci                            CHKPR(pointerEvent, ERROR_NULL_POINTER);
1420c29fa5a6Sopenharmony_ci                            PointerEvent::PointerItem item;
1421c29fa5a6Sopenharmony_ci                            item.SetPointerId(DEFAULT_POINTER_ID_FIRST);
1422c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py1);
1423c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px1);
1424c29fa5a6Sopenharmony_ci                            item.SetRawDisplayY(py1);
1425c29fa5a6Sopenharmony_ci                            item.SetRawDisplayX(px1);
1426c29fa5a6Sopenharmony_ci                            pointerEvent->AddPointerItem(item);
1427c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(DEFAULT_POINTER_ID_FIRST);
1428c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN);
1429c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN);
1430c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1431c29fa5a6Sopenharmony_ci                            const int32_t conversionRate = 1000;
1432c29fa5a6Sopenharmony_ci                            int64_t startTimeMs = GetSysClockTime() / conversionRate;
1433c29fa5a6Sopenharmony_ci                            int64_t endTimeMs = 0;
1434c29fa5a6Sopenharmony_ci                            if (!AddInt64(startTimeMs, totalTimeMs, endTimeMs)) {
1435c29fa5a6Sopenharmony_ci                                std::cout << "end time count error" << std::endl;
1436c29fa5a6Sopenharmony_ci                                return RET_ERR;
1437c29fa5a6Sopenharmony_ci                            }
1438c29fa5a6Sopenharmony_ci                            int64_t downTimeMs = 0;
1439c29fa5a6Sopenharmony_ci                            if (!AddInt64(startTimeMs, pressTimems, downTimeMs)) {
1440c29fa5a6Sopenharmony_ci                                std::cout << "down time count error" << std::endl;
1441c29fa5a6Sopenharmony_ci                                return RET_ERR;
1442c29fa5a6Sopenharmony_ci                            }
1443c29fa5a6Sopenharmony_ci                            int64_t currentTimeMs = startTimeMs;
1444c29fa5a6Sopenharmony_ci                            const int32_t moveTimeMs = totalTimeMs - pressTimems;
1445c29fa5a6Sopenharmony_ci                            while ((currentTimeMs < endTimeMs)) {
1446c29fa5a6Sopenharmony_ci                                if (currentTimeMs > downTimeMs) {
1447c29fa5a6Sopenharmony_ci                                    item.SetDisplayX(NextPos(downTimeMs, currentTimeMs, moveTimeMs, px1, px2));
1448c29fa5a6Sopenharmony_ci                                    item.SetDisplayY(NextPos(downTimeMs, currentTimeMs, moveTimeMs, py1, py2));
1449c29fa5a6Sopenharmony_ci                                    item.SetRawDisplayX(NextPos(downTimeMs, currentTimeMs, moveTimeMs, px1, px2));
1450c29fa5a6Sopenharmony_ci                                    item.SetRawDisplayY(NextPos(downTimeMs, currentTimeMs, moveTimeMs, py1, py2));
1451c29fa5a6Sopenharmony_ci                                    pointerEvent->UpdatePointerItem(DEFAULT_POINTER_ID_FIRST, item);
1452c29fa5a6Sopenharmony_ci                                    pointerEvent->SetActionTime(currentTimeMs * TIME_TRANSITION);
1453c29fa5a6Sopenharmony_ci                                    pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE);
1454c29fa5a6Sopenharmony_ci                                    InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1455c29fa5a6Sopenharmony_ci                                }
1456c29fa5a6Sopenharmony_ci                                std::this_thread::sleep_for(std::chrono::milliseconds(BLOCK_TIME_MS));
1457c29fa5a6Sopenharmony_ci                                currentTimeMs = GetSysClockTime() / conversionRate;
1458c29fa5a6Sopenharmony_ci                            }
1459c29fa5a6Sopenharmony_ci                            item.SetDisplayX(px2);
1460c29fa5a6Sopenharmony_ci                            item.SetDisplayY(py2);
1461c29fa5a6Sopenharmony_ci                            item.SetRawDisplayX(px2);
1462c29fa5a6Sopenharmony_ci                            item.SetRawDisplayY(py2);
1463c29fa5a6Sopenharmony_ci                            pointerEvent->UpdatePointerItem(DEFAULT_POINTER_ID_FIRST, item);
1464c29fa5a6Sopenharmony_ci                            pointerEvent->SetActionTime(endTimeMs * TIME_TRANSITION);
1465c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP);
1466c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1467c29fa5a6Sopenharmony_ci                            break;
1468c29fa5a6Sopenharmony_ci                        }
1469c29fa5a6Sopenharmony_ci                        case 'k': {
1470c29fa5a6Sopenharmony_ci                            if (firstOpt == 'S') {
1471c29fa5a6Sopenharmony_ci                                std::cout << "invalid argument k" << std::endl;
1472c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1473c29fa5a6Sopenharmony_ci                            }
1474c29fa5a6Sopenharmony_ci                            KnuckleGestureInputProcess(argc, argv, c, optionIndex);
1475c29fa5a6Sopenharmony_ci                            break;
1476c29fa5a6Sopenharmony_ci                        }
1477c29fa5a6Sopenharmony_ci                        default: {
1478c29fa5a6Sopenharmony_ci                            std::cout << "invalid command" << std::endl;
1479c29fa5a6Sopenharmony_ci                            ShowUsage();
1480c29fa5a6Sopenharmony_ci                            return EVENT_REG_FAIL;
1481c29fa5a6Sopenharmony_ci                        }
1482c29fa5a6Sopenharmony_ci                    }
1483c29fa5a6Sopenharmony_ci                    std::this_thread::sleep_for(std::chrono::milliseconds(SLEEPTIME));
1484c29fa5a6Sopenharmony_ci                }
1485c29fa5a6Sopenharmony_ci                break;
1486c29fa5a6Sopenharmony_ci            }
1487c29fa5a6Sopenharmony_ci            case 'J': {
1488c29fa5a6Sopenharmony_ci                JoystickInfo joyInfo;
1489c29fa5a6Sopenharmony_ci                std::vector<std::pair<int32_t, JoystickInfo>> state;
1490c29fa5a6Sopenharmony_ci                while ((c = getopt_long(argc, argv, "m:d:u:c:i:", joystickSensorOptions, &optionIndex)) != -1) {
1491c29fa5a6Sopenharmony_ci                    switch (c) {
1492c29fa5a6Sopenharmony_ci                        case 'm': {
1493c29fa5a6Sopenharmony_ci                            std::string arg(optarg);
1494c29fa5a6Sopenharmony_ci                            std::string::size_type pos = arg.find('=');
1495c29fa5a6Sopenharmony_ci                            if (pos == std::string::npos) {
1496c29fa5a6Sopenharmony_ci                                std::cout << "Parameter format is error" << std::endl;
1497c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1498c29fa5a6Sopenharmony_ci                            }
1499c29fa5a6Sopenharmony_ci                            std::string absAction = arg.substr(0, pos);
1500c29fa5a6Sopenharmony_ci                            if (absAction == "x") {
1501c29fa5a6Sopenharmony_ci                                joyInfo.absType = PointerEvent::AxisType::AXIS_TYPE_ABS_X;
1502c29fa5a6Sopenharmony_ci                            } else if (absAction == "y") {
1503c29fa5a6Sopenharmony_ci                                joyInfo.absType = PointerEvent::AxisType::AXIS_TYPE_ABS_Y;
1504c29fa5a6Sopenharmony_ci                            } else if (absAction == "z") {
1505c29fa5a6Sopenharmony_ci                                joyInfo.absType = PointerEvent::AxisType::AXIS_TYPE_ABS_Z;
1506c29fa5a6Sopenharmony_ci                            } else if (absAction == "rz") {
1507c29fa5a6Sopenharmony_ci                                joyInfo.absType = PointerEvent::AxisType::AXIS_TYPE_ABS_RZ;
1508c29fa5a6Sopenharmony_ci                            } else if (absAction == "gas") {
1509c29fa5a6Sopenharmony_ci                                joyInfo.absType = PointerEvent::AxisType::AXIS_TYPE_ABS_GAS;
1510c29fa5a6Sopenharmony_ci                            } else if (absAction == "brake") {
1511c29fa5a6Sopenharmony_ci                                joyInfo.absType = PointerEvent::AxisType::AXIS_TYPE_ABS_BRAKE;
1512c29fa5a6Sopenharmony_ci                            } else if (absAction == "hat0x") {
1513c29fa5a6Sopenharmony_ci                                joyInfo.absType = PointerEvent::AxisType::AXIS_TYPE_ABS_HAT0X;
1514c29fa5a6Sopenharmony_ci                            } else if (absAction == "hat0y") {
1515c29fa5a6Sopenharmony_ci                                joyInfo.absType = PointerEvent::AxisType::AXIS_TYPE_ABS_HAT0Y;
1516c29fa5a6Sopenharmony_ci                            } else if (absAction == "throttle") {
1517c29fa5a6Sopenharmony_ci                                joyInfo.absType = PointerEvent::AxisType::AXIS_TYPE_ABS_THROTTLE;
1518c29fa5a6Sopenharmony_ci                            } else {
1519c29fa5a6Sopenharmony_ci                                std::cout << "Invalid abstype" << std::endl;
1520c29fa5a6Sopenharmony_ci                                return RET_ERR;
1521c29fa5a6Sopenharmony_ci                            }
1522c29fa5a6Sopenharmony_ci                            if (!StrToInt(arg.substr(pos + 1), joyInfo.absValue)) {
1523c29fa5a6Sopenharmony_ci                                std::cout << "Invalid parameter to move absValue" << std::endl;
1524c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1525c29fa5a6Sopenharmony_ci                            }
1526c29fa5a6Sopenharmony_ci                            state.push_back(std::pair<int32_t, JoystickInfo>(JOYSTICK_MOVE, joyInfo));
1527c29fa5a6Sopenharmony_ci                            break;
1528c29fa5a6Sopenharmony_ci                        }
1529c29fa5a6Sopenharmony_ci                        case 'd': {
1530c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, joyInfo.buttonId)) {
1531c29fa5a6Sopenharmony_ci                                std::cout << "Invalid button press command" << std::endl;
1532c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1533c29fa5a6Sopenharmony_ci                            }
1534c29fa5a6Sopenharmony_ci                            if (joyInfo.buttonId > JOYSTICK_BUTTON_ID) {
1535c29fa5a6Sopenharmony_ci                                std::cout << "Pressed button value is greater than the max value" << std::endl;
1536c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1537c29fa5a6Sopenharmony_ci                            }
1538c29fa5a6Sopenharmony_ci                            state.push_back(std::pair<int32_t, JoystickInfo>(JOYSTICK_BUTTON_PRESS, joyInfo));
1539c29fa5a6Sopenharmony_ci                            break;
1540c29fa5a6Sopenharmony_ci                        }
1541c29fa5a6Sopenharmony_ci                        case 'u': {
1542c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, joyInfo.buttonId)) {
1543c29fa5a6Sopenharmony_ci                                std::cout << "Invalid raise button command" << std::endl;
1544c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1545c29fa5a6Sopenharmony_ci                            }
1546c29fa5a6Sopenharmony_ci                            if (joyInfo.buttonId > JOYSTICK_BUTTON_ID) {
1547c29fa5a6Sopenharmony_ci                                std::cout << "Raise button value is greater than the max value" << std::endl;
1548c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1549c29fa5a6Sopenharmony_ci                            }
1550c29fa5a6Sopenharmony_ci                            state.push_back(std::pair<int32_t, JoystickInfo>(JOYSTICK_BUTTON_UP, joyInfo));
1551c29fa5a6Sopenharmony_ci                            break;
1552c29fa5a6Sopenharmony_ci                        }
1553c29fa5a6Sopenharmony_ci                        case 'c': {
1554c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, joyInfo.buttonId)) {
1555c29fa5a6Sopenharmony_ci                                std::cout << "Invalid click button command" << std::endl;
1556c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1557c29fa5a6Sopenharmony_ci                            }
1558c29fa5a6Sopenharmony_ci                            if (joyInfo.buttonId > JOYSTICK_BUTTON_ID) {
1559c29fa5a6Sopenharmony_ci                                std::cout << "Click button value is greater than the max value" << std::endl;
1560c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1561c29fa5a6Sopenharmony_ci                            }
1562c29fa5a6Sopenharmony_ci                            state.push_back(std::pair<int32_t, JoystickInfo>(JOYSTICK_CLICK, joyInfo));
1563c29fa5a6Sopenharmony_ci                            break;
1564c29fa5a6Sopenharmony_ci                        }
1565c29fa5a6Sopenharmony_ci                        case 'i': {
1566c29fa5a6Sopenharmony_ci                            if (!StrToInt(optarg, joyInfo.taktTime)) {
1567c29fa5a6Sopenharmony_ci                                std::cout << "Invalid command to interval time" << std::endl;
1568c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1569c29fa5a6Sopenharmony_ci                            }
1570c29fa5a6Sopenharmony_ci                            state.push_back(std::pair<int32_t, JoystickInfo>(JOYSTICK_INTERVAL, joyInfo));
1571c29fa5a6Sopenharmony_ci                            break;
1572c29fa5a6Sopenharmony_ci                        }
1573c29fa5a6Sopenharmony_ci                        default: {
1574c29fa5a6Sopenharmony_ci                            std::cout << "Invalid options" << std::endl;
1575c29fa5a6Sopenharmony_ci                            ShowUsage();
1576c29fa5a6Sopenharmony_ci                            return EVENT_REG_FAIL;
1577c29fa5a6Sopenharmony_ci                        }
1578c29fa5a6Sopenharmony_ci                    }
1579c29fa5a6Sopenharmony_ci                    std::this_thread::sleep_for(std::chrono::milliseconds(SLEEPTIME));
1580c29fa5a6Sopenharmony_ci                }
1581c29fa5a6Sopenharmony_ci                auto pointerEvent = PointerEvent::Create();
1582c29fa5a6Sopenharmony_ci                if (pointerEvent != nullptr) {
1583c29fa5a6Sopenharmony_ci                    if (optind < argc) {
1584c29fa5a6Sopenharmony_ci                        std::cout << "non-option argv elements: ";
1585c29fa5a6Sopenharmony_ci                        while (optind < argc) {
1586c29fa5a6Sopenharmony_ci                            std::cout << argv[optind++] << "\t";
1587c29fa5a6Sopenharmony_ci                        }
1588c29fa5a6Sopenharmony_ci                        std::cout << std::endl;
1589c29fa5a6Sopenharmony_ci                        return EVENT_REG_FAIL;
1590c29fa5a6Sopenharmony_ci                    }
1591c29fa5a6Sopenharmony_ci                    if (state.empty()) {
1592c29fa5a6Sopenharmony_ci                        std::cout << "Injection failed" << std::endl;
1593c29fa5a6Sopenharmony_ci                        return EVENT_REG_FAIL;
1594c29fa5a6Sopenharmony_ci                    }
1595c29fa5a6Sopenharmony_ci                    for (const auto &it : state) {
1596c29fa5a6Sopenharmony_ci                        if (it.first == JOYSTICK_BUTTON_PRESS) {
1597c29fa5a6Sopenharmony_ci                            std::cout << "Press down " << it.second.buttonId <<std::endl;
1598c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_DOWN);
1599c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonId(it.second.buttonId);
1600c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(it.second.buttonId);
1601c29fa5a6Sopenharmony_ci                        } else if (it.first == JOYSTICK_BUTTON_UP) {
1602c29fa5a6Sopenharmony_ci                            std::cout << "Lift up button " << it.second.buttonId << std::endl;
1603c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_UP);
1604c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(it.second.buttonId);
1605c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonId(it.second.buttonId);
1606c29fa5a6Sopenharmony_ci                        } else if (it.first == JOYSTICK_MOVE) {
1607c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_AXIS_UPDATE);
1608c29fa5a6Sopenharmony_ci                            pointerEvent->SetAxisValue(it.second.absType, it.second.absValue);
1609c29fa5a6Sopenharmony_ci                        } else if (it.first == JOYSTICK_CLICK) {
1610c29fa5a6Sopenharmony_ci                            std::cout << "Click " << it.second.buttonId << std::endl;
1611c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonId(it.second.buttonId);
1612c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerId(0);
1613c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_DOWN);
1614c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(it.second.buttonId);
1615c29fa5a6Sopenharmony_ci                            pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_JOYSTICK);
1616c29fa5a6Sopenharmony_ci                            InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1617c29fa5a6Sopenharmony_ci
1618c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonPressed(it.second.buttonId);
1619c29fa5a6Sopenharmony_ci                            pointerEvent->SetButtonId(it.second.buttonId);
1620c29fa5a6Sopenharmony_ci                            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_BUTTON_UP);
1621c29fa5a6Sopenharmony_ci                        } else if (it.first == JOYSTICK_INTERVAL) {
1622c29fa5a6Sopenharmony_ci                            if ((MIN_TAKTTIME_MS > joyInfo.taktTime) || (MAX_TAKTTIME_MS < joyInfo.taktTime)) {
1623c29fa5a6Sopenharmony_ci                                std::cout << "TaktTime is out of range" << std::endl;
1624c29fa5a6Sopenharmony_ci                                return EVENT_REG_FAIL;
1625c29fa5a6Sopenharmony_ci                            }
1626c29fa5a6Sopenharmony_ci                            std::this_thread::sleep_for(std::chrono::milliseconds(joyInfo.taktTime));
1627c29fa5a6Sopenharmony_ci                            continue;
1628c29fa5a6Sopenharmony_ci                        }
1629c29fa5a6Sopenharmony_ci                        pointerEvent->SetPointerId(0);
1630c29fa5a6Sopenharmony_ci                        pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_JOYSTICK);
1631c29fa5a6Sopenharmony_ci                        InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1632c29fa5a6Sopenharmony_ci                    }
1633c29fa5a6Sopenharmony_ci                }
1634c29fa5a6Sopenharmony_ci                break;
1635c29fa5a6Sopenharmony_ci            }
1636c29fa5a6Sopenharmony_ci            case 'P': {
1637c29fa5a6Sopenharmony_ci                int32_t ret = ProcessTouchPadGestureInput(argc, argv, optionIndex);
1638c29fa5a6Sopenharmony_ci                if (ret != ERR_OK) {
1639c29fa5a6Sopenharmony_ci                    return ret;
1640c29fa5a6Sopenharmony_ci                }
1641c29fa5a6Sopenharmony_ci                break;
1642c29fa5a6Sopenharmony_ci            }
1643c29fa5a6Sopenharmony_ci            case '?': {
1644c29fa5a6Sopenharmony_ci                ShowUsage();
1645c29fa5a6Sopenharmony_ci                return ERR_OK;
1646c29fa5a6Sopenharmony_ci            }
1647c29fa5a6Sopenharmony_ci            default: {
1648c29fa5a6Sopenharmony_ci                std::cout << "invalid command" << std::endl;
1649c29fa5a6Sopenharmony_ci                ShowUsage();
1650c29fa5a6Sopenharmony_ci                return EVENT_REG_FAIL;
1651c29fa5a6Sopenharmony_ci            }
1652c29fa5a6Sopenharmony_ci        }
1653c29fa5a6Sopenharmony_ci    } else {
1654c29fa5a6Sopenharmony_ci        std::cout << "too few arguments to function" << std::endl;
1655c29fa5a6Sopenharmony_ci        ShowUsage();
1656c29fa5a6Sopenharmony_ci        return EVENT_REG_FAIL;
1657c29fa5a6Sopenharmony_ci    }
1658c29fa5a6Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(SLEEPTIME));
1659c29fa5a6Sopenharmony_ci    return ERR_OK;
1660c29fa5a6Sopenharmony_ci}
1661c29fa5a6Sopenharmony_ci
1662c29fa5a6Sopenharmony_cistruct SpecialChar {
1663c29fa5a6Sopenharmony_ci    int32_t keyCode = 0;
1664c29fa5a6Sopenharmony_ci    bool isPressShift = false;
1665c29fa5a6Sopenharmony_ci};
1666c29fa5a6Sopenharmony_ci
1667c29fa5a6Sopenharmony_ciconst std::map<char, SpecialChar> CHAR_TO_KEYCODE = {
1668c29fa5a6Sopenharmony_ci    { ' ',  { KeyEvent::KEYCODE_SPACE, false} },
1669c29fa5a6Sopenharmony_ci    { '!',  { KeyEvent::KEYCODE_1, true} },
1670c29fa5a6Sopenharmony_ci    { '\"', { KeyEvent::KEYCODE_APOSTROPHE, true} },
1671c29fa5a6Sopenharmony_ci    { '#',  { KeyEvent::KEYCODE_3, true} },
1672c29fa5a6Sopenharmony_ci    { '$',  { KeyEvent::KEYCODE_4, true} },
1673c29fa5a6Sopenharmony_ci    { '%',  { KeyEvent::KEYCODE_5, true} },
1674c29fa5a6Sopenharmony_ci    { '&',  { KeyEvent::KEYCODE_7, true} },
1675c29fa5a6Sopenharmony_ci    { '\'', { KeyEvent::KEYCODE_APOSTROPHE, false} },
1676c29fa5a6Sopenharmony_ci    { '(',  { KeyEvent::KEYCODE_9, true} },
1677c29fa5a6Sopenharmony_ci    { ')',  { KeyEvent::KEYCODE_0, true} },
1678c29fa5a6Sopenharmony_ci    { '*',  { KeyEvent::KEYCODE_8, true} },
1679c29fa5a6Sopenharmony_ci    { '+',  { KeyEvent::KEYCODE_EQUALS, true} },
1680c29fa5a6Sopenharmony_ci    { ',',  { KeyEvent::KEYCODE_COMMA, false} },
1681c29fa5a6Sopenharmony_ci    { '-',  { KeyEvent::KEYCODE_MINUS, false} },
1682c29fa5a6Sopenharmony_ci    { '.',  { KeyEvent::KEYCODE_PERIOD, false} },
1683c29fa5a6Sopenharmony_ci    { '/',  { KeyEvent::KEYCODE_SLASH, false} },
1684c29fa5a6Sopenharmony_ci    { ':',  { KeyEvent::KEYCODE_SEMICOLON, true} },
1685c29fa5a6Sopenharmony_ci    { ';',  { KeyEvent::KEYCODE_SEMICOLON, false} },
1686c29fa5a6Sopenharmony_ci    { '<',  { KeyEvent::KEYCODE_COMMA, true} },
1687c29fa5a6Sopenharmony_ci    { '=',  { KeyEvent::KEYCODE_EQUALS, false} },
1688c29fa5a6Sopenharmony_ci    { '>',  { KeyEvent::KEYCODE_PERIOD, true} },
1689c29fa5a6Sopenharmony_ci    { '?',  { KeyEvent::KEYCODE_SLASH, true} },
1690c29fa5a6Sopenharmony_ci    { '@',  { KeyEvent::KEYCODE_2, true} },
1691c29fa5a6Sopenharmony_ci    { '[',  { KeyEvent::KEYCODE_LEFT_BRACKET, false} },
1692c29fa5a6Sopenharmony_ci    { '\\', { KeyEvent::KEYCODE_BACKSLASH, false} },
1693c29fa5a6Sopenharmony_ci    { ']',  { KeyEvent::KEYCODE_RIGHT_BRACKET, false} },
1694c29fa5a6Sopenharmony_ci    { '^',  { KeyEvent::KEYCODE_6, true} },
1695c29fa5a6Sopenharmony_ci    { '_',  { KeyEvent::KEYCODE_MINUS, true} },
1696c29fa5a6Sopenharmony_ci    { '`',  { KeyEvent::KEYCODE_GRAVE, false} },
1697c29fa5a6Sopenharmony_ci    { '{',  { KeyEvent::KEYCODE_LEFT_BRACKET, true} },
1698c29fa5a6Sopenharmony_ci    { '|',  { KeyEvent::KEYCODE_BACKSLASH, true} },
1699c29fa5a6Sopenharmony_ci    { '}',  { KeyEvent::KEYCODE_RIGHT_BRACKET, true} },
1700c29fa5a6Sopenharmony_ci    { '~',  { KeyEvent::KEYCODE_GRAVE, true} },
1701c29fa5a6Sopenharmony_ci};
1702c29fa5a6Sopenharmony_ci
1703c29fa5a6Sopenharmony_cibool InputManagerCommand::IsSpecialChar(char character, int32_t &keyCode, bool &isPressShift)
1704c29fa5a6Sopenharmony_ci{
1705c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1706c29fa5a6Sopenharmony_ci    auto iter = CHAR_TO_KEYCODE.find(character);
1707c29fa5a6Sopenharmony_ci    if (iter == CHAR_TO_KEYCODE.end()) {
1708c29fa5a6Sopenharmony_ci        return false;
1709c29fa5a6Sopenharmony_ci    }
1710c29fa5a6Sopenharmony_ci    keyCode = iter->second.keyCode;
1711c29fa5a6Sopenharmony_ci    isPressShift = iter->second.isPressShift;
1712c29fa5a6Sopenharmony_ci    return true;
1713c29fa5a6Sopenharmony_ci}
1714c29fa5a6Sopenharmony_ci
1715c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::PrintKeyboardTextChar(int32_t keyCode, bool isPressShift)
1716c29fa5a6Sopenharmony_ci{
1717c29fa5a6Sopenharmony_ci    auto keyEvent = KeyEvent::Create();
1718c29fa5a6Sopenharmony_ci    if (keyEvent == nullptr) {
1719c29fa5a6Sopenharmony_ci        std::cout << "Failed to create input event object" << std::endl;
1720c29fa5a6Sopenharmony_ci        return RET_ERR;
1721c29fa5a6Sopenharmony_ci    }
1722c29fa5a6Sopenharmony_ci    KeyEvent::KeyItem item;
1723c29fa5a6Sopenharmony_ci
1724c29fa5a6Sopenharmony_ci    if (isPressShift) {
1725c29fa5a6Sopenharmony_ci        keyEvent->SetKeyCode(KeyEvent::KEYCODE_SHIFT_LEFT);
1726c29fa5a6Sopenharmony_ci        keyEvent->SetKeyAction(KeyEvent::KEY_ACTION_DOWN);
1727c29fa5a6Sopenharmony_ci        item.SetKeyCode(KeyEvent::KEYCODE_SHIFT_LEFT);
1728c29fa5a6Sopenharmony_ci        item.SetPressed(true);
1729c29fa5a6Sopenharmony_ci        keyEvent->AddKeyItem(item);
1730c29fa5a6Sopenharmony_ci        InputManager::GetInstance()->SimulateInputEvent(keyEvent);
1731c29fa5a6Sopenharmony_ci    }
1732c29fa5a6Sopenharmony_ci
1733c29fa5a6Sopenharmony_ci    keyEvent->SetKeyCode(keyCode);
1734c29fa5a6Sopenharmony_ci    keyEvent->SetKeyAction(KeyEvent::KEY_ACTION_DOWN);
1735c29fa5a6Sopenharmony_ci    item.SetKeyCode(keyCode);
1736c29fa5a6Sopenharmony_ci    item.SetPressed(true);
1737c29fa5a6Sopenharmony_ci    keyEvent->AddKeyItem(item);
1738c29fa5a6Sopenharmony_ci    InputManager::GetInstance()->SimulateInputEvent(keyEvent);
1739c29fa5a6Sopenharmony_ci
1740c29fa5a6Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(SLEEPTIME));
1741c29fa5a6Sopenharmony_ci
1742c29fa5a6Sopenharmony_ci    keyEvent->SetKeyAction(KeyEvent::KEY_ACTION_UP);
1743c29fa5a6Sopenharmony_ci    item.SetPressed(false);
1744c29fa5a6Sopenharmony_ci    keyEvent->AddKeyItem(item);
1745c29fa5a6Sopenharmony_ci    InputManager::GetInstance()->SimulateInputEvent(keyEvent);
1746c29fa5a6Sopenharmony_ci
1747c29fa5a6Sopenharmony_ci    if (isPressShift) {
1748c29fa5a6Sopenharmony_ci        keyEvent->SetKeyCode(KeyEvent::KEYCODE_SHIFT_LEFT);
1749c29fa5a6Sopenharmony_ci        keyEvent->SetKeyAction(KeyEvent::KEY_ACTION_UP);
1750c29fa5a6Sopenharmony_ci        item.SetKeyCode(KeyEvent::KEYCODE_SHIFT_LEFT);
1751c29fa5a6Sopenharmony_ci        item.SetPressed(false);
1752c29fa5a6Sopenharmony_ci        keyEvent->AddKeyItem(item);
1753c29fa5a6Sopenharmony_ci        InputManager::GetInstance()->SimulateInputEvent(keyEvent);
1754c29fa5a6Sopenharmony_ci    }
1755c29fa5a6Sopenharmony_ci    return RET_OK;
1756c29fa5a6Sopenharmony_ci}
1757c29fa5a6Sopenharmony_ci
1758c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::ProcessKeyboardTextInput(char *optarg, int32_t count)
1759c29fa5a6Sopenharmony_ci{
1760c29fa5a6Sopenharmony_ci    if (count != 0) { // Prompt when combining the text command after using other commands. Ex: "uinput -t text -t text"
1761c29fa5a6Sopenharmony_ci        std::cout << "The text command cannot be used with other commands." << std::endl;
1762c29fa5a6Sopenharmony_ci        return RET_ERR;
1763c29fa5a6Sopenharmony_ci    }
1764c29fa5a6Sopenharmony_ci    constexpr int32_t textMaxLen = 2000; // 2000: max number of ascii characters
1765c29fa5a6Sopenharmony_ci
1766c29fa5a6Sopenharmony_ci    int32_t len = strlen(optarg);
1767c29fa5a6Sopenharmony_ci    if (len <= 0) {
1768c29fa5a6Sopenharmony_ci        std::cout << "The input is empty." << std::endl;
1769c29fa5a6Sopenharmony_ci        return RET_ERR;
1770c29fa5a6Sopenharmony_ci    } else if (len > textMaxLen) {
1771c29fa5a6Sopenharmony_ci        std::cout << "The input text length is "<< len;
1772c29fa5a6Sopenharmony_ci        std::cout << ", and it is processed according to the maximum processing length of ";
1773c29fa5a6Sopenharmony_ci        std::cout << textMaxLen << " bytes." << std::endl;
1774c29fa5a6Sopenharmony_ci        len = textMaxLen;
1775c29fa5a6Sopenharmony_ci    }
1776c29fa5a6Sopenharmony_ci
1777c29fa5a6Sopenharmony_ci    char textChar = optarg[0];
1778c29fa5a6Sopenharmony_ci    bool isPressShift = false;
1779c29fa5a6Sopenharmony_ci    int32_t keyCode = -1;
1780c29fa5a6Sopenharmony_ci    for (int32_t i = 0; i < len; ++i) {
1781c29fa5a6Sopenharmony_ci        textChar = optarg[i];
1782c29fa5a6Sopenharmony_ci        if ((textChar >= '0') && (textChar <= '9')) {
1783c29fa5a6Sopenharmony_ci            isPressShift = false;
1784c29fa5a6Sopenharmony_ci            keyCode = textChar - '0' + KeyEvent::KEYCODE_0;
1785c29fa5a6Sopenharmony_ci        } else if ((textChar >= 'a') && (textChar <= 'z')) {
1786c29fa5a6Sopenharmony_ci            isPressShift = false;
1787c29fa5a6Sopenharmony_ci            keyCode = textChar - 'a' + KeyEvent::KEYCODE_A;
1788c29fa5a6Sopenharmony_ci        } else if ((textChar >= 'A') && (textChar <= 'Z')) {
1789c29fa5a6Sopenharmony_ci            isPressShift = true;
1790c29fa5a6Sopenharmony_ci            keyCode = textChar - 'A' + KeyEvent::KEYCODE_A;
1791c29fa5a6Sopenharmony_ci        } else if (!IsSpecialChar(textChar, keyCode, isPressShift)) {
1792c29fa5a6Sopenharmony_ci            std::cout << "The character of index  "<< i << " is invalid." << std::endl;
1793c29fa5a6Sopenharmony_ci            return RET_ERR;
1794c29fa5a6Sopenharmony_ci        }
1795c29fa5a6Sopenharmony_ci
1796c29fa5a6Sopenharmony_ci        if (PrintKeyboardTextChar(keyCode, isPressShift) == RET_ERR) {
1797c29fa5a6Sopenharmony_ci            return RET_ERR;
1798c29fa5a6Sopenharmony_ci        }
1799c29fa5a6Sopenharmony_ci    }
1800c29fa5a6Sopenharmony_ci    return RET_OK;
1801c29fa5a6Sopenharmony_ci}
1802c29fa5a6Sopenharmony_ci
1803c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::KnuckleGestureInputProcess(int32_t argc, char *argv[], int32_t c, int32_t optionIndex)
1804c29fa5a6Sopenharmony_ci{
1805c29fa5a6Sopenharmony_ci    struct option knuckleGestureSensorOptions[] = {
1806c29fa5a6Sopenharmony_ci        {"single_finger_double_click", required_argument, nullptr, 's'},
1807c29fa5a6Sopenharmony_ci        {"double_finger_double_click", required_argument, nullptr, 'd'},
1808c29fa5a6Sopenharmony_ci        {nullptr, 0, nullptr, 0}
1809c29fa5a6Sopenharmony_ci    };
1810c29fa5a6Sopenharmony_ci
1811c29fa5a6Sopenharmony_ci    while ((c = getopt_long(argc, argv, "s:d:", knuckleGestureSensorOptions, &optionIndex)) != -1) {
1812c29fa5a6Sopenharmony_ci        switch (c) {
1813c29fa5a6Sopenharmony_ci            case 's': {
1814c29fa5a6Sopenharmony_ci                SingleKnuckleGestureProcesser(argc, argv);
1815c29fa5a6Sopenharmony_ci                break;
1816c29fa5a6Sopenharmony_ci            }
1817c29fa5a6Sopenharmony_ci            case 'd': {
1818c29fa5a6Sopenharmony_ci                DoubleKnuckleGestureProcesser(argc, argv);
1819c29fa5a6Sopenharmony_ci                break;
1820c29fa5a6Sopenharmony_ci            }
1821c29fa5a6Sopenharmony_ci            default: {
1822c29fa5a6Sopenharmony_ci                std::cout << "invalid command" << std::endl;
1823c29fa5a6Sopenharmony_ci                ShowUsage();
1824c29fa5a6Sopenharmony_ci                return EVENT_REG_FAIL;
1825c29fa5a6Sopenharmony_ci            }
1826c29fa5a6Sopenharmony_ci        }
1827c29fa5a6Sopenharmony_ci    }
1828c29fa5a6Sopenharmony_ci    return ERR_OK;
1829c29fa5a6Sopenharmony_ci}
1830c29fa5a6Sopenharmony_ci
1831c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::SingleKnuckleGestureProcesser(int32_t argc, char *argv[])
1832c29fa5a6Sopenharmony_ci{
1833c29fa5a6Sopenharmony_ci    int32_t knuckleUinputArgc = 8;
1834c29fa5a6Sopenharmony_ci    int32_t intervalTimeMs = 0;
1835c29fa5a6Sopenharmony_ci    int32_t firstDownX = 0;
1836c29fa5a6Sopenharmony_ci    int32_t firstDownY = 0;
1837c29fa5a6Sopenharmony_ci    int32_t secondDownX = 0;
1838c29fa5a6Sopenharmony_ci    int32_t secondDownY = 0;
1839c29fa5a6Sopenharmony_ci    if (optind < 0 || optind > argc) {
1840c29fa5a6Sopenharmony_ci        std::cout << "wrong optind pointer index" << std::endl;
1841c29fa5a6Sopenharmony_ci        return EVENT_REG_FAIL;
1842c29fa5a6Sopenharmony_ci    }
1843c29fa5a6Sopenharmony_ci    if (argc == knuckleUinputArgc) {
1844c29fa5a6Sopenharmony_ci        if ((!StrToInt(optarg, firstDownX)) || !StrToInt(argv[optind], firstDownY) ||
1845c29fa5a6Sopenharmony_ci            !StrToInt(argv[optind + 1], secondDownX) || !StrToInt(argv[optind + TWO_MORE_COMMAND], secondDownY)) {
1846c29fa5a6Sopenharmony_ci            std::cout << "invalid coordinate value" << std::endl;
1847c29fa5a6Sopenharmony_ci            return EVENT_REG_FAIL;
1848c29fa5a6Sopenharmony_ci        }
1849c29fa5a6Sopenharmony_ci        intervalTimeMs = DEFAULT_DELAY;
1850c29fa5a6Sopenharmony_ci    } else if (argc == KNUCKLE_PARAM_SIZE) {
1851c29fa5a6Sopenharmony_ci        if ((!StrToInt(optarg, firstDownX)) || !StrToInt(argv[optind], firstDownY) ||
1852c29fa5a6Sopenharmony_ci            !StrToInt(argv[optind + 1], secondDownX) || !StrToInt(argv[optind + TWO_MORE_COMMAND], secondDownY) ||
1853c29fa5a6Sopenharmony_ci            !StrToInt(argv[optind + THREE_MORE_COMMAND], intervalTimeMs)) {
1854c29fa5a6Sopenharmony_ci            std::cout << "input coordinate or time error" << std::endl;
1855c29fa5a6Sopenharmony_ci            return RET_ERR;
1856c29fa5a6Sopenharmony_ci        }
1857c29fa5a6Sopenharmony_ci        const int64_t minIntervalTimeMs = 1;
1858c29fa5a6Sopenharmony_ci        const int64_t maxIntervalTimeMs = 250;
1859c29fa5a6Sopenharmony_ci        if ((minIntervalTimeMs > intervalTimeMs) || (maxIntervalTimeMs < intervalTimeMs)) {
1860c29fa5a6Sopenharmony_ci            std::cout << "interval time is out of range: " << minIntervalTimeMs << "ms";
1861c29fa5a6Sopenharmony_ci            std::cout << " < interval time < " << maxIntervalTimeMs << "ms" << std::endl;
1862c29fa5a6Sopenharmony_ci            return RET_ERR;
1863c29fa5a6Sopenharmony_ci        }
1864c29fa5a6Sopenharmony_ci    } else {
1865c29fa5a6Sopenharmony_ci        std::cout << "wrong number of parameters:" << argc << std::endl;
1866c29fa5a6Sopenharmony_ci        return EVENT_REG_FAIL;
1867c29fa5a6Sopenharmony_ci    }
1868c29fa5a6Sopenharmony_ci    if (IsCoordinateInvalid(firstDownX, firstDownY, secondDownX, secondDownY)) {
1869c29fa5a6Sopenharmony_ci        std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
1870c29fa5a6Sopenharmony_ci        return RET_ERR;
1871c29fa5a6Sopenharmony_ci    }
1872c29fa5a6Sopenharmony_ci    std::cout << "single knuckle first down coordinate: ("<< firstDownX << ", " << firstDownY << ")" << std::endl;
1873c29fa5a6Sopenharmony_ci    std::cout << "single knuckle second down coordinate: ("<< secondDownX << ", "  << secondDownY << ")" << std::endl;
1874c29fa5a6Sopenharmony_ci    std::cout << "single knuckle interval time: " << intervalTimeMs << "ms" << std::endl;
1875c29fa5a6Sopenharmony_ci    SingleKnuckleClickEvent(firstDownX, firstDownY);
1876c29fa5a6Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(intervalTimeMs));
1877c29fa5a6Sopenharmony_ci    SingleKnuckleClickEvent(secondDownX, secondDownY);
1878c29fa5a6Sopenharmony_ci    return ERR_OK;
1879c29fa5a6Sopenharmony_ci}
1880c29fa5a6Sopenharmony_ci
1881c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::DoubleKnuckleGestureProcesser(int32_t argc, char *argv[])
1882c29fa5a6Sopenharmony_ci{
1883c29fa5a6Sopenharmony_ci    int32_t knuckleUinputArgc = 8;
1884c29fa5a6Sopenharmony_ci    int32_t intervalTimeMs = 0;
1885c29fa5a6Sopenharmony_ci    int32_t firstDownX = 0;
1886c29fa5a6Sopenharmony_ci    int32_t firstDownY = 0;
1887c29fa5a6Sopenharmony_ci    int32_t secondDownX = 0;
1888c29fa5a6Sopenharmony_ci    int32_t secondDownY = 0;
1889c29fa5a6Sopenharmony_ci    if (optind < 0 || optind > argc) {
1890c29fa5a6Sopenharmony_ci        std::cout << "wrong optind pointer index" << std::endl;
1891c29fa5a6Sopenharmony_ci        return EVENT_REG_FAIL;
1892c29fa5a6Sopenharmony_ci    }
1893c29fa5a6Sopenharmony_ci    if (argc == knuckleUinputArgc) {
1894c29fa5a6Sopenharmony_ci        if (!StrToInt(optarg, firstDownX) || !StrToInt(argv[optind], firstDownY) ||
1895c29fa5a6Sopenharmony_ci            !StrToInt(argv[optind + 1], secondDownX) || !StrToInt(argv[optind + TWO_MORE_COMMAND], secondDownY)) {
1896c29fa5a6Sopenharmony_ci            std::cout << "invalid coordinate value" << std::endl;
1897c29fa5a6Sopenharmony_ci            return EVENT_REG_FAIL;
1898c29fa5a6Sopenharmony_ci        }
1899c29fa5a6Sopenharmony_ci        intervalTimeMs = DEFAULT_DELAY;
1900c29fa5a6Sopenharmony_ci    } else if (argc == KNUCKLE_PARAM_SIZE) {
1901c29fa5a6Sopenharmony_ci        if ((!StrToInt(optarg, firstDownX)) || !StrToInt(argv[optind], firstDownY) ||
1902c29fa5a6Sopenharmony_ci            !StrToInt(argv[optind + 1], secondDownX) || !StrToInt(argv[optind + TWO_MORE_COMMAND], secondDownY) ||
1903c29fa5a6Sopenharmony_ci            !StrToInt(argv[optind + THREE_MORE_COMMAND], intervalTimeMs)) {
1904c29fa5a6Sopenharmony_ci            std::cout << "input coordinate or time error" << std::endl;
1905c29fa5a6Sopenharmony_ci            return RET_ERR;
1906c29fa5a6Sopenharmony_ci        }
1907c29fa5a6Sopenharmony_ci        const int64_t minIntervalTimeMs = 1;
1908c29fa5a6Sopenharmony_ci        const int64_t maxIntervalTimeMs = 250;
1909c29fa5a6Sopenharmony_ci        if ((minIntervalTimeMs > intervalTimeMs) || (maxIntervalTimeMs < intervalTimeMs)) {
1910c29fa5a6Sopenharmony_ci            std::cout << "interval time is out of range: " << minIntervalTimeMs << "ms";
1911c29fa5a6Sopenharmony_ci            std::cout << " < interval time < " << maxIntervalTimeMs << "ms" << std::endl;
1912c29fa5a6Sopenharmony_ci            return RET_ERR;
1913c29fa5a6Sopenharmony_ci        }
1914c29fa5a6Sopenharmony_ci    } else {
1915c29fa5a6Sopenharmony_ci        std::cout << "wrong number of parameters: " << argc << std::endl;
1916c29fa5a6Sopenharmony_ci        return EVENT_REG_FAIL;
1917c29fa5a6Sopenharmony_ci    }
1918c29fa5a6Sopenharmony_ci    if (IsCoordinateInvalid(firstDownX, firstDownY, secondDownX, secondDownY)) {
1919c29fa5a6Sopenharmony_ci        std::cout << "Coordinate value must be greater or equal than 0" << std::endl;
1920c29fa5a6Sopenharmony_ci        return RET_ERR;
1921c29fa5a6Sopenharmony_ci    }
1922c29fa5a6Sopenharmony_ci    std::cout << "double knukle first click coordinate: ("<< firstDownX << ", "  << firstDownY << ")" << std::endl;
1923c29fa5a6Sopenharmony_ci    std::cout << "double knukle second click coordinate: ("<< secondDownX << ", "  << secondDownY << ")" << std::endl;
1924c29fa5a6Sopenharmony_ci    std::cout << "double knuckle interval time: " << intervalTimeMs << "ms" << std::endl;
1925c29fa5a6Sopenharmony_ci
1926c29fa5a6Sopenharmony_ci    DoubleKnuckleClickEvent(firstDownX, firstDownY);
1927c29fa5a6Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(intervalTimeMs));
1928c29fa5a6Sopenharmony_ci    DoubleKnuckleClickEvent(secondDownX, secondDownY);
1929c29fa5a6Sopenharmony_ci    return ERR_OK;
1930c29fa5a6Sopenharmony_ci}
1931c29fa5a6Sopenharmony_ci
1932c29fa5a6Sopenharmony_cibool InputManagerCommand::IsCoordinateInvalid(int32_t firstDownX, int32_t firstDownY, int32_t secondDownX,
1933c29fa5a6Sopenharmony_ci    int32_t secondDownY)
1934c29fa5a6Sopenharmony_ci{
1935c29fa5a6Sopenharmony_ci    return firstDownX < 0 || firstDownY < 0 || secondDownX < 0 || secondDownY < 0;
1936c29fa5a6Sopenharmony_ci}
1937c29fa5a6Sopenharmony_ci
1938c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::SingleKnuckleClickEvent(int32_t downX, int32_t downY)
1939c29fa5a6Sopenharmony_ci{
1940c29fa5a6Sopenharmony_ci    auto pointerEvent = PointerEvent::Create();
1941c29fa5a6Sopenharmony_ci    CHKPR(pointerEvent, ERROR_NULL_POINTER);
1942c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem item;
1943c29fa5a6Sopenharmony_ci    item.SetPointerId(0);
1944c29fa5a6Sopenharmony_ci    item.SetToolType(PointerEvent::TOOL_TYPE_KNUCKLE);
1945c29fa5a6Sopenharmony_ci    item.SetDisplayX(downX);
1946c29fa5a6Sopenharmony_ci    item.SetDisplayY(downY);
1947c29fa5a6Sopenharmony_ci    item.SetRawDisplayX(downX);
1948c29fa5a6Sopenharmony_ci    item.SetRawDisplayY(downY);
1949c29fa5a6Sopenharmony_ci    item.SetPressed(true);
1950c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerId(0);
1951c29fa5a6Sopenharmony_ci    pointerEvent->AddPointerItem(item);
1952c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN);
1953c29fa5a6Sopenharmony_ci    pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN);
1954c29fa5a6Sopenharmony_ci    InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1955c29fa5a6Sopenharmony_ci
1956c29fa5a6Sopenharmony_ci    item.SetPressed(false);
1957c29fa5a6Sopenharmony_ci    item.SetDisplayY(downY);
1958c29fa5a6Sopenharmony_ci    item.SetDisplayX(downX);
1959c29fa5a6Sopenharmony_ci    item.SetRawDisplayY(downY);
1960c29fa5a6Sopenharmony_ci    item.SetRawDisplayX(downX);
1961c29fa5a6Sopenharmony_ci    item.SetToolType(PointerEvent::TOOL_TYPE_KNUCKLE);
1962c29fa5a6Sopenharmony_ci    pointerEvent->UpdatePointerItem(0, item);
1963c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP);
1964c29fa5a6Sopenharmony_ci    InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1965c29fa5a6Sopenharmony_ci    return ERR_OK;
1966c29fa5a6Sopenharmony_ci}
1967c29fa5a6Sopenharmony_ci
1968c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::DoubleKnuckleClickEvent(int32_t downX, int32_t downY)
1969c29fa5a6Sopenharmony_ci{
1970c29fa5a6Sopenharmony_ci    auto pointerEvent = PointerEvent::Create();
1971c29fa5a6Sopenharmony_ci    CHKPR(pointerEvent, ERROR_NULL_POINTER);
1972c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem item;
1973c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem item2;
1974c29fa5a6Sopenharmony_ci    item.SetPointerId(0);
1975c29fa5a6Sopenharmony_ci    item.SetToolType(PointerEvent::TOOL_TYPE_KNUCKLE);
1976c29fa5a6Sopenharmony_ci    item.SetDisplayX(downX);
1977c29fa5a6Sopenharmony_ci    item.SetDisplayY(downY);
1978c29fa5a6Sopenharmony_ci    item.SetRawDisplayX(downX);
1979c29fa5a6Sopenharmony_ci    item.SetRawDisplayY(downY);
1980c29fa5a6Sopenharmony_ci    item.SetPressed(true);
1981c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerId(0);
1982c29fa5a6Sopenharmony_ci    pointerEvent->AddPointerItem(item);
1983c29fa5a6Sopenharmony_ci
1984c29fa5a6Sopenharmony_ci    item2.SetPointerId(1);
1985c29fa5a6Sopenharmony_ci    item2.SetToolType(PointerEvent::TOOL_TYPE_KNUCKLE);
1986c29fa5a6Sopenharmony_ci    item2.SetDisplayX(downX);
1987c29fa5a6Sopenharmony_ci    item2.SetDisplayY(downY);
1988c29fa5a6Sopenharmony_ci    item2.SetRawDisplayX(downX);
1989c29fa5a6Sopenharmony_ci    item2.SetRawDisplayY(downY);
1990c29fa5a6Sopenharmony_ci    item2.SetPressed(true);
1991c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerId(1);
1992c29fa5a6Sopenharmony_ci    pointerEvent->AddPointerItem(item2);
1993c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN);
1994c29fa5a6Sopenharmony_ci    pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN);
1995c29fa5a6Sopenharmony_ci    InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
1996c29fa5a6Sopenharmony_ci
1997c29fa5a6Sopenharmony_ci    item.SetPressed(false);
1998c29fa5a6Sopenharmony_ci    item.SetDisplayY(downY);
1999c29fa5a6Sopenharmony_ci    item.SetDisplayX(downX);
2000c29fa5a6Sopenharmony_ci    item.SetRawDisplayY(downY);
2001c29fa5a6Sopenharmony_ci    item.SetRawDisplayX(downX);
2002c29fa5a6Sopenharmony_ci    item.SetToolType(PointerEvent::TOOL_TYPE_KNUCKLE);
2003c29fa5a6Sopenharmony_ci    item2.SetPressed(false);
2004c29fa5a6Sopenharmony_ci    item2.SetDisplayY(downY);
2005c29fa5a6Sopenharmony_ci    item2.SetDisplayX(downX);
2006c29fa5a6Sopenharmony_ci    item2.SetRawDisplayY(downY);
2007c29fa5a6Sopenharmony_ci    item2.SetRawDisplayX(downX);
2008c29fa5a6Sopenharmony_ci    item2.SetToolType(PointerEvent::TOOL_TYPE_KNUCKLE);
2009c29fa5a6Sopenharmony_ci    pointerEvent->UpdatePointerItem(0, item);
2010c29fa5a6Sopenharmony_ci    pointerEvent->UpdatePointerItem(1, item2);
2011c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP);
2012c29fa5a6Sopenharmony_ci    InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
2013c29fa5a6Sopenharmony_ci    return ERR_OK;
2014c29fa5a6Sopenharmony_ci}
2015c29fa5a6Sopenharmony_ci
2016c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::ProcessTouchPadGestureInput(int32_t argc, char *argv[], int32_t optionIndex)
2017c29fa5a6Sopenharmony_ci{
2018c29fa5a6Sopenharmony_ci    struct option touchPadSensorOptions[] = {
2019c29fa5a6Sopenharmony_ci        {"rotate", required_argument, nullptr, 'r'},
2020c29fa5a6Sopenharmony_ci        {"swipe", required_argument, nullptr, 's'},
2021c29fa5a6Sopenharmony_ci        {"pinch", required_argument, nullptr, 'p'},
2022c29fa5a6Sopenharmony_ci        {nullptr, 0, nullptr, 0}
2023c29fa5a6Sopenharmony_ci    };
2024c29fa5a6Sopenharmony_ci    int32_t opt = 0;
2025c29fa5a6Sopenharmony_ci    if ((opt = getopt_long(argc, argv, "r:s:p:", touchPadSensorOptions, &optionIndex)) != -1) {
2026c29fa5a6Sopenharmony_ci        switch (opt) {
2027c29fa5a6Sopenharmony_ci            case 'r': {
2028c29fa5a6Sopenharmony_ci                int32_t ret = ProcessRotateGesture(argc, argv);
2029c29fa5a6Sopenharmony_ci                if (ret != ERR_OK) {
2030c29fa5a6Sopenharmony_ci                    return ret;
2031c29fa5a6Sopenharmony_ci                }
2032c29fa5a6Sopenharmony_ci                break;
2033c29fa5a6Sopenharmony_ci            }
2034c29fa5a6Sopenharmony_ci            case 's': {
2035c29fa5a6Sopenharmony_ci                int32_t ret = ProcessTouchPadFingerSwipe(argc, argv);
2036c29fa5a6Sopenharmony_ci                if (ret != ERR_OK) {
2037c29fa5a6Sopenharmony_ci                    return ret;
2038c29fa5a6Sopenharmony_ci                }
2039c29fa5a6Sopenharmony_ci                break;
2040c29fa5a6Sopenharmony_ci            }
2041c29fa5a6Sopenharmony_ci            case 'p': {
2042c29fa5a6Sopenharmony_ci                // uinput -P -p <finger count> <scale percent numerator> e.g. uinput -P -p 2 200
2043c29fa5a6Sopenharmony_ci                int32_t ret = ProcessPinchGesture(argc, argv);
2044c29fa5a6Sopenharmony_ci                if (ret != ERR_OK) {
2045c29fa5a6Sopenharmony_ci                    return ret;
2046c29fa5a6Sopenharmony_ci                }
2047c29fa5a6Sopenharmony_ci                break;
2048c29fa5a6Sopenharmony_ci            }
2049c29fa5a6Sopenharmony_ci            default: {
2050c29fa5a6Sopenharmony_ci                std::cout << "invalid command" << std::endl;
2051c29fa5a6Sopenharmony_ci                ShowUsage();
2052c29fa5a6Sopenharmony_ci                return EVENT_REG_FAIL;
2053c29fa5a6Sopenharmony_ci            }
2054c29fa5a6Sopenharmony_ci        }
2055c29fa5a6Sopenharmony_ci    }
2056c29fa5a6Sopenharmony_ci    return ERR_OK;
2057c29fa5a6Sopenharmony_ci}
2058c29fa5a6Sopenharmony_ci
2059c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::ProcessRotateGesture(int32_t argc, char *argv[])
2060c29fa5a6Sopenharmony_ci{
2061c29fa5a6Sopenharmony_ci    auto pointerEvent = PointerEvent::Create();
2062c29fa5a6Sopenharmony_ci    CHKPR(pointerEvent, ERROR_NULL_POINTER);
2063c29fa5a6Sopenharmony_ci    int32_t rotateValue = 0;
2064c29fa5a6Sopenharmony_ci    constexpr int32_t paramNum = 4;
2065c29fa5a6Sopenharmony_ci    constexpr int32_t conversionValue = 360;
2066c29fa5a6Sopenharmony_ci    if (argc == paramNum) {
2067c29fa5a6Sopenharmony_ci        if (!StrToInt(optarg, rotateValue)) {
2068c29fa5a6Sopenharmony_ci            std::cout << "Invalid angle data" << std::endl;
2069c29fa5a6Sopenharmony_ci            return RET_ERR;
2070c29fa5a6Sopenharmony_ci        }
2071c29fa5a6Sopenharmony_ci        if ((rotateValue >= conversionValue) || (rotateValue <= -(conversionValue))) {
2072c29fa5a6Sopenharmony_ci            std::cout << "Rotate value must be within (-360,360)" << std::endl;
2073c29fa5a6Sopenharmony_ci            return RET_ERR;
2074c29fa5a6Sopenharmony_ci        }
2075c29fa5a6Sopenharmony_ci        std::cout << "Input rotate value:"<<rotateValue << std::endl;
2076c29fa5a6Sopenharmony_ci        pointerEvent->SetAxisValue(PointerEvent::AXIS_TYPE_ROTATE, rotateValue);
2077c29fa5a6Sopenharmony_ci        pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_ROTATE_END);
2078c29fa5a6Sopenharmony_ci        pointerEvent->SetPointerId(0);
2079c29fa5a6Sopenharmony_ci        PointerEvent::PointerItem item;
2080c29fa5a6Sopenharmony_ci        item.SetPointerId(0);
2081c29fa5a6Sopenharmony_ci        pointerEvent->AddPointerItem(item);
2082c29fa5a6Sopenharmony_ci        pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHPAD);
2083c29fa5a6Sopenharmony_ci        InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
2084c29fa5a6Sopenharmony_ci    } else {
2085c29fa5a6Sopenharmony_ci        std::cout << "Invalid angle data,Input parameter example: uinput - P - r 45" << std::endl;
2086c29fa5a6Sopenharmony_ci        return RET_ERR;
2087c29fa5a6Sopenharmony_ci    }
2088c29fa5a6Sopenharmony_ci    return ERR_OK;
2089c29fa5a6Sopenharmony_ci}
2090c29fa5a6Sopenharmony_ci
2091c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::ProcessPinchGesture(int32_t argc, char *argv[])
2092c29fa5a6Sopenharmony_ci{
2093c29fa5a6Sopenharmony_ci    CHKPR(argv, ERROR_NULL_POINTER);
2094c29fa5a6Sopenharmony_ci    constexpr int32_t actionInputArgc = 6;
2095c29fa5a6Sopenharmony_ci    constexpr int32_t minScaleNumerator = 0;
2096c29fa5a6Sopenharmony_ci    constexpr int32_t maxScaleNumerator = 500;
2097c29fa5a6Sopenharmony_ci    constexpr int32_t hundred = 100;
2098c29fa5a6Sopenharmony_ci    constexpr int32_t fingerCount = 2;
2099c29fa5a6Sopenharmony_ci    int32_t centerX = 0;
2100c29fa5a6Sopenharmony_ci    int32_t centerY = 0;
2101c29fa5a6Sopenharmony_ci    int32_t scalePercentNumerator = 0;
2102c29fa5a6Sopenharmony_ci    std::string tips = "uinput -P -p dx, dy, scalePercent; dx, dy, scalePercent are all number.";
2103c29fa5a6Sopenharmony_ci    std::string extralTips = " dx is bigger than 0 and dy is bigger than 200. 0 < scalePercent < 500;";
2104c29fa5a6Sopenharmony_ci    if (optind < 0 || optind > argc) {
2105c29fa5a6Sopenharmony_ci        std::cout << "wrong optind pointer index" << std::endl;
2106c29fa5a6Sopenharmony_ci        std::cout << tips << extralTips << std::endl;
2107c29fa5a6Sopenharmony_ci        return RET_ERR;
2108c29fa5a6Sopenharmony_ci    }
2109c29fa5a6Sopenharmony_ci    int32_t startPos = optind - MOVE_POS_ONE;
2110c29fa5a6Sopenharmony_ci    if (argc == actionInputArgc) {
2111c29fa5a6Sopenharmony_ci        if ((!StrToInt(argv[startPos], centerX)) ||
2112c29fa5a6Sopenharmony_ci            (!StrToInt(argv[startPos + MOVE_POS_ONE], centerY)) ||
2113c29fa5a6Sopenharmony_ci            (!StrToInt(argv[startPos + MOVE_POS_TWO], scalePercentNumerator))) {
2114c29fa5a6Sopenharmony_ci            std::cout << tips << extralTips << std::endl;
2115c29fa5a6Sopenharmony_ci            return RET_ERR;
2116c29fa5a6Sopenharmony_ci        }
2117c29fa5a6Sopenharmony_ci    } else {
2118c29fa5a6Sopenharmony_ci        std::cout << tips << extralTips << std::endl;
2119c29fa5a6Sopenharmony_ci        return RET_ERR;
2120c29fa5a6Sopenharmony_ci    }
2121c29fa5a6Sopenharmony_ci    if ((scalePercentNumerator <= minScaleNumerator) || (scalePercentNumerator > maxScaleNumerator)) {
2122c29fa5a6Sopenharmony_ci        std::cout << "Invalid scale numberator:" << scalePercentNumerator << std::endl;
2123c29fa5a6Sopenharmony_ci        std::cout << tips << extralTips << std::endl;
2124c29fa5a6Sopenharmony_ci        return RET_ERR;
2125c29fa5a6Sopenharmony_ci    }
2126c29fa5a6Sopenharmony_ci    bool check = (centerX > 0) && (centerY >= hundred * fingerCount);
2127c29fa5a6Sopenharmony_ci    if (!check) {
2128c29fa5a6Sopenharmony_ci        std::cout << tips << extralTips << std::endl;
2129c29fa5a6Sopenharmony_ci        return RET_ERR;
2130c29fa5a6Sopenharmony_ci    }
2131c29fa5a6Sopenharmony_ci    return ActionPinchEvent(centerX, centerY, scalePercentNumerator);
2132c29fa5a6Sopenharmony_ci}
2133c29fa5a6Sopenharmony_ci
2134c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::SwipeActionEvent(int32_t startX, int32_t startY, int32_t endX, int32_t endY)
2135c29fa5a6Sopenharmony_ci{
2136c29fa5a6Sopenharmony_ci    constexpr int32_t fingerCount = 3;
2137c29fa5a6Sopenharmony_ci    constexpr int32_t times = 10;
2138c29fa5a6Sopenharmony_ci    constexpr int32_t thousand = 1000;
2139c29fa5a6Sopenharmony_ci    int32_t disY = static_cast<int32_t>(static_cast<double>(endY - startY) / times);
2140c29fa5a6Sopenharmony_ci    int32_t disX = static_cast<int32_t>(static_cast<double>(endX - startX) / times);
2141c29fa5a6Sopenharmony_ci    int32_t actionType[10] = {PointerEvent::POINTER_ACTION_SWIPE_BEGIN};
2142c29fa5a6Sopenharmony_ci    int64_t actionTimeBase = GetSysClockTime() - times * thousand * thousand;
2143c29fa5a6Sopenharmony_ci    int64_t actionTimeStartTimeDis = fingerCount * thousand;
2144c29fa5a6Sopenharmony_ci    int64_t actionStartTime[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2145c29fa5a6Sopenharmony_ci    int64_t actionTime[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2146c29fa5a6Sopenharmony_ci    int32_t sourceType = PointerEvent::SOURCE_TYPE_TOUCHPAD;
2147c29fa5a6Sopenharmony_ci    actionTime[0] = actionTimeBase;
2148c29fa5a6Sopenharmony_ci    actionStartTime[0] = (actionTimeBase - actionTimeStartTimeDis) / thousand;
2149c29fa5a6Sopenharmony_ci    for (int32_t i = 1; i < times; i++) {
2150c29fa5a6Sopenharmony_ci        actionStartTime[i] = actionStartTime[i - 1] + times - fingerCount;
2151c29fa5a6Sopenharmony_ci        actionTime[i] = actionTime[i - 1] + times - fingerCount;
2152c29fa5a6Sopenharmony_ci        actionType[i] = PointerEvent::POINTER_ACTION_SWIPE_UPDATE;
2153c29fa5a6Sopenharmony_ci    }
2154c29fa5a6Sopenharmony_ci    actionType[times - 1] = PointerEvent::POINTER_ACTION_SWIPE_END;
2155c29fa5a6Sopenharmony_ci    for (int32_t i = 0; i < times; i++) {
2156c29fa5a6Sopenharmony_ci        auto pointerEvent = CreateEvent(0, actionType[i], fingerCount - 1, sourceType, fingerCount);
2157c29fa5a6Sopenharmony_ci        CHKPR(pointerEvent, ERROR_NULL_POINTER);
2158c29fa5a6Sopenharmony_ci        pointerEvent->SetActionTime(actionTime[i]);
2159c29fa5a6Sopenharmony_ci        pointerEvent->SetActionStartTime(actionStartTime[i]);
2160c29fa5a6Sopenharmony_ci        PointerEvent::PointerItem item;
2161c29fa5a6Sopenharmony_ci        item.SetDownTime(pointerEvent->GetActionStartTime());
2162c29fa5a6Sopenharmony_ci        item.SetDisplayX(startX + disX * i);
2163c29fa5a6Sopenharmony_ci        item.SetDisplayY(startY + disY * i);
2164c29fa5a6Sopenharmony_ci        item.SetPointerId(0);
2165c29fa5a6Sopenharmony_ci        pointerEvent->SetSourceType(sourceType);
2166c29fa5a6Sopenharmony_ci        pointerEvent->AddPointerItem(item);
2167c29fa5a6Sopenharmony_ci        pointerEvent->AddPointerItem(item);
2168c29fa5a6Sopenharmony_ci        std::this_thread::sleep_for(std::chrono::microseconds(SLEEPTIME));
2169c29fa5a6Sopenharmony_ci        InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
2170c29fa5a6Sopenharmony_ci    }
2171c29fa5a6Sopenharmony_ci    return ERR_OK;
2172c29fa5a6Sopenharmony_ci}
2173c29fa5a6Sopenharmony_ci
2174c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::ProcessTouchPadFingerSwipe(int32_t argc, char *argv[])
2175c29fa5a6Sopenharmony_ci{
2176c29fa5a6Sopenharmony_ci    constexpr int32_t actionInputArgc = 7;
2177c29fa5a6Sopenharmony_ci    int32_t startX = 0;
2178c29fa5a6Sopenharmony_ci    int32_t startY = 0;
2179c29fa5a6Sopenharmony_ci    int32_t endX = 0;
2180c29fa5a6Sopenharmony_ci    int32_t endY = 0;
2181c29fa5a6Sopenharmony_ci    if (optind < 0 || optind > argc) {
2182c29fa5a6Sopenharmony_ci        std::cout << "wrong optind pointer index" << std::endl;
2183c29fa5a6Sopenharmony_ci        return RET_ERR;
2184c29fa5a6Sopenharmony_ci    }
2185c29fa5a6Sopenharmony_ci    int32_t startPos = optind - MOVE_POS_ONE;
2186c29fa5a6Sopenharmony_ci    std::string tip = "uinput -P -s startX, startY, endX, endY;";
2187c29fa5a6Sopenharmony_ci    std::string extralTip = "And startX, startY, endX, endY are all number which is bigger than 0;";
2188c29fa5a6Sopenharmony_ci    if (argc == actionInputArgc) {
2189c29fa5a6Sopenharmony_ci        if ((!StrToInt(argv[startPos], startX)) ||
2190c29fa5a6Sopenharmony_ci            (!StrToInt(argv[startPos + MOVE_POS_ONE], startY)) ||
2191c29fa5a6Sopenharmony_ci            (!StrToInt(argv[startPos + MOVE_POS_TWO], endX)) ||
2192c29fa5a6Sopenharmony_ci            (!StrToInt(argv[startPos + MOVE_POS_THREE], endY))) {
2193c29fa5a6Sopenharmony_ci            std::cout << tip << extralTip << std::endl;
2194c29fa5a6Sopenharmony_ci            return RET_ERR;
2195c29fa5a6Sopenharmony_ci        }
2196c29fa5a6Sopenharmony_ci    } else {
2197c29fa5a6Sopenharmony_ci        std::cout << tip << extralTip << std::endl;
2198c29fa5a6Sopenharmony_ci        return RET_ERR;
2199c29fa5a6Sopenharmony_ci    }
2200c29fa5a6Sopenharmony_ci    bool check = (startX > 0) && (endX > 0) && (startY > 0) && (endY > 0);
2201c29fa5a6Sopenharmony_ci    if (!check) {
2202c29fa5a6Sopenharmony_ci        std::cout << tip << extralTip << std::endl;
2203c29fa5a6Sopenharmony_ci        return RET_ERR;
2204c29fa5a6Sopenharmony_ci    }
2205c29fa5a6Sopenharmony_ci    return SwipeActionEvent(startX, startY, endX, endY);
2206c29fa5a6Sopenharmony_ci}
2207c29fa5a6Sopenharmony_ci
2208c29fa5a6Sopenharmony_cistd::shared_ptr<PointerEvent> InputManagerCommand::CreateEvent(
2209c29fa5a6Sopenharmony_ci    int32_t id,
2210c29fa5a6Sopenharmony_ci    int32_t type,
2211c29fa5a6Sopenharmony_ci    int32_t pointerId,
2212c29fa5a6Sopenharmony_ci    int32_t sourceType,
2213c29fa5a6Sopenharmony_ci    int32_t fingerCount)
2214c29fa5a6Sopenharmony_ci{
2215c29fa5a6Sopenharmony_ci    auto pointerEvent = PointerEvent::Create();
2216c29fa5a6Sopenharmony_ci    CHKPP(pointerEvent);
2217c29fa5a6Sopenharmony_ci    pointerEvent->SetId(id);
2218c29fa5a6Sopenharmony_ci    pointerEvent->SetOriginPointerAction(type);
2219c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerAction(type);
2220c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerId(pointerId);
2221c29fa5a6Sopenharmony_ci    pointerEvent->SetSourceType(sourceType);
2222c29fa5a6Sopenharmony_ci    pointerEvent->SetFingerCount(fingerCount);
2223c29fa5a6Sopenharmony_ci    return pointerEvent;
2224c29fa5a6Sopenharmony_ci}
2225c29fa5a6Sopenharmony_ci
2226c29fa5a6Sopenharmony_civoid InputManagerCommand::FillPointerItem(
2227c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem &item,
2228c29fa5a6Sopenharmony_ci    int32_t pointX,
2229c29fa5a6Sopenharmony_ci    int32_t pointY,
2230c29fa5a6Sopenharmony_ci    int32_t id,
2231c29fa5a6Sopenharmony_ci    bool press)
2232c29fa5a6Sopenharmony_ci{
2233c29fa5a6Sopenharmony_ci    item.SetDisplayX(pointX);
2234c29fa5a6Sopenharmony_ci    item.SetDisplayY(pointY);
2235c29fa5a6Sopenharmony_ci    item.SetWindowX(pointX);
2236c29fa5a6Sopenharmony_ci    item.SetWindowY(pointY);
2237c29fa5a6Sopenharmony_ci    item.SetPointerId(id);
2238c29fa5a6Sopenharmony_ci    item.SetPressed(press);
2239c29fa5a6Sopenharmony_ci}
2240c29fa5a6Sopenharmony_ci
2241c29fa5a6Sopenharmony_ciint32_t InputManagerCommand::ActionPinchEvent(int32_t centerX, int32_t centerY, int32_t scalePercentNumerator)
2242c29fa5a6Sopenharmony_ci{
2243c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2244c29fa5a6Sopenharmony_ci    constexpr int32_t hundred = 100;
2245c29fa5a6Sopenharmony_ci    constexpr int32_t fingerCount = 2;
2246c29fa5a6Sopenharmony_ci    constexpr int32_t idSecondItem = 1;
2247c29fa5a6Sopenharmony_ci    int32_t timesForSleep = hundred * hundred;
2248c29fa5a6Sopenharmony_ci    int32_t distance = 0;
2249c29fa5a6Sopenharmony_ci    int32_t times = hundred / (fingerCount * fingerCount * fingerCount);
2250c29fa5a6Sopenharmony_ci    int32_t topX = centerX;
2251c29fa5a6Sopenharmony_ci    int32_t bottomX = centerX;
2252c29fa5a6Sopenharmony_ci    int32_t stepY = 0;
2253c29fa5a6Sopenharmony_ci    int32_t actionType = PointerEvent::POINTER_ACTION_AXIS_BEGIN;
2254c29fa5a6Sopenharmony_ci    double scalePinch = 1.0;
2255c29fa5a6Sopenharmony_ci    if (scalePercentNumerator > hundred) {
2256c29fa5a6Sopenharmony_ci        distance = hundred / fingerCount;
2257c29fa5a6Sopenharmony_ci        stepY = 0 - (distance / (fingerCount * times));
2258c29fa5a6Sopenharmony_ci    } else {
2259c29fa5a6Sopenharmony_ci        distance = hundred * fingerCount;
2260c29fa5a6Sopenharmony_ci        stepY = distance / (fingerCount * times);
2261c29fa5a6Sopenharmony_ci    }
2262c29fa5a6Sopenharmony_ci    int32_t topY = centerY - distance;
2263c29fa5a6Sopenharmony_ci    int32_t bottomY = centerY + distance;
2264c29fa5a6Sopenharmony_ci    double scalePinchChange = ((static_cast<double>(scalePercentNumerator) / hundred) - 1) / (times - 1);
2265c29fa5a6Sopenharmony_ci    SendTouchDownForPinch(topX, topY, bottomX, bottomY);
2266c29fa5a6Sopenharmony_ci    for (int32_t index = 0; index < times; index++) {
2267c29fa5a6Sopenharmony_ci        if (index != 0) {
2268c29fa5a6Sopenharmony_ci            actionType = PointerEvent::POINTER_ACTION_AXIS_UPDATE;
2269c29fa5a6Sopenharmony_ci            scalePinch = scalePinch + scalePinchChange;
2270c29fa5a6Sopenharmony_ci        }
2271c29fa5a6Sopenharmony_ci        auto pointerEvent = CreateEvent(0, actionType, 0, PointerEvent::SOURCE_TYPE_TOUCHPAD, fingerCount);
2272c29fa5a6Sopenharmony_ci        CHKPR(pointerEvent, ERROR_NULL_POINTER);
2273c29fa5a6Sopenharmony_ci        pointerEvent->SetAxisValue(PointerEvent::AXIS_TYPE_PINCH, scalePinch);
2274c29fa5a6Sopenharmony_ci        PointerEvent::PointerItem itemFirst;
2275c29fa5a6Sopenharmony_ci        topY = topY + stepY;
2276c29fa5a6Sopenharmony_ci        bottomY = bottomY - stepY;
2277c29fa5a6Sopenharmony_ci        FillPointerItem(itemFirst, topX, topY, 0, false);
2278c29fa5a6Sopenharmony_ci        itemFirst.SetToolType(PointerEvent::TOOL_TYPE_TOUCHPAD);
2279c29fa5a6Sopenharmony_ci        itemFirst.SetDownTime(pointerEvent->GetActionStartTime());
2280c29fa5a6Sopenharmony_ci        pointerEvent->AddPointerItem(itemFirst);
2281c29fa5a6Sopenharmony_ci        PointerEvent::PointerItem itemSecond;
2282c29fa5a6Sopenharmony_ci        FillPointerItem(itemSecond, bottomX, bottomY, idSecondItem, true);
2283c29fa5a6Sopenharmony_ci        pointerEvent->SetPointerId(idSecondItem);
2284c29fa5a6Sopenharmony_ci        pointerEvent->AddPointerItem(itemSecond);
2285c29fa5a6Sopenharmony_ci        InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
2286c29fa5a6Sopenharmony_ci        std::this_thread::sleep_for(std::chrono::microseconds(SLEEPTIME * timesForSleep));
2287c29fa5a6Sopenharmony_ci    }
2288c29fa5a6Sopenharmony_ci    return RET_OK;
2289c29fa5a6Sopenharmony_ci}
2290c29fa5a6Sopenharmony_ci
2291c29fa5a6Sopenharmony_civoid InputManagerCommand::SendTouchDownForPinch(int32_t topX, int32_t topY, int32_t bottomX, int32_t bottomY)
2292c29fa5a6Sopenharmony_ci{
2293c29fa5a6Sopenharmony_ci    constexpr int32_t fingerCount = 2;
2294c29fa5a6Sopenharmony_ci    int32_t itemId = 0;
2295c29fa5a6Sopenharmony_ci    auto pointerEvent = CreateEvent(0, PointerEvent::POINTER_ACTION_DOWN, 0,
2296c29fa5a6Sopenharmony_ci        PointerEvent::SOURCE_TYPE_TOUCHPAD, fingerCount);
2297c29fa5a6Sopenharmony_ci    CHKPV(pointerEvent);
2298c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerId(itemId);
2299c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem itemFirst;
2300c29fa5a6Sopenharmony_ci    FillPointerItem(itemFirst, topX, topY, itemId, true);
2301c29fa5a6Sopenharmony_ci    itemFirst.SetToolType(PointerEvent::TOOL_TYPE_MOUSE);
2302c29fa5a6Sopenharmony_ci    pointerEvent->AddPointerItem(itemFirst);
2303c29fa5a6Sopenharmony_ci    InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
2304c29fa5a6Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::microseconds(SLEEPTIME));
2305c29fa5a6Sopenharmony_ci    pointerEvent = CreateEvent(0, PointerEvent::POINTER_ACTION_DOWN, 0,
2306c29fa5a6Sopenharmony_ci        PointerEvent::SOURCE_TYPE_TOUCHPAD, fingerCount);
2307c29fa5a6Sopenharmony_ci    CHKPV(pointerEvent);
2308c29fa5a6Sopenharmony_ci    itemId = itemId + 1;
2309c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerId(itemId);
2310c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem itemSecond;
2311c29fa5a6Sopenharmony_ci    FillPointerItem(itemSecond, bottomX, bottomY, itemId, true);
2312c29fa5a6Sopenharmony_ci    pointerEvent->AddPointerItem(itemFirst);
2313c29fa5a6Sopenharmony_ci    pointerEvent->AddPointerItem(itemSecond);
2314c29fa5a6Sopenharmony_ci    InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
2315c29fa5a6Sopenharmony_ci}
2316c29fa5a6Sopenharmony_ci
2317c29fa5a6Sopenharmony_civoid InputManagerCommand::PrintMouseUsage()
2318c29fa5a6Sopenharmony_ci{
2319c29fa5a6Sopenharmony_ci    std::cout << "-m <dx> <dy>              --move   <dx> <dy>  -move to relative position (dx,dy),"    << std::endl;
2320c29fa5a6Sopenharmony_ci    std::cout << "   <dx1> <dy1> <dx2> <dy2> [smooth time] --trace -dx1 dy1 to dx2 dy2 smooth movement" << std::endl;
2321c29fa5a6Sopenharmony_ci    std::cout << "-d <key>                  --down   key        -press down a button, "                 << std::endl;
2322c29fa5a6Sopenharmony_ci    std::cout << "                                               0 is the left button, 1 is the right," << std::endl;
2323c29fa5a6Sopenharmony_ci    std::cout << "                                               2 is the middle"   << std::endl;
2324c29fa5a6Sopenharmony_ci    std::cout << "-u <key>                  --up     <key>      -release a button " << std::endl;
2325c29fa5a6Sopenharmony_ci    std::cout << "-c <key>                  --click  <key>      -press the left button down,then raise" << std::endl;
2326c29fa5a6Sopenharmony_ci    std::cout << "-b <dx1> <dy1> <id> [press time] [click interval time]                --double click" << std::endl;
2327c29fa5a6Sopenharmony_ci    std::cout << "  [press time] the time range is more than 1ms but less than 300ms, "       << std::endl;
2328c29fa5a6Sopenharmony_ci    std::cout << "  [click interval time] the time range is more than 1ms but less than 450ms, " << std::endl;
2329c29fa5a6Sopenharmony_ci    std::cout << "  Otherwise the operation result may produce error or invalid operation"       << std::endl;
2330c29fa5a6Sopenharmony_ci    std::cout << " -press the left button down,then raise" << std::endl;
2331c29fa5a6Sopenharmony_ci    std::cout << "   key value:0 - button left"     << std::endl;
2332c29fa5a6Sopenharmony_ci    std::cout << "   key value:1 - button right"    << std::endl;
2333c29fa5a6Sopenharmony_ci    std::cout << "   key value:2 - button middle"   << std::endl;
2334c29fa5a6Sopenharmony_ci    std::cout << "   key value:3 - button side"     << std::endl;
2335c29fa5a6Sopenharmony_ci    std::cout << "   key value:4 - button extra"    << std::endl;
2336c29fa5a6Sopenharmony_ci    std::cout << "   key value:5 - button forward"  << std::endl;
2337c29fa5a6Sopenharmony_ci    std::cout << "   key value:6 - button back"     << std::endl;
2338c29fa5a6Sopenharmony_ci    std::cout << "   key value:7 - button task"     << std::endl;
2339c29fa5a6Sopenharmony_ci    std::cout << "-s <key>                  --scroll <key>      -positive values are sliding backwards" << std::endl;
2340c29fa5a6Sopenharmony_ci    std::cout << "-g <dx1> <dy1> <dx2> <dy2> [total time]       --drag <dx1> <dy1> <dx2> <dy2> [total time],";
2341c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2342c29fa5a6Sopenharmony_ci    std::cout << "                                              dx1 dy1 to dx2 dy2 smooth drag"         << std::endl;
2343c29fa5a6Sopenharmony_ci    std::cout << "-i <time>                 --interval <time>   -the program interval for the (time) milliseconds";
2344c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2345c29fa5a6Sopenharmony_ci    std::cout << "                                               negative values are sliding forwards"  << std::endl;
2346c29fa5a6Sopenharmony_ci}
2347c29fa5a6Sopenharmony_ci
2348c29fa5a6Sopenharmony_civoid InputManagerCommand::PrintKeyboardUsage()
2349c29fa5a6Sopenharmony_ci{
2350c29fa5a6Sopenharmony_ci    std::cout << "-d <key>                   --down   <key>     -press down a key" << std::endl;
2351c29fa5a6Sopenharmony_ci    std::cout << "-u <key>                   --up     <key>     -release a key   " << std::endl;
2352c29fa5a6Sopenharmony_ci    std::cout << "-l <key> [long press time] --long_press <key> [long press time] -press and hold the key";
2353c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2354c29fa5a6Sopenharmony_ci    std::cout << "-r <key> [repeat output time] --repeat output <key> [repeat output time] -press and hold the key";
2355c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2356c29fa5a6Sopenharmony_ci    std::cout << "-i <time>                  --interval <time>  -the program interval for the (time) milliseconds";
2357c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2358c29fa5a6Sopenharmony_ci    std::cout << "-t <text>                  --text <text>      -input text content. ";
2359c29fa5a6Sopenharmony_ci    std::cout << "The text command cannot be used with other commands." << std::endl;
2360c29fa5a6Sopenharmony_ci}
2361c29fa5a6Sopenharmony_ci
2362c29fa5a6Sopenharmony_civoid InputManagerCommand::PrintStylusUsage()
2363c29fa5a6Sopenharmony_ci{
2364c29fa5a6Sopenharmony_ci    std::cout << "-d <dx1> <dy1>             --down   <dx1> <dy1> -press down a position  dx1 dy1, " << std::endl;
2365c29fa5a6Sopenharmony_ci    std::cout << "-u <dx1> <dy1>             --up     <dx1> <dy1> -release a position dx1 dy1, "     << std::endl;
2366c29fa5a6Sopenharmony_ci    std::cout << "-i <time>                  --interval <time>  -the program interval for the (time) milliseconds";
2367c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2368c29fa5a6Sopenharmony_ci    std::cout << "-m <dx1> <dy1> <dx2> <dy2> [smooth time]      --smooth movement"   << std::endl;
2369c29fa5a6Sopenharmony_ci    std::cout << "   <dx1> <dy1> <dx2> <dy2> [smooth time]      -smooth movement, "  << std::endl;
2370c29fa5a6Sopenharmony_ci    std::cout << "                                              dx1 dy1 to dx2 dy2 smooth movement"  << std::endl;
2371c29fa5a6Sopenharmony_ci    std::cout << "-c <dx1> <dy1> [click interval]               -touch screen click dx1 dy1"         << std::endl;
2372c29fa5a6Sopenharmony_ci    std::cout << "-g <dx1> <dy1> <dx2> <dy2> [press time] [total time]     -drag, "                       << std::endl;
2373c29fa5a6Sopenharmony_ci    std::cout << "  [Press time] not less than 500ms and [total time] - [Press time] not less than 500ms" << std::endl;
2374c29fa5a6Sopenharmony_ci    std::cout << "  Otherwise the operation result may produce error or invalid operation"                << std::endl;
2375c29fa5a6Sopenharmony_ci}
2376c29fa5a6Sopenharmony_ci
2377c29fa5a6Sopenharmony_civoid InputManagerCommand::PrintTouchUsage()
2378c29fa5a6Sopenharmony_ci{
2379c29fa5a6Sopenharmony_ci    std::cout << "-d <dx1> <dy1>             --down   <dx1> <dy1> -press down a position  dx1 dy1, " << std::endl;
2380c29fa5a6Sopenharmony_ci    std::cout << "-u <dx1> <dy1>             --up     <dx1> <dy1> -release a position dx1 dy1, "     << std::endl;
2381c29fa5a6Sopenharmony_ci    std::cout << "-i <time>                  --interval <time>  -the program interval for the (time) milliseconds";
2382c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2383c29fa5a6Sopenharmony_ci    std::cout << "-m <dx1> <dy1> <dx2> <dy2> [-k keep time] [smooth time]      --smooth movement, keep time:keep time";
2384c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2385c29fa5a6Sopenharmony_ci    std::cout << "                                                             after moving, the max value is 60000 ";
2386c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2387c29fa5a6Sopenharmony_ci    std::cout << "                                                             ms, default value is 0; smooth time:";
2388c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2389c29fa5a6Sopenharmony_ci    std::cout << "                                                             move time, default value is 1000 ms,";
2390c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2391c29fa5a6Sopenharmony_ci    std::cout << "                                                             the max value is 15000 ms";
2392c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2393c29fa5a6Sopenharmony_ci    std::cout << "   Supports up to three finger movement at the same time, for example:" << std::endl;
2394c29fa5a6Sopenharmony_ci    std::cout << "   uinput -T -m 300 900 600 900 900 900 600 900, (300, 900) move to (600, 900), (900, 900) move to";
2395c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2396c29fa5a6Sopenharmony_ci    std::cout << "   (600, 900)" << std::endl;
2397c29fa5a6Sopenharmony_ci    std::cout << "-c <dx1> <dy1> [click interval]               -touch screen click dx1 dy1"         << std::endl;
2398c29fa5a6Sopenharmony_ci    std::cout << "-k --knuckle                                                  " << std::endl;
2399c29fa5a6Sopenharmony_ci    std::cout << "commands for knucle:                                          " << std::endl;
2400c29fa5a6Sopenharmony_ci    PrintKnuckleUsage();
2401c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2402c29fa5a6Sopenharmony_ci    std::cout << "-g <dx1> <dy1> <dx2> <dy2> [press time] [total time]     -drag, "                       << std::endl;
2403c29fa5a6Sopenharmony_ci    std::cout << "  [Press time] not less than 500ms and [total time] - [Press time] not less than 500ms" << std::endl;
2404c29fa5a6Sopenharmony_ci    std::cout << "  Otherwise the operation result may produce error or invalid operation"                << std::endl;
2405c29fa5a6Sopenharmony_ci}
2406c29fa5a6Sopenharmony_ci
2407c29fa5a6Sopenharmony_civoid InputManagerCommand::PrintKnuckleUsage()
2408c29fa5a6Sopenharmony_ci{
2409c29fa5a6Sopenharmony_ci    std::cout << "-s <dx1> <dy1> <dx2> <dy2> [interval time]  --single knuckle double click interval time" << std::endl;
2410c29fa5a6Sopenharmony_ci    std::cout << "-d <dx1> <dy1> <dx2> <dy2> [interval time]  --double knuckle double click interval time" << std::endl;
2411c29fa5a6Sopenharmony_ci    std::cout << "-i <time>                  --interval <time>  -the program interval for the (time) milliseconds";
2412c29fa5a6Sopenharmony_ci}
2413c29fa5a6Sopenharmony_ci
2414c29fa5a6Sopenharmony_civoid InputManagerCommand::PrintTouchPadUsage()
2415c29fa5a6Sopenharmony_ci{
2416c29fa5a6Sopenharmony_ci    std::cout << "-p dx, dy, scalePercent; dx, dy, scalePercent are all number."                    << std::endl;
2417c29fa5a6Sopenharmony_ci    std::cout << "dx is bigger than 0 and dy is bigger than 200. 0 < scalePercent < 500;"           << std::endl;
2418c29fa5a6Sopenharmony_ci    std::cout << "While simulate this, make sure that a picture is on the top of the desktop."      << std::endl;
2419c29fa5a6Sopenharmony_ci    std::cout << "-s startX, startY, endX, endY;"                                                   << std::endl;
2420c29fa5a6Sopenharmony_ci    std::cout << "And startX, startY, endX, endY are all number which is bigger than 0;"            << std::endl;
2421c29fa5a6Sopenharmony_ci    std::cout << "While simulate this, make sure that your actual action is available"              << std::endl;
2422c29fa5a6Sopenharmony_ci    std::cout << "-r <rotate value> rotate value must be within (-360,360)"                         << std::endl;
2423c29fa5a6Sopenharmony_ci}
2424c29fa5a6Sopenharmony_ci
2425c29fa5a6Sopenharmony_civoid InputManagerCommand::ShowUsage()
2426c29fa5a6Sopenharmony_ci{
2427c29fa5a6Sopenharmony_ci    std::cout << "Usage: uinput <option> <command> <arg>..." << std::endl;
2428c29fa5a6Sopenharmony_ci    std::cout << "The option are:                                " << std::endl;
2429c29fa5a6Sopenharmony_ci    std::cout << "-K  --keyboard                                                " << std::endl;
2430c29fa5a6Sopenharmony_ci    std::cout << "commands for keyboard:                                        " << std::endl;
2431c29fa5a6Sopenharmony_ci    PrintKeyboardUsage();
2432c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2433c29fa5a6Sopenharmony_ci
2434c29fa5a6Sopenharmony_ci    std::cout << "-M  --mouse                                    " << std::endl;
2435c29fa5a6Sopenharmony_ci    std::cout << "commands for mouse:                            " << std::endl;
2436c29fa5a6Sopenharmony_ci    PrintMouseUsage();
2437c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2438c29fa5a6Sopenharmony_ci
2439c29fa5a6Sopenharmony_ci    std::cout << "-P  --touchpad                                                " << std::endl;
2440c29fa5a6Sopenharmony_ci    std::cout << "commands for touchpad:                                        " << std::endl;
2441c29fa5a6Sopenharmony_ci    PrintTouchPadUsage();
2442c29fa5a6Sopenharmony_ci
2443c29fa5a6Sopenharmony_ci    std::cout << "-S  --stylus                                                   " << std::endl;
2444c29fa5a6Sopenharmony_ci    std::cout << "commands for stylus:                                           " << std::endl;
2445c29fa5a6Sopenharmony_ci    PrintStylusUsage();
2446c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2447c29fa5a6Sopenharmony_ci
2448c29fa5a6Sopenharmony_ci    std::cout << "-T  --touch                                                   " << std::endl;
2449c29fa5a6Sopenharmony_ci    std::cout << "commands for touch:                                           " << std::endl;
2450c29fa5a6Sopenharmony_ci    PrintTouchUsage();
2451c29fa5a6Sopenharmony_ci    std::cout << std::endl;
2452c29fa5a6Sopenharmony_ci
2453c29fa5a6Sopenharmony_ci    std::cout << "                                                              " << std::endl;
2454c29fa5a6Sopenharmony_ci    std::cout << "-?  --help                                                    " << std::endl;
2455c29fa5a6Sopenharmony_ci}
2456c29fa5a6Sopenharmony_ci} // namespace MMI
2457c29fa5a6Sopenharmony_ci} // namespace OHOS