00001 // -*- C++ -*- 00020 #ifndef COIL_PERIODICTASKBASE_H 00021 #define COIL_PERIODICTASKBASE_H 00022 00023 #include <coil/TimeValue.h> 00024 #include <coil/TimeMeasure.h> 00025 #include <coil/Task.h> 00026 00027 namespace coil 00028 { 00029 class TaskFuncBase 00030 { 00031 public: 00032 virtual ~TaskFuncBase() {} 00033 virtual int operator()() = 0; 00034 }; 00035 00036 template <typename T, typename F = int (*)()> 00037 class TaskFunc 00038 : public TaskFuncBase 00039 { 00040 public: 00041 TaskFunc(T* obj, F func) 00042 : m_obj(obj), m_func(func) 00043 { 00044 } 00045 virtual ~TaskFunc() {} 00046 virtual int operator()() 00047 { 00048 return (m_obj->*m_func)(); 00049 } 00050 T* m_obj; 00051 F m_func; 00052 }; 00053 00054 class PeriodicTaskBase 00055 : public coil::Task 00056 { 00057 public: 00058 virtual ~PeriodicTaskBase(){}; 00059 00060 virtual void activate() = 0; 00061 virtual void finalize() = 0; 00062 virtual int suspend(void) = 0; 00063 virtual int resume(void) = 0; 00064 virtual void signal() = 0; 00065 virtual bool setTask(TaskFuncBase* func, bool delete_in_dtor = true) = 0; 00066 00067 template <class O, class F> 00068 bool setTask(O* obj, F fun) 00069 { 00070 return this->setTask(new TaskFunc<O, F>(obj, fun)); 00071 } 00072 virtual void setPeriod(double period) = 0; 00073 virtual void setPeriod(coil::TimeValue& period) = 0; 00074 virtual void executionMeasure(bool value) = 0; 00075 virtual void executionMeasureCount(int n) = 0; 00076 virtual void periodicMeasure(bool value) = 0; 00077 virtual void periodicMeasureCount(int n) = 0; 00078 virtual coil::TimeMeasure::Statistics getExecStat() = 0; 00079 virtual coil::TimeMeasure::Statistics getPeriodStat() = 0; 00080 }; 00081 }; // namespace coil 00082 00083 #endif // COIL_PERIODICTASKBASE_H