/**
* @file CM_RingBuf.h
* @brief 实现环形数组的封装
* @author GT-BU
* @date 2021.05.01
* @version V1.0
* @copyright TCT
* @par 修改日志
* <table>
* <tr><th>Date        <th>Version  <th>Author     <th>Description
* <tr><td>2021.05.01  <td>V1.0     <td>GT-BU      <td>创建初始版本
* </table>
*/
#ifndef CM_RINGBUF_H
#define CM_RINGBUF_H

#include "CM_Types.h"

#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */

    /** 64位环形数组数据结构 */
    typedef struct
    {
        CM_UINT32 i;      /**< 写索引，指向待写入的输入*/
        CM_UINT32 size;  /**< 缓冲区大小 */
        CM_INT64* pdata;  /**< 环形数组缓冲区 */
    }STRU_CM_RING_T;
    /**
    * @brief 环形数组初始化(64位)
    * @param[inout] pRing 要初始化的环形数组
    * @param[in] maxSize 环形数组大小
    * @return 执行结果
    * - ENUM_CM_TRUE 成功
    * - ENUM_CM_FALSE 失败
    */
    ENUM_CM_RETURN CM_RB_Init(INOUT STRU_CM_RING_T* pRing, IN CM_UINT32 maxSize);

    /**
    * @brief 写环形数组(64位)
    * @param[in] pRing 要写的环形数组
    * @param[in] val 要写的值
    * @return 执行结果
    * - ENUM_CM_TRUE 成功
    * - ENUM_CM_FALSE 失败
    */
    ENUM_CM_RETURN CM_RB_Write(INOUT STRU_CM_RING_T* pRing, IN CM_INT64 val);

    /**
    * @brief 查看环形数组(64位)
    *
    * 仅读取数据，而不弹出.
    * @param[in] pMQ 要查看的环形数组
    * @param[in] index 要查看的数据索引（从1开始，1为最新数据，size为最老数据）
    * @param[out] pVal 要输出的数据缓冲区
    * @return 执行结果
    * - ENUM_CM_TRUE 成功
    * - ENUM_CM_FALSE 失败
    */
    ENUM_CM_RETURN CM_RB_Get(IN const STRU_CM_RING_T* pRing, IN CM_UINT16 index, OUT CM_INT64* pVal);

    /**
    * @brief 清零环形数组(64位)
    * @param[inout] pMQ 要清零的环形数组
    * @return 执行结果
    * - ENUM_CM_TRUE 成功
    * - ENUM_CM_FALSE 失败
    * @note 清零环形数组，消息数据缓冲区清零
    */
    ENUM_CM_RETURN CM_RB_Clear(INOUT STRU_CM_RING_T* pRing);

#ifdef __cplusplus
}

#endif /* __cplusplus */

#endif /* _CM_RINGBUF_H */

