/**
 * @file fifo.h
 * @brief 
 * @author dfs 
 * @version 1.0
 * @date 2023-12-07
 * 
 * @copyright Copyright (c) 2023  杭州科技股份有限公司
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-12-07 <td>1.0     <td>dfs     <td>内容
 * </table>
 */
#ifndef __FIFO_H__
#define __FIFO_H__
#include "define_base.h"
#include "platmacro.h"

typedef struct
{
    uint32_t             memberSize;
    uint32_t             maxMemberNum;
    volatile uint32_t    writePos;
    volatile uint32_t    readPos;
    volatile uint32_t    curMemberNum;  /* 可从writePos和readPos计算。只是为了高效 */
    uint32_t             maxFifoDeep;
    uint32_t             readErrCount;
    uint32_t             writeErrCount;
    void *               spin;
    void *               mutex;
    void *               cond_not_full;
    void *               cond_not_empty; 
    uint8_t*             pBuf;
}FIFO_STRU;

/**
 * @brief 创建fifo 
 * 
 * @param pFifo         成员指针    
 * @param memberSize    成员长度
 * @param memberNum     成员个数
 * @return int32_t      正常返回0; 其它异常
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-12-11 <td>1.0     <td>dfs     <td>内容
 * </table>
 */
int32_t Fifo_Init(FIFO_STRU* pFifo, uint32_t memberSize, uint32_t memberNum);


/**
 * @brief           缓冲清空
 * 
 * @param pFifo             需要操作的FIFO
 * @param reseved           该参数目前无效
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-12-11 <td>1.0     <td>dfs     <td>内容
 * </table>
 */
void Fifo_Reset(FIFO_STRU *pFifo, int reseved);


/**
 * @brief   获取当前fifo的缓存的成员个数
 * 
 * @param pFifo 
 * @return uint32_t 成员个数
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-12-11 <td>1.0     <td>dfs     <td>内容
 * </table>
 */
uint32_t Fifo_GetDataNum(FIFO_STRU *pFifo);


/**
 * @brief 获取当前缓冲剩余空的成员个数
 * 
 * @param pFifo 
 * @return uint32_t 成员个数
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-12-11 <td>1.0     <td>dfs     <td>内容
 * </table>
 */
uint32_t Fifo_GetEmptyNum(FIFO_STRU *pFifo);

/**
 * @brief 向缓冲中增加数据 
 * 
 * @param pFifo           操作缓冲
 * @param buf             写入数据的指针
 * @param num             写入的成员的数量
 * @param reseved         该参数目前无效
 * @return int32_t        <0:操作异常；
 *                        =0缓冲溢出 >0实际添加个数
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-12-11 <td>1.0     <td>dfs     <td>内容
 * </table>
 */
int32_t Fifo_AddData(FIFO_STRU *pFifo, uint8_t* buf, uint32_t num, int reseved);



/**  从缓冲中读取一个成员(非阻塞) 
 * 
 * @param pFifo           操作缓冲
 * @param buf             写入数据的指针
 * @param num             写入的成员的数量
 * @param reseved         该参数目前无效
 * @return int32_t        <0:操作异常；
 *                        =0缓冲为空 >0实际读取个数 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-12-11 <td>1.0     <td>dfs     <td>内容
 * </table>
 */
int32_t Fifo_DelData(FIFO_STRU *pFifo, uint8_t* buf, uint32_t num, int reseved);



/**
 * @brief       从fifo中取出对象(阻塞等待到有数据为止)
 * @param[in]   FIFO_STRU *pFifo  FIFO信息的指针
 * @param[out]  uint8_t* buf  要取出的对象的指针
 * @param[in]   uint32_t num  要取出的对象数目
 * @param[in]   reseved  预留参数
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-12-11 <td>1.0     <td>dfs     <td>内容
 * </table>
 */
int32_t Fifo_BlockDelData(FIFO_STRU *pFifo, uint8_t* buf, uint32_t num, int reseved);


#endif //__FIFO_H__