/**
* @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 QNX
#include "time.h"
#include "CM_Memory.h"
/**
* @brief 信号量初始化
* @param pSem 信号量指针
* @return 执行结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN CM_Sem_Init(INOUT CM_SEM_T* pSem)
{
    /*- 变量初始化 */
    CM_INT32 ret = 0;
    ENUM_CM_RETURN rt = ENUM_CM_FALSE;
    /*- 入参是否合法 */
    if (NULL != pSem)
    {
        /*- 创建互斥信号量 */
        *pSem = (sem_t*)CM_Malloc(sizeof(sem_t));
        if(pSem != NULL)
        {
			ret = sem_init(*pSem, 0, 0u);

			/*- 创建是否成功 */
			if (EOK == ret)
			{
				/*- 函数执行结果置为成功 */
				rt = ENUM_CM_TRUE;
			}
			else
			{
				/*- 创建失败 */
			}
        }
        else
        {
        	/*- 内存分配失败 */
        }
    }
    else
    {
    	/*- 入参非法 */
    }
    /*- 返回函数执行结果 */
    return rt;
}

/**
* @brief 销毁信号量
* @param sem 信号量
* @return 执行结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN CM_Sem_Destroy(IN CM_SEM_T sem)
{
    CM_INT32 ret = 0;
    ENUM_CM_RETURN rt = ENUM_CM_FALSE;
    /*- 销毁互斥信号量 */
    if(NULL != sem)
    {
        ret = sem_destroy(sem);
        CM_Free((void *)sem);
        /*- 销毁是否成功 */
        if (EOK == ret)
        {
            /*- 函数执行结果置为成功 */
            rt = ENUM_CM_TRUE;
        }
        else
        {
            /*- 无处理 */
        }
    }
    else
    {
        /*- 无处理 */
    }
    /*- 返回函数执行结果 */
    return rt;
}

/**
* @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)
{
	CM_INT32 ret = 0;
	CM_TIMESPEC_T time_struct;
	ENUM_CM_RETURN rt = ENUM_CM_FALSE;

	time_struct.tv_sec = (CM_INT32)CM_UNSIGNED_INT_EXP(dwWaitTime / 1000u);
	time_struct.tv_nsec = (CM_INT32)CM_UNSIGNED_INT_EXP((dwWaitTime % 1000u) * CM_UNSIGNED_MILLION);

    /*- 执行等待信号量操作 */
    if(NULL != sem)
    {
        ret = sem_timedwait(sem,&time_struct);

        /*- 等待是否成功 */
        if (EOK == ret)
        {
            /*- 函数执行结果置为成功 */
            rt = ENUM_CM_TRUE;
        }
        else
        {
            /*- 无处理 */
        }
    }
    else
    {
        /*- 无处理 */
    }

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

/**
* @brief 等待信号量
* @param sem 信号量
* @return 执行结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN CM_Sem_Wait(IN CM_SEM_T sem)
{
    CM_INT32 ret = 0;
    ENUM_CM_RETURN rt = ENUM_CM_FALSE;
    /*- 执行等待信号量操作 */
    if(NULL != sem)
    {
        ret = sem_wait(sem);
        /*- 等待是否成功 */
        if (EOK == ret)
        {
            /*- 函数执行结果置为成功 */
            rt = ENUM_CM_TRUE;
        }
        else
        {
            /*- 无处理 */
        }
    }
    else
    {
        /*- 无处理 */
    }
    /*- 返回函数执行结果 */
    return rt;
}
/**
* @brief 发送信号量
* @param sem 信号量
* @return 执行结果
* - ENUM_CM_TRUE 成功
* - ENUM_CM_FALSE 失败
*/
ENUM_CM_RETURN CM_Sem_Post(IN CM_SEM_T sem)
{
    CM_INT32 ret = 0;
    ENUM_CM_RETURN rt = ENUM_CM_FALSE;

    /*- 发送信号量 */
    if(NULL != sem)
    {
        ret = sem_post(sem);
        /*- 发送是否成功 */
        if (EOK == ret)
        {
            /*- 函数执行结果置为成功 */
            rt = ENUM_CM_TRUE;
        }
        else
        {
            /*- 无处理 */
        }
    }
    else
    {
        /*- 无处理 */
    }
    /*- 返回函数执行结果 */
    return rt;
}
#endif



