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); int evemu_write_event(FILE *fp, const struct input_event *ev); int evemu_read_event(FILE *fp, struct input_event *ev); +int evemu_read_event_realtime(FILE *fp, struct input_event *ev, + struct timeval *evtime); int evemu_record(FILE *fp, int fd, int ms); 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) return ret; } -int evemu_play(FILE *fp, int fd) +int evemu_read_event_realtime(FILE *fp, struct input_event *ev, + struct timeval *evtime) { - struct input_event prev, ev; - long check = 0, usec; + unsigned long usec; int ret; - memset(&prev, 0, sizeof(prev)); - while (evemu_read_event(fp, &ev) > 0) { - if (!prev.time.tv_sec) - prev = ev; - usec = 1000000L * (ev.time.tv_sec - prev.time.tv_sec); - usec += ev.time.tv_usec - prev.time.tv_usec; - if (usec - check > 500) { - usleep(usec - check); - check = usec; + ret = evemu_read_event(fp, ev); + if (ret <= 0) + return ret; + + if (evtime) { + if (!evtime->tv_sec) + *evtime = ev->time; + usec = 1000000L * (ev->time.tv_sec - evtime->tv_sec); + usec += ev->time.tv_usec - evtime->tv_usec; + if (usec > 500) { + usleep(usec); + *evtime = ev->time; } - SYSCALL(ret = write(fd, &ev, sizeof(ev))); } + return ret; +} + +int evemu_play(FILE *fp, int fd) +{ + struct input_event ev; + struct timeval evtime; + int ret; + + memset(&evtime, 0, sizeof(evtime)); + while (evemu_read_event_realtime(fp, &ev, &evtime) > 0) + SYSCALL(ret = write(fd, &ev, sizeof(ev))); + return 0; } |