eeros_architecture:sequencer:subsequence
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
eeros_architecture:sequencer:subsequence [2015/10/27 17:33] – created graf | eeros_architecture:sequencer:subsequence [2015/10/31 09:05] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 3: | Line 3: | ||
=====Blocking Call of a Subsequence===== | =====Blocking Call of a Subsequence===== | ||
- | If you want to save your own data in the sequence, | + | If several steps of a sequence |
- | e.g. in the method // | + | |
===== Simple Example ===== | ===== Simple Example ===== | ||
- | We first define a class for the secondarysequence | + | We continue with our hypothetical robot from the example in [[eeros_architecture: |
<code cpp> | <code cpp> | ||
- | class MySequence | + | class SequenceB |
public: | public: | ||
- | | + | |
- | void run() { | + | void run(double z) { |
- | robot.moveXY(10, -20); | + | robot.moveZ(z); |
yield(); | yield(); | ||
- | robot.moveXY(-10, -30); | + | robot.moveZ(0); |
} | } | ||
Line 25: | Line 24: | ||
</ | </ | ||
- | **Note:** | + | The //run()// method is called |
- | *In the above lines only one object of //MyBlockingSubSequence// with the name // | + | |
- | *It is not allowed | + | |
- | To start the sub-sequence | + | We can now define our first or main sequence |
- | < | + | < |
- | //Here we wait for the returning of the subSequence.run() method | + | class SequenceA : public Sequence<> |
- | while(subSequence->getState() != eeros::sequencer:: | + | public: |
- | subSequence-> | + | SequenceA(std:: |
- | } | + | |
+ | void run() { | ||
+ | robot.moveXY(10, | ||
+ | sequenceB(5); | ||
+ | robot.moveXY(-10, | ||
+ | sequenceB(5); | ||
+ | robot.moveXY(0, | ||
+ | } | ||
+ | |||
+ | private: | ||
+ | Robot& robot; | ||
+ | SequenceB sequenceB; | ||
+ | }; | ||
+ | </code> | ||
+ | In our main program | ||
+ | <code cpp> | ||
+ | int main() { | ||
+ | Sequencer | ||
+ | SequenceA seqA(" | ||
+ | | ||
+ | sequencerA.join(); | ||
+ | }; | ||
</ | </ | ||
+ | The following figure shows the flow of action. | ||
+ | {{ : | ||
+ | ===== Nonblocking Call of a Subsequence ===== | ||
- | ====Non Blocking Call of a Sub-Sequence==== | + | A nonblocking subsequence has to run in its own thread. For this reason you need a separate subsequencer |
- | Remark: Please use pointer | + | |
- | A non-blocking sub-sequence has to be created as a thread, so you need a sub-sequencer for starting the new thread. | + | ==== Simple Example ==== |
- | e.g.: | + | |
- | <code c> | + | |
- | MySequencer* subSequencer | + | |
- | </ | + | |
- | Here you can reuse an existing | + | We first define a class for the sub- or secondary |
- | < | + | < |
- | MyNonBlockingSubSequence* subSequence = dynamic_cast<MyNonBlockingSubSequence*>(eeros::sequencer::Sequence:: | + | class SequenceB : public Sequence<> |
- | if(!subSequence){ | + | public: |
- | | + | SequenceB(std::string name, Sequencer* seq, Robot& r) : Sequence< |
- | } | + | |
+ | void run() { | ||
+ | | ||
+ | | ||
+ | yield(); | ||
+ | robot.moveZ(0); | ||
+ | | ||
+ | |||
+ | private: | ||
+ | Robot& robot; | ||
+ | }; | ||
</ | </ | ||
- | **Note:** | + | The //run()// method simply moves in z direction and, after a pause, returns |
- | *The constructor of the //MyNonBlockingSequence// | + | |
- | *Do not forget | + | |
- | As soon as you have created the sub-sequence, | + | We can now define our first or main sequence with |
- | < | + | < |
- | | + | class SequenceA : public Sequence<> |
+ | public: | ||
+ | | ||
+ | |||
+ | void run() { | ||
+ | robot.moveXY(10, | ||
+ | sequencerB.start(0U); | ||
+ | robot.moveXY(-10, | ||
+ | sequencerB.join(); | ||
+ | robot.moveXY(0, | ||
+ | } | ||
+ | |||
+ | private: | ||
+ | Robot& robot; | ||
+ | Sequencer& | ||
+ | }; | ||
</ | </ | ||
- | + | In our main program we declare a sequencer for the main sequence. A second sequencer will run the subsequence. | |
- | In an other step of the superior | + | < |
- | < | + | int main() { |
- | //Here we wait for the subsequencer Thread | + | Sequencer |
- | eeros:: | + | SequenceB seqB("Seq B", & |
- | if(seq && seq-> | + | SequenceA seqA("Seq A", & |
- | | + | |
- | } | + | sequencerA.start(&seqA); |
+ | | ||
+ | }; | ||
</ | </ | ||
+ | |||
+ | In the second step of the sequence A the sequence is started in its own thread. After this both run concurrently. The forth step of sequence A then waits for the sequence B to finish. | ||
+ | The following figure shows the flow of action. | ||
+ | {{ : |
eeros_architecture/sequencer/subsequence.1445963638.txt.gz · Last modified: 2015/10/27 17:33 by graf