七:server与client端之间的通信

2024-11-07  本文已影响0人  xqiiitan

首先要知道IPCMSG之间的通信情况,IPCMSG之间采用的是共享内存;
server与client端的通信是以HI_MSG_SendSync函数来传递信息的

cs通信
HI_S32 HI_MSG_SendSync(HI_S32 s32MsgID, const HI_VOID* pvRequest, HI_U32 u32ReqLen, HI_MSG_PRIV_DATA_S* pstPrivData, HI_VOID* pvResponse, HI_U32 u32RespLen)
{
    HI_S32 s32Ret = HI_SUCCESS;
    HI_IPCMSG_MESSAGE_S* pstReq = NULL;
    HI_IPCMSG_MESSAGE_S* pstResp = NULL;

    HI_APPCOMM_CHECK_EXPR(-1 != g_s32MsgFd, HI_ENOINIT);
    
    // 创建消息
    pstReq = HI_IPCMSG_CreateMessage(0, (HI_U32)s32MsgID, (HI_VOID*)pvRequest, u32ReqLen);

    if (pstReq)
    {
        if(pstPrivData != NULL)
        {
            memcpy(pstReq->as32PrivData, pstPrivData->as32PrivData, sizeof(HI_S32)*HI_IPCMSG_PRIVDATA_NUM);
        }
        //发送同步消息,同步消息是阻塞接口,会等待对端消息命令处理完成后再返回,所以对端必须回复。
        s32Ret = HI_IPCMSG_SendSync(g_s32MsgFd, pstReq, &pstResp, MSG_SEND_SYNC_TIMEOUT);
        HI_IPCMSG_DestroyMessage(pstReq);

        if (HI_SUCCESS != s32Ret || NULL == pstResp)
        {
            HI_LOG_PrintH32(s32MsgID);
            HI_LOG_PrintFuncErr(HI_IPCMSG_SendSync, s32Ret);
            return HI_EINTER;
        }
        else
        {
            s32Ret = pstResp->s32RetVal;

            if (NULL != pvResponse && NULL != pstResp->pBody && 0 < u32RespLen)
            {
                memcpy(pvResponse, pstResp->pBody, u32RespLen);
            }

            HI_IPCMSG_DestroyMessage(pstResp);
            return s32Ret;
        }
    }
    return HI_EINTER;
}

消息发送1:【Linux端】--> 【LiteOS端】

vio_main.c 【Linux端】 线程运行,判断是白天黑夜模式,
->  DeinitMedia_vivpss();
->  修改Config.framerate 帧率
->  InitMedia_vivpss(0);
->  YX_UART_Set_Staic3DNR() // yx_uartmsg.c 
    开始发送消息。马上进入【LiteOS端】。
-> HI_MSG_SendSync(HI_UARTMSG_COMM_MOD_OTHER, data, 1, &pstPrivData, NULL, HI_NULL); 
        //  pstPrivData.as32PrivData[0]= HI_UARTMSG_SET_3DNR; // key设置

【LiteOS端】

HI_MSG_RegisterMsgProc(HI_UARTMSG_COMM_MOD_OTHER, MSG_UART_OTHER_PROC,NULL); // key 方法映射 MSG_UART_OTHER_PROC
        { HI_UARTMSG_SET_3DNR, YX_UARTMSG_Set3DNR }, // key 方法映射
hi_uartmsg_server.c  // 运行在LiteOS端,调用方法。
    MSG_UART_OTHER_PROC() 匹配key, 解析到参数ViPipe、VpssGrp
    -> HI_UARTMSG_SET_3DNR【key=pstPrivData->as32PrivData[0]】
        -> YX_UART_Set_Staic3DNR() 
            -> HI_MPI_VI_GetPipeAttr()
            -> HI_MPI_VI_SetPipeAttr()
            -> HI_MPI_VPSS_GetGrpAttr()
            -> HI_MPI_VPSS_SetGrpAttr()

其他

lcd_main.c

InitMedia()-> HI_HAL_SCREEN_Init--> HI_MSG_SendSync(MSG_HAL_SCREEN_INIT)
-> HI_IPCMSG_CreateMessage()
-> HI_IPCMSG_SendSync()/HI_IPCMSG_SendAsync()  发送消息出去。

HI_MSG_CLIENT_Init-- HI_IPCMSG_AddService-- HI_IPCMSG_Connect——- MSG_CLIENT_Run-- HI_IPCMSG_Run(g_s32MsgFd);
上一篇 下一篇

猜你喜欢

热点阅读