middleware/src/Communication/Server.cs
author bastiena
Fri, 09 Mar 2012 14:52:11 +0100
changeset 0 6fefd4afe506
child 3 92f19af39024
permissions -rw-r--r--
First Import
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     1
/*
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     2
 * Projet : KINECT PROJECTS
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     3
 * Module : MIDDLEWARE
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     4
 * Sous-Module : Communication
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     5
 * Classe : Server
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     6
 * 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     7
 * Auteur : alexandre.bastien@iri.centrepompidou.fr
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     8
 * 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     9
 * Fonctionnalités : Reçoit des notifications du module sous-module Tracking.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    10
 * Traduit les notifications sous forme de messages OSC et les envoie au Front Atelier.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    11
 * Forme des messages :
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    12
 * - Notification de main dans le champ de recherche : Point3D indiquant la position de la main dans l'espace.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    13
 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    14
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    15
using System;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    16
using System.Collections.Generic;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    17
using System.Linq;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    18
using System.Text;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    19
using System.IO;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    20
using System.Net;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    21
using System.Net.Sockets;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    22
using System.Threading;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    23
using Tuio;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    24
using System.Windows;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    25
using Microsoft.Kinect;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    26
using Trakers.Tracking;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    27
using System.Windows.Media.Media3D;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    28
using Trakers.Tracking.Events;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    29
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    30
namespace Trakers.Communication
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    31
{
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    32
    public class Server
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    33
    {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    34
        //Serveur TUIO, provenant de la DLL TuioServer créé par Bespoke.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    35
        private TuioServer server;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    36
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    37
        //Permet de savoir si un curseur pour la main gauche/droite a été créé.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    38
        private bool leftHandCursorCreated;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    39
        private bool rightHandCursorCreated;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    40
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    41
        /*
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    42
        * Constructeur : On initialise le serveur avec une adresse et un port, au début les curseurs
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    43
        * ne sont pas créés et on indique au ThreadPool une fonction de callback de manière à vérifier
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    44
        * s'il reçoit des notifications.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    45
        */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    46
        public Server(String host, int port)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    47
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    48
            server = new TuioServer(host, port);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    49
            leftHandCursorCreated = false;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    50
            rightHandCursorCreated = false;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    51
            ThreadPool.QueueUserWorkItem(ThreadPoolCallback);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    52
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    53
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    54
        /*
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    55
        * Getter du serveur.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    56
        */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    57
        public TuioServer getServer()
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    58
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    59
            return server;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    60
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    61
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    62
        /*
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    63
        * Méthode appelée lors d'une notification de type : main gauche entrée dans le champ.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    64
        */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    65
        public void LeftHandTracked(object sender, LeftHandTrackedEventArgs e)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    66
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    67
            //Si le curseur de la main gauche n'est pas créé, alors on le crée.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    68
            if (!leftHandCursorCreated)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    69
            {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    70
                server.AddTuioCursor(0, SkeletonPointToPoint3D(e.handJoint.Position));
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    71
                leftHandCursorCreated = true;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    72
            }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    73
            //S'il existe, on le met simplement à jour.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    74
            else
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    75
            {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    76
                server.UpdateTuioCursor(0, SkeletonPointToPoint3D(e.handJoint.Position));
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    77
            }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    78
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    79
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    80
        /*
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    81
        * Méthode appelée lors d'une notification de type : main droite entrée dans le champ.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    82
        */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    83
        public void RightHandTracked(object sender, RightHandTrackedEventArgs e)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    84
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    85
            //Si le curseur de la main droite n'est pas créé, alors on le crée.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    86
            if (!rightHandCursorCreated)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    87
            {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    88
                server.AddTuioCursor(1, SkeletonPointToPoint3D(e.handJoint.Position));
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    89
                rightHandCursorCreated = true;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    90
            }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    91
            //S'il existe, on le met simplement à jour.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    92
            else
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    93
            {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    94
                server.UpdateTuioCursor(1, SkeletonPointToPoint3D(e.handJoint.Position));
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    95
            }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    96
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    97
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    98
        /*
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    99
        * Méthode appelée lors d'une notification de type : main gauche sortie du champ.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   100
        */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   101
        public void LeftHandQuit(object sender, LeftHandQuitEventArgs e)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   102
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   103
            //Si le curseur de la main gauche existe, alors on le supprime.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   104
            if (leftHandCursorCreated)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   105
            {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   106
                server.DeleteTuioCursor(0);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   107
                leftHandCursorCreated = false;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   108
            }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   109
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   110
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   111
        /*
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   112
        * Méthode appelée lors d'une notification de type : main droite sortie du champ.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   113
        */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   114
        public void RightHandQuit(object sender, RightHandQuitEventArgs e)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   115
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   116
            //Si le curseur de la main droite existe, alors on le supprime.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   117
            if (rightHandCursorCreated)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   118
            {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   119
                server.DeleteTuioCursor(1);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   120
                rightHandCursorCreated = false;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   121
            }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   122
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   123
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   124
        /*
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   125
        * Permet de convertir un point de position de noeud en Point3D.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   126
        */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   127
        private Point3D SkeletonPointToPoint3D(SkeletonPoint p)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   128
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   129
            return new Point3D((double)p.X, (double)p.Y, (double)p.Z);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   130
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   131
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   132
        /*
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   133
        * Méthode de callback vérifiant toutes les 25 ms les nouvelles notifications.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   134
        * Il est à noter que si le temps de rafraîchissement des trop rapide, les messages n'ont pas
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   135
        * le temps d'être envoyés.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   136
        */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   137
        private void ThreadPoolCallback(Object threadContext)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   138
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   139
            while (true)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   140
            {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   141
                //On initialise le message OSC.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   142
                server.InitFrame();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   143
                //On l'envoie au client (au host et au port spécifiés dans le constructeur).
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   144
                server.CommitFrame();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   145
                //On attend 25 ms.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   146
                Thread.Sleep(25);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   147
            }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   148
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   149
    }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   150
}