📄 obj_sbuffer.c
字号:
//*----------------------------------------------------------------------------
//* ATMEL Microcontroller Software Support - ROUSSET -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name : obj_sbuffer.c
//* Object : SimpleBuffer implementation (specialization of SBuffer)
//*
//* 1.0 23/03/01 : HI Creation
//* 1.0 20/06/01 : ODi Adaptation for DFU
//*----------------------------------------------------------------------------
#include "lib_debug.h"
#include "services\obj_sbuffer.h"
#include "services\obj_pipe.h"
#ifdef DBG_DRV_BUFFER
#include <assert.h>
const char *SBufferErrMsg[] = {
"Buffer Success",
"Periph has written more bytes than there is in the buffer",
"Read buffer full",
"Pipe Unknown error"
};
#endif
//*----------------------------------------------------------------------------
//* Function Name : OpenSimpleBuffer()
//* Object :
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91PS_Buffer AT91F_OpenSBuffer(
AT91PS_SBuffer pSimpleBuffer)
{
AT91PS_Buffer pBuffer = &(pSimpleBuffer->parent);
#ifdef DBG_DRV_BUFFER
assert(pSimpleBuffer);
assert(pBuffer);
#endif
// Init the base class members
pBuffer->pPipe = (AT91PS_Pipe) 0;
// Functions invoked by the pipe
pBuffer->SetRdBuffer = AT91F_SbSetRdBuffer;
pBuffer->SetWrBuffer = AT91F_SbSetWrBuffer;
pBuffer->RstRdBuffer = AT91F_SbRstRdBuffer;
pBuffer->RstWrBuffer = AT91F_SbRstWrBuffer;
pBuffer->MsgWritten = AT91F_SbMsgWritten;
pBuffer->MsgRead = AT91F_SbMsgRead;
// Functions invoked by the peripheral
pBuffer->GetWrBuffer = AT91F_SbGetWrBuffer;
pBuffer->GetRdBuffer = AT91F_SbGetRdBuffer;
pBuffer->EmptyWrBuffer = AT91F_SbEmptyWrBuffer;
pBuffer->FillRdBuffer = AT91F_SbFillRdBuffer;
pBuffer->pChild = pSimpleBuffer;
// Init class members
pSimpleBuffer->szRdBuffer = 0;
pSimpleBuffer->szWrBuffer = 0;
pSimpleBuffer->pRdBuffer = (char *) 0;
pSimpleBuffer->pWrBuffer = (char const *)0;
return pBuffer;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbSetRdBuffer()
//* Object : Prepare a new read buffer
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbSetRdBuffer(
AT91PS_Buffer pBuffer,
char *pData,
unsigned int dataSize)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
pSBuffer->pRdBuffer = pData;
pSBuffer->szRdBuffer = dataSize;
return AT91C_BUFFER_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbSetWrBuffer()
//* Object : Prepare a new write buffer
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbSetWrBuffer(
AT91PS_Buffer pBuffer,
char const *pData,
unsigned int dataSize)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
pSBuffer->pWrBuffer = pData;
pSBuffer->szWrBuffer = dataSize;
return AT91C_BUFFER_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbRstRdBuffer()
//* Object : Empty the read buffer
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbRstRdBuffer(
AT91PS_Buffer pBuffer)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
pSBuffer->pRdBuffer = 0;
pSBuffer->szRdBuffer = 0;
return AT91C_BUFFER_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbRstWrBuffer()
//* Object : Empty the write buffer
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbRstWrBuffer(
AT91PS_Buffer pBuffer)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
pSBuffer->pWrBuffer = (char *) 0;
pSBuffer->szWrBuffer = 0;
return AT91C_BUFFER_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbMsgWritten()
//* Object : Check that the message has been written
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
char AT91F_SbMsgWritten(
AT91PS_Buffer pBuffer,
char const *pMsg)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
return ( !(pSBuffer->szWrBuffer > 0) );
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbMsgRead()
//* Object : Check that the message has been read
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
char AT91F_SbMsgRead(
AT91PS_Buffer pBuffer,
char const *pMsg)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
return ( !(pSBuffer->szRdBuffer > 0) );
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbGetWrBuffer()
//* Object : Check that the message has been read
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbGetWrBuffer(
AT91PS_Buffer pBuffer,
char const ** pData,
unsigned int *pSize)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
*pData = pSBuffer->pWrBuffer;
*pSize = pSBuffer->szWrBuffer;
return AT91C_BUFFER_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbGetRdBuffer()
//* Object : Check that the message has been read
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbGetRdBuffer(
AT91PS_Buffer pBuffer,
char **pData,
unsigned int *pSize)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
*pData = pSBuffer->pRdBuffer;
*pSize = pSBuffer->szRdBuffer;
return AT91C_BUFFER_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbEmptyWrBuffer()
//* Object : A message has been written
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbEmptyWrBuffer(
AT91PS_Buffer pBuffer,
unsigned int size)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
AT91PS_Pipe pPipe;
AT91S_BufferStatus status = AT91C_BUFFER_SUCCESS;
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
// Update data pointer
pSBuffer->pWrBuffer += size;
// Update data counter
if (pSBuffer->szWrBuffer < size) {
pSBuffer->szWrBuffer = 0;
status = AT91C_BUFFER_UNDERRUN;
}
else {
pSBuffer->szWrBuffer -= size;
}
// Invoke the callback
if (pSBuffer->szWrBuffer == 0) {
pPipe = pBuffer->pPipe;
if (pPipe->WriteCallback)
pPipe->WriteCallback(status, pPipe->pPrivateWriteData);
}
return status;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbFillRdBuffer()
//* Object : A message has been read
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbFillRdBuffer(
AT91PS_Buffer pBuffer,
unsigned int size)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
AT91PS_Pipe pPipe;
AT91S_BufferStatus status = AT91C_BUFFER_SUCCESS;
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
// Update data pointer
pSBuffer->pRdBuffer += size;
// Update data counter
if (pSBuffer->szRdBuffer < size) {
pSBuffer->szRdBuffer = 0;
status = AT91C_BUFFER_OVERFLOW;
}
else
pSBuffer->szRdBuffer -= size;
// Invoke the callback
if (pSBuffer->szRdBuffer == 0) {
pPipe = pBuffer->pPipe;
if (pPipe->ReadCallback)
pPipe->ReadCallback(status, pPipe->pPrivateReadData);
}
return status;
}
//*----------------------------------------------------------------------------
//* Function Name : SbGetRdBuffer()
//* Object : Check that the message has been read
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
#ifdef DBG_DRV_BUFFER
char const *AT91F_SbGetError(AT91S_BufferStatus errorNumber)
{
switch(errorNumber & AT91C_BUFFER_ERROR) {
case AT91C_BUFFER_SUCCESS: return (SBufferErrMsg[0]);
case AT91C_BUFFER_UNDERRUN: return (SBufferErrMsg[1]);
case AT91C_BUFFER_OVERFLOW: return (SBufferErrMsg[2]);
default: return (SBufferErrMsg[3]);
}
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbIsWrEmpty()
//* Object : Check that the message has been written
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
char AT91F_SbIsWrEmpty(
AT91PS_Buffer pBuffer)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pPrivateData);
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
return ( !(pSBuffer->szWrBuffer > 0) );
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_SbIsRdFull()
//* Object : Check that the message has been read
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
char AT91F_SbIsRdFull(
AT91PS_Buffer pBuffer)
{
AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pPrivateData);
#ifdef DBG_DRV_BUFFER
assert(pSBuffer);
#endif
return ( !(pSBuffer->szRdBuffer > 0) );
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -