Gesture Library
gesturelib.c
Go to the documentation of this file.
1 #include "gesturelib.h"
2 
3 #include "double.h"
4 #include "drag.h"
5 #include "hold.h"
6 #include "hold_and_drag.h"
7 #include "multidrag.h"
8 #include "multistroke.h"
9 #include "rotate.h"
10 #include "stroke.h"
11 #include "tap.h"
12 #include "utils.h"
13 #include "zoom.h"
14 
17 
20 touch_event_t empty_touch_event = {.type = TOUCH_EVENT_UP, .x = 0, .y = 0, .t = 0, .group = TOUCH_GROUP_UNDEFINED};
21 
27 static unsigned int assign_group(touch_event_t* touch_event);
28 
30  for (int i = 0; i < MAX_RECOGNIZERS; i++) {
31  recognizers[i].enabled = 0;
32  }
33  for (int i = 0; i < MAX_TOUCHES; i++) {
35  }
36 
47 
48  return 0;
49 }
50 
53  assign_group(touch_event);
54  }
55  for (int index = 0; index < num_recognizers; index++) {
56  if (recognizers[index].enabled) {
58  }
59  }
60  if (touch_event->group < MAX_TOUCHES) {
62  }
63 }
64 
65 static unsigned int assign_group(touch_event_t* touch_event) {
67  unsigned int free_group = MAX_TOUCHES;
68  // Find the first untracked group to assign this touch to
69  for (unsigned int i = 0; i < MAX_TOUCHES; i++) {
70  if (latest_touch_events[i].type == TOUCH_EVENT_UP) {
71  free_group = i;
72  break;
73  }
74  }
75 
76  // return early if no free groups
77  if (free_group == MAX_TOUCHES) {
78  return TOUCH_GROUP_UNDEFINED;
79  }
80 
81  touch_event->group = free_group;
82  return free_group;
83  }
84 
85  // Find the closest tracked group
86  unsigned int closest_group = TOUCH_GROUP_UNDEFINED;
87  float closest_dist = -1;
88  for (unsigned int i = 0; i < MAX_TOUCHES; i++) {
89  // skip untracked groups
90  if (latest_touch_events[i].type == TOUCH_EVENT_UP) {
91  continue;
92  }
93 
94  float dist = SQUARED_DIST(&latest_touch_events[i], touch_event);
96  (closest_group == TOUCH_GROUP_UNDEFINED || dist < closest_dist)) {
97  closest_group = i;
98  closest_dist = dist;
99  }
100  }
101 
102  // return if all groups are untracked
103  if (closest_group == TOUCH_GROUP_UNDEFINED) {
104  return TOUCH_GROUP_UNDEFINED;
105  }
106 
107  touch_event->group = closest_group;
108  return closest_group;
109 }
110 
111 int add_recognizer(void (*recognize)(const touch_event_t*), void (*init)(void)) {
113  return -1;
114  }
115  gesture_recognizer_t recognizer = {.recognize = recognize, .enabled = 1, .init = init};
116  recognizers[num_recognizers] = recognizer;
117  if (recognizers[num_recognizers].init) {
119  }
120  return num_recognizers++ - 1;
121 }
122 
124  if (recognizer < 0 || recognizer >= num_recognizers) {
125  gesture_recognizer_t null_recognizer = {.recognize = 0, .enabled = 0, .init = 0};
126  return null_recognizer;
127  }
128  gesture_recognizer_t out = recognizers[recognizer];
129  for (int i = recognizer; i < num_recognizers - 1; i++) {
130  recognizers[i] = recognizers[i + 1];
131  }
132  num_recognizers--;
133 
134  return out;
135 }
136 
137 int enable_recognizer(int recognizer) {
138  if (recognizer < 0 || recognizer >= num_recognizers) {
139  return 0;
140  }
141  recognizers[recognizer].enabled = 1;
142  if (recognizers[recognizer].init) {
143  recognizers[recognizer].init();
144  }
145  return 1;
146 }
147 
148 int disable_recognizer(int recognizer) {
149  if (recognizer < 0 || recognizer >= num_recognizers) {
150  return 0;
151  }
152  recognizers[recognizer].enabled = 0;
153  return 1;
154 }
void recognize_double_tap(const touch_event_t *event)
reads the last tap and stroke data and determines whethers this new stroke is part of a double_tap ev...
Definition: double.c:30
void init_double_tap()
initializes the data array by setting all field to 0/NULL
Definition: double.c:11
void init_drag()
Initialize drag data structures.
Definition: drag.c:10
void recognize_drag(const touch_event_t *event)
Recognize drag gesture.
Definition: drag.c:23
int disable_recognizer(int recognizer)
Disable a recognizer already in the library.
Definition: gesturelib.c:148
gesture_recognizer_t remove_recognizer(int recognizer)
Remove a recognizer in the library.
Definition: gesturelib.c:123
touch_event_t latest_touch_events[MAX_TOUCHES]
set containing most recent touch within finger group
Definition: gesturelib.c:19
int init_gesturelib()
This function should be called by the user before passing touch events to the library....
Definition: gesturelib.c:29
int enable_recognizer(int recognizer)
Enable a recognizer already in the library.
Definition: gesturelib.c:137
int add_recognizer(void(*recognize)(const touch_event_t *), void(*init)(void))
Register a recognizer via a recognition function.
Definition: gesturelib.c:111
void process_touch_event(touch_event_t *touch_event)
Users call this function with a generated touch event to let the library process it....
Definition: gesturelib.c:51
gesture_recognizer_t recognizers[MAX_RECOGNIZERS]
Definition: gesturelib.c:15
int num_recognizers
Definition: gesturelib.c:16
touch_event_t empty_touch_event
Definition: gesturelib.c:20
@ TOUCH_EVENT_UP
Definition: gesturelib.h:13
@ TOUCH_EVENT_DOWN
Definition: gesturelib.h:9
float EVENT_GROUPING_DIST_MAX
Definition: gestureparams.c:5
#define MAX_RECOGNIZERS
Definition: gestureparams.h:9
#define TOUCH_GROUP_UNDEFINED
Definition: gestureparams.h:14
#define MAX_TOUCHES
Definition: gestureparams.h:5
void recognize_hold(const touch_event_t *event)
Recognize hold gesture.
Definition: hold.c:27
void init_hold()
Initialize hold data structures.
Definition: hold.c:12
void recognize_hold_and_drag(const touch_event_t *event)
Recognize hold and drag gesture.
Definition: hold_and_drag.c:28
void init_hold_and_drag()
Initialize hold and drag data structures.
Definition: hold_and_drag.c:13
void init_multidrag()
Initialize multidrag data structures.
Definition: multidrag.c:9
void recognize_multidrag(const touch_event_t *event)
Recognize multidrag gesture. This gesture locks the number of fingers once any finger starts moving.
Definition: multidrag.c:37
void recognize_multistroke(const touch_event_t *event)
Recognize multistroke gesture. This gesture allows the number of fingers to change.
Definition: multistroke.c:37
void init_multistroke()
Initialize multistroke data structures.
Definition: multistroke.c:9
void recognize_rotate(const touch_event_t *event)
Recognize rotate gesture. This gesture locks the number of fingers once any finger starts moving.
Definition: rotate.c:19
void init_rotate()
Initialize rotate data structures.
Definition: rotate.c:9
void init_stroke()
Initialize stroke data structures.
Definition: stroke.c:7
void recognize_stroke(const touch_event_t *event)
Recognize stroke gesture.
Definition: stroke.c:33
The user may create their own gesture recognizer to add to the library.
Definition: gesturelib.h:39
void(* init)(void)
Definition: gesturelib.h:46
void(* recognize)(const touch_event_t *)
Definition: gesturelib.h:43
To use the gesture library, users create touch events and fill in the appropriate fields.
Definition: gesturelib.h:17
event_type_t type
Definition: gesturelib.h:19
unsigned int group
Definition: gesturelib.h:31
void init_tap()
Initialize tap data structures.
Definition: tap.c:12
void recognize_tap(const touch_event_t *event)
Recognize tap gesture.
Definition: tap.c:27
#define SQUARED_DIST(a, b)
Definition: utils.h:5
void init_zoom()
Initialize zoom data structures.
Definition: zoom.c:9
void recognize_zoom(const touch_event_t *event)
Recognize zoom gesture. This gesture locks the number of fingers once any finger starts moving.
Definition: zoom.c:19