forked from Akcelerometry_drgania_WMT/PI_mikrokontroler
Initial commit: PI_mikrokontroler changes
This commit is contained in:
115
firmware_adxl345_spi/lib/ArduinoThread/ThreadController.cpp
Normal file
115
firmware_adxl345_spi/lib/ArduinoThread/ThreadController.cpp
Normal file
@@ -0,0 +1,115 @@
|
||||
#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
|
||||
bool found = false;
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user