#include "Thread.h" #include "ThreadController.h" ThreadController::ThreadController(unsigned long _interval): Thread(){ cached_size = 0; clear(); setInterval(_interval); #ifdef USE_THREAD_NAMES // Overrides name ThreadName = "ThreadController "; ThreadName = ThreadName + ThreadID; #endif } /* ThreadController run() (cool stuf) */ void ThreadController::run(){ // Run this thread before if(_onRun != NULL) _onRun(); unsigned 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 runned thread runned(); } /* List controller (boring part) */ 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; } void ThreadController::remove(int id){ // Find Threads with the id, and removes for(int i = 0; i < MAX_THREADS; i++){ if(thread[i]->ThreadID == id){ thread[i] = NULL; cached_size--; return; } } } void ThreadController::remove(Thread* _thread){ remove(_thread->ThreadID); } void ThreadController::clear(){ for(int i = 0; i < MAX_THREADS; i++){ thread[i] = NULL; } cached_size = 0; } 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; } 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; }