User Tools

Site Tools


zalozeni:logika:experimentlogic

ExperimentLogic

!!! Pred implementaci si bezpodminecne precist celou tuto stranku !!!

ExperimentLogic je trida z jadra a co se jeji implementace tyce, jedna se bezpochyby o nejslozitejsi tridu, kterou je treba implementovat. ExperimentLogic ridi celou logiku experimentu a jadro samotne poskytuje pouze zakladni metody, ktere se volaji pri zmene ExperimentStatus. Behem techto metod se meni nektere promenne v ExperimentLogic a je treba jim alespon trochu rozumet. Jake metody jsou volany pri jakych zmenach ExperimentStatus ukazuje nasledny stavovy diagram logiky

Stavovy Diagram Logiky

Trida ExperimentLogic

Nasleduje vypis casti tridy ExperimentLogic, ktery je treba mit v pameti. Trida se stara automaticky o nasledujici

  • Udrzovani stavu running (ten je ovladan LogicModuleManagerem)
  • Poskytuje metodu getActualExperimentTime()
  • Je treba implementovat metody viz Stavovy diagram logiky
  • Pri volani metody run() se prislusny Instrument automaticky prepina do running=true a raisuje se InstrumentMeasuringChangeEvent z jadra (a podobne po skonceni mericiho cyklu)
  • Jedine pokud metoda runLogic() vrati ChangingStatusReturnCode.SUCCESSFUL_END, ExperimentInstance je radne zakoncena (to je treba mit obvzlaste na pameti pri impleemntaci metody runLogic()). Ostatni metody vraci ChangingStatusReturnCode.OK pokud nenastal nejaky problem a ChangingStatusReturnCode.ERROR pokud problem nastal
  • Polsedni protected metody usnadnuji raisovani eventu na urovni ExperimentInstance, ExperimentType a Instrument

Behem jeji implementace je treba se starat o

  • inicializaci instrumentu (tj. pripojeni a patricne nastaveni)
  • vycitani Component v pravidelnych intervalech
  • zobrazovani dat
  • vyhodnoceni mereni po patricnem ukonceni
  • … a mnoho dalsich

Jak vse implementovat bude detailne popsano v povidani o logice experimentu. Na teto strance je ukazana hlavni filozofie cele tridy ExperimentLogic, zejmena direktivy, ktere je treba dodrzet pri jeji implementaci a seznam toho, co za nas obstara jadro.

public abstract class ExperimentLogic implements Runnable {
 
	protected boolean running;
	private long startTime;
 
	public long getActualExperimentTime() {
		if (startTime == 0) {
			try {
				startTime = expInstanceSettingService.getStartTime();
			} catch (ValueNotFoundException e) {
				startTime = System.currentTimeMillis();
				expInstanceSettingService.setStartTime(startTime);
			}
		}
		return System.currentTimeMillis() - startTime;
	}
 
	public abstract ChangingStatusReturnCode postAbortedRun();
	public abstract ChangingStatusReturnCode postChashed();
	public abstract ChangingStatusReturnCode postPause();
	public abstract ChangingStatusReturnCode postRun();
	public abstract ChangingStatusReturnCode postSuspend();
	public abstract ChangingStatusReturnCode prePause();
	public abstract ChangingStatusReturnCode preRun();
	public abstract ChangingStatusReturnCode preSuspend();
	public abstract ChangingStatusReturnCode restore();
	public abstract ChangingStatusReturnCode runLogic();
 
	private void checkPreRunHooks() {
	}
 
	@Override
	public void run() {
		checkPreRunHooks();
 
		instrument.setMeasuring(true);
		raiseInstrumentEvent(new InstrumentMeasuringChangeEvent(true));
		ChangingStatusReturnCode rc = runLogic();
		instrument.setMeasuring(false);
		raiseInstrumentEvent(new InstrumentMeasuringChangeEvent(false));
 
		checkPostRunHooks(rc);
	}
 
	private void checkPostRunHooks(ChangingStatusReturnCode rc) {
		if (rc == ChangingStatusReturnCode.SUCCESSFUL_END) {
			ServiceLocator.getInstance().getLogicModuleManager().endInstance(expInstance);
			return;
		} else if (rc == ChangingStatusReturnCode.OK) {
			ServiceLocator.getInstance().getLogicModuleManager().pauseInstance(expInstance);
			return;
		} else if (rc == ChangingStatusReturnCode.ERROR) {
			ServiceLocator.getInstance().getLogicModuleManager().pauseInstance(expInstance);
			return;
		}
	}
 
 
	protected void raiseExpInstanceEvent(LogicModuleEvent event) {
		LogicEventUtility.raiseEvent(event, getExpInstance());
	}
 
	protected void raiseExpTypeEvent(LogicModuleEvent event) {
		LogicEventUtility.raiseEvent(event, getExpInstance().getExperimentType());
	}
 
	protected void raiseInstrumentEvent(LogicModuleEvent event) {
		LogicEventUtility.raiseEvent(event, getInstrument());
	}
}

Trida LogicModuleManager

Tato trida je pristupna pres ServiceLocator. LogicModuleManager je volan z grafiky MeasurementControllPane prostrednictvim dvou tlacitek, jejichz implementace je obstarana tridou DokuwikiStatusButtonHandler.

LogicModuleManager zajistuje nasledujici funkce.

  • prepinani mezi jednotlivymi ExperimentStatus. Pri prepinani vola patricne metody definovane ve stavovem diagramu logiky a raisuje event StatusChangeEvent.
  • udrzuje instanci logiky v pameti
  • spousti logiku experimentu na specialnim vlakne
  • zajistuje spravne nastavovani stavu running ve tride ExperimentLogic
  • implementuje Observer design pattern. Eventy jsou vazany k nasledujicim tridam: Sample, Instrument, ExperimentInstance a ExperimentType. Jakykoliv LogicModuleEvent musi byt raisovan pres LogicModuleManager a jakykoliv ExperimentLogicListener musi byt registrovan pres LogicModuleManager

Enum ChangingStatusReturnCode

Enum ChangingStatusReturnCode je vracen metodami v ExperimentLogic a LogicModuleManager.

  • WRONG_INITIAL_STATUS je vracen, pokud ma dojit ke zmene mezi dvema ExperimentStatus, ktere nejsou spojeny ve stavovym diagramem logiky.
  • OK znaci vse v poradku.
  • ERROR znaci nejaky problem.
  • SUCCESSFUL_END je vracen pouze metodou run() a to v pripade, ze mereni je radne ukonceno automaticky programem.
public enum ChangingStatusReturnCode {
	WRONG_INITIAL_STATUS, OK, ERROR, SUCCESSFUL_END,
}
zalozeni/logika/experimentlogic.txt · Last modified: 2016/07/29 11:04 by jlochman