blob: c8d67732446aabfccd3b164473c59139baeddb82 [file] [log] [blame]
Brian Silverman890a32a2018-03-11 15:41:56 -07001#include "ctre/phoenix/Tasking/Schedulers/ConcurrentScheduler.h"
2
3namespace ctre {
4namespace phoenix {
5namespace tasking {
6namespace schedulers {
7
8ConcurrentScheduler::ConcurrentScheduler() {
9}
10ConcurrentScheduler::~ConcurrentScheduler() {
11}
12void ConcurrentScheduler::Add(ILoopable *aLoop, bool enable) {
13 _loops.push_back(aLoop);
14 _enabs.push_back(enable);
15}
16void ConcurrentScheduler::RemoveAll() {
17 _loops.clear();
18 _enabs.clear();
19}
20void ConcurrentScheduler::Start(ILoopable* toStart) {
21 for (int i = 0; i < (int) _loops.size(); ++i) {
22 ILoopable* lp = (ILoopable*) _loops[i];
23
24 if (lp == toStart) {
25 _enabs[i] = true;
26 lp->OnStart();
27 return;
28 }
29 }
30
31}
32void ConcurrentScheduler::Stop(ILoopable* toStop) {
33 for (int i = 0; i < (int) _loops.size(); ++i) {
34 ILoopable* lp = (ILoopable*) _loops[i];
35
36 if (lp == toStop) {
37 _enabs[i] = false;
38 lp->OnStop();
39 return;
40 }
41 }
42}
43void ConcurrentScheduler::StartAll() { //All Loops
44 for (auto loop : _loops) {
45 loop->OnStart();
46 }
47 for (auto enable : _enabs) {
48 enable = true;
49 }
50}
51void ConcurrentScheduler::StopAll() { //All Loops
52 for (auto loop : _loops) {
53 loop->OnStop();
54 }
55 for (auto enable : _enabs) {
56 enable = false;
57 }
58}
59void ConcurrentScheduler::Process() {
60 for (int i = 0; i < (int) _loops.size(); ++i) {
61 ILoopable* loop = (ILoopable*) _loops[i];
62 bool en = (bool) _enabs[i];
63 if (en) {
64 loop->OnLoop();
65 } else {
66 /* Current ILoopable is turned off, don't call OnLoop for it */
67 }
68 }
69}
70/* ILoopable */
71void ConcurrentScheduler::OnStart() {
72 ConcurrentScheduler::StartAll();
73}
74void ConcurrentScheduler::OnLoop() {
75 ConcurrentScheduler::Process();
76}
77void ConcurrentScheduler::OnStop() {
78 ConcurrentScheduler::StopAll();
79}
80bool ConcurrentScheduler::IsDone() {
81 return false;
82}
83
84} // namespace schedulers
85} // namespace tasking
86} // namespace phoenix
87} // namespace ctre
88