/**
***************************************************
* [url=home.php?mod=space&uid=247401]@brief[/url] func_fifo_CmpLower
* [url=home.php?mod=space&uid=536309]@NOTE[/url] 比较FIFO重数据的底层函数,不进行标志位操作。
* @param fifo
* 指向待操作的FIFO,
* ind
* 从FIFO的pull后面的第ind个开始
* len
* 比较的长度为len
* data
* 比较的数据
* timeout
* @retval FifoErr
* [url=home.php?mod=space&uid=130263]@DATA[/url] 2021.09.03
* [url=home.php?mod=space&uid=638116]@auth[/url] WXL
* @his 1.0.0.0 2021.09.03 WXL
* create
***************************************************
**/
static FifoErr func_fifo_CmpLower(FifoTypeDef* fifo, const INT16U ind, const INT16U len, const INT8U* data)
{
//判断FIFO中是否有足够的数量进行比较。
if(ind + len > fifo->CntUsed)
{
return FIFO_ENUM;
}
//上面的判断可以保证开始比较的位置+len不会超过FIFO的容量。
INT8U* point = fifo->Pull + ind;
if(point > fifo->EndPos)
point = point - fifo->Depth;
INT16U len2end = func_fifo_CalPoint2end(fifo,point);
if(len2end >= len)
{
if(memcmp(data,point,len) == 0)
{
return FIFO_EOK;
}
else
{
return FIFO_EFAILED;
}
}
else
{
if(memcmp(data,point,len2end) == 0 && memcmp(data+len2end,fifo->Buf,len-len2end) == 0 )
{
return FIFO_EOK;
}
else
{
return FIFO_EFAILED;
}
}
}
/**
***************************************************
* @brief func_fifo_DeleteLower
* @note 删除FIFO数据的底层函数,不进行标志位操作。
* @param fifo
* 指向待操作的FIFO,
* num
* 删除的元素个数
* @retval FifoErr
* @data 2021.09.03
* @auth WXL
* @his 1.0.0.0 2021.09.03 WXL
* create
***************************************************
**/
FifoErr func_fifo_DeleteLower(FifoTypeDef* fifo, INT16U num)
{
//删除的数据大于FIFO已使用数据。
if(num > fifo->CntUsed)
{
return FIFO_ENUM;
}
//开始删除数据
INT16U len2end = func_fifo_CalPoint2end(fifo,fifo->Pull);
if(len2end >= num)
{
memset(fifo->Pull , 0 , num);
}
else
{
memset(fifo->Pull , 0 , len2end);
memset(fifo->Buf , 0 , num - len2end);
}
fifo->CntUsed -= num;
func_fifo_PullOffset(fifo,num);
return FIFO_EOK;
}
/**
***************************************************
* @brief func_fifo_Push2Back
* @note 中断中进行FIFO写入操作时,FIFO繁忙调用该函数写入到back
* @param fifo
* 指向待操作的FIFO,
* num
* 删除的元素个数
* data
* 指向写入数据
* @retval FifoErr
* @data 2021.09.03
* @auth WXL
* @his 1.0.0.0 2021.09.03 WXL
* create
***************************************************
**/
static void func_fifo_Push2Back(FifoTypeDef* fifo, INT16U num, INT8U* data)
{
INT16 offset = 0;
INT8U* srcpos = 0;
INT8U* despos = 0;
INT16U len = 0;
//现有数据和待写入数据的总数大于BACK的容量,进行元素替换操作。
if(num + fifo->BackCount > fifo->Depth)
{
offset = num + fifo->BackCount - fifo->Depth;
//现有元素全部被替换。
if(offset >= fifo->BackCount)
{
offset = num - fifo->Depth;
//写入新数据
srcpos = data+offset;
despos = fifo->BackBuf;
len = fifo->Depth;
memcpy(despos, srcpos, len);
}
else
{
//更新原有数据
srcpos = fifo->BackBuf + offset;
despos = fifo->BackBuf;
len = fifo->BackCount - offset;
memcpy(despos, srcpos, len);
//写入新数据。
srcpos = data;
despos = despos + len;
len = num;
memcpy(despos, srcpos, len);
}
fifo->BackCount = fifo->Depth;
}
//现有数据和待写入数据的总数不大于FIFO的容量,将现有数据附加到back
else
{
srcpos = data;
despos = fifo->BackBuf + fifo->BackCount;
len = num;
fifo->BackCount += num;
memcpy(despos, srcpos, len);
}
}
/**
***************************************************
* @brief func_fifo_Push2Fifo
* @note 将数据写入到FIFO缓冲区中,仅在FIFO不繁忙时调用,
* 1、首先将Back数据写入到FIFO中。
* 2、将待写入数据写入到FIFO中。
* @param fifo
* 指向待操作的FIFO,
* num
* 删除的元素个数
* data
* 指向写入数据
* @retval FifoErr
* @data 2021.09.03
* @auth WXL
* @his 1.0.0.0 2021.09.03 WXL
* create
***************************************************
**/
static void func_fifo_Push2Fifo(FifoTypeDef* fifo, INT16U num, INT8U* data)
{
INT16 offset = 0;
INT16 len2end = func_fifo_CalPoint2end(fifo,fifo->Push);
INT16 num2push = 0;
INT8U* srcpos = 0;
INT8U* despos = 0;
INT16U len = 0;
//back数据和data数据之和大于depth,存在back和data丢弃数据的情况。
if(fifo->BackCount + num > fifo->Depth)
{
num2push = fifo->Depth;
offset = fifo->BackCount + num -fifo->Depth;
}
else
{
num2push = fifo->BackCount + num;
}
//到FIFO结尾可以容纳写入的数据,说明不存在覆盖情况。将back和带写入数据写入即可。
if(len2end >= num2push)
{
//写入BACK
srcpos = fifo->BackBuf;
despos = fifo->Push;
len = fifo->BackCount;
memcpy(despos, srcpos, len);
//写入data
srcpos = data;
despos = despos + len;
len = num;
memcpy(despos, srcpos, len);
}
//存在回头写的情况
else
{
//偏移量大于back的个数,back区域不执行写入操作。
if(offset >= fifo->BackCount)
{
//写入到队尾。
srcpos = data + offset - fifo->BackCount;
despos = fifo->Push;
len = len2end;
memcpy(despos, srcpos, len);
//重头写入
srcpos = srcpos + len;
despos = fifo->Buf;
len = num2push - len2end;
memcpy(despos, srcpos, len);
}
//写入备份区域和数据区域数据。
else
{
INT16U back2push = fifo->BackCount - offset;
if(len2end >= back2push)
{
//写入back
srcpos = fifo->BackBuf + offset;
despos = fifo->Push;
len = back2push;
memcpy(despos, srcpos, len);
//写入DATA到队尾
srcpos = data;
despos = despos + len;
len = len2end - len;
memcpy(despos, srcpos, len);
//重头写
srcpos = data + len;
despos = fifo->Buf;
len = num2push - back2push ;
memcpy(despos, srcpos, len);
}
else
{
//写入back
srcpos = fifo->BackBuf + offset;
despos = fifo->Push;
len = len2end;
memcpy(despos, srcpos, len);
//重头写BACK
srcpos = srcpos + len;
despos = fifo->Buf;
len = back2push - len;
memcpy(despos, srcpos, len);
//写DATA
srcpos = data;
despos = despos + len;
len = num2push - back2push;
memcpy(despos, srcpos, len);
}
}
}
fifo->BackCount = 0;
if(num2push + fifo->CntUsed > fifo->Depth)
{
num2push -= 1;
num2push += 1;
}
func_fifo_PushOffset(fifo,num2push);
fifo->CntUsed += num2push;
if(fifo->CntUsed >= fifo->Depth)
{
fifo->CntUsed = fifo->Depth;
fifo->Pull = fifo->Push;
}
}
static FifoErr func_fifo_PullLower(FifoTypeDef* fifo, INT16U num, INT8U* data, INT16U* len, INT8U mode)
{
INT16U len2end = func_fifo_CalPoint2end(fifo,fifo->Pull);
INT16U num2pull = 0;
if(fifo->CntUsed == 0)
{
return FIFO_ENUM;
}
//全部模式
if(mode == 0)
{
if(fifo->CntUsed >= num)
{
num2pull = num;
}
else
{
return FIFO_ENUM;
}
}
//PART模式
else
{
if(fifo->CntUsed >= num)
{
num2pull = num;
}
else
{
num2pull = fifo->CntUsed;
}
*len = num2pull;
}
if(len2end >= num2pull)
{
memcpy(data , fifo->Pull , num2pull);
memset(fifo->Pull , 0 , num2pull);
}
//需要重头读取。
else
{
memcpy(data , fifo->Pull, len2end);
memset(fifo->Pull , 0 , len2end);
memcpy(data+len2end , fifo->Buf , num2pull-len2end);
memset(fifo->Buf , 0 , num2pull-len2end);
}
//读位置和使用量更新。
func_fifo_PullOffset(fifo,num2pull);
fifo->CntUsed -= num2pull;
return FIFO_EOK;
}