⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 portegarage.java

📁 a program in java to control the automatic door in the garage
💻 JAVA
字号:
package be.garage;

import java.util.Observable;
import java.util.Timer;

import be.garage.capteur.Alertable;
import be.garage.capteur.CapteurFermeture;
import be.garage.capteur.CapteurOuverture;
import be.garage.capteur.DetecterFinDureeOuverture;

public class PorteGarage extends Observable implements Alertable {
	public enum EtatPorte {
		OUVERTE, OUVRANTE, FERMEE, FERMANTE
	}

	public enum Evenement {
		CLIC, OBSTACLE, FIN_DUREE_OUVERTURE, FIN_OUVERTURE, FIN_FERMETURE
	}

	private final static int DUREE_OUVERTURE = 4 * 1000;

	private EtatPorte etat;

	private boolean obstacle;

	// simulation des moteurs
	private final static int DUREE_EN_OUVERTURE = 2 * 1000;

	private final static int DUREE_EN_FERMETURE = 2 * 1000;

	private Timer enOuverture = new Timer();

	private Timer enFermeture = new Timer();

	private Timer ouverture = new Timer();

	public PorteGarage() {
		etat = EtatPorte.FERMEE;
	}

	private void arreterMoteur() {
		ouverture.cancel();
		enFermeture.cancel();
		enOuverture.cancel();
	}

	private void fermer() {
		arreterMoteur();
		enFermeture = new Timer();
		enFermeture.schedule(new CapteurFermeture(this), DUREE_EN_FERMETURE);
	}

	private void ouvrir() {
		arreterMoteur();
		enOuverture = new Timer();
		enOuverture.schedule(new CapteurOuverture(this), DUREE_EN_OUVERTURE);
	}

	public void changerEtat(Evenement evenement) {
		EtatPorte ancienEtat = etat;
		switch (etat) {
		case OUVERTE:
			switch (evenement) {
			case CLIC:
				entry();
				break;
			case FIN_DUREE_OUVERTURE:
				if (!obstacle) {
					etat = EtatPorte.FERMANTE;
				}
				entry();
				break;
			}
			break;
		case OUVRANTE:
			if (evenement == Evenement.FIN_OUVERTURE) {
				etat = EtatPorte.OUVERTE;
				entry();
			}
			break;
		case FERMANTE:
			switch (evenement) {
			case CLIC:
			case OBSTACLE:
				etat = EtatPorte.OUVRANTE;
				entry();
				break;
			case FIN_FERMETURE:
				etat = EtatPorte.FERMEE;
				entry();
				break;
			}
			break;
		case FERMEE:
			if (evenement.equals(Evenement.CLIC)) {
				etat = EtatPorte.OUVRANTE;
				entry();
			}
			break;
		}
		if (ancienEtat != etat) {
			setChanged();
			notifyObservers();
		}
	}

	private void entry() {
		switch (etat) {
		case OUVERTE:
			arreterMoteur();
			maintenirPorteOuverte();
			break;
		case OUVRANTE:
			ouvrir();
			break;
		case FERMANTE:
			fermer();
			break;
		case FERMEE:
			arreterMoteur();
			break;
		}
	}

	private void maintenirPorteOuverte() {
		arreterMoteur();
		ouverture = new Timer();
		ouverture
				.schedule(new DetecterFinDureeOuverture(this), DUREE_OUVERTURE);
	}

	public EtatPorte getEtat() {
		return etat;
	}

	public void finDureeOuverture() {
		changerEtat(Evenement.FIN_DUREE_OUVERTURE);
	}

	public void finFermeture() {
		changerEtat(Evenement.FIN_FERMETURE);
	}

	public void finOuverture() {
		changerEtat(Evenement.FIN_OUVERTURE);
	}

	/**
	 * @param obstacle
	 *            The obstacle to set.
	 */
	public void setObstacle(boolean obstacle) {
		this.obstacle = obstacle;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -