/**
* @file CM_MQ_LIGHT.h
* @brief 实现轻型（非线程安全）消息队列的封装
* @author GT-BU
* @date 2021.02.01
* @version V1.0
* @copyright TCT
* @par 修改日志
* <table>
* <tr><th>Date        <th>Version  <th>Author     <th>Description
* <tr><td>2021.02.01  <td>V1.0     <td>GT-BU      <td>创建初始版本
* </table>
*/
#ifndef CM_MQ_LIGHT_H
#define CM_MQ_LIGHT_H

#include "CM_Memory.h"

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

    /** 轻型消息 */
    typedef struct
    {
        CM_UINT16 msgSize;  /**< 消息长度 */
        CM_UINT8* pMsgBuf;     /**< 消息数组 */
    }CM_MQ_Light_Msg_Struct_T;

    /** 轻型消息队列 */
    typedef struct
    {
        CM_BOOL initialized; /**< 是否初始化了         */
        CM_UINT16 maxMsgNum;   /**< MQ中最大消息个数     */
        CM_UINT16 maxMsgSize;  /**< 每条消息的最大字节数 */
        CM_INT32 front;              /**< 头指针               */
        CM_INT32 rear;               /**< 尾指针               */
        CM_UINT16 msgNum;      /**< 消息队列中消息个数   */
        CM_MQ_Light_Msg_Struct_T* pMQMsg; /**< 指向第一条消息    */
    }CM_MQ_Light_Struct_T;

    /**
    * @brief CM_MQ_Light_Init
    *
    * Detailed description.
    * @param[in] pMQ 要初始化的消息队列
    * @param[in] maxMsgNum 消息队列大小
    * @param[in] maxMsgSize 每条消息的大小
    * @return CM_BOOL
    */
    ENUM_CM_RETURN CM_MQ_Light_Init(INOUT CM_MQ_Light_Struct_T* pMQ, IN CM_UINT16 maxMsgNum, IN CM_UINT16 maxMsgSize);

    /**
    * @brief CM_MQ_Light_Get_Msg_Num
    *
    * Detailed description.
    * @param[in] pMQ 要获得消息个数的消息队列
    * @return CM_INT32 若失败则返回-1,否则返回消息个数
    */
    CM_INT32 CM_MQ_Light_Get_Msg_Num(IN const CM_MQ_Light_Struct_T* pMQ);

    /**
    * @brief CM_MQ_Light_Write
    *
    * Detailed description.
    * @param[in] pMQ 要写的消息队列
    * @param[in] pMsgBuf 要写的消息
    * @param[in] size 要写的消息大小
    * @return CM_MQ_Light_Write_Result_Enum
    */
    ENUM_CM_RETURN CM_MQ_Light_Write(INOUT CM_MQ_Light_Struct_T* pMQ, IN const CM_UINT8* pMsgBuf, IN CM_UINT16 BufSize);

    /**
    * @brief CM_MQ_Light_Read
    *
    * Detailed description.
    * @param[in] pMQ 要读的消息队列
    * @param[in] pOutBuf 要输出消息的缓冲区
    * @param[in/out] pSize 作为输入参数时为输出的缓冲区消息大小，作为输出参数为读到的消息大小
    * @return CM_BOOL
    */
    ENUM_CM_RETURN CM_MQ_Light_Read(INOUT CM_MQ_Light_Struct_T* pMQ, OUT CM_UINT8* pOutBuf, INOUT CM_UINT16* pBufSize);

    /**
    * @brief CM_MQ_Light_Get
    *
    * 仅读取数据，而不弹出.
    * @param[in] pMQ
    * @param[in] index
    * @param[in] pOutBuf
    * @param[in] pSize
    * @return CM_BOOL
    */
    ENUM_CM_RETURN CM_MQ_Light_Get(IN const CM_MQ_Light_Struct_T* pMQ, IN CM_UINT16 index, OUT CM_UINT8* pOutBuf, INOUT CM_UINT16* pBufSize);

    /**
    * @brief CM_MQ_Light_Clear
    *
    * Detailed description.
    * @param[in] pMQ 要清空的消息队列
    * @return CM_BOOL
    */
    ENUM_CM_RETURN CM_MQ_Light_Clear(INOUT CM_MQ_Light_Struct_T* pMQ);

    /**
    * @brief CM_MQ_Flush
    *
    * Detailed description.
    * @param[in] pMQ 要清零的消息队列
    * @return CM_BOOL
    */
    ENUM_CM_RETURN CM_MQ_Light_Flush(INOUT CM_MQ_Light_Struct_T* pMQ);


#ifdef __cplusplus
}

#endif /**< __cplusplus */

#endif /**< _CM_MQ_LIGHT_H */

