#include #include "data.h"; #include "event.h"; event *events; void initEvents(void) { events = NULL; } event *createEvent(char (*callback) (word counter)) { event *myEvent; myEvent = (event *) malloc(sizeof(event)); myEvent->VBlankCount = 0; myEvent->callback = callback; myEvent->nextEvent = NULL; myEvent->previousEvent = NULL; return myEvent; } event *addEvent(char (*callback) (word counter), int noDuplicateCallback) { event *lastEvent; event *myEvent; if (events == NULL) { events = createEvent(callback); return events; } else { lastEvent = events; // TODO optimise this with noduplicate while (lastEvent->nextEvent != NULL) { if (noDuplicateCallback == 1 && lastEvent->callback == *callback) { return NULL; } lastEvent = lastEvent->nextEvent; } if (noDuplicateCallback == 1 && lastEvent->callback == *callback) { return NULL; } myEvent = createEvent(callback); myEvent->previousEvent = lastEvent; lastEvent->nextEvent = myEvent; return myEvent; } } void removeEvent(event * eventElement) { byte alone = 0; event *next, *previous; next = eventElement->nextEvent; previous = eventElement->previousEvent; if (eventElement->nextEvent != NULL && eventElement->previousEvent != NULL) { alone++; next->previousEvent = previous; previous->nextEvent = next; } else if (eventElement->nextEvent != NULL) { alone++; next->previousEvent = NULL; events = next; } else if (eventElement->previousEvent != NULL) { alone++; previous->nextEvent = NULL; } free(eventElement); if (alone == 0) { events = NULL; } } void processEvents(void) { event *currentEvent; char returnValue; currentEvent = events; while (currentEvent != NULL) { returnValue = currentEvent->callback(currentEvent->VBlankCount); if (returnValue == EVENT_CONTINUE) { currentEvent->VBlankCount++; } else { removeEvent(currentEvent); } currentEvent = currentEvent->nextEvent; } }