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