diff options
| author | Henrik Rydberg <rydberg@euromail.se> | 2011-03-17 10:39:59 +0100 |
|---|---|---|
| committer | Henrik Rydberg <rydberg@euromail.se> | 2011-04-04 19:46:28 +0200 |
| commit | 586dd0f17bbd6e2e8b51f3e2fca9269e33f8038a (patch) | |
| tree | 869503d8f20db088270695abe83ed9bb3425b6f2 /src/grail-api.c | |
| parent | 05833fda0c31938206f134e8fa1876c3360bf6c9 (diff) | |
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 <rydberg@euromail.se>
Diffstat (limited to 'src/grail-api.c')
| -rw-r--r-- | src/grail-api.c | 66 |
1 files changed, 56 insertions, 10 deletions
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) | |||
| 43 | int grail_open(struct grail *ge, int fd) | 43 | int grail_open(struct grail *ge, int fd) |
| 44 | { | 44 | { |
| 45 | struct grail_impl *x; | 45 | struct grail_impl *x; |
| 46 | struct stat fs; | ||
| 46 | int ret; | 47 | int ret; |
| 48 | |||
| 49 | ret = fstat(fd, &fs); | ||
| 50 | if (ret) | ||
| 51 | return ret; | ||
| 52 | |||
| 47 | x = calloc(1, sizeof(*x)); | 53 | x = calloc(1, sizeof(*x)); |
| 48 | if (!x) | 54 | if (!x) |
| 49 | return -ENOMEM; | 55 | return -ENOMEM; |
| 50 | 56 | ||
| 51 | x->evemu = evemu_new(0); | 57 | if (!fs.st_rdev) |
| 58 | x->fptest = fdopen(fd, "r"); | ||
| 59 | |||
| 60 | x->evemu = evemu_new(x->fptest ? "fptest" : 0); | ||
| 52 | if (!x->evemu) { | 61 | if (!x->evemu) { |
| 53 | ret = -ENOMEM; | 62 | ret = -ENOMEM; |
| 54 | goto freemem; | 63 | goto freemem; |
| 55 | } | 64 | } |
| 56 | ret = evemu_extract(x->evemu, fd); | 65 | if (x->fptest) |
| 66 | ret = evemu_read(x->evemu, x->fptest) <= 0; | ||
| 67 | else | ||
| 68 | ret = evemu_extract(x->evemu, fd); | ||
| 57 | if (ret) | 69 | if (ret) |
| 58 | goto freemem; | 70 | goto freemem; |
| 59 | if (!utouch_frame_is_supported_mtdev(x->evemu)) { | 71 | if (!utouch_frame_is_supported_mtdev(x->evemu)) { |
| 60 | ret = -ENODEV; | 72 | ret = -ENODEV; |
| 61 | goto freemem; | 73 | goto freemem; |
| 62 | } | 74 | } |
| 63 | x->mtdev = mtdev_new_open(fd); | ||
| 64 | if (!x->mtdev) { | ||
| 65 | ret = -ENOMEM; | ||
| 66 | goto freemem; | ||
| 67 | } | ||
| 68 | 75 | ||
| 76 | if (!x->fptest) { | ||
| 77 | x->mtdev = mtdev_new_open(fd); | ||
| 78 | if (!x->mtdev) { | ||
| 79 | ret = -ENOMEM; | ||
| 80 | goto freemem; | ||
| 81 | } | ||
| 82 | } | ||
| 69 | x->fh = utouch_frame_new_engine(DIM_FRAMES, DIM_TOUCH, FRAME_RATE); | 83 | x->fh = utouch_frame_new_engine(DIM_FRAMES, DIM_TOUCH, FRAME_RATE); |
| 70 | if (!x->fh) { | 84 | if (!x->fh) { |
| 71 | ret = -ENOMEM; | 85 | ret = -ENOMEM; |
| @@ -91,9 +105,12 @@ int grail_open(struct grail *ge, int fd) | |||
| 91 | freeframe: | 105 | freeframe: |
| 92 | utouch_frame_delete_engine(x->fh); | 106 | utouch_frame_delete_engine(x->fh); |
| 93 | freedev: | 107 | freedev: |
| 94 | mtdev_close_delete(x->mtdev); | 108 | if (x->mtdev) |
| 109 | mtdev_close_delete(x->mtdev); | ||
| 95 | freemem: | 110 | freemem: |
| 96 | evemu_delete(x->evemu); | 111 | evemu_delete(x->evemu); |
| 112 | if (x->fptest) | ||
| 113 | fclose(x->fptest); | ||
| 97 | free(x); | 114 | free(x); |
| 98 | ge->impl = 0; | 115 | ge->impl = 0; |
| 99 | return ret; | 116 | return ret; |
| @@ -105,8 +122,11 @@ void grail_close(struct grail *ge, int fd) | |||
| 105 | gru_destroy(ge); | 122 | gru_destroy(ge); |
| 106 | gin_destroy(ge); | 123 | gin_destroy(ge); |
| 107 | utouch_frame_delete_engine(x->fh); | 124 | utouch_frame_delete_engine(x->fh); |
| 108 | mtdev_close_delete(x->mtdev); | 125 | if (x->mtdev) |
| 126 | mtdev_close_delete(x->mtdev); | ||
| 109 | evemu_delete(x->evemu); | 127 | evemu_delete(x->evemu); |
| 128 | if (x->fptest) | ||
| 129 | fclose(x->fptest); | ||
| 110 | free(x); | 130 | free(x); |
| 111 | ge->impl = 0; | 131 | ge->impl = 0; |
| 112 | } | 132 | } |
| @@ -114,7 +134,11 @@ void grail_close(struct grail *ge, int fd) | |||
| 114 | int grail_idle(struct grail *ge, int fd, int ms) | 134 | int grail_idle(struct grail *ge, int fd, int ms) |
| 115 | { | 135 | { |
| 116 | struct grail_impl *x = ge->impl; | 136 | struct grail_impl *x = ge->impl; |
| 117 | return mtdev_idle(x->mtdev, fd, ms); | 137 | if (x->fptest) |
| 138 | return 0; | ||
| 139 | if (x->mtdev) | ||
| 140 | return mtdev_idle(x->mtdev, fd, ms); | ||
| 141 | return 1; | ||
| 118 | } | 142 | } |
| 119 | 143 | ||
| 120 | void grail_get_units(const struct grail *ge, | 144 | 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) | |||
| 244 | } | 268 | } |
| 245 | } | 269 | } |
| 246 | 270 | ||
| 271 | static int grail_pull_fstest(struct grail *ge, int fd) | ||
| 272 | { | ||
| 273 | struct grail_impl *impl = ge->impl; | ||
| 274 | struct input_event ev; | ||
| 275 | struct timeval evtime; | ||
| 276 | int count = 0; | ||
| 277 | |||
| 278 | memset(&evtime, 0, sizeof(evtime)); | ||
| 279 | while (evemu_read_event_realtime(impl->fptest, &ev, &evtime) > 0) { | ||
| 280 | grail_pump_mtdev(ge, &ev); | ||
| 281 | count++; | ||
| 282 | } | ||
| 283 | |||
| 284 | fclose(impl->fptest); | ||
| 285 | impl->fptest = 0; | ||
| 286 | |||
| 287 | return count > 0 ? count : -1; | ||
| 288 | } | ||
| 289 | |||
| 247 | int grail_pull(struct grail *ge, int fd) | 290 | int grail_pull(struct grail *ge, int fd) |
| 248 | { | 291 | { |
| 249 | struct grail_impl *impl = ge->impl; | 292 | struct grail_impl *impl = ge->impl; |
| 250 | struct input_event ev; | 293 | struct input_event ev; |
| 251 | int ret, count = 0; | 294 | int ret, count = 0; |
| 252 | 295 | ||
| 296 | if (impl->fptest) | ||
| 297 | return grail_pull_fstest(ge, fd); | ||
| 298 | |||
| 253 | while ((ret = mtdev_get(impl->mtdev, fd, &ev, 1)) > 0) { | 299 | while ((ret = mtdev_get(impl->mtdev, fd, &ev, 1)) > 0) { |
| 254 | grail_pump_mtdev(ge, &ev); | 300 | grail_pump_mtdev(ge, &ev); |
| 255 | count++; | 301 | count++; |
