EventHub.h revision 93fa9b30b91f75ee161d0791ff17f98d1a603812
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef _RUNTIME_EVENT_HUB_H 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define _RUNTIME_EVENT_HUB_H 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown#include <ui/Input.h> 226b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown#include <ui/Keyboard.h> 239065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown#include <ui/KeyLayoutMap.h> 249065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown#include <ui/KeyCharacterMap.h> 259065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown#include <ui/VirtualKeyMap.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String8.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 283b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Log.h> 293b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/threads.h> 303b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/List.h> 313b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Errors.h> 3247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#include <utils/PropertyMap.h> 339065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown#include <utils/Vector.h> 3493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown#include <utils/KeyedVector.h> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <linux/input.h> 3793fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown#include <sys/epoll.h> 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* Convenience constants. */ 4046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define BTN_FIRST 0x100 // first button scancode 4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define BTN_LAST 0x15f // last button scancode 4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * A raw event as retrieved from the EventHub. 486d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown */ 496d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownstruct RawEvent { 506d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown nsecs_t when; 516d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t deviceId; 526d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t type; 536d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t scanCode; 546d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t keyCode; 556d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t value; 566d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown uint32_t flags; 576d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}; 586d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 596d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown/* Describes an absolute axis. */ 606d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownstruct RawAbsoluteAxisInfo { 616d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown bool valid; // true if the information is valid, false otherwise 626d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 636d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t minValue; // minimum value 646d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t maxValue; // maximum value 656d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t flat; // center flat position, eg. flat == 8 means center is between -8 and 8 666d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t fuzz; // error tolerance, eg. fuzz == 4 means value is +/- 4 due to noise 67b3a2d1330716812784aee91b6d6275764b5e4210Jeff Brown int32_t resolution; // resolution in units per mm or radians per mm 686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 698d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown inline void clear() { 708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown valid = false; 718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown minValue = 0; 728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown maxValue = 0; 738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown flat = 0; 748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown fuzz = 0; 75b3a2d1330716812784aee91b6d6275764b5e4210Jeff Brown resolution = 0; 768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}; 786d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown/* 80c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Input device classes. 81c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown */ 82c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownenum { 83cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown /* The input device is a keyboard or has buttons. */ 84c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD = 0x00000001, 85c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 86c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown /* The input device is an alpha-numeric keyboard (not just a dial pad). */ 87c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown INPUT_DEVICE_CLASS_ALPHAKEY = 0x00000002, 88c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 8958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown /* The input device is a touchscreen or a touchpad (either single-touch or multi-touch). */ 9058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown INPUT_DEVICE_CLASS_TOUCH = 0x00000004, 91c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 9283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown /* The input device is a cursor device such as a trackball or mouse. */ 9383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_CURSOR = 0x00000008, 94c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 95c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown /* The input device is a multi-touch touchscreen. */ 9658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown INPUT_DEVICE_CLASS_TOUCH_MT = 0x00000010, 97c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 98dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown /* The input device is a directional pad (implies keyboard, has DPAD keys). */ 99c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown INPUT_DEVICE_CLASS_DPAD = 0x00000020, 100c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 101dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown /* The input device is a gamepad (implies keyboard, has BUTTON keys). */ 1026d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown INPUT_DEVICE_CLASS_GAMEPAD = 0x00000040, 1036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 1046d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown /* The input device has switches. */ 1056d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown INPUT_DEVICE_CLASS_SWITCH = 0x00000080, 106cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown 107cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown /* The input device is a joystick (implies gamepad, has joystick absolute axes). */ 108cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown INPUT_DEVICE_CLASS_JOYSTICK = 0x00000100, 10956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 11056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown /* The input device is external (not built-in). */ 11156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown INPUT_DEVICE_CLASS_EXTERNAL = 0x80000000, 112c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown}; 113c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 114c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/* 11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Grand Central Station for events. 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * The event hub aggregates input events received across all known input 11846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * devices on the system, including devices that may be emulated by the simulator 11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * environment. In addition, the event hub generates fake input events to indicate 12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * when devices are added or removed. 12146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 122b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * The event hub provides a stream of input events (via the getEvent function). 12346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * It also supports querying the current actual state of input devices such as identifying 12446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * which keys are currently down. Finally, the event hub keeps track of the capabilities of 12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * individual input devices, such as their class and the set of key codes that they support. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass EventHubInterface : public virtual RefBase { 12846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected: 12946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown EventHubInterface() { } 13046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual ~EventHubInterface() { } 13146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic: 13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // Synthetic raw event type codes produced when devices are added or removed. 13446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown enum { 1357342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown // Sent when a device is added. 13646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown DEVICE_ADDED = 0x10000000, 1377342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown // Sent when a device is removed. 1387342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown DEVICE_REMOVED = 0x20000000, 1397342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown // Sent when all added/removed devices from the most recent scan have been reported. 1407342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown // This event is always sent at least once. 1417342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown FINISHED_DEVICE_SCAN = 0x30000000, 142b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown 143b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown FIRST_SYNTHETIC_EVENT = DEVICE_ADDED, 14446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown }; 14546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual uint32_t getDeviceClasses(int32_t deviceId) const = 0; 14746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual String8 getDeviceName(int32_t deviceId) const = 0; 14946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 15047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const = 0; 15147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 1526d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, 1536d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown RawAbsoluteAxisInfo* outAxisInfo) const = 0; 15446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 155cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown virtual bool hasRelativeAxis(int32_t deviceId, int axis) const = 0; 156cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown 15780fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown virtual bool hasInputProperty(int32_t deviceId, int property) const = 0; 15880fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown 1596f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown virtual status_t mapKey(int32_t deviceId, int scancode, 16046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t* outKeycode, uint32_t* outFlags) const = 0; 16146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown virtual status_t mapAxis(int32_t deviceId, int scancode, 1633a22fa057091cd6614f58ebc57a7ce4fe29462bbJeff Brown AxisInfo* outAxisInfo) const = 0; 1646f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 1651a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown // Sets devices that are excluded from opening. 1661a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown // This can be used to ignore input devices for sensors. 1671a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown virtual void setExcludedDevices(const Vector<String8>& devices) = 0; 16846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 16946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* 170b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown * Wait for events to become available and returns them. 17146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * After returning, the EventHub holds onto a wake lock until the next call to getEvent. 17246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * This ensures that the device will not go to sleep while the event is being processed. 17346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * If the device needs to remain awake longer than that, then the caller is responsible 17446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * for taking care of it (say, by poking the power manager user activity timer). 175aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown * 176aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown * The timeout is advisory only. If the device is asleep, it will not wake just to 177aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown * service the timeout. 178aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown * 179b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown * Returns the number of events obtained, or 0 if the timeout expired. 18046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 181b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) = 0; 18246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 18346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* 18446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Query current input state. 18546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 1866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const = 0; 1876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const = 0; 1886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const = 0; 18946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 19046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* 19146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Examine key input devices for specific framework keycode support 19246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 1936d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes, 19446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown uint8_t* outFlags) const = 0; 195f2f487183052865d50c004a835360be1728b5a52Jeff Brown 196497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown virtual bool hasLed(int32_t deviceId, int32_t led) const = 0; 197497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown virtual void setLedState(int32_t deviceId, int32_t led, bool on) = 0; 198497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 1999065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown virtual void getVirtualKeyDefinitions(int32_t deviceId, 2009065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Vector<VirtualKeyDefinition>& outVirtualKeys) const = 0; 2019065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 20293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown /* Requests the EventHub to reopen all input devices on the next call to getEvents(). */ 20393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void requestReopenDevices() = 0; 20493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 20593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown /* Wakes up getEvents() if it is blocked on a read. */ 20693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void wake() = 0; 2071a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 208f2f487183052865d50c004a835360be1728b5a52Jeff Brown virtual void dump(String8& dump) = 0; 20946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 21046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 21146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass EventHub : public EventHubInterface 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EventHub(); 21546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 21646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual uint32_t getDeviceClasses(int32_t deviceId) const; 217497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 21846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual String8 getDeviceName(int32_t deviceId) const; 219497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 22047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const; 22147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 2226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, 2236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown RawAbsoluteAxisInfo* outAxisInfo) const; 2246d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 225cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown virtual bool hasRelativeAxis(int32_t deviceId, int axis) const; 226cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown 22780fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown virtual bool hasInputProperty(int32_t deviceId, int property) const; 22880fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown 2296f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown virtual status_t mapKey(int32_t deviceId, int scancode, 230e3dd884815b2aaeec4241859722ab603e0b1466bDianne Hackborn int32_t* outKeycode, uint32_t* outFlags) const; 2311d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 2326f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown virtual status_t mapAxis(int32_t deviceId, int scancode, 2333a22fa057091cd6614f58ebc57a7ce4fe29462bbJeff Brown AxisInfo* outAxisInfo) const; 2346f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 2351a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown virtual void setExcludedDevices(const Vector<String8>& devices); 2361d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 2376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const; 2386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const; 2396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const; 24046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2416d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, 2426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown const int32_t* keyCodes, uint8_t* outFlags) const; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 244b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize); 2451d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 246497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown virtual bool hasLed(int32_t deviceId, int32_t led) const; 247497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown virtual void setLedState(int32_t deviceId, int32_t led, bool on); 248497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 2499065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown virtual void getVirtualKeyDefinitions(int32_t deviceId, 2509065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Vector<VirtualKeyDefinition>& outVirtualKeys) const; 2519065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 25293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void requestReopenDevices(); 25393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 25493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void wake(); 2551a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 256f2f487183052865d50c004a835360be1728b5a52Jeff Brown virtual void dump(String8& dump); 257f2f487183052865d50c004a835360be1728b5a52Jeff Brown 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~EventHub(); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brownprivate: 2629065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown struct Device { 2639065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device* next; 2649065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 2659065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown int fd; 2669065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown const int32_t id; 2679065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown const String8 path; 2689065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown const InputDeviceIdentifier identifier; 2699065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 2709065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown uint32_t classes; 27193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 27293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t keyBitmask[(KEY_MAX + 1) / 8]; 27393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t absBitmask[(ABS_MAX + 1) / 8]; 27493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t relBitmask[(REL_MAX + 1) / 8]; 27593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t swBitmask[(SW_MAX + 1) / 8]; 27693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t ledBitmask[(LED_MAX + 1) / 8]; 27793fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t propBitmask[(INPUT_PROP_MAX + 1) / 8]; 27893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 2799065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown String8 configurationFile; 2809065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown PropertyMap* configuration; 2819065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown VirtualKeyMap* virtualKeyMap; 2829065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown KeyMap keyMap; 2839065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 2849065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device(int fd, int32_t id, const String8& path, const InputDeviceIdentifier& identifier); 2859065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown ~Device(); 2869065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 2879065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown void close(); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29093fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t openDeviceLocked(const char *devicePath); 29193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t closeDeviceByPathLocked(const char *devicePath); 29293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 29393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown void closeDeviceLocked(Device* device); 29493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown void closeAllDevicesLocked(); 29593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 29693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t scanDirLocked(const char *dirname); 29793fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown void scanDevicesLocked(); 29893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t readNotifyLocked(); 29993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 3009065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device* getDeviceLocked(int32_t deviceId) const; 30193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown Device* getDeviceByPathLocked(const char* devicePath) const; 30293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 3039065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown bool hasKeycodeLocked(Device* device, int keycode) const; 304497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 3059065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown int32_t getScanCodeStateLocked(Device* device, int32_t scanCode) const; 3069065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown int32_t getKeyCodeStateLocked(Device* device, int32_t keyCode) const; 3079065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown int32_t getSwitchStateLocked(Device* device, int32_t sw) const; 3089065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown bool markSupportedKeyCodesLocked(Device* device, size_t numCodes, 3096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown const int32_t* keyCodes, uint8_t* outFlags) const; 31046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 31193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown void loadConfigurationLocked(Device* device); 31293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t loadVirtualKeyMapLocked(Device* device); 31393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t loadKeyMapLocked(Device* device); 31493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown void setKeyboardPropertiesLocked(Device* device, bool builtInKeyboard); 31593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown void clearKeyboardPropertiesLocked(Device* device, bool builtInKeyboard); 316497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 31793fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown bool isExternalDeviceLocked(Device* device); 31856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Protect all internal state. 3209065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown mutable Mutex mLock; 3219065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 3229065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown // The actual id of the built-in keyboard, or -1 if none. 3239065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown // EventHub remaps the built-in keyboard to id 0 externally as required by the API. 3249065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown int32_t mBuiltInKeyboardId; 3259065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 3269065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown int32_t mNextDeviceId; 3279065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 32893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown KeyedVector<int32_t, Device*> mDevices; 3299065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 3309065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device *mOpeningDevices; 3319065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device *mClosingDevices; 3321d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 3339065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown bool mNeedToSendFinishedDeviceScan; 33493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown bool mNeedToReopenDevices; 3351a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown bool mNeedToScanDevices; 3361a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown Vector<String8> mExcludedDevices; 3371d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 33893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown int mEpollFd; 33993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown int mINotifyFd; 34093fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown int mWakeReadPipeFd; 34193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown int mWakeWritePipeFd; 34293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 34393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown // Ids used for epoll notifications not associated with devices. 34493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown static const uint32_t EPOLL_ID_INOTIFY = 0x80000001; 34593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown static const uint32_t EPOLL_ID_WAKE = 0x80000002; 34693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 34793fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown // Epoll FD list size hint. 34893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown static const int EPOLL_SIZE_HINT = 8; 34993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 35093fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown // Maximum number of signalled FDs to handle at a time. 35193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown static const int EPOLL_MAX_EVENTS = 16; 352cc2e717f1d43a836d1abdee06bcb946416d06fd6Jeff Brown 35393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown // The array of pending epoll events and the index of the next event to be handled. 35493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown struct epoll_event mPendingEventItems[EPOLL_MAX_EVENTS]; 35593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown size_t mPendingEventCount; 35693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown size_t mPendingEventIndex; 35793fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown bool mPendingINotify; 358b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown 359b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown // Set to the number of CPUs. 360b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown int32_t mNumCpus; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // _RUNTIME_EVENT_HUB_H 366