Solitaire

This commit is contained in:
RogueMaster
2022-11-17 23:39:43 -05:00
parent 7c09807aeb
commit 4b81d2f24d
16 changed files with 1868 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
#pragma once
#include <gui/gui.h>
#include <furi.h>
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);