-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUXComms.pde
100 lines (85 loc) · 2.75 KB
/
UXComms.pde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import oscP5.*;
import netP5.*;
class UXComms {
float alfa = 0.8;
float dragged_x;
float dragged_y;
float avg_x;
float avg_y;
float dev_x; // low: click, high: swipe - neither: drag
float dev_y;
int state = UXState.OFF;
// comms
OscP5 oscP5 = new OscP5(this,12000);
NetAddress remoteAddress = new NetAddress("127.0.0.1",12001);
void observe(PVector coords, float mass) {
if (state == UXState.OFF) {
dragged_x = coords.x;
avg_x = dragged_x;
dragged_y = coords.y;
avg_y = dragged_y;
dev_x = 0;
dev_y = 0;
state = UXState.TOUCH;
} else {
avg_x = exp_avg(coords.x,avg_x);
avg_y = exp_avg(coords.y,avg_y);
dev_x = exp_deviation(coords.x,avg_x,dev_x);
dev_y = exp_deviation(coords.y,avg_y,dev_y);
if (l2(dev_x,dev_y)> UXState.SWIPETHRESHOLD) {
state = UXState.SWIPE;
} else if (state != UXState.SWIPE) {
if (l2(dev_x,dev_y)> UXState.DRAGTHRESHOLD) {
state = UXState.DRAG;
} else {
state = UXState.TOUCH;
}
dragged_x = coords.x;
dragged_y = coords.y;
}
}
if (state == UXState.TOUCH || state == UXState.DRAG) {
send(state,avg_x,avg_y,mass);
}
// print("Mass : " + mass + " avg : " + avg_x + "," + avg_y + " dev : " + l2(dev_x,dev_y) + " state : " + state + " - ");
println("dev : " + l2(dev_x,dev_y) + " state : " + state + " - ");
}
void observe_empty() {
if (state == UXState.SWIPE) {
send(state, dragged_x, dragged_y, 0, avg_x-dragged_x,avg_y-dragged_y); // swipe is: origin +
state = UXState.OFF;
} else if (state != UXState.OFF) {
state = UXState.OFF;
send(state,dragged_x, dragged_y, 0); // signal click end (
}
}
void send(int state, float x, float y, float mass) {
send(state, x, y, mass, 0 , 0);
}
void send(int state, float x, float y,float mass, float dx, float dy) {
/* in the following different ways of creating osc messages are shown by example */
OscMessage myMessage = new OscMessage("/kinect/hand");
myMessage.add(state);
myMessage.add(x);
myMessage.add(y);
myMessage.add(mass);
myMessage.add(dx);
myMessage.add(dy);
/* send the message */
oscP5.send(myMessage, remoteAddress);
}
void signalReload() {
OscMessage myMessage = new OscMessage("/kinect/reload");
oscP5.send(myMessage, remoteAddress);
}
float exp_avg(float value, float last_avg) {
// println("v " + value + " a " + last_avg + " alfa" + alfa);
return alfa*value+(1-alfa)*last_avg;
}
float exp_deviation(float value, float exp_avg, float last_dev) {
return exp_avg(abs(value-exp_avg),last_dev);
}
float l2(float x1, float x2) {
return sqrt(x1*x1+x2*x2);
}
}