PV1_MakeProject/Framework/libuvEngine/libuv_dbus.c

2309 lines
65 KiB
C

#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <linux/input.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/sendfile.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/vfs.h>
#include <uthash/utlist.h>
#include "log.h"
#include "libuv_dbus.h"
#include "json_struct.h"
#include "inet_api.h"
#include "crypto.h"
#include "server_addr.h"
#ifdef ENABLE_COUNT_DEBUG
#include "monitor.h"
#endif
#ifdef ENABLE_COUNT_DEBUG
#define MON_MSG_PROC_STAT ("Message Process")
#define MON_MSG_BST_PROC_STAT ("Boardcast Message Process")
#define MON_USER_MSG_PROC_STAT ("User Message Process")
#define MON_USER_MSG_BST_PROC_STAT ("User Boardcast Message Process")
#endif
typedef void (*OnDBusSendError)(int, void*);
static void uvOpenKeyEventCb(uv_fs_t* puvFs);
typedef struct LOOP_TASK_ARRAY
{
uv_loop_t* pLoop;
int isRunning;
struct LOOP_TASK_ARRAY *next, *prev;
} *PLOOP_TASK_ARRAY;
typedef struct
{
key_t shmKey;
// uint32_t tarMask;
// uint32_t tmSend;
uint32_t msgSize;
UT_hash_handle hh; ///< UT Hash handle
} UV_SHM_ITEM, *PUV_SHM_ITEM;
typedef struct
{
long int msgMask;
unsigned char pMsgContext[0];
} DBUS_MSG_DATA, *PDBUS_MSG_DATA;
typedef struct
{
DBusConnection* pBus;
const char* pBusName;
uint32_t busCmd;
JSON_ENGINE_TYPE type;
void* pStruct;
int iSize;
OnDBusAsyncSendTo cbSendTo;
int enBase64;
} DBUS_ASYNC_PARAMS, *PDBUS_ASYNC_PARAMS;
static LIBUV_DBUS_PARAMS g_LibuvDBusParam;
static uv_idle_t g_uvIdleHandle;
static uv_timer_t g_uvTimerPing;
static uv_fs_t g_uvKeyEvent;
static WORKDAY_INFO g_workDayArray;
static WIFI_STATUS g_WifiConnStatus = WIFI_CONNECTED;
static PDBUS_MSG_PROC g_pMsgProcList = NULL;
static uv_rwlock_t g_uvLoopRwLock;
static PLOOP_TASK_ARRAY g_LoopArray = NULL;
static unsigned int g_EnHBLExit = TRUE;
static uv_rwlock_t g_uvMsgProcRwLock;
#if USED_SHM_TO_DBUS
static uv_rwlock_t g_uvShmHashRwLock;
static PUV_SHM_ITEM g_pShmTbl = NULL;
static void __addShmIdToTable(key_t shmKey, uint32_t tmSend, uint32_t tarMask, uint32_t msgSize)
{
PUV_SHM_ITEM pItem = NULL;
uv_rwlock_rdlock(&g_uvShmHashRwLock);
HASH_FIND_INT(g_pShmTbl, &shmKey, pItem);
uv_rwlock_rdunlock(&g_uvShmHashRwLock);
if(pItem == NULL)
{
pItem = (PUV_SHM_ITEM)malloc(sizeof(UV_SHM_ITEM));
memset(pItem, 0, sizeof(UV_SHM_ITEM));
pItem->shmKey = shmKey;
uv_rwlock_wrlock(&g_uvShmHashRwLock);
HASH_ADD_INT(g_pShmTbl, shmKey, pItem);
uv_rwlock_wrunlock(&g_uvShmHashRwLock);
}
pItem->tmSend = tmSend;
pItem->tarMask = tarMask;
pItem->msgSize = msgSize;
}
static void __removeReqIdFromTable(key_t shmKey)
{
PUV_SHM_ITEM pItem = NULL;
uv_rwlock_rdlock(&g_uvShmHashRwLock);
HASH_FIND_INT(g_pShmTbl, &shmKey, pItem);
uv_rwlock_rdunlock(&g_uvShmHashRwLock);
if(pItem != NULL)
{
uv_rwlock_wrlock(&g_uvShmHashRwLock);
HASH_DEL(g_pShmTbl, pItem);
uv_rwlock_wrunlock(&g_uvShmHashRwLock);
free(pItem);
}
}
static void __uvShmTblTaskThreadCb(void *pParam)
{
struct timeval tv;
PUV_SHM_ITEM pItem = NULL, pTmpItem = NULL;
while(TRUE)
{
gettimeofday(&tv, NULL);
HASH_ITER(hh, g_pShmTbl, pItem, pTmpItem)
{
int msgId;
if(tv.tv_sec - pItem->tmSend <= 60)
{
continue;
}
msgId = shmget((key_t)pItem->shmKey, pItem->msgSize, 0666 | IPC_CREAT);
if(msgId == -1)
{
continue;
}
// Not Boardcast Message
if((pItem->tarMask & 0xFFFF0000) != 0xFFFF0000)
{
PDBUS_MSG_DATA pData = (PDBUS_MSG_DATA)shmat(msgId, NULL, 0);
if(pData == (void*)-1)
{
continue;
}
// Nevery Recevied By Anyone
if(pData->msgMask == pItem->tarMask)
{
continue;
}
shmdt(pData);
shmctl(msgId, IPC_RMID, 0);
__removeReqIdFromTable((key_t)pItem->shmKey);
}
}
sleep(1);
}
pthread_detach(pthread_self());
}
#endif
PLIBUV_DBUS_PARAMS DBusLibuvGetRuntime(void)
{
if(g_LibuvDBusParam.pBus == NULL || g_LibuvDBusParam.pLoop == NULL)
{
return NULL;
}
return &g_LibuvDBusParam;
}
MODULE_NAME DBusLibGetModName(void)
{
return g_LibuvDBusParam.modName;
}
uv_loop_t* GetDBusDefaultLoop(void)
{
if(g_LibuvDBusParam.pBus == NULL || g_LibuvDBusParam.pLoop == NULL)
{
return uv_default_loop();
}
return g_LibuvDBusParam.pLoop;
}
static void uvAsyncCb(uv_async_t* pAsync)
{
DBusConnection* pConn = (DBusConnection*)pAsync->data;
dbus_connection_read_write(pConn, 0);
while(dbus_connection_dispatch(pConn) == DBUS_DISPATCH_DATA_REMAINS);
}
static void uvTimeoutCb(uv_timer_t* pTimer)
{
DBusTimeout* timeout = (DBusTimeout*)pTimer->data;
dbus_timeout_handle(timeout);
}
static void uvPollCb(uv_poll_t* pPoll, int status, int events)
{
DBusWatch* watch = (DBusWatch*)pPoll->data;
unsigned int uvFlags = 0;
if(events & UV_READABLE)
{
uvFlags |= DBUS_WATCH_READABLE;
}
if(events & UV_WRITABLE)
{
uvFlags |= DBUS_WATCH_WRITABLE;
}
dbus_watch_handle(watch, uvFlags);
}
static void uvIdleCb(uv_idle_t* phuvIdle)
{
usleep(1000);
}
static void uvFsAccessCb(uv_fs_t* puvFs)
{
if(puvFs->result != 0)
{
IHW_EnableLogLevel((LOG_LEVEL)(LOG_Fatal | LOG_Error | LOG_Warn | LOG_Debug | LOG_Info), 1);
}
uv_fs_req_cleanup(puvFs);
free(puvFs);
}
static void uvReadKeyEventCb(uv_fs_t* puvFs)
{
if(puvFs->result < 0)
{
uv_fs_req_cleanup(puvFs);
return;
}
else if(puvFs->result == 0)
{
uv_fs_t uvClose;
uv_fs_close(g_LibuvDBusParam.pLoop, &uvClose, g_uvKeyEvent.result, NULL);
}
else
{
uv_buf_t* puvIov = (uv_buf_t*)puvFs->data;
if(puvIov->len == sizeof(struct input_event))
{
struct input_event* pKeyEvt = (struct input_event*)puvIov->base;
if(g_LibuvDBusParam.onKeyCb)
{
// LOG_EX(LOG_Info, "type = %u, code = %u, value = %u\n", pKeyEvt->type, pKeyEvt->code, pKeyEvt->value);
g_LibuvDBusParam.onKeyCb(pKeyEvt->type, pKeyEvt->code, pKeyEvt->value);
}
}
}
uv_fs_req_cleanup(puvFs);
usleep(1000);
uv_fs_open(g_LibuvDBusParam.pLoop, &g_uvKeyEvent, R16_TINA_KEY_EVENT_PATH, O_RDONLY, 0, uvOpenKeyEventCb);
}
static void uvOpenKeyEventCb(uv_fs_t* puvFs)
{
static uv_buf_t uvIoV;
static struct input_event keyEvent;
if(puvFs->result < 0)
{
LOG_EX(LOG_Error, "Open Key Event File[%s] Error: %d\n", R16_TINA_KEY_EVENT_PATH, puvFs->result);
uv_fs_req_cleanup(puvFs);
return;
}
uvIoV = uv_buf_init((void*)&keyEvent, sizeof(struct input_event));
puvFs->data = (void*)&uvIoV;
uv_fs_read(g_LibuvDBusParam.pLoop, &g_uvKeyEvent, puvFs->result, &uvIoV, 1, -1, uvReadKeyEventCb);
uv_fs_req_cleanup(puvFs);
return;
}
static void DBusAsyncFreeCb(void* pData)
{
uv_async_t* pAsync = (uv_async_t*)pData;
if(pAsync)
{
pAsync->data = NULL;
uv_close((uv_handle_t*)pAsync, (uv_close_cb)free);
}
}
static void DBusPollFreeCb(void* pData)
{
uv_poll_t* pPoll = (uv_poll_t*)pData;
if(pPoll)
{
pPoll->data = NULL;
uv_ref((uv_handle_t*)pPoll);
uv_poll_stop(pPoll);
uv_close((uv_handle_t*)pPoll, (uv_close_cb)free);
}
}
static dbus_bool_t DBusAddWatchCb(DBusWatch* pWatch, void* pData)
{
static int isCreate = 0;
int fdDBus, uvPollFlags = 0;
unsigned int dBusWatchFlags;
uv_poll_t* pPoll = NULL;
uv_loop_t* pLoop = (uv_loop_t*)pData;
if(!dbus_watch_get_enabled(pWatch)
|| dbus_watch_get_data(pWatch) != NULL
|| isCreate != 0)
{
return TRUE;
}
fdDBus = dbus_watch_get_unix_fd(pWatch);
dBusWatchFlags = dbus_watch_get_flags(pWatch);
if(dBusWatchFlags & DBUS_WATCH_READABLE)
{
uvPollFlags |= UV_READABLE;
}
if(dBusWatchFlags & DBUS_WATCH_WRITABLE)
{
uvPollFlags |= UV_WRITABLE;
}
pPoll = (uv_poll_t*)malloc(sizeof(uv_poll_t));
pPoll->data = (void*)pWatch;
uv_poll_init(pLoop, pPoll, fdDBus);
uv_poll_start(pPoll, uvPollFlags, uvPollCb);
LOG_EX(LOG_Debug, "Create POOL by FD: %d\n", fdDBus);
uv_unref((uv_handle_t*)pPoll);
dbus_watch_set_data(pWatch, (void*)pPoll, DBusPollFreeCb);
isCreate = 1;
return TRUE;
}
static void DBusRemoveWatchCb(DBusWatch* pWatch, void* pData)
{
uv_poll_t* pPoll = (uv_poll_t*)dbus_watch_get_data(pWatch);
if(pPoll)
{
dbus_watch_set_data(pWatch, NULL, NULL);
}
}
static void DBusNotifyWatchCb(DBusWatch* pWatch, void* pData)
{
if(dbus_watch_get_enabled(pWatch))
{
DBusAddWatchCb(pWatch, pData);
}
else
{
DBusRemoveWatchCb(pWatch, pData);
}
}
static void DBusTimeoutFreeCb(void* pData)
{
uv_timer_t* pTimer = (uv_timer_t*)pData;
if(pTimer == NULL)
{
return;
}
pTimer->data = NULL;
uv_timer_stop(pTimer);
uv_unref((uv_handle_t*)pTimer);
uv_close((uv_handle_t*)pTimer, (uv_close_cb)free);
}
static dbus_bool_t DBusAddTimeoutCb(DBusTimeout* pTimeout, void* pData)
{
uv_timer_t* pTimer = NULL;
uv_loop_t* pLoop = (uv_loop_t*)pData;
if(!dbus_timeout_get_enabled(pTimeout)
|| dbus_timeout_get_data(pTimeout) != NULL)
{
return TRUE;
}
pTimer = (uv_timer_t*)malloc(sizeof(uv_timer_t));
pTimer->data = pTimeout;
uv_timer_init(pLoop, pTimer);
uv_timer_start(pTimer, uvTimeoutCb, dbus_timeout_get_interval(pTimeout), 0);
dbus_timeout_set_data(pTimeout, (void*)pTimer, DBusTimeoutFreeCb);
return TRUE;
}
static void DBusRemoveTimeoutCb(DBusTimeout* pTimeout, void* pData)
{
uv_timer_t* pTimer = (uv_timer_t*)dbus_timeout_get_data(pTimeout);
if(pTimer)
{
dbus_timeout_set_data(pTimeout, NULL, NULL);
}
}
static void DBusNotifyTimeoutCb(DBusTimeout* pTimeout, void* pData)
{
if(dbus_timeout_get_enabled(pTimeout))
{
DBusAddTimeoutCb(pTimeout, pData);
}
else
{
DBusRemoveTimeoutCb(pTimeout, pData);
}
}
static void DBusWakeupMainLoopCb(void* pData)
{
uv_async_t* pAsync = (uv_async_t*)pData;
uv_async_send(pAsync);
}
static void FreeDBusOnMsgCb(uv_work_t* pWork, int status)
{
PDBUS_MSG_PACK pMsg = (PDBUS_MSG_PACK)pWork->data;
if(pMsg)
{
free(pMsg);
}
free(pWork);
}
#if 0
static void DBusOnBoardcastMsgWorkCb(uv_work_t* pWork)
#else
static int DBusOnBoardcastMsgWorkCb(PDBUS_MSG_PACK pMsg)
#endif
{
pMsg->isBstMsg = TRUE;
// Message context on dbus message pad
if(pMsg->msgSize < DBUS_MSG_MAX_PAD_SIZE)
{
if(pMsg->busCmd == CMD_WIFI_STATE_NTF)
{
int err = 0;
PWIFI_STATUS_PRO pWifiInfo = (PWIFI_STATUS_PRO)Json2Struct((const char *)pMsg->pMsg,
JSON_WIFI_STATUS_NOTIFY, FALSE, &err);
//LOG_EX(LOG_Debug, "pWifiInfo: %s\n", pMsg->pMsg);
if(pWifiInfo && err == 0)
{
if(pWifiInfo->wifi_evt == 0)
{
g_WifiConnStatus = WIFI_CONNECTED;
}
else
{
g_WifiConnStatus = WIFI_DISCONNECTED;
}
}
if(pWifiInfo)
{
free(pWifiInfo);
}
}
else if(pMsg->busCmd == CMD_CFG_UPG_NOTIFY)
{
}
else if(pMsg->busCmd == CMD_LOG_CONFIG)
{
int err = 0;
PLOG_CFG_PROTOCOL pCfgInfo = (PLOG_CFG_PROTOCOL)Json2Struct((const char *)pMsg->pMsg,
JSON_ENGINE_LOG_CFG_CMD, FALSE, &err);
//LOG_EX(LOG_Debug, "pCfgInfo: %s\n", pMsg->pMsg);
if(pCfgInfo && err == 0)
{
UpgradLogConfigure(pCfgInfo);
}
if(pCfgInfo)
{
free(pCfgInfo);
}
}
else if(pMsg->busCmd != CMD_MISC_PING)
{
pMsg->msgDests = 0xFFFFFFFF;
if(g_LibuvDBusParam.onMsgCb)
{
g_LibuvDBusParam.onMsgCb(g_LibuvDBusParam.pLoop, g_LibuvDBusParam.pBus, pMsg);
}
return 1;
}
}
return 0;
}
#if 0
static void DBusOnMsgWorkAPICb(uv_work_t* pWork)
#else
static int DBusOnMsgWorkAPICb(PDBUS_MSG_PACK pMsg)
#endif
{
int err = 0;
pMsg->isBstMsg = FALSE;
// Message context on dbus message pad
if(pMsg->msgSize < DBUS_MSG_MAX_PAD_SIZE)
{
if(pMsg->busCmd >= CMD_CFG_ADD_REQ && pMsg->busCmd < CMD_CFG_UPG_NOTIFY)
{
OnCfgMsgProcess(pMsg->msgSrc, pMsg->busCmd, pMsg->pMsg);
}
else if(pMsg->busCmd == CMD_LOG_CONFIG)
{
PLOG_CFG_PROTOCOL pCfgInfo = (PLOG_CFG_PROTOCOL)Json2Struct((const char *)pMsg->pMsg,
JSON_ENGINE_LOG_CFG_CMD, FALSE, &err);
//LOG_EX(LOG_Debug, "pCfgInfo: %s\n", pMsg->pMsg);
if(pCfgInfo && err == 0)
{
UpgradLogConfigure(pCfgInfo);
}
if(pCfgInfo)
{
free(pCfgInfo);
}
}
else if(pMsg->busCmd == CMD_WORKDAY_DB_RSP)
{
PWORKDAY_INFO pWorkDayInfo = (PWORKDAY_INFO)Json2Struct((const char *)pMsg->pMsg,
JSON_ENGINE_WORKDAY_REQ, FALSE, &err);
//LOG_EX(LOG_Debug, "WorkDay: %s\n", pMsg->pMsg);
if(pWorkDayInfo && err == 0)
{
memcpy(&g_workDayArray, pWorkDayInfo, sizeof(WORKDAY_INFO));
}
//LOG_EX2(LOG_Debug, "Database: %s\n", pMsg->pMsg);
if(pWorkDayInfo)
{
free(pWorkDayInfo);
}
}
else if(pMsg->busCmd != CMD_MISC_PING)
{
if(g_LibuvDBusParam.onMsgCb)
{
g_LibuvDBusParam.onMsgCb(g_LibuvDBusParam.pLoop, g_LibuvDBusParam.pBus, pMsg);
}
return 1;
}
}
else // More than 4K size used Share Memory
{
LOG_EX(LOG_Error, "Receive Message Error Size: %d\n", pMsg->msgSize);
#if 0
PDBUS_MSG_DATA pData = NULL;
int key = strtol(pMsg->pMsg, NULL, 10);
int msgId = shmget((key_t)key, pMsg->msgSize, 0666 | IPC_CREAT);
if(msgId == -1)
{
return;
}
pData = (PDBUS_MSG_DATA)shmat(msgId, NULL, 0);
if(pData == (void*)-1)
{
return;
}
//print_hex_dump_bytes("send_", 2, pData, pMsg->msgSize);
pMsg->pMsg = pData->pMsgContext;
pMsg->msgSize -= sizeof(long int);
if(pMsg->busCmd != CMD_MISC_PING)
{
g_LibuvDBusParam.onMsgCb(g_LibuvDBusParam.pLoop, g_LibuvDBusParam.pBus, pMsg);
}
pData->msgMask &= ~(1 << g_LibuvDBusParam.modName);
// Cleanup Share Memory
if(pData->msgMask == 0)
{
shmctl(msgId, IPC_RMID, 0);
#if USED_SHM_TO_DBUS
__removeReqIdFromTable((key_t)key);
#endif
}
shmdt(pData);
#endif
}
return 0;
}
static DBusHandlerResult DBusOnMsgCb(DBusConnection* pConn, DBusMessage* pMsg, void* user_data)
{
#if 0
struct timeval tmBegin, tmEnd;
long long diffTm;
#endif
DBusError error;
PDBUS_MSG_PROC pMsgProc = NULL;
PDBUS_MSG_PACK pMsgPack = (PDBUS_MSG_PACK)malloc(sizeof(DBUS_MSG_PACK));
if(pMsgPack == NULL)
{
LOG_EX(LOG_Error, "Receive Message: No Memory\n");
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
memset(pMsgPack, 0, sizeof(DBUS_MSG_PACK));
dbus_error_init(&error);
if(dbus_message_is_signal(pMsg, DBUS_MESSAGE_INTERFACE_NAME, "Notify"))
{
if(dbus_message_get_args(pMsg, &error,
DBUS_TYPE_UINT32, &pMsgPack->msgSrc, // from
DBUS_TYPE_UINT32, &pMsgPack->msgDests, // to -1 means all except it's self
#if USED_SHM_TO_DBUS
DBUS_TYPE_UINT32, &pMsgPack->tmTickMSec, // timestamp for msecond
#endif
DBUS_TYPE_UINT32, &pMsgPack->busCmd, // command type
DBUS_TYPE_STRING, &pMsgPack->pMsg, // message context if had
DBUS_TYPE_INVALID))
{
pMsgPack->msgSize = strlen((char*)pMsgPack->pMsg);
// reset timeout timer
if(g_LibuvDBusParam.onHblCb && pMsgPack->msgSrc != g_LibuvDBusParam.modName)
{
HeartDaemonUpgrade(pMsgPack->msgSrc);
}
// Dispatch message except from it's self
if(pMsgPack->msgSrc != g_LibuvDBusParam.modName
&& pMsgPack->msgDests & (1 << g_LibuvDBusParam.modName))
{
if(g_LibuvDBusParam.onMsgCb == NULL)
{
pMsgProc = (PDBUS_MSG_PROC)malloc(sizeof(struct DBUS_MSG_PROC));
if(pMsgProc == NULL)
{
LOG_EX(LOG_Error, "Receive Message: No Memory\n");
free(pMsgPack);
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
memset(pMsgProc, 0, sizeof(struct DBUS_MSG_PROC));
memcpy(&pMsgProc->msgContent, pMsgPack, sizeof(DBUS_MSG_PACK));
pMsgProc->msgContent.pMsg = strdup(pMsgPack->pMsg);
pMsgProc->msgFrom = 0;
uv_rwlock_wrlock(&g_uvMsgProcRwLock);
DL_APPEND(g_pMsgProcList, pMsgProc);
uv_rwlock_wrunlock(&g_uvMsgProcRwLock);
}
else
{
DBusOnBoardcastMsgWorkCb(pMsgPack);
}
}
}
else
{
LOG_EX(LOG_Error, "Receive Notify Message Error: %s\n", error.message);
dbus_error_free(&error);
}
free(pMsgPack);
return DBUS_HANDLER_RESULT_HANDLED;
}
else if(dbus_message_is_method_call(pMsg, DBUS_MESSAGE_INTERFACE_NAME, "API"))
{
if(dbus_message_get_args(pMsg, &error,
DBUS_TYPE_UINT32, &pMsgPack->msgSrc, // from
DBUS_TYPE_UINT32, &pMsgPack->msgDests, // to -1 means all except it's self
#if USED_SHM_TO_DBUS
DBUS_TYPE_UINT32, &pMsgPack->tmTickMSec, // timestamp for msecond
#endif
DBUS_TYPE_UINT32, &pMsgPack->busCmd, // command type
DBUS_TYPE_UINT32, &pMsgPack->msgSize, // message size(in bytes)
DBUS_TYPE_STRING, &pMsgPack->pMsg, // message context if had
DBUS_TYPE_INVALID))
{
// reset timeout timer
if(g_LibuvDBusParam.onHblCb && pMsgPack->msgSrc != g_LibuvDBusParam.modName)
{
HeartDaemonUpgrade(pMsgPack->msgSrc);
}
// Dispatch message except from it's self
if(pMsgPack->msgSrc != g_LibuvDBusParam.modName
&& pMsgPack->msgDests == (1 << g_LibuvDBusParam.modName))
{
if(g_LibuvDBusParam.onMsgCb == NULL)
{
pMsgProc = (PDBUS_MSG_PROC)malloc(sizeof(struct DBUS_MSG_PROC));
if(pMsgProc == NULL)
{
LOG_EX(LOG_Error, "Receive Message: No Memory\n");
free(pMsgPack);
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
memset(pMsgProc, 0, sizeof(struct DBUS_MSG_PROC));
memcpy(&pMsgProc->msgContent, pMsgPack, sizeof(DBUS_MSG_PACK));
pMsgProc->msgContent.pMsg = strdup(pMsgPack->pMsg);
pMsgProc->msgFrom = 1;
uv_rwlock_wrlock(&g_uvMsgProcRwLock);
DL_APPEND(g_pMsgProcList, pMsgProc);
uv_rwlock_wrunlock(&g_uvMsgProcRwLock);
}
else
{
DBusOnMsgWorkAPICb(pMsgPack);
}
}
}
else
{
LOG_EX(LOG_Error, "Receive API Message Error: %s\n", error.message);
dbus_error_free(&error);
}
free(pMsgPack);
return DBUS_HANDLER_RESULT_HANDLED;
}
free(pMsgPack);
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
static void freeSHMResource(int shmId, void* pData)
{
// Cleanup Share Memory
if(pData)
{
shmdt(pData);
}
shmctl(shmId, IPC_RMID, 0);
}
static void FreeDBusSendToAsyncCb(uv_work_t* pWork, int status)
{
PDBUS_ASYNC_PARAMS pParam = (PDBUS_ASYNC_PARAMS)pWork->data;
free(pParam->pStruct);
free(pParam);
free(pWork);
}
static void DBusSendToAsyncCb(uv_work_t* pWork)
{
int err = 0;
PDBUS_ASYNC_PARAMS pParam = (PDBUS_ASYNC_PARAMS)pWork->data;
const char *pJsonStr = Struct2Json(pParam->pStruct, pParam->type, pParam->enBase64, &err);
if(pJsonStr == NULL || err != 0)
{
pParam->cbSendTo(err);
return;
}
err = DBusSendToCommand(pParam->pBus, pParam->pBusName, pParam->busCmd, pJsonStr);
free((void*)pJsonStr);
pParam->cbSendTo(err);
}
int DBusJsonSendToCommandAsync(DBusConnection* pBus,
const char* pBusName,
uint32_t busCmd,
JSON_ENGINE_TYPE type,
void* pStruct,
int iSize,
OnDBusAsyncSendTo cbSendTo,
int enBase64)
{
PDBUS_ASYNC_PARAMS pParam = NULL;
uv_work_t* puvWork = NULL;
if(cbSendTo == NULL)
{
return 0;
}
pParam = (PDBUS_ASYNC_PARAMS)malloc(sizeof(DBUS_ASYNC_PARAMS));
puvWork = (uv_work_t*)malloc(sizeof(uv_work_t));
pParam->pBus = pBus;
pParam->pBusName = pBusName;
pParam->busCmd = busCmd;
pParam->type = type;
pParam->iSize = iSize;
pParam->pStruct = malloc(iSize);
pParam->cbSendTo = cbSendTo;
pParam->enBase64 = enBase64;
memcpy(pParam->pStruct, pStruct, iSize);
puvWork->data = (void*)pParam;
uv_queue_work(g_LibuvDBusParam.pLoop, puvWork, DBusSendToAsyncCb, FreeDBusSendToAsyncCb);
return 0;
}
int DBusJsonSendToCommand(DBusConnection* pBus,
const char* pBusName,
uint32_t busCmd,
JSON_ENGINE_TYPE type,
void* pStruct,
int enBase64)
{
int ret, err = 0;
const char* pJsonStr = Struct2Json(pStruct, type, enBase64, &err);
if(pJsonStr == NULL || err != 0)
{
return err;
}
ret = DBusSendToCommand(pBus, pBusName, busCmd, pJsonStr);
free((void*)pJsonStr);
return ret;
}
int DBusJsonBoardcastCommand(DBusConnection* pBus,
uint32_t msgToMask,
uint32_t busCmd,
JSON_ENGINE_TYPE type,
void* pStruct,
int enBase64)
{
int ret, err = 0;
const char* pJsonStr = Struct2Json(pStruct, type, enBase64, &err);
if(pJsonStr == NULL || err != 0)
{
return err;
}
ret = DBusBoardcastCommand(pBus, msgToMask, busCmd, pJsonStr);
free((void*)pJsonStr);
return ret;
}
static unsigned int __getShmReqId(void)
{
static unsigned int g_shmReqId = 1;
unsigned int iReqId;
if(g_shmReqId >= 0xFFFF - 1)
{
g_shmReqId = 1;
}
iReqId = __sync_fetch_and_add(&g_shmReqId, 1);
return (iReqId & 0xFFFF) | (g_LibuvDBusParam.modName << 16);
}
int DBusSendToCommand(DBusConnection* pBus,
const char* pBusName,
uint32_t busCmd,
const char* pContext)
{
#if USED_SHM_TO_DBUS
struct timeval tv;
#endif
int i;
int msgId;
//char msgContext[DBUS_MSG_MAX_PAD_SIZE];
DBusMessage* pMsg = NULL;
uint32_t msgLen = 0;
uint32_t msgToMask = 0;
OnDBusSendError pErrorCb = NULL;
uint8_t* pMsgInfo = NULL;
PDBUS_MSG_DATA pShmData = NULL;
const char* pPath = NULL;
char* pMsgContent = NULL;
#if 0
if(pContext == NULL || (msgLen = strlen(pContext)) <= 0)
{
return (-ERR_INPUT_PARAMS);
}
#else
if(pContext == NULL)
{
pContext = "";
msgLen = 0;
}
else
{
msgLen = strlen(pContext);
}
#endif
pMsgContent = (char*)malloc(msgLen + 1);
if(pMsgContent == NULL)
{
LOG_EX(LOG_Error, "Malloc memory %d error\n", msgLen + 1);
return -ERR_MALLOC_MEMORY;
}
pMsgInfo = (uint8_t*)pMsgContent;
memset(pMsgContent, 0, msgLen + 1);
if(pBus == NULL)
{
pBus = g_LibuvDBusParam.pBus;
}
for(i = 0; (i < sizeof(g_pModInfoTable) / sizeof(g_pModInfoTable[0])); i++)
{
// Skip match it'self
if(strcmp(g_pModInfoTable[i].modAliase, pBusName) == 0)
{
msgToMask = 1 << i;
pPath = g_pModInfoTable[i].modPath;
break;
}
}
pMsg = dbus_message_new_method_call(pBusName,
pPath,
DBUS_MESSAGE_INTERFACE_NAME,
"API");
if(pMsg == NULL)
{
free(pMsgContent);
LOG_EX(LOG_Error, "DBus Create Message Error\n");
return -ERR_DBUS_CREATE_MSG;
}
dbus_message_set_no_reply(pMsg, TRUE);
#if USED_SHM_TO_DBUS
gettimeofday(&tv, NULL);
#endif
if(msgLen < DBUS_MSG_MAX_PAD_SIZE)
{
strcpy(pMsgContent, pContext);
}
else
{
#if 0
int msgKey = __getShmReqId();
msgLen += sizeof(long int);
// Make message with Memory Share
msgId = shmget((key_t)msgKey, msgLen, 0666 | IPC_CREAT);
if(msgId == -1)
{
perror("shmget_");
return (-ERR_CREATE_SHM);
}
else
{
pShmData = (PDBUS_MSG_DATA)shmat(msgId, NULL, 0);
if(pShmData == (void*)-1)
{
return -ERR_MAP_SHM;
}
pShmData->msgMask = msgToMask;
memcpy(pShmData->pMsgContext, pContext, msgLen);
sprintf(pMsgInfo, "%d", msgKey);
shmdt(pShmData);
//print_hex_dump_bytes("send_", 2, pShmData, msgLen);
//strcpy(pMsgInfo, (void*)&msgKey, sizeof(key_t));
#if USED_SHM_TO_DBUS
__addShmIdToTable((key_t)msgKey, tv.tv_sec, msgToMask, msgLen);
#endif
pErrorCb = freeSHMResource;
}
//#else
#endif
free(pMsgContent);
LOG_EX(LOG_Error, "Send Message size %d more than DBUS_MSG_MAX_PAD_SIZE, busCmd = %u, pBusName = %s\n",
msgLen, busCmd, pBusName);
return -ERR_INPUT_PARAMS;
}
dbus_message_append_args(pMsg,
DBUS_TYPE_UINT32, &g_LibuvDBusParam.modName, // from
DBUS_TYPE_UINT32, &msgToMask, // to -1 means all except it's self
#if USED_SHM_TO_DBUS
DBUS_TYPE_UINT32, &tv.tv_sec, // timestamp for msecond
#endif
DBUS_TYPE_UINT32, &busCmd, // command type
DBUS_TYPE_UINT32, &msgLen, // message size(in bytes)
DBUS_TYPE_STRING, &pMsgInfo,
// msgLen[0, 512): pad to message; msgLen[512, ~): memory map key,
//DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &pMsgInfo, (msgLen < DBUS_MSG_MAX_PAD_SIZE) ? msgLen : sizeof(key_t),
DBUS_TYPE_INVALID);
free(pMsgContent);
if(!dbus_connection_send(pBus, pMsg, NULL))
{
LOG_EX(LOG_Error, "Send Message Error\n");
if(pErrorCb)
{
pErrorCb(msgId, pShmData);
}
return -ERR_BUS_SEND_MSG;
}
//dbus_connection_flush(pBus);
dbus_message_unref(pMsg);
usleep(100);
return 0;
}
int DBusBoardcastCommand(DBusConnection* pBus,
uint32_t msgToMask,
uint32_t busCmd,
const char* pContext)
{
#if USED_SHM_TO_DBUS
struct timeval tv;
#endif
DBusMessage* pMsg = NULL;
if(pContext == NULL)
{
pContext = "";
}
if(strlen(pContext) >= DBUS_MSG_MAX_PAD_SIZE)
{
LOG_EX(LOG_Error, "Msg size = %u more than DBUS_MSG_MAX_PAD_SIZE\n", strlen(pContext));
return -ERR_DBUS_MSG_TO_LARGE;
}
if(pBus == NULL)
{
pBus = g_LibuvDBusParam.pBus;
}
pMsg = dbus_message_new_signal(g_LibuvDBusParam.pBusPath, DBUS_MESSAGE_INTERFACE_NAME, "Notify");
if(pMsg == NULL)
{
return -ERR_DBUS_CREATE_MSG;
}
dbus_message_set_no_reply(pMsg, TRUE);
#if USED_SHM_TO_DBUS
gettimeofday(&tv, NULL);
#endif
dbus_message_append_args(pMsg,
DBUS_TYPE_UINT32, &g_LibuvDBusParam.modName, // from
DBUS_TYPE_UINT32, &msgToMask, // to -1 means all except it's self
#if USED_SHM_TO_DBUS
DBUS_TYPE_UINT32, &tv.tv_sec, // timestamp for msecond
#endif
DBUS_TYPE_UINT32, &busCmd, // command type
DBUS_TYPE_STRING, &pContext,
DBUS_TYPE_INVALID);
if(!dbus_connection_send(pBus, pMsg, NULL))
{
return -ERR_BUS_SEND_MSG;
}
//dbus_connection_flush(pBus);
dbus_message_unref(pMsg);
usleep(100);
return 0;
}
static void __addNewLoopTask(uv_loop_t* pLoop)
{
PLOOP_TASK_ARRAY pItem = NULL;
PLOOP_TASK_ARRAY pTask = NULL;
if(pLoop == NULL)
{
return;
}
uv_rwlock_wrlock(&g_uvLoopRwLock);
LL_FOREACH(g_LoopArray, pItem)
{
if(pItem->pLoop == pLoop)
{
LOG_EX(LOG_Warn, "Loop %p is added\n", pLoop);
uv_rwlock_wrunlock(&g_uvLoopRwLock);
return;
}
}
pTask = (PLOOP_TASK_ARRAY)malloc(sizeof(struct LOOP_TASK_ARRAY));
if(pTask == NULL)
{
LOG_EX(LOG_Error, "Malloc Memory Error\n");
return;
}
memset(pTask, 0, sizeof(struct LOOP_TASK_ARRAY));
pTask->pLoop = pLoop;
pTask->isRunning = FALSE;
LL_APPEND(g_LoopArray, pTask);
uv_rwlock_wrunlock(&g_uvLoopRwLock);
}
static void __uvLoopRuntime(void *pParam)
{
uv_loop_t* pLoop = (uv_loop_t*)pParam;
if(pLoop)
{
while(TRUE)
{
uv_run(pLoop, UV_RUN_DEFAULT);
usleep(1000);
}
}
pthread_detach(pthread_self());
}
static void __runUVLoopTask(uv_loop_t* pLoop, void* pCallback)
{
uv_thread_t uvThread;
if(pLoop == NULL)
{
return;
}
uv_thread_create(&uvThread, __uvLoopRuntime, pLoop);
}
void RunUVLoop(uv_loop_t *pLoop)
{
#if 1
int more;
while(TRUE)
{
more = uv_run(g_LibuvDBusParam.pLoop, UV_RUN_ONCE);
if(more == FALSE)
{
more = uv_loop_alive(g_LibuvDBusParam.pLoop);
if(uv_run(g_LibuvDBusParam.pLoop, UV_RUN_NOWAIT) != 0)
{
more = TRUE;
}
}
}
#else
int more;
do
{
if(pLoop && pLoop != g_LibuvDBusParam.pUserLoop)
{
more = uv_run(pLoop, UV_RUN_ONCE);
if(more == FALSE)
{
more = uv_loop_alive(pLoop);
if(uv_run(pLoop, UV_RUN_NOWAIT) != 0)
{
more = TRUE;
}
}
}
if(g_LibuvDBusParam.pUserLoop)
{
more = uv_run(g_LibuvDBusParam.pUserLoop, UV_RUN_ONCE);
if(more == FALSE)
{
more = uv_loop_alive(g_LibuvDBusParam.pUserLoop);
if(uv_run(g_LibuvDBusParam.pUserLoop, UV_RUN_NOWAIT) != 0)
{
more = TRUE;
}
}
}
if(g_LibuvDBusParam.pLoop)
{
more = uv_run(g_LibuvDBusParam.pLoop, UV_RUN_ONCE);
if(more == FALSE)
{
more = uv_loop_alive(g_LibuvDBusParam.pLoop);
if(uv_run(g_LibuvDBusParam.pLoop, UV_RUN_NOWAIT) != 0)
{
more = TRUE;
}
}
}
}
while(TRUE);
//#else
//__runUVLoopTask(pLoop, NULL);
//__addNewLoopTask(pLoop);
#endif
}
static void __uvDBusRecvProc(void *pParams)
{
while(TRUE)
{
DBusMessage* pMsg = NULL;
dbus_connection_read_write(g_LibuvDBusParam.pBus, 0);
pMsg = dbus_connection_pop_message(g_LibuvDBusParam.pBus);
if(pMsg != NULL)
{
DBusOnMsgCb(g_LibuvDBusParam.pBus, pMsg, NULL);
}
usleep(100);
}
}
void DBusMsgCleanup(PDBUS_MSG_PACK pMsg)
{
if(pMsg)
{
if(pMsg->pMsg)
{
free(pMsg->pMsg);
}
free(pMsg);
}
}
PDBUS_MSG_PACK DBusGetMessage(void)
{
int iCount, ret = 0;
PDBUS_MSG_PACK pMsg = NULL;
PDBUS_MSG_PROC pItem = NULL, pTmp = NULL;
if(g_LibuvDBusParam.onMsgCb)
{
return NULL;
}
DL_COUNT(g_pMsgProcList, pItem, iCount);
if(iCount == 0)
{
return pMsg;
}
pItem = NULL;
uv_rwlock_wrlock(&g_uvMsgProcRwLock);
DL_FOREACH_SAFE(g_pMsgProcList, pItem, pTmp)
{
if(pItem->msgFrom == 0)
{
ret = DBusOnBoardcastMsgWorkCb(&pItem->msgContent);
}
else
{
ret = DBusOnMsgWorkAPICb(&pItem->msgContent);
}
if(ret != 0)
{
pMsg = (PDBUS_MSG_PACK)malloc(sizeof(DBUS_MSG_PACK));
if(pMsg)
{
memset(pMsg, 0, sizeof(DBUS_MSG_PACK));
memcpy(pMsg, &pItem->msgContent, sizeof(DBUS_MSG_PACK));
pMsg->pMsg = strdup(pItem->msgContent.pMsg);
}
}
DL_DELETE(g_pMsgProcList, pItem);
free(pItem->msgContent.pMsg);
free(pItem);
break;
}
uv_rwlock_wrunlock(&g_uvMsgProcRwLock);
return pMsg;
}
#if 0
static void __uvMsgProc(void *pParams)
{
#ifdef ENABLE_COUNT_DEBUG
struct timeval tmBegin, tmEnd;
long long diffTm;
#endif
while(TRUE)
{
int iMaxProcMsg = 100;
PDBUS_MSG_PROC pItem = NULL, pTmp = NULL;
uv_rwlock_wrlock(&g_uvMsgProcRwLock);
DL_FOREACH_SAFE(g_pMsgProcList, pItem, pTmp)
{
if(--iMaxProcMsg == 0)
{
break;
}
#ifdef ENABLE_COUNT_DEBUG
gettimeofday(&tmBegin, NULL);
#endif
if(pItem->msgFrom == 0)
{
DBusOnBoardcastMsgWorkCb(&pItem->msgContent);
#ifdef ENABLE_COUNT_DEBUG
gettimeofday(&tmEnd, NULL);
diffTm = (tmEnd.tv_sec * 1000000 + tmEnd.tv_usec) - (tmBegin.tv_sec * 1000000 + tmBegin.tv_usec);
MonUpgradeStatistical(MON_MSG_BST_PROC_STAT, diffTm);
#endif
}
else
{
DBusOnMsgWorkAPICb(&pItem->msgContent);
#ifdef ENABLE_COUNT_DEBUG
gettimeofday(&tmEnd, NULL);
diffTm = (tmEnd.tv_sec * 1000000 + tmEnd.tv_usec) - (tmBegin.tv_sec * 1000000 + tmBegin.tv_usec);
MonUpgradeStatistical(MON_MSG_PROC_STAT, diffTm);
#endif
}
if(pItem->msgContent.pMsg)
{
free(pItem->msgContent.pMsg);
}
DL_DELETE(g_pMsgProcList, pItem);
free(pItem);
}
uv_rwlock_wrunlock(&g_uvMsgProcRwLock);
usleep(1000);
}
pthread_detach(pthread_self());
}
#endif
void SetHBLAutoExit(int flag)
{
g_EnHBLExit = flag ? TRUE : FALSE;
}
static void __dBusDeameonCb(MODULE_NAME modName, int status)
{
LOG_EX(status == 0 ? LOG_Info : LOG_Error,
"Daemon %s(%d) Msg: [%s]\n", ModuleNameToString(modName), modName,
status == 0 ? "Connect" : "Disconnect");
if(status != 0 && modName == MODULE_CONTROLLER && g_EnHBLExit)
{
sleep(1);
//exit(0);
}
}
static void __waitUDISKMount(void)
{
#ifdef PLATFORM_R16
const char* pDoneStat = "done";
const char* pBootStatFile = "/tmp/booting_state";
char buf[5];
FILE* pFile;
// wait system create setup status file
LOG_EX(LOG_Debug, "Wait boot status file create ......\n");
while(access(pBootStatFile, F_OK) != 0)
{
usleep(10000);
}
pFile = fopen(pBootStatFile, "rb");
if(pFile == NULL)
{
LOG_EX(LOG_Error, "Open boot status file error\n");
return;
}
LOG_EX(LOG_Debug, "Wait boot status done ......\n");
// when UDISK mount, file /tmp/booting_state content is "done"
do
{
fseek(pFile, 0, SEEK_SET);
memset(buf, 0, 5);
fread(buf, 1, 4, pFile); // read 4 bytes status tags
usleep(10000);
}
while(strncmp(buf, pDoneStat, strlen(pDoneStat)) != 0);
fclose(pFile);
LOG_EX(LOG_Debug, "Boot status done ......\n");
#endif
}
DBusConnection* DBusWithLibuvInit(uv_loop_t* pUserLoop,
const char* pBusName,
OnDBusMessage cbOnMsg,
OnDaemonMsg cbOnHbl,
OnKeyEvent cbOnKey,
int* pErrno)
{
int i, ret = 0;
DBusError error;
SERVER_MODULE_TYPE svrMode;
uv_async_t* pAsync = NULL;
DBusConnection* pBus = NULL;
uv_fs_t* puvFsReq;
//uv_thread_t uvMsgProcThread;
//uv_thread_t uvMsgRecvThread;
//uv_thread_t uvLoopThread;
char rule[DBUS_MAXIMUM_MATCH_RULE_LENGTH - 1];
#if USED_SHM_TO_DBUS
uv_thread_t uvSyncThread;
#endif
//uv_loop_t *pLoop = uv_loop_new();
uv_loop_t *pLoop = pUserLoop;
memset(&g_LibuvDBusParam, 0, sizeof(LIBUV_DBUS_PARAMS));
for(i = 0; (i < sizeof(g_pModInfoTable) / sizeof(g_pModInfoTable[0])); i++)
{
// Skip match it'self
if(strcmp(g_pModInfoTable[i].modAliase, pBusName) == 0)
{
g_LibuvDBusParam.modName = g_pModInfoTable[i].modName;
g_LibuvDBusParam.pBusName = g_pModInfoTable[i].modAliase;
g_LibuvDBusParam.pBusPath = g_pModInfoTable[i].modPath;
break;
}
}
memset(&g_workDayArray, 0, sizeof(WORKDAY_INFO));
srand(time(NULL));
if(pLoop == NULL || pBusName == NULL || pErrno == NULL)
{
if(pErrno)
{
*pErrno = -ERR_INPUT_PARAMS;
}
LOG_EX(LOG_Error, "Input params error: pLoop = %p, pBusName = %p, pErrno = %p\n",
pLoop, pBusName, pErrno);
return NULL;
}
puvFsReq = (uv_fs_t*)malloc(sizeof(uv_fs_t));
CfgFileInit();
IHW_InitLOG(strrchr(pBusName, '.') + 1, NULL, TRUE);
IHW_EnableLogLevel(LOG_Fatal | LOG_Error | LOG_Warn | LOG_Debug | LOG_Info, 1);
APP_BUILD_INFO(strrchr(pBusName, '.') + 1, GetCurrentVersion());
// wait UDISK mount, configure file save in UDISK partition
__waitUDISKMount();
svrMode = CfgGetIntValue("Global.ServerMode", PUBLISH_MODE);
SetCurrentServerMode(svrMode);
DumpCurServerAddr("Default");
#if USED_SHM_TO_DBUS
uv_rwlock_init(&g_uvShmHashRwLock);
#endif
uv_rwlock_init(&g_uvMsgProcRwLock);
uv_rwlock_init(&g_uvLoopRwLock);
uv_fs_access(pLoop, puvFsReq, "/mnt/UDISK/debug.dbg", F_OK, uvFsAccessCb);
memset(rule, 0, DBUS_MAXIMUM_MATCH_RULE_LENGTH - 1);
srand(time(NULL));
//setenv("UV_THREADPOOL_SIZE", "128", 1);
dbus_error_init(&error);
pBus = dbus_bus_get(DBUS_BUS_SESSION, &error);
if (dbus_error_is_set(&error))
{
LOG_EX(LOG_Error, "dbus: Could not acquire the session bus\n");
dbus_error_free(&error);
*pErrno = -ERR_GET_BUS;
return NULL;
}
ret = dbus_bus_request_name(pBus, pBusName, DBUS_NAME_FLAG_REPLACE_EXISTING, &error);
if(dbus_error_is_set(&error))
{
LOG_EX(LOG_Error, "dbus: Could not request dbus name\n");
dbus_error_free(&error);
*pErrno = -ERR_REQUEST_BUS_NAME;
return NULL;
}
if(ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
{
LOG_EX(LOG_Error, "dbus: Could not request dbus name\n");
dbus_error_free(&error);
*pErrno = -ERR_REQUEST_BUS_NAME;
return NULL;
}
#if 1
if(!dbus_connection_set_watch_functions(pBus,
DBusAddWatchCb,
DBusRemoveWatchCb,
DBusNotifyWatchCb,
(void*)pLoop, NULL))
{
LOG_EX(LOG_Error, "dbus: Could not set watch function\n");
*pErrno = -ERR_SET_WATCH_FUNCTION;
return NULL;
}
if(!dbus_connection_set_timeout_functions(pBus,
DBusAddTimeoutCb,
DBusRemoveTimeoutCb,
DBusNotifyTimeoutCb,
(void*)pLoop, NULL))
{
LOG_EX(LOG_Error, "dbus: Could not set watch function\n");
*pErrno = -ERR_SET_TIMEOUT_FUNCTION;
return NULL;
}
#endif
pAsync = malloc(sizeof(uv_async_t));
pAsync->data = (void*)pBus;
uv_async_init(pLoop, pAsync, uvAsyncCb);
uv_unref((uv_handle_t*)pAsync);
#if 1
dbus_connection_set_wakeup_main_function(pBus,
DBusWakeupMainLoopCb,
(void*)pAsync, DBusAsyncFreeCb);
#endif
sprintf(rule, "type='signal', interface='%s'", DBUS_MESSAGE_INTERFACE_NAME);
dbus_bus_add_match(pBus, rule, &error);
if(dbus_error_is_set(&error))
{
LOG_EX(LOG_Error, "dbus_bus_add_match [%s] error: %s\n", DBUS_MESSAGE_INTERFACE_NAME, error.message);
dbus_error_free(&error);
*pErrno = -ERR_BUS_MATCH;
return NULL;
}
#if 1
if(!dbus_connection_add_filter(pBus, DBusOnMsgCb, pLoop, NULL))
{
LOG_EX(LOG_Error, "dbus_connection_add_filter error\n");
*pErrno = -ERR_BUS_SET_MSG_CB;
return NULL;
}
#endif
uv_idle_init(pLoop, &g_uvIdleHandle);
g_uvIdleHandle.data = pBus;
uv_idle_start(&g_uvIdleHandle, uvIdleCb);
if(cbOnKey)
{
uv_fs_open(pLoop, &g_uvKeyEvent, R16_TINA_KEY_EVENT_PATH, O_RDONLY, 0, uvOpenKeyEventCb);
g_LibuvDBusParam.onKeyCb = cbOnKey;
}
g_LibuvDBusParam.pLoop = pLoop;
g_LibuvDBusParam.pUserLoop = pUserLoop;
g_LibuvDBusParam.pBus = pBus;
g_LibuvDBusParam.onMsgCb = cbOnMsg;
#if 0
if(cbOnHbl)
{
g_LibuvDBusParam.onHblCb = cbOnHbl;
HeartDaemonInit(g_LibuvDBusParam.modName, HEART_LOST_DELAY, cbOnHbl);
}
#else
g_LibuvDBusParam.onHblCb = __dBusDeameonCb;
HeartDaemonInit(g_LibuvDBusParam.modName, HEART_LOST_DELAY, __dBusDeameonCb);
#endif
#if USED_SHM_TO_DBUS
uv_thread_create(&uvSyncThread, __uvShmTblTaskThreadCb, NULL);
#endif
#ifdef ENABLE_COUNT_DEBUG
MonitorInit();
MonAddNewItem(MON_MSG_PROC_STAT, 100000);
MonAddNewItem(MON_MSG_BST_PROC_STAT, 100000);
MonAddNewItem(MON_USER_MSG_PROC_STAT, 100000);
MonAddNewItem(MON_USER_MSG_BST_PROC_STAT, 100000);
#endif
InetInit();
EvpSystemInit();
#if 0
if(g_LibuvDBusParam.onMsgCb)
{
uv_thread_create(&uvMsgProcThread, __uvMsgProc, NULL);
}
#endif
IHW_RunLogService();
return pBus;
}
int DBusWithLibuvCfgInit(OnCfgMsg cbOnCfgMsg)
{
CfgGlobalEnvInit();
if(cbOnCfgMsg == NULL)
{
return (-ERR_INPUT_PARAMS);
}
g_LibuvDBusParam.onCfgCb = cbOnCfgMsg;
return (0);
}
int GetShellExecResult(const char *pCmd, char **pResult)
{
FILE *pFile = NULL;
unsigned int uRdSize = 0;
char *pCmdOut;
*pResult = NULL;
if(pCmd == NULL || strlen(pCmd) == 0)
{
return (-ERR_INPUT_PARAMS);
}
pFile = popen(pCmd, "r");
if(pFile == NULL)
{
return (-ERR_OPEN_FILE);
}
*pResult = (char *)malloc(4096);
pCmdOut = *pResult;
uRdSize = fread(pCmdOut, sizeof(char), 4096, pFile);
pCmdOut[uRdSize] = 0;
if(pCmdOut[strlen(pCmdOut) - 1] == '\n')
{
pCmdOut[strlen(pCmdOut) - 1] = 0;
}
pclose(pFile);
//fprintf(stdout, "%s --> [%s](%u)\n", pCmd, pCmdOut, uRdSize);
return (0);
}
void SystemSafeReboot(void)
{
int ret, reTry = 0;
#if 0
ret = system("sync");
ret = system("ubus call system watchdog \'{\"stop\" : true}\'");
reTry = 3;
do
{
sleep(1);
} while(reTry--);
reTry = 0;
LOG_EX(LOG_Debug, "Reboot System By Power Control Chips\n");
sleep(1);
ret = system("echo 3140 > /sys/bus/platform/devices/axp22_board/axp22_reg");
sleep(10);
#endif
while(TRUE)
{
LOG_EX(LOG_Debug, "Reboot System: %d times\n", reTry++);
sleep(1);
ret = system("reboot -f");
sleep(3);
}
}
char* GetCpuChipId(void)
{
char* pRet = NULL;
#ifdef PLATFORM_R16
char* pChipId = NULL;
GetShellExecResult("cat /proc/cpuinfo | grep Chipid | awk '{print $3}'", &pChipId);
if(pChipId == NULL)
{
return strdup("");
}
pRet = strdup(pChipId);
free(pChipId);
return pRet;
#else
return strdup("Unknown CPU Chip ID");
#endif
}
char* GetCpuSerial(void)
{
char* pRet = NULL;
#ifdef PLATFORM_R16
char* pSerial = NULL;
GetShellExecResult("cat /proc/cpuinfo | grep Serial | awk '{print $3}'", &pSerial);
if(pSerial == NULL)
{
return strdup("");
}
pRet = strdup(pSerial);
free(pSerial);
return pRet;
#else
return strdup("Unknown CPU Serial");
#endif
}
int CopyFile(const char *pSrc, const char *pDest)
{
int fdSrc, fdDest;
struct stat st;
ssize_t sz;
if(stat(pSrc, &st) != 0)
{
LOG_EX(LOG_Error, "Get File %s Size Error\n", pSrc);
return (-ERR_GET_FILE_SIZE);
}
fdSrc = open(pSrc, O_RDONLY);
if(fdSrc < 0)
{
LOG_EX(LOG_Error, "Open File %s Error\n", pSrc);
return (-ERR_OPEN_FILE);
}
fdDest = open(pDest, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if(fdDest < 0)
{
close(fdSrc);
LOG_EX(LOG_Error, "Open File %s Error\n", pDest);
return (-ERR_OPEN_FILE);
}
sz = sendfile(fdDest, fdSrc, NULL, st.st_size);
if(sz != st.st_size)
{
LOG_EX(LOG_Error, "Copy File Size Error: %d, %d\n", sz, st.st_size);
close(fdSrc);
close(fdDest);
return (-ERR_COPY_FILE);
}
fsync(fdDest);
close(fdSrc);
close(fdDest);
return (0);
}
int CopyFileWithSize(const char *pSrc, const char *pDest, int iSize)
{
int fdSrc, fdDest;
struct stat st;
ssize_t sz;
size_t cpSize = iSize;
if(iSize <= 0)
{
if(stat(pSrc, &st) != 0)
{
LOG_EX(LOG_Error, "Get File %s Size Error\n", pSrc);
return (-ERR_GET_FILE_SIZE);
}
cpSize = st.st_size;
}
fdSrc = open(pSrc, O_RDONLY);
if(fdSrc < 0)
{
LOG_EX(LOG_Error, "Open File %s Error\n", pSrc);
return (-ERR_OPEN_FILE);
}
fdDest = open(pDest, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH |S_IWOTH);
if(fdDest < 0)
{
close(fdSrc);
LOG_EX(LOG_Error, "Open File %s Error\n", pDest);
return (-ERR_OPEN_FILE);
}
sz = sendfile(fdDest, fdSrc, NULL, cpSize);
if(sz != cpSize)
{
LOG_EX(LOG_Error, "Copy File Size Error: %d, %d\n", sz, cpSize);
close(fdSrc);
close(fdDest);
return (-ERR_COPY_FILE);
}
close(fdSrc);
close(fdDest);
return (0);
}
int ReadFileToBuf(const char *pSrc, unsigned char *pBuf, int iSize)
{
int fdSrc;
struct stat st;
ssize_t sz;
size_t cpSize = iSize;
if(iSize < 0)
{
if(stat(pSrc, &st) != 0)
{
LOG_EX(LOG_Error, "Get File %s Size Error\n", pSrc);
return (-ERR_GET_FILE_SIZE);
}
cpSize = st.st_size;
}
fdSrc = open(pSrc, O_RDONLY);
if(fdSrc < 0)
{
LOG_EX(LOG_Error, "Open File %s Error\n", pSrc);
return (-ERR_OPEN_FILE);
}
sz = read(fdSrc, pBuf, cpSize);
if(sz != cpSize)
{
LOG_EX(LOG_Error, "Copy File Size Error: %d, %d\n", sz, cpSize);
close(fdSrc);
return (-ERR_COPY_FILE);
}
close(fdSrc);
return (sz);
}
static int __reqWorkDayInfo(int year)
{
int ret = 0;
WORKDAY_INFO reqInfo;
memset(&reqInfo, 0, sizeof(WORKDAY_INFO));
if(year <= 0)
{
struct tm localTime;
time_t tmStamp = time((time_t*)NULL);
localtime_r(&tmStamp, &localTime);
reqInfo.year = localTime.tm_year;
}
else
{
reqInfo.year = year;
}
ret = DBusJsonSendToCommand(NULL,
g_pModInfoTable[MODULE_CONTROLLER].modAliase,
CMD_WORKDAY_DB_REQ,
JSON_ENGINE_WORKDAY_REQ,
&reqInfo, FALSE);
return (ret);
}
int CurrentIsWorkDay(int year, int day)
{
// LOG_EX(LOG_Debug, "CurrentIsWorkDay: year = %d, day = %d\n", year, day);
if(day > 365)
{
LOG_EX(LOG_Error, "Error Input Params: day = %d\n", day);
return (-ERR_INPUT_PARAMS);
}
if(g_workDayArray.year <= 0)
{
__reqWorkDayInfo(year);
LOG_EX(LOG_Error, "Unsync Database: year = %d\n", year);
return (-ERR_UNINIT_ITEM);
}
if(day < 0 || year <= 0)
{
struct tm localTime;
time_t tmStamp = time((time_t*)NULL);
localtime_r(&tmStamp, &localTime);
if(day < 0)
{
day = localTime.tm_yday;
}
if(year <= 0)
{
year = localTime.tm_year;
}
}
if(year != g_workDayArray.year - 1900)
{
__reqWorkDayInfo(year);
LOG_EX(LOG_Error, "Have No Current Year Database: year = %d, g_workDayArray.year = %d\n",
year, g_workDayArray.year);
return (-ERR_NO_ITEMS);
}
// 0 work day, 1 holiday
return (g_workDayArray.days[day] == 0);
}
unsigned long long GetPartitionFreeSize(const char *pPartPath)
{
struct statfs myStatfs;
unsigned long long freeSize;
if(statfs(pPartPath, &myStatfs) == -1)
{
return 0;
}
freeSize = myStatfs.f_bsize * myStatfs.f_bfree;
//fprintf(stdout, "%s free = %llu bytes\n", pPartPath, freeSize);
return freeSize;
}
#ifdef CURRENT_VERSION
char* GetCurrentVersion(void)
{
return CURRENT_VERSION;
}
#else
char* GetCurrentVersion(void)
{
return "0.0.1";
}
#endif
WIFI_STATUS GetCurrWIFIConnStatus(void)
{
return g_WifiConnStatus;
}
const char* ErrcodeToString(int errCode)
{
switch(errCode)
{
case ERR_INPUT_PARAMS: return "ERR_INPUT_PARAMS";
case ERR_NO_ITEMS: return "ERR_NO_ITEMS";
case ERR_GET_BUS: return "ERR_GET_BUS";
case ERR_DBUS_CONNECTION: return "ERR_DBUS_CONNECTION";
case ERR_REQUEST_BUS_NAME: return "ERR_REQUEST_BUS_NAME";
case ERR_SET_WATCH_FUNCTION: return "ERR_SET_WATCH_FUNCTION";
case ERR_SET_TIMEOUT_FUNCTION: return "ERR_SET_TIMEOUT_FUNCTION";
case ERR_BUS_MATCH: return "ERR_BUS_MATCH";
case ERR_BUS_SET_MSG_CB: return "ERR_BUS_SET_MSG_CB";
case ERR_DBUS_CREATE_MSG: return "ERR_DBUS_CREATE_MSG";
case ERR_BUS_SEND_MSG: return "ERR_BUS_SEND_MSG";
case ERR_DBUS_MSG_TO_LARGE: return "ERR_DBUS_MSG_TO_LARGE";
case ERR_BUS_RCV_MSG: return "ERR_BUS_RCV_MSG";
case ERR_ADD_TASK: return "ERR_ADD_TASK";
case ERR_UNSUP_EVP_TYPE: return "ERR_UNSUP_EVP_TYPE";
case ERR_CREATE_MQ: return "ERR_CREATE_MQ";
case ERR_MQ_SENDMSG: return "ERR_MQ_SENDMSG";
case ERR_CREATE_SHM: return "ERR_CREATE_SHM";
case ERR_MAP_SHM: return "ERR_MAP_SHM";
case ERR_MALLOC_MEMORY: return "ERR_MALLOC_MEMORY";
case ERR_EVP_INIT_KEY: return "ERR_EVP_INIT_KEY";
case ERR_EVP_UPDATE: return "ERR_EVP_UPDATE";
case ERR_EVP_FINALE: return "ERR_EVP_FINALE";
case ERR_EVP_KEY_SIZE: return "ERR_EVP_KEY_SIZE";
case ERR_OPEN_FILE: return "ERR_OPEN_FILE";
case ERR_READ_FILE: return "ERR_READ_FILE";
case ERR_WRITE_FILE: return "ERR_WRITE_FILE";
case ERR_COPY_FILE: return "ERR_COPY_FILE";
case ERR_FILE_NOT_EXISTS: return "ERR_FILE_NOT_EXISTS";
case ERR_GET_FILE_SIZE: return "ERR_GET_FILE_SIZE";
case ERR_UNINIT_ITEM: return "ERR_UNINIT_ITEM";
case ERR_FILE_EMPTY: return "ERR_FILE_EMPTY";
case ERR_SEND_MAIL: return "ERR_SEND_MAIL";
case ERR_NETWORK_SEND: return "ERR_NETWORK_SEND";
case ERR_NETWORK_NOT_CONNECTED: return "ERR_NETWORK_NOT_CONNECTED";
case ERR_UNSUPPORT: return "ERR_UNSUPPORT";
case ERR_NO_INIT_IPL3: return "ERR_NO_INIT_IPL3";
case ERR_BAD_IPL3: return "ERR_BAD_IPL3";
case ERR_BAD_FILE_SIZE: return "ERR_BAD_FILE_SIZE";
case ERR_MD5_FILE: return "ERR_MD5_FILE";
case ERR_MD5_CHECK_SUM: return "ERR_MD5_CHECK_SUM";
case ERR_OTA_WRITE_BOOT: return "ERR_OTA_WRITE_BOOT";
case ERR_OTA_WRITE_ROOTFS: return "ERR_OTA_WRITE_ROOTFS";
case ERR_OTA_WRITE_IPL3: return "ERR_OTA_WRITE_IPL3";
case ERR_OTA_WRITE_PARAMS: return "ERR_OTA_WRITE_PARAMS";
case ERR_OTA_DOWNLOAD_FILE: return "ERR_OTA_DOWNLOAD_FILE";
case ERR_VERIFY_PARTITION_MD5: return "ERR_VERIFY_PARTITION_MD5";
case ERR_OTA_PRE_STATR: return "ERR_OTA_PRE_STATR";
case ERR_OTA_YET_CUR_VER: return "ERR_OTA_YET_CUR_VER";
case ERR_OTA_NOT_READY: return "ERR_OTA_NOT_READY";
case ERR_CREATE_CFG_FILE: return "ERR_CREATE_CFG_FILE";
case ERR_CREATE_SQLITE3_DB: return "ERR_CREATE_SQLITE3_DB";
case ERR_OPEN_SQLITE3_DB: return "ERR_OPEN_SQLITE3_DB";
case ERR_SQLITE3_CREATE_TABLE: return "ERR_SQLITE3_CREATE_TABLE";
case ERR_SYNC_DATABASE: return "ERR_SYNC_DATABASE";
case ERR_SQL_QUERY: return "ERR_SQL_QUERY";
case ERR_SQL_DELETE: return "ERR_SQL_DELETE";
case ERR_UNKNOWN_TYPE: return "ERR_UNKNOWN_TYPE";
case ERR_PERMISSION_DENIED: return "ERR_PERMISSION_DENIED";
case ERR_CFG_NOITEM: return "ERR_CFG_NOITEM";
case ERR_CFG_ITEM_EXIST: return "ERR_CFG_ITEM_EXIST";
case ERR_CFG_WAIT_RSP: return "ERR_CFG_WAIT_RSP";
case ERR_CFG_BUSY: return "ERR_CFG_BUSY";
case ERR_STR_CONVERT: return "ERR_STR_CONVERT";
case ERR_SQL_REG_MODULE: return "ERR_SQL_REG_MODULE";
default: return "Unknown Error";
}
}
const char* DBusCmdToString(DBUS_CMD cmd)
{
switch(cmd)
{
case CMD_MISC_PING: return "CMD_MISC_PING";
case CMD_MISC_OTA: return "CMD_MISC_OTA";
case CMD_MISC_WEATHER: return "CMD_MISC_WEATHER";
case CMD_MISC_NOWTIME: return "CMD_MISC_NOWTIME";
case CMD_MISC_UPGRADE: return "CMD_MISC_UPGRADE";
case CMD_SYSTEM_STANDBY: return "CMD_SYSTEM_STANDBY";
case CMD_MISC_QUERY_OTA_STATUS: return "CMD_MISC_QUERY_OTA_STATUS";
case CMD_MISC_QUERY_DL_STATUS: return "CMD_MISC_QUERY_DL_STATUS";
case CMD_CALL_DIAL: return "CMD_CALL_DIAL";
case CMD_CALL_ACCEPI: return "CMD_CALL_ACCEPI";
case CMD_CALL_HANGUP: return "CMD_CALL_HANGUP";
case CMD_CALL_MESSAGE: return "CMD_CALL_MESSAGE";
case CMD_PLAY_MODECHANGE: return "CMD_PLAY_MODECHANGE";
case CMD_PLAY_PLAY: return "CMD_PLAY_PLAY";
case CMD_PLAY_PAUSE: return "CMD_PLAY_PAUSE";
case CMD_PLAY_STOP: return "CMD_PLAY_STOP";
case CMD_PLAY_SEEKTO: return "CMD_PLAY_SEEKTO";
case CMD_PLAY_SHOWMODE: return "CMD_PLAY_SHOWMODE";
case CMD_PLAY_NEXT: return "CMD_PLAY_NEXT";
case CMD_PLAY_PRE: return "CMD_PLAY_PRE";
case CMD_PLAY_SHOWLIST: return "CMD_PLAY_SHOWLIST";
case CMD_PLAY_UPDATELIST: return "CMD_PLAY_UPDATELIST";
case CMD_PLAY_PREPARE_NEXT: return "CMD_PLAY_PREPARE_NEXT";
case CMD_PLAY_ADDTOLIST: return "CMD_PLAY_ADDTOLIST";
case CMD_PLAY_DELETEFROMLIST: return "CMD_PLAY_DELETEFROMLIST";
case CMD_PLAY_RESETLIST: return "CMD_PLAY_RESETLIST";
case CMD_PLAY_AUDIO_STOP: return "CMD_PLAY_AUDIO_STOP";
case CMD_PLAY_AUDIO_PLAY: return "CMD_PLAY_AUDIO_PLAY";
case CMD_SE_PLAY: return "CMD_SE_PLAY";
case CMD_PLAY_RET_STATUS: return "CMD_PLAY_RET_STATUS";
case CMD_CFG_ADD_REQ: return "CMD_CFG_ADD_REQ";
case CMD_CFG_ADD_RSP: return "CMD_CFG_ADD_RSP";
case CMD_CFG_CHANGE_REQ: return "CMD_CFG_CHANGE_REQ";
case CMD_CFG_CHANGE_RSP: return "CMD_CFG_CHANGE_RSP";
case CMD_CFG_GET_REQ: return "CMD_CFG_GET_REQ";
case CMD_CFG_GET_RSP: return "CMD_CFG_GET_RSP";
case CMD_CFG_UPG_NOTIFY: return "CMD_CFG_UPG_NOTIFY";
case CMD_MSC_MSG_CONTROLLER_RECOG_SUCCESS: return "CMD_MSC_MSG_CONTROLLER_RECOG_SUCCESS";
case CMD_MSC_MSG_CONTROLLER_RECOG_ERROR: return "CMD_MSC_MSG_CONTROLLER_RECOG_ERROR";
case CMD_MSC_MSG_CONTROLLER_WAKEUP: return "CMD_MSC_MSG_CONTROLLER_WAKEUP";
case CMD_MSC_MSG_CONTROLLER_RECOGING: return "CMD_MSC_MSG_CONTROLLER_RECOGING";
case CMD_CONTROLLER_REQMSG_INITARGS: return "CMD_CONTROLLER_REQMSG_INITARGS";
case CMD_CONTROLLER_RSPMSG_INITARGS: return "CMD_CONTROLLER_RSPMSG_INITARGS";
case CMD_CONTROLLER_REQMSG_PLAYERSTATUS: return "CMD_CONTROLLER_REQMSG_PLAYERSTATUS";
case CMD_CONTROLLER_RSPMSG_PLAYERSTATUS: return "CMD_CONTROLLER_RSPMSG_PLAYERSTATUS";
case CMD_MSC_REQMSG_MIC_CONTROL: return "CMD_MSC_REQMSG_MIC_CONTROL";
case CMD_MSC_RSPMSG_MIC_CONTROL: return "CMD_MSC_RSPMSG_MIC_CONTROL";
case CMD_YUNXIN_RECVMSG: return "CMD_YUNXIN_RECVMSG";
case CMD_YUNXIN_SENDMSG: return "CMD_YUNXIN_SENDMSG";
case CMD_YUNXIN_SENDMSG_BYPASS: return "CMD_YUNXIN_SENDMSG_BYPASS";
case CMD_YUNXIN_SENDMSGCB: return "CMD_YUNXIN_SENDMSGCB";
case CMD_CONTROLLER_MSG_YUNXIN: return "CMD_CONTROLLER_MSG_YUNXIN";
case CMD_YUNXIN_STATUS: return "CMD_YUNXIN_STATUS";
case CMD_YUNXIN_SYSMSG: return "CMD_YUNXIN_SYSMSG";
case CMD_WIFI_CONF: return "CMD_WIFI_CONF";
case CMD_WIFI_CONF_RESP: return "CMD_WIFI_CONF_RESP";
case CMD_WIFI_AUTO_CONN: return "CMD_WIFI_AUTO_CONN";
case CMD_WIFI_AUTO_CONN_RESP: return "CMD_WIFI_AUTO_CONN_RESP";
case CMD_WIFI_STATE_REQ: return "CMD_WIFI_STATE_REQ";
case CMD_WIFI_STATE_RESP: return "CMD_WIFI_STATE_RESP";
case CMD_WIFI_STATE_NTF: return "CMD_WIFI_STATE_NTF";
case CMD_BT_NAME_GET_REQ: return "CMD_BT_NAME_GET_REQ";
case CMD_BT_NAME_GET_RESP: return "CMD_BT_NAME_GET_RESP";
case CMD_BT_EVT_NTF: return "CMD_BT_EVT_NTF";
case CMD_KPLAYER_START: return "CMD_KPLAYER_START";
case CMD_KPLAYER_STOP: return "CMD_KPLAYER_STOP";
case CMD_KPLAYER_NOTIF_DUR: return "CMD_KPLAYER_NOTIF_DUR";
case CMD_KPLAYER_HOST_ACTION: return "CMD_KPLAYER_HOST_ACTION";
case CMD_KPLAYER_CTR_NTF_BASE: return "CMD_KPLAYER_CTR_NTF_BASE";
case CMD_KPLAYER_CTR_CREATED: return "CMD_KPLAYER_CTR_CREATED";
case CMD_KPLAYER_CTR_DELED: return "CMD_KPLAYER_CTR_DELED";
case CMD_KPLAYER_CTR_PLAY: return "CMD_KPLAYER_CTR_PLAY";
case CMD_KPLAYER_CTR_STOP: return "CMD_KPLAYER_CTR_STOP";
case CMD_KPLAYER_CTR_PAUSE: return "CMD_KPLAYER_CTR_PAUSE";
case CMD_KPLAYER_CTR_SEEK: return "CMD_KPLAYER_CTR_SEEK";
case CMD_KPLAYER_CTR_SET_URL: return "CMD_KPLAYER_CTR_SET_URL";
case CMD_KPLAYER_CTR_SET_VOLUME: return "CMD_KPLAYER_CTR_SET_VOLUME";
case CMD_KPLAYER_CTR_SET_MUTE: return "CMD_KPLAYER_CTR_SET_MUTE";
case CMD_KPLAYER_CTR_SET_NXT_URL: return "CMD_KPLAYER_CTR_SET_NXT_URL";
case CMD_KPLAYER_CTR_SET_NEXT: return "CMD_KPLAYER_CTR_SET_NEXT";
case CMD_KPLAYER_CTR_SET_PREV: return "CMD_KPLAYER_CTR_SET_PREV";
case CMD_ALARM_SYNC_REQ: return "CMD_ALARM_SYNC_REQ";
case CMD_ALARM_SYNC_RSP: return "CMD_ALARM_SYNC_RSP";
case CMD_ALARM_ADD: return "CMD_ALARM_ADD";
case CMD_ALARM_REMOVE: return "CMD_ALARM_REMOVE";
case CMD_ALARM_REMOVEALL: return "CMD_ALARM_REMOVEALL";
case CMD_REMAIND_SYNC_REQ: return "CMD_REMAIND_SYNC_REQ";
case CMD_REMAIND_SYNC_RSP: return "CMD_REMAIND_SYNC_RSP";
case CMD_REMAIND_ADD: return "CMD_REMAIND_ADD";
case CMD_REMAIND_REMOVE: return "CMD_REMAIND_REMOVE";
case CMD_REMAIND_REMOVEALL: return "CMD_REMAIND_REMOVEALL";
case CMD_ASSISTANT_STATUS: return "CMD_ASSISTANT_STATUS";
case CMD_ASSISTANT_RUNNING: return "CMD_ASSISTANT_RUNNING";
case CMD_ASSISTANT_NOTIFY: return "CMD_ASSISTANT_NOTIFY";
case CMD_SESSION_ALARM_SYNC: return "CMD_SESSION_ALARM_SYNC";
case CMD_WORKDAY_DB_REQ: return "CMD_WORKDAY_DB_REQ";
case CMD_WORKDAY_DB_RSP: return "CMD_WORKDAY_DB_RSP";
case CMD_OTA_NOTIFY: return "CMD_OTA_NOTIFY";
case CMD_OTA_STATUS: return "CMD_OTA_STATUS";
case CMD_OTA_RUNNOW: return "CMD_OTA_RUNNOW";
case CMD_LOG_CONFIG: return "CMD_LOG_CONFIG";
default: return "Unknown CMD";
}
}
const char* ModuleNameToString(MODULE_NAME modName)
{
switch(modName)
{
case MODULE_CONTROLLER: return "MODULE_CONTROLLER";
case MODULE_ALARM: return "MODULE_ALARM";
case MODULE_CALL: return "MODULE_CALL";
case MODULE_VOICEENGINE: return "MODULE_VOICEENGINE";
case MODULE_PLAYER: return "MODULE_PLAYER";
case MODULE_CONFIGURE: return "MODULE_CONFIGURE";
case MODULE_OTA: return "MODULE_OTA";
case MODULE_WIFI: return "MODULE_WIFI";
case MODULE_BT: return "MODULE_BT";
case MODULE_KPLAYER: return "MODULE_KPLAYER";
case MODULE_KPLAYER_TEST: return "MODULE_KPLAYER_TEST";
case MODULE_SPLAYER: return "MODULE_SPLAYER";
case MODULE_SPLAYER_TEST: return "MODULE_SPLAYER_TEST";
case MODULE_LIGHT_MCU: return "MODULE_LIGHT_MCU";
case MODULE_BLUEKC: return "MODULE_BLUEKC";
case MODULE_BLUEKC_TEST: return "MODULE_BLUEKC_TEST";
case MODULE_MANUFACTURE: return "MODULE_MANUFACTURE";
case MODULE_BT_DEMO: return "MODULE_BT_DEMO";
case MODULE_LOG_CTRL: return "MODULE_LOG_CTRL";
}
return "Unknown Module Name";
}