#include "queue.h" void render_queue(const QueueState *queue_state, const void *app_state, Canvas *const canvas) { if (queue_state->current != NULL && queue_state->current->render != NULL) ((QueueItem *) queue_state->current)->render(app_state, canvas); } bool run_queue(QueueState *queue_state, void *app_state) { if (queue_state->current != NULL) { queue_state->running = true; if ((furi_get_tick() - queue_state->start) >= queue_state->current->duration) dequeue(queue_state, app_state); return true; } return false; } void dequeue(QueueState *queue_state, void *app_state) { ((QueueItem *) queue_state->current)->callback(app_state); QueueItem *f = queue_state->current; queue_state->current = f->next; free(f); if (queue_state->current != NULL) { if (queue_state->current->start != NULL) queue_state->current->start(app_state); queue_state->start = furi_get_tick(); }else{ queue_state->running = false; } } void queue_clear(QueueState *queue_state) { queue_state->running = false; QueueItem *curr = queue_state->current; while (curr != NULL) { QueueItem *f = curr; curr = curr->next; free(f); } } 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) { QueueItem *next; if (queue_state->current == NULL) { queue_state->start = furi_get_tick(); queue_state->current = malloc(sizeof(QueueItem)); next = queue_state->current; if (next->start != NULL) next->start(app_state); } else { next = queue_state->current; while (next->next != NULL) { next = (QueueItem *) (next->next); } next->next = malloc(sizeof(QueueItem)); next = next->next; } next->callback = done; next->render = render; next->start = start; next->duration = duration; next->next = NULL; }