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 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
00155 u32 currentAlarmNumber() { return currentAlarmIndex; }
00156
00157 int runDueEvents(int maxEvents, u32 deadline) ;
00158
00159 int runPriorityEvents(int maxEvents, u32 priorityAtLeast) ;
00160
00170 bool canCreate() ;
00171
00172 u32 created() {
00173 return alarms;
00174 }
00175
00176 bool canAdd() ;
00177
00178 bool canRemove() ;
00179
00180 u32 count() { return used; }
00181
00182 bool inUse(u32 alarmIndex) {
00183 return alarmIndex <= alarms
00184 && idxs[alarmIndex] > 0;
00185 }
00186
00191 u32 getTopTime() {
00192 return times[slots[1]];
00193 }
00194
00195 int getUsed() {
00196 return used;
00197 }
00198 private:
00199
00204 void removeAndRunTop() ;
00205
00206 void deleteElt(int eltIdx);
00207
00208 u32 times[MAX_EVENTS];
00209 SFBAlarmArgHandler handlers[MAX_EVENTS];
00210 void * args[MAX_EVENTS];
00211 SFBAlarmIndexType slots[MAX_EVENTS];
00212 SFBAlarmIndexType idxs[MAX_EVENTS];
00213 SFBAlarmIndexType used;
00214 SFBAlarmIndexType alarms;
00215 SFBAlarmIndexType currentAlarmIndex;
00216
00217 void bubbleUp(int fromIndex);
00218 void bubbleDown(int fromIndex);
00219
00220 #ifdef TEST_SFBALARM
00221 friend void heapcheck(int) ;
00222 friend void runRandoms() ;
00223 #endif
00224
00225 };
00226
00230 extern SFBAlarm Alarms;
00231
00232 #endif