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