20 * noeuds de son squelette. Lance des événements lorsque la main gauche/droite entre dans/quitte le champ. |
19 * noeuds de son squelette. Lance des événements lorsque la main gauche/droite entre dans/quitte le champ. |
21 * Envoie des données au sous-module de debug de manière a afficher un retour visuel sur la position de l'utilisateur, |
20 * Envoie des données au sous-module de debug de manière a afficher un retour visuel sur la position de l'utilisateur, |
22 * son squelette, la détection de ses mains. |
21 * son squelette, la détection de ses mains. |
23 * Découpe l'interaction avec le middleware en différents modes. |
22 * Découpe l'interaction avec le middleware en différents modes. |
24 */ |
23 */ |
25 |
|
26 using System; |
24 using System; |
27 using System.Collections.Generic; |
25 using System.Collections.Generic; |
28 using System.Linq; |
26 using System.Linq; |
29 using System.Windows.Documents; |
27 using System.Windows; |
30 using Microsoft.Kinect; |
28 using Microsoft.Kinect; |
31 using Trakers.Communication; |
29 using Trakers.Communication; |
|
30 using Trakers.Debug; |
32 using Trakers.MainModule.Events; |
31 using Trakers.MainModule.Events; |
33 using Trakers.Tracking.Search; |
|
34 using Trakers.Debug; |
|
35 using System.Windows; |
|
36 using Trakers.Tracking.Gestures; |
32 using Trakers.Tracking.Gestures; |
37 using Trakers.Tracking.Postures; |
33 using Trakers.Tracking.Postures; |
38 |
34 |
39 namespace Trakers.MainModule |
35 namespace Trakers.MainModule |
40 { |
36 { |
55 public delegate void SwipeHandler(object o, SwipeEventArgs e); |
51 public delegate void SwipeHandler(object o, SwipeEventArgs e); |
56 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Push/Pull. |
52 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Push/Pull. |
57 public delegate void PushHandler(object o, PushEventArgs e); |
53 public delegate void PushHandler(object o, PushEventArgs e); |
58 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Jump. |
54 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Jump. |
59 public delegate void JumpHandler(object o, JumpEventArgs e); |
55 public delegate void JumpHandler(object o, JumpEventArgs e); |
|
56 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Fall. |
|
57 public delegate void FallHandler(object o, FallEventArgs e); |
60 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Wave. |
58 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Wave. |
61 public delegate void WaveHandler(object o, WaveEventArgs e); |
59 public delegate void WaveHandler(object o, WaveEventArgs e); |
62 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Circle. |
60 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Circle. |
63 public delegate void CircleHandler(object o, CircleEventArgs e); |
61 public delegate void CircleHandler(object o, CircleEventArgs e); |
64 //Il s'agit de la fonction permettant d'appeler les fonctions des événements de proximité. |
62 //Il s'agit de la fonction permettant d'appeler les fonctions des événements de proximité. |
77 private BendDetector bendDetector; |
75 private BendDetector bendDetector; |
78 //Détecteur de croisement de bras en X. |
76 //Détecteur de croisement de bras en X. |
79 private CrossDetector crossDetector; |
77 private CrossDetector crossDetector; |
80 //Détecteur de levé de genou. |
78 //Détecteur de levé de genou. |
81 private KneeUpDetector kneeUpDetector; |
79 private KneeUpDetector kneeUpDetector; |
|
80 //Détecteur de position correcte. |
|
81 private CorrectPosture correctPostureDetector; |
82 |
82 |
83 //Détecteur de swipes. |
83 //Détecteur de swipes. |
84 private SwipeDetector swipeDetector; |
84 private SwipeDetector swipeDetector; |
85 //Détecteur de pushes. |
85 //Détecteur de pushes. |
86 private PushDetector pushDetector; |
86 private PushDetector pushDetector; |
87 //Détecteur de jumps. |
87 //Détecteur de jumps. |
88 private JumpDetector jumpDetector; |
88 private JumpDetector jumpDetector; |
|
89 //Détecteur de falls. |
|
90 private FallDetector fallDetector; |
89 //Détecteur de waves. |
91 //Détecteur de waves. |
90 private WaveDetector waveDetector; |
92 private WaveDetector waveDetector; |
91 //Détecteur de cercles. |
93 //Détecteur de cercles. |
92 private CircleDetector circleDetector; |
94 private CircleDetector circleDetector; |
93 //Détecteur de proximité. |
95 //Détecteur de proximité. |
116 public static event SwipeHandler SwipeEvent; |
118 public static event SwipeHandler SwipeEvent; |
117 //L'événement push. |
119 //L'événement push. |
118 public static event PushHandler PushEvent; |
120 public static event PushHandler PushEvent; |
119 //L'événement jump. |
121 //L'événement jump. |
120 public static event JumpHandler JumpEvent; |
122 public static event JumpHandler JumpEvent; |
|
123 //L'événement fall. |
|
124 public static event FallHandler FallEvent; |
121 //L'événement wave. |
125 //L'événement wave. |
122 public static event WaveHandler WaveEvent; |
126 public static event WaveHandler WaveEvent; |
123 //L'événement circle. |
127 //L'événement circle. |
124 public static event CircleHandler CircleEvent; |
128 public static event CircleHandler CircleEvent; |
125 //L'événement l'utilisateur se déplace dans la zone de détection. |
129 //L'événement l'utilisateur se déplace dans la zone de détection. |
137 |
141 |
138 //On crée les détecteurs de postures. |
142 //On crée les détecteurs de postures. |
139 bendDetector = new BendDetector(debug); |
143 bendDetector = new BendDetector(debug); |
140 crossDetector = new CrossDetector(debug); |
144 crossDetector = new CrossDetector(debug); |
141 kneeUpDetector = new KneeUpDetector(debug); |
145 kneeUpDetector = new KneeUpDetector(debug); |
|
146 correctPostureDetector = new CorrectPosture(debug); |
142 |
147 |
143 //On crée les détecteurs de gestes. |
148 //On crée les détecteurs de gestes. |
144 swipeDetector = new SwipeDetector(debug); |
149 swipeDetector = new SwipeDetector(debug); |
145 pushDetector = new PushDetector(debug); |
150 pushDetector = new PushDetector(debug); |
146 jumpDetector = new JumpDetector(debug); |
151 jumpDetector = new JumpDetector(debug); |
|
152 fallDetector = new FallDetector(debug); |
147 waveDetector = new WaveDetector(debug); |
153 waveDetector = new WaveDetector(debug); |
148 circleDetector = new CircleDetector(debug); |
154 circleDetector = new CircleDetector(debug); |
149 //On crée le détecteur de proximité. |
155 //On crée le détecteur de proximité. |
150 userPositionDetector = new UserPositionDetector(debug.getMinDist(), debug.getMaxDist(), debug.getZeroPoint(), debug.getMinDistHands(), debug.getMaxDistHands()); |
156 userPositionDetector = new UserPositionDetector(debug.getMinDist(), debug.getMaxDist(), debug.getZeroPoint(), debug.getMinDistHands(), debug.getMaxDistHands()); |
151 |
157 |
164 //On écoute l'événement de clic sur le bouton on/off du debug. |
170 //On écoute l'événement de clic sur le bouton on/off du debug. |
165 //Car on lancera l'intitialisation/fermeture de la kinect. |
171 //Car on lancera l'intitialisation/fermeture de la kinect. |
166 debug.getSwitch().Click += new RoutedEventHandler(Switch_ClickInKinectMain); |
172 debug.getSwitch().Click += new RoutedEventHandler(Switch_ClickInKinectMain); |
167 debug.Loaded += new RoutedEventHandler(Window_LoadedInKinectMain); |
173 debug.Loaded += new RoutedEventHandler(Window_LoadedInKinectMain); |
168 debug.Closed += new EventHandler(Window_CloseInKinectMain); |
174 debug.Closed += new EventHandler(Window_CloseInKinectMain); |
169 debug.getQuitMenu().Click += new RoutedEventHandler(Quit_ClickInKinectMain); |
175 /*debug.getQuitMenu().Click += new RoutedEventHandler(Quit_ClickInKinectMain); |
170 debug.getParametersWindow().getModButton().Click += new RoutedEventHandler(updateParameters); |
176 debug.getParametersWindow().getModButton().Click += new RoutedEventHandler(updateParameters);*/ |
|
177 |
|
178 /*Console.WriteLine("DEBUG"); |
|
179 |
|
180 Console.WriteLine("searchMinDistance:" + debug.getMinDistHands()); |
|
181 Console.WriteLine("minDistance:" + debug.getMinDist()); |
|
182 Console.WriteLine("connexionHost:" + debug.getConnexionHost()); |
|
183 Console.WriteLine("timerElapsing:" + debug.getTimerElapsing()); |
|
184 Console.WriteLine("takenPoints:" + debug.getTakenPoints()); |
|
185 Console.WriteLine("directionChangeTresholdXY:" + debug.getDirectionChangeTresholdXY()); |
|
186 Console.WriteLine("connexionPort:" + debug.getConnexionPort()); |
|
187 Console.WriteLine("imagesToShow:" + debug.getImagesToShow()); |
|
188 Console.WriteLine("searchMaxDistance:" + debug.getMaxDistHands()); |
|
189 Console.WriteLine("maxDistance:" + debug.getMaxDist()); |
|
190 Console.WriteLine("zeroPoint:" + debug.getZeroPoint()); |
|
191 Console.WriteLine("directionChangeTresholdZ:" + debug.getDirectionChangeTresholdZ());*/ |
171 |
192 |
172 //On affiche la fenêtre de debug. |
193 //On affiche la fenêtre de debug. |
173 try |
194 try |
174 { |
195 { |
175 debug.ShowDialog(); |
196 debug.ShowDialog(); |
176 } |
197 } |
177 catch(Exception){ |
198 catch(Exception){ |
178 } |
199 } |
|
200 } |
|
201 |
|
202 /*public bool loadParameters() |
|
203 { |
|
204 try |
|
205 { |
|
206 string[] lines = System.IO.File.ReadAllLines(@"config.txt"); |
|
207 |
|
208 foreach (string line in lines) |
|
209 { |
|
210 Console.WriteLine(line); |
|
211 } |
|
212 |
|
213 /*minDistHands = Properties.Settings.Default.searchMinDistance; |
|
214 maxDistHands = Properties.Settings.Default.searchMaxDistance; |
|
215 minDist = Properties.Settings.Default.minDistance; |
|
216 maxDist = Properties.Settings.Default.maxDistance; |
|
217 zeroPoint = Properties.Settings.Default.zeroPoint; |
|
218 connexionHost = Properties.Settings.Default.connexionHost; |
|
219 connexionPort = Properties.Settings.Default.connexionPort; |
|
220 timerElapsing = Properties.Settings.Default.timerElapsing; |
|
221 imagesToShow = Properties.Settings.Default.imagesToShow; |
|
222 takenPoints = Properties.Settings.Default.takenPoints; |
|
223 directionChangeTresholdXY = Properties.Settings.Default.directionChangeTresholdXY; |
|
224 directionChangeTresholdZ = Properties.Settings.Default.directionChangeTresholdZ;*/ |
|
225 /*} |
|
226 catch (Exception) |
|
227 { |
|
228 return false; |
|
229 } |
|
230 |
|
231 if (maxDistHands <= 0f || minDistHands <= 0f || maxDistHands > maxDist || minDistHands > maxDist || |
|
232 minDistHands >= maxDistHands || zeroPoint < maxDistHands || minDistHands > minDist || |
|
233 zeroPoint >= maxDist || connexionPort < 0 || timerElapsing < 0 || imagesToShow < 1 || |
|
234 takenPoints <= 0 || directionChangeTresholdXY < 0 || directionChangeTresholdZ < 0) |
|
235 { |
|
236 ExceptionLbl.Content = rm.GetString("loadParametersIncorrect"); |
|
237 Console.WriteLine(ExceptionLbl.Content); |
|
238 return false; |
|
239 } |
|
240 return true; |
179 } |
241 } |
180 |
242 |
181 /* |
243 /* |
182 * Envoi les paramètres mis à jour dans les différents modules. |
244 * Envoi les paramètres mis à jour dans les différents modules. |
183 */ |
245 */ |
261 PushEvent += new PushHandler(pushListener.showAndSend); |
323 PushEvent += new PushHandler(pushListener.showAndSend); |
262 |
324 |
263 //Fonction appelée lorsque l'utilisateur effectue un Jump. |
325 //Fonction appelée lorsque l'utilisateur effectue un Jump. |
264 JumpListener jumpListener = new JumpListener(); |
326 JumpListener jumpListener = new JumpListener(); |
265 JumpEvent += new JumpHandler(jumpListener.showAndSend); |
327 JumpEvent += new JumpHandler(jumpListener.showAndSend); |
|
328 |
|
329 //Fonction appelée lorsque l'utilisateur effectue un Fall. |
|
330 FallListener fallListener = new FallListener(); |
|
331 FallEvent += new FallHandler(fallListener.showAndSend); |
266 |
332 |
267 //Fonction appelée lorsque l'utilisateur effectue un Wave. |
333 //Fonction appelée lorsque l'utilisateur effectue un Wave. |
268 WaveListener waveListener = new WaveListener(); |
334 WaveListener waveListener = new WaveListener(); |
269 WaveEvent += new WaveHandler(waveListener.showAndSend); |
335 WaveEvent += new WaveHandler(waveListener.showAndSend); |
270 |
336 |
463 joints.Insert((int)JointType.AnkleRight, ankleRight); |
529 joints.Insert((int)JointType.AnkleRight, ankleRight); |
464 joints.Insert((int)JointType.FootRight, footRight); |
530 joints.Insert((int)JointType.FootRight, footRight); |
465 GestureDetector.UpdateSkeletonHistory(joints); |
531 GestureDetector.UpdateSkeletonHistory(joints); |
466 PostureDetector.UpdateSkeletonState(joints); |
532 PostureDetector.UpdateSkeletonState(joints); |
467 |
533 |
|
534 if (!correctPostureDetector.CheckForCorrectPosture()) |
|
535 { |
|
536 debug.hideSkeleton(); |
|
537 modeManagement.DetectProximityBasedModes(0); |
|
538 //Console.WriteLine("NO-USER"); |
|
539 LeftHandQuitEventArgs leftHandQuitEvent = new LeftHandQuitEventArgs(server, debug); |
|
540 OnLeftHandQuitEvent(leftHandQuitEvent); |
|
541 RightHandQuitEventArgs rightHandQuitEvent = new RightHandQuitEventArgs(server, debug); |
|
542 OnRightHandQuitEvent(rightHandQuitEvent); |
|
543 |
|
544 return; |
|
545 } |
|
546 |
468 //Si la main gauche est dans le champ, on lance l'événement approprié. |
547 //Si la main gauche est dans le champ, on lance l'événement approprié. |
469 if (handLeft.Position.Z < debug.getMaxDistHands() && handLeft.Position.Z > debug.getMinDistHands()) |
548 if (handLeft.Position.Z < debug.getMaxDistHands() && handLeft.Position.Z > debug.getMinDistHands()) |
470 { |
549 { |
471 LeftHandTrackedEventArgs leftHandTrackedEvent = new LeftHandTrackedEventArgs(server, debug, handLeft, handLeft.Position.Z); |
550 LeftHandTrackedEventArgs leftHandTrackedEvent = new LeftHandTrackedEventArgs(server, debug, handLeft, handLeft.Position.Z); |
472 OnLeftHandTrackedEvent(leftHandTrackedEvent); |
551 OnLeftHandTrackedEvent(leftHandTrackedEvent); |
520 { |
599 { |
521 KneeUpEventArgs kneeUpEvent = new KneeUpEventArgs(server, debug); |
600 KneeUpEventArgs kneeUpEvent = new KneeUpEventArgs(server, debug); |
522 OnKneeUpEvent(kneeUpEvent); |
601 OnKneeUpEvent(kneeUpEvent); |
523 } |
602 } |
524 |
603 |
|
604 //Si l'utilisateur a fait un jump. |
|
605 if (jumpDetector.CheckForJump()) |
|
606 { |
|
607 JumpEventArgs jumpEvent = new JumpEventArgs(server, debug); |
|
608 OnJumpEvent(jumpEvent); |
|
609 } |
|
610 |
|
611 //Si l'utilisateur a fait un fall. |
|
612 if (fallDetector.CheckForFall()) |
|
613 { |
|
614 FallEventArgs fallEvent = new FallEventArgs(server, debug); |
|
615 OnFallEvent(fallEvent); |
|
616 } |
|
617 |
525 //Si l'utilisateur effectue un swipe left. |
618 //Si l'utilisateur effectue un swipe left. |
526 if (swipeDetector.CheckForSwipeLeft()) |
619 if (swipeDetector.CheckForSwipeLeft()) |
527 { |
620 { |
528 SwipeEventArgs swipeEvent = new SwipeEventArgs(server, debug, SwipeDetector.Direction.LEFT); |
621 SwipeEventArgs swipeEvent = new SwipeEventArgs(server, debug, SwipeDetector.Direction.LEFT); |
529 OnSwipeEvent(swipeEvent); |
622 OnSwipeEvent(swipeEvent); |
566 float proximity = userPositionDetector.CalcProximity(first.Position.Z); |
659 float proximity = userPositionDetector.CalcProximity(first.Position.Z); |
567 int numberOfImages = userPositionDetector.ImagesToShow(proximity, debug.getImagesToShow()); |
660 int numberOfImages = userPositionDetector.ImagesToShow(proximity, debug.getImagesToShow()); |
568 |
661 |
569 modeManagement.DetectProximityBasedModes(proximity); |
662 modeManagement.DetectProximityBasedModes(proximity); |
570 |
663 |
571 if (proximity > 0f) |
664 if (proximity >= 10f) |
572 { |
665 { |
573 UserPositionEventArgs userPositionEvent = new UserPositionEventArgs(server, debug, proximity, numberOfImages); |
666 UserPositionEventArgs userPositionEvent = new UserPositionEventArgs(server, debug, proximity, numberOfImages); |
574 OnUserPositionEvent(userPositionEvent); |
667 OnUserPositionEvent(userPositionEvent); |
575 } |
668 } |
576 else if(proximity < 10f) |
669 else if(proximity < 10f) |
696 if (JumpEvent != null) |
789 if (JumpEvent != null) |
697 JumpEvent(new object(), e); |
790 JumpEvent(new object(), e); |
698 } |
791 } |
699 |
792 |
700 /* |
793 /* |
|
794 * Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un fall. |
|
795 */ |
|
796 public static void OnFallEvent(FallEventArgs e) |
|
797 { |
|
798 if (FallEvent != null) |
|
799 FallEvent(new object(), e); |
|
800 } |
|
801 |
|
802 /* |
701 * Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un cercle. |
803 * Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un cercle. |
702 */ |
804 */ |
703 public static void OnCircleEvent(CircleEventArgs e) |
805 public static void OnCircleEvent(CircleEventArgs e) |
704 { |
806 { |
705 if (CircleEvent != null) |
807 if (CircleEvent != null) |