summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Thum <simon.thum@gmx.de>2009-04-01 10:53:10 +0200
committerPeter Hutterer <peter.hutterer@who-t.net>2009-04-19 22:19:00 +1000
commitcbbc7fed994448852961a987a8b0eadf718b24bf (patch)
tree67992fb9db4204066bdf9620af54b1b6fc3971ee
parentca4918ac2ff003142aefbd8ac7ec2bc398ccc6eb (diff)
dix: correctly utilize tracker buffer and protect from timer overruns
two small related fixes hard to split up Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--dix/ptrveloc.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index 92dc5890c..1590cfdbf 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -98,7 +98,7 @@ InitVelocityData(DeviceVelocityPtr s)
s->min_acceleration = 1.0; /* don't decelerate */
s->max_rel_diff = 0.2;
s->max_diff = 1.0;
- s->initial_range = 1;
+ s->initial_range = 2;
s->average_accel = TRUE;
SetAccelerationProfile(s, AccelProfileClassic);
InitTrackers(s, 16);
@@ -445,8 +445,8 @@ FeedTrackers(DeviceVelocityPtr s, int dx, int dy, int cur_t)
s->tracker[n].dy += dy;
}
n = (s->cur_tracker + 1) % s->num_tracker;
- s->tracker[n].dx = dx;
- s->tracker[n].dy = dy;
+ s->tracker[n].dx = 0;
+ s->tracker[n].dy = 0;
s->tracker[n].time = cur_t;
s->tracker[n].dir = GetDirection(dx, dy);
DebugAccelF("(dix prtacc) motion [dx: %i dy: %i dir:%i diff: %i]\n",
@@ -465,7 +465,7 @@ CalcTracker(DeviceVelocityPtr s, int offset, int cur_t){
int index = TRACKER_INDEX(s, offset);
float dist = sqrt( s->tracker[index].dx * s->tracker[index].dx
+ s->tracker[index].dy * s->tracker[index].dy);
- int dtime = cur_t - s->tracker[TRACKER_INDEX(s, offset+1)].time;
+ int dtime = cur_t - s->tracker[index].time;
if(dtime > 0)
return (dist / dtime);
else
@@ -476,20 +476,22 @@ CalcTracker(DeviceVelocityPtr s, int offset, int cur_t){
* (in time) tracker which isn't too old, beyond a linear partition,
* or simply too much off initial velocity.
*
- * min_t should be (now - ~100-600 ms). May return 0.
+ * May return 0.
*/
static float
-QueryTrackers(DeviceVelocityPtr s, int min_t, int cur_t){
- int n, offset, dir = 255, i = -1;
+QueryTrackers(DeviceVelocityPtr s, int cur_t){
+ int n, offset, dir = 255, i = -1, age_ms;
/* initial velocity: a low-offset, valid velocity */
float iveloc = 0, res = 0, tmp, vdiff;
float vfac = s->corr_mul * s->const_acceleration; /* premultiply */
/* loop from current to older data */
- for(offset = 0; offset < s->num_tracker-1; offset++){
+ for(offset = 1; offset < s->num_tracker; offset++){
n = TRACKER_INDEX(s, offset);
- /* bail out if data is too old */
- if(s->tracker[TRACKER_INDEX(s, offset+1)].time < min_t){
+ age_ms = cur_t - s->tracker[n].time;
+
+ /* bail out if data is too old and protect from overrun */
+ if (age_ms >= s->reset_time || age_ms < 0) {
DebugAccelF("(dix prtacc) query: tracker too old\n");
break;
}
@@ -566,7 +568,7 @@ ProcessVelocityData2D(
FeedTrackers(s, dx, dy, time);
- velocity = QueryTrackers(s, time - s->reset_time, time);
+ velocity = QueryTrackers(s, time);
s->velocity = velocity;
return velocity == 0;