blob: c8d67732446aabfccd3b164473c59139baeddb82 [file] [log] [blame]
#include "ctre/phoenix/Tasking/Schedulers/ConcurrentScheduler.h"
namespace ctre {
namespace phoenix {
namespace tasking {
namespace schedulers {
ConcurrentScheduler::ConcurrentScheduler() {
}
ConcurrentScheduler::~ConcurrentScheduler() {
}
void ConcurrentScheduler::Add(ILoopable *aLoop, bool enable) {
_loops.push_back(aLoop);
_enabs.push_back(enable);
}
void ConcurrentScheduler::RemoveAll() {
_loops.clear();
_enabs.clear();
}
void ConcurrentScheduler::Start(ILoopable* toStart) {
for (int i = 0; i < (int) _loops.size(); ++i) {
ILoopable* lp = (ILoopable*) _loops[i];
if (lp == toStart) {
_enabs[i] = true;
lp->OnStart();
return;
}
}
}
void ConcurrentScheduler::Stop(ILoopable* toStop) {
for (int i = 0; i < (int) _loops.size(); ++i) {
ILoopable* lp = (ILoopable*) _loops[i];
if (lp == toStop) {
_enabs[i] = false;
lp->OnStop();
return;
}
}
}
void ConcurrentScheduler::StartAll() { //All Loops
for (auto loop : _loops) {
loop->OnStart();
}
for (auto enable : _enabs) {
enable = true;
}
}
void ConcurrentScheduler::StopAll() { //All Loops
for (auto loop : _loops) {
loop->OnStop();
}
for (auto enable : _enabs) {
enable = false;
}
}
void ConcurrentScheduler::Process() {
for (int i = 0; i < (int) _loops.size(); ++i) {
ILoopable* loop = (ILoopable*) _loops[i];
bool en = (bool) _enabs[i];
if (en) {
loop->OnLoop();
} else {
/* Current ILoopable is turned off, don't call OnLoop for it */
}
}
}
/* ILoopable */
void ConcurrentScheduler::OnStart() {
ConcurrentScheduler::StartAll();
}
void ConcurrentScheduler::OnLoop() {
ConcurrentScheduler::Process();
}
void ConcurrentScheduler::OnStop() {
ConcurrentScheduler::StopAll();
}
bool ConcurrentScheduler::IsDone() {
return false;
}
} // namespace schedulers
} // namespace tasking
} // namespace phoenix
} // namespace ctre