blob: d6573d27215c04b6f3d7ba107c9b66b8c46ce8af [file] [log] [blame]
Tim Kilbourn73475a42015-02-13 10:35:20 -08001/*
2 * Copyright (C) 2015 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#ifndef ANDROID_INPUT_HOST_H_
18#define ANDROID_INPUT_HOST_H_
19
Tim Kilbourn6fa82482015-04-06 13:49:40 -070020#include <memory>
21
Tim Kilbourn73475a42015-02-13 10:35:20 -080022#include <hardware/input.h>
23
24namespace android {
25
26/**
27 * Classes in this file wrap the corresponding interfaces in the Input HAL. They
Tim Kilbourn4f3145d2015-05-04 17:26:30 -070028 * are intended to be lightweight, as they primarily wrap pointers to callbacks.
29 * It is still important not to use an object after a HAL-specific method has
30 * freed the underlying representation.
Tim Kilbourn73475a42015-02-13 10:35:20 -080031 *
32 * See hardware/input.h for details about each of these methods.
33 */
34
35using InputBus = input_bus_t;
36using InputCollectionId = input_collection_id_t;
Tim Kilbourn4f3145d2015-05-04 17:26:30 -070037using InputDeviceHandle = input_device_handle_t;
38using InputDeviceIdentifier = input_device_identifier_t;
Tim Kilbourn73475a42015-02-13 10:35:20 -080039using InputUsage = input_usage_t;
40
41class InputHostBase {
42protected:
43 InputHostBase(input_host_t* host, input_host_callbacks_t cb) : mHost(host), mCallbacks(cb) {}
44 virtual ~InputHostBase() = default;
45
Tim Kilbourn4f3145d2015-05-04 17:26:30 -070046 InputHostBase(const InputHostBase& rhs) = delete;
47 InputHostBase(InputHostBase&& rhs) = delete;
Tim Kilbourn3186e7b2015-04-16 15:32:08 -070048
Tim Kilbourn73475a42015-02-13 10:35:20 -080049 input_host_t* mHost;
50 input_host_callbacks_t mCallbacks;
51};
52
53class InputReport : private InputHostBase {
54public:
Tim Kilbourn73475a42015-02-13 10:35:20 -080055 InputReport(input_host_t* host, input_host_callbacks_t cb, input_report_t* r) :
56 InputHostBase(host, cb), mReport(r) {}
Tim Kilbourn4f3145d2015-05-04 17:26:30 -070057 virtual ~InputReport() = default;
Tim Kilbourn73475a42015-02-13 10:35:20 -080058
Tim Kilbourn4f3145d2015-05-04 17:26:30 -070059 virtual void setIntUsage(InputCollectionId id, InputUsage usage, int32_t value,
60 int32_t arityIndex);
61 virtual void setBoolUsage(InputCollectionId id, InputUsage usage, bool value,
62 int32_t arityIndex);
63 virtual void reportEvent(InputDeviceHandle* d);
64
65 operator input_report_t*() const { return mReport; }
66
67 InputReport(const InputReport& rhs) = delete;
68 InputReport& operator=(const InputReport& rhs) = delete;
69private:
Tim Kilbourn73475a42015-02-13 10:35:20 -080070 input_report_t* mReport;
71};
72
73class InputReportDefinition : private InputHostBase {
74public:
Tim Kilbourn4f3145d2015-05-04 17:26:30 -070075 InputReportDefinition(input_host_t* host, input_host_callbacks_t cb,
76 input_report_definition_t* r) : InputHostBase(host, cb), mReportDefinition(r) {}
Tim Kilbourn73475a42015-02-13 10:35:20 -080077 virtual ~InputReportDefinition() = default;
78
Tim Kilbourn4f3145d2015-05-04 17:26:30 -070079 virtual void addCollection(InputCollectionId id, int32_t arity);
80 virtual void declareUsage(InputCollectionId id, InputUsage usage, int32_t min, int32_t max,
81 float resolution);
82 virtual void declareUsages(InputCollectionId id, InputUsage* usage, size_t usageCount);
83
84 virtual InputReport* allocateReport();
85
Tim Kilbourn73475a42015-02-13 10:35:20 -080086 operator input_report_definition_t*() { return mReportDefinition; }
87
Tim Kilbourn4f3145d2015-05-04 17:26:30 -070088 InputReportDefinition(const InputReportDefinition& rhs) = delete;
89 InputReportDefinition& operator=(const InputReportDefinition& rhs) = delete;
Tim Kilbourn73475a42015-02-13 10:35:20 -080090private:
Tim Kilbourn73475a42015-02-13 10:35:20 -080091 input_report_definition_t* mReportDefinition;
92};
93
94class InputDeviceDefinition : private InputHostBase {
95public:
Tim Kilbourn4f3145d2015-05-04 17:26:30 -070096 InputDeviceDefinition(input_host_t* host, input_host_callbacks_t cb,
97 input_device_definition_t* d) :
98 InputHostBase(host, cb), mDeviceDefinition(d) {}
Tim Kilbourn73475a42015-02-13 10:35:20 -080099 virtual ~InputDeviceDefinition() = default;
100
Tim Kilbourn4f3145d2015-05-04 17:26:30 -0700101 virtual void addReport(InputReportDefinition* r);
102
Tim Kilbourn73475a42015-02-13 10:35:20 -0800103 operator input_device_definition_t*() { return mDeviceDefinition; }
104
Tim Kilbourn4f3145d2015-05-04 17:26:30 -0700105 InputDeviceDefinition(const InputDeviceDefinition& rhs) = delete;
106 InputDeviceDefinition& operator=(const InputDeviceDefinition& rhs) = delete;
Tim Kilbourn73475a42015-02-13 10:35:20 -0800107private:
Tim Kilbourn73475a42015-02-13 10:35:20 -0800108 input_device_definition_t* mDeviceDefinition;
109};
110
Tim Kilbourn6fa82482015-04-06 13:49:40 -0700111class InputProperty : private InputHostBase {
112public:
Tim Kilbourn4f3145d2015-05-04 17:26:30 -0700113 virtual ~InputProperty() = default;
114
115 InputProperty(input_host_t* host, input_host_callbacks_t cb, input_property_t* p) :
116 InputHostBase(host, cb), mProperty(p) {}
117
118 virtual const char* getKey() const;
119 virtual const char* getValue() const;
Tim Kilbourn6fa82482015-04-06 13:49:40 -0700120
121 operator input_property_t*() { return mProperty; }
122
Tim Kilbourn6fa82482015-04-06 13:49:40 -0700123 InputProperty(const InputProperty& rhs) = delete;
124 InputProperty& operator=(const InputProperty& rhs) = delete;
Tim Kilbourn6fa82482015-04-06 13:49:40 -0700125private:
Tim Kilbourn6fa82482015-04-06 13:49:40 -0700126 input_property_t* mProperty;
127};
128
129class InputPropertyMap : private InputHostBase {
130public:
Tim Kilbourn4f3145d2015-05-04 17:26:30 -0700131 virtual ~InputPropertyMap() = default;
132
133 InputPropertyMap(input_host_t* host, input_host_callbacks_t cb, input_property_map_t* m) :
134 InputHostBase(host, cb), mMap(m) {}
135
136 virtual InputProperty* getDeviceProperty(const char* key) const;
137 virtual void freeDeviceProperty(InputProperty* property) const;
Tim Kilbourn6fa82482015-04-06 13:49:40 -0700138
139 operator input_property_map_t*() { return mMap; }
140
Tim Kilbourn6fa82482015-04-06 13:49:40 -0700141 InputPropertyMap(const InputPropertyMap& rhs) = delete;
142 InputPropertyMap& operator=(const InputPropertyMap& rhs) = delete;
Tim Kilbourn6fa82482015-04-06 13:49:40 -0700143private:
Tim Kilbourn6fa82482015-04-06 13:49:40 -0700144 input_property_map_t* mMap;
145};
146
Tim Kilbourn4f3145d2015-05-04 17:26:30 -0700147class InputHostInterface {
148public:
149 virtual ~InputHostInterface() = default;
150
151 virtual InputDeviceIdentifier* createDeviceIdentifier(const char* name, int32_t productId,
152 int32_t vendorId, InputBus bus, const char* uniqueId) = 0;
153
154 virtual InputDeviceDefinition* createDeviceDefinition() = 0;
155 virtual InputReportDefinition* createInputReportDefinition() = 0;
156 virtual InputReportDefinition* createOutputReportDefinition() = 0;
157 virtual void freeReportDefinition(InputReportDefinition* reportDef) = 0;
158
159 virtual InputDeviceHandle* registerDevice(InputDeviceIdentifier* id,
160 InputDeviceDefinition* d) = 0;
161 virtual void unregisterDevice(InputDeviceHandle* handle) = 0;
162
163 virtual InputPropertyMap* getDevicePropertyMap(InputDeviceIdentifier* id) = 0;
164 virtual void freeDevicePropertyMap(InputPropertyMap* propertyMap) = 0;
165};
166
167class InputHost : public InputHostInterface, private InputHostBase {
Tim Kilbourn73475a42015-02-13 10:35:20 -0800168public:
169 InputHost(input_host_t* host, input_host_callbacks_t cb) : InputHostBase(host, cb) {}
170 virtual ~InputHost() = default;
171
Tim Kilbourn4f3145d2015-05-04 17:26:30 -0700172 InputDeviceIdentifier* createDeviceIdentifier(const char* name, int32_t productId,
173 int32_t vendorId, InputBus bus, const char* uniqueId) override;
Tim Kilbourn73475a42015-02-13 10:35:20 -0800174
Tim Kilbourn4f3145d2015-05-04 17:26:30 -0700175 InputDeviceDefinition* createDeviceDefinition() override;
176 InputReportDefinition* createInputReportDefinition() override;
177 InputReportDefinition* createOutputReportDefinition() override;
178 virtual void freeReportDefinition(InputReportDefinition* reportDef) override;
Tim Kilbourn73475a42015-02-13 10:35:20 -0800179
Tim Kilbourn4f3145d2015-05-04 17:26:30 -0700180 InputDeviceHandle* registerDevice(InputDeviceIdentifier* id, InputDeviceDefinition* d) override;
181 void unregisterDevice(InputDeviceHandle* handle) override;
Tim Kilbourn73475a42015-02-13 10:35:20 -0800182
Tim Kilbourn4f3145d2015-05-04 17:26:30 -0700183 InputPropertyMap* getDevicePropertyMap(InputDeviceIdentifier* id) override;
184 void freeDevicePropertyMap(InputPropertyMap* propertyMap) override;
Tim Kilbourn6fa82482015-04-06 13:49:40 -0700185
Tim Kilbourn4f3145d2015-05-04 17:26:30 -0700186 InputHost(const InputHost& rhs) = delete;
187 InputHost& operator=(const InputHost& rhs) = delete;
Tim Kilbourn73475a42015-02-13 10:35:20 -0800188};
189
190} // namespace android
191
192#endif // ANDROID_INPUT_HOST_H_