====== Conditions and Monitors ======
A monitor allows to supervise certain conditions of a robot during a sequence. Examples could include the following situations:
* A sequence steers a robot along a given path. A monitors checks for obstacles. As soon as an obstacle is close enough, the monitor causes a predefined exception sequence to be executed.
* A sequence takes too long to run due to some erroneous behavior. A monitor checks for timeout and either restarts or aborts the sequence or switches to an exception sequence.
* A sequence moves a robot arm. While moving the arm looses its load. A monitor checks for this load to be present and aborts the sequence.
All these situations have in common, that a user does want to check for a given set of conditions during the running of the sequence (including subsequences or steps).
===== Define your own Condition =====
Implement your condition by extending the class ''Condition'' as given below:
class MyCondition : public Condition {
public:
MyCondition() : { } // initialize any attributes necessary
bool validate() {return yourTest;} // implement whatever your condition should check
};
The method //validate// must return ''true'' in order for the monitor checking this condition to fire.
IMPORTANT Every Sequence or step already has a timeout condition (of class ''ConditionTimeout''). It allows for checking a maximum duration of execution. Also, every sequence has an abort condition (of class ''ConditionAbort''). This condition makes it possible to abort a sequence, e.g. by pressing ''Ctrl-C''.
IMPORTANT Make sure that your condition is properly set and reset. To give an example: A condition might be the state of a button. As soon as the button is pressed, the condition might return ''true'' and the associated monitor fires. This might lead to an abortion of the current sequence together with all its blocking subsequences. This might take some time. You have to make sure that the condition delivers ''true'' until this work is done. If the condition is simply the state of the button this might be too short, if you press only for a short time.
===== Assign a Condition to a Monitor =====
The second step is to define a monitor and assign it a condition.
SequenceA seq(...); // define a sequence
MyCondition myCondition; // and a condition
Monitor myMonitor("myMon", &seq, myCondition, SequenceProp::abort); // create an associated monitor
setExceptionSequence(exceptionSeq); // choose a sequence to run in case of a condition to become false
seq.addMonitor(&myMonitor); // and add it to the sequence
IMPORTANT Here again, every sequence or step already has a timeout monitor which helps to check its associated timeout condition. A second monitor checks the abort condition.