summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2011-03-14 17:57:40 +0100
committerHenrik Rydberg <rydberg@euromail.se>2011-03-14 18:04:54 +0100
commit9994438da1c74a27be7677d8a22b8158309e9c37 (patch)
tree19889736387c43d1ffe46823cb6f2212c6c52a60
parentce26d71cf779fc6d4d6c5bc7af856d5256e68d8a (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.h2
-rw-r--r--src/evemu.c41
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;
}