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 ¤tTimeMs) 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