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
00115 class SFBAlarm {
00116 enum { MAX_EVENTS = SFBALARM_QUEUE_SIZE };
00117 public:
00118
00119 SFBAlarm() ;
00120
00137 u32 create(SFBAlarmHandler handler) ;
00138
00158 u32 create(SFBAlarmArgHandler handler, void * arg) ;
00159
00174 void update(u32 alarmNumber, SFBAlarmHandler handler) {
00175 update(alarmNumber,(SFBAlarmArgHandler) handler, (void*) 0);
00176 }
00177
00196 void update(u32 alarmNumber, SFBAlarmArgHandler handler, void * arg);
00197
00213 u32 get(u32 alarmNumber) ;
00214
00227 bool set(u32 alarmNumber, u32 when) ;
00228
00239 bool cancel(u32 alarmNumber) ;
00240
00248 u32 currentAlarmNumber() { return currentAlarmIndex; }
00249
00250 int runDueEvents(int maxEvents, u32 deadline) ;
00251
00252 int runPriorityEvents(int maxEvents, u32 priorityAtLeast) ;
00253
00263 bool canCreate() ;
00264
00268 u32 created() {
00269 return alarms;
00270 }
00271
00272 bool canAdd() ;
00274 bool canRemove() { return used > 0; }
00277 u32 count() { return used; }
00280 bool inUse(u32 alarmIndex) {
00281 return alarmIndex <= alarms
00282 && idxs[alarmIndex] > 0;
00283 }
00284
00288 u32 getTopTime() {
00289 return times[slots[1]];
00290 }
00291
00292 private:
00293
00294 int getUsed() {
00295 return used;
00296 }
00297
00301 void removeAndRunTop() ;
00302
00303 void deleteElt(int eltIdx);
00304
00305 u32 times[MAX_EVENTS];
00306 SFBAlarmArgHandler handlers[MAX_EVENTS];
00307 void * args[MAX_EVENTS];
00308 SFBAlarmIndexType slots[MAX_EVENTS];
00309 SFBAlarmIndexType idxs[MAX_EVENTS];
00310 SFBAlarmIndexType used;
00311 SFBAlarmIndexType alarms;
00312 SFBAlarmIndexType currentAlarmIndex;
00313
00314 void bubbleUp(int fromIndex);
00315 void bubbleDown(int fromIndex);
00316
00317 #ifdef TEST_SFBALARM
00318 friend void heapcheck(int) ;
00319 friend void runRandoms() ;
00320 #endif
00321
00322 };
00323
00327 extern SFBAlarm Alarms;
00328
00329 #endif