#include "Thread.h"
#include "ThreadController.h"
template
ThreadController::ThreadController(long _interval): Thread(){
cached_size = 0;
clear();
this->setInterval(_interval);
#ifdef USE_THREAD_NAMES
// Overrides name
ThreadName = "ThreadController ";
ThreadName = ThreadName + ThreadID;
#endif
}
/*
ThreadController run()
*/
template
void ThreadController::run(){
if(this->_callbackArgumentSet){
// Run this thread before
if(this->_onRunArg != NULL)
this->_onRunArg(this->_callbackArgument);
}else{
// Run this thread before
if(this->_onRun != NULL)
this->_onRun();
}
long time = millis();
int checks = 0;
for(int i = 0; i < MAX_THREADS && checks <= cached_size; i++){
// Object exists? Is enabled? Timeout exceeded?
if(thread[i]){
checks++;
if(thread[i]->shouldRun(time)){
thread[i]->run();
}
}
}
// ThreadController extends Thread, so we should flag as hasRun thread
this->hasRun();
}
/*
List controller (boring part)
*/
template
bool ThreadController::add(Thread* _thread){
// Check if the Thread already exists on the array
for(int i = 0; i < MAX_THREADS; i++){
if(thread[i] != NULL && thread[i]->ThreadID == _thread->ThreadID)
return true;
}
// Find an empty slot
for(int i = 0; i < MAX_THREADS; i++){
if(!thread[i]){
// Found a empty slot, now add Thread
thread[i] = _thread;
cached_size++;
return true;
}
}
// Array is full
return false;
}
template
void ThreadController::remove(int id){
// Find Threads with the id, and removes
bool found = false;
for(int i = 0; i < MAX_THREADS; i++){
if(thread[i]->ThreadID == id){
thread[i] = NULL;
cached_size--;
return;
}
}
}
template
void ThreadController::remove(Thread* _thread){
remove(_thread->ThreadID);
}
template
void ThreadController::clear(){
for(int i = 0; i < MAX_THREADS; i++){
thread[i] = NULL;
}
cached_size = 0;
}
template
int ThreadController::size(bool cached){
if(cached)
return cached_size;
int size = 0;
for(int i = 0; i < MAX_THREADS; i++){
if(thread[i])
size++;
}
cached_size = size;
return cached_size;
}
template
Thread* ThreadController::get(int index){
int pos = -1;
for(int i = 0; i < MAX_THREADS; i++){
if(thread[i] != NULL){
pos++;
if(pos == index)
return thread[i];
}
}
return NULL;
}