From 586dd0f17bbd6e2e8b51f3e2fca9269e33f8038a Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Thu, 17 Mar 2011 10:39:59 +0100 Subject: Allow replay of device data through grail This patch adds replay capabilities to grail. If the specified device points to a valid evemu file, the device properties will be extracted from that file instead. Any appended event data will be replayed in realtime when calling grail_pull_mtdev(). In practise, grail_gesture may be executed with a test file. Signed-off-by: Henrik Rydberg --- src/grail-api.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 10 deletions(-) (limited to 'src/grail-api.c') diff --git a/src/grail-api.c b/src/grail-api.c index c189ee9..5a0beb4 100644 --- a/src/grail-api.c +++ b/src/grail-api.c @@ -43,29 +43,43 @@ void grail_filter_abs_events(struct grail *ge, int usage) int grail_open(struct grail *ge, int fd) { struct grail_impl *x; + struct stat fs; int ret; + + ret = fstat(fd, &fs); + if (ret) + return ret; + x = calloc(1, sizeof(*x)); if (!x) return -ENOMEM; - x->evemu = evemu_new(0); + if (!fs.st_rdev) + x->fptest = fdopen(fd, "r"); + + x->evemu = evemu_new(x->fptest ? "fptest" : 0); if (!x->evemu) { ret = -ENOMEM; goto freemem; } - ret = evemu_extract(x->evemu, fd); + if (x->fptest) + ret = evemu_read(x->evemu, x->fptest) <= 0; + else + ret = evemu_extract(x->evemu, fd); if (ret) goto freemem; if (!utouch_frame_is_supported_mtdev(x->evemu)) { ret = -ENODEV; goto freemem; } - x->mtdev = mtdev_new_open(fd); - if (!x->mtdev) { - ret = -ENOMEM; - goto freemem; - } + if (!x->fptest) { + x->mtdev = mtdev_new_open(fd); + if (!x->mtdev) { + ret = -ENOMEM; + goto freemem; + } + } x->fh = utouch_frame_new_engine(DIM_FRAMES, DIM_TOUCH, FRAME_RATE); if (!x->fh) { ret = -ENOMEM; @@ -91,9 +105,12 @@ int grail_open(struct grail *ge, int fd) freeframe: utouch_frame_delete_engine(x->fh); freedev: - mtdev_close_delete(x->mtdev); + if (x->mtdev) + mtdev_close_delete(x->mtdev); freemem: evemu_delete(x->evemu); + if (x->fptest) + fclose(x->fptest); free(x); ge->impl = 0; return ret; @@ -105,8 +122,11 @@ void grail_close(struct grail *ge, int fd) gru_destroy(ge); gin_destroy(ge); utouch_frame_delete_engine(x->fh); - mtdev_close_delete(x->mtdev); + if (x->mtdev) + mtdev_close_delete(x->mtdev); evemu_delete(x->evemu); + if (x->fptest) + fclose(x->fptest); free(x); ge->impl = 0; } @@ -114,7 +134,11 @@ void grail_close(struct grail *ge, int fd) int grail_idle(struct grail *ge, int fd, int ms) { struct grail_impl *x = ge->impl; - return mtdev_idle(x->mtdev, fd, ms); + if (x->fptest) + return 0; + if (x->mtdev) + return mtdev_idle(x->mtdev, fd, ms); + return 1; } void grail_get_units(const struct grail *ge, @@ -244,12 +268,34 @@ static void grail_pump_mtdev(struct grail *ge, const struct input_event *ev) } } +static int grail_pull_fstest(struct grail *ge, int fd) +{ + struct grail_impl *impl = ge->impl; + struct input_event ev; + struct timeval evtime; + int count = 0; + + memset(&evtime, 0, sizeof(evtime)); + while (evemu_read_event_realtime(impl->fptest, &ev, &evtime) > 0) { + grail_pump_mtdev(ge, &ev); + count++; + } + + fclose(impl->fptest); + impl->fptest = 0; + + return count > 0 ? count : -1; +} + int grail_pull(struct grail *ge, int fd) { struct grail_impl *impl = ge->impl; struct input_event ev; int ret, count = 0; + if (impl->fptest) + return grail_pull_fstest(ge, fd); + while ((ret = mtdev_get(impl->mtdev, fd, &ev, 1)) > 0) { grail_pump_mtdev(ge, &ev); count++; -- cgit v1.2.3