73 lines
1.6 KiB
C
73 lines
1.6 KiB
C
#ifndef CORE_USB_UTILS_GE_QUEUE
|
|
#define CORE_USB_UTILS_GE_QUEUE
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
/**
|
|
* Generic Queue.
|
|
*/
|
|
typedef struct {
|
|
uint32_t writeIdx; ///< Next block to write
|
|
uint32_t readIdx; ///< Next block to read
|
|
uint32_t length; ///< Size of circular buffer
|
|
uint32_t elemSize; ///< Element size
|
|
uint8_t elements[]; ///< Array of packets
|
|
} Queue;
|
|
|
|
/**
|
|
* Create Queue.
|
|
* @param length length of circular buffer
|
|
* @param elemSize element size
|
|
* @param mem backing memory, should be DWORD-aligned!
|
|
* @return pointer to Queue instance OR NULL on failure
|
|
*/
|
|
Queue *q_create(uint32_t length, uint32_t elemSize, uint8_t *mem);
|
|
|
|
/**
|
|
* Create Queue based on storage type.
|
|
*/
|
|
#define Q_CREATE_T(length, T, mem) q_create((length), sizeof(T), (mem))
|
|
|
|
/**
|
|
* @brief Calculate required memory size for allocating a new queue fitting
|
|
* length elements of type T.
|
|
*/
|
|
#define Q_REQ_MEM_SIZE_T(length, T) (sizeof(Queue) + (length * sizeof(T)))
|
|
|
|
/**
|
|
* Clear circular buffer.
|
|
* @param q pointer to Queue
|
|
*/
|
|
void q_clear(Queue *q);
|
|
|
|
/**
|
|
* Get number of available elements.
|
|
* @param q pointer to Queue
|
|
* @return number of available elements
|
|
*/
|
|
uint32_t q_avail(const Queue *q);
|
|
|
|
/**
|
|
* Push element to the Queue.
|
|
* @param q pointer to Queue
|
|
* @param raw pointer to raw packet
|
|
* @return true on success, false on failure (e.g.: queue full)
|
|
*/
|
|
bool q_push(Queue *q, const void *src);
|
|
|
|
/**
|
|
* Get top element.
|
|
* @param q pointer to Queue
|
|
* @return top element (COPY, NOT POINTER!)
|
|
*/
|
|
void q_top(Queue *q, void *dest);
|
|
|
|
/**
|
|
* Pop top element.
|
|
* @param q pointer to Queue
|
|
*/
|
|
void q_pop(Queue *q);
|
|
|
|
#endif /* CORE_USB_UTILS_GE_QUEUE */
|