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