middleware/src/MainModule/KinectMain.cs
changeset 17 fda26bfcabef
parent 16 a9ebacd6c089
child 27 6c08d4d7219e
--- a/middleware/src/MainModule/KinectMain.cs	Wed Apr 04 10:51:21 2012 +0200
+++ b/middleware/src/MainModule/KinectMain.cs	Thu Apr 05 15:54:44 2012 +0200
@@ -30,10 +30,11 @@
 using Microsoft.Kinect;
 using Trakers.Communication;
 using Trakers.MainModule.Events;
-using Trakers.MainModule.Gestures;
-using Trakers.MainModule.Search;
+using Trakers.Tracking.Search;
 using Trakers.Debug;
 using System.Windows;
+using Trakers.Tracking.Gestures;
+using Trakers.Tracking.Postures;
 
 namespace Trakers.MainModule
 {
@@ -42,12 +43,24 @@
     public delegate void RightHandTrackedHandler(object o, RightHandTrackedEventArgs e);
     public delegate void LeftHandQuitHandler(object o, LeftHandQuitEventArgs e);
     public delegate void RightHandQuitHandler(object o, RightHandQuitEventArgs e);
+
+    //Il s'agit de la fonction permettant d'appeler les fonctions des événements Bend.
+    public delegate void BendHandler(object o, BendEventArgs e);
+    //Il s'agit de la fonction permettant d'appeler les fonctions des événements Cross.
+    public delegate void CrossHandler(object o, CrossEventArgs e);
+    //Il s'agit de la fonction permettant d'appeler les fonctions des événements KneeUp.
+    public delegate void KneeUpHandler(object o, KneeUpEventArgs e);
+
     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Swipe left/right/up/down.
     public delegate void SwipeHandler(object o, SwipeEventArgs e);
     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Push/Pull.
     public delegate void PushHandler(object o, PushEventArgs e);
     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Jump.
     public delegate void JumpHandler(object o, JumpEventArgs e);
+    //Il s'agit de la fonction permettant d'appeler les fonctions des événements Wave.
+    public delegate void WaveHandler(object o, WaveEventArgs e);
+    //Il s'agit de la fonction permettant d'appeler les fonctions des événements Circle.
+    public delegate void CircleHandler(object o, CircleEventArgs e);
     //Il s'agit de la fonction permettant d'appeler les fonctions des événements de proximité.
     public delegate void UserPositionHandler(object o, UserPositionEventArgs e);
 
@@ -55,19 +68,28 @@
     {
         //Fenêtre de debug.
         private DebugWindow debug;
-        //Fenêtre de paramètres.
-        private DebugParameters parameters;
         //Squelettes (Il y en a 6 par défaut).
         private Skeleton[] skeletons;
         //Caméra infrarouge (sensor) de la Kinect.
         private KinectSensor kinectSensor;
 
+        //Détecteur de penchés.
+        private BendDetector bendDetector;
+        //Détecteur de croisement de bras en X.
+        private CrossDetector crossDetector;
+        //Détecteur de levé de genou.
+        private KneeUpDetector kneeUpDetector;
+
         //Détecteur de swipes.
         private SwipeDetector swipeDetector;
         //Détecteur de pushes.
         private PushDetector pushDetector;
         //Détecteur de jumps.
         private JumpDetector jumpDetector;
+        //Détecteur de waves.
+        private WaveDetector waveDetector;
+        //Détecteur de cercles.
+        private CircleDetector circleDetector;
         //Détecteur de proximité.
         private UserPositionDetector userPositionDetector;
 
@@ -82,12 +104,24 @@
         public static event RightHandTrackedHandler RightHandTrackedEvent;
         public static event LeftHandQuitHandler LeftHandQuitEvent;
         public static event RightHandQuitHandler RightHandQuitEvent;
+
+        //L'événement bend.
+        public static event BendHandler BendEvent;
+        //L'événement cross.
+        public static event CrossHandler CrossEvent;
+        //L'événement kneeUp.
+        public static event KneeUpHandler KneeUpEvent;
+
         //L'événement swipe.
         public static event SwipeHandler SwipeEvent;
         //L'événement push.
         public static event PushHandler PushEvent;
         //L'événement jump.
         public static event JumpHandler JumpEvent;
+        //L'événement wave.
+        public static event WaveHandler WaveEvent;
+        //L'événement circle.
+        public static event CircleHandler CircleEvent;
         //L'événement l'utilisateur se déplace dans la zone de détection.
         public static event UserPositionHandler UserPositionEvent;
 
@@ -101,10 +135,17 @@
             //On crée la fenêtre de debug.
             debug = new DebugWindow();
 
+            //On crée les détecteurs de postures.
+            bendDetector = new BendDetector(debug);
+            crossDetector = new CrossDetector(debug);
+            kneeUpDetector = new KneeUpDetector(debug);
+
             //On crée les détecteurs de gestes.
-            swipeDetector = new SwipeDetector();
-            pushDetector = new PushDetector();
-            jumpDetector = new JumpDetector();
+            swipeDetector = new SwipeDetector(debug);
+            pushDetector = new PushDetector(debug);
+            jumpDetector = new JumpDetector(debug);
+            waveDetector = new WaveDetector(debug);
+            circleDetector = new CircleDetector(debug);
             //On crée le détecteur de proximité.
             userPositionDetector = new UserPositionDetector(debug.getMinDist(), debug.getMaxDist(), debug.getZeroPoint(), debug.getMinDistHands(), debug.getMaxDistHands());
 
@@ -199,6 +240,18 @@
             RightHandQuitListener rightHandQuitListener = new RightHandQuitListener();
             RightHandQuitEvent += new RightHandQuitHandler(rightHandQuitListener.showAndSend);
 
+            //Fonction appelée lorsque l'utilisateur se penche.
+            BendListener bendListener = new BendListener();
+            BendEvent += new BendHandler(bendListener.showAndSend);
+
+            //Fonction appelée lorsque l'utilisateur croise les bras en X.
+            CrossListener crossListener = new CrossListener();
+            CrossEvent += new CrossHandler(crossListener.showAndSend);
+
+            //Fonction appelée lorsque l'utilisateur lève le genou.
+            KneeUpListener kneeUpListener = new KneeUpListener();
+            KneeUpEvent += new KneeUpHandler(kneeUpListener.showAndSend);
+
             //Fonction appelée lorsque l'utilisateur effectue un Swipe right/left/up/down.
             SwipeListener swipeListener = new SwipeListener();
             SwipeEvent += new SwipeHandler(swipeListener.showAndSend);
@@ -211,6 +264,14 @@
             JumpListener jumpListener = new JumpListener();
             JumpEvent += new JumpHandler(jumpListener.showAndSend);
 
+            //Fonction appelée lorsque l'utilisateur effectue un Wave.
+            WaveListener waveListener = new WaveListener();
+            WaveEvent += new WaveHandler(waveListener.showAndSend);
+
+            //Fonction appelée lorsque l'utilisateur effectue un Circle.
+            CircleListener circleListener = new CircleListener();
+            CircleEvent += new CircleHandler(circleListener.showAndSend);
+
             //Fonction appelée lorsque l'utilisateur se déplace dans la zone de détection.
             UserPositionListener userPositionListener = new UserPositionListener();
             UserPositionEvent += new UserPositionHandler(userPositionListener.showAndSend);
@@ -402,12 +463,18 @@
                 joints.Insert((int)JointType.AnkleRight, ankleRight);
                 joints.Insert((int)JointType.FootRight, footRight);
                 GestureDetector.UpdateSkeletonHistory(joints);
+                PostureDetector.UpdateSkeletonState(joints);
 
                 //Si la main gauche est dans le champ, on lance l'événement approprié.
                 if (handLeft.Position.Z < debug.getMaxDistHands() && handLeft.Position.Z > debug.getMinDistHands())
                 {
                     LeftHandTrackedEventArgs leftHandTrackedEvent = new LeftHandTrackedEventArgs(server, debug, handLeft, handLeft.Position.Z);
                     OnLeftHandTrackedEvent(leftHandTrackedEvent);
+                    /*if (circleDetector.CheckForLeftCircle())
+                    {
+                        CircleEventArgs circleEvent = new CircleEventArgs(server, debug);
+                        OnCircleEvent(circleEvent);
+                    }*/
                 }
                 //Si la main gauche quitte le champ, on lance l'événement approprié.
                 else
@@ -420,6 +487,12 @@
                 {
                     RightHandTrackedEventArgs rightHandTrackedEvent = new RightHandTrackedEventArgs(server, debug, handRight, handRight.Position.Z);
                     OnRightHandTrackedEvent(rightHandTrackedEvent);
+                    /*if (circleDetector.CheckForRightCircle())
+                    {
+                        CircleEventArgs circleEvent = new CircleEventArgs(server, debug);
+                        OnCircleEvent(circleEvent);
+                        //Console.Out.WriteLine("CIRCLE");
+                    }*/
                 }
                 //Si la main droite quitte le champ, on lance l'événement approprié.
                 else
@@ -428,6 +501,27 @@
                     OnRightHandQuitEvent(rightHandQuitEvent);
                 }
 
+                //Si l'utilisateur s'est penché.
+                if (bendDetector.CheckForBend())
+                {
+                    BendEventArgs bendEvent = new BendEventArgs(server, debug);
+                    OnBendEvent(bendEvent);
+                }
+
+                //Si l'utilisateur a croisé les bras en X.
+                if (crossDetector.CheckForCross())
+                {
+                    CrossEventArgs crossEvent = new CrossEventArgs(server, debug);
+                    OnCrossEvent(crossEvent);
+                }
+
+                //Si l'utilisateur a levé le genou.
+                if (kneeUpDetector.CheckForKneeUp())
+                {
+                    KneeUpEventArgs kneeUpEvent = new KneeUpEventArgs(server, debug);
+                    OnKneeUpEvent(kneeUpEvent);
+                }
+
                 //Si l'utilisateur effectue un swipe left.
                 if (swipeDetector.CheckForSwipeLeft())
                 {
@@ -457,6 +551,14 @@
                     OnPushEvent(pushEvent);
                 }
 
+                //Si l'utilisateur effectue un wave.
+                if (waveDetector.CheckForWave())
+                {
+                    WaveEventArgs waveEvent = new WaveEventArgs(server, debug);
+                    OnWaveEvent(waveEvent);
+                    Console.Out.WriteLine("WAVE");
+                }
+
                 //Si l'utilisateur se déplace dans la zone de détection.
                 //On traite le problème en plusieurs limites, on discrétise la zone.
                 if (first.TrackingState == SkeletonTrackingState.Tracked)
@@ -542,6 +644,33 @@
         }
 
         /*
+        *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur se penche.
+        */
+        public static void OnBendEvent(BendEventArgs e)
+        {
+            if (BendEvent != null)
+                BendEvent(new object(), e);
+        }
+
+        /*
+        *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur croise les bras en X.
+        */
+        public static void OnCrossEvent(CrossEventArgs e)
+        {
+            if (CrossEvent != null)
+                CrossEvent(new object(), e);
+        }
+
+        /*
+        *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur lève le genou.
+        */
+        public static void OnKneeUpEvent(KneeUpEventArgs e)
+        {
+            if (KneeUpEvent != null)
+                KneeUpEvent(new object(), e);
+        }
+
+        /*
         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un swipe right.
         */
         public static void OnSwipeEvent(SwipeEventArgs e)
@@ -569,6 +698,24 @@
         }
 
         /*
+        *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un cercle.
+        */
+        public static void OnCircleEvent(CircleEventArgs e)
+        {
+            if (CircleEvent != null)
+                CircleEvent(new object(), e);
+        }
+
+        /*
+        *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un wave.
+        */
+        public static void OnWaveEvent(WaveEventArgs e)
+        {
+            if (WaveEvent != null)
+                WaveEvent(new object(), e);
+        }
+
+        /*
         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur se déplace
          *  dans la zone de détection.
         */