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