event.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <stdlib.h>
  2. #include "data.h";
  3. #include "event.h";
  4. event *events;
  5. void initEvents(void) {
  6. events = NULL;
  7. }
  8. event *createEvent(char (*callback)(word counter)) {
  9. event *myEvent;
  10. myEvent = (event*) malloc(sizeof(event));
  11. myEvent->VBlankCount = 0;
  12. myEvent->callback = callback;
  13. myEvent->nextEvent = NULL;
  14. myEvent->previousEvent = NULL;
  15. return myEvent;
  16. }
  17. event* addEvent(char (*callback)(word counter), int noDuplicateCallback) {
  18. event *lastEvent;
  19. event *myEvent;
  20. if(events == NULL) {
  21. events = createEvent(callback);
  22. return events;
  23. } else {
  24. lastEvent = events;
  25. // TODO optimise this with noduplicate
  26. while(lastEvent->nextEvent != NULL) {
  27. if(noDuplicateCallback == 1 && lastEvent->callback == *callback) {
  28. return NULL;
  29. }
  30. lastEvent = lastEvent->nextEvent;
  31. }
  32. if(noDuplicateCallback == 1 && lastEvent->callback == *callback) {
  33. return NULL;
  34. }
  35. myEvent = createEvent(callback);
  36. myEvent->previousEvent = lastEvent;
  37. lastEvent->nextEvent = myEvent;
  38. return myEvent;
  39. }
  40. }
  41. void removeEvent(event *eventElement) {
  42. byte alone = 0;
  43. event *next, *previous;
  44. next = eventElement->nextEvent;
  45. previous = eventElement->previousEvent;
  46. if(eventElement->nextEvent != NULL && eventElement->previousEvent != NULL) {
  47. alone++;
  48. next->previousEvent = previous;
  49. previous->nextEvent = next;
  50. } else if(eventElement->nextEvent != NULL) {
  51. alone++;
  52. next->previousEvent = NULL;
  53. events = next;
  54. } else if(eventElement->previousEvent != NULL) {
  55. alone++;
  56. previous->nextEvent = NULL;
  57. }
  58. free(eventElement);
  59. if(alone == 0) {
  60. events = NULL;
  61. }
  62. }
  63. void processEvents(void) {
  64. event *currentEvent;
  65. char returnValue;
  66. currentEvent = events;
  67. while(currentEvent != NULL) {
  68. returnValue = currentEvent->callback(currentEvent->VBlankCount);
  69. if(returnValue == EVENT_CONTINUE) {
  70. currentEvent->VBlankCount++;
  71. } else {
  72. removeEvent(currentEvent);
  73. }
  74. currentEvent = currentEvent->nextEvent;
  75. }
  76. }