41 List<IWebSocketConnection> allSockets; |
41 List<IWebSocketConnection> allSockets; |
42 |
42 |
43 //Permet de savoir si un curseur pour la main gauche/droite a été créé. |
43 //Permet de savoir si un curseur pour la main gauche/droite a été créé. |
44 private bool leftHandCursorCreated; |
44 private bool leftHandCursorCreated; |
45 private bool rightHandCursorCreated; |
45 private bool rightHandCursorCreated; |
46 private bool messageCreated; |
46 private bool gesturesMessageCreated, modeMessageCreated; |
47 private bool gestureLocked, modLocked; |
47 private bool gestureLocked, modLocked; |
48 //Intervalle minimum entre les gestures. |
48 //Intervalle minimum entre les gestures. |
49 private int timerElapsing; |
49 private int timerElapsing; |
50 //Timer. |
50 //Timers. |
51 private System.Timers.Timer _timer; |
51 private System.Timers.Timer _gesturesTimer; |
|
52 private System.Timers.Timer _userPositionTimer; |
52 //Dernier code envoyé. |
53 //Dernier code envoyé. |
53 private String lastCode; |
54 private String lastCode; |
54 //Messages envoyés en WS. |
55 //Messages envoyés en WS. |
55 private String rightHandMessage, leftHandMessage, gestureMessage; |
56 private String rightHandMessage, leftHandMessage, gesturesMessage, modeMessage; |
56 //Messages précédents |
57 //Messages précédents |
57 private String prevRightHandMessage, prevLeftHandMessage, prevGestureMessage; |
58 private String prevRightHandMessage, prevLeftHandMessage, prevGestureMessage, prevModeMessage; |
58 |
59 |
59 /* |
60 /* |
60 * Constructeur : On initialise le serveur avec une adresse et un port, au début les curseurs |
61 * Constructeur : On initialise le serveur avec une adresse et un port, au début les curseurs |
61 * ne sont pas créés et on indique au ThreadPool une fonction de callback de manière à vérifier |
62 * ne sont pas créés et on indique au ThreadPool une fonction de callback de manière à vérifier |
62 * s'il reçoit des notifications. |
63 * s'il reçoit des notifications. |
68 server = new WebSocketServer(port, "ws://" + host + ":" + port); |
69 server = new WebSocketServer(port, "ws://" + host + ":" + port); |
69 |
70 |
70 //Au départ, aucune main n'est dans le champ de recherche et aucune gesture n'est détectée. |
71 //Au départ, aucune main n'est dans le champ de recherche et aucune gesture n'est détectée. |
71 leftHandCursorCreated = false; |
72 leftHandCursorCreated = false; |
72 rightHandCursorCreated = false; |
73 rightHandCursorCreated = false; |
73 messageCreated = false; |
74 gesturesMessageCreated = false; |
|
75 modeMessageCreated = false; |
74 gestureLocked = false; |
76 gestureLocked = false; |
75 modLocked = false; |
77 modLocked = false; |
76 lastCode = ""; |
78 lastCode = ""; |
77 |
79 |
78 timerElapsing = _timerElapsing; |
80 timerElapsing = 500;// _timerElapsing; |
79 |
81 |
80 rightHandMessage = leftHandMessage = gestureMessage = ""; |
82 rightHandMessage = leftHandMessage = gesturesMessage = modeMessage = ""; |
81 |
83 |
82 //On démarre le serveur WebSocket. |
84 //On démarre le serveur WebSocket. |
83 server.Start(socket => |
85 server.Start(socket => |
84 { |
86 { |
85 socket.OnOpen = () => |
87 socket.OnOpen = () => |
101 |
103 |
102 //On initialise le threadPool (appelé toutes les N ms). |
104 //On initialise le threadPool (appelé toutes les N ms). |
103 ThreadPool.QueueUserWorkItem(ThreadPoolCallback); |
105 ThreadPool.QueueUserWorkItem(ThreadPoolCallback); |
104 |
106 |
105 //On instancie le timer à N ms. |
107 //On instancie le timer à N ms. |
106 _timer = new System.Timers.Timer(timerElapsing); |
108 _gesturesTimer = new System.Timers.Timer(timerElapsing); |
|
109 _userPositionTimer = new System.Timers.Timer(timerElapsing/5); |
107 //Dès que le timer est expiré, on appelle _timer_Elapsed. |
110 //Dès que le timer est expiré, on appelle _timer_Elapsed. |
108 _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); |
111 _gesturesTimer.Elapsed += new ElapsedEventHandler(_gesturesTimer_Elapsed); |
|
112 _userPositionTimer.Elapsed += new ElapsedEventHandler(_userPositionTimer_Elapsed); |
109 |
113 |
110 /*var input = Console.ReadLine(); |
114 /*var input = Console.ReadLine(); |
111 while (input != "exit") |
115 while (input != "exit") |
112 { |
116 { |
113 foreach (var socket in allSockets.ToList()) |
117 foreach (var socket in allSockets.ToList()) |
119 } |
123 } |
120 |
124 |
121 /* |
125 /* |
122 * Méthode appelée à l'expiration du timer pour les gestures et modes. |
126 * Méthode appelée à l'expiration du timer pour les gestures et modes. |
123 */ |
127 */ |
124 public void _timer_Elapsed(object sender, ElapsedEventArgs e) |
128 public void _gesturesTimer_Elapsed(object sender, ElapsedEventArgs e) |
125 { |
129 { |
126 //On débloque la détection de gesture. |
130 //On débloque la détection de gesture. |
127 gestureLocked = false; |
131 gestureLocked = false; |
128 //On débloque la notification de nouveau mode. |
132 //On débloque la notification de nouveau mode. |
|
133 //modLocked = false; |
|
134 lastCode = ""; |
|
135 //On arrête le timer. |
|
136 _gesturesTimer.Stop(); |
|
137 } |
|
138 |
|
139 /* |
|
140 * Méthode appelée à l'expiration du timer pour les positions d'utilisateur. |
|
141 */ |
|
142 public void _userPositionTimer_Elapsed(object sender, ElapsedEventArgs e) |
|
143 { |
|
144 //On débloque la détection de gesture. |
|
145 //gestureLocked = false; |
|
146 //On débloque la notification de nouveau mode. |
129 modLocked = false; |
147 modLocked = false; |
|
148 lastCode = ""; |
130 //On arrête le timer. |
149 //On arrête le timer. |
131 _timer.Stop(); |
150 _userPositionTimer.Stop(); |
132 } |
151 } |
133 |
152 |
134 /* |
153 /* |
135 * Méthode appelée lors d'une notification de type : main gauche entrée dans le champ. |
154 * Méthode appelée lors d'une notification de type : main gauche entrée dans le champ. |
136 */ |
155 */ |
179 * Méthode appelée lorsqu'une gesture a été détectée et que l'événement approprié a été lancé. |
198 * Méthode appelée lorsqu'une gesture a été détectée et que l'événement approprié a été lancé. |
180 */ |
199 */ |
181 public void GesturePerformed(String code) |
200 public void GesturePerformed(String code) |
182 { |
201 { |
183 //Si le code vient d'être envoyé, on passe. |
202 //Si le code vient d'être envoyé, on passe. |
184 if (lastCode.Equals(code)) |
203 /*if (lastCode.Equals(code)) |
185 return; |
204 return; |
186 lastCode = code; |
205 lastCode = code;*/ |
187 //Si une gesture a été effectuée, on bloque un certain temps. |
206 //Si une gesture a été effectuée, on bloque un certain temps. |
188 if (!gestureLocked) |
207 if (!gestureLocked) |
189 { |
208 { |
190 gestureLocked = true; |
209 gestureLocked = true; |
191 |
210 |
192 //On crée un message contenant le code à envoyer. |
211 //On crée un message contenant le code à envoyer. |
193 if (!messageCreated) |
212 //if (!gesturesMessageCreated) |
194 { |
213 //{ |
195 messageCreated = true; |
214 gesturesMessageCreated = true; |
196 gestureMessage = "2-" + code; |
215 gesturesMessage = "2-" + code; |
|
216 |
|
217 //Console.WriteLine(gesturesMessage); |
|
218 |
|
219 foreach (var socket in allSockets.ToList()) |
|
220 { |
|
221 socket.Send(gesturesMessage); |
|
222 } |
|
223 |
197 //On démarre le timer. |
224 //On démarre le timer. |
198 _timer.Start(); |
225 _gesturesTimer.Start(); |
199 } |
226 |
|
227 //Console.WriteLine(gestureMessage); |
|
228 //} |
200 } |
229 } |
201 } |
230 } |
202 |
231 |
203 /* |
232 /* |
204 * Méthode appelée lorsqu'on doit entrer dans un autre mode. |
233 * Méthode appelée lorsqu'on doit entrer dans un autre mode. |
205 */ |
234 */ |
206 public void ModeNotification(String code) |
235 public void ModeNotification(String code) |
207 { |
236 { |
208 //Si le code vient d'être envoyé, on passe. |
237 //Si le code vient d'être envoyé, on passe. |
209 if (lastCode.Equals(code)) |
238 /*if (lastCode.Equals(code)) |
210 return; |
239 return; |
211 lastCode = code; |
240 lastCode = code;*/ |
212 //Si on a été notifié. |
241 //Si on a été notifié. |
213 if (!modLocked) |
242 if (!modLocked) |
214 { |
243 { |
215 modLocked = true; |
244 modLocked = true; |
216 |
245 |
217 //On crée un message contenant le code à envoyer. |
246 //On crée un message contenant le code à envoyer. |
218 if (!messageCreated) |
247 //if (!modeMessageCreated) |
219 { |
248 //{ |
220 messageCreated = true; |
249 modeMessageCreated = true; |
221 gestureMessage = "2-" + code; |
250 modeMessage = "2-" + code; |
222 //On démarre le timer. |
251 //On démarre le timer. |
223 _timer.Start(); |
252 |
224 } |
253 foreach (var socket in allSockets.ToList()) |
|
254 { |
|
255 socket.Send(modeMessage); |
|
256 } |
|
257 _userPositionTimer.Start(); |
|
258 |
|
259 //Console.WriteLine(modeMessage); |
|
260 //} |
225 } |
261 } |
226 } |
262 } |
227 |
263 |
228 /* |
264 /* |
229 * Méthode de callback vérifiant toutes les 25 ms les nouvelles notifications. |
265 * Méthode de callback vérifiant toutes les 25 ms les nouvelles notifications. |
232 */ |
268 */ |
233 private void ThreadPoolCallback(Object threadContext) |
269 private void ThreadPoolCallback(Object threadContext) |
234 { |
270 { |
235 while (true) |
271 while (true) |
236 { |
272 { |
237 //S'il existe un message. |
273 /*//S'il existe un message de gesture. |
238 if (gestureMessage != null && !gestureMessage.Equals("") && !gestureMessage.Equals(prevGestureMessage)) |
274 if (gesturesMessage != null && !gesturesMessage.Equals(""))// && !gesturesMessage.Equals(prevGestureMessage)) |
239 { |
275 { |
240 //On l'envoie au client (au host et au port spécifiés dans le constructeur). |
276 //On l'envoie au client (au host et au port spécifiés dans le constructeur). |
241 foreach (var socket in allSockets.ToList()) |
277 foreach (var socket in allSockets.ToList()) |
242 { |
278 { |
243 socket.Send(gestureMessage); |
279 socket.Send(gesturesMessage); |
244 prevGestureMessage = gestureMessage; |
280 //prevGestureMessage = gesturesMessage; |
245 } |
281 } |
246 } |
282 } |
|
283 |
|
284 //S'il existe un message de mode. |
|
285 if (modeMessage != null && !modeMessage.Equals(""))// && !modeMessage.Equals(prevModeMessage)) |
|
286 { |
|
287 //On l'envoie au client (au host et au port spécifiés dans le constructeur). |
|
288 foreach (var socket in allSockets.ToList()) |
|
289 { |
|
290 socket.Send(modeMessage); |
|
291 //prevModeMessage = modeMessage; |
|
292 } |
|
293 }*/ |
|
294 |
247 //Si la main gauche est détectée. |
295 //Si la main gauche est détectée. |
248 if (leftHandMessage != null && !leftHandMessage.Equals("") && !leftHandMessage.Equals(prevLeftHandMessage)) |
296 if (leftHandMessage != null && !leftHandMessage.Equals("") && !leftHandMessage.Equals(prevLeftHandMessage)) |
249 { |
297 { |
250 //On l'envoie au client (au host et au port spécifiés dans le constructeur). |
298 //On l'envoie au client (au host et au port spécifiés dans le constructeur). |
251 foreach (var socket in allSockets.ToList()) |
299 foreach (var socket in allSockets.ToList()) |
267 |
315 |
268 //On attend 25 ms. |
316 //On attend 25 ms. |
269 Thread.Sleep(25); |
317 Thread.Sleep(25); |
270 |
318 |
271 //Si une gesture a été effectuée et que le délai d'attente est expiré. |
319 //Si une gesture a été effectuée et que le délai d'attente est expiré. |
272 if (messageCreated && !gestureLocked && !modLocked) |
320 if (gesturesMessageCreated && !gestureLocked) |
273 { |
321 { |
274 //On débloque la détection de gesture et on supprime l'objet envoyant les messages OSC de gesture. |
322 //On débloque la détection de gesture et on supprime l'objet envoyant les messages OSC de gesture. |
275 messageCreated = false; |
323 gesturesMessageCreated = false; |
276 gestureMessage = ""; |
324 gesturesMessage = ""; |
|
325 } |
|
326 |
|
327 //Si un mode a été effectuée et que le délai d'attente est expiré. |
|
328 if (modeMessageCreated && !modLocked) |
|
329 { |
|
330 //On débloque la détection de gesture et on supprime l'objet envoyant les messages OSC de gesture. |
|
331 modeMessageCreated = false; |
|
332 modeMessage = ""; |
277 } |
333 } |
278 } |
334 } |
279 } |
335 } |
280 |
336 |
281 /* |
337 /* |