Home | History | Annotate | Download | only in ui
      1 /*
      2  * Copyright (C) 2005 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 //
     18 #ifndef _RUNTIME_EVENT_HUB_H
     19 #define _RUNTIME_EVENT_HUB_H
     20 
     21 #include <utils/String8.h>
     22 #include <utils/threads.h>
     23 #include <utils/Log.h>
     24 #include <utils/threads.h>
     25 #include <utils/List.h>
     26 #include <utils/Errors.h>
     27 
     28 #include <linux/input.h>
     29 
     30 struct pollfd;
     31 
     32 namespace android {
     33 
     34 class KeyLayoutMap;
     35 
     36 /*
     37  * Grand Central Station for events.  With a single call to waitEvent()
     38  * you can wait for:
     39  *  - input events from the keypad of a real device
     40  *  - input events and meta-events (e.g. "quit") from the simulator
     41  *  - synthetic events from the runtime (e.g. "URL fetch completed")
     42  *  - real or forged "vsync" events
     43  *
     44  * Do not instantiate this class.  Instead, call startUp().
     45  */
     46 class EventHub : public RefBase
     47 {
     48 public:
     49     EventHub();
     50 
     51     status_t errorCheck() const;
     52 
     53     // bit fields for classes of devices.
     54     enum {
     55         CLASS_KEYBOARD      = 0x00000001,
     56         CLASS_ALPHAKEY      = 0x00000002,
     57         CLASS_TOUCHSCREEN   = 0x00000004,
     58         CLASS_TRACKBALL     = 0x00000008,
     59         CLASS_TOUCHSCREEN_MT= 0x00000010,
     60         CLASS_DPAD          = 0x00000020
     61     };
     62     uint32_t getDeviceClasses(int32_t deviceId) const;
     63 
     64     String8 getDeviceName(int32_t deviceId) const;
     65 
     66     int getAbsoluteInfo(int32_t deviceId, int axis, int *outMinValue,
     67             int* outMaxValue, int* outFlat, int* outFuzz) const;
     68 
     69     int getSwitchState(int sw) const;
     70     int getSwitchState(int32_t deviceId, int sw) const;
     71 
     72     int getScancodeState(int key) const;
     73     int getScancodeState(int32_t deviceId, int key) const;
     74 
     75     int getKeycodeState(int key) const;
     76     int getKeycodeState(int32_t deviceId, int key) const;
     77 
     78     status_t scancodeToKeycode(int32_t deviceId, int scancode,
     79             int32_t* outKeycode, uint32_t* outFlags) const;
     80 
     81     // exclude a particular device from opening
     82     // this can be used to ignore input devices for sensors
     83     void addExcludedDevice(const char* deviceName);
     84 
     85     // special type codes when devices are added/removed.
     86     enum {
     87         DEVICE_ADDED = 0x10000000,
     88         DEVICE_REMOVED = 0x20000000
     89     };
     90 
     91     // examine key input devices for specific framework keycode support
     92     bool hasKeys(size_t numCodes, int32_t* keyCodes, uint8_t* outFlags);
     93 
     94     virtual bool getEvent(int32_t* outDeviceId, int32_t* outType,
     95             int32_t* outScancode, int32_t* outKeycode, uint32_t *outFlags,
     96             int32_t* outValue, nsecs_t* outWhen);
     97 
     98 protected:
     99     virtual ~EventHub();
    100 
    101 private:
    102     bool openPlatformInput(void);
    103     int32_t convertDeviceKey_TI_P2(int code);
    104 
    105     int open_device(const char *device);
    106     int close_device(const char *device);
    107     int scan_dir(const char *dirname);
    108     int read_notify(int nfd);
    109 
    110     status_t mError;
    111 
    112     struct device_t {
    113         const int32_t   id;
    114         const String8   path;
    115         String8         name;
    116         uint32_t        classes;
    117         uint8_t*        keyBitmask;
    118         KeyLayoutMap*   layoutMap;
    119         String8         keylayoutFilename;
    120         device_t*       next;
    121 
    122         device_t(int32_t _id, const char* _path, const char* name);
    123         ~device_t();
    124     };
    125 
    126     device_t* getDevice(int32_t deviceId) const;
    127     bool hasKeycode(device_t* device, int keycode) const;
    128 
    129     // Protect all internal state.
    130     mutable Mutex   mLock;
    131 
    132     bool            mHaveFirstKeyboard;
    133     int32_t         mFirstKeyboardId; // the API is that the built-in keyboard is id 0, so map it
    134 
    135     struct device_ent {
    136         device_t* device;
    137         uint32_t seq;
    138     };
    139     device_ent      *mDevicesById;
    140     int             mNumDevicesById;
    141 
    142     device_t        *mOpeningDevices;
    143     device_t        *mClosingDevices;
    144 
    145     device_t        **mDevices;
    146     struct pollfd   *mFDs;
    147     int             mFDCount;
    148 
    149     bool            mOpened;
    150     List<String8>   mExcludedDevices;
    151 
    152     // device ids that report particular switches.
    153 #ifdef EV_SW
    154     int32_t         mSwitches[SW_MAX+1];
    155 #endif
    156 };
    157 
    158 }; // namespace android
    159 
    160 #endif // _RUNTIME_EVENT_HUB_H
    161