#ifndef CORE_USB_UTILS_GE_QUEUE #define CORE_USB_UTILS_GE_QUEUE #include #include /** * 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 */