18a90e6e3174083f274538567d851f98478fc83e9Jeff Brown/* 28a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * Copyright (C) 2012 The Android Open Source Project 38a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * 48a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 58a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * you may not use this file except in compliance with the License. 68a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * You may obtain a copy of the License at 78a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * 88a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 98a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * 108a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * Unless required by applicable law or agreed to in writing, software 118a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 128a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * See the License for the specific language governing permissions and 148a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * limitations under the License. 158a90e6e3174083f274538567d851f98478fc83e9Jeff Brown */ 168a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 178a90e6e3174083f274538567d851f98478fc83e9Jeff Brown#ifndef _ANDROIDFW_VELOCITY_TRACKER_H 188a90e6e3174083f274538567d851f98478fc83e9Jeff Brown#define _ANDROIDFW_VELOCITY_TRACKER_H 198a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 208a90e6e3174083f274538567d851f98478fc83e9Jeff Brown#include <androidfw/Input.h> 218a90e6e3174083f274538567d851f98478fc83e9Jeff Brown#include <utils/Timers.h> 228a90e6e3174083f274538567d851f98478fc83e9Jeff Brown#include <utils/BitSet.h> 238a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 248a90e6e3174083f274538567d851f98478fc83e9Jeff Brownnamespace android { 258a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 2685bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brownclass VelocityTrackerStrategy; 2785bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown 288a90e6e3174083f274538567d851f98478fc83e9Jeff Brown/* 298a90e6e3174083f274538567d851f98478fc83e9Jeff Brown * Calculates the velocity of pointer movements over time. 308a90e6e3174083f274538567d851f98478fc83e9Jeff Brown */ 318a90e6e3174083f274538567d851f98478fc83e9Jeff Brownclass VelocityTracker { 328a90e6e3174083f274538567d851f98478fc83e9Jeff Brownpublic: 338a90e6e3174083f274538567d851f98478fc83e9Jeff Brown struct Position { 348a90e6e3174083f274538567d851f98478fc83e9Jeff Brown float x, y; 358a90e6e3174083f274538567d851f98478fc83e9Jeff Brown }; 368a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 378a90e6e3174083f274538567d851f98478fc83e9Jeff Brown struct Estimator { 389eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown static const size_t MAX_DEGREE = 4; 398a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 4090729403d50488566eb4ae0e09bb1be21979a633Jeff Brown // Estimator time base. 4190729403d50488566eb4ae0e09bb1be21979a633Jeff Brown nsecs_t time; 4290729403d50488566eb4ae0e09bb1be21979a633Jeff Brown 438a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Polynomial coefficients describing motion in X and Y. 448a90e6e3174083f274538567d851f98478fc83e9Jeff Brown float xCoeff[MAX_DEGREE + 1], yCoeff[MAX_DEGREE + 1]; 458a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 468a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Polynomial degree (number of coefficients), or zero if no information is 478a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // available. 488a90e6e3174083f274538567d851f98478fc83e9Jeff Brown uint32_t degree; 498a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 508a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit). 518a90e6e3174083f274538567d851f98478fc83e9Jeff Brown float confidence; 528a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 538a90e6e3174083f274538567d851f98478fc83e9Jeff Brown inline void clear() { 5490729403d50488566eb4ae0e09bb1be21979a633Jeff Brown time = 0; 558a90e6e3174083f274538567d851f98478fc83e9Jeff Brown degree = 0; 568a90e6e3174083f274538567d851f98478fc83e9Jeff Brown confidence = 0; 578a90e6e3174083f274538567d851f98478fc83e9Jeff Brown for (size_t i = 0; i <= MAX_DEGREE; i++) { 588a90e6e3174083f274538567d851f98478fc83e9Jeff Brown xCoeff[i] = 0; 598a90e6e3174083f274538567d851f98478fc83e9Jeff Brown yCoeff[i] = 0; 608a90e6e3174083f274538567d851f98478fc83e9Jeff Brown } 618a90e6e3174083f274538567d851f98478fc83e9Jeff Brown } 628a90e6e3174083f274538567d851f98478fc83e9Jeff Brown }; 638a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 649eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown // Creates a velocity tracker using the specified strategy. 659eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown // If strategy is NULL, uses the default strategy for the platform. 669eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown VelocityTracker(const char* strategy = NULL); 679eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown 6885bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown ~VelocityTracker(); 698a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 708a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Resets the velocity tracker state. 718a90e6e3174083f274538567d851f98478fc83e9Jeff Brown void clear(); 728a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 738a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Resets the velocity tracker state for specific pointers. 748a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Call this method when some pointers have changed and may be reusing 758a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // an id that was assigned to a different pointer earlier. 768a90e6e3174083f274538567d851f98478fc83e9Jeff Brown void clearPointers(BitSet32 idBits); 778a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 788a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Adds movement information for a set of pointers. 798a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // The idBits bitfield specifies the pointer ids of the pointers whose positions 808a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // are included in the movement. 818a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // The positions array contains position information for each pointer in order by 828a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // increasing id. Its size should be equal to the number of one bits in idBits. 838a90e6e3174083f274538567d851f98478fc83e9Jeff Brown void addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions); 848a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 858a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Adds movement information for all pointers in a MotionEvent, including historical samples. 868a90e6e3174083f274538567d851f98478fc83e9Jeff Brown void addMovement(const MotionEvent* event); 878a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 888a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Gets the velocity of the specified pointer id in position units per second. 898a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Returns false and sets the velocity components to zero if there is 908a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // insufficient movement information for the pointer. 918a90e6e3174083f274538567d851f98478fc83e9Jeff Brown bool getVelocity(uint32_t id, float* outVx, float* outVy) const; 928a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 9385bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown // Gets an estimator for the recent movements of the specified pointer id. 948a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Returns false and clears the estimator if there is no information available 958a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // about the pointer. 9685bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown bool getEstimator(uint32_t id, Estimator* outEstimator) const; 978a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 988a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Gets the active pointer id, or -1 if none. 998a90e6e3174083f274538567d851f98478fc83e9Jeff Brown inline int32_t getActivePointerId() const { return mActivePointerId; } 1008a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 1018a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Gets a bitset containing all pointer ids from the most recent movement. 10285bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown inline BitSet32 getCurrentPointerIdBits() const { return mCurrentPointerIdBits; } 10385bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown 10485bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brownprivate: 1059eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown static const char* DEFAULT_STRATEGY; 1069eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown 10790729403d50488566eb4ae0e09bb1be21979a633Jeff Brown nsecs_t mLastEventTime; 10885bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown BitSet32 mCurrentPointerIdBits; 10985bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown int32_t mActivePointerId; 11085bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown VelocityTrackerStrategy* mStrategy; 1119eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown 1129eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown bool configureStrategy(const char* strategy); 1139eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown 1149eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown static VelocityTrackerStrategy* createStrategy(const char* strategy); 11585bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown}; 11685bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown 11785bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown 11885bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown/* 11985bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown * Implements a particular velocity tracker algorithm. 12085bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown */ 12185bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brownclass VelocityTrackerStrategy { 12285bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brownprotected: 12385bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown VelocityTrackerStrategy() { } 12485bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown 12585bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brownpublic: 12685bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown virtual ~VelocityTrackerStrategy() { } 12785bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown 12885bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown virtual void clear() = 0; 12985bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown virtual void clearPointers(BitSet32 idBits) = 0; 13085bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown virtual void addMovement(nsecs_t eventTime, BitSet32 idBits, 13185bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown const VelocityTracker::Position* positions) = 0; 13285bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown virtual bool getEstimator(uint32_t id, VelocityTracker::Estimator* outEstimator) const = 0; 13385bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown}; 13485bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown 13585bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown 13685bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown/* 13785bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown * Velocity tracker algorithm based on least-squares linear regression. 13885bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown */ 13985bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brownclass LeastSquaresVelocityTrackerStrategy : public VelocityTrackerStrategy { 14085bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brownpublic: 14118f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown enum Weighting { 14218f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown // No weights applied. All data points are equally reliable. 14318f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown WEIGHTING_NONE, 14418f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown 14518f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown // Weight by time delta. Data points clustered together are weighted less. 14618f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown WEIGHTING_DELTA, 14718f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown 14818f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown // Weight such that points within a certain horizon are weighed more than those 14918f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown // outside of that horizon. 15018f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown WEIGHTING_CENTRAL, 15118f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown 15218f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown // Weight such that points older than a certain amount are weighed less. 15318f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown WEIGHTING_RECENT, 15418f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown }; 15518f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown 1569eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown // Degree must be no greater than Estimator::MAX_DEGREE. 15718f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown LeastSquaresVelocityTrackerStrategy(uint32_t degree, Weighting weighting = WEIGHTING_NONE); 15885bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown virtual ~LeastSquaresVelocityTrackerStrategy(); 15985bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown 16085bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown virtual void clear(); 16185bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown virtual void clearPointers(BitSet32 idBits); 16285bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown virtual void addMovement(nsecs_t eventTime, BitSet32 idBits, 16385bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown const VelocityTracker::Position* positions); 16485bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown virtual bool getEstimator(uint32_t id, VelocityTracker::Estimator* outEstimator) const; 1658a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 1668a90e6e3174083f274538567d851f98478fc83e9Jeff Brownprivate: 16785bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown // Sample horizon. 16885bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown // We don't use too much history by default since we want to react to quick 16985bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown // changes in direction. 17085bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown static const nsecs_t HORIZON = 100 * 1000000; // 100 ms 17185bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown 1728a90e6e3174083f274538567d851f98478fc83e9Jeff Brown // Number of samples to keep. 1738a90e6e3174083f274538567d851f98478fc83e9Jeff Brown static const uint32_t HISTORY_SIZE = 20; 1748a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 1758a90e6e3174083f274538567d851f98478fc83e9Jeff Brown struct Movement { 1768a90e6e3174083f274538567d851f98478fc83e9Jeff Brown nsecs_t eventTime; 1778a90e6e3174083f274538567d851f98478fc83e9Jeff Brown BitSet32 idBits; 17885bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown VelocityTracker::Position positions[MAX_POINTERS]; 1798a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 18085bd0d62830a098c1bdc720dfdcf4fe1b18b657cJeff Brown inline const VelocityTracker::Position& getPosition(uint32_t id) const { 1818a90e6e3174083f274538567d851f98478fc83e9Jeff Brown return positions[idBits.getIndexOfBit(id)]; 1828a90e6e3174083f274538567d851f98478fc83e9Jeff Brown } 1838a90e6e3174083f274538567d851f98478fc83e9Jeff Brown }; 1848a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 18518f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown float chooseWeight(uint32_t index) const; 18618f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown 1879eb7d86181729c3eb769d71123c4ce9ffc868f08Jeff Brown const uint32_t mDegree; 18818f329e9480fca75210bb7496e5b4bc987b4ad8fJeff Brown const Weighting mWeighting; 1898a90e6e3174083f274538567d851f98478fc83e9Jeff Brown uint32_t mIndex; 1908a90e6e3174083f274538567d851f98478fc83e9Jeff Brown Movement mMovements[HISTORY_SIZE]; 1918a90e6e3174083f274538567d851f98478fc83e9Jeff Brown}; 1928a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 19353dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown 19453dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown/* 19553dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown * Velocity tracker algorithm that uses an IIR filter. 19653dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown */ 19753dd12a66884540b87fe428383e2f79d0f5e32baJeff Brownclass IntegratingVelocityTrackerStrategy : public VelocityTrackerStrategy { 19853dd12a66884540b87fe428383e2f79d0f5e32baJeff Brownpublic: 199a5b0698231459ac5b54cf8e8952ac5c2b2b2198bJeff Brown // Degree must be 1 or 2. 200a5b0698231459ac5b54cf8e8952ac5c2b2b2198bJeff Brown IntegratingVelocityTrackerStrategy(uint32_t degree); 20153dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown ~IntegratingVelocityTrackerStrategy(); 20253dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown 20353dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown virtual void clear(); 20453dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown virtual void clearPointers(BitSet32 idBits); 20553dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown virtual void addMovement(nsecs_t eventTime, BitSet32 idBits, 20653dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown const VelocityTracker::Position* positions); 20753dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown virtual bool getEstimator(uint32_t id, VelocityTracker::Estimator* outEstimator) const; 20853dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown 20953dd12a66884540b87fe428383e2f79d0f5e32baJeff Brownprivate: 21053dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown // Current state estimate for a particular pointer. 21153dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown struct State { 21253dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown nsecs_t updateTime; 213a5b0698231459ac5b54cf8e8952ac5c2b2b2198bJeff Brown uint32_t degree; 21453dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown 215a5b0698231459ac5b54cf8e8952ac5c2b2b2198bJeff Brown float xpos, xvel, xaccel; 216a5b0698231459ac5b54cf8e8952ac5c2b2b2198bJeff Brown float ypos, yvel, yaccel; 21753dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown }; 21853dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown 219a5b0698231459ac5b54cf8e8952ac5c2b2b2198bJeff Brown const uint32_t mDegree; 22053dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown BitSet32 mPointerIdBits; 22153dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown State mPointerState[MAX_POINTER_ID + 1]; 22253dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown 223a5b0698231459ac5b54cf8e8952ac5c2b2b2198bJeff Brown void initState(State& state, nsecs_t eventTime, float xpos, float ypos) const; 224a5b0698231459ac5b54cf8e8952ac5c2b2b2198bJeff Brown void updateState(State& state, nsecs_t eventTime, float xpos, float ypos) const; 225a5b0698231459ac5b54cf8e8952ac5c2b2b2198bJeff Brown void populateEstimator(const State& state, VelocityTracker::Estimator* outEstimator) const; 22653dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown}; 22753dd12a66884540b87fe428383e2f79d0f5e32baJeff Brown 22851df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown 22951df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown/* 23051df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown * Velocity tracker strategy used prior to ICS. 23151df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown */ 23251df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brownclass LegacyVelocityTrackerStrategy : public VelocityTrackerStrategy { 23351df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brownpublic: 23451df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown LegacyVelocityTrackerStrategy(); 23551df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown virtual ~LegacyVelocityTrackerStrategy(); 23651df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown 23751df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown virtual void clear(); 23851df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown virtual void clearPointers(BitSet32 idBits); 23951df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown virtual void addMovement(nsecs_t eventTime, BitSet32 idBits, 24051df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown const VelocityTracker::Position* positions); 24151df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown virtual bool getEstimator(uint32_t id, VelocityTracker::Estimator* outEstimator) const; 24251df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown 24351df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brownprivate: 24451df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown // Oldest sample to consider when calculating the velocity. 24551df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown static const nsecs_t HORIZON = 200 * 1000000; // 100 ms 24651df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown 24751df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown // Number of samples to keep. 24851df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown static const uint32_t HISTORY_SIZE = 20; 24951df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown 25051df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown // The minimum duration between samples when estimating velocity. 25151df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown static const nsecs_t MIN_DURATION = 10 * 1000000; // 10 ms 25251df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown 25351df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown struct Movement { 25451df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown nsecs_t eventTime; 25551df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown BitSet32 idBits; 25651df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown VelocityTracker::Position positions[MAX_POINTERS]; 25751df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown 25851df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown inline const VelocityTracker::Position& getPosition(uint32_t id) const { 25951df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown return positions[idBits.getIndexOfBit(id)]; 26051df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown } 26151df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown }; 26251df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown 26351df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown uint32_t mIndex; 26451df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown Movement mMovements[HISTORY_SIZE]; 26551df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown}; 26651df04b93e8e362edd867abd7efaf1659b8b8b82Jeff Brown 2678a90e6e3174083f274538567d851f98478fc83e9Jeff Brown} // namespace android 2688a90e6e3174083f274538567d851f98478fc83e9Jeff Brown 2698a90e6e3174083f274538567d851f98478fc83e9Jeff Brown#endif // _ANDROIDFW_VELOCITY_TRACKER_H 270