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 219d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/Input.h> 229d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/InputDevice.h> 239d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/Keyboard.h> 249d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/KeyLayoutMap.h> 259d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/KeyCharacterMap.h> 269d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/VirtualKeyMap.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String8.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 293b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Log.h> 303b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/threads.h> 313b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/List.h> 323b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Errors.h> 3347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#include <utils/PropertyMap.h> 349065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown#include <utils/Vector.h> 3593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown#include <utils/KeyedVector.h> 36ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright#include <utils/BitSet.h> 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <linux/input.h> 3993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown#include <sys/epoll.h> 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* Convenience constants. */ 4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown#define BTN_FIRST 0x100 // first button code 4449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown#define BTN_LAST 0x15f // last button code 4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 464dac901f011e7c15882e260441225633a6435e49Jeff Brown/* 474dac901f011e7c15882e260441225633a6435e49Jeff Brown * These constants are used privately in Android to pass raw timestamps 484dac901f011e7c15882e260441225633a6435e49Jeff Brown * through evdev from uinput device drivers because there is currently no 494dac901f011e7c15882e260441225633a6435e49Jeff Brown * other way to transfer this information. The evdev driver automatically 504dac901f011e7c15882e260441225633a6435e49Jeff Brown * timestamps all input events with the time they were posted and clobbers 514dac901f011e7c15882e260441225633a6435e49Jeff Brown * whatever information was passed in. 524dac901f011e7c15882e260441225633a6435e49Jeff Brown * 534dac901f011e7c15882e260441225633a6435e49Jeff Brown * For the purposes of this hack, the timestamp is specified in the 544dac901f011e7c15882e260441225633a6435e49Jeff Brown * CLOCK_MONOTONIC timebase and is split into two EV_MSC events specifying 554dac901f011e7c15882e260441225633a6435e49Jeff Brown * seconds and microseconds. 564dac901f011e7c15882e260441225633a6435e49Jeff Brown */ 574dac901f011e7c15882e260441225633a6435e49Jeff Brown#define MSC_ANDROID_TIME_SEC 0x6 584dac901f011e7c15882e260441225633a6435e49Jeff Brown#define MSC_ANDROID_TIME_USEC 0x7 594dac901f011e7c15882e260441225633a6435e49Jeff Brown 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownenum { 639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown // Device id of a special "virtual" keyboard that is always present. 649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown VIRTUAL_KEYBOARD_ID = -1, 659f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown // Device id of the "built-in" keyboard if there is one. 669f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown BUILT_IN_KEYBOARD_ID = 0, 679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown}; 689f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * A raw event as retrieved from the EventHub. 716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown */ 726d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownstruct RawEvent { 736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown nsecs_t when; 746d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t deviceId; 756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t type; 7649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown int32_t code; 776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t value; 786d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}; 796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown/* Describes an absolute axis. */ 816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownstruct RawAbsoluteAxisInfo { 826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown bool valid; // true if the information is valid, false otherwise 836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 846d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t minValue; // minimum value 856d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t maxValue; // maximum value 866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t flat; // center flat position, eg. flat == 8 means center is between -8 and 8 876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown int32_t fuzz; // error tolerance, eg. fuzz == 4 means value is +/- 4 due to noise 88b3a2d1330716812784aee91b6d6275764b5e4210Jeff Brown int32_t resolution; // resolution in units per mm or radians per mm 896d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 908d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown inline void clear() { 918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown valid = false; 928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown minValue = 0; 938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown maxValue = 0; 948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown flat = 0; 958d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown fuzz = 0; 96b3a2d1330716812784aee91b6d6275764b5e4210Jeff Brown resolution = 0; 978d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown}; 996d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 1006d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown/* 101c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Input device classes. 102c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown */ 103c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownenum { 104cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown /* The input device is a keyboard or has buttons. */ 105c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD = 0x00000001, 106c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 107c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown /* The input device is an alpha-numeric keyboard (not just a dial pad). */ 108c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown INPUT_DEVICE_CLASS_ALPHAKEY = 0x00000002, 109c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 11058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown /* The input device is a touchscreen or a touchpad (either single-touch or multi-touch). */ 11158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown INPUT_DEVICE_CLASS_TOUCH = 0x00000004, 112c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 11383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown /* The input device is a cursor device such as a trackball or mouse. */ 11483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_CURSOR = 0x00000008, 115c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 116c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown /* The input device is a multi-touch touchscreen. */ 11758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown INPUT_DEVICE_CLASS_TOUCH_MT = 0x00000010, 118c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 119dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown /* The input device is a directional pad (implies keyboard, has DPAD keys). */ 120c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown INPUT_DEVICE_CLASS_DPAD = 0x00000020, 121c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 122dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown /* The input device is a gamepad (implies keyboard, has BUTTON keys). */ 1236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown INPUT_DEVICE_CLASS_GAMEPAD = 0x00000040, 1246d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 1256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown /* The input device has switches. */ 1266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown INPUT_DEVICE_CLASS_SWITCH = 0x00000080, 127cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown 128cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown /* The input device is a joystick (implies gamepad, has joystick absolute axes). */ 129cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown INPUT_DEVICE_CLASS_JOYSTICK = 0x00000100, 13056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 131a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown /* The input device has a vibrator (supports FF_RUMBLE). */ 132a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown INPUT_DEVICE_CLASS_VIBRATOR = 0x00000200, 133a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 1349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown /* The input device is virtual (not a real device, not part of UI configuration). */ 1359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown INPUT_DEVICE_CLASS_VIRTUAL = 0x40000000, 1369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 13756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown /* The input device is external (not built-in). */ 13856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown INPUT_DEVICE_CLASS_EXTERNAL = 0x80000000, 139c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown}; 140c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 141c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/* 1429ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown * Gets the class that owns an axis, in cases where multiple classes might claim 1439ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown * the same axis for different purposes. 1449ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown */ 1459ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brownextern uint32_t getAbsAxisUsage(int32_t axis, uint32_t deviceClasses); 1469ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown 1479ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown/* 14846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Grand Central Station for events. 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * The event hub aggregates input events received across all known input 15146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * devices on the system, including devices that may be emulated by the simulator 15246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * environment. In addition, the event hub generates fake input events to indicate 15346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * when devices are added or removed. 15446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 155b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * The event hub provides a stream of input events (via the getEvent function). 15646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * It also supports querying the current actual state of input devices such as identifying 15746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * which keys are currently down. Finally, the event hub keeps track of the capabilities of 15846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * individual input devices, such as their class and the set of key codes that they support. 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass EventHubInterface : public virtual RefBase { 16146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected: 16246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown EventHubInterface() { } 16346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual ~EventHubInterface() { } 16446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 16546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic: 16646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // Synthetic raw event type codes produced when devices are added or removed. 16746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown enum { 1687342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown // Sent when a device is added. 16946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown DEVICE_ADDED = 0x10000000, 1707342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown // Sent when a device is removed. 1717342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown DEVICE_REMOVED = 0x20000000, 1727342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown // Sent when all added/removed devices from the most recent scan have been reported. 1737342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown // This event is always sent at least once. 1747342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown FINISHED_DEVICE_SCAN = 0x30000000, 175b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown 176b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown FIRST_SYNTHETIC_EVENT = DEVICE_ADDED, 17746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown }; 17846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 17946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual uint32_t getDeviceClasses(int32_t deviceId) const = 0; 18046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 181e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const = 0; 18246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 183ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright virtual int32_t getDeviceControllerNumber(int32_t deviceId) const = 0; 184ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright 18547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const = 0; 18647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 1876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, 1886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown RawAbsoluteAxisInfo* outAxisInfo) const = 0; 18946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 190cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown virtual bool hasRelativeAxis(int32_t deviceId, int axis) const = 0; 191cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown 19280fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown virtual bool hasInputProperty(int32_t deviceId, int property) const = 0; 19380fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown 19449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown virtual status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, 19546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t* outKeycode, uint32_t* outFlags) const = 0; 19646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 19749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown virtual status_t mapAxis(int32_t deviceId, int32_t scanCode, 1983a22fa057091cd6614f58ebc57a7ce4fe29462bbJeff Brown AxisInfo* outAxisInfo) const = 0; 1996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 2001a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown // Sets devices that are excluded from opening. 2011a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown // This can be used to ignore input devices for sensors. 2021a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown virtual void setExcludedDevices(const Vector<String8>& devices) = 0; 20346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 20446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* 205b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown * Wait for events to become available and returns them. 20646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * After returning, the EventHub holds onto a wake lock until the next call to getEvent. 20746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * This ensures that the device will not go to sleep while the event is being processed. 20846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * If the device needs to remain awake longer than that, then the caller is responsible 20946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * for taking care of it (say, by poking the power manager user activity timer). 210aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown * 211aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown * The timeout is advisory only. If the device is asleep, it will not wake just to 212aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown * service the timeout. 213aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown * 214b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown * Returns the number of events obtained, or 0 if the timeout expired. 21546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 216b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) = 0; 21746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 21846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* 21946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Query current input state. 22046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 2216d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const = 0; 2226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const = 0; 2236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const = 0; 2242717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, 2252717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown int32_t* outValue) const = 0; 22646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 22746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* 22846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Examine key input devices for specific framework keycode support 22946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 2306d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes, 23146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown uint8_t* outFlags) const = 0; 232f2f487183052865d50c004a835360be1728b5a52Jeff Brown 23349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const = 0; 234497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown virtual bool hasLed(int32_t deviceId, int32_t led) const = 0; 235497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown virtual void setLedState(int32_t deviceId, int32_t led, bool on) = 0; 236497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 2379065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown virtual void getVirtualKeyDefinitions(int32_t deviceId, 2389065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Vector<VirtualKeyDefinition>& outVirtualKeys) const = 0; 2399065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 2409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t deviceId) const = 0; 2416ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown virtual bool setKeyboardLayoutOverlay(int32_t deviceId, const sp<KeyCharacterMap>& map) = 0; 2421e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown 243a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown /* Control the vibrator. */ 244a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown virtual void vibrate(int32_t deviceId, nsecs_t duration) = 0; 245a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown virtual void cancelVibrate(int32_t deviceId) = 0; 246a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 24793fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown /* Requests the EventHub to reopen all input devices on the next call to getEvents(). */ 24893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void requestReopenDevices() = 0; 24993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 25093fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown /* Wakes up getEvents() if it is blocked on a read. */ 25193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void wake() = 0; 2521a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 25389ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown /* Dump EventHub state to a string. */ 254f2f487183052865d50c004a835360be1728b5a52Jeff Brown virtual void dump(String8& dump) = 0; 25589ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 25689ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown /* Called by the heatbeat to ensures that the reader has not deadlocked. */ 25789ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown virtual void monitor() = 0; 25846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 25946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 26046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass EventHub : public EventHubInterface 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EventHub(); 26446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 26546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual uint32_t getDeviceClasses(int32_t deviceId) const; 266497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 267e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const; 268497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 269ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright virtual int32_t getDeviceControllerNumber(int32_t deviceId) const; 270ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright 27147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const; 27247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 2736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, 2746d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown RawAbsoluteAxisInfo* outAxisInfo) const; 2756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 276cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown virtual bool hasRelativeAxis(int32_t deviceId, int axis) const; 277cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown 27880fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown virtual bool hasInputProperty(int32_t deviceId, int property) const; 27980fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown 28049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown virtual status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, 281e3dd884815b2aaeec4241859722ab603e0b1466bDianne Hackborn int32_t* outKeycode, uint32_t* outFlags) const; 2821d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 28349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown virtual status_t mapAxis(int32_t deviceId, int32_t scanCode, 2843a22fa057091cd6614f58ebc57a7ce4fe29462bbJeff Brown AxisInfo* outAxisInfo) const; 2856f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 2861a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown virtual void setExcludedDevices(const Vector<String8>& devices); 2871d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 2886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const; 2896d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const; 2906d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const; 2912717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t* outValue) const; 29246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2936d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, 2946d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown const int32_t* keyCodes, uint8_t* outFlags) const; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 296b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize); 2971d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 29849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const; 299497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown virtual bool hasLed(int32_t deviceId, int32_t led) const; 300497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown virtual void setLedState(int32_t deviceId, int32_t led, bool on); 301497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 3029065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown virtual void getVirtualKeyDefinitions(int32_t deviceId, 3039065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Vector<VirtualKeyDefinition>& outVirtualKeys) const; 3049065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 3059f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t deviceId) const; 3066ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown virtual bool setKeyboardLayoutOverlay(int32_t deviceId, const sp<KeyCharacterMap>& map); 3071e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown 308a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown virtual void vibrate(int32_t deviceId, nsecs_t duration); 309a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown virtual void cancelVibrate(int32_t deviceId); 310a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 31193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void requestReopenDevices(); 31293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 31393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void wake(); 3141a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 315f2f487183052865d50c004a835360be1728b5a52Jeff Brown virtual void dump(String8& dump); 31689ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown virtual void monitor(); 317f2f487183052865d50c004a835360be1728b5a52Jeff Brown 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~EventHub(); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brownprivate: 3229065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown struct Device { 3239065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device* next; 3249065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 3259f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown int fd; // may be -1 if device is virtual 3269065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown const int32_t id; 3279065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown const String8 path; 3289065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown const InputDeviceIdentifier identifier; 3299065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 3309065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown uint32_t classes; 33193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 33293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t keyBitmask[(KEY_MAX + 1) / 8]; 33393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t absBitmask[(ABS_MAX + 1) / 8]; 33493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t relBitmask[(REL_MAX + 1) / 8]; 33593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t swBitmask[(SW_MAX + 1) / 8]; 33693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t ledBitmask[(LED_MAX + 1) / 8]; 337a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown uint8_t ffBitmask[(FF_MAX + 1) / 8]; 33893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown uint8_t propBitmask[(INPUT_PROP_MAX + 1) / 8]; 33993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 3409065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown String8 configurationFile; 3419065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown PropertyMap* configuration; 3429065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown VirtualKeyMap* virtualKeyMap; 3439065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown KeyMap keyMap; 3449065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 3456ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown sp<KeyCharacterMap> overlayKeyMap; 3466ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown sp<KeyCharacterMap> combinedKeyMap; 3476ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 348a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown bool ffEffectPlaying; 349a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown int16_t ffEffectId; // initially -1 350a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 351ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright int32_t controllerNumber; 352ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright 3534dac901f011e7c15882e260441225633a6435e49Jeff Brown int32_t timestampOverrideSec; 3544dac901f011e7c15882e260441225633a6435e49Jeff Brown int32_t timestampOverrideUsec; 3554dac901f011e7c15882e260441225633a6435e49Jeff Brown 3569065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device(int fd, int32_t id, const String8& path, const InputDeviceIdentifier& identifier); 3579065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown ~Device(); 3589065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 3599065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown void close(); 3609f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 3619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown inline bool isVirtual() const { return fd < 0; } 3624a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown 3634a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown const sp<KeyCharacterMap>& getKeyCharacterMap() const { 3644a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown if (combinedKeyMap != NULL) { 3654a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown return combinedKeyMap; 3664a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown } 3674a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown return keyMap.keyCharacterMap; 3684a3862f6b0a8971b6ab5b1c46735b28e7604d0dbJeff Brown } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t openDeviceLocked(const char *devicePath); 3729f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown void createVirtualKeyboardLocked(); 3739f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown void addDeviceLocked(Device* device); 37493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 3759f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown status_t closeDeviceByPathLocked(const char *devicePath); 37693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown void closeDeviceLocked(Device* device); 37793fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown void closeAllDevicesLocked(); 37893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 37993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t scanDirLocked(const char *dirname); 38093fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown void scanDevicesLocked(); 38193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t readNotifyLocked(); 38293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 3839065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device* getDeviceLocked(int32_t deviceId) const; 38493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown Device* getDeviceByPathLocked(const char* devicePath) const; 38593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 3869065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown bool hasKeycodeLocked(Device* device, int keycode) const; 387497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 38893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown void loadConfigurationLocked(Device* device); 38993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t loadVirtualKeyMapLocked(Device* device); 39093fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown status_t loadKeyMapLocked(Device* device); 391497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown 39293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown bool isExternalDeviceLocked(Device* device); 39356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 394ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright int32_t getNextControllerNumberLocked(Device* device); 395ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright void releaseControllerNumberLocked(Device* device); 396ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Protect all internal state. 3989065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown mutable Mutex mLock; 3999065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 4009f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown // The actual id of the built-in keyboard, or NO_BUILT_IN_KEYBOARD if none. 4019065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown // EventHub remaps the built-in keyboard to id 0 externally as required by the API. 4029f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown enum { 4039f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown // Must not conflict with any other assigned device ids, including 4049f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown // the virtual keyboard id (-1). 4059f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NO_BUILT_IN_KEYBOARD = -2, 4069f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown }; 4079065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown int32_t mBuiltInKeyboardId; 4089065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 4099065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown int32_t mNextDeviceId; 4109065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 411ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright BitSet32 mControllerNumbers; 412ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright 41393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown KeyedVector<int32_t, Device*> mDevices; 4149065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 4159065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device *mOpeningDevices; 4169065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device *mClosingDevices; 4171d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 4189065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown bool mNeedToSendFinishedDeviceScan; 41993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown bool mNeedToReopenDevices; 4201a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown bool mNeedToScanDevices; 4211a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown Vector<String8> mExcludedDevices; 4221d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 42393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown int mEpollFd; 42493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown int mINotifyFd; 42593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown int mWakeReadPipeFd; 42693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown int mWakeWritePipeFd; 42793fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 42893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown // Ids used for epoll notifications not associated with devices. 42993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown static const uint32_t EPOLL_ID_INOTIFY = 0x80000001; 43093fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown static const uint32_t EPOLL_ID_WAKE = 0x80000002; 43193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 43293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown // Epoll FD list size hint. 43393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown static const int EPOLL_SIZE_HINT = 8; 43493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 43593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown // Maximum number of signalled FDs to handle at a time. 43693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown static const int EPOLL_MAX_EVENTS = 16; 437cc2e717f1d43a836d1abdee06bcb946416d06fd6Jeff Brown 43893fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown // The array of pending epoll events and the index of the next event to be handled. 43993fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown struct epoll_event mPendingEventItems[EPOLL_MAX_EVENTS]; 44093fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown size_t mPendingEventCount; 44193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown size_t mPendingEventIndex; 44293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown bool mPendingINotify; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // _RUNTIME_EVENT_HUB_H 448