From 42bf495230547e4f3eb5280d7db4231df311cb0a Mon Sep 17 00:00:00 2001 From: HuangXin Date: Thu, 30 Aug 2018 14:16:45 +0800 Subject: [PATCH] Merge code form r16 v1.1.9 --- package/netease/alarm/src/assistant.c | 100 ++++++++-- .../src/Framework/Configure/ini_prase.c | 45 ++++- .../Framework/IoT/Boardlink/boardlink_iot.c | 181 ++++++++++++++++++ .../src/Framework/Network/inet_api.c | 2 +- .../src/Framework/SvrManager/svr_manager.c | 11 ++ .../src/Framework/libuvEngine/libuv_dbus.c | 109 +++++++++-- package/netease/libuvdbus/src/Makefile | 1 + .../libuvdbus/src/include/boardlink_iot.h | 44 +++++ .../libuvdbus/src/include/libuv_dbus.h | 6 +- .../libuvdbus/src/include/server_addr.h | 7 +- .../netease/libuvdbus/src/include/skins_res.h | 2 + .../libuvdbus/src/include/smart_sound.h | 16 ++ package/netease/libuvdbus/src/log/log.c | 20 +- .../system_resources/resource/voice/b-m-1.mp3 | Bin 0 -> 21192 bytes .../system_resources/resource/voice/b-m-2.mp3 | Bin 0 -> 21672 bytes 15 files changed, 512 insertions(+), 32 deletions(-) create mode 100644 package/netease/libuvdbus/src/Framework/IoT/Boardlink/boardlink_iot.c create mode 100644 package/netease/libuvdbus/src/include/boardlink_iot.h create mode 100644 package/netease/system_resources/resource/voice/b-m-1.mp3 create mode 100644 package/netease/system_resources/resource/voice/b-m-2.mp3 diff --git a/package/netease/alarm/src/assistant.c b/package/netease/alarm/src/assistant.c index 040083a82..e086684b4 100644 --- a/package/netease/alarm/src/assistant.c +++ b/package/netease/alarm/src/assistant.c @@ -25,14 +25,14 @@ #include #endif -#define SYNC_TIME_DELAY (5) +#define SYNC_TIME_DELAY (1) static PASSISTANT_ARRAY_INFO g_pAlarmArray = NULL, g_pRemaindArray = NULL, g_pSessionArray = NULL; static uv_rwlock_t g_uvListRwLock; -static unsigned char g_syncFlags; +static unsigned char g_syncFlags = 0; static unsigned int g_sessionId = 0; static void __onAlarmCb(unsigned int tmId, unsigned int status, void *pUserData); @@ -462,6 +462,12 @@ static PDBUS_MSG_PACK __dBusOnMessage(uv_loop_t *pLoop, DBusConnection *pConn, P switch(pMsg->busCmd) { case CMD_SESSION_ALARM_SYNC: + if(IsHolidayDBSynced() != TRUE) + { + LOG_EX(LOG_Warn, "CMD_SESSION_ALARM_SYNC: Wait sync holiday database, this is dirty data.\n"); + break; + } + pInfo = (PASSISTANT_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ASSISTANT_SYNC_RSP, FALSE, &err); if(pInfo) @@ -487,6 +493,12 @@ static PDBUS_MSG_PACK __dBusOnMessage(uv_loop_t *pLoop, DBusConnection *pConn, P break; case CMD_ALARM_SYNC_RSP: + if(IsHolidayDBSynced() != TRUE) + { + LOG_EX(LOG_Warn, "CMD_ALARM_SYNC_RSP: Wait sync holiday database, this is dirty data.\n"); + break; + } + pInfo = (PASSISTANT_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ASSISTANT_SYNC_RSP, FALSE, &err); if(pInfo) @@ -580,6 +592,12 @@ static PDBUS_MSG_PACK __dBusOnMessage(uv_loop_t *pLoop, DBusConnection *pConn, P break; case CMD_REMAIND_SYNC_RSP: + if(IsHolidayDBSynced() != TRUE) + { + LOG_EX(LOG_Warn, "CMD_REMAIND_SYNC_RSP: Wait sync holiday database, this is dirty data.\n"); + break; + } + pInfo = (PASSISTANT_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ASSISTANT_SYNC_RSP, FALSE, &err); if(pInfo) @@ -705,12 +723,73 @@ static void __dBusDeameonCb(MODULE_NAME modName, int status) static void __assistantSyncThread(void *pParam) { - int ret, isSynced = -1; + int ret, i = 0, isSynced = -1; LOG_EX(LOG_Debug, "Beging Sync holiday Database\n"); + while(TRUE) + { + if(IsHolidayDBSynced() != TRUE) + { + CurrentIsWorkDay(0, 0); + if(i++ % 10 == 0 && i <= 1000) + { + LOG_EX(LOG_Debug, "Retry sync holiday database: %d\n", i); + } + sleep(SYNC_TIME_DELAY); + } + else + { + break; + } + } + LOG_EX(LOG_Debug, "Sync holiday Database Finished\n"); + LOG_EX(LOG_Debug, "Beging sync ASSISTANT_TYPE_CLOCK\n"); do { + if(g_syncFlags & (1 << ASSISTANT_TYPE_CLOCK)) + { + LOG_EX(LOG_Debug, "Sync ASSISTANT_TYPE_CLOCK Finished\n"); + break; + } + + ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_ALARM_SYNC_REQ, ""); + + LOG_EX(LOG_Debug, "Send CMD_ALARM_SYNC_REQ Command: %d\n", ret); + + sleep(SYNC_TIME_DELAY); + } while(TRUE); + + LOG_EX(LOG_Debug, "Beging sync ASSISTANT_TYPE_REMAIND\n"); + do + { + if(g_syncFlags & (1 << ASSISTANT_TYPE_REMAIND)) + { + LOG_EX(LOG_Debug, "Sync ASSISTANT_TYPE_REMAIND Finished\n"); + break; + } + + ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_REMAIND_SYNC_REQ, ""); + + LOG_EX(LOG_Debug, "Send CMD_REMAIND_SYNC_REQ Command: %d\n", ret); + + sleep(SYNC_TIME_DELAY); + } while(TRUE); + +#if 0 + do + { + if((g_syncFlags & (1 << ASSISTANT_TYPE_CLOCK)) + && (g_syncFlags & (1 << ASSISTANT_TYPE_REMAIND))) + { + LOG_EX(LOG_Debug, "Sync Alarm And Remaind Finished\n"); + break; + } + if((g_syncFlags & (1 << ASSISTANT_TYPE_CLOCK)) == 0) { ret = DBusSendToCommand(NULL, @@ -726,18 +805,13 @@ static void __assistantSyncThread(void *pParam) g_pModInfoTable[MODULE_CONTROLLER].modAliase, CMD_REMAIND_SYNC_REQ, ""); -// LOG_EX(LOG_Debug, "Send CMD_REMAIND_SYNC_REQ Command: %d\n", ret); + LOG_EX(LOG_Debug, "Send CMD_REMAIND_SYNC_REQ Command: %d\n", ret); } - if(isSynced < 0) - { - isSynced = CurrentIsWorkDay(0, 0); - } - sleep(SYNC_TIME_DELAY); - } while(g_syncFlags != ((1 << ASSISTANT_TYPE_CLOCK) | (1 << ASSISTANT_TYPE_REMAIND))); + } while(TRUE); + //while(g_syncFlags != ((1 << ASSISTANT_TYPE_CLOCK) | (1 << ASSISTANT_TYPE_REMAIND))); - LOG_EX(LOG_Debug, "Sync holiday Database Finished\n"); ret = DBusSendToCommand(NULL, g_pModInfoTable[MODULE_CONTROLLER].modAliase, @@ -750,6 +824,7 @@ static void __assistantSyncThread(void *pParam) CMD_REMAIND_SYNC_REQ, ""); LOG_EX(LOG_Debug, "Send CMD_REMAIND_SYNC_REQ Command: %d\n", ret); +#endif pthread_detach(pthread_self()); } @@ -775,8 +850,7 @@ int main(int argc, char **argv) uv_rwlock_init(&g_uvListRwLock); AlarmTimerInit(pLoop); - - g_syncFlags = 0; + uv_thread_create(&uvSyncThread, __assistantSyncThread, NULL); RunUVLoop(pLoop); diff --git a/package/netease/libuvdbus/src/Framework/Configure/ini_prase.c b/package/netease/libuvdbus/src/Framework/Configure/ini_prase.c index 796718e29..3542f87fb 100644 --- a/package/netease/libuvdbus/src/Framework/Configure/ini_prase.c +++ b/package/netease/libuvdbus/src/Framework/Configure/ini_prase.c @@ -72,7 +72,50 @@ void InitCfgToCfgFile(config_t* pCfg) } } -int CfgGetInvValueV1(const char* pTags, int defValue, int* pErr) +int CfgGetIntValueV2(const char* pTags, int defValue, int* pErr) +{ + char* pSvrMode = NULL; + char cmdBuf[MAX_PATH]; + int iValue = defValue; + + memset(cmdBuf, 0, MAX_PATH); + + sprintf(cmdBuf, "cat %s | grep %s | awk '{print $3}' | cut -d \";\" -f 1", + DEVICE_CFG_FILE, + pTags); + + GetShellExecResult(cmdBuf, &pSvrMode); + + if(pSvrMode == NULL) + { + if(pErr) + { + *pErr = -ERR_NO_ITEMS; + } + return defValue; + } + + iValue = strtol(pSvrMode, NULL, 10); + free(pSvrMode); + + if(errno == EINVAL || errno == ERANGE) + { + if(pErr) + { + *pErr = -ERR_STR_CONVERT; + } + + return defValue; + } + + if(pErr) + { + *pErr = 0; + } + return iValue; +} + +int CfgGetIntValueV1(const char* pTags, int defValue, int* pErr) { int iValue = defValue; diff --git a/package/netease/libuvdbus/src/Framework/IoT/Boardlink/boardlink_iot.c b/package/netease/libuvdbus/src/Framework/IoT/Boardlink/boardlink_iot.c new file mode 100644 index 000000000..2cd5135b9 --- /dev/null +++ b/package/netease/libuvdbus/src/Framework/IoT/Boardlink/boardlink_iot.c @@ -0,0 +1,181 @@ +#ifndef PLATFORM_CPU +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PLATFORM_R16) || defined (PLATFORM_CPU) +#include "log.h" +#include "libuv_dbus.h" +#include "boardlink_iot.h" +#else +#include +#include +#include +#endif + +#define BL_IOT_PROTO (30) +#define BL_MSG_BUF_MAX (1024 * 4) + +static int g_nlSock = -1; +static unsigned char g_MsgSendBuf[BL_MSG_BUF_MAX]; +static BlMsgCb g_blMsgCb = NULL; + +static void __recvMsgThread(void *pParam) +{ + unsigned char msgBuf[BL_MSG_BUF_MAX]; + struct iovec iov = {msgBuf, BL_MSG_BUF_MAX}; + struct nlmsghdr *pMsgHdr; + struct sockaddr_nl fromAddr; + struct msghdr msgHdr = {&fromAddr, sizeof(fromAddr), &iov, 1, NULL, 0, 0};; + + memset(&fromAddr, 0, sizeof(fromAddr)); + fromAddr.nl_family = AF_NETLINK; + fromAddr.nl_pid = 0; + fromAddr.nl_groups = 0; + + while(TRUE) + { + int len = recvmsg(g_nlSock, &msgHdr, 0); + + if(len > 0) + { + for(pMsgHdr = (struct nlmsghdr *)msgBuf; + NLMSG_OK(pMsgHdr, len); + pMsgHdr = NLMSG_NEXT(pMsgHdr, len)) + { + if(pMsgHdr->nlmsg_type == NLMSG_DONE) + { + continue; + } + else if(pMsgHdr->nlmsg_type == NLMSG_ERROR) + { + continue; + } + else + { + PBL_IOT_MSG pMsg = (PBL_IOT_MSG)NLMSG_DATA(pMsgHdr); + //LOG_EX(LOG_Debug, "Recv Message: %s\n", NLMSG_DATA(pMsgHdr)); + print_hex_dump_bytes("Msg", 0, pMsg, BL_IOT_MSG_LEN(pMsg->msglen)); + if(g_blMsgCb) + { + g_blMsgCb(pMsg); + } + } + } + } + + usleep(1000); + } + pthread_detach(pthread_self()); +} + +static int __nlCreateSocket(void) +{ + struct sockaddr_nl srcAddr; + + g_nlSock = socket(AF_NETLINK, SOCK_RAW, BL_IOT_PROTO); + + if(g_nlSock == -1) + { + LOG_EX(LOG_Error, "Create netlink socker error: %s\n", strerror(errno)); + return -ERR_CREATE_SOCKET; + } + + memset(&srcAddr, 0, sizeof(srcAddr)); + srcAddr.nl_family = AF_NETLINK; + srcAddr.nl_pid = getpid(); + srcAddr.nl_groups = 0; + + if(bind(g_nlSock, (struct sockaddr*)&srcAddr, sizeof(srcAddr)) < 0) + { + LOG_EX(LOG_Error, "Bind netlink socket failed: %s", strerror(errno)); + close(g_nlSock); + return -ERR_BIND_SOCKET; + } + + return 0; +} + +static int __sendMessage(unsigned char* pData, unsigned int len) +{ + struct iovec iov; + struct sockaddr_nl dstAddr; + struct nlmsghdr* pMsgHdr = (struct nlmsghdr*)g_MsgSendBuf; + struct msghdr msgHdr = {&dstAddr, sizeof(dstAddr), &iov, 1, NULL, 0, 0}; + + memset(&dstAddr, 0, sizeof(struct sockaddr_nl)); + dstAddr.nl_family = AF_NETLINK; + dstAddr.nl_pid = 0; + dstAddr.nl_groups = 0; + + memset(pMsgHdr, 0, BL_MSG_BUF_MAX); + pMsgHdr->nlmsg_len = len; + pMsgHdr->nlmsg_pid = getpid(); + pMsgHdr->nlmsg_flags = 0; + memcpy(NLMSG_DATA(pMsgHdr), pData, len); + + iov.iov_base = pMsgHdr; + iov.iov_len = NLMSG_SPACE(BL_MSG_BUF_MAX); + + return sendmsg(g_nlSock, &msgHdr, 0); +} + +int BL_SendBLMsg(BL_IOT_MSG_TYPE msgType, unsigned char* pData, unsigned int len) +{ + BL_IOT_MSG blMsg; + + memset(&blMsg, 0, sizeof(BL_IOT_MSG)); + blMsg.msgType = msgType; + blMsg.msglen = len; + strcpy(blMsg.msgTags, BL_IOT_MSG_TAGS); + + if(pData && len > 0) + { + memcpy(blMsg.msgData, pData, len); + } + + return __sendMessage((unsigned char*)&blMsg, BL_IOT_MSG_LEN(len)); +} + +int BL_SendBLMsgTo(BL_IOT_MSG_TYPE msgType, unsigned char* pData, unsigned int len, unsigned char dstMac[ETH_ALEN]) +{ + BL_IOT_MSG blMsg; + + memset(&blMsg, 0, sizeof(BL_IOT_MSG)); + blMsg.msgType = msgType; + blMsg.msglen = len; + memcpy(blMsg.dstMac, dstMac, ETH_ALEN); + strcpy(blMsg.msgTags, BL_IOT_MSG_TAGS); + + if(pData && len > 0) + { + memcpy(blMsg.msgData, pData, len); + } + + return __sendMessage((unsigned char*)&blMsg, BL_IOT_MSG_LEN(len)); +} + +int BL_Init(BlMsgCb cbOnMsg) +{ + int ret = 0; + uv_thread_t uvRecvThread; + + ret = __nlCreateSocket(); + + if(ret != 0) + { + return ret; + } + + g_blMsgCb = cbOnMsg; + + uv_thread_create(&uvRecvThread, __recvMsgThread, NULL); + + return 0; +} +#endif diff --git a/package/netease/libuvdbus/src/Framework/Network/inet_api.c b/package/netease/libuvdbus/src/Framework/Network/inet_api.c index 0edd15e41..ee3a9db37 100644 --- a/package/netease/libuvdbus/src/Framework/Network/inet_api.c +++ b/package/netease/libuvdbus/src/Framework/Network/inet_api.c @@ -1073,7 +1073,7 @@ int InetHttpUploadFileSync(const char *pURL, const char* pPath, void* pAttachInf if(ret != CURLE_OK) { - LOG_EX(LOG_Error, "Upload %s File %s Error %s\n", pURL, pPath, curl_easy_strerror(ret)); + LOG_EX(LOG_Error, "Upload %s File %s Error %s(%d)\n", pURL, pPath, curl_easy_strerror(ret), ret); rc = -ERR_NETWORK_SEND; } diff --git a/package/netease/libuvdbus/src/Framework/SvrManager/svr_manager.c b/package/netease/libuvdbus/src/Framework/SvrManager/svr_manager.c index df0db1794..2a15b1c0f 100644 --- a/package/netease/libuvdbus/src/Framework/SvrManager/svr_manager.c +++ b/package/netease/libuvdbus/src/Framework/SvrManager/svr_manager.c @@ -21,6 +21,7 @@ const char* g_ServerModeStr[] = "DEV_MODE", "TEST_MODE", "PUBLISH_MODE", + "PUBLISH_PREBUILD", "UNKNOWN_MODE" }; @@ -46,11 +47,13 @@ const char* g_VoiceKeyMap[VOICE_MAX][MAX_MODE] = { "vbox-dev", "vbox-dev", "vbox-online", + "vbox-online", }, { // VOICE_APP_SECRET "b1ec33c03df80ea3035bc9ccaa4af09c", "b1ec33c03df80ea3035bc9ccaa4af09c", "8714d6de1c83f21dda5fc9a905a59ac1", + "8714d6de1c83f21dda5fc9a905a59ac1", }, }; @@ -59,41 +62,49 @@ const char* g_ServerAddr[MAX_MODULE][MAX_MODE] = { "2e37bc56a9b7ec3f6b8f41f60b81eb92", "2e37bc56a9b7ec3f6b8f41f60b81eb92", "dbb00213c23ea3709aae12ceb4c4e54e", + "7fc939cdb26ec2fa343b7c47a0617190", }, { // VOICE_MODULE "ws://vbox-test.netease.com/netty/websocket", "ws://vbox-test.netease.com/netty3/websocket", "wss://vbox-asr.3.163.com/websocket", + "ws://vbox-test.netease.com/asr/websocket", }, { // VOICE_AI_MODULE "http://api.multimedia.netease.com/imgtest/yqbot31_8686/", "http://api.multimedia.netease.com/imgtest/yqbot29_8686/", "https://vbox-smart.3.163.com/ ", + "http://api.multimedia.netease.com/imgtest/yqbot30_8888/", }, { // SERVER_MODULE "http://api.multimedia.netease.com/imgtest/yqbot27_7677/", "http://api.multimedia.netease.com/imgtest/yqbot31_7676/", "https://vbox-server.3.163.com/", + "http://api.multimedia.netease.com/imgtest/yqbot22_7678/", }, { // LOG_MODULE "http://vbox-log-test.netease.com/logCollectDev/vbox/logCollect/uploadLog", "http://vbox-log-test.netease.com/logCollect/vbox/logCollect/uploadLog", "https://vbox-log.3.163.com/vbox/logCollect/uploadLog", + "http://vbox-log-test.netease.com/logCollectOnline/vbox/logCollect/uploadLog", }, { // MARK_POINT_MODULE "http://vbox-log-test.netease.com/buriedDev/vbox/log/add", "http://vbox-log-test.netease.com/buriedTest/vbox/log/add", "https://vbox-log.3.163.com/vbox/log/add", + "http://vbox-log-test.netease.com/buriedOnline/vbox/log/add", }, { // TTS_MODULE "http://api.openai.netease.com/vbox-tts-dev/vbox/tts/transform", "http://api.openai.netease.com/vbox-tts-test/vbox/tts/transform", "https://vbox-tts.3.163.com/vbox/tts/transform", + "http://api.openai.netease.com/vbox-tts-online/vbox/tts/transform", }, { // DC_MODULE "http://api.multimedia.netease.com/imgtest/yqbot27_7677/vbox/uploadFile", "http://api.multimedia.netease.com/imgtest/yqbot31_7676/vbox/uploadFile", "https://vbox-server.3.163.com/vbox/uploadFile", + "http://api.multimedia.netease.com/imgtest/yqbot22_7678/vbox/uploadFile", }, }; diff --git a/package/netease/libuvdbus/src/Framework/libuvEngine/libuv_dbus.c b/package/netease/libuvdbus/src/Framework/libuvEngine/libuv_dbus.c index dc04cabfb..e73264bf8 100644 --- a/package/netease/libuvdbus/src/Framework/libuvEngine/libuv_dbus.c +++ b/package/netease/libuvdbus/src/Framework/libuvEngine/libuv_dbus.c @@ -587,6 +587,8 @@ static int DBusOnMsgWorkAPICb(PDBUS_MSG_PACK pMsg) if(pWorkDayInfo && err == 0) { memcpy(&g_workDayArray, pWorkDayInfo, sizeof(WORKDAY_INFO)); + g_workDayArray.isReady = TRUE; + LOG_EX(LOG_Debug, "Sync Alarm Database: %s\n", pMsg->pMsg); } //LOG_EX2(LOG_Debug, "Database: %s\n", pMsg->pMsg); @@ -1463,7 +1465,7 @@ static void __waitUDISKMount(void) FILE* pFile; // wait system create setup status file - LOG_EX(LOG_Debug, "Wait boot status file create ......\n"); + fprintf(stdout, "Wait boot status file create ......\n"); while(access(pBootStatFile, F_OK) != 0) { usleep(10000); @@ -1473,11 +1475,11 @@ static void __waitUDISKMount(void) if(pFile == NULL) { - LOG_EX(LOG_Error, "Open boot status file error\n"); + fprintf(stdout, "Open boot status file error\n"); return; } - LOG_EX(LOG_Debug, "Wait boot status done ......\n"); + fprintf(stdout, "Wait boot status done ......\n"); // when UDISK mount, file /tmp/booting_state content is "done" do @@ -1492,10 +1494,47 @@ static void __waitUDISKMount(void) fclose(pFile); - LOG_EX(LOG_Debug, "Boot status done ......\n"); + fprintf(stdout, "Boot status done ......\n"); #endif } +int GetServerModeFromCC(int defValue, int* pErr) +{ + char* pSvrMode = NULL; + int iValue = defValue; + + GetShellExecResult("curl --silent http://localhost:1705/httpenv/999 | grep 'env:' | awk '{print $3}'", &pSvrMode); + + if(pSvrMode == NULL) + { + if(pErr) + { + *pErr = -ERR_NO_ITEMS; + } + return defValue; + } + + iValue = strtol(pSvrMode, NULL, 10); + free(pSvrMode); + + if(errno == EINVAL || errno == ERANGE) + { + if(pErr) + { + *pErr = -ERR_STR_CONVERT; + } + + return defValue; + } + + if(pErr) + { + *pErr = 0; + } + + return iValue; +} + DBusConnection* DBusWithLibuvInit(uv_loop_t* pUserLoop, const char* pBusName, OnDBusMessage cbOnMsg, @@ -1551,6 +1590,9 @@ DBusConnection* DBusWithLibuvInit(uv_loop_t* pUserLoop, puvFsReq = (uv_fs_t*)malloc(sizeof(uv_fs_t)); + // wait UDISK mount, configure file save in UDISK partition + __waitUDISKMount(); + CfgFileInit(); IHW_InitLOG(strrchr(pBusName, '.') + 1, NULL, TRUE); @@ -1558,13 +1600,11 @@ DBusConnection* DBusWithLibuvInit(uv_loop_t* pUserLoop, IHW_RunLogService(); APP_BUILD_INFO(strrchr(pBusName, '.') + 1, GetCurrentVersion()); - - // wait UDISK mount, configure file save in UDISK partition - __waitUDISKMount(); - + + i = 0; do { - svrMode = CfgGetInvValueV1("Global.ServerMode", PUBLISH_MODE, &ret); + svrMode = CfgGetIntValueV1("Global.ServerMode", PUBLISH_MODE, &ret); if(ret != 0) { @@ -1576,8 +1616,35 @@ DBusConnection* DBusWithLibuvInit(uv_loop_t* pUserLoop, } LOG_EX(LOG_Debug, "ServerMode = %d, Error = %d\n", svrMode, ret); - } while (ret != 0); + } while (ret != 0 && i++ <= 3); + if(ret != 0) + { + LOG_EX(LOG_Error, "Read Server Mode Error: ret = %d\n", ret); + svrMode = CfgGetIntValueV2("ServerMode", PUBLISH_MODE, &ret); + + if(ret == 0) + { + LOG_EX(LOG_Warn, "Recovery Server Mode OK: ServerMode = %d\n", svrMode); + } + else + { + LOG_EX(LOG_Error, "CfgGetInvValueV2 Read Server Mode Error: ret = %d\n", ret); + svrMode = GetServerModeFromCC(PUBLISH_MODE, &ret); + + if(ret == 0) + { + LOG_EX(LOG_Warn, "Netease Controller Server Mode OK: ServerMode = %d\n", svrMode); + } + else + { + svrMode = PUBLISH_MODE; + LOG_EX(LOG_Error, "GetServerModeFromCC Read Server Mode Error: " + "ret = %d, Set to default: PUBLISH_MODE\n", ret); + } + } + } + SetCurrentServerMode(svrMode); DumpCurServerAddr("Default"); @@ -2019,6 +2086,11 @@ static int __reqWorkDayInfo(int year) reqInfo.year = year; } + if(reqInfo.year < (2018 - 1900)) + { + return 0; + } + ret = DBusJsonSendToCommand(NULL, g_pModInfoTable[MODULE_CONTROLLER].modAliase, CMD_WORKDAY_DB_REQ, @@ -2028,9 +2100,19 @@ static int __reqWorkDayInfo(int year) return (ret); } +int IsHolidayDBSynced(void) +{ + return g_workDayArray.isReady; +} + int CurrentIsWorkDay(int year, int day) { -// LOG_EX(LOG_Debug, "CurrentIsWorkDay: year = %d, day = %d\n", year, day); + static unsigned int i = 0; + + if(year != 0) + { + LOG_EX(LOG_Debug, "CurrentIsWorkDay: year = %d, day = %d\n", year, day); + } if(day > 365) { @@ -2041,7 +2123,10 @@ int CurrentIsWorkDay(int year, int day) if(g_workDayArray.year <= 0) { __reqWorkDayInfo(year); - LOG_EX(LOG_Error, "Unsync Database: year = %d\n", year); + if(i++ % 10 == 0) + { + LOG_EX(LOG_Error, "Unsync Database: year = %d\n", year); + } return (-ERR_UNINIT_ITEM); } diff --git a/package/netease/libuvdbus/src/Makefile b/package/netease/libuvdbus/src/Makefile index 7d064fe74..f08816c26 100644 --- a/package/netease/libuvdbus/src/Makefile +++ b/package/netease/libuvdbus/src/Makefile @@ -6,6 +6,7 @@ TARGET := libuvdbus.so commonSources := \ log/hexdump.c \ log/log.c \ + Framework/IoT/Boardlink/boardlink_iot.c \ Framework/HeartDaemon/heart_daemon.c \ Framework/Configure/config_engine.c \ Framework/Configure/ini_prase.c \ diff --git a/package/netease/libuvdbus/src/include/boardlink_iot.h b/package/netease/libuvdbus/src/include/boardlink_iot.h new file mode 100644 index 000000000..65dd47a2a --- /dev/null +++ b/package/netease/libuvdbus/src/include/boardlink_iot.h @@ -0,0 +1,44 @@ +#ifndef BOARDLINK_IOT_H +#define BOARDLINK_IOT_H +#ifndef PLATFORM_CPU +#define BL_IOT_MSG_TAGS ("BLNLINK") +#define BL_MAX_MSG (1024) +#define ETH_ALEN (6) + +typedef enum +{ + MSG_IN_DISCOVERY_MODE = 0, + MSG_OUT_DISCOVERY_MODE, + MSG_GET_WLAN_INFO, + MSG_BYPASS_MODE, +} BL_IOT_MSG_TYPE; + +#pragma pack (push) +#pragma pack (1) +typedef struct +{ + unsigned char msgTags[8]; + unsigned char dstMac[ETH_ALEN]; + unsigned char msgType; + unsigned int msglen; + unsigned char msgData[BL_MAX_MSG]; +} BL_IOT_MSG, *PBL_IOT_MSG; + +typedef struct +{ + unsigned char channel; + unsigned char dev_mac[ETH_ALEN]; + unsigned char bssid[ETH_ALEN]; + unsigned char ssid[32]; +} WL_INFO, *PWL_INFO; +#pragma pack (pop) + +#define BL_IOT_MSG_LEN(len) (sizeof(BL_IOT_MSG) - BL_MAX_MSG + len) + +typedef void (*BlMsgCb)(PBL_IOT_MSG pMsg); + +int BL_Init(BlMsgCb cbOnMsg); +int BL_SendBLMsg(BL_IOT_MSG_TYPE msgType, unsigned char* pData, unsigned int len); +int BL_SendBLMsgTo(BL_IOT_MSG_TYPE msgType, unsigned char* pData, unsigned int len, unsigned char dstMac[ETH_ALEN]); +#endif +#endif diff --git a/package/netease/libuvdbus/src/include/libuv_dbus.h b/package/netease/libuvdbus/src/include/libuv_dbus.h index daab5912a..ef1a9c72f 100644 --- a/package/netease/libuvdbus/src/include/libuv_dbus.h +++ b/package/netease/libuvdbus/src/include/libuv_dbus.h @@ -39,6 +39,7 @@ typedef struct typedef struct { + int isReady; int year; unsigned char days[366]; } WORKDAY_INFO, *PWORKDAY_INFO; @@ -202,6 +203,7 @@ unsigned int AlarmTimerAdd(int year, int *pError); int CurrentIsWorkDay(int year, int day); +int IsHolidayDBSynced(void); const char* DumpTimerRepeatModeString(int mode); unsigned long long GetPartitionFreeSize(const char *pPartPath); WIFI_STATUS GetCurrWIFIConnStatus(void); @@ -215,7 +217,9 @@ char* GetCurrentVersion(void); void CfgFileInit(void); int CfgGetIntValue(const char* pTags, int defValue); -int CfgGetInvValueV1(const char* pTags, int defValue, int* pErr); +int CfgGetIntValueV1(const char* pTags, int defValue, int* pErr); +int CfgGetIntValueV2(const char* pTags, int defValue, int* pErr); +int GetServerModeFromCC(int defValue, int* pErr); char* CfgGetStringValue(const char* pTags, char* pDefValue); double CfgGetFloatValue(const char* pTags, double defValue); int CfgGetBoolValue(const char* pTags, int defValue); diff --git a/package/netease/libuvdbus/src/include/server_addr.h b/package/netease/libuvdbus/src/include/server_addr.h index 1a1166706..9f5d473d1 100644 --- a/package/netease/libuvdbus/src/include/server_addr.h +++ b/package/netease/libuvdbus/src/include/server_addr.h @@ -19,9 +19,10 @@ typedef enum typedef enum { - DEV_MODE = 0, - TEST_MODE = 1, - PUBLISH_MODE = 2, + DEV_MODE = 0, + TEST_MODE = 1, + PUBLISH_MODE = 2, + PUBLISH_PREBUILD = 3, MAX_MODE } SERVER_MODE_TYPE; diff --git a/package/netease/libuvdbus/src/include/skins_res.h b/package/netease/libuvdbus/src/include/skins_res.h index 8e3fb8f33..58b08387d 100644 --- a/package/netease/libuvdbus/src/include/skins_res.h +++ b/package/netease/libuvdbus/src/include/skins_res.h @@ -91,6 +91,8 @@ const SKIN_RES_INFO g_SkinDefaultResTable[] = { {VOICE_RES, "0", "v5012", DEF_SKINS_ROOT_PATH"voice/a-a-02.mp3", "837a2222c961824e98c0d3751a234ae6"}, {VOICE_RES, "0", "v5013", DEF_SKINS_ROOT_PATH"voice/a-a-03.mp3", "0ec34a1f19ee7cea6b139d214e59026d"}, {VOICE_RES, "0", "v502", DEF_SKINS_ROOT_PATH"voice/a-n-01.mp3", "b1eb13ed8c9afaa2989763c3d379b39a"}, + {VOICE_RES, "0", "v601", DEF_SKINS_ROOT_PATH"voice/b-m-1.mp3", "820cf2c01e03726b95bc4346a2ce8f8b"}, + {VOICE_RES, "0", "v602", DEF_SKINS_ROOT_PATH"voice/b-m-2.mp3", "35a48b8ec586acfb99a612b4fc1ba57a"}, /////////////////////////////////////////////////////////////////////////////////////////////////////////// /// picture resources diff --git a/package/netease/libuvdbus/src/include/smart_sound.h b/package/netease/libuvdbus/src/include/smart_sound.h index 564727557..a6a948002 100644 --- a/package/netease/libuvdbus/src/include/smart_sound.h +++ b/package/netease/libuvdbus/src/include/smart_sound.h @@ -145,6 +145,18 @@ typedef enum { CMD_WIFI_CHANGE_VALID_AP_OUT, CMD_WIFI_CHANGE_VALID_AP_RESP, + CMD_WIFI_BL_CMD_START, + CMD_WIFI_BL_CONF, + CMD_WIFI_BL_CONF_ABORT, + CMD_WIFI_BL_DEV_INFO_NTF, + CMD_WIFI_BL_CLOUD_CHALLENGE_SIGNATURE, + CMD_WIFI_BL_DEV_SIGNATURE, + CMD_WIFI_BL_CLOUD_SHAREDKEY, + CMD_WIFI_BL_DEV_TOKEN, + CMD_WIFI_BL_DEV_TOKEN_BOUND, + CMD_WIFI_BL_CONF_FAILED, + CMD_WIFI_BL_CMD_END, + CMD_BT_NAME_GET_REQ, CMD_BT_NAME_GET_RESP, CMD_BT_EVT_NTF, @@ -187,6 +199,7 @@ typedef enum { CMD_BT_VOL_CHANGE, CMD_BT_BREDR_REBOOT_CLOSE, + CMD_BT_AVK_DEV_CON_CONFLICT, CMD_KPLAYER_START = 0x1b00, CMD_KPLAYER_STOP, @@ -433,6 +446,9 @@ typedef enum { ERR_NETWORK_SEND, ERR_NETWORK_NOT_CONNECTED, + ERR_CREATE_SOCKET, + ERR_BIND_SOCKET, + ERR_UNSUPPORT, } DBUS_WITH_LIBUV_ERROR; diff --git a/package/netease/libuvdbus/src/log/log.c b/package/netease/libuvdbus/src/log/log.c index ff4507e92..08026341a 100644 --- a/package/netease/libuvdbus/src/log/log.c +++ b/package/netease/libuvdbus/src/log/log.c @@ -1291,6 +1291,7 @@ int SysPointMark(char* pMarkInfo) int SysPointMarkUpload(void) { + int ret, size = 0; char path[MAX_PATH]; memset(path, 0, MAX_PATH); @@ -1301,14 +1302,31 @@ int SysPointMarkUpload(void) unlink(path); } + GET_FILE_SIZE(g_SysPonitInfo.savePath, size); + + if(size <= 0) + { + LOG_EX(LOG_Debug, "Upload System Mark Data [%s] Is Empty, Skip......\n", g_SysPonitInfo.savePath); + return 0; + } + rename(g_SysPonitInfo.savePath, path); fclose(g_SysPonitInfo.pMarkFile); g_SysPonitInfo.pMarkFile = fopen(g_SysPonitInfo.savePath, "w+"); - InetHttpUploadFileSync(GetCurServerAddr(MARK_POINT_MODULE), path, NULL); + size = 0; + + do + { + ret = InetHttpUploadFileSync(GetCurServerAddr(MARK_POINT_MODULE), path, NULL); + sleep(1); + } while(ret != 0 && ++size < 3); + LOG_EX(LOG_Debug, "Upload System Mark Data [%s] To Server [%s]\n", path, GetCurServerAddr(MARK_POINT_MODULE)); unlink(path); + + return 0; } diff --git a/package/netease/system_resources/resource/voice/b-m-1.mp3 b/package/netease/system_resources/resource/voice/b-m-1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..91a4dff48dbaf591850d0c2922b5f98aa3aa6806 GIT binary patch literal 21192 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%0DT@ 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 AbN~PV literal 0 HcmV?d00001