blob: edac7bd574988e5077ad5702e98d941b0a5da674 [file] [log] [blame]
Brian Silverman890a32a2018-03-11 15:41:56 -07001#include "ctre/phoenix/Tasking/Schedulers/SequentialScheduler.h"
2
3namespace ctre {
4namespace phoenix {
5namespace tasking {
6namespace schedulers {
7
8SequentialScheduler::SequentialScheduler() {
9}
10SequentialScheduler::~SequentialScheduler() {
11}
12void SequentialScheduler::Add(ILoopable *aLoop) {
13 _loops.push_back(aLoop);
14}
15ILoopable * SequentialScheduler::GetCurrent() {
16 ILoopable* retval = nullptr;
17 if (_idx < _loops.size()) {
18 retval = _loops[_idx];
19 }
20 return retval;
21}
22
23void SequentialScheduler::RemoveAll() {
24 _loops.clear();
25}
26void SequentialScheduler::Start() {
27 /* reset iterator regardless of loopable container */
28 _idx = 0;
29 /* do we have any to loop? */
30 if (_idx >= _loops.size()) {
31 /* there are no loopables */
32 _running = false;
33 } else {
34 /* start the first one */
35 _loops[_idx]->OnStart();
36 _running = true;
37 }
38
39}
40void SequentialScheduler::Stop() {
41 for (unsigned int i = 0; i < _loops.size(); i++) {
42 _loops[i]->OnStop();
43 }
44 _running = false;
45}
46void SequentialScheduler::Process() {
47 if (_idx < _loops.size()) {
48 if (_running) {
49 ILoopable* loop = _loops[_idx];
50 loop->OnLoop();
51 if (loop->IsDone()) {
52 /* iterate to next loopable */
53 ++_idx;
54 if (_idx < _loops.size()) {
55 /* callback to start it */
56 _loops[_idx]->OnStart();
57 }
58 }
59 }
60 } else {
61 _running = false;
62 }
63}
64/* ILoopable */
65void SequentialScheduler::OnStart() {
66 SequentialScheduler::Start();
67}
68void SequentialScheduler::OnLoop() {
69 SequentialScheduler::Process();
70}
71void SequentialScheduler::OnStop() {
72 SequentialScheduler::Stop();
73}
74bool SequentialScheduler::IsDone() {
75 /* Have to return something to know if we are done */
76 if (_running == false)
77 return true;
78 else
79 return false;
80}
81
82} // namespace schedulers
83} // namespace tasking
84} // namespace phoenix
85} // namespace ctre
86