1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "virtual_keyboard.h"
17
18 #include <cmath>
19
20 #include <linux/input.h>
21
22 #include "input_manager.h"
23
24 #include "devicestatus_define.h"
25 #include "fi_log.h"
26 #include "virtual_keyboard_builder.h"
27
28 #undef LOG_TAG
29 #define LOG_TAG "VirtualKeyboard"
30
31 namespace OHOS {
32 namespace Msdp {
33 namespace DeviceStatus {
34 namespace {
35 constexpr int32_t MINIMUM_INTERVAL { 8 };
36 } // namespace
37
38 std::shared_ptr<VirtualKeyboard> VirtualKeyboard::device_ { nullptr };
39
GetDevice()40 std::shared_ptr<VirtualKeyboard>VirtualKeyboard::GetDevice()
41 {
42 if (device_ == nullptr) {
43 std::string node;
44 if (VirtualDevice::FindDeviceNode(VirtualKeyboardBuilder::GetDeviceName(), node)) {
45 auto vKeyboard = std::make_shared<VirtualKeyboard>(node);
46 CHKPP(vKeyboard);
47 if (vKeyboard->IsActive()) {
48 device_ = vKeyboard;
49 }
50 }
51 }
52 return device_;
53 }
54
VirtualKeyboard(const std::string & name)55 VirtualKeyboard::VirtualKeyboard(const std::string &name)
56 : VirtualDevice(name)
57 {
58 VirtualDevice::SetMinimumInterval(MINIMUM_INTERVAL);
59 }
60
Down(int32_t key)61 int32_t VirtualKeyboard::Down(int32_t key)
62 {
63 CALL_DEBUG_ENTER;
64 if (!SupportKey(key)) {
65 FI_HILOGE("Unsupported key code:%{public}d", key);
66 return RET_ERR;
67 }
68
69 SendEvent(EV_MSC, MSC_SCAN, OBFUSCATED);
70 SendEvent(EV_KEY, key, DOWN_VALUE);
71 SendEvent(EV_SYN, SYN_REPORT, SYNC_VALUE);
72 return RET_OK;
73 }
74
Up(int32_t key)75 int32_t VirtualKeyboard::Up(int32_t key)
76 {
77 CALL_DEBUG_ENTER;
78 if (!SupportKey(key)) {
79 FI_HILOGE("Unsupported key code:%{public}d", key);
80 return RET_ERR;
81 }
82
83 SendEvent(EV_MSC, MSC_SCAN, OBFUSCATED);
84 SendEvent(EV_KEY, key, UP_VALUE);
85 SendEvent(EV_SYN, SYN_REPORT, SYNC_VALUE);
86 return RET_OK;
87 }
88 } // namespace DeviceStatus
89 } // namespace Msdp
90 } // namespace OHOS