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