SFBAlarm.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00027 #ifndef SFBALARM_H_
00028 #define SFBALARM_H_
00029
00030 #include "SFBTypes.h"
00031 #include "SFBWiring.h"
00032
00037 typedef void (*SFBAlarmHandler)(u32 when);
00038
00043 typedef void (*SFBAlarmArgHandler)(u32 when, void *arg);
00044
00045 #ifndef SFBALARM_QUEUE_SIZE
00046 #define SFBALARM_QUEUE_SIZE 51
00047
00048 #endif
00049
00050 #if SFBALARM_QUEUE_SIZE < 256
00051 typedef u8 SFBAlarmIndexType;
00052 #else
00053 #if SFBALARM_QUEUE_SIZE < 65536
00054 typedef u16 SFBAlarmIndexType;
00055 #else
00056 typedef u32 SFBAlarmIndexType;
00057 #endif
00058 #endif
00059
00063 extern class SFBAlarm {
00064 enum { MAX_EVENTS = SFBALARM_QUEUE_SIZE };
00065 public:
00066
00067 SFBAlarm() ;
00068
00081 u32 create(SFBAlarmHandler handler) ;
00082
00098 u32 create(SFBAlarmArgHandler handler, void * arg) ;
00099
00100 void update(u32 alarmNumber, SFBAlarmHandler handler) {
00101 update(alarmNumber,(SFBAlarmArgHandler) handler, (void*) 0);
00102 }
00103
00104 void update(u32 alarmNumber, SFBAlarmArgHandler handler, void * arg);
00105
00121 u32 get(u32 alarmNumber) ;
00122
00135 bool set(u32 alarmNumber, u32 when) ;
00136
00147 bool cancel(u32 alarmNumber) ;
00148
00149 u32 currentAlarmNumber() { return currentAlarmIndex; }
00150
00151 int runDueEvents(int maxEvents, u32 deadline) ;
00152
00153 int runPriorityEvents(int maxEvents, u32 priorityAtLeast) ;
00154
00164 bool canCreate() ;
00165
00166 u32 created() {
00167 return alarms;
00168 }
00169
00170 bool canAdd() ;
00171
00172 bool canRemove() ;
00173
00174 u32 count() { return used; }
00175
00176 bool inUse(u32 alarmIndex) {
00177 return alarmIndex <= alarms
00178 && idxs[alarmIndex] > 0;
00179 }
00180
00185 u32 getTopTime() {
00186 return times[slots[1]];
00187 }
00188
00189 int getUsed() {
00190 return used;
00191 }
00192 private:
00193
00198 void removeAndRunTop() ;
00199
00200 void deleteElt(int eltIdx);
00201
00202 u32 times[MAX_EVENTS];
00203 SFBAlarmArgHandler handlers[MAX_EVENTS];
00204 void * args[MAX_EVENTS];
00205 SFBAlarmIndexType slots[MAX_EVENTS];
00206 SFBAlarmIndexType idxs[MAX_EVENTS];
00207 SFBAlarmIndexType used;
00208 SFBAlarmIndexType alarms;
00209 SFBAlarmIndexType currentAlarmIndex;
00210
00211 void bubbleUp(int fromIndex);
00212 void bubbleDown(int fromIndex);
00213
00214 #ifdef TEST_SFBALARM
00215 friend void heapcheck(int) ;
00216 friend void runRandoms() ;
00217 #endif
00218
00219 } Alarms;
00220
00221 #endif