queue.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "queue.h"
  2. void render_queue(const QueueState *queue_state, const void *app_state, Canvas *const canvas) {
  3. if (queue_state->current != NULL && queue_state->current->render != NULL)
  4. ((QueueItem *) queue_state->current)->render(app_state, canvas);
  5. }
  6. bool run_queue(QueueState *queue_state, void *app_state) {
  7. if (queue_state->current != NULL) {
  8. queue_state->running = true;
  9. if ((furi_get_tick() - queue_state->start) >= queue_state->current->duration)
  10. dequeue(queue_state, app_state);
  11. return true;
  12. }
  13. return false;
  14. }
  15. void dequeue(QueueState *queue_state, void *app_state) {
  16. ((QueueItem *) queue_state->current)->callback(app_state);
  17. QueueItem *f = queue_state->current;
  18. queue_state->current = f->next;
  19. free(f);
  20. if (queue_state->current != NULL) {
  21. if (queue_state->current->start != NULL)
  22. queue_state->current->start(app_state);
  23. queue_state->start = furi_get_tick();
  24. }else{
  25. queue_state->running = false;
  26. }
  27. }
  28. void queue_clear(QueueState *queue_state) {
  29. queue_state->running = false;
  30. QueueItem *curr = queue_state->current;
  31. while (curr != NULL) {
  32. QueueItem *f = curr;
  33. curr = curr->next;
  34. free(f);
  35. }
  36. }
  37. void enqueue(QueueState *queue_state, void *app_state,
  38. void(*done)(void *state), void(*start)(void *state),
  39. void (*render)(const void *state, Canvas *const canvas), uint32_t duration) {
  40. QueueItem *next;
  41. if (queue_state->current == NULL) {
  42. queue_state->start = furi_get_tick();
  43. queue_state->current = malloc(sizeof(QueueItem));
  44. next = queue_state->current;
  45. if (next->start != NULL)
  46. next->start(app_state);
  47. } else {
  48. next = queue_state->current;
  49. while (next->next != NULL) { next = (QueueItem *) (next->next); }
  50. next->next = malloc(sizeof(QueueItem));
  51. next = next->next;
  52. }
  53. next->callback = done;
  54. next->render = render;
  55. next->start = start;
  56. next->duration = duration;
  57. next->next = NULL;
  58. }