event.c 2.2 KB

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