nt9856x/code/application/sifarsdk/333DE/hal/MessageQueue.cpp

63 lines
2.1 KiB
C++

#include "MessageQueue.h"
#include "Log.h"
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
MessageQueue::MessageQueue(const SF_CHAR *path) : pathname(path)
{
pMsgQueueId = -1;
}
SINT32 MessageQueue::MessageQueueCreate(void)
{
key_t key;
SF_CHAR touchPath[128] = {0};
if (access(pathname, F_OK) != 0)
{
sprintf(touchPath, "%s %s", "touch", pathname);
system(touchPath);
}
if ((key = ftok(pathname, 'z')) < 0)
{
LogInfo("ftok error");
return SF_FAILURE;
}
if ((pMsgQueueId = msgget(key, IPC_CREAT | 0660)) == -1)
{
LogError("MsgQueueId = %#x\n", pMsgQueueId);
LogError("msgget failed errno.%02d is: %s\n", errno, strerror(errno));
return SF_FAILURE;
}
LogInfo("MsgQueueId = %#x\n", pMsgQueueId);
return SF_SUCCESS;
}
SINT32 MessageQueue::MessageQueueRecv(SF_MESSAGE_BUF_S *pMessageBuf)
{
// size_t msgsz = sizeof(pMessageBuf->cmdId) + sizeof(pMessageBuf->s32Wait) + sizeof(pMessageBuf->arg1) + sizeof(pMessageBuf->arg2) + sizeof(pMessageBuf->arg3);
size_t msgsz = sizeof(pMessageBuf->cmdId) + sizeof(pMessageBuf->s32Wait) + sizeof(pMessageBuf->paramLen) + QUEUE_BUF_LENGTH;
if (msgrcv(pMsgQueueId, pMessageBuf, msgsz, 0, IPC_NOWAIT) == -1)
{
return SF_FAILURE;
}
return SF_SUCCESS;
}
SINT32 MessageQueue::MessageQueueSend(SF_MESSAGE_BUF_S *pMessageBuf)
{
if (!pMessageBuf)
{
LogError("pMessageBuf is nullptr.\n");
return SF_FAILURE;
}
pMessageBuf->mtype = 1;
// size_t msgsz = sizeof(pMessageBuf->cmdId) + sizeof(pMessageBuf->s32Wait) + sizeof(pMessageBuf->arg1) + sizeof(pMessageBuf->arg2) + sizeof(pMessageBuf->arg3);
size_t msgsz = sizeof(pMessageBuf->cmdId) + sizeof(pMessageBuf->s32Wait) + sizeof(pMessageBuf->paramLen) + pMessageBuf->paramLen;
if (msgsnd(pMsgQueueId, pMessageBuf, msgsz, 0) == -1)
{
return SF_FAILURE;
}
return SF_SUCCESS;
}