summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2011-02-16 18:20:14 +0100
committerHenrik Rydberg <rydberg@euromail.se>2011-02-16 18:20:14 +0100
commitd619da633517175ffa6977a80760673628f91583 (patch)
tree42bddbfbd1b69dcaa8aaf82a6709f21b00e26efb
parent7864e778cc10dbc2b0064f0f1953ef5389f0d68b (diff)
Add velocity estimate
The per-touch velocity is useful in many contexts. This patch adds a simple estimator of the velocity, which also smooths out position jumps caused by course-grained event updates. Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
-rw-r--r--include/utouch/frame.h4
-rw-r--r--src/frame-mtdev.c2
-rw-r--r--src/frame-xi2.c2
-rw-r--r--src/frame.c33
-rw-r--r--tools/common-defs.h2
5 files changed, 37 insertions, 6 deletions
diff --git a/include/utouch/frame.h b/include/utouch/frame.h
index 03a44aa..60195ef 100644
--- a/include/utouch/frame.h
+++ b/include/utouch/frame.h
@@ -115,6 +115,8 @@ struct utouch_surface {
115 * @orientation: direction of ellipse (left: -Pi/2, up: 0, right: Pi/2) 115 * @orientation: direction of ellipse (left: -Pi/2, up: 0, right: Pi/2)
116 * @pressure: pressure of contact (pressure units) 116 * @pressure: pressure of contact (pressure units)
117 * @distance: distance of contact (surface units) 117 * @distance: distance of contact (surface units)
118 * @vx: horizontal velocity coordinate (units / millisecond)
119 * @vy: vertical velocity coordinate (units / millisecond)
118 * 120 *
119 * Surface contact details. Later versions of this struct may grow in 121 * Surface contact details. Later versions of this struct may grow in
120 * size, but will remain binary compatible with older versions. 122 * size, but will remain binary compatible with older versions.
@@ -138,6 +140,8 @@ struct utouch_contact {
138 float orientation; 140 float orientation;
139 float pressure; 141 float pressure;
140 float distance; 142 float distance;
143 float vx;
144 float vy;
141}; 145};
142 146
143/* time in milliseconds */ 147/* time in milliseconds */
diff --git a/src/frame-mtdev.c b/src/frame-mtdev.c
index caf90ae..1d9976d 100644
--- a/src/frame-mtdev.c
+++ b/src/frame-mtdev.c
@@ -154,9 +154,11 @@ static int handle_abs_event(utouch_frame_handle fh,
154 return 1; 154 return 1;
155 case ABS_MT_POSITION_X: 155 case ABS_MT_POSITION_X:
156 t->x = ev->value; 156 t->x = ev->value;
157 t->vx = 0;
157 return 1; 158 return 1;
158 case ABS_MT_POSITION_Y: 159 case ABS_MT_POSITION_Y:
159 t->y = ev->value; 160 t->y = ev->value;
161 t->vy = 0;
160 return 1; 162 return 1;
161 case ABS_MT_TOUCH_MAJOR: 163 case ABS_MT_TOUCH_MAJOR:
162 t->touch_major = ev->value; 164 t->touch_major = ev->value;
diff --git a/src/frame-xi2.c b/src/frame-xi2.c
index a78d9bf..bead751 100644
--- a/src/frame-xi2.c
+++ b/src/frame-xi2.c
@@ -217,9 +217,11 @@ static int handle_event(utouch_frame_handle fh,
217 switch (fh->evmap[ix]) { 217 switch (fh->evmap[ix]) {
218 case ABS_MT_POSITION_X: 218 case ABS_MT_POSITION_X:
219 slot->x = value; 219 slot->x = value;
220 slot->vx = 0;
220 return 1; 221 return 1;
221 case ABS_MT_POSITION_Y: 222 case ABS_MT_POSITION_Y:
222 slot->y = value; 223 slot->y = value;
224 slot->vy = 0;
223 return 1; 225 return 1;
224 case ABS_MT_TOUCH_MAJOR: 226 case ABS_MT_TOUCH_MAJOR:
225 slot->touch_major = value; 227 slot->touch_major = value;
diff --git a/src/frame.c b/src/frame.c
index 32bd2cd..f1c8aa4 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -245,11 +245,14 @@ static void transform_slot(struct utouch_contact *slot,
245 slot->distance *= f; 245 slot->distance *= f;
246} 246}
247 247
248static void copy_contact(utouch_frame_handle fh, 248static void set_contact(utouch_frame_handle fh,
249 struct utouch_contact *a, 249 struct utouch_contact *a,
250 const struct utouch_contact *b) 250 struct utouch_contact *b,
251 utouch_frame_time_t dt)
251{ 252{
253 static const float D = 0.333;
252 struct utouch_surface *s = fh->surface; 254 struct utouch_surface *s = fh->surface;
255 const struct utouch_contact *ap = a->prev;
253 256
254 a->active = b->id != -1; 257 a->active = b->id != -1;
255 a->id = b->id; 258 a->id = b->id;
@@ -267,6 +270,21 @@ static void copy_contact(utouch_frame_handle fh,
267 a->distance = b->distance; 270 a->distance = b->distance;
268 271
269 transform_slot(a, s); 272 transform_slot(a, s);
273
274 if (a->active && ap->active && a->id == ap->id) {
275 a->x += b->vx * dt;
276 a->y += b->vy * dt;
277 if (dt > 0) {
278 a->vx = (1 - D) * ap->vx + D * (a->x - ap->x) / dt;
279 a->vy = (1 - D) * ap->vy + D * (a->y - ap->y) / dt;
280 }
281 } else {
282 a->vx = 0;
283 a->vy = 0;
284 }
285
286 b->vx = a->vx;
287 b->vy = a->vy;
270} 288}
271 289
272static int detect_addrem(const struct utouch_contact *a, 290static int detect_addrem(const struct utouch_contact *a,
@@ -303,14 +321,18 @@ const struct utouch_frame *utouch_frame_sync(utouch_frame_handle fh,
303 const struct utouch_frame *prev = frame->prev; 321 const struct utouch_frame *prev = frame->prev;
304 struct utouch_frame *next = fh->next; 322 struct utouch_frame *next = fh->next;
305 int naddrem = 0, nmod = 0; 323 int naddrem = 0, nmod = 0;
324 utouch_frame_time_t dt;
306 int i; 325 int i;
307 326
327 frame->time = time ? time : get_time_ms();
308 frame->num_active = 0; 328 frame->num_active = 0;
329 dt = frame->time - prev->time;
330
309 for (i = 0; i < fh->num_slots; i++) { 331 for (i = 0; i < fh->num_slots; i++) {
310 struct utouch_contact *p = frame->slots[i]; 332 struct utouch_contact *p = frame->slots[i];
311 const struct utouch_contact *q = next->slots[i]; 333 struct utouch_contact *q = next->slots[i];
312 334
313 copy_contact(fh, p, q); 335 set_contact(fh, p, q, dt);
314 if (p->active) 336 if (p->active)
315 frame->active[frame->num_active++] = p; 337 frame->active[frame->num_active++] = p;
316 338
@@ -320,7 +342,6 @@ const struct utouch_frame *utouch_frame_sync(utouch_frame_handle fh,
320 if (naddrem + nmod == 0) 342 if (naddrem + nmod == 0)
321 return 0; 343 return 0;
322 344
323 frame->time = time ? time : get_time_ms();
324 if (naddrem == 0 && frame->time < prev->time + fh->hold_ms) 345 if (naddrem == 0 && frame->time < prev->time + fh->hold_ms)
325 return 0; 346 return 0;
326 347
diff --git a/tools/common-defs.h b/tools/common-defs.h
index 0e08bc5..e435f72 100644
--- a/tools/common-defs.h
+++ b/tools/common-defs.h
@@ -72,6 +72,8 @@ static void report_frame(const struct utouch_frame *frame)
72 fprintf(stderr, " angle: %f\n", t->orientation); 72 fprintf(stderr, " angle: %f\n", t->orientation);
73 fprintf(stderr, " pressure: %f\n", t->pressure); 73 fprintf(stderr, " pressure: %f\n", t->pressure);
74 fprintf(stderr, " distance: %f\n", t->distance); 74 fprintf(stderr, " distance: %f\n", t->distance);
75 fprintf(stderr, " vx: %f\n", t->vx);
76 fprintf(stderr, " vy: %f\n", t->vy);
75 } 77 }
76 78
77 fprintf(stderr, "sync %d %ld %d %d %d\n", 79 fprintf(stderr, "sync %d %ld %d %d %d\n",