xref: /aosp_15_r20/hardware/libhardware/modules/input/evdev/InputHost.h (revision e01b6f769022e40d0923dee176e8dc7cd1d52984)
1*e01b6f76SAndroid Build Coastguard Worker /*
2*e01b6f76SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*e01b6f76SAndroid Build Coastguard Worker  *
4*e01b6f76SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e01b6f76SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e01b6f76SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e01b6f76SAndroid Build Coastguard Worker  *
8*e01b6f76SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e01b6f76SAndroid Build Coastguard Worker  *
10*e01b6f76SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e01b6f76SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e01b6f76SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e01b6f76SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e01b6f76SAndroid Build Coastguard Worker  * limitations under the License.
15*e01b6f76SAndroid Build Coastguard Worker  */
16*e01b6f76SAndroid Build Coastguard Worker 
17*e01b6f76SAndroid Build Coastguard Worker #ifndef ANDROID_INPUT_HOST_H_
18*e01b6f76SAndroid Build Coastguard Worker #define ANDROID_INPUT_HOST_H_
19*e01b6f76SAndroid Build Coastguard Worker 
20*e01b6f76SAndroid Build Coastguard Worker #include <memory>
21*e01b6f76SAndroid Build Coastguard Worker 
22*e01b6f76SAndroid Build Coastguard Worker #include <hardware/input.h>
23*e01b6f76SAndroid Build Coastguard Worker 
24*e01b6f76SAndroid Build Coastguard Worker namespace android {
25*e01b6f76SAndroid Build Coastguard Worker 
26*e01b6f76SAndroid Build Coastguard Worker /**
27*e01b6f76SAndroid Build Coastguard Worker  * Classes in this file wrap the corresponding interfaces in the Input HAL. They
28*e01b6f76SAndroid Build Coastguard Worker  * are intended to be lightweight, as they primarily wrap pointers to callbacks.
29*e01b6f76SAndroid Build Coastguard Worker  * It is still important not to use an object after a HAL-specific method has
30*e01b6f76SAndroid Build Coastguard Worker  * freed the underlying representation.
31*e01b6f76SAndroid Build Coastguard Worker  *
32*e01b6f76SAndroid Build Coastguard Worker  * See hardware/input.h for details about each of these methods.
33*e01b6f76SAndroid Build Coastguard Worker  */
34*e01b6f76SAndroid Build Coastguard Worker 
35*e01b6f76SAndroid Build Coastguard Worker using InputBus = input_bus_t;
36*e01b6f76SAndroid Build Coastguard Worker using InputCollectionId = input_collection_id_t;
37*e01b6f76SAndroid Build Coastguard Worker using InputDeviceHandle = input_device_handle_t;
38*e01b6f76SAndroid Build Coastguard Worker using InputDeviceIdentifier = input_device_identifier_t;
39*e01b6f76SAndroid Build Coastguard Worker using InputUsage = input_usage_t;
40*e01b6f76SAndroid Build Coastguard Worker 
41*e01b6f76SAndroid Build Coastguard Worker class InputHostBase {
42*e01b6f76SAndroid Build Coastguard Worker protected:
InputHostBase(input_host_t * host,input_host_callbacks_t cb)43*e01b6f76SAndroid Build Coastguard Worker     InputHostBase(input_host_t* host, input_host_callbacks_t cb) : mHost(host), mCallbacks(cb) {}
44*e01b6f76SAndroid Build Coastguard Worker     virtual ~InputHostBase() = default;
45*e01b6f76SAndroid Build Coastguard Worker 
46*e01b6f76SAndroid Build Coastguard Worker     InputHostBase(const InputHostBase& rhs) = delete;
47*e01b6f76SAndroid Build Coastguard Worker     InputHostBase(InputHostBase&& rhs) = delete;
48*e01b6f76SAndroid Build Coastguard Worker 
49*e01b6f76SAndroid Build Coastguard Worker     input_host_t* mHost;
50*e01b6f76SAndroid Build Coastguard Worker     input_host_callbacks_t mCallbacks;
51*e01b6f76SAndroid Build Coastguard Worker };
52*e01b6f76SAndroid Build Coastguard Worker 
53*e01b6f76SAndroid Build Coastguard Worker class InputReport : private InputHostBase {
54*e01b6f76SAndroid Build Coastguard Worker public:
InputReport(input_host_t * host,input_host_callbacks_t cb,input_report_t * r)55*e01b6f76SAndroid Build Coastguard Worker     InputReport(input_host_t* host, input_host_callbacks_t cb, input_report_t* r) :
56*e01b6f76SAndroid Build Coastguard Worker         InputHostBase(host, cb), mReport(r) {}
57*e01b6f76SAndroid Build Coastguard Worker     virtual ~InputReport() = default;
58*e01b6f76SAndroid Build Coastguard Worker 
59*e01b6f76SAndroid Build Coastguard Worker     virtual void setIntUsage(InputCollectionId id, InputUsage usage, int32_t value,
60*e01b6f76SAndroid Build Coastguard Worker             int32_t arityIndex);
61*e01b6f76SAndroid Build Coastguard Worker     virtual void setBoolUsage(InputCollectionId id, InputUsage usage, bool value,
62*e01b6f76SAndroid Build Coastguard Worker             int32_t arityIndex);
63*e01b6f76SAndroid Build Coastguard Worker     virtual void reportEvent(InputDeviceHandle* d);
64*e01b6f76SAndroid Build Coastguard Worker 
65*e01b6f76SAndroid Build Coastguard Worker     operator input_report_t*() const { return mReport; }
66*e01b6f76SAndroid Build Coastguard Worker 
67*e01b6f76SAndroid Build Coastguard Worker     InputReport(const InputReport& rhs) = delete;
68*e01b6f76SAndroid Build Coastguard Worker     InputReport& operator=(const InputReport& rhs) = delete;
69*e01b6f76SAndroid Build Coastguard Worker private:
70*e01b6f76SAndroid Build Coastguard Worker     input_report_t* mReport;
71*e01b6f76SAndroid Build Coastguard Worker };
72*e01b6f76SAndroid Build Coastguard Worker 
73*e01b6f76SAndroid Build Coastguard Worker class InputReportDefinition : private InputHostBase {
74*e01b6f76SAndroid Build Coastguard Worker public:
InputReportDefinition(input_host_t * host,input_host_callbacks_t cb,input_report_definition_t * r)75*e01b6f76SAndroid Build Coastguard Worker     InputReportDefinition(input_host_t* host, input_host_callbacks_t cb,
76*e01b6f76SAndroid Build Coastguard Worker             input_report_definition_t* r) : InputHostBase(host, cb), mReportDefinition(r) {}
77*e01b6f76SAndroid Build Coastguard Worker     virtual ~InputReportDefinition() = default;
78*e01b6f76SAndroid Build Coastguard Worker 
79*e01b6f76SAndroid Build Coastguard Worker     virtual void addCollection(InputCollectionId id, int32_t arity);
80*e01b6f76SAndroid Build Coastguard Worker     virtual void declareUsage(InputCollectionId id, InputUsage usage, int32_t min, int32_t max,
81*e01b6f76SAndroid Build Coastguard Worker             float resolution);
82*e01b6f76SAndroid Build Coastguard Worker     virtual void declareUsages(InputCollectionId id, InputUsage* usage, size_t usageCount);
83*e01b6f76SAndroid Build Coastguard Worker 
84*e01b6f76SAndroid Build Coastguard Worker     virtual InputReport* allocateReport();
85*e01b6f76SAndroid Build Coastguard Worker 
86*e01b6f76SAndroid Build Coastguard Worker     operator input_report_definition_t*() { return mReportDefinition; }
87*e01b6f76SAndroid Build Coastguard Worker 
88*e01b6f76SAndroid Build Coastguard Worker     InputReportDefinition(const InputReportDefinition& rhs) = delete;
89*e01b6f76SAndroid Build Coastguard Worker     InputReportDefinition& operator=(const InputReportDefinition& rhs) = delete;
90*e01b6f76SAndroid Build Coastguard Worker private:
91*e01b6f76SAndroid Build Coastguard Worker     input_report_definition_t* mReportDefinition;
92*e01b6f76SAndroid Build Coastguard Worker };
93*e01b6f76SAndroid Build Coastguard Worker 
94*e01b6f76SAndroid Build Coastguard Worker class InputDeviceDefinition : private InputHostBase {
95*e01b6f76SAndroid Build Coastguard Worker public:
InputDeviceDefinition(input_host_t * host,input_host_callbacks_t cb,input_device_definition_t * d)96*e01b6f76SAndroid Build Coastguard Worker     InputDeviceDefinition(input_host_t* host, input_host_callbacks_t cb,
97*e01b6f76SAndroid Build Coastguard Worker             input_device_definition_t* d) :
98*e01b6f76SAndroid Build Coastguard Worker         InputHostBase(host, cb), mDeviceDefinition(d) {}
99*e01b6f76SAndroid Build Coastguard Worker     virtual ~InputDeviceDefinition() = default;
100*e01b6f76SAndroid Build Coastguard Worker 
101*e01b6f76SAndroid Build Coastguard Worker     virtual void addReport(InputReportDefinition* r);
102*e01b6f76SAndroid Build Coastguard Worker 
103*e01b6f76SAndroid Build Coastguard Worker     operator input_device_definition_t*() { return mDeviceDefinition; }
104*e01b6f76SAndroid Build Coastguard Worker 
105*e01b6f76SAndroid Build Coastguard Worker     InputDeviceDefinition(const InputDeviceDefinition& rhs) = delete;
106*e01b6f76SAndroid Build Coastguard Worker     InputDeviceDefinition& operator=(const InputDeviceDefinition& rhs) = delete;
107*e01b6f76SAndroid Build Coastguard Worker private:
108*e01b6f76SAndroid Build Coastguard Worker     input_device_definition_t* mDeviceDefinition;
109*e01b6f76SAndroid Build Coastguard Worker };
110*e01b6f76SAndroid Build Coastguard Worker 
111*e01b6f76SAndroid Build Coastguard Worker class InputProperty : private InputHostBase {
112*e01b6f76SAndroid Build Coastguard Worker public:
113*e01b6f76SAndroid Build Coastguard Worker     virtual ~InputProperty() = default;
114*e01b6f76SAndroid Build Coastguard Worker 
InputProperty(input_host_t * host,input_host_callbacks_t cb,input_property_t * p)115*e01b6f76SAndroid Build Coastguard Worker     InputProperty(input_host_t* host, input_host_callbacks_t cb, input_property_t* p) :
116*e01b6f76SAndroid Build Coastguard Worker         InputHostBase(host, cb), mProperty(p) {}
117*e01b6f76SAndroid Build Coastguard Worker 
118*e01b6f76SAndroid Build Coastguard Worker     virtual const char* getKey() const;
119*e01b6f76SAndroid Build Coastguard Worker     virtual const char* getValue() const;
120*e01b6f76SAndroid Build Coastguard Worker 
121*e01b6f76SAndroid Build Coastguard Worker     operator input_property_t*() { return mProperty; }
122*e01b6f76SAndroid Build Coastguard Worker 
123*e01b6f76SAndroid Build Coastguard Worker     InputProperty(const InputProperty& rhs) = delete;
124*e01b6f76SAndroid Build Coastguard Worker     InputProperty& operator=(const InputProperty& rhs) = delete;
125*e01b6f76SAndroid Build Coastguard Worker private:
126*e01b6f76SAndroid Build Coastguard Worker     input_property_t* mProperty;
127*e01b6f76SAndroid Build Coastguard Worker };
128*e01b6f76SAndroid Build Coastguard Worker 
129*e01b6f76SAndroid Build Coastguard Worker class InputPropertyMap : private InputHostBase {
130*e01b6f76SAndroid Build Coastguard Worker public:
131*e01b6f76SAndroid Build Coastguard Worker     virtual ~InputPropertyMap() = default;
132*e01b6f76SAndroid Build Coastguard Worker 
InputPropertyMap(input_host_t * host,input_host_callbacks_t cb,input_property_map_t * m)133*e01b6f76SAndroid Build Coastguard Worker     InputPropertyMap(input_host_t* host, input_host_callbacks_t cb, input_property_map_t* m) :
134*e01b6f76SAndroid Build Coastguard Worker         InputHostBase(host, cb), mMap(m) {}
135*e01b6f76SAndroid Build Coastguard Worker 
136*e01b6f76SAndroid Build Coastguard Worker     virtual InputProperty* getDeviceProperty(const char* key) const;
137*e01b6f76SAndroid Build Coastguard Worker     virtual void freeDeviceProperty(InputProperty* property) const;
138*e01b6f76SAndroid Build Coastguard Worker 
139*e01b6f76SAndroid Build Coastguard Worker     operator input_property_map_t*() { return mMap; }
140*e01b6f76SAndroid Build Coastguard Worker 
141*e01b6f76SAndroid Build Coastguard Worker     InputPropertyMap(const InputPropertyMap& rhs) = delete;
142*e01b6f76SAndroid Build Coastguard Worker     InputPropertyMap& operator=(const InputPropertyMap& rhs) = delete;
143*e01b6f76SAndroid Build Coastguard Worker private:
144*e01b6f76SAndroid Build Coastguard Worker     input_property_map_t* mMap;
145*e01b6f76SAndroid Build Coastguard Worker };
146*e01b6f76SAndroid Build Coastguard Worker 
147*e01b6f76SAndroid Build Coastguard Worker class InputHostInterface {
148*e01b6f76SAndroid Build Coastguard Worker public:
149*e01b6f76SAndroid Build Coastguard Worker     virtual ~InputHostInterface() = default;
150*e01b6f76SAndroid Build Coastguard Worker 
151*e01b6f76SAndroid Build Coastguard Worker     virtual InputDeviceIdentifier* createDeviceIdentifier(const char* name, int32_t productId,
152*e01b6f76SAndroid Build Coastguard Worker             int32_t vendorId, InputBus bus, const char* uniqueId) = 0;
153*e01b6f76SAndroid Build Coastguard Worker 
154*e01b6f76SAndroid Build Coastguard Worker     virtual InputDeviceDefinition* createDeviceDefinition() = 0;
155*e01b6f76SAndroid Build Coastguard Worker     virtual InputReportDefinition* createInputReportDefinition() = 0;
156*e01b6f76SAndroid Build Coastguard Worker     virtual InputReportDefinition* createOutputReportDefinition() = 0;
157*e01b6f76SAndroid Build Coastguard Worker     virtual void freeReportDefinition(InputReportDefinition* reportDef) = 0;
158*e01b6f76SAndroid Build Coastguard Worker 
159*e01b6f76SAndroid Build Coastguard Worker     virtual InputDeviceHandle* registerDevice(InputDeviceIdentifier* id,
160*e01b6f76SAndroid Build Coastguard Worker             InputDeviceDefinition* d) = 0;
161*e01b6f76SAndroid Build Coastguard Worker     virtual void unregisterDevice(InputDeviceHandle* handle) = 0;
162*e01b6f76SAndroid Build Coastguard Worker 
163*e01b6f76SAndroid Build Coastguard Worker     virtual InputPropertyMap* getDevicePropertyMap(InputDeviceIdentifier* id) = 0;
164*e01b6f76SAndroid Build Coastguard Worker     virtual void freeDevicePropertyMap(InputPropertyMap* propertyMap) = 0;
165*e01b6f76SAndroid Build Coastguard Worker };
166*e01b6f76SAndroid Build Coastguard Worker 
167*e01b6f76SAndroid Build Coastguard Worker class InputHost : public InputHostInterface, private InputHostBase {
168*e01b6f76SAndroid Build Coastguard Worker public:
InputHost(input_host_t * host,input_host_callbacks_t cb)169*e01b6f76SAndroid Build Coastguard Worker     InputHost(input_host_t* host, input_host_callbacks_t cb) : InputHostBase(host, cb) {}
170*e01b6f76SAndroid Build Coastguard Worker     virtual ~InputHost() = default;
171*e01b6f76SAndroid Build Coastguard Worker 
172*e01b6f76SAndroid Build Coastguard Worker     InputDeviceIdentifier* createDeviceIdentifier(const char* name, int32_t productId,
173*e01b6f76SAndroid Build Coastguard Worker             int32_t vendorId, InputBus bus, const char* uniqueId) override;
174*e01b6f76SAndroid Build Coastguard Worker 
175*e01b6f76SAndroid Build Coastguard Worker     InputDeviceDefinition* createDeviceDefinition() override;
176*e01b6f76SAndroid Build Coastguard Worker     InputReportDefinition* createInputReportDefinition() override;
177*e01b6f76SAndroid Build Coastguard Worker     InputReportDefinition* createOutputReportDefinition() override;
178*e01b6f76SAndroid Build Coastguard Worker     virtual void freeReportDefinition(InputReportDefinition* reportDef) override;
179*e01b6f76SAndroid Build Coastguard Worker 
180*e01b6f76SAndroid Build Coastguard Worker     InputDeviceHandle* registerDevice(InputDeviceIdentifier* id, InputDeviceDefinition* d) override;
181*e01b6f76SAndroid Build Coastguard Worker     void unregisterDevice(InputDeviceHandle* handle) override;
182*e01b6f76SAndroid Build Coastguard Worker 
183*e01b6f76SAndroid Build Coastguard Worker     InputPropertyMap* getDevicePropertyMap(InputDeviceIdentifier* id) override;
184*e01b6f76SAndroid Build Coastguard Worker     void freeDevicePropertyMap(InputPropertyMap* propertyMap) override;
185*e01b6f76SAndroid Build Coastguard Worker 
186*e01b6f76SAndroid Build Coastguard Worker     InputHost(const InputHost& rhs) = delete;
187*e01b6f76SAndroid Build Coastguard Worker     InputHost& operator=(const InputHost& rhs) = delete;
188*e01b6f76SAndroid Build Coastguard Worker };
189*e01b6f76SAndroid Build Coastguard Worker 
190*e01b6f76SAndroid Build Coastguard Worker }  // namespace android
191*e01b6f76SAndroid Build Coastguard Worker 
192*e01b6f76SAndroid Build Coastguard Worker #endif  // ANDROID_INPUT_HOST_H_
193