#include "osp_type_def.h"
#include "osp_msg_que.h"
#include "osp_sem.h"
#include "err_num.h"
#include "ucp_printf.h"
#include "smartos.h"

/* APE <---> APE之间的消息放到了DDR中，该DDR的维护由平台完成 */
/* 发送方从自己的环中申请空间，循环使用，不需要释放 */
/* 实际使用空间：0x1000 0000 -- 0x103F F000 */
uint32_t g_osp_ape_ddr_msg_addr[] = {0x10000000,    /* APE0 */
                                     0x10055400,    /* APE1 */
                                     0x100AA800,    /* APE2 */
                                     0x100FFC00,    /* APE3 */
                                     0x10155000,    /* APE4 */
                                     0x101AA400,    /* APE5 */
                                     0x101FF800,    /* APE6 */
                                     0x10254C00,    /* APE7 */
                                     0x102AA000,    /* PET RFM0 */
                                     0x102FF400,    /* PET RFM1 */
                                     0x10354800,    /* ECS RFM0 */
                                     0x103A9C00};   /* ECS RFM1 */

osp_msg_que g_str_msg_que;

int8_t osp_msg_que_init(uint8_t ape_id)
{
    memset(&g_str_msg_que, 0, sizeof(g_str_msg_que));
    g_str_msg_que.sem = osp_create_sem(1);
    if (NULL == g_str_msg_que.sem)
    {
        return -OSP_PAR_ILL;
    }
    g_str_msg_que.que_id = (uint16_t)ape_id;
    g_str_msg_que.de_idx = 0;
    g_str_msg_que.dep    = OSP_APE_MSG_NUM;
    g_str_msg_que.mask   = OSP_APE_MSG_NUM -1;

    UCP_PRINT_LOG("osp_msg_que_init: que_id(0x%08x), de_idx(0x%08x), dep(0x%08x), mask(0x%08x)\r\n", g_str_msg_que.que_id, g_str_msg_que.de_idx, g_str_msg_que.dep, g_str_msg_que.mask);

    return OSP_OK;
}

int osp_msg_que_deque(uint32_t *pvalue)
{
    uint32_t base_value = 0;

    /* 入参检查 */
    if (NULL == pvalue)
    {
        return -OSP_PAR_ILL;
    }

    /* 获取信号量 */
    osp_wait_sem(g_str_msg_que.sem);

    base_value = g_osp_ape_ddr_msg_addr[g_str_msg_que.que_id];

    *pvalue = ((g_str_msg_que.de_idx << 9) + base_value);

    if ((g_str_msg_que.de_idx + 1) == g_str_msg_que.mask)
    {
        g_str_msg_que.de_idx = 0;
    }
    else
    {
        g_str_msg_que.de_idx = (g_str_msg_que.de_idx + 1);
    }
    //g_str_msg_que.de_idx = (g_str_msg_que.de_idx + 1)&(g_str_msg_que.mask);
    UCP_PRINT_LOG("osp_msg_que_deque: de_idx = %x\r\n", g_str_msg_que.de_idx);

    osp_post_sem(g_str_msg_que.sem);

    return OSP_OK;
}


