/**
* @file CM_Sem.c
* @brief 实现了信号量的封装
* @author GT-BU
* @date 2021.02.01
* @version V1.1
* @copyright TCT
* @par 修改日志
* <table>
* <tr><th>Date        <th>Version  <th>Author     <th>Description
* <tr><td>2017.12.20  <td>V1.0     <td>MSCP项目组 <td>创建初始版本
* <tr><td>2021.02.01  <td>V1.1     <td>GT-BU      <td>TSCP项目集成、更新
* </table>
*/
#include "CM_Sem.h"

#ifdef VXWORKS
/**
* @brief 信号量初始化
* @param pMutex 信号量指针
* @return 执行结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN CM_Sem_Init(INOUT CM_SEM_T* pSem)
{
    /*- 变量初始化 */
    ENUM_CM_RETURN rt = ENUM_CM_FALSE;
    /*- 输入参数是否合法 */
    if (NULL != pSem)
    {
        /*- 创建互斥信号量 */
        *pSem = semBCreate(SEM_Q_FIFO, SEM_EMPTY);

        /*- 创建是否成功 */
        if (0 != (*pSem))
        {
            /*- 函数执行结果置为成功 */
            rt = ENUM_CM_TRUE;
        }
    }
    return rt;
}

/**
* @brief 销毁信号量
* @param sem 信号量
* @return 执行结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN CM_Sem_Destroy(IN CM_SEM_T sem)
{
    /*- 销毁信号量 */
    semDelete(sem);

    /*- 返回函数执行结果 */
    return ENUM_CM_TRUE;
}

/**
* @brief 等待信号量
* @param sem 信号量
* @return 执行结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN CM_Sem_wait(IN CM_SEM_T sem)
{
    /*- 执行锁定信号量，等待无限长时间 */
    return CM_Sem_Wait_Time(sem, WAIT_FOREVER);
}

/**
* @brief 等待信号量（指定等待时间）
* @param sem 信号量
* @param dwWaitTIme 等待时间
* @return 执行结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN CM_Sem_Wait_Time(IN CM_SEM_T sem, IN CM_UINT32 dwWaitTime)
{
    STATUS ret = OK;
    ENUM_CM_RETURN rt = ENUM_CM_FALSE;

    /*- 执行锁定信号量，等待给定时间*/
    ret = semTake(sem, dwWaitTime);
    /*- 锁定是否成功 */
    if (OK == ret)
    {
        /*- 函数执行结果置为成功 */
        rt = ENUM_CM_TRUE;
    }
    return rt;
}

/**
* @brief 发送信号量
* @param sem 信号量
* @return 执行结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN CM_Sem_Post(IN CM_SEM_T sem)
{
    STATUS ret = OK;
    ENUM_CM_RETURN rt = ENUM_CM_FALSE;
    /*- 释放信号量*/
    ret = semGive(sem);
    /*- 释放是否成功 */
    if (OK == ret)
    {
        /*- 函数执行结果置为成功 */
        rt = ENUM_CM_TRUE;
    }
    /*- 返回函数执行结果 */
    return rt;
}
#endif


