middleware/Communication/WSServer.cs
changeset 37 37ebedd84755
parent 29 fcf435874395
child 41 d2f735d7763f
equal deleted inserted replaced
36:25e71ada2a6d 37:37ebedd84755
    41         List<IWebSocketConnection> allSockets;
    41         List<IWebSocketConnection> allSockets;
    42 
    42 
    43         //Permet de savoir si un curseur pour la main gauche/droite a été créé.
    43         //Permet de savoir si un curseur pour la main gauche/droite a été créé.
    44         private bool leftHandCursorCreated;
    44         private bool leftHandCursorCreated;
    45         private bool rightHandCursorCreated;
    45         private bool rightHandCursorCreated;
    46         private bool messageCreated;
    46         private bool gesturesMessageCreated, modeMessageCreated;
    47         private bool gestureLocked, modLocked;
    47         private bool gestureLocked, modLocked;
    48         //Intervalle minimum entre les gestures.
    48         //Intervalle minimum entre les gestures.
    49         private int timerElapsing;
    49         private int timerElapsing;
    50         //Timer.
    50         //Timers.
    51         private System.Timers.Timer _timer;
    51         private System.Timers.Timer _gesturesTimer;
       
    52         private System.Timers.Timer _userPositionTimer;
    52         //Dernier code envoyé.
    53         //Dernier code envoyé.
    53         private String lastCode;
    54         private String lastCode;
    54         //Messages envoyés en WS.
    55         //Messages envoyés en WS.
    55         private String rightHandMessage, leftHandMessage, gestureMessage;
    56         private String rightHandMessage, leftHandMessage, gesturesMessage, modeMessage;
    56         //Messages précédents
    57         //Messages précédents
    57         private String prevRightHandMessage, prevLeftHandMessage, prevGestureMessage;
    58         private String prevRightHandMessage, prevLeftHandMessage, prevGestureMessage, prevModeMessage;
    58 
    59 
    59         /*
    60         /*
    60         * Constructeur : On initialise le serveur avec une adresse et un port, au début les curseurs
    61         * 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         * 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         * s'il reçoit des notifications.
    68             server = new WebSocketServer(port, "ws://" + host + ":" + port);
    69             server = new WebSocketServer(port, "ws://" + host + ":" + port);
    69 
    70 
    70             //Au départ, aucune main n'est dans le champ de recherche et aucune gesture n'est détectée.
    71             //Au départ, aucune main n'est dans le champ de recherche et aucune gesture n'est détectée.
    71             leftHandCursorCreated = false;
    72             leftHandCursorCreated = false;
    72             rightHandCursorCreated = false;
    73             rightHandCursorCreated = false;
    73             messageCreated = false;
    74             gesturesMessageCreated = false;
       
    75             modeMessageCreated = false;
    74             gestureLocked = false;
    76             gestureLocked = false;
    75             modLocked = false;
    77             modLocked = false;
    76             lastCode = "";
    78             lastCode = "";
    77 
    79 
    78             timerElapsing = _timerElapsing;
    80             timerElapsing = 500;// _timerElapsing;
    79 
    81 
    80             rightHandMessage = leftHandMessage = gestureMessage = "";
    82             rightHandMessage = leftHandMessage = gesturesMessage = modeMessage = "";
    81 
    83 
    82             //On démarre le serveur WebSocket.
    84             //On démarre le serveur WebSocket.
    83             server.Start(socket =>
    85             server.Start(socket =>
    84             {
    86             {
    85                 socket.OnOpen = () =>
    87                 socket.OnOpen = () =>
   101 
   103 
   102             //On initialise le threadPool (appelé toutes les N ms).
   104             //On initialise le threadPool (appelé toutes les N ms).
   103             ThreadPool.QueueUserWorkItem(ThreadPoolCallback);
   105             ThreadPool.QueueUserWorkItem(ThreadPoolCallback);
   104 
   106 
   105             //On instancie le timer à N ms.
   107             //On instancie le timer à N ms.
   106             _timer = new System.Timers.Timer(timerElapsing);
   108             _gesturesTimer = new System.Timers.Timer(timerElapsing);
       
   109             _userPositionTimer = new System.Timers.Timer(timerElapsing/5);
   107             //Dès que le timer est expiré, on appelle _timer_Elapsed.
   110             //Dès que le timer est expiré, on appelle _timer_Elapsed.
   108             _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
   111             _gesturesTimer.Elapsed += new ElapsedEventHandler(_gesturesTimer_Elapsed);
       
   112             _userPositionTimer.Elapsed += new ElapsedEventHandler(_userPositionTimer_Elapsed);
   109 
   113 
   110             /*var input = Console.ReadLine();
   114             /*var input = Console.ReadLine();
   111             while (input != "exit")
   115             while (input != "exit")
   112             {
   116             {
   113                 foreach (var socket in allSockets.ToList())
   117                 foreach (var socket in allSockets.ToList())
   119         }
   123         }
   120 
   124 
   121         /*
   125         /*
   122          * Méthode appelée à l'expiration du timer pour les gestures et modes.
   126          * Méthode appelée à l'expiration du timer pour les gestures et modes.
   123          */
   127          */
   124         public void _timer_Elapsed(object sender, ElapsedEventArgs e)
   128         public void _gesturesTimer_Elapsed(object sender, ElapsedEventArgs e)
   125         {
   129         {
   126             //On débloque la détection de gesture.
   130             //On débloque la détection de gesture.
   127             gestureLocked = false;
   131             gestureLocked = false;
   128             //On débloque la notification de nouveau mode.
   132             //On débloque la notification de nouveau mode.
       
   133             //modLocked = false;
       
   134             lastCode = "";
       
   135             //On arrête le timer.
       
   136             _gesturesTimer.Stop();
       
   137         }
       
   138 
       
   139         /*
       
   140          * Méthode appelée à l'expiration du timer pour les positions d'utilisateur.
       
   141          */
       
   142         public void _userPositionTimer_Elapsed(object sender, ElapsedEventArgs e)
       
   143         {
       
   144             //On débloque la détection de gesture.
       
   145             //gestureLocked = false;
       
   146             //On débloque la notification de nouveau mode.
   129             modLocked = false;
   147             modLocked = false;
       
   148             lastCode = "";
   130             //On arrête le timer.
   149             //On arrête le timer.
   131             _timer.Stop();
   150             _userPositionTimer.Stop();
   132         }
   151         }
   133 
   152 
   134         /*
   153         /*
   135         * Méthode appelée lors d'une notification de type : main gauche entrée dans le champ.
   154         * Méthode appelée lors d'une notification de type : main gauche entrée dans le champ.
   136         */
   155         */
   179         * Méthode appelée lorsqu'une gesture a été détectée et que l'événement approprié a été lancé.
   198         * Méthode appelée lorsqu'une gesture a été détectée et que l'événement approprié a été lancé.
   180         */
   199         */
   181         public void GesturePerformed(String code)
   200         public void GesturePerformed(String code)
   182         {
   201         {
   183             //Si le code vient d'être envoyé, on passe.
   202             //Si le code vient d'être envoyé, on passe.
   184             if (lastCode.Equals(code))
   203             /*if (lastCode.Equals(code))
   185                 return;
   204                 return;
   186             lastCode = code;
   205             lastCode = code;*/
   187             //Si une gesture a été effectuée, on bloque un certain temps.
   206             //Si une gesture a été effectuée, on bloque un certain temps.
   188             if (!gestureLocked)
   207             if (!gestureLocked)
   189             {
   208             {
   190                 gestureLocked = true;
   209                 gestureLocked = true;
   191 
   210 
   192                 //On crée un message contenant le code à envoyer.
   211                 //On crée un message contenant le code à envoyer.
   193                 if (!messageCreated)
   212                 //if (!gesturesMessageCreated)
   194                 {
   213                 //{
   195                     messageCreated = true;
   214                     gesturesMessageCreated = true;
   196                     gestureMessage = "2-" + code;
   215                     gesturesMessage = "2-" + code;
       
   216 
       
   217                     //Console.WriteLine(gesturesMessage);
       
   218                     
       
   219                     foreach (var socket in allSockets.ToList())
       
   220                     {
       
   221                         socket.Send(gesturesMessage);
       
   222                     }
       
   223 
   197                     //On démarre le timer.
   224                     //On démarre le timer.
   198                     _timer.Start();
   225                     _gesturesTimer.Start();
   199                 }
   226 
       
   227                     //Console.WriteLine(gestureMessage);
       
   228                 //}
   200             }
   229             }
   201         }
   230         }
   202 
   231 
   203         /*
   232         /*
   204         * Méthode appelée lorsqu'on doit entrer dans un autre mode.
   233         * Méthode appelée lorsqu'on doit entrer dans un autre mode.
   205         */
   234         */
   206         public void ModeNotification(String code)
   235         public void ModeNotification(String code)
   207         {
   236         {
   208             //Si le code vient d'être envoyé, on passe.
   237             //Si le code vient d'être envoyé, on passe.
   209             if (lastCode.Equals(code))
   238             /*if (lastCode.Equals(code))
   210                 return;
   239                 return;
   211             lastCode = code;
   240             lastCode = code;*/
   212             //Si on a été notifié.
   241             //Si on a été notifié.
   213             if (!modLocked)
   242             if (!modLocked)
   214             {
   243             {
   215                 modLocked = true;
   244                 modLocked = true;
   216 
   245 
   217                 //On crée un message contenant le code à envoyer.
   246                 //On crée un message contenant le code à envoyer.
   218                 if (!messageCreated)
   247                 //if (!modeMessageCreated)
   219                 {
   248                 //{
   220                     messageCreated = true;
   249                     modeMessageCreated = true;
   221                     gestureMessage = "2-" + code;
   250                     modeMessage = "2-" + code;
   222                     //On démarre le timer.
   251                     //On démarre le timer.
   223                     _timer.Start();
   252 
   224                 }
   253                     foreach (var socket in allSockets.ToList())
       
   254                     {
       
   255                         socket.Send(modeMessage);
       
   256                     }
       
   257                     _userPositionTimer.Start();
       
   258 
       
   259                     //Console.WriteLine(modeMessage);
       
   260                 //}
   225             }
   261             }
   226         }
   262         }
   227 
   263 
   228         /*
   264         /*
   229         * Méthode de callback vérifiant toutes les 25 ms les nouvelles notifications.
   265         * Méthode de callback vérifiant toutes les 25 ms les nouvelles notifications.
   232         */
   268         */
   233         private void ThreadPoolCallback(Object threadContext)
   269         private void ThreadPoolCallback(Object threadContext)
   234         {
   270         {
   235             while (true)
   271             while (true)
   236             {
   272             {
   237                 //S'il existe un message.
   273                 /*//S'il existe un message de gesture.
   238                 if (gestureMessage != null && !gestureMessage.Equals("") && !gestureMessage.Equals(prevGestureMessage))
   274                 if (gesturesMessage != null && !gesturesMessage.Equals(""))// && !gesturesMessage.Equals(prevGestureMessage))
   239                 {
   275                 {
   240                     //On l'envoie au client (au host et au port spécifiés dans le constructeur).
   276                     //On l'envoie au client (au host et au port spécifiés dans le constructeur).
   241                     foreach (var socket in allSockets.ToList())
   277                     foreach (var socket in allSockets.ToList())
   242                     {
   278                     {
   243                         socket.Send(gestureMessage);
   279                         socket.Send(gesturesMessage);
   244                         prevGestureMessage = gestureMessage;
   280                         //prevGestureMessage = gesturesMessage;
   245                     }
   281                     }
   246                 }
   282                 }
       
   283 
       
   284                 //S'il existe un message de mode.
       
   285                 if (modeMessage != null && !modeMessage.Equals(""))// && !modeMessage.Equals(prevModeMessage))
       
   286                 {
       
   287                     //On l'envoie au client (au host et au port spécifiés dans le constructeur).
       
   288                     foreach (var socket in allSockets.ToList())
       
   289                     {
       
   290                         socket.Send(modeMessage);
       
   291                         //prevModeMessage = modeMessage;
       
   292                     }
       
   293                 }*/
       
   294 
   247                 //Si la main gauche est détectée.
   295                 //Si la main gauche est détectée.
   248                 if (leftHandMessage != null && !leftHandMessage.Equals("") && !leftHandMessage.Equals(prevLeftHandMessage))
   296                 if (leftHandMessage != null && !leftHandMessage.Equals("") && !leftHandMessage.Equals(prevLeftHandMessage))
   249                 {
   297                 {
   250                     //On l'envoie au client (au host et au port spécifiés dans le constructeur).
   298                     //On l'envoie au client (au host et au port spécifiés dans le constructeur).
   251                     foreach (var socket in allSockets.ToList())
   299                     foreach (var socket in allSockets.ToList())
   267                 
   315                 
   268                 //On attend 25 ms.
   316                 //On attend 25 ms.
   269                 Thread.Sleep(25);
   317                 Thread.Sleep(25);
   270 
   318 
   271                 //Si une gesture a été effectuée et que le délai d'attente est expiré.
   319                 //Si une gesture a été effectuée et que le délai d'attente est expiré.
   272                 if (messageCreated && !gestureLocked && !modLocked)
   320                 if (gesturesMessageCreated && !gestureLocked)
   273                 {
   321                 {
   274                     //On débloque la détection de gesture et on supprime l'objet envoyant les messages OSC de gesture.
   322                     //On débloque la détection de gesture et on supprime l'objet envoyant les messages OSC de gesture.
   275                     messageCreated = false;
   323                     gesturesMessageCreated = false;
   276                     gestureMessage = "";
   324                     gesturesMessage = "";
       
   325                 }
       
   326 
       
   327                 //Si un mode a été effectuée et que le délai d'attente est expiré.
       
   328                 if (modeMessageCreated && !modLocked)
       
   329                 {
       
   330                     //On débloque la détection de gesture et on supprime l'objet envoyant les messages OSC de gesture.
       
   331                     modeMessageCreated = false;
       
   332                     modeMessage = "";
   277                 }
   333                 }
   278             }
   334             }
   279         }
   335         }
   280 
   336 
   281         /*
   337         /*