14 * Classe : Server |
14 * Classe : Server |
15 * |
15 * |
16 * Auteur : alexandre.bastien@iri.centrepompidou.fr |
16 * Auteur : alexandre.bastien@iri.centrepompidou.fr |
17 * |
17 * |
18 * Fonctionnalités : Reçoit des notifications du module sous-module Tracking. |
18 * Fonctionnalités : Reçoit des notifications du module sous-module Tracking. |
19 * Traduit les notifications sous forme de messages OSC et les envoie au Front Atelier. |
19 * Centralise les deux serveurs TUIO et WS et permettent aux autres modules de faire appel |
20 * Forme des messages : |
20 * à eux via cette classe. |
21 * - Notification de main dans le champ de recherche : Point3D indiquant la position de la main dans l'espace. |
|
22 */ |
21 */ |
23 |
22 |
24 using System; |
23 using System; |
25 using System.Collections.Generic; |
24 using System.Collections.Generic; |
26 using System.Linq; |
25 using System.Linq; |
27 using System.Text; |
26 using System.Text; |
28 using System.IO; |
|
29 using System.Net; |
|
30 using System.Net.Sockets; |
|
31 using System.Threading; |
|
32 using Tuio; |
|
33 using System.Windows; |
|
34 using Microsoft.Kinect; |
|
35 using System.Windows.Media.Media3D; |
27 using System.Windows.Media.Media3D; |
36 using System.Timers; |
|
37 using System.Resources; |
|
38 using System.Reflection; |
|
39 |
28 |
40 namespace Trakers.Communication |
29 namespace Trakers.Communication |
41 { |
30 { |
42 public class Server |
31 public class Server |
43 { |
32 { |
44 //Serveur TUIO, provenant de la DLL TuioServer créé par Bespoke. |
33 private TUIOServer TUIOserver; |
45 private TuioServer server; |
34 private WSServer WSserver; |
46 |
35 |
47 //Permet de savoir si un curseur pour la main gauche/droite a été créé. |
|
48 private bool leftHandCursorCreated; |
|
49 private bool rightHandCursorCreated; |
|
50 private bool messageCreated; |
|
51 private bool gestureLocked, modLocked; |
|
52 //Intervalle minimum entre les gestures. |
|
53 private int timerElapsing; |
|
54 //Timer. |
|
55 private System.Timers.Timer _timer; |
|
56 //Dernier code envoyé. |
|
57 private String lastCode; |
|
58 |
|
59 /* |
|
60 * 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 * s'il reçoit des notifications. |
|
63 */ |
|
64 public Server(String host, int port, int _timerElapsing) |
36 public Server(String host, int port, int _timerElapsing) |
65 { |
37 { |
66 //Au départ, aucune main n'est dans le champ de recherche et aucune gesture n'est détectée. |
38 TUIOserver = new TUIOServer(host, 8080, _timerElapsing); |
67 leftHandCursorCreated = false; |
39 WSserver = new WSServer(host, 8090, _timerElapsing); |
68 rightHandCursorCreated = false; |
|
69 messageCreated = false; |
|
70 gestureLocked = false; |
|
71 modLocked = false; |
|
72 lastCode = ""; |
|
73 |
|
74 timerElapsing = _timerElapsing; |
|
75 |
|
76 //On démarre le serveur TUIO. |
|
77 server = new TuioServer(host, port); |
|
78 //On initialise le threadPool (appelé toutes les N ms). |
|
79 ThreadPool.QueueUserWorkItem(ThreadPoolCallback); |
|
80 |
|
81 //On instancie le timer à N ms. |
|
82 _timer = new System.Timers.Timer(timerElapsing); |
|
83 //Dès que le timer est expiré, on appelle _timer_Elapsed. |
|
84 _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); |
|
85 } |
|
86 |
|
87 /* |
|
88 * Getter du serveur. |
|
89 */ |
|
90 public TuioServer getServer() |
|
91 { |
|
92 return server; |
|
93 } |
|
94 |
|
95 /* |
|
96 * Méthode appelée à l'expiration du timer pour les gestures et modes. |
|
97 */ |
|
98 public void _timer_Elapsed(object sender, ElapsedEventArgs e) |
|
99 { |
|
100 //On débloque la détection de gesture. |
|
101 gestureLocked = false; |
|
102 //On débloque la notification de nouveau mode. |
|
103 modLocked = false; |
|
104 //On arrête le timer. |
|
105 _timer.Stop(); |
|
106 } |
40 } |
107 |
41 |
108 /* |
42 /* |
109 * Méthode appelée lors d'une notification de type : main gauche entrée dans le champ. |
43 * Méthode appelée lors d'une notification de type : main gauche entrée dans le champ. |
110 */ |
44 */ |
111 public void LeftHandTracked(Point3D pt) |
45 public void LeftHandTracked(Point3D pt) |
112 { |
46 { |
113 //Si le curseur de la main gauche n'est pas créé, alors on le crée. |
47 TUIOserver.LeftHandTracked(pt); |
114 if (!leftHandCursorCreated) |
48 WSserver.LeftHandTracked(pt); |
115 { |
|
116 server.AddTuioCursor(0, pt); |
|
117 leftHandCursorCreated = true; |
|
118 } |
|
119 //S'il existe, on le met simplement à jour. |
|
120 else |
|
121 server.UpdateTuioCursor(0, pt); |
|
122 } |
49 } |
123 |
50 |
124 /* |
51 /* |
125 * Méthode appelée lors d'une notification de type : main droite entrée dans le champ. |
52 * Méthode appelée lors d'une notification de type : main droite entrée dans le champ. |
126 */ |
53 */ |
127 public void RightHandTracked(Point3D pt) |
54 public void RightHandTracked(Point3D pt) |
128 { |
55 { |
129 //Si le curseur de la main droite n'est pas créé, alors on le crée. |
56 TUIOserver.RightHandTracked(pt); |
130 if (!rightHandCursorCreated) |
57 WSserver.RightHandTracked(pt); |
131 { |
|
132 server.AddTuioCursor(1, pt); |
|
133 rightHandCursorCreated = true; |
|
134 } |
|
135 //S'il existe, on le met simplement à jour. |
|
136 else |
|
137 server.UpdateTuioCursor(1, pt); |
|
138 } |
58 } |
139 |
59 |
140 /* |
60 /* |
141 * Méthode appelée lors d'une notification de type : main gauche sortie du champ. |
61 * Méthode appelée lors d'une notification de type : main gauche sortie du champ. |
142 */ |
62 */ |
143 public void LeftHandQuit() |
63 public void LeftHandQuit() |
144 { |
64 { |
145 //Si le curseur de la main gauche existe, alors on le supprime. |
65 TUIOserver.LeftHandQuit(); |
146 if (leftHandCursorCreated) |
66 WSserver.LeftHandQuit(); |
147 { |
|
148 server.DeleteTuioCursor(0); |
|
149 leftHandCursorCreated = false; |
|
150 } |
|
151 } |
67 } |
152 |
68 |
153 /* |
69 /* |
154 * Méthode appelée lors d'une notification de type : main droite sortie du champ. |
70 * Méthode appelée lors d'une notification de type : main droite sortie du champ. |
155 */ |
71 */ |
156 public void RightHandQuit() |
72 public void RightHandQuit() |
157 { |
73 { |
158 //Si le curseur de la main droite existe, alors on le supprime. |
74 TUIOserver.RightHandQuit(); |
159 if (rightHandCursorCreated) |
75 WSserver.RightHandQuit(); |
160 { |
|
161 server.DeleteTuioCursor(1); |
|
162 rightHandCursorCreated = false; |
|
163 } |
|
164 } |
76 } |
165 |
77 |
166 /* |
78 /* |
167 * Méthode appelée lorsqu'une gesture a été détectée et que l'événement approprié a été lancé. |
79 * Méthode appelée lorsqu'une gesture a été détectée et que l'événement approprié a été lancé. |
168 */ |
80 */ |
169 public void GesturePerformed(String code) |
81 public void GesturePerformed(String code) |
170 { |
82 { |
171 //Si le code vient d'être envoyé, on passe. |
83 TUIOserver.GesturePerformed(code); |
172 if (lastCode.Equals(code)) |
84 WSserver.GesturePerformed(code); |
173 return; |
|
174 lastCode = code; |
|
175 //Si une gesture a été effectuée, on bloque un certain temps. |
|
176 if (!gestureLocked) |
|
177 { |
|
178 gestureLocked = true; |
|
179 |
|
180 //On crée un message contenant le code à envoyer. |
|
181 if (!messageCreated) |
|
182 { |
|
183 messageCreated = true; |
|
184 server.AddTuioString(2, code); |
|
185 //On démarre le timer. |
|
186 _timer.Start(); |
|
187 } |
|
188 } |
|
189 } |
85 } |
190 |
86 |
191 /* |
87 /* |
192 * Méthode appelée lorsqu'on doit entrer dans un autre mode. |
88 * Méthode appelée lorsqu'on doit entrer dans un autre mode. |
193 */ |
89 */ |
194 public void ModeNotification(String code) |
90 public void ModeNotification(String code) |
195 { |
91 { |
196 //Si le code vient d'être envoyé, on passe. |
92 TUIOserver.ModeNotification(code); |
197 if (lastCode.Equals(code)) |
93 WSserver.ModeNotification(code); |
198 return; |
|
199 lastCode = code; |
|
200 //Si on a été notifié. |
|
201 if (!modLocked) |
|
202 { |
|
203 modLocked = true; |
|
204 |
|
205 //On crée un message contenant le code à envoyer. |
|
206 if (!messageCreated) |
|
207 { |
|
208 messageCreated = true; |
|
209 server.AddTuioString(2, code); |
|
210 //On démarre le timer. |
|
211 _timer.Start(); |
|
212 } |
|
213 } |
|
214 } |
|
215 |
|
216 /* |
|
217 * Méthode de callback vérifiant toutes les 25 ms les nouvelles notifications. |
|
218 * Il est à noter que si le temps de rafraîchissement des trop rapide, les messages n'ont pas |
|
219 * le temps d'être envoyés. |
|
220 */ |
|
221 private void ThreadPoolCallback(Object threadContext) |
|
222 { |
|
223 while (true) |
|
224 { |
|
225 //On initialise le message OSC. |
|
226 server.InitFrame(); |
|
227 //On l'envoie au client (au host et au port spécifiés dans le constructeur). |
|
228 server.CommitFrame(); |
|
229 //On attend 25 ms. |
|
230 Thread.Sleep(25); |
|
231 |
|
232 //Si une gesture a été effectuée et que le délai d'attente est expiré. |
|
233 if (messageCreated && !gestureLocked && !modLocked) |
|
234 { |
|
235 //On débloque la détection de gesture et on supprime l'objet envoyant les messages OSC de gesture. |
|
236 messageCreated = false; |
|
237 server.DeleteTuioString(2); |
|
238 } |
|
239 } |
|
240 } |
|
241 |
|
242 /* |
|
243 * Getters et Setters |
|
244 */ |
|
245 public void setTimerElapsing(int _timerElapsing) |
|
246 { |
|
247 timerElapsing = _timerElapsing; |
|
248 } |
|
249 |
|
250 public int getTimerElapsing() |
|
251 { |
|
252 return timerElapsing; |
|
253 } |
94 } |
254 } |
95 } |
255 } |
96 } |