diff options
| author | Henrik Rydberg <rydberg@euromail.se> | 2011-03-14 17:57:40 +0100 |
|---|---|---|
| committer | Henrik Rydberg <rydberg@euromail.se> | 2011-03-14 18:04:54 +0100 |
| commit | 9994438da1c74a27be7677d8a22b8158309e9c37 (patch) | |
| tree | 19889736387c43d1ffe46823cb6f2212c6c52a60 | |
| parent | ce26d71cf779fc6d4d6c5bc7af856d5256e68d8a (diff) | |
Move realtime read into its own function
The realtime read functionality is needed in many places,
in particular in the test frameworks of utouch-frame and utouch-grail.
Move the realtime code from evemu_play into its own function,
and make it part of the API.
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
| -rw-r--r-- | include/evemu.h | 2 | ||||
| -rw-r--r-- | src/evemu.c | 41 |
2 files changed, 30 insertions, 13 deletions
diff --git a/include/evemu.h b/include/evemu.h index f414fdf..31107bc 100644 --- a/include/evemu.h +++ b/include/evemu.h | |||
| @@ -76,6 +76,8 @@ int evemu_read(struct evemu_device *dev, FILE *fp); | |||
| 76 | 76 | ||
| 77 | int evemu_write_event(FILE *fp, const struct input_event *ev); | 77 | int evemu_write_event(FILE *fp, const struct input_event *ev); |
| 78 | int evemu_read_event(FILE *fp, struct input_event *ev); | 78 | int evemu_read_event(FILE *fp, struct input_event *ev); |
| 79 | int evemu_read_event_realtime(FILE *fp, struct input_event *ev, | ||
| 80 | struct timeval *evtime); | ||
| 79 | 81 | ||
| 80 | int evemu_record(FILE *fp, int fd, int ms); | 82 | int evemu_record(FILE *fp, int fd, int ms); |
| 81 | int evemu_play(FILE *fp, int fd); | 83 | int evemu_play(FILE *fp, int fd); |
diff --git a/src/evemu.c b/src/evemu.c index e297b4d..f06c64a 100644 --- a/src/evemu.c +++ b/src/evemu.c | |||
| @@ -361,25 +361,40 @@ int evemu_read_event(FILE *fp, struct input_event *ev) | |||
| 361 | return ret; | 361 | return ret; |
| 362 | } | 362 | } |
| 363 | 363 | ||
| 364 | int evemu_play(FILE *fp, int fd) | 364 | int evemu_read_event_realtime(FILE *fp, struct input_event *ev, |
| 365 | struct timeval *evtime) | ||
| 365 | { | 366 | { |
| 366 | struct input_event prev, ev; | 367 | unsigned long usec; |
| 367 | long check = 0, usec; | ||
| 368 | int ret; | 368 | int ret; |
| 369 | 369 | ||
| 370 | memset(&prev, 0, sizeof(prev)); | 370 | ret = evemu_read_event(fp, ev); |
| 371 | while (evemu_read_event(fp, &ev) > 0) { | 371 | if (ret <= 0) |
| 372 | if (!prev.time.tv_sec) | 372 | return ret; |
| 373 | prev = ev; | 373 | |
| 374 | usec = 1000000L * (ev.time.tv_sec - prev.time.tv_sec); | 374 | if (evtime) { |
| 375 | usec += ev.time.tv_usec - prev.time.tv_usec; | 375 | if (!evtime->tv_sec) |
| 376 | if (usec - check > 500) { | 376 | *evtime = ev->time; |
| 377 | usleep(usec - check); | 377 | usec = 1000000L * (ev->time.tv_sec - evtime->tv_sec); |
| 378 | check = usec; | 378 | usec += ev->time.tv_usec - evtime->tv_usec; |
| 379 | if (usec > 500) { | ||
| 380 | usleep(usec); | ||
| 381 | *evtime = ev->time; | ||
| 379 | } | 382 | } |
| 380 | SYSCALL(ret = write(fd, &ev, sizeof(ev))); | ||
| 381 | } | 383 | } |
| 382 | 384 | ||
| 385 | return ret; | ||
| 386 | } | ||
| 387 | |||
| 388 | int evemu_play(FILE *fp, int fd) | ||
| 389 | { | ||
| 390 | struct input_event ev; | ||
| 391 | struct timeval evtime; | ||
| 392 | int ret; | ||
| 393 | |||
| 394 | memset(&evtime, 0, sizeof(evtime)); | ||
| 395 | while (evemu_read_event_realtime(fp, &ev, &evtime) > 0) | ||
| 396 | SYSCALL(ret = write(fd, &ev, sizeof(ev))); | ||
| 397 | |||
| 383 | return 0; | 398 | return 0; |
| 384 | } | 399 | } |
| 385 | 400 | ||
