Le simulateur d'ascenseur

Architecture du système

L'objet de cette page 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.

Le simulateur est téléchargeable via ce lien :

Utiliser le simulateur en mode automatique

Pour comprendre le fonctionnement du simulateur d'ascenseur, voila un premier exemple dans lequel un thread séparé se charge de faire évoluer la position de l'ascenseur (mode automatique). Il faut donc uniquement surveiller le bon fonctionnement :

package elevator;

import static elevator.IElevator.State.STOP;

public class TestAutomaticElevetor {

    public static void main(String args[]) throws Exception {
        // 10 étages et mode automatique
        var e = new ElevatorSimulator(10, false);
        // activer la montée
        e.up();
        // surveiller l'évolution de l'ascenseur
        for (int lift = 0; (e.getState() != STOP);) {
            Thread.sleep(100);
            // tester le franchissement d'étage
            if (e.getAndResetStageSensor()) {
                // au troisième étage, stopper au suivant
                if (++lift == 3) {
                    e.stopNext();
                }
            }
        }
        e.stopSimulator();

        // vérifions que tout est OK
        boolean ok = true;
        ok = ok && (4.0 == e.getLevel());
        ok = ok && (STOP == e.getState());
        ok = ok && ("-S0-U0-U1-U2-U3-O4-S4".equals(e.getEvents()));
        if (!ok) {
            throw new IllegalStateException();
        }
    }
}

Utiliser le simulateur en mode pas-à-pas

Dans ce deuxième exemple, le mode pas-à-pas est activé et l'évolution de l'ascenseur est assurée par des appels successifs à la méthode oneStep. À chaque étape, l'ascenseur évolue de 20cm, soit un quinzième d'étage (un étage mesure 3 mètres). Ce mode facilite la mise en place de tests.

package elevator;

import static elevator.IElevator.State.STOP;

public class TestStepByStepElevator {

    public static void main(String args[]) throws Exception {
        // 10 étages et mode pas à pas
        var s = new ElevatorSimulator(10, true);
        var nbSteps = 0;
        // activer la montée
        s.up();
        // surveiller l'évolution de l'ascenseur
        for (; (s.getLevel() < 2.5); nbSteps++) {
            s.oneStep();
        }
        s.stopNext();
        for (; (s.getState() != STOP); nbSteps++) {
            s.oneStep();
        }
        s.stopSimulator();

        // vérifions que tout est OK
        boolean ok = true;
        // (3 étages * 3 mètres * 5 étapes) + 25 étapes pour les portes
        ok = ok && (((3 * 3 * 5) + 25) == nbSteps);
        ok = ok && (3.0 == s.getLevel());
        ok = ok && (STOP == s.getState());
        ok = ok && ("-S0-U0-U1-U2-O3-S3".equals(s.getEvents()));
        if (!ok) {
            throw new IllegalStateException();
        }
    }
}