00001
00002
00003 #ifndef _RTC_H
00004 #define _RTC_H
00005
00006 #include <pthread.h>
00007 #include "pseudosem.h"
00008 #include <list>
00009
00010 namespace FD {
00011
00012 class RTCTimer;
00013
00014 class RTCUser {
00015 pseudosem_t sem;
00016 float period;
00017 float next;
00018 public:
00019 RTCUser(float p) : period(p) , next(p) {pseudosem_init(&sem,0,0);}
00020 ~RTCUser() {pseudosem_destroy(&sem);}
00021 void wait() {pseudosem_wait(&sem);}
00022 void wait(float d) {set(d); pseudosem_wait(&sem);}
00023 protected:
00024 bool dec(float t) {next-=t;if (next>0) return false; else {next+=period;return true;}}
00025 void set(float d) {next=d;}
00026 void interrupt(float time) {while (dec(time)) {pseudosem_post(&sem);}}
00027 friend class RTCTimer;
00028 };
00029
00030 class RTCTimer {
00031 int fd;
00032 pthread_t thread;
00033 pthread_mutex_t lock;
00034 std::list<RTCUser *> users;
00035 bool exit_status;
00036 int freq;
00037 float dt;
00038 public:
00039 static RTCUser *create(float delay);
00040 static void destroy(RTCUser *u);
00041
00042
00043 RTCTimer();
00044 ~RTCTimer();
00045 static RTCTimer &instance();
00046 void runThread();
00047 friend class RTCUser;
00048 };
00049
00050 }
00051 #endif