//---------------------------------------------------------------------------
#include "circbuf.h"
//---------------------------------------------------------------------------
CIRCULAR_BUFFER CircBuf;
//---------------------------------------------------------------------------
//Сколько в буфере
UINT CircBufGetCount(void)
{
	UINT ret;
	if(CircBuf.InPtr==CircBuf.OutPtr)ret=0;
	else
	{
		if(CircBuf.InPtr>CircBuf.OutPtr)ret=CircBuf.InPtr-CircBuf.OutPtr;
		else ret=CIRC_BUF_SIZE-(CircBuf.OutPtr-CircBuf.InPtr);
	}
	return ret;
}
//---------------------------------------------------------------------------
//Сколько в буфере свободно
UINT CircBufGetCountFree(void)
{
	return CIRC_BUF_SIZE-CircBufGetCount()-1;
}
//---------------------------------------------------------------------------
bool CircBufPut(char byte)
{
	if(CircBufGetCount()==(CIRC_BUF_SIZE-1))
	{
    	//Буфер заполнен
		return false;
	}
	//Поместить в буфер
	CircBuf.Data[CircBuf.InPtr++]=byte;
	if(CircBuf.InPtr==CIRC_BUF_SIZE)CircBuf.InPtr=0;
	return true;
}
//---------------------------------------------------------------------------
bool CircBufWrite(char * ptr,UINT len)
{
	while(len--)
	{
		if(!CircBufPut(*ptr++))return false;
	}
	return true;
}
//---------------------------------------------------------------------------
bool CircBufGet(char * byte)
{
	if(CircBuf.InPtr==CircBuf.OutPtr)
	{
		return false;
	}
	*byte=CircBuf.Data[CircBuf.OutPtr++];
	if(CircBuf.OutPtr==CIRC_BUF_SIZE)CircBuf.OutPtr=0;
	return true;
}
//---------------------------------------------------------------------------
void CircBufClear(void)
{
	CircBuf.InPtr=CircBuf.OutPtr=0;
}
//---------------------------------------------------------------------------
