diff -r a446351f08c0 -r 50de8e8f44d7 middleware/src/Tracking/ModeManagement.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/middleware/src/Tracking/ModeManagement.cs Thu Mar 29 14:39:21 2012 +0200 @@ -0,0 +1,161 @@ +/* +* This file is part of the TraKERS\Middleware package. +* +* (c) IRI +* +* For the full copyright and license information, please view the LICENSE_MIDDLEWARE +* file that was distributed with this source code. +*/ + +/* + * Projet : TraKERS + * Module : MIDDLEWARE + * Sous-Module : Tracking + * Classe : ModeManagement + * + * Auteur : alexandre.bastien@iri.centrepompidou.fr + * + * Fonctionnalités : Permet de gérer les différents modes qui découpent l'interaction avec le middleware. + * Découpe l'interaction avec le middleware en différents modes. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Trakers.Communication; +using Trakers.Tracking.Events; +using Trakers.Debug; + +namespace Trakers.Tracking +{ + public class ModeManagement + { + //Il s'agit de la fonctoin permettant de notifier le serveur en cas de changement de mode. + public delegate void ModChangeHandler(object o, ModChangeEventArgs e); + //L'événement on change de mode. + public static event ModChangeHandler ModChangeEvent; + + //Accès au module d'interaction principal. + private KinectMain kinectMain; + //Accès au debug. + private DebugWindow debug; + //Accès au serveur. + private Server server; + //La liste des modes. + public enum Mode {NO_USER, USER_INCOMING, MOSAIC, FILTER, VIDEO, TIMELINE, SEARCH}; + //Mode actuel. + private Mode currentMode; + + /* + * Constructeur qui prend en paramètres le module principal et le serveur. + */ + public ModeManagement(KinectMain _kinectMain, Server _server, DebugWindow _debug) + { + kinectMain = _kinectMain; + server = _server; + debug = _debug; + currentMode = Mode.NO_USER; + + //Fonction appelée lorsqu'on change de mode. + ModChangeListener modChangeListener = new ModChangeListener(); + ModChangeEvent += new ModChangeHandler(modChangeListener.ShowOnScreen); + } + + /* + * Détecte tout changement de mode en se basant sur la proximité de l'utilisateur. + */ + public void DetectProximityBasedModes(float proximity, int numberOfImages) + { + //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. + //On considère qu'il n'y a pas d'utilisateur si sa proximité est trop faible. + if (proximity < 10f && currentMode != Mode.NO_USER) + { + currentMode = Mode.NO_USER; + ModChangeEventArgs modChangeEvent = new ModChangeEventArgs(debug, server, "NO_USER"); + OnModChangeEvent(modChangeEvent); + } + //S'il n'est pas encore au point d'interaction maximale, on considère qu'il est en chemin. + else if (proximity >= 10f && proximity < 100f) + { + currentMode = Mode.USER_INCOMING; + ModChangeEventArgs modChangeEvent = new ModChangeEventArgs(debug, server, "USER_INCOMING"); + OnModChangeEvent(modChangeEvent); + } + //S'il est arrivé au point, il a la mosaïque complète. + else + { + currentMode = Mode.MOSAIC; + ModChangeEventArgs modChangeEvent = new ModChangeEventArgs(debug, server, "MOSAIC"); + OnModChangeEvent(modChangeEvent); + } + } + + /* + * Détecte si l'utilisateur veut filtrer la mosaïque. + */ + public void DetectFilterMode() + { + //Ne fonctionne que si on se trouve dans la mosaïque. + if (currentMode == Mode.MOSAIC) + { + currentMode = Mode.FILTER; + ModChangeEventArgs modChangeEvent = new ModChangeEventArgs(debug, server, "FILTER"); + OnModChangeEvent(modChangeEvent); + } + } + + /* + * Détecte si l'utilisateur veut entrer dans une vidéo. + */ + public void DetectVideoMode() + { + //Si on vient de la mosaïque, d'un filtrage, de la timeline ou d'une recherche, on peut entrer. + if (currentMode == Mode.MOSAIC || currentMode == Mode.FILTER || + currentMode == Mode.TIMELINE || currentMode == Mode.SEARCH) + { + currentMode = Mode.VIDEO; + ModChangeEventArgs modChangeEvent = new ModChangeEventArgs(debug, server, "VIDEO"); + OnModChangeEvent(modChangeEvent); + } + } + + /* + * Détecte si l'utilisateur veut entrer dans la timeline. + */ + public void DetectTimeLineMode() + { + //Si on est dans une vidéo, on peut entrer. + if (currentMode == Mode.VIDEO) + { + currentMode = Mode.TIMELINE; + ModChangeEventArgs modChangeEvent = new ModChangeEventArgs(debug, server, "TIMELINE"); + OnModChangeEvent(modChangeEvent); + } + } + + /* + * Détecte si l'utilisateur veut effectuer une recherche dans cette vidéo. + */ + public void DetectSearchMode() + { + //Si on est dans une vidéo, on peut entrer. + if (currentMode == Mode.VIDEO) + { + currentMode = Mode.SEARCH; + ModChangeEventArgs modChangeEvent = new ModChangeEventArgs(debug, server, "SEARCH"); + OnModChangeEvent(modChangeEvent); + } + } + + /* + * Initialise l'événement et fait appel aux fonctions du listener quand on change de mode. + */ + public static void OnModChangeEvent(ModChangeEventArgs e) + { + if (ModChangeEvent != null) + ModChangeEvent(new object(), e); + } + } +}