middleware/src/Tracking/KinectMain.cs
changeset 6 93dfb08dcc97
parent 5 d40f84d77db4
child 7 8a21bec5d45f
--- a/middleware/src/Tracking/KinectMain.cs	Mon Mar 19 10:21:56 2012 +0100
+++ b/middleware/src/Tracking/KinectMain.cs	Mon Mar 19 18:24:59 2012 +0100
@@ -56,6 +56,8 @@
     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 de proximité.
+    public delegate void UserPositionHandler(object o, UserPositionEventArgs e);
 
     public class KinectMain
     {
@@ -74,10 +76,15 @@
         private PushDetector pushDetector;
         //Détecteur de jumps.
         private JumpDetector jumpDetector;
+        //Détecteur de proximité.
+        private UserPositionDetector userPositionDetector;
 
         //Distances min/max délimitant le champ de recherche.
         private float minDistHands;
         private float maxDistHands;
+        private float minDist;
+        private float maxDist;
+        private float zeroPoint;
 
         //Temps de rafraichissement pour le timer (Détection de gesture dans le serveur TUIO).
         private int timerElapsing;
@@ -96,6 +103,8 @@
         public static event PushHandler PushEvent;
         //L'événement jump.
         public static event JumpHandler JumpEvent;
+        //L'événement l'utilisateur se déplace dans la zone de détection.
+        public static event UserPositionHandler UserPositionEvent;
 
         private string connexionHost;
         private int connexionPort;
@@ -112,24 +121,29 @@
             //On crée la fenêtre de debug.
             debug = new Debug.DebugWindow(this);
             
-            //On crée les détecteurs de gestes.
-            swipeDetector = new SwipeDetector(debug);
-            pushDetector = new PushDetector(debug);
-            jumpDetector = new JumpDetector(debug);
-
             //On tente de charger les paramètres du fichier params.ini.
             //Si on n'y arrive pas, on affiche une erreur et on charge les paramètres par défaut.
             if (!loadParameters())
             {
                 debug.ExceptionLbl.Content = rm.GetString("loadParametersFail");
                 //Distances de détection des mains par défaut pour la recherche (ici de 1m à 2m de la Kinect).
-                minDistHands = (float)1.0;
-                maxDistHands = (float)1.5;
+                minDistHands = 1.0f;
+                maxDistHands = 1.5f;
+                minDist = 1.0f;
+                maxDist = 4.0f;
+                zeroPoint = 1.7f;
                 connexionHost = "127.0.0.1";
                 connexionPort = 80;
                 timerElapsing = 1000;
             }
 
+            //On crée les détecteurs de gestes.
+            swipeDetector = new SwipeDetector(debug);
+            pushDetector = new PushDetector(debug);
+            jumpDetector = new JumpDetector(debug);
+            //On crée le détecteur de proximité.
+            userPositionDetector = new UserPositionDetector(debug, minDist, maxDist, zeroPoint, minDistHands, maxDistHands);
+
             //On affiche la fenêtre de debug.
             try
             {
@@ -211,6 +225,10 @@
             JumpListener jumpListener = new JumpListener();
             JumpEvent += new JumpHandler(jumpListener.ShowOnScreen);
 
+            //Fonction appelée lorsque l'utilisateur se déplace dans la zone de détection.
+            UserPositionListener userPositionListener = new UserPositionListener();
+            UserPositionEvent += new UserPositionHandler(userPositionListener.ShowOnScreen);
+
             //On connecte le serveur à l'adresse locale sur le port 80.
             server = new Server(connexionHost, connexionPort, timerElapsing, debug);
         }
@@ -352,12 +370,6 @@
                 joints.Insert((int)JointType.AnkleRight, ankleRight);
                 joints.Insert((int)JointType.FootRight, footRight);
                 GestureDetector.UpdateSkeletonHistory(joints);
-                
-                //On obtient sa distance à la Kinect.
-                float distance = first.Position.Z;
-
-                //On affiche la distance dans le debug.
-                debug.showDistance(distance);
 
                 //Si la main gauche est dans le champ, on lance l'événement approprié.
                 if (handLeft.Position.Z < maxDistHands && handLeft.Position.Z > minDistHands)
@@ -420,6 +432,41 @@
                     OnJumpEvent(jumpEvent);
                 }*/
 
