-
Notifications
You must be signed in to change notification settings - Fork 1
/
EmoEventGetter.cpp
161 lines (147 loc) · 4.19 KB
/
EmoEventGetter.cpp
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include "EmoStateDLL.h"
#include "edk.h"
#include <windows.h>
#include <iostream>
#include <sstream>
#include <stdexcept>
class EmoEngine {
EmoEngineEventHandle _event;
EmoStateHandle _state;
int _stateCode;
public:
EmoEngine() {
if (EE_EngineConnect() != EDK_OK) {
throw std::runtime_error("Emotiv Engine start up failed.");
}
_stateCode = EDK_OK;
_event = EE_EmoEngineEventCreate();
_state = EE_EmoStateCreate();
}
~EmoEngine() {
EE_EngineDisconnect();
EE_EmoStateFree(_state);
EE_EmoEngineEventFree(_event);
}
bool retrieveEvent() {
_stateCode = EE_EngineGetNextEvent(_event);
if(_stateCode == EDK_NO_EVENT) {
return false;
} else if(_stateCode == EDK_OK) {
return true;
}
throw std::runtime_error("Internal error in Emotiv Engine!");
}
EmoEngineEventHandle event() {
return _event;
}
EmoStateHandle eventState() {
EE_EmoEngineEventGetEmoState(_event,_state);
return _state;
}
};
struct Expression {
enum EyeState {
NOTHING = 0,
BLINK = 1<<0,
LWINK = 1<<1,
RWINK = 1<<2,
LLOOK = 1<<3,
RLOOK = 1<<4
};
unsigned eyeState;
EE_ExpressivAlgo_t upperFace,lowerFace;
float upperFacePwr,lowerFacePwr;
Expression(unsigned _eyeState = NOTHING,
EE_ExpressivAlgo_t _upperFace = EXP_NEUTRAL,
float _upperFacePwr = 0,
EE_ExpressivAlgo_t _lowerFace = EXP_NEUTRAL,
float _lowerFacePwr = 0) :
eyeState(_eyeState),
upperFace(_upperFace),
lowerFace(_lowerFace),
upperFacePwr(_upperFacePwr),
lowerFacePwr(_lowerFacePwr) {}
};
std::ostream& operator<<(std::ostream& os,const Expression& e) {
std::ostringstream str;
if(e.eyeState & Expression::BLINK) {
str << "B,";
}
if(e.eyeState & Expression::LWINK) {
str << "l,";
}
if(e.eyeState & Expression::RWINK) {
str << "r,";
}
if(e.eyeState & Expression::RLOOK) {
str << "R,";
}
if(e.eyeState & Expression::LLOOK) {
str << "L,";
}
if(e.upperFacePwr > 0) {
switch (e.upperFace) {
case EXP_EYEBROW: str << "b"; break;
case EXP_FURROW: str << "f"; break;
default: break;
}
str << (int)(e.upperFacePwr*100) << ",";
}
if(e.lowerFacePwr > 0) {
switch (e.lowerFace) {
case EXP_CLENCH: str << "G"; break;
case EXP_SMILE: str << "S"; break;
case EXP_LAUGH: str << "H"; break;
case EXP_SMIRK_LEFT: str << "sl"; break;
case EXP_SMIRK_RIGHT: str << "sr"; break;
default: break;
}
str << (int)(e.lowerFacePwr*100) << ",";
}
std::string outStr = str.str();
if(outStr.empty()) {
os << "neutral";
} else {
os << outStr.substr(0,outStr.length()-1);
}
return os;
}
Expression extractExpression(EmoStateHandle state) {
Expression ret;
ret.upperFace = ES_ExpressivGetUpperFaceAction(state);
ret.lowerFace = ES_ExpressivGetUpperFaceAction(state);
ret.upperFacePwr = ES_ExpressivGetUpperFaceAction(state);
ret.lowerFacePwr = ES_ExpressivGetLowerFaceAction(state);
if(ES_ExpressivIsBlink(state)) {
ret.eyeState |= Expression::BLINK;
}
if(ES_ExpressivIsLeftWink(state)) {
ret.eyeState |= Expression::LWINK;
}
if(ES_ExpressivIsRightWink(state)) {
ret.eyeState |= Expression::RWINK;
}
if(ES_ExpressivIsLookingRight(state)) {
ret.eyeState |= Expression::RLOOK;
}
if(ES_ExpressivIsLookingLeft(state)) {
ret.eyeState |= Expression::LLOOK;
}
return ret;
}
int main() {
EmoEngine engine;
while(1) {
while(engine.retrieveEvent()) {
EmoEngineEventHandle event = engine.event();
unsigned userID;
EE_Event_t eventType = EE_EmoEngineEventGetType(event);
EE_EmoEngineEventGetUserId(event, &userID);
if(eventType == EE_EmoStateUpdated) {
EmoStateHandle state = engine.eventState();
std::cout << extractExpression(state) << std::endl;
}
}
Sleep(1);
}
}