Gesture Library
stroke.c
Go to the documentation of this file.
1 #include "stroke.h"
2 
3 #include "stdio.h"
4 
6 
7 void init_stroke() {
8  for (int i = 0; i < MAX_TOUCHES; i++) {
10  stroke_d[i].t0 = 0;
11  stroke_d[i].x0 = 0;
12  stroke_d[i].y0 = 0;
13  stroke_d[i].t = 0;
14  stroke_d[i].x = 0;
15  stroke_d[i].y = 0;
16  stroke_d[i].vx = 0;
17  stroke_d[i].vy = 0;
18  stroke_d[i].uid = 0;
19  stroke_d[i].cache_last = 0;
20  stroke_d[i].cache_size = 0;
21  for (int j = 0; j < STROKE_CACHE_SIZE; j++) {
22  stroke_d[i].cache_vx[j] = 0;
23  stroke_d[i].cache_vy[j] = 0;
24  }
25  }
26 }
27 
28 static void begin_stroke(const touch_event_t* event);
29 static void update_stroke(const touch_event_t* event, char up);
30 
31 static void update_velocity(stroke_t* stroke, float vx, float vy);
32 
33 void recognize_stroke(const touch_event_t* event) {
34  switch (event->type) {
35  case TOUCH_EVENT_DOWN:
36  begin_stroke(event);
37  break;
38  case TOUCH_EVENT_MOVE:
39  update_stroke(event, 0);
40  break;
41  case TOUCH_EVENT_UP:
42  update_stroke(event, 1);
43  break;
44  }
45 }
46 
47 const stroke_t* get_stroke() {
48  return stroke_d;
49 }
50 
51 static void begin_stroke(const touch_event_t* event) {
52  if (event->group < MAX_TOUCHES && (stroke_d[event->group].state == RECOGNIZER_STATE_NULL ||
54 
56  stroke_d[event->group].group = event->group;
57  stroke_d[event->group].uid = event->uid;
58  stroke_d[event->group].x0 = event->x;
59  stroke_d[event->group].y0 = event->y;
60  stroke_d[event->group].t0 = event->t;
61  stroke_d[event->group].x = event->x;
62  stroke_d[event->group].y = event->y;
63  stroke_d[event->group].t = event->t;
64  stroke_d[event->group].vx = 0;
65  stroke_d[event->group].vy = 0;
66  stroke_d[event->group].cache_last = 0;
67  stroke_d[event->group].cache_size = 0;
68  }
69 }
70 
71 static void update_stroke(const touch_event_t* event, char up) {
73  touch_event_t* last = &latest_touch_events[event->group];
74  if (event->t > last->t) {
75  float vx = (event->x - last->x) / (event->t - last->t);
76  float vy = (event->y - last->y) / (event->t - last->t);
77  update_velocity(stroke_d + event->group, vx, vy);
78  stroke_d[event->group].x = event->x;
79  stroke_d[event->group].y = event->y;
80  stroke_d[event->group].t = event->t;
81  }
82  if (up) {
84  }
85  }
86 }
87 
88 static void update_velocity(stroke_t* stroke, float vx, float vy) {
89  float nvx = stroke->vx * stroke->cache_size + vx;
90  float nvy = stroke->vy * stroke->cache_size + vy;
93  } else {
95  nvx -= stroke->cache_vx[stroke->cache_last];
96  nvy -= stroke->cache_vy[stroke->cache_last];
97  }
100  stroke->vx = nvx / stroke->cache_size;
101  stroke->vy = nvy / stroke->cache_size;
102 }
touch_event_t latest_touch_events[MAX_TOUCHES]
set containing most recent touch within finger group
Definition: gesturelib.c:19
@ TOUCH_EVENT_MOVE
Definition: gesturelib.h:11
@ TOUCH_EVENT_UP
Definition: gesturelib.h:13
@ TOUCH_EVENT_DOWN
Definition: gesturelib.h:9
#define MAX_TOUCHES
Definition: gestureparams.h:5
@ RECOGNIZER_STATE_IN_PROGRESS
Definition: recognizer.h:10
@ RECOGNIZER_STATE_NULL
Definition: recognizer.h:6
@ RECOGNIZER_STATE_COMPLETED
Definition: recognizer.h:14
void init_stroke()
Initialize stroke data structures.
Definition: stroke.c:7
stroke_t stroke_d[MAX_TOUCHES]
Definition: stroke.c:5
const stroke_t * get_stroke()
Access array of stroke_t of size MAX_TOUCHES.
Definition: stroke.c:47
void recognize_stroke(const touch_event_t *event)
Recognize stroke gesture.
Definition: stroke.c:33
#define STROKE_CACHE_SIZE
Definition: stroke.h:8
Data structure for stroke gesture data.
Definition: stroke.h:12
float x0
Definition: stroke.h:22
state_t state
Definition: stroke.h:14
float vy
Definition: stroke.h:33
int uid
Definition: stroke.h:19
float t0
Definition: stroke.h:24
int cache_last
Definition: stroke.h:36
unsigned int group
Definition: stroke.h:17
float vx
Definition: stroke.h:32
float y
Definition: stroke.h:28
float cache_vy[STROKE_CACHE_SIZE]
Definition: stroke.h:38
float cache_vx[STROKE_CACHE_SIZE]
Definition: stroke.h:39
float x
Definition: stroke.h:27
int cache_size
Definition: stroke.h:37
float y0
Definition: stroke.h:23
float t
Definition: stroke.h:29
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