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