| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #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;
- }
|