middleware/Communication/Server.cs
changeset 29 fcf435874395
parent 28 9ccef81f02ab
child 41 d2f735d7763f
equal deleted inserted replaced
28:9ccef81f02ab 29:fcf435874395
    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 }