TP2 : Le simulateur d'ascenseur

Architecture du système

L'objet de cette séance est de vous proposer un simulateur pour le projet ascenseur du cours de Génie logiciel en M1 Informatique. L'architecture est la suivante :

  +--------------+
  |              |          +--------------+     Boutons
  |              +-------->A|  Panneau de  |<--> Lumières
  |   Contrôle   |  +----->B|  contrôle    |     Affichage
  |   Commande   |  |       +--------------+     
  |   (à faire)  |  |       
  |              |  |       +--------------+
  |              +-------->C|  Partie      |<--> Ascenseur
  |              |  |  +-->D|  Opérative   |
  +--------------+  |  |    +--------------+
                    |  |     
          +---------+--+--+
          |      GUI      |
          |   (à faire)   |
          +---------------+
  
  A = interface IPanel             implantée par PanelSimulator
  B = interface IPanelSimulator    implantée par PanelSimulator
  C = interface IElevator          implantée par ElevatorSimulator
  D = interface IElevatorSimulator implantée par ElevatorSimulator

Vous trouverez la description précise des interfaces et des classes dans la javadoc.

Projet gradle

Vous pouvez récupérer/cloner le projet gradle de mise en oeuvre de ce simulateur à cette adresse. Ce projet comporte un exemple sous la forme d'un test unitaire JUnit.

Tester le simulateur de panneau

Le panneau de l'ascenseur (interface IPanel) comprend

  • les N boutons à l'intérieur de la cabine (ainsi que les lumières associées),
  • les 2 x N-1 boutons situés sur les paliers (ainsi que les lumières associées)
  • un bouton d'arrêt d'urgence
  • un bouton de réinitialisation (généralement activée par un clef)
  • les afficheurs situés dans la cabine et sur les paliers qui affichent la même information.

Questions à traiter :

  1. Construire un test unitaire afin de vérifier le bon fonctionnement des boutons du simulateur de panneau.
  2. Même question pour les lumières.

Tester le simulateur d'ascenseur

Nous vous proposons une série d'exercices afin de découvrir ce simulateur :

  1. Analyser le test unitaire et comprendre le fonctionnement de l'ascenseur.
  2. Enlever le commentaire de la dernière ligne et déterminer la bonne valeur pour getEvents.
  3. Dupliquer la méthode de test pour réaliser une nouvelle version basée sur le mode pas-à-pas. Dans ce mode, aucun thread n'est créé pour gérer le déplacement de l'ascenseur. Vous devrez changer le deuxième argument du constructeur (voir javadoc) et prendre en charge le déplacement de l'ascenseur (méthode oneStep()).
  4. Modifier la méthode précédente afin d'arrêter correctement l'ascenseur au troisième étage (il faut envoyer la requête stopNext quand il dépasse le deuxième étage).
  5. Vérifier que l'arrêt normal au troisième a entraîné l'ouverture des portes.
  6. En plus du niveau de l'ascenseur, faites en sorte, sans utiliser getLevel, d'afficher le franchissement d'un pallier.
  7. Faites maintenant en sorte de ne plus utiliser la fonction getLevel pour piloter l'ascenseur. Vous remarquerez que la fonction getLevel est offerte par le simulateur mais qu'elle n'existe pas dans IElevator.
  8. Dans une nouvelle méthode de test, ouvrir les portes, puis, une fois fermées, faites monter l'ascenseur au premier.
  9. Dans une nouvelle méthode de test, provoquer une erreur et tester le bon fonctionnement du reset.
  10. Dans une nouvelle méthode de test, provoquer le déplacement de l'ascenseur suivi d'une demande d'arrêt d'urgence. Vérifier le bon fonctionnement.

Ordonnanceur de requêtes

Afin de piloter efficacement le déplacement de l'ascenseur, nous avons besoin d'un composant qui réceptionne et ordonnance les requêtes. Plus précisément, ce composant doit

  • enregistrer les demandes qui proviennent d'un palier N pour monter ou descendre ;
  • enregistrer les demandes qui proviennent de la cabine ;
  • annuler les demandes liées à un étage ;
  • calculer, pour une position donnée de l'ascenseur, et pour un sens de déplacement, le prochain étage à atteindre pour répondre aux requêtes

Questions à traiter :

  1. Mettre en place une classe Scheduler vide et une classe de test unitaire associée.
  2. Prévoir les méthodes d'enregistrement et construire, à chaque fois, un test unitaire de validation.
  3. Implémenter la fonction de calcul et construire les tests associés. Vous devrez notamment prendre en compte les cas suivants :
    • L'ascenseur monte et il reste encore des requêtes à traiter dans les étages supérieurs.
    • L'ascenseur monte et des requêtes vers les étages inférieurs arrivent.
    • L'ascenseur est au premier étage et monte vers le cinquième, lorsque arrive une requête à la montée au 3ème étage.
    • L'ascenseur est au troisième et à la montée et un utilisateur en cabine souhaite aller au rez-de-chaussée.