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 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String8.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 233b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Log.h> 243b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/threads.h> 253b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/List.h> 263b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Errors.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <linux/input.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct pollfd; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass KeyLayoutMap; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Grand Central Station for events. With a single call to waitEvent() 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you can wait for: 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - input events from the keypad of a real device 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - input events and meta-events (e.g. "quit") from the simulator 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - synthetic events from the runtime (e.g. "URL fetch completed") 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - real or forged "vsync" events 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Do not instantiate this class. Instead, call startUp(). 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass EventHub : public RefBase 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EventHub(); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t errorCheck() const; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bit fields for classes of devices. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLASS_KEYBOARD = 0x00000001, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLASS_ALPHAKEY = 0x00000002, 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLASS_TOUCHSCREEN = 0x00000004, 580dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn CLASS_TRACKBALL = 0x00000008, 590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn CLASS_TOUCHSCREEN_MT= 0x00000010, 600dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn CLASS_DPAD = 0x00000020 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t getDeviceClasses(int32_t deviceId) const; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 getDeviceName(int32_t deviceId) const; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getAbsoluteInfo(int32_t deviceId, int axis, int *outMinValue, 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int* outMaxValue, int* outFlat, int* outFuzz) const; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getSwitchState(int sw) const; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getSwitchState(int32_t deviceId, int sw) const; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getScancodeState(int key) const; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getScancodeState(int32_t deviceId, int key) const; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getKeycodeState(int key) const; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getKeycodeState(int32_t deviceId, int key) const; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78e3dd884815b2aaeec4241859722ab603e0b1466bDianne Hackborn status_t scancodeToKeycode(int32_t deviceId, int scancode, 79e3dd884815b2aaeec4241859722ab603e0b1466bDianne Hackborn int32_t* outKeycode, uint32_t* outFlags) const; 801d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 811d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood // exclude a particular device from opening 821d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood // this can be used to ignore input devices for sensors 831d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood void addExcludedDevice(const char* deviceName); 841d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // special type codes when devices are added/removed. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DEVICE_ADDED = 0x10000000, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DEVICE_REMOVED = 0x20000000 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // examine key input devices for specific framework keycode support 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool hasKeys(size_t numCodes, int32_t* keyCodes, uint8_t* outFlags); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool getEvent(int32_t* outDeviceId, int32_t* outType, 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t* outScancode, int32_t* outKeycode, uint32_t *outFlags, 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t* outValue, nsecs_t* outWhen); 971d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~EventHub(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool openPlatformInput(void); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t convertDeviceKey_TI_P2(int code); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int open_device(const char *device); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int close_device(const char *device); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int scan_dir(const char *dirname); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int read_notify(int nfd); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t mError; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct device_t { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int32_t id; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8 path; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 name; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t classes; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t* keyBitmask; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyLayoutMap* layoutMap; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 keylayoutFilename; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project device_t* next; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 122fc2ebc473bbca6f9e6e30ea5de979c4852f35319Iliyan Malchev device_t(int32_t _id, const char* _path, const char* name); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~device_t(); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project device_t* getDevice(int32_t deviceId) const; 1270dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn bool hasKeycode(device_t* device, int keycode) const; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Protect all internal state. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable Mutex mLock; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mHaveFirstKeyboard; 133e3dd884815b2aaeec4241859722ab603e0b1466bDianne Hackborn int32_t mFirstKeyboardId; // the API is that the built-in keyboard is id 0, so map it 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct device_ent { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project device_t* device; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t seq; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project device_ent *mDevicesById; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mNumDevicesById; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project device_t *mOpeningDevices; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project device_t *mClosingDevices; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project device_t **mDevices; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct pollfd *mFDs; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mFDCount; 1481d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 1491d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood bool mOpened; 1501d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood List<String8> mExcludedDevices; 1511d9dfc5dcf459e85cffcb762ffdb9b9a4abbfd67Mike Lockwood 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // device ids that report particular switches. 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef EV_SW 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t mSwitches[SW_MAX+1]; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // _RUNTIME_EVENT_HUB_H 161