• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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