18 #define _VQ_HEADER_SIZE 2
21 #define _VQ_B(VQ_PTR, POS, OFFSET) \
22 (VQ_PTR->mem[( POS + OFFSET ) % VQ_PTR->size])
29 if (
vqFree(vq) < length)
return false;
31 _VQ_B(vq, vq->
write, 0) = 0xFF & ( length >> 8 );
32 _VQ_B(vq, vq->
write, 1) = 0xFF & length;
35 if (vq->
write + length < vq->size) {
37 memcpy(vq->
mem + vq->
write, buffer, length);
41 memcpy(vq->
mem + vq->
write, buffer, l1);
42 memcpy(vq->
mem, buffer + l1, length - l1);
45 vq->
used += length + 2;
56 if (vq->
used == 0)
return false;
60 if (lenQ > *length)
return false;
65 if (vq->
read + lenQ < vq->size)
68 memcpy(buffer, vq->
mem + vq->
read, lenQ);
73 memcpy(buffer, vq->
mem + vq->
read, l1);
74 memcpy(buffer + l1, vq->
mem, lenQ - l1);
84 bool vqPeekQueue(
VarQueue *
const vq, uint16_t * length, uint8_t * buffer)
86 uint16_t rp = vq->
read;
87 uint16_t us = vq->
used;
101 if (l == 0)
return false;
110 if (vq->
used == 0)
return 0;
111 return _VQ_B(vq, vq->
read, 0) << 8 | _VQ_B(vq, vq->
read, 1);
117 if (x < _VQ_HEADER_SIZE)
return 0;
118 return x - _VQ_HEADER_SIZE;
A variable length queue implementation.
bool vqDeQueue(VarQueue *const vq, uint16_t *length, uint8_t *buffer)
DeQueues an element from the queue.
bool vqQueue(VarQueue *const vq, uint16_t length, uint8_t *buffer)
Queues an element on the queue.
uint8_t *const mem
Pointer to memory.
Variable length queue structure.
uint16_t vqDeQueueLength(VarQueue *const vq)
Returns the lenght of the next element to dequeue.
const uint16_t size
Size of the memory.
uint16_t vqFree(VarQueue *const vq)
Returns the number of bytes free for the next element.
uint16_t write
write index
bool vqRemove(VarQueue *const vq)
Removes the first element from the queue (not the last).