15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2012 The Android Open Source Project
35912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
45912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
55912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * you may not use this file except in compliance with the License.
65912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * You may obtain a copy of the License at
75912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
85912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
95912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Unless required by applicable law or agreed to in writing, software
115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * See the License for the specific language governing permissions and
145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * limitations under the License.
155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#ifndef _LIBINPUT_VELOCITY_CONTROL_H
185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define _LIBINPUT_VELOCITY_CONTROL_H
195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <input/Input.h>
215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <input/VelocityTracker.h>
225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Timers.h>
235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android {
255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Specifies parameters that govern pointer or wheel acceleration.
285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct VelocityControlParameters {
305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // A scale factor that is multiplied with the raw velocity deltas
315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // prior to applying any other velocity control factors.  The scale
325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // factor should be used to adapt the input device resolution
335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // (eg. counts per inch) to the output device resolution (eg. pixels per inch).
345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    //
355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Must be a positive value.
365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Default is 1.0 (no scaling).
375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float scale;
385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The scaled speed at which acceleration begins to be applied.
405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // This value establishes the upper bound of a low speed regime for
415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // small precise motions that are performed without any acceleration.
425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    //
435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Must be a non-negative value.
445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Default is 0.0 (no low threshold).
455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float lowThreshold;
465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The scaled speed at which maximum acceleration is applied.
485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The difference between highThreshold and lowThreshold controls
495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // the range of speeds over which the acceleration factor is interpolated.
505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The wider the range, the smoother the acceleration.
515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    //
525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Must be a non-negative value greater than or equal to lowThreshold.
535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Default is 0.0 (no high threshold).
545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float highThreshold;
555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The acceleration factor.
575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // When the speed is above the low speed threshold, the velocity will scaled
585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // by an interpolated value between 1.0 and this amount.
595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    //
605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Must be a positive greater than or equal to 1.0.
615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Default is 1.0 (no acceleration).
625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float acceleration;
635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    VelocityControlParameters() :
655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            scale(1.0f), lowThreshold(0.0f), highThreshold(0.0f), acceleration(1.0f) {
665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    VelocityControlParameters(float scale, float lowThreshold,
695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            float highThreshold, float acceleration) :
705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            scale(scale), lowThreshold(lowThreshold),
715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            highThreshold(highThreshold), acceleration(acceleration) {
725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Implements mouse pointer and wheel speed control and acceleration.
775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass VelocityControl {
795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    VelocityControl();
815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Sets the various parameters. */
835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void setParameters(const VelocityControlParameters& parameters);
845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Resets the current movement counters to zero.
865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * This has the effect of nullifying any acceleration. */
875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void reset();
885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Translates a raw movement delta into an appropriately
905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * scaled / accelerated delta based on the current velocity. */
915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void move(nsecs_t eventTime, float* deltaX, float* deltaY);
925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate:
945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // If no movements are received within this amount of time,
955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // we assume the movement has stopped and reset the movement counters.
965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static const nsecs_t STOP_TIME = 500 * 1000000; // 500 ms
975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    VelocityControlParameters mParameters;
995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    nsecs_t mLastMovementTime;
1015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    VelocityTracker::Position mRawPosition;
1025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    VelocityTracker mVelocityTracker;
1035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android
1065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif // _LIBINPUT_VELOCITY_CONTROL_H
108