queue.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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) queue_state->current->start(app_state);
  22. queue_state->start = furi_get_tick();
  23. } else {
  24. queue_state->running = false;
  25. }
  26. }
  27. void queue_clear(QueueState* queue_state) {
  28. queue_state->running = false;
  29. QueueItem* curr = queue_state->current;
  30. while(curr != NULL) {
  31. QueueItem* f = curr;
  32. curr = curr->next;
  33. free(f);
  34. }
  35. }
  36. void enqueue(
  37. QueueState* queue_state,
  38. void* app_state,
  39. void (*done)(void* state),
  40. void (*start)(void* state),
  41. void (*render)(const void* state, Canvas* const canvas),
  42. uint32_t duration) {
  43. QueueItem* next;
  44. if(queue_state->current == NULL) {
  45. queue_state->start = furi_get_tick();
  46. queue_state->current = malloc(sizeof(QueueItem));
  47. next = queue_state->current;
  48. if(next->start != NULL) next->start(app_state);
  49. } else {
  50. next = queue_state->current;
  51. while(next->next != NULL) {
  52. next = (QueueItem*)(next->next);
  53. }
  54. next->next = malloc(sizeof(QueueItem));
  55. next = next->next;
  56. }
  57. next->callback = done;
  58. next->render = render;
  59. next->start = start;
  60. next->duration = duration;
  61. next->next = NULL;
  62. }