| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- /**
- *****************************************************************************
- * @file zf_buffer.c
- * @author Zorb
- * @version V1.0.0
- * @date 2018-06-28
- * @brief 环形缓冲器的实现
- *****************************************************************************
- * @history
- *
- * 1. Date:2018-06-28
- * Author:Zorb
- * Modification:建立文件
- *
- *****************************************************************************
- */
- #include "zf_buffer.h"
- #include "zf_assert.h"
- #include "zf_malloc.h"
- #include "zf_debug.h"
- /******************************************************************************
- * 描述 :创建环形缓冲器(内部分配空间,size=0表示使用外部数据)
- * 参数 :(out)-ppRb 环形缓冲器结构体指针的指针
- * (in)-size 缓冲器大小
- * (out)-ppBuf 缓冲器空间指针的指针
- * 返回 :无
- ******************************************************************************/
- bool RB_create(RingBuffer **ppRb, uint32_t size)
- {
- RingBuffer *pRb;
- uint8_t *pBuf;
-
- ZF_ASSERT(ppRb != (RingBuffer **)0)
-
- pRb = (RingBuffer *)ZF_MALLOC(sizeof(RingBuffer));
- if (pRb == NULL)
- {
- ZF_DEBUG(LOG_E, "malloc ringbuffer space error\r\n");
- return false;
- }
-
- pRb->Head = (uint32_t)0;
- pRb->Trail = (uint32_t)0;
- pRb->Count = 0;
-
- if (size > 0)
- {
- pBuf = (void *)ZF_MALLOC(size);
- if (pBuf == NULL)
- {
- ZF_DEBUG(LOG_E, "malloc ringbuffer buffer space error\r\n");
- return false;
- }
-
- pRb->pBuf = pBuf;
- pRb->Size = size;
- pRb->IsExternBuffer = false;
- }
- else
- {
- pRb->pBuf = NULL;
- pRb->Size = 0;
- pRb->IsExternBuffer = true;
- }
-
- /* 初始化方法 */
- pRb->IsFull = RB_isFull;
- pRb->IsEmpty = RB_isEmpty;
- pRb->SaveByte = RB_saveByte;
- pRb->SaveRange = RB_saveRange;
- pRb->GetByte = RB_getByte;
- pRb->GetCount = RB_getCount;
- pRb->ReadBytes = RB_readBytes;
- pRb->DropBytes = RB_dropBytes;
- pRb->Clear = RB_clear;
- pRb->Dispose = RB_dispose;
-
- /* 输出 */
- *ppRb = pRb;
-
- return true;
- }
- /******************************************************************************
- * 描述 :缓冲器是否已满
- * 参数 :(in)-pRb 环形缓冲器结构体指针
- * 返回 :-true 已满
- * -false 未满
- ******************************************************************************/
- bool RB_isFull(RingBuffer * const pRb)
- {
- bool res = false;
-
- ZF_ASSERT(pRb != (RingBuffer *)0)
-
- if (pRb->Size == pRb->Count)
- {
- res = true;
- }
-
- return res;
- }
- /******************************************************************************
- * 描述 :缓冲器是否空
- * 参数 :(in)-pRb 环形缓冲器结构体指针
- * 返回 :-true 空
- * -false 未空
- ******************************************************************************/
- bool RB_isEmpty(RingBuffer * const pRb)
- {
- bool res = false;
-
- ZF_ASSERT(pRb != (RingBuffer *)0)
-
- if (pRb->Count == 0)
- {
- res = true;
- }
-
- return res;
- }
- /******************************************************************************
- * 描述 :压入一个字节
- * 参数 :(in)-pRb 环形缓冲器结构体指针
- * (in)-byte 要压入的字节
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool RB_saveByte(RingBuffer * const pRb, uint8_t byte)
- {
- bool res = false;
-
- ZF_ASSERT(pRb != (RingBuffer *)0)
- ZF_ASSERT(pRb->pBuf != (uint8_t *)0)
-
- if (!RB_isFull(pRb))
- {
- pRb->pBuf[pRb->Trail++] = byte;
- pRb->Trail %= pRb->Size;
- pRb->Count++;
-
- res = true;
- }
-
- return res;
- }
- /******************************************************************************
- * 描述 :压入n个字节的数据
- * 参数 :(in)-pRb 环形缓冲器结构体指针
- * (in)-pData 要压入的数据的指针
- * (in)-len 要压入的数据的长度
- * 返回 :压入的数量
- ******************************************************************************/
- uint32_t RB_saveRange(RingBuffer * const pRb, uint8_t *pArray, uint32_t n)
- {
- uint32_t res = 0;
-
- if (pArray == 0)
- {
- return res;
- }
-
- ZF_ASSERT(pRb != (RingBuffer *)0)
- ZF_ASSERT(pRb->pBuf != (uint8_t *)0)
- ZF_ASSERT(pArray != (uint8_t *)0)
-
- uint32_t i;
-
- for (i = 0; i < n; i++)
- {
- pRb->pBuf[pRb->Trail++] = *(pArray + i);
- pRb->Trail %= pRb->Size;
- pRb->Count++;
-
- res++;
-
- if (pRb->Count >= pRb->Size)
- {
- break;
- }
- }
-
- return res;
- }
- /******************************************************************************
- * 描述 :取出一个字节
- * 参数 :(in)-pRb 环形缓冲器结构体指针
- * (out)-pByte 存放取出字节的地址
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool RB_getByte(RingBuffer * const pRb, uint8_t *pByte)
- {
- bool res = false;
-
- ZF_ASSERT(pRb != (RingBuffer *)0)
- ZF_ASSERT(pRb->pBuf != (uint8_t *)0)
- ZF_ASSERT(pByte != (uint8_t *)0)
-
- if (!RB_isEmpty(pRb))
- {
- *pByte = pRb->pBuf[pRb->Head++];
- pRb->Head %= pRb->Size;
- pRb->Count--;
-
- res = true;
- }
-
- return res;
- }
- /******************************************************************************
- * 描述 :读取缓冲器已使用字节个数
- * 参数 :(in)-pRb 环形缓冲器结构体指针
- * 返回 :已使用字节个数
- ******************************************************************************/
- uint32_t RB_getCount(RingBuffer * const pRb)
- {
- ZF_ASSERT(pRb != (RingBuffer *)0)
-
- return pRb->Count;
- }
- /******************************************************************************
- * 描述 :读取n个字节(n超过最大数据数时全部读出)
- * 参数 :(in)-pRb 环形缓冲器结构体指针
- * (out)-pArray 存放取出字节的地址
- * (in)-n 要读取的字节个数
- * 返回 :实际读取的字节个数
- ******************************************************************************/
- uint32_t RB_readBytes(RingBuffer * const pRb, uint8_t *pArray, uint32_t n)
- {
- uint32_t len;
- uint32_t i, index;
-
- ZF_ASSERT(pRb != (RingBuffer *)0)
- ZF_ASSERT(pRb->pBuf != (uint8_t *)0)
- ZF_ASSERT(pArray != (uint8_t *)0)
-
- if (!RB_isEmpty(pRb))
- {
- len = RB_getCount(pRb);
-
- if (len > n)
- {
- len = n;
- }
-
- for(i = 0; i < len; i++)
- {
- index = (pRb->Head + i) % pRb->Size;
- *(pArray + i) = pRb->pBuf[index];
- }
-
- return len;
- }
-
- return 0;
- }
- /******************************************************************************
- * 描述 :丢弃n个字节(n超过最大数据数时全部丢弃)
- * 参数 :(in)-pRb 环形缓冲器结构体指针
- * (in)-n 要丢弃的字节个数
- * 返回 :实际丢弃的字节个数
- ******************************************************************************/
- uint32_t RB_dropBytes(RingBuffer * const pRb, uint32_t n)
- {
- uint32_t len;
-
- ZF_ASSERT(pRb != (RingBuffer *)0)
- ZF_ASSERT(pRb->pBuf != (uint8_t *)0)
-
- if (!RB_isEmpty(pRb))
- {
- len = RB_getCount(pRb);
-
- if (len > n)
- {
- len = n;
- }
-
- pRb->Head += len;
- pRb->Head %= pRb->Size;
- pRb->Count -= len;
-
- return len;
- }
-
- return 0;
- }
- /******************************************************************************
- * 描述 :清空缓冲器
- * 参数 :(in)-pRb 环形缓冲器结构体指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool RB_clear(RingBuffer * const pRb)
- {
- bool res = false;
-
- ZF_ASSERT(pRb != (RingBuffer *)0)
-
- pRb->Head = (uint32_t)0;
- pRb->Trail = (uint32_t)0;
- pRb->Count = 0;
-
- res = true;
-
- return res;
- }
- /******************************************************************************
- * 描述 :释放缓冲器(不释放外部创建的缓冲区)
- * 参数 :(in)-pRb 环形缓冲器结构体指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool RB_dispose(RingBuffer * const pRb)
- {
- ZF_ASSERT(pRb != (RingBuffer *)0)
-
- /* 外部创建的缓冲区不释放 */
- if (!pRb->IsExternBuffer)
- {
- ZF_FREE(pRb->pBuf);
- }
-
- ZF_FREE(pRb);
-
- return true;
- }
- /******************************** END OF FILE ********************************/
|