* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************** */
/* Header includes -----------------------------------------------------------*/ #include"RingBuffer.h" #include #include
/* Macro definitions ---------------------------------------------------------*/ /* Type definitions ----------------------------------------------------------*/ /* Variable declarations -----------------------------------------------------*/ /* Variable definitions ------------------------------------------------------*/ /* Function declarations -----------------------------------------------------*/ /* Function definitions ------------------------------------------------------*/
* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************** */
#ifndef __RINGBUFFER_H #define __RINGBUFFER_H
#ifdef __cplusplus extern"C" { #endif
/* Header includes -----------------------------------------------------------*/ #include #include
/* Function definitions ------------------------------------------------------*/
/** * @brief Removes the entire FIFO contents. * @param [in] fifo: The fifo to be emptied. * @return None. */ staticinlinevoidRingBuffer_Reset(RingBuffer *fifo) { fifo->in = fifo->out = 0; }
/** * @brief Returns the size of the FIFO in bytes. * @param [in] fifo: The fifo to be used. * @return The size of the FIFO. */ staticinlineuint32_tRingBuffer_Size(RingBuffer *fifo) { return fifo->size; }
/** * @brief Returns the number of used bytes in the FIFO. * @param [in] fifo: The fifo to be used. * @return The number of used bytes. */ staticinlineuint32_tRingBuffer_Len(RingBuffer *fifo) { return fifo->in - fifo->out; }
/** * @brief Returns the number of bytes available in the FIFO. * @param [in] fifo: The fifo to be used. * @return The number of bytes available. */ staticinlineuint32_tRingBuffer_Avail(RingBuffer *fifo) { return RingBuffer_Size(fifo) - RingBuffer_Len(fifo); }
/** * @brief Is the FIFO empty? * @param [in] fifo: The fifo to be used. * @retval true: Yes. * @retval false: No. */ staticinlineboolRingBuffer_IsEmpty(RingBuffer *fifo) { return RingBuffer_Len(fifo) == 0; }
/** * @brief Is the FIFO full? * @param [in] fifo: The fifo to be used. * @retval true: Yes. * @retval false: No. */ staticinlineboolRingBuffer_IsFull(RingBuffer *fifo) { return RingBuffer_Avail(fifo) == 0; }
* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************** */
/* Header includes -----------------------------------------------------------*/ #include"RingBuffer.h" #include #include
/* Function definitions ------------------------------------------------------*/
/** * @brief Allocates a new FIFO and its internal buffer. * @param [in] size: The size of the internal buffer to be allocated. * @note The size will be rounded-up to a power of 2. * @return RingBuffer pointer. */ RingBuffer *RingBuffer_Malloc(uint32_t size) { RingBuffer *fifo = RING_BUFFER_MALLOC(sizeof(RingBuffer));
/** * @brief Frees the FIFO. * @param [in] fifo: The fifo to be freed. * @return None. */ voidRingBuffer_Free(RingBuffer *fifo) { RING_BUFFER_FREE(fifo->buffer); RING_BUFFER_FREE(fifo); fifo = NULL; }
/** * @brief Puts some data into the FIFO. * @param [in] fifo: The fifo to be used. * @param [in] in: The data to be added. * @param [in] len: The length of the data to be added. * @return The number of bytes copied. * @note This function copies at most @len bytes from the @in into * the FIFO depending on the free space, and returns the number * of bytes copied. */ uint32_tRingBuffer_In(RingBuffer *fifo, void *in, uint32_t len) { len = min(len, RingBuffer_Avail(fifo));
/* First put the data starting from fifo->in to buffer end. */ uint32_t l = min(len, fifo->size - (fifo->in & (fifo->size - 1))); memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), in, l);
/* Then put the rest (if any) at the beginning of the buffer. */ memcpy(fifo->buffer, (uint8_t *)in + l, len - l);
fifo->in += len;
return len; }
/** * @brief Gets some data from the FIFO. * @param [in] fifo: The fifo to be used. * @param [in] out: Where the data must be copied. * @param [in] len: The size of the destination buffer. * @return The number of copied bytes. * @note This function copies at most @len bytes from the FIFO into * the @out and returns the number of copied bytes. */ uint32_tRingBuffer_Out(RingBuffer *fifo, void *out, uint32_t len) { len = min(len, RingBuffer_Len(fifo));
/* First get the data from fifo->out until the end of the buffer. */ uint32_t l = min(len, fifo->size - (fifo->out & (fifo->size - 1))); memcpy(out, fifo->buffer + (fifo->out & (fifo->size - 1)), l);
/* Then get the rest (if any) from the beginning of the buffer. */ memcpy((uint8_t *)out + l, fifo->buffer, len - l);
fifo->out += len;
return len; }
/** * @brief Determine whether some value is a power of two. * @param [in] x: The number to be confirmed. * @retval true: Yes. * @retval false: No. * @note Where zero is not considered a power of two. */ staticboolis_power_of_2(uint32_t x) { return (x != 0) && ((x & (x - 1)) == 0); }
/** * @brief Round the given value up to nearest power of two. * @param [in] x: The number to be converted. * @return The power of two. */ staticuint32_troundup_pow_of_two(uint32_t x) { uint32_t b = 0;