blob: 0485617bfb738e245661ed94d6167de2efd66b05 [file] [log] [blame]
Jeff Brown46b9ac02010-04-22 18:58:52 -07001/*
2 * Copyright (C) 2010 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#ifndef _UI_INPUT_READER_H
18#define _UI_INPUT_READER_H
19
Jeff Brownb4ff35d2011-01-02 16:37:43 -080020#include "EventHub.h"
21#include "InputDispatcher.h"
22#include "PointerController.h"
23
Jeff Brown46b9ac02010-04-22 18:58:52 -070024#include <ui/Input.h>
Jeff Brownb4ff35d2011-01-02 16:37:43 -080025#include <ui/DisplayInfo.h>
Jeff Brown46b9ac02010-04-22 18:58:52 -070026#include <utils/KeyedVector.h>
27#include <utils/threads.h>
28#include <utils/Timers.h>
29#include <utils/RefBase.h>
30#include <utils/String8.h>
31#include <utils/BitSet.h>
32
33#include <stddef.h>
34#include <unistd.h>
35
Jeff Brown46b9ac02010-04-22 18:58:52 -070036namespace android {
37
Jeff Brown6d0fec22010-07-23 21:28:06 -070038class InputDevice;
39class InputMapper;
40
Jeff Brown8d608662010-08-30 03:02:23 -070041
Jeff Brown9c3cda02010-06-15 01:31:58 -070042/*
43 * Input reader policy interface.
44 *
45 * The input reader policy is used by the input reader to interact with the Window Manager
46 * and other system components.
47 *
48 * The actual implementation is partially supported by callbacks into the DVM
49 * via JNI. This interface is also mocked in the unit tests.
50 */
51class InputReaderPolicyInterface : public virtual RefBase {
52protected:
53 InputReaderPolicyInterface() { }
54 virtual ~InputReaderPolicyInterface() { }
55
56public:
57 /* Display orientations. */
58 enum {
59 ROTATION_0 = 0,
60 ROTATION_90 = 1,
61 ROTATION_180 = 2,
62 ROTATION_270 = 3
63 };
64
Jeff Brown9c3cda02010-06-15 01:31:58 -070065 /* Gets information about the display with the specified id.
66 * Returns true if the display info is available, false otherwise.
67 */
68 virtual bool getDisplayInfo(int32_t displayId,
69 int32_t* width, int32_t* height, int32_t* orientation) = 0;
70
Jeff Brown9c3cda02010-06-15 01:31:58 -070071 /* Determines whether to turn on some hacks we have to improve the touch interaction with a
72 * certain device whose screen currently is not all that good.
73 */
74 virtual bool filterTouchEvents() = 0;
75
76 /* Determines whether to turn on some hacks to improve touch interaction with another device
77 * where touch coordinate data can get corrupted.
78 */
79 virtual bool filterJumpyTouchEvents() = 0;
80
Jeff Brownfe508922011-01-18 15:10:10 -080081 /* Gets the amount of time to disable virtual keys after the screen is touched
82 * in order to filter out accidental virtual key presses due to swiping gestures
83 * or taps near the edge of the display. May be 0 to disable the feature.
84 */
85 virtual nsecs_t getVirtualKeyQuietTime() = 0;
86
Jeff Brown9c3cda02010-06-15 01:31:58 -070087 /* Gets the excluded device names for the platform. */
88 virtual void getExcludedDeviceNames(Vector<String8>& outExcludedDeviceNames) = 0;
Jeff Brown83c09682010-12-23 17:50:18 -080089
90 /* Gets a pointer controller associated with the specified cursor device (ie. a mouse). */
91 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) = 0;
Jeff Brown9c3cda02010-06-15 01:31:58 -070092};
93
94
95/* Processes raw input events and sends cooked event data to an input dispatcher. */
Jeff Brown46b9ac02010-04-22 18:58:52 -070096class InputReaderInterface : public virtual RefBase {
97protected:
98 InputReaderInterface() { }
99 virtual ~InputReaderInterface() { }
100
101public:
Jeff Brownb88102f2010-09-08 11:49:43 -0700102 /* Dumps the state of the input reader.
103 *
104 * This method may be called on any thread (usually by the input manager). */
105 virtual void dump(String8& dump) = 0;
106
Jeff Brown46b9ac02010-04-22 18:58:52 -0700107 /* Runs a single iteration of the processing loop.
108 * Nominally reads and processes one incoming message from the EventHub.
109 *
110 * This method should be called on the input reader thread.
111 */
112 virtual void loopOnce() = 0;
113
Jeff Brown9c3cda02010-06-15 01:31:58 -0700114 /* Gets the current input device configuration.
115 *
116 * This method may be called on any thread (usually by the input manager).
117 */
Jeff Brown6d0fec22010-07-23 21:28:06 -0700118 virtual void getInputConfiguration(InputConfiguration* outConfiguration) = 0;
Jeff Brown9c3cda02010-06-15 01:31:58 -0700119
Jeff Brown6d0fec22010-07-23 21:28:06 -0700120 /* Gets information about the specified input device.
121 * Returns OK if the device information was obtained or NAME_NOT_FOUND if there
122 * was no such device.
123 *
124 * This method may be called on any thread (usually by the input manager).
Jeff Brown9c3cda02010-06-15 01:31:58 -0700125 */
Jeff Brown6d0fec22010-07-23 21:28:06 -0700126 virtual status_t getInputDeviceInfo(int32_t deviceId, InputDeviceInfo* outDeviceInfo) = 0;
127
128 /* Gets the list of all registered device ids. */
129 virtual void getInputDeviceIds(Vector<int32_t>& outDeviceIds) = 0;
130
131 /* Query current input state. */
132 virtual int32_t getScanCodeState(int32_t deviceId, uint32_t sourceMask,
133 int32_t scanCode) = 0;
134 virtual int32_t getKeyCodeState(int32_t deviceId, uint32_t sourceMask,
135 int32_t keyCode) = 0;
136 virtual int32_t getSwitchState(int32_t deviceId, uint32_t sourceMask,
137 int32_t sw) = 0;
Jeff Brown9c3cda02010-06-15 01:31:58 -0700138
139 /* Determine whether physical keys exist for the given framework-domain key codes. */
Jeff Brown6d0fec22010-07-23 21:28:06 -0700140 virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask,
141 size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) = 0;
142};
143
144
145/* Internal interface used by individual input devices to access global input device state
146 * and parameters maintained by the input reader.
147 */
148class InputReaderContext {
Jeff Brownc3db8582010-10-20 15:33:38 -0700149public:
Jeff Brown6d0fec22010-07-23 21:28:06 -0700150 InputReaderContext() { }
151 virtual ~InputReaderContext() { }
152
Jeff Brown6d0fec22010-07-23 21:28:06 -0700153 virtual void updateGlobalMetaState() = 0;
154 virtual int32_t getGlobalMetaState() = 0;
155
Jeff Brownfe508922011-01-18 15:10:10 -0800156 virtual void disableVirtualKeysUntil(nsecs_t time) = 0;
157 virtual bool shouldDropVirtualKey(nsecs_t now,
158 InputDevice* device, int32_t keyCode, int32_t scanCode) = 0;
159
Jeff Brown05dc66a2011-03-02 14:41:58 -0800160 virtual void fadePointer() = 0;
161
Jeff Brownaa3855d2011-03-17 01:34:19 -0700162 virtual void requestTimeoutAtTime(nsecs_t when) = 0;
163
Jeff Brown6d0fec22010-07-23 21:28:06 -0700164 virtual InputReaderPolicyInterface* getPolicy() = 0;
165 virtual InputDispatcherInterface* getDispatcher() = 0;
166 virtual EventHubInterface* getEventHub() = 0;
Jeff Brown46b9ac02010-04-22 18:58:52 -0700167};
168
Jeff Brown9c3cda02010-06-15 01:31:58 -0700169
Jeff Brown46b9ac02010-04-22 18:58:52 -0700170/* The input reader reads raw event data from the event hub and processes it into input events
Jeff Brown9c3cda02010-06-15 01:31:58 -0700171 * that it sends to the input dispatcher. Some functions of the input reader, such as early
172 * event filtering in low power states, are controlled by a separate policy object.
173 *
174 * IMPORTANT INVARIANT:
Jeff Brown6d0fec22010-07-23 21:28:06 -0700175 * Because the policy and dispatcher can potentially block or cause re-entrance into
176 * the input reader, the input reader never calls into other components while holding
Jeff Brown6328cdc2010-07-29 18:18:33 -0700177 * an exclusive internal lock whenever re-entrance can happen.
Jeff Brown46b9ac02010-04-22 18:58:52 -0700178 */
Jeff Brownc3db8582010-10-20 15:33:38 -0700179class InputReader : public InputReaderInterface, protected InputReaderContext {
Jeff Brown46b9ac02010-04-22 18:58:52 -0700180public:
181 InputReader(const sp<EventHubInterface>& eventHub,
Jeff Brown9c3cda02010-06-15 01:31:58 -0700182 const sp<InputReaderPolicyInterface>& policy,
Jeff Brown46b9ac02010-04-22 18:58:52 -0700183 const sp<InputDispatcherInterface>& dispatcher);
184 virtual ~InputReader();
185
Jeff Brownb88102f2010-09-08 11:49:43 -0700186 virtual void dump(String8& dump);
187
Jeff Brown46b9ac02010-04-22 18:58:52 -0700188 virtual void loopOnce();
189
Jeff Brown6d0fec22010-07-23 21:28:06 -0700190 virtual void getInputConfiguration(InputConfiguration* outConfiguration);
Jeff Brown46b9ac02010-04-22 18:58:52 -0700191
Jeff Brown6d0fec22010-07-23 21:28:06 -0700192 virtual status_t getInputDeviceInfo(int32_t deviceId, InputDeviceInfo* outDeviceInfo);
193 virtual void getInputDeviceIds(Vector<int32_t>& outDeviceIds);
Jeff Brown9c3cda02010-06-15 01:31:58 -0700194
Jeff Brown6d0fec22010-07-23 21:28:06 -0700195 virtual int32_t getScanCodeState(int32_t deviceId, uint32_t sourceMask,
196 int32_t scanCode);
197 virtual int32_t getKeyCodeState(int32_t deviceId, uint32_t sourceMask,
198 int32_t keyCode);
199 virtual int32_t getSwitchState(int32_t deviceId, uint32_t sourceMask,
200 int32_t sw);
Jeff Brown9c3cda02010-06-15 01:31:58 -0700201
Jeff Brown6d0fec22010-07-23 21:28:06 -0700202 virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask,
203 size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags);
Jeff Brown9c3cda02010-06-15 01:31:58 -0700204
Jeff Brownc3db8582010-10-20 15:33:38 -0700205protected:
206 // These methods are protected virtual so they can be overridden and instrumented
207 // by test cases.
208 virtual InputDevice* createDevice(int32_t deviceId, const String8& name, uint32_t classes);
209
Jeff Brown46b9ac02010-04-22 18:58:52 -0700210private:
Jeff Brown46b9ac02010-04-22 18:58:52 -0700211 sp<EventHubInterface> mEventHub;
Jeff Brown9c3cda02010-06-15 01:31:58 -0700212 sp<InputReaderPolicyInterface> mPolicy;
Jeff Brown46b9ac02010-04-22 18:58:52 -0700213 sp<InputDispatcherInterface> mDispatcher;
214
Jeff Brown6d0fec22010-07-23 21:28:06 -0700215 virtual InputReaderPolicyInterface* getPolicy() { return mPolicy.get(); }
216 virtual InputDispatcherInterface* getDispatcher() { return mDispatcher.get(); }
217 virtual EventHubInterface* getEventHub() { return mEventHub.get(); }
218
Jeff Brownb7198742011-03-18 18:14:26 -0700219 // The event queue.
220 static const int EVENT_BUFFER_SIZE = 256;
221 RawEvent mEventBuffer[EVENT_BUFFER_SIZE];
222
Jeff Brown6d0fec22010-07-23 21:28:06 -0700223 // This reader/writer lock guards the list of input devices.
224 // The writer lock must be held whenever the list of input devices is modified
225 // and then promptly released.
226 // The reader lock must be held whenever the list of input devices is traversed or an
227 // input device in the list is accessed.
228 // This lock only protects the registry and prevents inadvertent deletion of device objects
229 // that are in use. Individual devices are responsible for guarding their own internal state
230 // as needed for concurrent operation.
231 RWLock mDeviceRegistryLock;
Jeff Brown46b9ac02010-04-22 18:58:52 -0700232 KeyedVector<int32_t, InputDevice*> mDevices;
233
Jeff Brown6d0fec22010-07-23 21:28:06 -0700234 // low-level input event decoding and device management
Jeff Brownb7198742011-03-18 18:14:26 -0700235 void processEvents(const RawEvent* rawEvents, size_t count);
Jeff Brown46b9ac02010-04-22 18:58:52 -0700236
Jeff Brown7342bb92010-10-01 18:55:43 -0700237 void addDevice(int32_t deviceId);
238 void removeDevice(int32_t deviceId);
Jeff Brownb7198742011-03-18 18:14:26 -0700239 void processEventsForDevice(int32_t deviceId, const RawEvent* rawEvents, size_t count);
Jeff Brownaa3855d2011-03-17 01:34:19 -0700240 void timeoutExpired(nsecs_t when);
Jeff Brown46b9ac02010-04-22 18:58:52 -0700241
Jeff Brownc3db8582010-10-20 15:33:38 -0700242 void handleConfigurationChanged(nsecs_t when);
Jeff Brownb7198742011-03-18 18:14:26 -0700243 void configureExcludedDevices();
Jeff Brown9c3cda02010-06-15 01:31:58 -0700244
Jeff Brown6d0fec22010-07-23 21:28:06 -0700245 // state management for all devices
246 Mutex mStateLock;
247
248 int32_t mGlobalMetaState;
249 virtual void updateGlobalMetaState();
250 virtual int32_t getGlobalMetaState();
251
Jeff Brown05dc66a2011-03-02 14:41:58 -0800252 virtual void fadePointer();
253
Jeff Brown6d0fec22010-07-23 21:28:06 -0700254 InputConfiguration mInputConfiguration;
255 void updateInputConfiguration();
256
Jeff Brownb7198742011-03-18 18:14:26 -0700257 nsecs_t mDisableVirtualKeysTimeout; // only accessed by reader thread
Jeff Brownfe508922011-01-18 15:10:10 -0800258 virtual void disableVirtualKeysUntil(nsecs_t time);
259 virtual bool shouldDropVirtualKey(nsecs_t now,
260 InputDevice* device, int32_t keyCode, int32_t scanCode);
261
Jeff Brownb7198742011-03-18 18:14:26 -0700262 nsecs_t mNextTimeout; // only accessed by reader thread
Jeff Brownaa3855d2011-03-17 01:34:19 -0700263 virtual void requestTimeoutAtTime(nsecs_t when);
264
Jeff Brown6d0fec22010-07-23 21:28:06 -0700265 // state queries
266 typedef int32_t (InputDevice::*GetStateFunc)(uint32_t sourceMask, int32_t code);
267 int32_t getState(int32_t deviceId, uint32_t sourceMask, int32_t code,
268 GetStateFunc getStateFunc);
269 bool markSupportedKeyCodes(int32_t deviceId, uint32_t sourceMask, size_t numCodes,
270 const int32_t* keyCodes, uint8_t* outFlags);
Jeff Brown46b9ac02010-04-22 18:58:52 -0700271};
272
273
274/* Reads raw events from the event hub and processes them, endlessly. */
275class InputReaderThread : public Thread {
276public:
277 InputReaderThread(const sp<InputReaderInterface>& reader);
278 virtual ~InputReaderThread();
279
280private:
281 sp<InputReaderInterface> mReader;
282
283 virtual bool threadLoop();
284};
285
Jeff Brown6d0fec22010-07-23 21:28:06 -0700286
287/* Represents the state of a single input device. */
288class InputDevice {
289public:
290 InputDevice(InputReaderContext* context, int32_t id, const String8& name);
291 ~InputDevice();
292
293 inline InputReaderContext* getContext() { return mContext; }
294 inline int32_t getId() { return mId; }
295 inline const String8& getName() { return mName; }
296 inline uint32_t getSources() { return mSources; }
297
Jeff Brown56194eb2011-03-02 19:23:13 -0800298 inline bool isExternal() { return mIsExternal; }
299 inline void setExternal(bool external) { mIsExternal = external; }
300
Jeff Brown6d0fec22010-07-23 21:28:06 -0700301 inline bool isIgnored() { return mMappers.isEmpty(); }
302
Jeff Brownef3d7e82010-09-30 14:33:04 -0700303 void dump(String8& dump);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700304 void addMapper(InputMapper* mapper);
305 void configure();
306 void reset();
Jeff Brownb7198742011-03-18 18:14:26 -0700307 void process(const RawEvent* rawEvents, size_t count);
Jeff Brownaa3855d2011-03-17 01:34:19 -0700308 void timeoutExpired(nsecs_t when);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700309
310 void getDeviceInfo(InputDeviceInfo* outDeviceInfo);
311 int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
312 int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
313 int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
314 bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
315 const int32_t* keyCodes, uint8_t* outFlags);
316
317 int32_t getMetaState();
318
Jeff Brown05dc66a2011-03-02 14:41:58 -0800319 void fadePointer();
320
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800321 inline const PropertyMap& getConfiguration() {
322 return mConfiguration;
Jeff Brown8d608662010-08-30 03:02:23 -0700323 }
324
Jeff Brown6d0fec22010-07-23 21:28:06 -0700325private:
326 InputReaderContext* mContext;
327 int32_t mId;
328
329 Vector<InputMapper*> mMappers;
330
331 String8 mName;
332 uint32_t mSources;
Jeff Brown56194eb2011-03-02 19:23:13 -0800333 bool mIsExternal;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700334
335 typedef int32_t (InputMapper::*GetStateFunc)(uint32_t sourceMask, int32_t code);
336 int32_t getState(uint32_t sourceMask, int32_t code, GetStateFunc getStateFunc);
Jeff Brown8d608662010-08-30 03:02:23 -0700337
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800338 PropertyMap mConfiguration;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700339};
340
341
342/* An input mapper transforms raw input events into cooked event data.
343 * A single input device can have multiple associated input mappers in order to interpret
344 * different classes of events.
345 */
346class InputMapper {
347public:
348 InputMapper(InputDevice* device);
349 virtual ~InputMapper();
350
351 inline InputDevice* getDevice() { return mDevice; }
352 inline int32_t getDeviceId() { return mDevice->getId(); }
353 inline const String8 getDeviceName() { return mDevice->getName(); }
354 inline InputReaderContext* getContext() { return mContext; }
355 inline InputReaderPolicyInterface* getPolicy() { return mContext->getPolicy(); }
356 inline InputDispatcherInterface* getDispatcher() { return mContext->getDispatcher(); }
357 inline EventHubInterface* getEventHub() { return mContext->getEventHub(); }
358
359 virtual uint32_t getSources() = 0;
360 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
Jeff Brownef3d7e82010-09-30 14:33:04 -0700361 virtual void dump(String8& dump);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700362 virtual void configure();
363 virtual void reset();
364 virtual void process(const RawEvent* rawEvent) = 0;
Jeff Brownaa3855d2011-03-17 01:34:19 -0700365 virtual void timeoutExpired(nsecs_t when);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700366
367 virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
368 virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
369 virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
370 virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
371 const int32_t* keyCodes, uint8_t* outFlags);
372
373 virtual int32_t getMetaState();
374
Jeff Brown05dc66a2011-03-02 14:41:58 -0800375 virtual void fadePointer();
376
Jeff Brown6d0fec22010-07-23 21:28:06 -0700377protected:
378 InputDevice* mDevice;
379 InputReaderContext* mContext;
Jeff Browncb1404e2011-01-15 18:14:15 -0800380
381 static void dumpRawAbsoluteAxisInfo(String8& dump,
382 const RawAbsoluteAxisInfo& axis, const char* name);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700383};
384
385
386class SwitchInputMapper : public InputMapper {
387public:
388 SwitchInputMapper(InputDevice* device);
389 virtual ~SwitchInputMapper();
390
391 virtual uint32_t getSources();
392 virtual void process(const RawEvent* rawEvent);
393
394 virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
395
396private:
397 void processSwitch(nsecs_t when, int32_t switchCode, int32_t switchValue);
398};
399
400
401class KeyboardInputMapper : public InputMapper {
402public:
Jeff Brownefd32662011-03-08 15:13:06 -0800403 KeyboardInputMapper(InputDevice* device, uint32_t source, int32_t keyboardType);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700404 virtual ~KeyboardInputMapper();
405
406 virtual uint32_t getSources();
407 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
Jeff Brownef3d7e82010-09-30 14:33:04 -0700408 virtual void dump(String8& dump);
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800409 virtual void configure();
Jeff Brown6d0fec22010-07-23 21:28:06 -0700410 virtual void reset();
411 virtual void process(const RawEvent* rawEvent);
412
413 virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
414 virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
415 virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
416 const int32_t* keyCodes, uint8_t* outFlags);
417
418 virtual int32_t getMetaState();
419
420private:
Jeff Brown6328cdc2010-07-29 18:18:33 -0700421 Mutex mLock;
422
Jeff Brown6d0fec22010-07-23 21:28:06 -0700423 struct KeyDown {
424 int32_t keyCode;
425 int32_t scanCode;
426 };
427
Jeff Brownefd32662011-03-08 15:13:06 -0800428 uint32_t mSource;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700429 int32_t mKeyboardType;
430
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800431 // Immutable configuration parameters.
432 struct Parameters {
433 int32_t associatedDisplayId;
434 bool orientationAware;
435 } mParameters;
436
Jeff Brown6328cdc2010-07-29 18:18:33 -0700437 struct LockedState {
438 Vector<KeyDown> keyDowns; // keys that are down
439 int32_t metaState;
440 nsecs_t downTime; // time of most recent key down
Jeff Brown497a92c2010-09-12 17:55:08 -0700441
442 struct LedState {
443 bool avail; // led is available
444 bool on; // we think the led is currently on
445 };
446 LedState capsLockLedState;
447 LedState numLockLedState;
448 LedState scrollLockLedState;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700449 } mLocked;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700450
Jeff Brown6328cdc2010-07-29 18:18:33 -0700451 void initializeLocked();
Jeff Brown6d0fec22010-07-23 21:28:06 -0700452
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800453 void configureParameters();
454 void dumpParameters(String8& dump);
455
Jeff Brown6d0fec22010-07-23 21:28:06 -0700456 bool isKeyboardOrGamepadKey(int32_t scanCode);
Jeff Brown6328cdc2010-07-29 18:18:33 -0700457
Jeff Brown6d0fec22010-07-23 21:28:06 -0700458 void processKey(nsecs_t when, bool down, int32_t keyCode, int32_t scanCode,
459 uint32_t policyFlags);
460
Jeff Brown6328cdc2010-07-29 18:18:33 -0700461 ssize_t findKeyDownLocked(int32_t scanCode);
Jeff Brown497a92c2010-09-12 17:55:08 -0700462
Jeff Brown49ed71d2010-12-06 17:13:33 -0800463 void resetLedStateLocked();
464 void initializeLedStateLocked(LockedState::LedState& ledState, int32_t led);
Jeff Brown497a92c2010-09-12 17:55:08 -0700465 void updateLedStateLocked(bool reset);
466 void updateLedStateForModifierLocked(LockedState::LedState& ledState, int32_t led,
467 int32_t modifier, bool reset);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700468};
469
470
Jeff Brown83c09682010-12-23 17:50:18 -0800471class CursorInputMapper : public InputMapper {
Jeff Brown6d0fec22010-07-23 21:28:06 -0700472public:
Jeff Brown83c09682010-12-23 17:50:18 -0800473 CursorInputMapper(InputDevice* device);
474 virtual ~CursorInputMapper();
Jeff Brown6d0fec22010-07-23 21:28:06 -0700475
476 virtual uint32_t getSources();
477 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
Jeff Brownef3d7e82010-09-30 14:33:04 -0700478 virtual void dump(String8& dump);
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800479 virtual void configure();
Jeff Brown6d0fec22010-07-23 21:28:06 -0700480 virtual void reset();
481 virtual void process(const RawEvent* rawEvent);
482
Jeff Brownc3fc2d02010-08-10 15:47:53 -0700483 virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
484
Jeff Brown05dc66a2011-03-02 14:41:58 -0800485 virtual void fadePointer();
486
Jeff Brown6d0fec22010-07-23 21:28:06 -0700487private:
488 // Amount that trackball needs to move in order to generate a key event.
489 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD = 6;
490
Jeff Brown6328cdc2010-07-29 18:18:33 -0700491 Mutex mLock;
492
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800493 // Immutable configuration parameters.
494 struct Parameters {
Jeff Brown83c09682010-12-23 17:50:18 -0800495 enum Mode {
496 MODE_POINTER,
497 MODE_NAVIGATION,
498 };
499
500 Mode mode;
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800501 int32_t associatedDisplayId;
502 bool orientationAware;
503 } mParameters;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700504
505 struct Accumulator {
506 enum {
Jeff Brownefd32662011-03-08 15:13:06 -0800507 FIELD_BUTTONS = 1,
Jeff Brown6d0fec22010-07-23 21:28:06 -0700508 FIELD_REL_X = 2,
Jeff Brown6f2fba42011-02-19 01:08:02 -0800509 FIELD_REL_Y = 4,
510 FIELD_REL_WHEEL = 8,
511 FIELD_REL_HWHEEL = 16,
Jeff Brown6d0fec22010-07-23 21:28:06 -0700512 };
513
514 uint32_t fields;
515
Jeff Brownefd32662011-03-08 15:13:06 -0800516 uint32_t buttonDown;
517 uint32_t buttonUp;
518
Jeff Brown6d0fec22010-07-23 21:28:06 -0700519 int32_t relX;
520 int32_t relY;
Jeff Brown6f2fba42011-02-19 01:08:02 -0800521 int32_t relWheel;
522 int32_t relHWheel;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700523
524 inline void clear() {
525 fields = 0;
526 }
Jeff Brown6d0fec22010-07-23 21:28:06 -0700527 } mAccumulator;
528
Jeff Brownefd32662011-03-08 15:13:06 -0800529 int32_t mSource;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700530 float mXScale;
531 float mYScale;
532 float mXPrecision;
533 float mYPrecision;
Jeff Brown6f2fba42011-02-19 01:08:02 -0800534
535 bool mHaveVWheel;
536 bool mHaveHWheel;
537 float mVWheelScale;
538 float mHWheelScale;
539
Jeff Brown83c09682010-12-23 17:50:18 -0800540 sp<PointerControllerInterface> mPointerController;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700541
Jeff Brown6328cdc2010-07-29 18:18:33 -0700542 struct LockedState {
Jeff Brownefd32662011-03-08 15:13:06 -0800543 uint32_t buttonState;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700544 nsecs_t downTime;
545 } mLocked;
546
547 void initializeLocked();
Jeff Brown6d0fec22010-07-23 21:28:06 -0700548
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800549 void configureParameters();
550 void dumpParameters(String8& dump);
551
Jeff Brown6d0fec22010-07-23 21:28:06 -0700552 void sync(nsecs_t when);
553};
554
555
556class TouchInputMapper : public InputMapper {
557public:
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800558 TouchInputMapper(InputDevice* device);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700559 virtual ~TouchInputMapper();
560
561 virtual uint32_t getSources();
562 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
Jeff Brownef3d7e82010-09-30 14:33:04 -0700563 virtual void dump(String8& dump);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700564 virtual void configure();
565 virtual void reset();
566
567 virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
568 virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
569 virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
570 const int32_t* keyCodes, uint8_t* outFlags);
571
Jeff Brownace13b12011-03-09 17:39:48 -0800572 virtual void fadePointer();
Jeff Brown79ac9692011-04-19 21:20:10 -0700573 virtual void timeoutExpired(nsecs_t when);
Jeff Brownace13b12011-03-09 17:39:48 -0800574
Jeff Brown6d0fec22010-07-23 21:28:06 -0700575protected:
Jeff Brown6328cdc2010-07-29 18:18:33 -0700576 Mutex mLock;
577
Jeff Brown6d0fec22010-07-23 21:28:06 -0700578 struct VirtualKey {
579 int32_t keyCode;
580 int32_t scanCode;
581 uint32_t flags;
582
583 // computed hit box, specified in touch screen coords based on known display size
584 int32_t hitLeft;
585 int32_t hitTop;
586 int32_t hitRight;
587 int32_t hitBottom;
588
589 inline bool isHit(int32_t x, int32_t y) const {
590 return x >= hitLeft && x <= hitRight && y >= hitTop && y <= hitBottom;
591 }
592 };
593
Jeff Brown8d608662010-08-30 03:02:23 -0700594 // Raw data for a single pointer.
Jeff Brown6d0fec22010-07-23 21:28:06 -0700595 struct PointerData {
596 uint32_t id;
597 int32_t x;
598 int32_t y;
599 int32_t pressure;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700600 int32_t touchMajor;
601 int32_t touchMinor;
602 int32_t toolMajor;
603 int32_t toolMinor;
604 int32_t orientation;
Jeff Brownc3db8582010-10-20 15:33:38 -0700605
606 inline bool operator== (const PointerData& other) const {
607 return id == other.id
608 && x == other.x
609 && y == other.y
610 && pressure == other.pressure
611 && touchMajor == other.touchMajor
612 && touchMinor == other.touchMinor
613 && toolMajor == other.toolMajor
614 && toolMinor == other.toolMinor
615 && orientation == other.orientation;
616 }
617 inline bool operator!= (const PointerData& other) const {
618 return !(*this == other);
619 }
Jeff Brown6d0fec22010-07-23 21:28:06 -0700620 };
621
Jeff Brown8d608662010-08-30 03:02:23 -0700622 // Raw data for a collection of pointers including a pointer id mapping table.
Jeff Brown6d0fec22010-07-23 21:28:06 -0700623 struct TouchData {
624 uint32_t pointerCount;
625 PointerData pointers[MAX_POINTERS];
626 BitSet32 idBits;
627 uint32_t idToIndex[MAX_POINTER_ID + 1];
Jeff Brownace13b12011-03-09 17:39:48 -0800628 uint32_t buttonState;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700629
630 void copyFrom(const TouchData& other) {
631 pointerCount = other.pointerCount;
632 idBits = other.idBits;
Jeff Brownace13b12011-03-09 17:39:48 -0800633 buttonState = other.buttonState;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700634
635 for (uint32_t i = 0; i < pointerCount; i++) {
636 pointers[i] = other.pointers[i];
Jeff Brown9e2ad362010-07-30 19:20:11 -0700637
638 int id = pointers[i].id;
639 idToIndex[id] = other.idToIndex[id];
Jeff Brown6d0fec22010-07-23 21:28:06 -0700640 }
641 }
642
643 inline void clear() {
644 pointerCount = 0;
645 idBits.clear();
Jeff Brownace13b12011-03-09 17:39:48 -0800646 buttonState = 0;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700647 }
Jeff Brown2352b972011-04-12 22:39:53 -0700648
649 void getCentroid(float* outX, float* outY) {
650 float x = 0, y = 0;
651 if (pointerCount != 0) {
652 for (uint32_t i = 0; i < pointerCount; i++) {
653 x += pointers[i].x;
654 y += pointers[i].y;
655 }
656 x /= pointerCount;
657 y /= pointerCount;
658 }
659 *outX = x;
660 *outY = y;
661 }
Jeff Brown6d0fec22010-07-23 21:28:06 -0700662 };
663
Jeff Brown83c09682010-12-23 17:50:18 -0800664 // Input sources supported by the device.
Jeff Brownefd32662011-03-08 15:13:06 -0800665 uint32_t mTouchSource; // sources when reporting touch data
Jeff Brownace13b12011-03-09 17:39:48 -0800666 uint32_t mPointerSource; // sources when reporting pointer gestures
Jeff Brown83c09682010-12-23 17:50:18 -0800667
Jeff Brown6d0fec22010-07-23 21:28:06 -0700668 // Immutable configuration parameters.
669 struct Parameters {
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800670 enum DeviceType {
671 DEVICE_TYPE_TOUCH_SCREEN,
672 DEVICE_TYPE_TOUCH_PAD,
Jeff Brownace13b12011-03-09 17:39:48 -0800673 DEVICE_TYPE_POINTER,
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800674 };
675
676 DeviceType deviceType;
677 int32_t associatedDisplayId;
678 bool orientationAware;
679
Jeff Brown6d0fec22010-07-23 21:28:06 -0700680 bool useBadTouchFilter;
681 bool useJumpyTouchFilter;
682 bool useAveragingTouchFilter;
Jeff Brownfe508922011-01-18 15:10:10 -0800683 nsecs_t virtualKeyQuietTime;
Jeff Brown2352b972011-04-12 22:39:53 -0700684
685 enum GestureMode {
686 GESTURE_MODE_POINTER,
687 GESTURE_MODE_SPOTS,
688 };
689 GestureMode gestureMode;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700690 } mParameters;
691
Jeff Brown8d608662010-08-30 03:02:23 -0700692 // Immutable calibration parameters in parsed form.
693 struct Calibration {
Jeff Brownc6d282b2010-10-14 21:42:15 -0700694 // Touch Size
695 enum TouchSizeCalibration {
696 TOUCH_SIZE_CALIBRATION_DEFAULT,
697 TOUCH_SIZE_CALIBRATION_NONE,
698 TOUCH_SIZE_CALIBRATION_GEOMETRIC,
699 TOUCH_SIZE_CALIBRATION_PRESSURE,
Jeff Brown8d608662010-08-30 03:02:23 -0700700 };
701
Jeff Brownc6d282b2010-10-14 21:42:15 -0700702 TouchSizeCalibration touchSizeCalibration;
Jeff Brown8d608662010-08-30 03:02:23 -0700703
Jeff Brownc6d282b2010-10-14 21:42:15 -0700704 // Tool Size
705 enum ToolSizeCalibration {
706 TOOL_SIZE_CALIBRATION_DEFAULT,
707 TOOL_SIZE_CALIBRATION_NONE,
708 TOOL_SIZE_CALIBRATION_GEOMETRIC,
709 TOOL_SIZE_CALIBRATION_LINEAR,
710 TOOL_SIZE_CALIBRATION_AREA,
Jeff Brown8d608662010-08-30 03:02:23 -0700711 };
712
Jeff Brownc6d282b2010-10-14 21:42:15 -0700713 ToolSizeCalibration toolSizeCalibration;
714 bool haveToolSizeLinearScale;
715 float toolSizeLinearScale;
716 bool haveToolSizeLinearBias;
717 float toolSizeLinearBias;
718 bool haveToolSizeAreaScale;
719 float toolSizeAreaScale;
720 bool haveToolSizeAreaBias;
721 float toolSizeAreaBias;
722 bool haveToolSizeIsSummed;
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800723 bool toolSizeIsSummed;
Jeff Brown8d608662010-08-30 03:02:23 -0700724
725 // Pressure
726 enum PressureCalibration {
727 PRESSURE_CALIBRATION_DEFAULT,
728 PRESSURE_CALIBRATION_NONE,
729 PRESSURE_CALIBRATION_PHYSICAL,
730 PRESSURE_CALIBRATION_AMPLITUDE,
731 };
732 enum PressureSource {
733 PRESSURE_SOURCE_DEFAULT,
734 PRESSURE_SOURCE_PRESSURE,
735 PRESSURE_SOURCE_TOUCH,
736 };
737
738 PressureCalibration pressureCalibration;
739 PressureSource pressureSource;
740 bool havePressureScale;
741 float pressureScale;
742
743 // Size
744 enum SizeCalibration {
745 SIZE_CALIBRATION_DEFAULT,
746 SIZE_CALIBRATION_NONE,
747 SIZE_CALIBRATION_NORMALIZED,
748 };
749
750 SizeCalibration sizeCalibration;
751
752 // Orientation
753 enum OrientationCalibration {
754 ORIENTATION_CALIBRATION_DEFAULT,
755 ORIENTATION_CALIBRATION_NONE,
756 ORIENTATION_CALIBRATION_INTERPOLATED,
Jeff Brown517bb4c2011-01-14 19:09:23 -0800757 ORIENTATION_CALIBRATION_VECTOR,
Jeff Brown8d608662010-08-30 03:02:23 -0700758 };
759
760 OrientationCalibration orientationCalibration;
761 } mCalibration;
762
763 // Raw axis information from the driver.
764 struct RawAxes {
Jeff Brown6d0fec22010-07-23 21:28:06 -0700765 RawAbsoluteAxisInfo x;
766 RawAbsoluteAxisInfo y;
767 RawAbsoluteAxisInfo pressure;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700768 RawAbsoluteAxisInfo touchMajor;
769 RawAbsoluteAxisInfo touchMinor;
770 RawAbsoluteAxisInfo toolMajor;
771 RawAbsoluteAxisInfo toolMinor;
772 RawAbsoluteAxisInfo orientation;
Jeff Brown8d608662010-08-30 03:02:23 -0700773 } mRawAxes;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700774
Jeff Brown6328cdc2010-07-29 18:18:33 -0700775 // Current and previous touch sample data.
Jeff Brown6d0fec22010-07-23 21:28:06 -0700776 TouchData mCurrentTouch;
Jeff Brownace13b12011-03-09 17:39:48 -0800777 PointerCoords mCurrentTouchCoords[MAX_POINTERS];
778
Jeff Brown6d0fec22010-07-23 21:28:06 -0700779 TouchData mLastTouch;
Jeff Brownace13b12011-03-09 17:39:48 -0800780 PointerCoords mLastTouchCoords[MAX_POINTERS];
Jeff Brown6d0fec22010-07-23 21:28:06 -0700781
782 // The time the primary pointer last went down.
783 nsecs_t mDownTime;
784
Jeff Brownace13b12011-03-09 17:39:48 -0800785 // The pointer controller, or null if the device is not a pointer.
786 sp<PointerControllerInterface> mPointerController;
787
Jeff Brown6328cdc2010-07-29 18:18:33 -0700788 struct LockedState {
789 Vector<VirtualKey> virtualKeys;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700790
Jeff Brown6328cdc2010-07-29 18:18:33 -0700791 // The surface orientation and width and height set by configureSurfaceLocked().
792 int32_t surfaceOrientation;
793 int32_t surfaceWidth, surfaceHeight;
794
Jeff Brownefd32662011-03-08 15:13:06 -0800795 // The associated display orientation and width and height set by configureSurfaceLocked().
796 int32_t associatedDisplayOrientation;
797 int32_t associatedDisplayWidth, associatedDisplayHeight;
798
Jeff Brown6328cdc2010-07-29 18:18:33 -0700799 // Translation and scaling factors, orientation-independent.
Jeff Brown6328cdc2010-07-29 18:18:33 -0700800 float xScale;
801 float xPrecision;
802
Jeff Brown6328cdc2010-07-29 18:18:33 -0700803 float yScale;
804 float yPrecision;
805
Jeff Brown8d608662010-08-30 03:02:23 -0700806 float geometricScale;
807
Jeff Brownc6d282b2010-10-14 21:42:15 -0700808 float toolSizeLinearScale;
809 float toolSizeLinearBias;
810 float toolSizeAreaScale;
811 float toolSizeAreaBias;
Jeff Brown8d608662010-08-30 03:02:23 -0700812
Jeff Brown6328cdc2010-07-29 18:18:33 -0700813 float pressureScale;
814
Jeff Brown6328cdc2010-07-29 18:18:33 -0700815 float sizeScale;
816
817 float orientationScale;
818
819 // Oriented motion ranges for input device info.
820 struct OrientedRanges {
821 InputDeviceInfo::MotionRange x;
822 InputDeviceInfo::MotionRange y;
Jeff Brown8d608662010-08-30 03:02:23 -0700823
824 bool havePressure;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700825 InputDeviceInfo::MotionRange pressure;
Jeff Brown8d608662010-08-30 03:02:23 -0700826
827 bool haveSize;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700828 InputDeviceInfo::MotionRange size;
Jeff Brown8d608662010-08-30 03:02:23 -0700829
Jeff Brownc6d282b2010-10-14 21:42:15 -0700830 bool haveTouchSize;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700831 InputDeviceInfo::MotionRange touchMajor;
832 InputDeviceInfo::MotionRange touchMinor;
Jeff Brown8d608662010-08-30 03:02:23 -0700833
Jeff Brownc6d282b2010-10-14 21:42:15 -0700834 bool haveToolSize;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700835 InputDeviceInfo::MotionRange toolMajor;
836 InputDeviceInfo::MotionRange toolMinor;
Jeff Brown8d608662010-08-30 03:02:23 -0700837
838 bool haveOrientation;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700839 InputDeviceInfo::MotionRange orientation;
840 } orientedRanges;
841
842 // Oriented dimensions and precision.
843 float orientedSurfaceWidth, orientedSurfaceHeight;
844 float orientedXPrecision, orientedYPrecision;
845
846 struct CurrentVirtualKeyState {
847 bool down;
848 nsecs_t downTime;
849 int32_t keyCode;
850 int32_t scanCode;
851 } currentVirtualKey;
Jeff Brownace13b12011-03-09 17:39:48 -0800852
853 // Scale factor for gesture based pointer movements.
854 float pointerGestureXMovementScale;
855 float pointerGestureYMovementScale;
856
857 // Scale factor for gesture based zooming and other freeform motions.
858 float pointerGestureXZoomScale;
859 float pointerGestureYZoomScale;
860
Jeff Brown2352b972011-04-12 22:39:53 -0700861 // The maximum swipe width.
862 float pointerGestureMaxSwipeWidth;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700863 } mLocked;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700864
Jeff Brown8d608662010-08-30 03:02:23 -0700865 virtual void configureParameters();
Jeff Brownef3d7e82010-09-30 14:33:04 -0700866 virtual void dumpParameters(String8& dump);
Jeff Brown8d608662010-08-30 03:02:23 -0700867 virtual void configureRawAxes();
Jeff Brownef3d7e82010-09-30 14:33:04 -0700868 virtual void dumpRawAxes(String8& dump);
Jeff Brown6328cdc2010-07-29 18:18:33 -0700869 virtual bool configureSurfaceLocked();
Jeff Brownef3d7e82010-09-30 14:33:04 -0700870 virtual void dumpSurfaceLocked(String8& dump);
Jeff Brown6328cdc2010-07-29 18:18:33 -0700871 virtual void configureVirtualKeysLocked();
Jeff Brownef3d7e82010-09-30 14:33:04 -0700872 virtual void dumpVirtualKeysLocked(String8& dump);
Jeff Brown8d608662010-08-30 03:02:23 -0700873 virtual void parseCalibration();
874 virtual void resolveCalibration();
Jeff Brownef3d7e82010-09-30 14:33:04 -0700875 virtual void dumpCalibration(String8& dump);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700876
877 enum TouchResult {
878 // Dispatch the touch normally.
879 DISPATCH_TOUCH,
880 // Do not dispatch the touch, but keep tracking the current stroke.
881 SKIP_TOUCH,
882 // Do not dispatch the touch, and drop all information associated with the current stoke
883 // so the next movement will appear as a new down.
884 DROP_STROKE
885 };
886
887 void syncTouch(nsecs_t when, bool havePointerIds);
888
889private:
890 /* Maximum number of historical samples to average. */
891 static const uint32_t AVERAGING_HISTORY_SIZE = 5;
892
893 /* Slop distance for jumpy pointer detection.
894 * The vertical range of the screen divided by this is our epsilon value. */
895 static const uint32_t JUMPY_EPSILON_DIVISOR = 212;
896
897 /* Number of jumpy points to drop for touchscreens that need it. */
898 static const uint32_t JUMPY_TRANSITION_DROPS = 3;
899 static const uint32_t JUMPY_DROP_LIMIT = 3;
900
901 /* Maximum squared distance for averaging.
902 * If moving farther than this, turn of averaging to avoid lag in response. */
903 static const uint64_t AVERAGING_DISTANCE_LIMIT = 75 * 75;
904
905 struct AveragingTouchFilterState {
906 // Individual history tracks are stored by pointer id
907 uint32_t historyStart[MAX_POINTERS];
908 uint32_t historyEnd[MAX_POINTERS];
909 struct {
910 struct {
911 int32_t x;
912 int32_t y;
913 int32_t pressure;
914 } pointers[MAX_POINTERS];
915 } historyData[AVERAGING_HISTORY_SIZE];
916 } mAveragingTouchFilter;
917
Jeff Brown2dfd7a72010-08-17 20:38:35 -0700918 struct JumpyTouchFilterState {
Jeff Brown6d0fec22010-07-23 21:28:06 -0700919 uint32_t jumpyPointsDropped;
920 } mJumpyTouchFilter;
921
922 struct PointerDistanceHeapElement {
923 uint32_t currentPointerIndex : 8;
924 uint32_t lastPointerIndex : 8;
925 uint64_t distance : 48; // squared distance
926 };
927
Jeff Brownace13b12011-03-09 17:39:48 -0800928 struct PointerGesture {
929 enum Mode {
930 // No fingers, button is not pressed.
931 // Nothing happening.
932 NEUTRAL,
933
934 // No fingers, button is not pressed.
935 // Tap detected.
936 // Emits DOWN and UP events at the pointer location.
937 TAP,
938
Jeff Brown79ac9692011-04-19 21:20:10 -0700939 // Exactly one finger dragging following a tap.
940 // Pointer follows the active finger.
941 // Emits DOWN, MOVE and UP events at the pointer location.
942 TAP_DRAG,
943
Jeff Brownace13b12011-03-09 17:39:48 -0800944 // Button is pressed.
945 // Pointer follows the active finger if there is one. Other fingers are ignored.
946 // Emits DOWN, MOVE and UP events at the pointer location.
Jeff Brown79ac9692011-04-19 21:20:10 -0700947 BUTTON_CLICK_OR_DRAG,
Jeff Brownace13b12011-03-09 17:39:48 -0800948
949 // Exactly one finger, button is not pressed.
950 // Pointer follows the active finger.
951 // Emits HOVER_MOVE events at the pointer location.
952 HOVER,
953
Jeff Brown2352b972011-04-12 22:39:53 -0700954 // Exactly two fingers but neither have moved enough to clearly indicate
955 // whether a swipe or freeform gesture was intended. We consider the
956 // pointer to be pressed so this enables clicking or long-pressing on buttons.
957 // Pointer does not move.
958 // Emits DOWN, MOVE and UP events with a single stationary pointer coordinate.
959 PRESS,
Jeff Brownace13b12011-03-09 17:39:48 -0800960
961 // Exactly two fingers moving in the same direction, button is not pressed.
962 // Pointer does not move.
963 // Emits DOWN, MOVE and UP events with a single pointer coordinate that
964 // follows the midpoint between both fingers.
Jeff Brownace13b12011-03-09 17:39:48 -0800965 SWIPE,
966
967 // Two or more fingers moving in arbitrary directions, button is not pressed.
968 // Pointer does not move.
969 // Emits DOWN, POINTER_DOWN, MOVE, POINTER_UP and UP events that follow
970 // each finger individually relative to the initial centroid of the finger.
Jeff Brownace13b12011-03-09 17:39:48 -0800971 FREEFORM,
972
973 // Waiting for quiet time to end before starting the next gesture.
974 QUIET,
975 };
976
Jeff Brown2352b972011-04-12 22:39:53 -0700977 // Time the first finger went down.
978 nsecs_t firstTouchTime;
979
Jeff Brownace13b12011-03-09 17:39:48 -0800980 // The active pointer id from the raw touch data.
981 int32_t activeTouchId; // -1 if none
982
983 // The active pointer id from the gesture last delivered to the application.
984 int32_t activeGestureId; // -1 if none
985
986 // Pointer coords and ids for the current and previous pointer gesture.
987 Mode currentGestureMode;
Jeff Brownace13b12011-03-09 17:39:48 -0800988 BitSet32 currentGestureIdBits;
989 uint32_t currentGestureIdToIndex[MAX_POINTER_ID + 1];
990 PointerCoords currentGestureCoords[MAX_POINTERS];
991
992 Mode lastGestureMode;
Jeff Brownace13b12011-03-09 17:39:48 -0800993 BitSet32 lastGestureIdBits;
994 uint32_t lastGestureIdToIndex[MAX_POINTER_ID + 1];
995 PointerCoords lastGestureCoords[MAX_POINTERS];
996
Jeff Brown2352b972011-04-12 22:39:53 -0700997 // Pointer coords and ids for the current spots.
998 PointerControllerInterface::SpotGesture spotGesture;
999 BitSet32 spotIdBits; // same set of ids as touch ids
1000 uint32_t spotIdToIndex[MAX_POINTER_ID + 1];
1001 PointerCoords spotCoords[MAX_POINTERS];
Jeff Brownace13b12011-03-09 17:39:48 -08001002
1003 // Time the pointer gesture last went down.
1004 nsecs_t downTime;
1005
Jeff Brown79ac9692011-04-19 21:20:10 -07001006 // Time when the pointer went down for a TAP.
1007 nsecs_t tapDownTime;
1008
1009 // Time when the pointer went up for a TAP.
1010 nsecs_t tapUpTime;
Jeff Brownace13b12011-03-09 17:39:48 -08001011
Jeff Brown2352b972011-04-12 22:39:53 -07001012 // Location of initial tap.
1013 float tapX, tapY;
1014
Jeff Brownace13b12011-03-09 17:39:48 -08001015 // Time we started waiting for quiescence.
1016 nsecs_t quietTime;
1017
Jeff Brown2352b972011-04-12 22:39:53 -07001018 // Reference points for multitouch gestures.
1019 float referenceTouchX; // reference touch X/Y coordinates in surface units
1020 float referenceTouchY;
1021 float referenceGestureX; // reference gesture X/Y coordinates in pixels
1022 float referenceGestureY;
1023
1024 // Describes how touch ids are mapped to gesture ids for freeform gestures.
1025 uint32_t freeformTouchToGestureIdMap[MAX_POINTER_ID + 1];
1026
Jeff Brownace13b12011-03-09 17:39:48 -08001027 // A velocity tracker for determining whether to switch active pointers during drags.
1028 VelocityTracker velocityTracker;
1029
1030 void reset() {
Jeff Brown2352b972011-04-12 22:39:53 -07001031 firstTouchTime = LLONG_MIN;
Jeff Brownace13b12011-03-09 17:39:48 -08001032 activeTouchId = -1;
1033 activeGestureId = -1;
1034 currentGestureMode = NEUTRAL;
Jeff Brownace13b12011-03-09 17:39:48 -08001035 currentGestureIdBits.clear();
1036 lastGestureMode = NEUTRAL;
Jeff Brownace13b12011-03-09 17:39:48 -08001037 lastGestureIdBits.clear();
Jeff Brown2352b972011-04-12 22:39:53 -07001038 spotGesture = PointerControllerInterface::SPOT_GESTURE_NEUTRAL;
1039 spotIdBits.clear();
Jeff Brownace13b12011-03-09 17:39:48 -08001040 downTime = 0;
1041 velocityTracker.clear();
Jeff Brown79ac9692011-04-19 21:20:10 -07001042 resetTap();
Jeff Brownace13b12011-03-09 17:39:48 -08001043 resetQuietTime();
1044 }
1045
Jeff Brown79ac9692011-04-19 21:20:10 -07001046 void resetTap() {
1047 tapDownTime = LLONG_MIN;
1048 tapUpTime = LLONG_MIN;
Jeff Brownace13b12011-03-09 17:39:48 -08001049 }
1050
1051 void resetQuietTime() {
1052 quietTime = LLONG_MIN;
1053 }
1054 } mPointerGesture;
1055
Jeff Brown6328cdc2010-07-29 18:18:33 -07001056 void initializeLocked();
Jeff Brown6d0fec22010-07-23 21:28:06 -07001057
1058 TouchResult consumeOffScreenTouches(nsecs_t when, uint32_t policyFlags);
1059 void dispatchTouches(nsecs_t when, uint32_t policyFlags);
Jeff Brownace13b12011-03-09 17:39:48 -08001060 void prepareTouches(int32_t* outEdgeFlags, float* outXPrecision, float* outYPrecision);
Jeff Brown79ac9692011-04-19 21:20:10 -07001061 void dispatchPointerGestures(nsecs_t when, uint32_t policyFlags, bool isTimeout);
1062 bool preparePointerGestures(nsecs_t when,
1063 bool* outCancelPreviousGesture, bool* outFinishPreviousGesture, bool isTimeout);
Jeff Brown2352b972011-04-12 22:39:53 -07001064 void moveSpotsLocked();
Jeff Brownace13b12011-03-09 17:39:48 -08001065
1066 // Dispatches a motion event.
1067 // If the changedId is >= 0 and the action is POINTER_DOWN or POINTER_UP, the
1068 // method will take care of setting the index and transmuting the action to DOWN or UP
1069 // it is the first / last pointer to go down / up.
1070 void dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32_t source,
1071 int32_t action, int32_t flags, uint32_t metaState, int32_t edgeFlags,
1072 const PointerCoords* coords, const uint32_t* idToIndex, BitSet32 idBits,
1073 int32_t changedId, float xPrecision, float yPrecision, nsecs_t downTime);
1074
1075 // Updates pointer coords for pointers with specified ids that have moved.
1076 // Returns true if any of them changed.
1077 bool updateMovedPointerCoords(const PointerCoords* inCoords, const uint32_t* inIdToIndex,
1078 PointerCoords* outCoords, const uint32_t* outIdToIndex, BitSet32 idBits) const;
1079
Jeff Brownefd32662011-03-08 15:13:06 -08001080 void suppressSwipeOntoVirtualKeys(nsecs_t when);
Jeff Brown6d0fec22010-07-23 21:28:06 -07001081
Jeff Brown6328cdc2010-07-29 18:18:33 -07001082 bool isPointInsideSurfaceLocked(int32_t x, int32_t y);
1083 const VirtualKey* findVirtualKeyHitLocked(int32_t x, int32_t y);
Jeff Brown6d0fec22010-07-23 21:28:06 -07001084
1085 bool applyBadTouchFilter();
1086 bool applyJumpyTouchFilter();
1087 void applyAveragingTouchFilter();
1088 void calculatePointerIds();
1089};
1090
1091
1092class SingleTouchInputMapper : public TouchInputMapper {
1093public:
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001094 SingleTouchInputMapper(InputDevice* device);
Jeff Brown6d0fec22010-07-23 21:28:06 -07001095 virtual ~SingleTouchInputMapper();
1096
1097 virtual void reset();
1098 virtual void process(const RawEvent* rawEvent);
1099
1100protected:
Jeff Brown8d608662010-08-30 03:02:23 -07001101 virtual void configureRawAxes();
Jeff Brown6d0fec22010-07-23 21:28:06 -07001102
1103private:
1104 struct Accumulator {
1105 enum {
1106 FIELD_BTN_TOUCH = 1,
1107 FIELD_ABS_X = 2,
1108 FIELD_ABS_Y = 4,
1109 FIELD_ABS_PRESSURE = 8,
Jeff Brownefd32662011-03-08 15:13:06 -08001110 FIELD_ABS_TOOL_WIDTH = 16,
Jeff Brownace13b12011-03-09 17:39:48 -08001111 FIELD_BUTTONS = 32,
Jeff Brown6d0fec22010-07-23 21:28:06 -07001112 };
1113
1114 uint32_t fields;
1115
1116 bool btnTouch;
1117 int32_t absX;
1118 int32_t absY;
1119 int32_t absPressure;
1120 int32_t absToolWidth;
1121
Jeff Brownace13b12011-03-09 17:39:48 -08001122 uint32_t buttonDown;
1123 uint32_t buttonUp;
1124
Jeff Brown6d0fec22010-07-23 21:28:06 -07001125 inline void clear() {
1126 fields = 0;
Jeff Brownace13b12011-03-09 17:39:48 -08001127 buttonDown = 0;
1128 buttonUp = 0;
Jeff Brown6d0fec22010-07-23 21:28:06 -07001129 }
Jeff Brown6d0fec22010-07-23 21:28:06 -07001130 } mAccumulator;
1131
1132 bool mDown;
1133 int32_t mX;
1134 int32_t mY;
1135 int32_t mPressure;
Jeff Brown8d608662010-08-30 03:02:23 -07001136 int32_t mToolWidth;
Jeff Brownace13b12011-03-09 17:39:48 -08001137 uint32_t mButtonState;
Jeff Brown6d0fec22010-07-23 21:28:06 -07001138
1139 void initialize();
1140
1141 void sync(nsecs_t when);
1142};
1143
1144
1145class MultiTouchInputMapper : public TouchInputMapper {
1146public:
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001147 MultiTouchInputMapper(InputDevice* device);
Jeff Brown6d0fec22010-07-23 21:28:06 -07001148 virtual ~MultiTouchInputMapper();
1149
1150 virtual void reset();
1151 virtual void process(const RawEvent* rawEvent);
1152
1153protected:
Jeff Brown8d608662010-08-30 03:02:23 -07001154 virtual void configureRawAxes();
Jeff Brown6d0fec22010-07-23 21:28:06 -07001155
1156private:
1157 struct Accumulator {
1158 enum {
1159 FIELD_ABS_MT_POSITION_X = 1,
1160 FIELD_ABS_MT_POSITION_Y = 2,
1161 FIELD_ABS_MT_TOUCH_MAJOR = 4,
1162 FIELD_ABS_MT_TOUCH_MINOR = 8,
1163 FIELD_ABS_MT_WIDTH_MAJOR = 16,
1164 FIELD_ABS_MT_WIDTH_MINOR = 32,
1165 FIELD_ABS_MT_ORIENTATION = 64,
Jeff Brown2dfd7a72010-08-17 20:38:35 -07001166 FIELD_ABS_MT_TRACKING_ID = 128,
1167 FIELD_ABS_MT_PRESSURE = 256,
Jeff Brown6d0fec22010-07-23 21:28:06 -07001168 };
1169
1170 uint32_t pointerCount;
1171 struct Pointer {
1172 uint32_t fields;
1173
1174 int32_t absMTPositionX;
1175 int32_t absMTPositionY;
1176 int32_t absMTTouchMajor;
1177 int32_t absMTTouchMinor;
1178 int32_t absMTWidthMajor;
1179 int32_t absMTWidthMinor;
1180 int32_t absMTOrientation;
1181 int32_t absMTTrackingId;
Jeff Brown2dfd7a72010-08-17 20:38:35 -07001182 int32_t absMTPressure;
Jeff Brown6d0fec22010-07-23 21:28:06 -07001183
1184 inline void clear() {
1185 fields = 0;
1186 }
1187 } pointers[MAX_POINTERS + 1]; // + 1 to remove the need for extra range checks
1188
Jeff Brownace13b12011-03-09 17:39:48 -08001189 // Bitfield of buttons that went down or up.
1190 uint32_t buttonDown;
1191 uint32_t buttonUp;
1192
Jeff Brown6d0fec22010-07-23 21:28:06 -07001193 inline void clear() {
1194 pointerCount = 0;
1195 pointers[0].clear();
Jeff Brownace13b12011-03-09 17:39:48 -08001196 buttonDown = 0;
1197 buttonUp = 0;
Jeff Brown6d0fec22010-07-23 21:28:06 -07001198 }
Jeff Brown6d0fec22010-07-23 21:28:06 -07001199 } mAccumulator;
1200
Jeff Brownace13b12011-03-09 17:39:48 -08001201 uint32_t mButtonState;
1202
Jeff Brown6d0fec22010-07-23 21:28:06 -07001203 void initialize();
1204
1205 void sync(nsecs_t when);
1206};
1207
Jeff Browncb1404e2011-01-15 18:14:15 -08001208
1209class JoystickInputMapper : public InputMapper {
1210public:
1211 JoystickInputMapper(InputDevice* device);
1212 virtual ~JoystickInputMapper();
1213
1214 virtual uint32_t getSources();
1215 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1216 virtual void dump(String8& dump);
1217 virtual void configure();
1218 virtual void reset();
1219 virtual void process(const RawEvent* rawEvent);
1220
1221private:
Jeff Brown6f2fba42011-02-19 01:08:02 -08001222 struct Axis {
1223 RawAbsoluteAxisInfo rawAxisInfo;
Jeff Brown85297452011-03-04 13:07:49 -08001224 AxisInfo axisInfo;
Jeff Browncb1404e2011-01-15 18:14:15 -08001225
Jeff Brown6f2fba42011-02-19 01:08:02 -08001226 bool explicitlyMapped; // true if the axis was explicitly assigned an axis id
Jeff Browncb1404e2011-01-15 18:14:15 -08001227
Jeff Brown6f2fba42011-02-19 01:08:02 -08001228 float scale; // scale factor from raw to normalized values
1229 float offset; // offset to add after scaling for normalization
Jeff Brown85297452011-03-04 13:07:49 -08001230 float highScale; // scale factor from raw to normalized values of high split
1231 float highOffset; // offset to add after scaling for normalization of high split
Jeff Browncb1404e2011-01-15 18:14:15 -08001232
Jeff Brown6f2fba42011-02-19 01:08:02 -08001233 float min; // normalized inclusive minimum
1234 float max; // normalized inclusive maximum
1235 float flat; // normalized flat region size
1236 float fuzz; // normalized error tolerance
Jeff Browncb1404e2011-01-15 18:14:15 -08001237
Jeff Brown6f2fba42011-02-19 01:08:02 -08001238 float filter; // filter out small variations of this size
Jeff Brown85297452011-03-04 13:07:49 -08001239 float currentValue; // current value
1240 float newValue; // most recent value
1241 float highCurrentValue; // current value of high split
1242 float highNewValue; // most recent value of high split
Jeff Browncb1404e2011-01-15 18:14:15 -08001243
Jeff Brown85297452011-03-04 13:07:49 -08001244 void initialize(const RawAbsoluteAxisInfo& rawAxisInfo, const AxisInfo& axisInfo,
1245 bool explicitlyMapped, float scale, float offset,
1246 float highScale, float highOffset,
Jeff Brown6f2fba42011-02-19 01:08:02 -08001247 float min, float max, float flat, float fuzz) {
1248 this->rawAxisInfo = rawAxisInfo;
Jeff Brown85297452011-03-04 13:07:49 -08001249 this->axisInfo = axisInfo;
Jeff Brown6f2fba42011-02-19 01:08:02 -08001250 this->explicitlyMapped = explicitlyMapped;
1251 this->scale = scale;
1252 this->offset = offset;
Jeff Brown85297452011-03-04 13:07:49 -08001253 this->highScale = highScale;
1254 this->highOffset = highOffset;
Jeff Brown6f2fba42011-02-19 01:08:02 -08001255 this->min = min;
1256 this->max = max;
1257 this->flat = flat;
1258 this->fuzz = fuzz;
1259 this->filter = 0;
Jeff Brown85297452011-03-04 13:07:49 -08001260 resetValue();
1261 }
1262
1263 void resetValue() {
1264 this->currentValue = 0;
Jeff Brown6f2fba42011-02-19 01:08:02 -08001265 this->newValue = 0;
Jeff Brown85297452011-03-04 13:07:49 -08001266 this->highCurrentValue = 0;
1267 this->highNewValue = 0;
Jeff Browncb1404e2011-01-15 18:14:15 -08001268 }
1269 };
1270
Jeff Brown6f2fba42011-02-19 01:08:02 -08001271 // Axes indexed by raw ABS_* axis index.
1272 KeyedVector<int32_t, Axis> mAxes;
Jeff Browncb1404e2011-01-15 18:14:15 -08001273
Jeff Brown6f2fba42011-02-19 01:08:02 -08001274 void sync(nsecs_t when, bool force);
Jeff Browncb1404e2011-01-15 18:14:15 -08001275
Jeff Brown85297452011-03-04 13:07:49 -08001276 bool haveAxis(int32_t axisId);
Jeff Brown6f2fba42011-02-19 01:08:02 -08001277 void pruneAxes(bool ignoreExplicitlyMappedAxes);
Jeff Brown85297452011-03-04 13:07:49 -08001278 bool filterAxes(bool force);
1279
1280 static bool hasValueChangedSignificantly(float filter,
1281 float newValue, float currentValue, float min, float max);
1282 static bool hasMovedNearerToValueWithinFilteredRange(float filter,
1283 float newValue, float currentValue, float thresholdValue);
Jeff Browncb1404e2011-01-15 18:14:15 -08001284
Jeff Brown6f2fba42011-02-19 01:08:02 -08001285 static bool isCenteredAxis(int32_t axis);
Jeff Browncb1404e2011-01-15 18:14:15 -08001286};
1287
Jeff Brown46b9ac02010-04-22 18:58:52 -07001288} // namespace android
1289
1290#endif // _UI_INPUT_READER_H