From 7db9d8d76ff61c4802ac15559dcea6fa54ff567a Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Fri, 6 Aug 2010 21:11:17 +0200 Subject: initial bzr repo at rev 27 --- src/grail-api.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/grail-api.c (limited to 'src/grail-api.c') diff --git a/src/grail-api.c b/src/grail-api.c new file mode 100644 index 0000000..9ceb1e7 --- /dev/null +++ b/src/grail-api.c @@ -0,0 +1,115 @@ +#include "grail-inserter.h" +#include "grail-recognizer.h" +#include +#include +#include +#include +#include +#include +#include +#include "evbuf.h" + +struct grail_impl { + struct touch_dev dev; + struct touch_engine engine; + struct evbuf evbuf; +}; + +static void tp_event(struct touch_engine *engine, + const struct input_event *ev) +{ + struct grail *ge = engine->priv; + struct grail_impl *x = ge->impl; + evbuf_put(&x->evbuf, ev); +} + +static void tp_sync(struct touch_engine *engine, + const struct input_event *syn) +{ + struct input_event ev; + struct grail *ge = engine->priv; + struct grail_impl *x = ge->impl; + struct touch_frame *frame = &engine->frame; + grail_mask_t filtered[DIM_EV_TYPE_BYTES]; + int nevent = 0; + gin_frame_begin(ge, frame); + gru_recognize(ge, frame); + gin_frame_end(ge, filtered, sizeof(filtered), frame); + if (!ge->event) { + evbuf_clear(&x->evbuf); + return; + } + while (!evbuf_empty(&x->evbuf)) { + evbuf_get(&x->evbuf, &ev); + if (grail_mask_get(filtered, ev.type)) + continue; + ge->event(ge, &ev); + nevent++; + } + if (nevent) + ge->event(ge, syn); +} + +int grail_open(struct grail *ge, int fd) +{ + struct grail_impl *x; + int ret; + x = calloc(1, sizeof(*x)); + if (!x) + return -ENOMEM; + ge->impl = x; + ret = gin_init(ge); + if (ret) + goto freemem; + ret = touch_dev_open(&x->dev, fd); + if (ret) + goto freegin; + ret = gru_init(ge); + if (ret) + goto freedev; + touch_engine_init(&x->engine, tp_event, tp_sync, ge); + touch_engine_attach(&x->engine, &x->dev); + return 0; + freedev: + touch_dev_close(&x->dev, fd); + freegin: + gin_destroy(ge); + freemem: + free(x); + ge->impl = 0; + return ret; +} + +void grail_close(struct grail *ge, int fd) +{ + struct grail_impl *x = ge->impl; + void *status; + touch_engine_detach(&x->engine, &x->dev); + gru_destroy(ge); + touch_dev_close(&x->dev, fd); + gin_destroy(ge); + free(ge->impl); + ge->impl = 0; +} + +int grail_idle(struct grail *ge, int fd, int ms) +{ + struct grail_impl *x = ge->impl; + return touch_dev_idle(&x->dev, fd, ms); +} + +int grail_pull(struct grail *ge, int fd) +{ + struct grail_impl *x = ge->impl; + return touch_dev_pull(&x->dev, fd); +} + +void grail_get_units(struct grail_coord *min, struct grail_coord *max, + const struct grail *ge) +{ + const struct touch_dev_caps *caps = &ge->impl->dev.caps; + min->x = caps->info[TP_POS_X].minimum; + min->y = caps->info[TP_POS_Y].minimum; + max->x = caps->info[TP_POS_X].maximum; + max->y = caps->info[TP_POS_Y].maximum; +} -- cgit v1.2.3