package odalle; import GenCol.entity; import genDevs.modeling.content; import genDevs.modeling.message; import simView.ViewableAtomic; public class odBuffer extends ViewableAtomic { protected int nbJobs_ = 0; /** * Le constructeur par dŽfaut est utilisŽ quand le composant est * crŽŽ automatiquement sans paramtre, par exemple quand * on essaie d'exŽcuter le composant tout seul. */ public odBuffer(){ /* Un nom par defaut */ super("Buffer"); /* Ce qui suit permet de materialiser les ports dans la vue graphique */ addInport("in"); addInport("done"); addOutport("out"); /* on peut inserer des evenements pour tester le DEVS * Les valeurs inserees (ici "nouveau" et "termine" sont * sans importance car la seule chose qui nous interesse c'est * de savoir si un evenement est present sur le port, peut importe * la veleur associee a cet evenenement. * */ addTestInput("in",new entity("nouveau")); addTestInput("done",new entity("termine")); /* on peut aussi ajouter un evenement futur, ici dans 5 unite de tps. */ addTestInput("in", new entity("nouveau2"),5.0); } /** * Le constructeur du composant DEVS permet de preciser le nom * du composant (utile pour les distinguer si on veut en utiliser * plusieurs en meme temps) et les parametres par defaut (ici la periode). * @param name Le nom du composant */ public odBuffer(String name){ super(name); } /** * La methode initialize calcule l'etat initial du composant DEVS. * L'etat initial est forme de la phase (ici "F") et de sigma, * le temps qu'il reste a attendre dans l'etat courant (on * l'initialise donc a la valeur de la periode), et puis on appelle * la methode initialize de la classe parente pour enregistrer cette * modification. * Plus tard, on pourra changer ces valeurs soit directement, * soit ˆ l'aide de fonctions prŽdŽfinies: * - passivate() : passe la phase dans l'Žtat "passive" avec une * valeur de sigma = INFINITY * - holdIn(etat,duree) : passe dans la phase etat (un chaine) pour * une certaine duree */ public void initialize(){ phase = "F"; sigma = INFINITY; super.initialize(); } /** * La methode "delta_ext" dans la notation mathematique. * Inutile de preciser l'etat courant car il est connu dans l'objet * (la combinaison des variables interne, de la variable predefinie * "phase", et la variable predefinie "sigma") * Dans le cas present cette fonction doit considŽrer les deux * types d'entrŽes possibles en meme temps, sur le port "in" et * le port "done". */ public void deltext(double e,message x) { Continue(e); /* Un message peut etre multiple, cad contenir plusieur messages * simples. Donc pour parcourir les messages il faut faire une * boucle. Ensuite, a chaque tour de boucle, on test sur quel * port se trouve le message (ici soit le port "in" doit le port * "done"). */ for (int i=0; i< x.getLength();i++) { if (messageOnPort(x,"in",i)) { if (nbJobs_ == 0){ holdIn("active",0); } nbJobs_ ++; } if (messageOnPort(x,"done",i)) { if (nbJobs_ > 1) { holdIn("active",0); } nbJobs_--; } } } /** * La methode "delta_int" de la notation mathematique. * Ici, on passe dans l'etat passif pour une duree inifinie. */ public void deltint() { passivate(); } /** * La mŽthode lambda de la notation mathŽmatique (calcule la sortie * du DEVS). */ public message out( ) { /* Construire la valeur de sortie. */ entity e = new entity("job"); /* Construire la sortie simple */ content c = makeContent("out",e); /* Construire un message vide */ message m = new message(); /* Remplir le message avec une premiere (unique) sortie */ m.add(c); return m; } /** * Cette methode permet d'ajouter des informations dans * la bulle qui s'affiche quand on passe la souris au dessus du composant * dans la fenetre graphique. */ public String getTooltipText(){ return super.getTooltipText() +"\n"+"nbJobs: " + nbJobs_; } }