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