You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.4 KiB
151 lines
4.4 KiB
/******************************************************************************
|
|
|
|
版权所有 (C), 2018-2099, Radkil_Std
|
|
|
|
******************************************************************************
|
|
文 件 名 : ringbuffer.h
|
|
版 本 号 : 初稿
|
|
作 者 : Radkil
|
|
生成日期 : 2023年3月26日
|
|
最近修改 :
|
|
功能描述 : ringbuffer.c 的头文件
|
|
|
|
修改历史 :
|
|
1.日 期 : 2023年3月26日
|
|
作 者 : Radkil
|
|
修改内容 : 创建文件
|
|
|
|
******************************************************************************/
|
|
|
|
/*----------------------------------------------*
|
|
* 外部变量说明 *
|
|
*----------------------------------------------*/
|
|
|
|
/*----------------------------------------------*
|
|
* 外部函数原型说明 *
|
|
*----------------------------------------------*/
|
|
|
|
/*----------------------------------------------*
|
|
* 内部函数原型说明 *
|
|
*----------------------------------------------*/
|
|
|
|
/*----------------------------------------------*
|
|
* 全局变量 *
|
|
*----------------------------------------------*/
|
|
|
|
/*----------------------------------------------*
|
|
* 模块级变量 *
|
|
*----------------------------------------------*/
|
|
|
|
/*----------------------------------------------*
|
|
* 常量定义 *
|
|
*----------------------------------------------*/
|
|
|
|
/*----------------------------------------------*
|
|
* 宏定义 *
|
|
*----------------------------------------------*/
|
|
|
|
#ifndef __RINGBUFFER_H__
|
|
#define __RINGBUFFER_H__
|
|
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
extern "C"{
|
|
#endif
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
/*==============================================*
|
|
* include header files *
|
|
*----------------------------------------------*/
|
|
#include <stddef.h>
|
|
#include "common.h"
|
|
|
|
|
|
/*==============================================*
|
|
* constants or macros define *
|
|
*----------------------------------------------*/
|
|
typedef struct TRingBuffer rd_ringbuf_t;
|
|
|
|
struct TRingBuffer
|
|
{
|
|
unsigned short m_bReadMirror : 1;
|
|
unsigned short m_sReadIndex : 15;
|
|
unsigned short m_bWriteMirror : 1;
|
|
unsigned short m_sWriteIndex : 15;
|
|
int m_iBufsize;
|
|
char *m_pcBufPtr;
|
|
};
|
|
|
|
enum ERingBufState
|
|
{
|
|
RINGBUFFER_EMPTY,
|
|
RINGBUFFER_FULL,
|
|
RINGBUFFER_HALFFULL,
|
|
};
|
|
|
|
int rd_RingbufferDataLen(rd_ringbuf_t *rb);
|
|
|
|
/**
|
|
* @brief Get the buffer size of the ring buffer object.
|
|
*
|
|
* @param rb A pointer to the ring buffer object.
|
|
*
|
|
* @return Buffer size.
|
|
*/
|
|
rd_inline int rd_RingbufferGetSize(rd_ringbuf_t *rb)
|
|
{
|
|
if(NULL == rb)
|
|
{
|
|
return -1;
|
|
}
|
|
return rb->m_iBufsize;
|
|
}
|
|
|
|
rd_inline enum ERingBufState rd_RingbufferStatus(rd_ringbuf_t *rb)
|
|
{
|
|
if (rb->m_sReadIndex == rb->m_sWriteIndex)
|
|
{
|
|
if (rb->m_bReadMirror == rb->m_bWriteMirror)
|
|
return RINGBUFFER_EMPTY;
|
|
else
|
|
return RINGBUFFER_FULL;
|
|
}
|
|
return RINGBUFFER_HALFFULL;
|
|
}
|
|
|
|
/** return the size of empty space in rb */
|
|
#define rd_RingbufferSpaceLen(rb) ((rb)->m_iBufsize - rd_RingbufferDataLen(rb))
|
|
|
|
/*==============================================*
|
|
* project-wide global variables *
|
|
*----------------------------------------------*/
|
|
|
|
|
|
|
|
/*==============================================*
|
|
* routines' or functions' implementations *
|
|
*----------------------------------------------*/
|
|
|
|
extern rd_ringbuf_t *rd_RingbufferCreate(int size);
|
|
extern int rd_RingbufferDataLen(rd_ringbuf_t *rb);
|
|
extern void rd_RingbufferDestroy(rd_ringbuf_t *rb);
|
|
extern int rd_RingbufferGet(rd_ringbuf_t *rb, char *ptr, int length);
|
|
extern int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch);
|
|
extern void rd_RingbufferInit(rd_ringbuf_t *rb, char *pool, int size);
|
|
extern int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr);
|
|
extern int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length);
|
|
extern int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch);
|
|
extern int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch);
|
|
extern int rd_RingbufferPutForce(rd_ringbuf_t *rb, const char *ptr, int length);
|
|
extern void rd_RingbufferReset(rd_ringbuf_t *rb);
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
#endif /* __RINGBUFFER_H__ */
|
|
|