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