#pragma once #include #include typedef struct { void (*callback)(void *state); //Callback for when the item is dequeued void (*render)(const void *state, Canvas *const canvas); //Callback for the rendering loop while this item is running void (*start)(void *state); //Callback when this item is started running void *next; //Pointer to the next item uint32_t duration; //duration of the item } QueueItem; typedef struct { unsigned int start; //current queue item start time QueueItem *current; //current queue item bool running; //is the queue running } QueueState; /** * Enqueue a new item. * * @param queue_state The queue state pointer * @param app_state Your app state * @param done Callback for dequeue event * @param start Callback for when the item is activated * @param render Callback to render loop if needed * @param duration Length of the item */ void enqueue(QueueState *queue_state, void *app_state, void(*done)(void *state), void(*start)(void *state), void (*render)(const void *state, Canvas *const canvas), uint32_t duration); /** * Clears all queue items * * @param queue_state The queue state pointer */ void queue_clear(QueueState *queue_state); /** * Dequeues the active queue item. Usually you don't need to call it directly. * * @param queue_state The queue state pointer * @param app_state Your application state */ void dequeue(QueueState *queue_state, void *app_state); /** * Runs the queue logic (place it in your tick function) * * @param queue_state The queue state pointer * @param app_state Your application state * @return FALSE when there is nothing to run, TRUE otherwise */ bool run_queue(QueueState *queue_state, void *app_state); /** * Calls the currently active queue items render callback (if there is any) * * @param queue_state The queue state pointer * @param app_state Your application state * @param canvas Pointer to Flipper's canvas object */ void render_queue(const QueueState *queue_state, const void *app_state, Canvas *const canvas);