package Elevator; import java.awt.Graphics; import java.awt.TextField; import java.lang.Runnable; public class Lift extends Thread { private int liftId; public Deur deur; private LiftWachtrij wachtrij; private LiftBesturingSysteem lbs; public EtageKnop etageKnoppen[]; private TextField etageIndicator; private int huidigeEtage; private int doelEtage; //etageId van etage waar de lift naartoe reist. private int richting = LiftBesturingSysteem.RICHTINGSTIL; private Graphics graphics; //Thread liftAanHetWerk = null; public Lift(LiftBesturingSysteem l, int liftId, Graphics g){ this.liftId = liftId; deur = new Deur(); lbs = l; wachtrij = new LiftWachtrij(lbs.getAantalEtages()); graphics = g; huidigeEtage = 0; //eerste etage in etage-array van lbs doelEtage = huidigeEtage; //nog niks, want richting = stil //maak EtageKnoppen aan. etageKnoppen = new EtageKnop[lbs.getAantalEtages()]; for(int i = 0; i < lbs.getAantalEtages(); i++){ etageKnoppen[i] = new EtageKnop(lbs,i,this.liftId); } } public void run() { Thread.currentThread().setPriority(Thread.MIN_PRIORITY); while (true) { // endless loop try { // Kijk of de lift stil staat en haal nieuwe etage op if(huidigeEtage == doelEtage){ // Kijk of de liftwachtrij in de lift leeg is int nieuweEtage; if(wachtrij.isWachtrijEmpty()){ // De lift staat stil er zit (waarschijnlijk niemand meer in, // haal een nieuw doel op voor uit de wachtrij van het systeem nieuweEtage = lbs.getNieuweEtage(huidigeEtage); } else{ // De lift staat stil maar de wachtrij van de lift zelf is nog niet leeg // haal een nieuw doel op uit de liftwachtrij van de lift zelf nieuweEtage = wachtrij.getNewEtage(huidigeEtage, richting); } if (nieuweEtage == -1){ richting = lbs.RICHTINGSTIL; // de lift staat stil, de wachtrij van het systeem is leeg sleep(1000); // Wait (in milliseconds) //-->geef aan lbs door dat lift stil staat. } else{ doelEtage = nieuweEtage; // sla de nieuwe etage uit de wachtrij op als doel 'naarEtage' //System.out.println("Lift " + liftId + " op " + huidigeEtage + " naar etage: " + doelEtage); lbs.statusVeld.setText("Lift " + liftId + " op " + huidigeEtage + " naar etage: " + doelEtage); if(huidigeEtage > doelEtage){ richting = lbs.RICHTINGOMLAAG; // de lift gaat bijvoorbeeld van 10 naar 4, richting is dus omlaag } if(huidigeEtage < doelEtage){ richting = lbs.RICHTINGOMHOOG; // de lift gaat bijvoorbeeld van 2 naar 7, richting is dus omhoog } } } // De lift staat niet stil, ga dan 1 stap in de richting van naarEtage else{ // Ga 1 verdieping omlaag of omhoog if(huidigeEtage > doelEtage){ huidigeEtage--; } else{ huidigeEtage++; } sleep(1000); // Wait (in milliseconds) (ga naar volgende etage) //Wijzig lift indicator. Werkt alleen als er een TextField als indicator is aangegeven. wijzigEtageIndicator(); //System.out.println("Lift " + liftId + " op etage: " + huidigeEtage + " doeletage:" + doelEtage); lbs.statusVeld.setText("Lift " + liftId + " op etage: " + huidigeEtage + " doeletage:" + doelEtage); // Kijk in de liftwachtrij of er iemand uit wil stappen! if(wachtrij.existsinWachtrij(huidigeEtage)||lbs.isEtageInWachrij(huidigeEtage,richting)||(huidigeEtage == doelEtage)){ //ruim wachtrij-en op: if(lbs.isEtageInWachrij(huidigeEtage,richting)){ // Als er iemand in wil stappen verwijder die uit de hoofdWachtrij.. // De lift gaat gewoon verder en neemt de persoon mee. int r = lbs.RICHTINGSTIL; if(!wachtrij.isWachtrijEmpty()){ r = richting; } lbs.verwijderEtageVanWachtrij(huidigeEtage,r); } if(wachtrij.existsinWachtrij(huidigeEtage)){ // Als er iemand in wil stappen verwijder die uit de hoofdWachtrij.. // De lift gaat gewoon verder en neemt de persoon mee. wachtrij.removeFromWachtrij(huidigeEtage); //-->reset etageKnop etageKnoppen[huidigeEtage].knopUit(); } if(huidigeEtage == doelEtage){ etageKnoppen[huidigeEtage].knopUit(); lbs.clearButton(huidigeEtage, richting); } //--> Open de deuren en laat iemand uitstappen. openLiftDeuren(); //System.out.println("Lift " + liftId + " heeft in- of uitstappers."); lbs.statusVeld.setText("Lift " + liftId + " heeft in- of uitstappers."); sleep(3000); // Wait (in milliseconds) //--> sluit deuren sluitLiftDeuren(); } } } catch(Exception e){ //System.out.println("ERROR -->> Iets ging fout met lift " + liftId ); //System.out.println(e.getMessage()); lbs.statusVeld.setText("ERROR -->> Iets ging fout met lift " + liftId ); lbs.statusVeld.setText(e.getMessage()); } } } public void voegToeAanWachtrij(int e){ wachtrij.addToWachtrij(e); } public void setEtageIndicator(TextField text){ etageIndicator = text; } private void openLiftDeuren(){ //System.out.println("lift " + liftId + ": deuren openen."); lbs.statusVeld.setText("Lift " + liftId + ": deuren openen."); deur.open(); lbs.etages[huidigeEtage].deuren[liftId].open(); } private void sluitLiftDeuren(){ //System.out.println("lift " + liftId + ": deuren sluiten."); lbs.statusVeld.setText("Lift " + liftId + ": deuren sluiten."); deur.sluiten(); lbs.etages[huidigeEtage].deuren[liftId].sluiten(); } private void wijzigEtageIndicator(){ if(etageIndicator != null){ etageIndicator.setText(String.valueOf(huidigeEtage)); } } public int getEtage(){ return huidigeEtage; } }