+                //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)
+                {
+                    float proximity = userPositionDetector.CalcProximity(first.Position.Z);
+                    /*if (proximity > 0f && proximity < 25f)
+                    {
+                        Console.Out.WriteLine("1/4");
+
+                    }
+                    else if (proximity > 25f && proximity < 50f)
+                    {
+                        Console.Out.WriteLine("1/2");
+
+                    }
+                    else if (proximity > 50f && proximity < 75f)
+                    {
+                        Console.Out.WriteLine("3/4");
+
+                    }
+                    else if (proximity == 100f)
+                    {
+                        Console.Out.WriteLine("TRUE");
+
+                    }*/
+
+                    if (proximity > 0f)
+                    {
+                        UserPositionEventArgs userPositionEvent = new UserPositionEventArgs(debug, server, proximity);
+                        OnUserPositionEvent(userPositionEvent);
+                    }
+                    else
+                        Console.Out.WriteLine("FAIL");
+                }
+
                 //Dessine le squelette dans le debug.
                 debug.drawJoints(first.Joints, first);
                 debug.showSkeleton(hipCenter, spine, shoulderCenter, head, shoulderLeft, elbowLeft, wristLeft, handLeft, shoulderRight, elbowRight, wristRight, handRight, hipLeft, kneeLeft, ankleLeft, footLeft, hipRight, kneeRight, ankleRight, footRight);
@@ -498,6 +545,16 @@
         }
 
         /*
+        *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur se déplace
+         *  dans la zone de détection.
+        */
+        public static void OnUserPositionEvent(UserPositionEventArgs e)
+        {
+            if (UserPositionEvent != null)
+                UserPositionEvent(new object(), e);
+        }
+
+        /*
         *  Méthode de chargement des paramètres (position du champ de recherche...).
         */
         public bool loadParameters()
@@ -506,6 +563,9 @@
             {
                 minDistHands = (float)double.Parse(ConfigurationManager.AppSettings["searchMinDistance"]);
                 maxDistHands = (float)double.Parse(ConfigurationManager.AppSettings["searchMaxDistance"]);
+                minDist = (float)double.Parse(ConfigurationManager.AppSettings["minDistance"]);
+                maxDist = (float)double.Parse(ConfigurationManager.AppSettings["maxDistance"]);
+                zeroPoint = (float)double.Parse(ConfigurationManager.AppSettings["zeroPoint"]);
                 connexionHost = ConfigurationManager.AppSettings["connexionHost"];
                 connexionPort = int.Parse(ConfigurationManager.AppSettings["connexionPort"]);
                 timerElapsing = int.Parse(ConfigurationManager.AppSettings["timerElapsing"]);
@@ -514,8 +574,10 @@
             {
                 return false;
             }
-            
-            if (maxDistHands <= 0 || minDistHands <= 0 || maxDistHands > 4 || minDistHands > 4 || minDistHands >= maxDistHands)
+
+            if (maxDistHands <= 0f || minDistHands <= 0f || maxDistHands > maxDist || minDistHands > maxDist ||
+                minDistHands >= maxDistHands || zeroPoint < maxDistHands || minDistHands < minDist ||
+                zeroPoint >= maxDist || connexionPort < 0 || timerElapsing < 0)
             {
                 debug.ExceptionLbl.Content = rm.GetString("loadParametersIncorrect");
                 return false;
@@ -528,6 +590,8 @@
          */
         public void updateParameters()
         {
+            userPositionDetector.setParams(minDist, maxDist, minDistHands, maxDistHands, zeroPoint);
+
             //On récupère la config.
             Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
             //On met à jour.
@@ -535,6 +599,12 @@
             config.AppSettings.Settings.Add("searchMinDistance", minDistHands.ToString());
             config.AppSettings.Settings.Remove("searchMaxDistance");
             config.AppSettings.Settings.Add("searchMaxDistance", maxDistHands.ToString());
+            config.AppSettings.Settings.Remove("minDistance");
+            config.AppSettings.Settings.Add("minDistance", minDist.ToString());
+            config.AppSettings.Settings.Remove("maxDistance");
+            config.AppSettings.Settings.Add("maxDistance", maxDist.ToString());
+            config.AppSettings.Settings.Remove("zeroPoint");
+            config.AppSettings.Settings.Add("zeroPoint", zeroPoint.ToString());
             config.AppSettings.Settings.Remove("connexionHost");
             config.AppSettings.Settings.Add("connexionHost", connexionHost);
             config.AppSettings.Settings.Remove("connexionPort");