#ifndef _APP_QUEUE_H_
#define _APP_QUEUE_H_
#include <stdint.h>
#include <stdbool.h>

typedef struct queue
{
    unsigned int *qu;      	// 用来存储全部的队列中的元素
    int head;     		  	// 队列头
    int tail;     			// 队尾
    int qlength;  			// 队列长度
    int maxsize;  			// 用来记录队列的最大容量
}QueueStruct;

typedef enum queue_state
{
	QUEUE_STATE_EMPTY	= 0,
	QUEUE_STATE_NORMAL  = 1,
	QUEUE_STATE_FULL    = 2
}QueueStateEnum;

typedef struct queue_state_ctrl
{
	QueueStruct *pQueue;
	unsigned int AdjAddTotalNum;	// 总共添加的采样点数
	unsigned int AdjSubTotalNum;	// 总共减少的采样点数
	unsigned int BackAdjAddTotalNum;	// 备份
	unsigned int BackAdjSubTotalNum;	// 备份
	unsigned int MinIdleNum;		// 最少间隔多少个采样点未调节
	unsigned short NeedFillNum;		// 需要填充数量
	unsigned short NeedLostNum;		// 需要丢掉数量
	unsigned short Tick;				// 调整时多少ms调整1 个采样点
	unsigned short SetTick;

	unsigned int SetMinIdleLength;
	unsigned short SetLowThreshold;
	unsigned short SetHighThreshold;
	unsigned short SetAdjustLength;
}QueueStateCtrlStruce;



// 队列调节记录清零
void  QueueResetAdjRecord(volatile QueueStateCtrlStruce  * pQueueCtrl);
// 获取队列丢掉的数据
unsigned int QueueGetAdjSubNum(volatile QueueStateCtrlStruce  * pQueueCtrl);
// 获取队列添加的数据
unsigned int QueueGetAdjAddNum(volatile QueueStateCtrlStruce  * pQueueCtrl);
// 在队列接近满时，调节数据长度
bool QueueFullAdjust(volatile QueueStateCtrlStruce  * pQueueCtrl);
// 在队列接近空时，调节数据长度
bool QueueEmptyAdjust(volatile QueueStateCtrlStruce  * pQueueCtrl);
// 获取队列中剩余空间
int QueueResidualSpace(volatile QueueStruct *q);
// 获取队列中数据长度
int QueueDataLength(volatile QueueStruct *q);
// 获取队列的最大长度
int QueueMaxBufLength(volatile QueueStruct *q);
// 出队
int QueueReadVal(volatile QueueStruct *q, unsigned int *p_buf , int len);
// 入队
bool QueueWriteVal(volatile QueueStruct *q , unsigned int *p_buf , int len);
//  初始化队列
bool QueueCreate(volatile QueueStruct *q , unsigned int *p_buf , int buf_size);
// 清空队列中所有数据
bool QueueReset(volatile QueueStruct *q);


#endif