mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-04-30 04:19:59 -07:00
66 lines
2.0 KiB
C
66 lines
2.0 KiB
C
#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;
|
|
} |