queue.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #pragma once
  2. #include <gui/gui.h>
  3. #include <furi.h>
  4. typedef struct {
  5. void (*callback)(void* state); //Callback for when the item is dequeued
  6. void (*render)(
  7. const void* state,
  8. Canvas* const canvas); //Callback for the rendering loop while this item is running
  9. void (*start)(void* state); //Callback when this item is started running
  10. void* next; //Pointer to the next item
  11. uint32_t duration; //duration of the item
  12. } QueueItem;
  13. typedef struct {
  14. unsigned int start; //current queue item start time
  15. QueueItem* current; //current queue item
  16. bool running; //is the queue running
  17. } QueueState;
  18. /**
  19. * Enqueue a new item.
  20. *
  21. * @param queue_state The queue state pointer
  22. * @param app_state Your app state
  23. * @param done Callback for dequeue event
  24. * @param start Callback for when the item is activated
  25. * @param render Callback to render loop if needed
  26. * @param duration Length of the item
  27. */
  28. void enqueue(
  29. QueueState* queue_state,
  30. void* app_state,
  31. void (*done)(void* state),
  32. void (*start)(void* state),
  33. void (*render)(const void* state, Canvas* const canvas),
  34. uint32_t duration);
  35. /**
  36. * Clears all queue items
  37. *
  38. * @param queue_state The queue state pointer
  39. */
  40. void queue_clear(QueueState* queue_state);
  41. /**
  42. * Dequeues the active queue item. Usually you don't need to call it directly.
  43. *
  44. * @param queue_state The queue state pointer
  45. * @param app_state Your application state
  46. */
  47. void dequeue(QueueState* queue_state, void* app_state);
  48. /**
  49. * Runs the queue logic (place it in your tick function)
  50. *
  51. * @param queue_state The queue state pointer
  52. * @param app_state Your application state
  53. * @return FALSE when there is nothing to run, TRUE otherwise
  54. */
  55. bool run_queue(QueueState* queue_state, void* app_state);
  56. /**
  57. * Calls the currently active queue items render callback (if there is any)
  58. *
  59. * @param queue_state The queue state pointer
  60. * @param app_state Your application state
  61. * @param canvas Pointer to Flipper's canvas object
  62. */
  63. void render_queue(const QueueState* queue_state, const void* app_state, Canvas* const canvas);