#ifndef AJB_QUEUE_H_
#define AJB_QUEUE_H_
#include "ajb_types.h"
typedef struct Queue_
{
AJB_U16 pReadSeat;
AJB_U16 pWriteSeat;
AJB_U16 Size;
AJB_U16 DataSize;
AJB_U16 EmptySize;
AJB_U8 *Data;
void (*AnalysisQueueData)(struct Queue_ *Queue);
}Queue_t;
typedef void (*pAnalysisQueueData)(Queue_t *Queue);
extern AJB_U16 GetQueueEmptySize(Queue_t Queue);
extern AJB_U16 GetQueueDataSize(Queue_t Queue);
extern AJB_U16 ReadDataFromQueue(Queue_t Queue,AJB_U16 Offset,AJB_U8 *Data,AJB_U16 Length );
extern AJB_U16 WriteDataToQueue(Queue_t *Queue,AJB_U8 *Data,AJB_U16 Length);
extern AJB_BOOL InitQueue(Queue_t *Queue,AJB_U8 *QueueDataAddr,AJB_U16 QueueSize,pAnalysisQueueData AnalysisQueueData );
extern AJB_U16 DelectDataFromQueue(Queue_t *Queue,AJB_U16 Length );
#endif
#include "ajb_queue.h"
#include "string.h"
#define TRACE_QUEUE TRUE
AJB_BOOL InitQueue( Queue_t *Queue,
AJB_U8 *QueueDataAddr,
AJB_U16 QueueSize ,
pAnalysisQueueData AnalysisQueueData )
{
if( NULL == Queue || NULL == QueueDataAddr )
{
return AJB_FALSE;
}
Queue->Size = QueueSize;
Queue->pReadSeat = 0;
Queue->pWriteSeat = 0;
Queue->DataSize = 0;
Queue->EmptySize = QueueSize;
Queue->AnalysisQueueData = AnalysisQueueData;
#if 0
if( NULL == QueueDataAddr )
{
Queue->Data = (uint8 *)malloc(sizeof(uint8) * QueueSize );
}
#endif
Queue->Data = QueueDataAddr;
if( NULL == Queue->Data )
{
return AJB_FALSE;
}
else
{
return AJB_TRUE;
}
}
AJB_U16 WriteDataToQueue(Queue_t *Queue,AJB_U8 *Data,AJB_U16 Length)
{
if(0 == Queue->EmptySize)
{
return 0;
}
if( Queue->pWriteSeat >= Queue->Size )
{
Queue->pWriteSeat = 0;
}
if(Length > Queue->EmptySize)
{
Length = Queue->EmptySize;
}
if( (Queue->Size - Queue->pWriteSeat) >= Length )
{
memcpy( &(Queue->Data[Queue->pWriteSeat]),Data,Length);
Queue->pWriteSeat += Length;
}
else
{
memcpy( &(Queue->Data[Queue->pWriteSeat]) ,Data,Queue->Size - Queue->pWriteSeat );
memcpy( &(Queue->Data[0]),&(Data[Queue->Size - Queue->pWriteSeat]) ,Length + Queue->pWriteSeat - Queue->Size );
Queue->pWriteSeat = Length + Queue->pWriteSeat - Queue->Size;
}
Queue->EmptySize -= Length;
Queue->DataSize += Length;
if( NULL != Queue->AnalysisQueueData )
{
Queue->AnalysisQueueData(Queue);
}
return Length;
}
AJB_U16 ReadDataFromQueue(Queue_t Queue,AJB_U16 Offset,AJB_U8 *Data,AJB_U16 Length )
{
if( NULL == Data )
{
return 0;
}
if(0 == Queue.DataSize || 0 == Length)
{
return 0;
}
if( Offset > ( Queue.DataSize - 1 ) )
{
return 0;
}
if( Offset + Queue.pReadSeat > Queue.Size - 1 )
{
Queue.pReadSeat = (Offset + Queue.pReadSeat) - Queue.Size ;
}
else
{
Queue.pReadSeat += Offset;
}
if( (Queue.DataSize - Offset) < Length )
{
Length = Queue.DataSize - Offset;
}
if( (Queue.Size - Queue.pReadSeat) >= Length )
{
memcpy(Data,&(Queue.Data[Queue.pReadSeat]),Length);
}
else
{
memcpy(Data,&(Queue.Data[Queue.pReadSeat]) ,Queue.Size - Queue.pReadSeat );
memcpy( &Data[Queue.Size - Queue.pReadSeat],Queue.Data , Length + Queue.pReadSeat - Queue.Size );
}
return Length;
}
AJB_U16 DelectDataFromQueue(Queue_t *Queue,AJB_U16 Length )
{
if( NULL == Queue )
{
return 0;
}
if( 0 == Length )
{
return 0;
}
if( Queue->DataSize < Length )
{
Length = Queue->DataSize ;
}
if( (Length + Queue->pReadSeat) >= Queue->Size )
{
Queue->pReadSeat = Length + Queue->pReadSeat - Queue->Size;
}
else
{
Queue->pReadSeat += Length;
}
Queue->EmptySize += Length;
Queue->DataSize -= Length;
return Length;
}
AJB_U16 GetQueueDataSize(Queue_t Queue)
{
return Queue.DataSize;
}
AJB_U16 GetQueueEmptySize(Queue_t Queue)
{
return Queue.EmptySize;
}