#include "osp_type_def.h"
#include "osp_msg.h"
#include "osp_sw_queue.h"
#include "osp_task.h"
#include "osp_sem.h"
#include "smartos.h"
#include "ucp_utility.h"
#include "ucp_printf.h"

#ifdef OSP_DEBUG_TEST
uint32_t g_u32_osp_wait_sem_err = 0;
uint32_t g_u32_osp_post_sem_err = 0;
uint32_t g_u32_osp_del_sem_err = 0;
uint32_t g_u32_osp_wait_event_sem_err = 0;
uint32_t g_u32_osp_post_event_sem_err = 0;
uint32_t g_u32_osp_post_timer_event_sem = 0;
#endif

void *osp_create_sem(int cnt)
{
    int apeId = get_core_id();
    void* ptr = smart_sem_create(cnt);
    if (NULL == ptr)
    {
        debug_write(DBG_DDR_ERR_IDX(apeId, 28), 0xFFFFFFFF);
    }

    return ptr;
}

void osp_wait_sem(sem_t *sem)
{
    if (NULL != sem)
    {
        smart_sem_pend(sem);
    }
    else
    {
#ifdef OSP_DEBUG_TEST
        debug_write(OSP_DEBUG_POT(g_ape_id, 40), ++g_u32_osp_wait_sem_err);
#endif
    }

    return ;
}

void osp_post_sem(sem_t *sem)
{
    int ret = 0;
    int apeId = get_core_id();
    if (NULL != sem)
    {
        ret = smart_sem_post(sem);
        if (0 != ret)
        {
            debug_write(DBG_DDR_ERR_IDX(apeId, 29), ret);
        }
    }
    else
    {
#ifdef OSP_DEBUG_TEST
        debug_write(OSP_DEBUG_POT(g_ape_id, 41), ++g_u32_osp_post_sem_err);
#endif
    }

    return ;
}

void osp_delete_sem(sem_t *sem)
{
    int ret = 0;
    int apeId = get_core_id();
    if (NULL != sem)
    {
        ret = smart_sem_del(sem);
        if (0 != ret)
        {
            debug_write(DBG_DDR_ERR_IDX(apeId, 30), ret);
        }
    }
    else
    {
#ifdef OSP_DEBUG_TEST
        debug_write(OSP_DEBUG_POT(g_ape_id, 42), ++g_u32_osp_post_sem_err);
#endif
    }

    return ;
}

void osp_wait_event_sem(int task_id)
{
    osp_tcb *l_tcb = (osp_tcb*)(TCB_GET(task_id));
    if (NULL != l_tcb)
    {
        osp_wait_sem(l_tcb->event_sem);
    }
    else
    {
#ifdef OSP_DEBUG_TEST
        debug_write(OSP_DEBUG_POT(g_ape_id, 43), ++g_u32_osp_wait_event_sem_err);
        debug_write(OSP_DEBUG_POT(g_ape_id, 44), task_id);
#endif
    }

    return ;
}

void osp_post_event_sem(int task_id)
{
    osp_tcb *l_tcb = (osp_tcb*)(TCB_GET(task_id));
    if (NULL != l_tcb)
    {
        osp_post_sem(l_tcb->event_sem);
    }
    else
    {
#ifdef OSP_DEBUG_TEST
        debug_write(OSP_DEBUG_POT(g_ape_id, 45), ++g_u32_osp_post_event_sem_err);
        debug_write(OSP_DEBUG_POT(g_ape_id, 46), task_id);
#endif
    }

    return ;
}

void osp_post_timer_event_sem(int task_id)
{
    osp_tcb *l_tcb = (osp_tcb*)(TCB_GET(task_id));
    if (NULL != l_tcb)
    {
        osp_post_sem(l_tcb->sem);
    }
    else
    {
#ifdef OSP_DEBUG_TEST
        debug_write(OSP_DEBUG_POT(g_ape_id, 47), ++g_u32_osp_post_timer_event_sem);
        debug_write(OSP_DEBUG_POT(g_ape_id, 48), task_id);
#endif
    }

    return ;
}

