Android-cuttlefish cvd tool
input_devices.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <atomic>
20#include <cstdint>
21#include <cstdlib>
22#include <map>
23#include <mutex>
24#include <utility>
25#include <vector>
26
31
32namespace cuttlefish {
33
35 public:
37 virtual ~InputDevice() = default;
38
39 protected:
41
42 private:
44};
45
46class TouchDevice : public InputDevice {
47 public:
49 : InputDevice(conn) {}
50
51 Result<void> SendTouchEvent(int x, int y, bool down);
52
53 Result<void> SendMultiTouchEvent(const std::vector<MultitouchSlot>& slots,
54 bool down);
55
56 // The InputConnector holds state of on-going touch contacts. Event sources
57 // that can't produce multi touch events should call this function when it's
58 // known they won't produce any more events (because, for example, the
59 // streaming client disconnected) to make sure no stale touch contacts
60 // remain. This addresses issues arising from clients disconnecting in the
61 // middle of a touch action.
62 void OnDisconnectedSource(void* source);
63
64 private:
65 bool HasSlot(void* source, int32_t id);
66
67 int32_t GetOrAcquireSlot(void* source, int32_t id);
68
69 void ReleaseSlot(void* source, int32_t id);
70
71 size_t NumActiveSlots() {
72 std::lock_guard<std::mutex> lock(slots_mtx_);
73 return slots_by_source_and_id_.size();
74 }
75
76 int NewTrackingId() { return ++tracking_id_; }
77
78 int32_t UseNewSlot();
79
80 std::mutex slots_mtx_;
81 std::map<std::pair<void*, int32_t>, int32_t> slots_by_source_and_id_;
82 std::vector<bool> active_slots_;
83 std::atomic<int> tracking_id_ = 0;
84};
85
86class MouseDevice : public InputDevice {
87 public:
89 : InputDevice(conn) {}
90
91 Result<void> SendMoveEvent(int x, int y);
92 Result<void> SendButtonEvent(int button, bool down);
93 Result<void> SendWheelEvent(int pixels);
94};
95
96class GamepadDevice : public InputDevice {
97 public:
99
100 Result<void> SendKeyEvent(int code, bool down);
101 Result<void> SendMotionEvent(int code, int value);
102};
103
105 public:
107 : InputDevice(conn) {}
108
109 Result<void> SendEvent(uint16_t code, bool down);
110};
111
112class RotaryDevice : public InputDevice {
113 public:
115 : InputDevice(conn) {}
116
117 Result<void> SendEvent(int pixels);
118};
119
121 public:
123 : InputDevice(conn) {}
124
125 Result<void> SendEvent(uint16_t code, bool state);
126};
127
128} // namespace cuttlefish
129
Definition: expected.h:86
Definition: event_buffer.h:28
Definition: input_devices.h:96
GamepadDevice(InputConnection conn)
Definition: input_devices.h:98
Result< void > SendKeyEvent(int code, bool down)
Definition: input_devices.cpp:162
Result< void > SendMotionEvent(int code, int value)
Definition: input_devices.cpp:170
Definition: input_connection.h:26
Definition: input_devices.h:34
InputConnection conn_
Definition: input_devices.h:43
InputDevice(InputConnection conn)
Definition: input_devices.h:36
Result< void > WriteEvents(const EventBuffer &buffer)
Definition: input_devices.cpp:25
virtual ~InputDevice()=default
Definition: input_devices.h:104
Result< void > SendEvent(uint16_t code, bool down)
Definition: input_devices.cpp:178
KeyboardDevice(InputConnection conn)
Definition: input_devices.h:106
Definition: input_devices.h:86
MouseDevice(InputConnection conn)
Definition: input_devices.h:88
Result< void > SendMoveEvent(int x, int y)
Definition: input_devices.cpp:134
Result< void > SendButtonEvent(int button, bool down)
Definition: input_devices.cpp:142
Result< void > SendWheelEvent(int pixels)
Definition: input_devices.cpp:154
Definition: input_devices.h:112
Result< void > SendEvent(int pixels)
Definition: input_devices.cpp:186
RotaryDevice(InputConnection conn)
Definition: input_devices.h:114
Definition: input_devices.h:120
SwitchesDevice(InputConnection conn)
Definition: input_devices.h:122
Result< void > SendEvent(uint16_t code, bool state)
Definition: input_devices.cpp:194
Definition: input_devices.h:46
std::vector< bool > active_slots_
Definition: input_devices.h:82
int32_t GetOrAcquireSlot(void *source, int32_t id)
Definition: input_devices.cpp:87
Result< void > SendMultiTouchEvent(const std::vector< MultitouchSlot > &slots, bool down)
Definition: input_devices.cpp:40
std::map< std::pair< void *, int32_t >, int32_t > slots_by_source_and_id_
Definition: input_devices.h:81
TouchDevice(InputConnection conn)
Definition: input_devices.h:48
void OnDisconnectedSource(void *source)
Definition: input_devices.cpp:106
int NewTrackingId()
Definition: input_devices.h:76
bool HasSlot(void *source, int32_t id)
Definition: input_devices.cpp:81
Result< void > SendTouchEvent(int x, int y, bool down)
Definition: input_devices.cpp:30
std::mutex slots_mtx_
Definition: input_devices.h:80
int32_t UseNewSlot()
Definition: input_devices.cpp:119
size_t NumActiveSlots()
Definition: input_devices.h:71
void ReleaseSlot(void *source, int32_t id)
Definition: input_devices.cpp:96
std::atomic< int > tracking_id_
Definition: input_devices.h:83
Definition: alloc_utils.cpp:23