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