Marklar
Zalozeni Projektu
- Prerequisities
- Prvni kroky
- Experiment
- Grafika
- Logika Experimentu
Struktura
- marklar-core
- marklar-fx-common
- marklar-driver-modbus
- marklar-pardWeight
- plastometer
- dilatometer
- lbm
- dokuwiki
!!! 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
Nasleduje vypis casti tridy ExperimentLogic
, ktery je treba mit v pameti. Trida se stara automaticky o nasledujici
running
(ten je ovladan LogicModuleManager
em)getActualExperimentTime()
run()
se prislusny Instrument
automaticky prepina do running=true
a raisuje se InstrumentMeasuringChangeEvent
z jadra (a podobne po skonceni mericiho cyklu)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 nastalprotected
metody usnadnuji raisovani eventu na urovni ExperimentInstance
, ExperimentType
a Instrument
Behem jeji implementace je treba se starat o
Component
v pravidelnych intervalech
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()); } }
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.
ExperimentStatus
. Pri prepinani vola patricne metody definovane ve stavovem diagramu logiky a raisuje event StatusChangeEvent
.running
ve tride ExperimentLogic
Sample
, Instrument
, ExperimentInstance
a ExperimentType
. Jakykoliv LogicModuleEvent
musi byt raisovan pres LogicModuleManager
a jakykoliv ExperimentLogicListener
musi byt registrovan pres LogicModuleManager
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, }