EventHub.h revision aa3855d5836d2a2d83baafdf6e40caf90d3dad1c
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>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <linux/input.h>
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* These constants are not defined in linux/input.h but they are part of the multitouch
3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * input protocol. */
3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_TOUCH_MAJOR 0x30  /* Major axis of touching ellipse */
4146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_TOUCH_MINOR 0x31  /* Minor axis (omit if circular) */
4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_WIDTH_MAJOR 0x32  /* Major axis of approaching ellipse */
4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_WIDTH_MINOR 0x33  /* Minor axis (omit if circular) */
4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_ORIENTATION 0x34  /* Ellipse orientation */
4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_POSITION_X 0x35   /* Center X ellipse position */
4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_POSITION_Y 0x36   /* Center Y ellipse position */
4746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_TOOL_TYPE 0x37    /* Type of touching device (finger, pen, ...) */
4846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_BLOB_ID 0x38      /* Group a set of packets as a blob */
4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_TRACKING_ID 0x39  /* Unique ID of initiated contact */
5046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define ABS_MT_PRESSURE 0x3a     /* Pressure on contact area */
5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define MT_TOOL_FINGER 0 /* Identifies a finger */
5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define MT_TOOL_PEN 1    /* Identifies a pen */
5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define SYN_MT_REPORT 2
5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* Convenience constants. */
5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define BTN_FIRST 0x100  // first button scancode
6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define BTN_LAST 0x15f   // last button scancode
6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct pollfd;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
676d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * A raw event as retrieved from the EventHub.
686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown */
696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownstruct RawEvent {
706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    nsecs_t when;
716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t deviceId;
726d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t type;
736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t scanCode;
746d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t keyCode;
756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t value;
766d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    uint32_t flags;
776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
786d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown/* Describes an absolute axis. */
806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownstruct RawAbsoluteAxisInfo {
816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    bool valid; // true if the information is valid, false otherwise
826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t minValue;  // minimum value
846d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t maxValue;  // maximum value
856d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t flat;      // center flat position, eg. flat == 8 means center is between -8 and 8
866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t fuzz;      // error tolerance, eg. fuzz == 4 means value is +/- 4 due to noise
876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    inline void clear() {
898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        valid = false;
908d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        minValue = 0;
918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        maxValue = 0;
928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        flat = 0;
938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        fuzz = 0;
948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
966d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
976d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown/*
98c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Input device classes.
99c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown */
100c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownenum {
101cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /* The input device is a keyboard or has buttons. */
102c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    INPUT_DEVICE_CLASS_KEYBOARD      = 0x00000001,
103c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
104c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /* The input device is an alpha-numeric keyboard (not just a dial pad). */
105c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    INPUT_DEVICE_CLASS_ALPHAKEY      = 0x00000002,
106c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
10758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    /* The input device is a touchscreen or a touchpad (either single-touch or multi-touch). */
10858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    INPUT_DEVICE_CLASS_TOUCH         = 0x00000004,
109c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
11083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    /* The input device is a cursor device such as a trackball or mouse. */
11183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    INPUT_DEVICE_CLASS_CURSOR        = 0x00000008,
112c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
113c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /* The input device is a multi-touch touchscreen. */
11458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    INPUT_DEVICE_CLASS_TOUCH_MT      = 0x00000010,
115c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
116dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /* The input device is a directional pad (implies keyboard, has DPAD keys). */
117c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    INPUT_DEVICE_CLASS_DPAD          = 0x00000020,
118c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
119dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /* The input device is a gamepad (implies keyboard, has BUTTON keys). */
1206d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    INPUT_DEVICE_CLASS_GAMEPAD       = 0x00000040,
1216d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /* The input device has switches. */
1236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    INPUT_DEVICE_CLASS_SWITCH        = 0x00000080,
124cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
125cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /* The input device is a joystick (implies gamepad, has joystick absolute axes). */
126cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    INPUT_DEVICE_CLASS_JOYSTICK      = 0x00000100,
12756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
12856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    /* The input device is external (not built-in). */
12956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    INPUT_DEVICE_CLASS_EXTERNAL      = 0x80000000,
130c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown};
131c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
132c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/*
13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Grand Central Station for events.
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
13546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * The event hub aggregates input events received across all known input
13646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * devices on the system, including devices that may be emulated by the simulator
13746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * environment.  In addition, the event hub generates fake input events to indicate
13846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * when devices are added or removed.
13946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
140b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * The event hub provides a stream of input events (via the getEvent function).
14146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * It also supports querying the current actual state of input devices such as identifying
14246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * which keys are currently down.  Finally, the event hub keeps track of the capabilities of
14346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * individual input devices, such as their class and the set of key codes that they support.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
14546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass EventHubInterface : public virtual RefBase {
14646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected:
14746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    EventHubInterface() { }
14846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~EventHubInterface() { }
14946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
15046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
15146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // Synthetic raw event type codes produced when devices are added or removed.
15246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    enum {
1537342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown        // Sent when a device is added.
15446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        DEVICE_ADDED = 0x10000000,
1557342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown        // Sent when a device is removed.
1567342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown        DEVICE_REMOVED = 0x20000000,
1577342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown        // Sent when all added/removed devices from the most recent scan have been reported.
1587342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown        // This event is always sent at least once.
1597342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown        FINISHED_DEVICE_SCAN = 0x30000000,
16046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    };
16146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
16246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual uint32_t getDeviceClasses(int32_t deviceId) const = 0;
16346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
16446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual String8 getDeviceName(int32_t deviceId) const = 0;
16546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
16647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const = 0;
16747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
1686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
1696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            RawAbsoluteAxisInfo* outAxisInfo) const = 0;
17046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
171cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    virtual bool hasRelativeAxis(int32_t deviceId, int axis) const = 0;
172cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown
1736f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    virtual status_t mapKey(int32_t deviceId, int scancode,
17446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t* outKeycode, uint32_t* outFlags) const = 0;
17546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    virtual status_t mapAxis(int32_t deviceId, int scancode,
1773a22fa057091cd6614f58ebc57a7ce4fe29462bbJeff Brown            AxisInfo* outAxisInfo) const = 0;
1786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
17946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // exclude a particular device from opening
18046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // this can be used to ignore input devices for sensors
18146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual void addExcludedDevice(const char* deviceName) = 0;
18246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
18346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /*
18446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Wait for the next event to become available and return it.
18546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * After returning, the EventHub holds onto a wake lock until the next call to getEvent.
18646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * This ensures that the device will not go to sleep while the event is being processed.
18746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * If the device needs to remain awake longer than that, then the caller is responsible
18846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * for taking care of it (say, by poking the power manager user activity timer).
189aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown     *
190aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown     * The timeout is advisory only.  If the device is asleep, it will not wake just to
191aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown     * service the timeout.
192aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown     *
193aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown     * Returns true if an event was obtained, false if the timeout expired.
19446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     */
195aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown    virtual bool getEvent(int timeoutMillis, RawEvent* outEvent) = 0;
19646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
19746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /*
19846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Query current input state.
19946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     */
2006d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const = 0;
2016d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const = 0;
2026d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const = 0;
20346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
20446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /*
20546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Examine key input devices for specific framework keycode support
20646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     */
2076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
20846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            uint8_t* outFlags) const = 0;
209f2f487183052865d50c004a835360be1728b5a52Jeff Brown
210497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    virtual bool hasLed(int32_t deviceId, int32_t led) const = 0;
211497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    virtual void setLedState(int32_t deviceId, int32_t led, bool on) = 0;
212497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2139065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    virtual void getVirtualKeyDefinitions(int32_t deviceId,
2149065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown            Vector<VirtualKeyDefinition>& outVirtualKeys) const = 0;
2159065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
216f2f487183052865d50c004a835360be1728b5a52Jeff Brown    virtual void dump(String8& dump) = 0;
21746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
21846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
21946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass EventHub : public EventHubInterface
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EventHub();
22346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t errorCheck() const;
22546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
22646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual uint32_t getDeviceClasses(int32_t deviceId) const;
227497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
22846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual String8 getDeviceName(int32_t deviceId) const;
229497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
23047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const;
23147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
2326d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
2336d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            RawAbsoluteAxisInfo* outAxisInfo) const;
2346d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
235cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    virtual bool hasRelativeAxis(int32_t deviceId, int axis) const;
236cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown
2376f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    virtual status_t mapKey(int32_t deviceId, int scancode,
238e3dd884815b2aaeec4241859722ab603e0b1466bDianne Hackborn            int32_t* outKeycode, uint32_t* outFlags) const;
2391d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood
2406f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    virtual status_t mapAxis(int32_t deviceId, int scancode,
2413a22fa057091cd6614f58ebc57a7ce4fe29462bbJeff Brown            AxisInfo* outAxisInfo) const;
2426f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
24346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual void addExcludedDevice(const char* deviceName);
2441d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood
2456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const;
2466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const;
2476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const;
24846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2496d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes,
2506d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            const int32_t* keyCodes, uint8_t* outFlags) const;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
252aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown    virtual bool getEvent(int timeoutMillis, RawEvent* outEvent);
2531d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood
254497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    virtual bool hasLed(int32_t deviceId, int32_t led) const;
255497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    virtual void setLedState(int32_t deviceId, int32_t led, bool on);
256497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2579065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    virtual void getVirtualKeyDefinitions(int32_t deviceId,
2589065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown            Vector<VirtualKeyDefinition>& outVirtualKeys) const;
2599065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
260f2f487183052865d50c004a835360be1728b5a52Jeff Brown    virtual void dump(String8& dump);
261f2f487183052865d50c004a835360be1728b5a52Jeff Brown
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~EventHub();
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool openPlatformInput(void);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    int openDevice(const char *devicePath);
2699065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    int closeDevice(const char *devicePath);
27033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    int closeDeviceAtIndexLocked(int index);
2717342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown    int scanDir(const char *dirname);
2727342bb9693f480f6c713b4a4f82a9ad9131cd667Jeff Brown    int readNotify(int nfd);
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t mError;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    struct Device {
2779065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        Device* next;
2789065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
2799065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        int fd;
2809065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        const int32_t id;
2819065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        const String8 path;
2829065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        const InputDeviceIdentifier identifier;
2839065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
2849065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        uint32_t classes;
2859065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        uint8_t* keyBitmask;
286cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown        uint8_t* relBitmask;
2879065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        String8 configurationFile;
2889065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        PropertyMap* configuration;
2899065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        VirtualKeyMap* virtualKeyMap;
2909065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        KeyMap keyMap;
2919065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
2929065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        Device(int fd, int32_t id, const String8& path, const InputDeviceIdentifier& identifier);
2939065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        ~Device();
2949065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
2959065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        void close();
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    Device* getDeviceLocked(int32_t deviceId) const;
2999065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    bool hasKeycodeLocked(Device* device, int keycode) const;
300497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
3019065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    int32_t getScanCodeStateLocked(Device* device, int32_t scanCode) const;
3029065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    int32_t getKeyCodeStateLocked(Device* device, int32_t keyCode) const;
3039065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    int32_t getSwitchStateLocked(Device* device, int32_t sw) const;
3049065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    bool markSupportedKeyCodesLocked(Device* device, size_t numCodes,
3056d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            const int32_t* keyCodes, uint8_t* outFlags) const;
30646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3079065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    void loadConfiguration(Device* device);
3089065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    status_t loadVirtualKeyMap(Device* device);
3099065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    status_t loadKeyMap(Device* device);
3109065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    void setKeyboardProperties(Device* device, bool builtInKeyboard);
3119065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    void clearKeyboardProperties(Device* device, bool builtInKeyboard);
312497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
31356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    bool isExternalDevice(Device* device);
31456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Protect all internal state.
3169065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    mutable Mutex mLock;
3179065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
3189065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    // The actual id of the built-in keyboard, or -1 if none.
3199065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    // EventHub remaps the built-in keyboard to id 0 externally as required by the API.
3209065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    int32_t mBuiltInKeyboardId;
3219065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
3229065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    int32_t mNextDeviceId;
3239065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
3249065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    // Parallel arrays of fds and devices.
3259065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    // First index is reserved for inotify.
3269065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    Vector<struct pollfd> mFds;
3279065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    Vector<Device*> mDevices;
3289065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
3299065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    Device *mOpeningDevices;
3309065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    Device *mClosingDevices;
3311d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood
3329065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    bool mOpened;
3339065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    bool mNeedToSendFinishedDeviceScan;
3349065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    List<String8> mExcludedDevices;
3351d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // device ids that report particular switches.
3379065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    int32_t mSwitches[SW_MAX + 1];
338cc2e717f1d43a836d1abdee06bcb946416d06fd6Jeff Brown
339cc2e717f1d43a836d1abdee06bcb946416d06fd6Jeff Brown    static const int INPUT_BUFFER_SIZE = 64;
340cc2e717f1d43a836d1abdee06bcb946416d06fd6Jeff Brown    struct input_event mInputBufferData[INPUT_BUFFER_SIZE];
3419065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    size_t mInputBufferIndex;
3429065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    size_t mInputBufferCount;
3439065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    size_t mInputFdIndex;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // _RUNTIME_EVENT_HUB_H
349