865 lines
25 KiB
C
865 lines
25 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <sys/time.h>
|
|
#include <uv.h>
|
|
#include <dbus/dbus.h>
|
|
#include <errno.h>
|
|
#include <time.h>
|
|
#include <uthash/utlist.h>
|
|
|
|
#if defined(PLATFORM_R16) || defined (PLATFORM_CPU) || defined(PLATFORM_R311)
|
|
#include "log.h"
|
|
#include "libuv_dbus.h"
|
|
#include "crypto.h"
|
|
#include "json_struct.h"
|
|
#include "config_engine.h"
|
|
#include "assistant.h"
|
|
#else
|
|
#include <uvdbus/log.h>
|
|
#include <uvdbus/libuv_dbus.h>
|
|
#include <uvdbus/crypto.h>
|
|
#include <uvdbus/json_struct.h>
|
|
#include <uvdbus/config_engine.h>
|
|
#include <uvdbus/assistant.h>
|
|
#endif
|
|
|
|
#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 = 0;
|
|
static unsigned int g_sessionId = 0;
|
|
|
|
static void __onAlarmCb(unsigned int tmId, unsigned int status, void *pUserData);
|
|
|
|
static int __getTimerPriorty(ASSISTANT_TYPE itemType)
|
|
{
|
|
switch(itemType)
|
|
{
|
|
case ASSISTANT_TYPE_CLOCK:
|
|
return (2);
|
|
|
|
case ASSISTANT_TYPE_REMAIND:
|
|
return (3);
|
|
|
|
case ASSISTANT_TYPE_SESSION:
|
|
return (1);
|
|
}
|
|
|
|
return (0);
|
|
}
|
|
|
|
static void __addTaskToTimer(PASSISTANT_ARRAY_INFO pItem)
|
|
{
|
|
int ret = 0;
|
|
unsigned int alarmId;
|
|
|
|
pItem->alarmItem.second = 0;
|
|
|
|
alarmId = AlarmTimerAdd(pItem->alarmItem.year,
|
|
pItem->alarmItem.month,
|
|
pItem->alarmItem.day,
|
|
pItem->alarmItem.hour,
|
|
pItem->alarmItem.minute,
|
|
pItem->alarmItem.second,
|
|
pItem->alarmItem.weekDay,
|
|
pItem->alarmItem.repeatMode,
|
|
__onAlarmCb,
|
|
__getTimerPriorty(pItem->alarmItem.itemType),
|
|
&pItem->alarmItem,
|
|
&ret);
|
|
|
|
if(alarmId != 0xFFFFFFFF && ret == 0)
|
|
{
|
|
pItem->alarmItem.timerId = alarmId;
|
|
}
|
|
else
|
|
{
|
|
pItem->alarmItem.timerId = 0xFFFFFFFF;
|
|
}
|
|
}
|
|
|
|
static int __assistantRspStatus(int cmd, int val)
|
|
{
|
|
int ret = 0;
|
|
ASSISTANT_RSP_STATUS oStatus;
|
|
|
|
memset(&oStatus, 0, sizeof(ASSISTANT_RSP_STATUS));
|
|
|
|
oStatus.cmd = cmd;
|
|
oStatus.val = val;
|
|
|
|
ret = DBusJsonSendToCommand(NULL,
|
|
g_pModInfoTable[MODULE_CONTROLLER].modAliase,
|
|
CMD_ASSISTANT_STATUS,
|
|
JSON_ENGINE_ASSISTANT_STATUS,
|
|
&oStatus, TRUE);
|
|
|
|
return (ret);
|
|
}
|
|
|
|
static int __assistantRunningEvent(PASSISTANT_ITEM_INFO pInfo)
|
|
{
|
|
int ret = 0;
|
|
|
|
ret = DBusJsonSendToCommand(NULL,
|
|
g_pModInfoTable[MODULE_CONTROLLER].modAliase,
|
|
CMD_ASSISTANT_RUNNING,
|
|
JSON_ENGINE_ASSISTANT_RUNNING,
|
|
pInfo, FALSE);
|
|
|
|
return (ret);
|
|
}
|
|
|
|
static int __assistantNotifyChange(int cmdNotify, int nItems, ASSISTANT_TYPE nType, PASSISTANT_ITEM_INFO pInfo)
|
|
{
|
|
int ret = 0;
|
|
ASSISTANT_NOTIFY_INFO notifyInfo;
|
|
|
|
memset(¬ifyInfo, 0, sizeof(ASSISTANT_NOTIFY_INFO));
|
|
|
|
notifyInfo.type = nType;
|
|
notifyInfo.cmd = cmdNotify;
|
|
|
|
if(pInfo)
|
|
{
|
|
notifyInfo.nItems = nItems;
|
|
for(int i = 0; i < nItems; i++)
|
|
{
|
|
notifyInfo.ids[i] = pInfo[i].itemId;
|
|
}
|
|
}
|
|
|
|
ret = DBusJsonSendToCommand(NULL,
|
|
g_pModInfoTable[MODULE_CONTROLLER].modAliase,
|
|
CMD_ASSISTANT_NOTIFY,
|
|
JSON_ENGINE_ASSISTANT_NOTIFY,
|
|
¬ifyInfo, TRUE);
|
|
|
|
return (ret);
|
|
}
|
|
|
|
static int __assistantArrayNotifyChange(int cmdNotify, int nItems, ASSISTANT_TYPE nType, unsigned long long* pArray)
|
|
{
|
|
int ret = 0;
|
|
ASSISTANT_NOTIFY_INFO notifyInfo;
|
|
|
|
memset(¬ifyInfo, 0, sizeof(ASSISTANT_NOTIFY_INFO));
|
|
|
|
notifyInfo.type = nType;
|
|
notifyInfo.cmd = cmdNotify;
|
|
|
|
if(pArray)
|
|
{
|
|
notifyInfo.nItems = nItems;
|
|
for(int i = 0; i < nItems; i++)
|
|
{
|
|
notifyInfo.ids[i] = pArray[i];
|
|
}
|
|
}
|
|
|
|
ret = DBusJsonSendToCommand(NULL,
|
|
g_pModInfoTable[MODULE_CONTROLLER].modAliase,
|
|
CMD_ASSISTANT_NOTIFY,
|
|
JSON_ENGINE_ASSISTANT_NOTIFY,
|
|
¬ifyInfo, TRUE);
|
|
|
|
return (ret);
|
|
}
|
|
|
|
static void __cleanupAlarmArray(void)
|
|
{
|
|
PASSISTANT_ARRAY_INFO pItem = NULL, pTmp = NULL;
|
|
|
|
uv_rwlock_wrlock(&g_uvListRwLock);
|
|
DL_FOREACH_SAFE(g_pAlarmArray, pItem, pTmp)
|
|
{
|
|
AlarmTimerRemove(pItem->alarmItem.timerId);
|
|
DL_DELETE(g_pAlarmArray, pItem);
|
|
free(pItem);
|
|
}
|
|
uv_rwlock_wrunlock(&g_uvListRwLock);
|
|
}
|
|
|
|
static void __cleanupRemaindArray(void)
|
|
{
|
|
PASSISTANT_ARRAY_INFO pItem = NULL, pTmp = NULL;
|
|
|
|
uv_rwlock_wrlock(&g_uvListRwLock);
|
|
DL_FOREACH_SAFE(g_pRemaindArray, pItem, pTmp)
|
|
{
|
|
AlarmTimerRemove(pItem->alarmItem.timerId);
|
|
DL_DELETE(g_pRemaindArray, pItem);
|
|
free(pItem);
|
|
}
|
|
uv_rwlock_wrunlock(&g_uvListRwLock);
|
|
}
|
|
|
|
static void __cleanupSessionArray(void)
|
|
{
|
|
PASSISTANT_ARRAY_INFO pItem = NULL, pTmp = NULL;
|
|
|
|
uv_rwlock_wrlock(&g_uvListRwLock);
|
|
DL_FOREACH_SAFE(g_pSessionArray, pItem, pTmp)
|
|
{
|
|
AlarmTimerRemove(pItem->alarmItem.timerId);
|
|
DL_DELETE(g_pSessionArray, pItem);
|
|
free(pItem);
|
|
}
|
|
uv_rwlock_wrunlock(&g_uvListRwLock);
|
|
}
|
|
|
|
static int __addNewItems(PASSISTANT_SYNC_INFO pInfo)
|
|
{
|
|
struct tm localTime;
|
|
time_t loclStamp, tmStamp = time((time_t*)NULL);
|
|
|
|
localtime_r(&tmStamp, &localTime);
|
|
loclStamp = mktime(&localTime);
|
|
|
|
for(int i = 0; i < pInfo->nItems; i++)
|
|
{
|
|
PASSISTANT_ARRAY_INFO pItem = (PASSISTANT_ARRAY_INFO)malloc(sizeof(struct ASSISTANT_ARRAY_INFO));
|
|
|
|
if(pItem == NULL)
|
|
{
|
|
LOG_EX(LOG_Error, "Malloc Memory Error\n");
|
|
return (-ERR_MALLOC_MEMORY);
|
|
}
|
|
|
|
memset(pItem, 0, sizeof(struct ASSISTANT_ARRAY_INFO));
|
|
|
|
strcpy(pItem->alarmItem.strTips, pInfo->pAlarmInfo[i].strTips);
|
|
strcpy(pItem->alarmItem.resUrl, pInfo->pAlarmInfo[i].resUrl);
|
|
strcpy(pItem->alarmItem.voiceRes, pInfo->pAlarmInfo[i].voiceRes);
|
|
strcpy(pItem->alarmItem.voiceResType, pInfo->pAlarmInfo[i].voiceResType);
|
|
|
|
pItem->alarmItem.itemType = pInfo->pAlarmInfo[i].itemType;
|
|
pItem->alarmItem.repeatMode = pInfo->pAlarmInfo[i].repeatMode;
|
|
pItem->alarmItem.voiceId = pInfo->pAlarmInfo[i].voiceId;
|
|
|
|
pItem->alarmItem.year = pInfo->pAlarmInfo[i].year;
|
|
pItem->alarmItem.month = pInfo->pAlarmInfo[i].month;
|
|
pItem->alarmItem.day = pInfo->pAlarmInfo[i].day;
|
|
pItem->alarmItem.hour = pInfo->pAlarmInfo[i].hour;
|
|
pItem->alarmItem.minute = pInfo->pAlarmInfo[i].minute;
|
|
pItem->alarmItem.second = pInfo->pAlarmInfo[i].second;
|
|
pItem->alarmItem.weekDay = pInfo->pAlarmInfo[i].weekDay;
|
|
|
|
if(ASSISTANT_TYPE_SESSION == pItem->alarmItem.itemType)
|
|
{
|
|
pItem->alarmItem.itemId = g_sessionId++;
|
|
}
|
|
else
|
|
{
|
|
pItem->alarmItem.itemId = pInfo->pAlarmInfo[i].itemId;
|
|
}
|
|
|
|
if(pItem->alarmItem.repeatMode == REPEAT_MODE_NONE)
|
|
{
|
|
struct tm setTime;
|
|
time_t onTimeStamp;
|
|
int tmDiff;
|
|
|
|
setTime.tm_year = pItem->alarmItem.year;
|
|
setTime.tm_mon = pItem->alarmItem.month;
|
|
setTime.tm_mday = pItem->alarmItem.day;
|
|
setTime.tm_hour = pItem->alarmItem.hour;
|
|
setTime.tm_min = pItem->alarmItem.minute;
|
|
setTime.tm_sec = pItem->alarmItem.second;
|
|
|
|
onTimeStamp = mktime(&setTime);
|
|
tmDiff = (int)difftime(loclStamp, onTimeStamp);
|
|
|
|
if(tmDiff >= 3)
|
|
{
|
|
LOG_EX(LOG_Warn, "%llu: Was Expired %d!!!!!!\n", pItem->alarmItem.itemId, tmDiff);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
uv_rwlock_wrlock(&g_uvListRwLock);
|
|
if(ASSISTANT_TYPE_CLOCK == pItem->alarmItem.itemType)
|
|
{
|
|
DL_APPEND(g_pAlarmArray, pItem);
|
|
}
|
|
else if(ASSISTANT_TYPE_REMAIND == pItem->alarmItem.itemType)
|
|
{
|
|
DL_APPEND(g_pRemaindArray, pItem);
|
|
}
|
|
else if(ASSISTANT_TYPE_SESSION == pItem->alarmItem.itemType)
|
|
{
|
|
DL_APPEND(g_pSessionArray, pItem);
|
|
}
|
|
else
|
|
{
|
|
LOG_EX(LOG_Error, "Unknown Type: %d\n", pItem->alarmItem.itemType);
|
|
}
|
|
uv_rwlock_wrunlock(&g_uvListRwLock);
|
|
|
|
__addTaskToTimer(pItem);
|
|
}
|
|
|
|
return (0);
|
|
}
|
|
|
|
static void __removeAlarmItem(PASSISTANT_NOTIFY_INFO pRemove)
|
|
{
|
|
PASSISTANT_ARRAY_INFO pItem = NULL, pTmp = NULL;
|
|
|
|
for(int i = 0; i < pRemove->nItems; i++)
|
|
{
|
|
uv_rwlock_wrlock(&g_uvListRwLock);
|
|
DL_FOREACH_SAFE(g_pAlarmArray, pItem, pTmp)
|
|
{
|
|
if(pItem->alarmItem.itemId == pRemove->ids[i]
|
|
&& pItem->alarmItem.itemType == pRemove->type)
|
|
{
|
|
AlarmTimerRemove(pItem->alarmItem.timerId);
|
|
DL_DELETE(g_pAlarmArray, pItem);
|
|
free(pItem);
|
|
}
|
|
}
|
|
uv_rwlock_wrunlock(&g_uvListRwLock);
|
|
}
|
|
}
|
|
|
|
static void __removeRemaindItem(PASSISTANT_NOTIFY_INFO pRemove)
|
|
{
|
|
PASSISTANT_ARRAY_INFO pItem = NULL, pTmp = NULL;
|
|
|
|
for(int i = 0; i < pRemove->nItems; i++)
|
|
{
|
|
uv_rwlock_wrlock(&g_uvListRwLock);
|
|
DL_FOREACH_SAFE(g_pRemaindArray, pItem, pTmp)
|
|
{
|
|
if(pItem->alarmItem.itemId == pRemove->ids[i]
|
|
&& pItem->alarmItem.itemType == pRemove->type)
|
|
{
|
|
AlarmTimerRemove(pItem->alarmItem.timerId);
|
|
DL_DELETE(g_pRemaindArray, pItem);
|
|
free(pItem);
|
|
}
|
|
}
|
|
uv_rwlock_wrunlock(&g_uvListRwLock);
|
|
}
|
|
}
|
|
|
|
static int __alarmItemCmp(PASSISTANT_ARRAY_INFO pSrc, PASSISTANT_ARRAY_INFO pDst)
|
|
{
|
|
#if 0
|
|
fprintf(stdout, "id: %llu --> %llu, type: %u --> %u\n",
|
|
pSrc->alarmItem.itemId, pDst->alarmItem.itemId,
|
|
pSrc->alarmItem.itemType, pDst->alarmItem.itemType);
|
|
#endif
|
|
if(pSrc->alarmItem.itemId == pDst->alarmItem.itemId
|
|
&& pSrc->alarmItem.itemType == pDst->alarmItem.itemType)
|
|
{
|
|
return (0);
|
|
}
|
|
else
|
|
{
|
|
return (1);
|
|
}
|
|
}
|
|
|
|
static void __onAlarmCb(unsigned int tmId, unsigned int status, void *pUserData)
|
|
{
|
|
PASSISTANT_ITEM_INFO pAlarm = (PASSISTANT_ITEM_INFO)pUserData;
|
|
PASSISTANT_ARRAY_INFO pItem = NULL;
|
|
struct ASSISTANT_ARRAY_INFO tmpItem;
|
|
|
|
struct tm localTime;
|
|
time_t tmStamp = time((time_t*)NULL);
|
|
|
|
localtime_r(&tmStamp, &localTime);
|
|
|
|
LOG_EX(LOG_Debug, "Timer[%lld] %u On at [%04u-%02u-%02u %02u:%02u:%02u], status = %u\n", pAlarm->itemId, tmId,
|
|
localTime.tm_year + 1900, localTime.tm_mon + 1, localTime.tm_mday,
|
|
localTime.tm_hour, localTime.tm_min, localTime.tm_sec,
|
|
status);
|
|
|
|
memset(&tmpItem, 0, sizeof(struct ASSISTANT_ARRAY_INFO));
|
|
|
|
tmpItem.alarmItem.itemId = pAlarm->itemId;
|
|
tmpItem.alarmItem.itemType = pAlarm->itemType;
|
|
|
|
uv_rwlock_rdlock(&g_uvListRwLock);
|
|
if(pAlarm->itemType == ASSISTANT_TYPE_CLOCK)
|
|
{
|
|
DL_SEARCH(g_pAlarmArray, pItem, &tmpItem, __alarmItemCmp);
|
|
}
|
|
else if(pAlarm->itemType == ASSISTANT_TYPE_REMAIND)
|
|
{
|
|
DL_SEARCH(g_pRemaindArray, pItem, &tmpItem, __alarmItemCmp);
|
|
}
|
|
else if(pAlarm->itemType == ASSISTANT_TYPE_SESSION)
|
|
{
|
|
DL_SEARCH(g_pSessionArray, pItem, &tmpItem, __alarmItemCmp);
|
|
}
|
|
else
|
|
{
|
|
LOG_EX(LOG_Error, "Unknown type: %d\n", pAlarm->itemType);
|
|
}
|
|
uv_rwlock_rdunlock(&g_uvListRwLock);
|
|
|
|
if(pItem)
|
|
{
|
|
pItem->alarmItem.year += 1900;
|
|
pItem->alarmItem.month += 1;
|
|
|
|
__assistantRunningEvent(&pItem->alarmItem);
|
|
|
|
if((pItem->alarmItem.repeatMode & 0xFF) == REPEAT_MODE_NONE)
|
|
{
|
|
uv_rwlock_wrlock(&g_uvListRwLock);
|
|
if(pAlarm->itemType == ASSISTANT_TYPE_CLOCK)
|
|
{
|
|
DL_DELETE(g_pAlarmArray, pItem);
|
|
}
|
|
else if(pAlarm->itemType == ASSISTANT_TYPE_REMAIND)
|
|
{
|
|
DL_DELETE(g_pRemaindArray, pItem);
|
|
}
|
|
else if(pAlarm->itemType == ASSISTANT_TYPE_SESSION)
|
|
{
|
|
DL_DELETE(g_pSessionArray, pItem);
|
|
}
|
|
else
|
|
{
|
|
LOG_EX(LOG_Error, "Unknown type: %d\n", pAlarm->itemType);
|
|
}
|
|
uv_rwlock_wrunlock(&g_uvListRwLock);
|
|
|
|
free(pItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
static PDBUS_MSG_PACK __dBusOnMessage(uv_loop_t *pLoop, DBusConnection *pConn, PDBUS_MSG_PACK pMsg)
|
|
{
|
|
PASSISTANT_SYNC_INFO pInfo = NULL;
|
|
PASSISTANT_NOTIFY_INFO pNotifyInfo = NULL;
|
|
int err = 0;
|
|
|
|
if(!pMsg || !pLoop || !pConn)
|
|
{
|
|
return (NULL);
|
|
}
|
|
|
|
if(pMsg->msgDests == 0xFFFFFFFF)
|
|
{
|
|
return (NULL);
|
|
}
|
|
|
|
LOG_EX(LOG_Debug, "JSON(%08X) %s: %s\n", pMsg->busCmd, DBusCmdToString(pMsg->busCmd), (const char *)pMsg->pMsg);
|
|
|
|
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)
|
|
{
|
|
__printAssistantSyncInfo(DBusCmdToString(pMsg->busCmd), pInfo);
|
|
|
|
__cleanupSessionArray();
|
|
|
|
if(pInfo->pAlarmInfo && pInfo->nItems > 0)
|
|
{
|
|
err = __addNewItems(pInfo);
|
|
}
|
|
|
|
__assistantRspStatus(pMsg->busCmd, err);
|
|
|
|
free(pInfo->pAlarmInfo);
|
|
free(pInfo);
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
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)
|
|
{
|
|
g_syncFlags |= 1 << ASSISTANT_TYPE_CLOCK;
|
|
|
|
__printAssistantSyncInfo(DBusCmdToString(pMsg->busCmd), pInfo);
|
|
|
|
__cleanupAlarmArray();
|
|
|
|
if(pInfo->pAlarmInfo && pInfo->nItems > 0)
|
|
{
|
|
err = __addNewItems(pInfo);
|
|
}
|
|
|
|
__assistantRspStatus(pMsg->busCmd, err);
|
|
|
|
free(pInfo->pAlarmInfo);
|
|
free(pInfo);
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
|
|
break;
|
|
|
|
case CMD_ALARM_ADD:
|
|
pInfo = (PASSISTANT_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ASSISTANT_SYNC_RSP, TRUE, &err);
|
|
|
|
if(pInfo)
|
|
{
|
|
__printAssistantSyncInfo(DBusCmdToString(pMsg->busCmd), pInfo);
|
|
|
|
if(pInfo->pAlarmInfo && pInfo->nItems > 0)
|
|
{
|
|
err = __addNewItems(pInfo);
|
|
__assistantRspStatus(pMsg->busCmd, err);
|
|
|
|
if(err == 0)
|
|
{
|
|
__assistantNotifyChange(pMsg->busCmd, pInfo->nItems, ASSISTANT_TYPE_CLOCK, pInfo->pAlarmInfo);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
|
|
free(pInfo->pAlarmInfo);
|
|
free(pInfo);
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
break;
|
|
|
|
case CMD_ALARM_REMOVE:
|
|
pNotifyInfo = (PASSISTANT_NOTIFY_INFO)Json2Struct((const char *)pMsg->pMsg,
|
|
JSON_ENGINE_ASSISTANT_NOTIFY, FALSE, &err);
|
|
|
|
if(pNotifyInfo)
|
|
{
|
|
__printAssistantNofifyInfo(DBusCmdToString(pMsg->busCmd), pNotifyInfo);
|
|
|
|
if(pNotifyInfo->nItems > 0)
|
|
{
|
|
__removeAlarmItem(pNotifyInfo);
|
|
__assistantRspStatus(pMsg->busCmd, 0);
|
|
__assistantArrayNotifyChange(pMsg->busCmd, pNotifyInfo->nItems, ASSISTANT_TYPE_CLOCK, pNotifyInfo->ids);
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
|
|
free(pNotifyInfo);
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
|
|
break;
|
|
|
|
case CMD_ALARM_REMOVEALL:
|
|
__cleanupAlarmArray();
|
|
__assistantRspStatus(pMsg->busCmd, 0);
|
|
__assistantNotifyChange(pMsg->busCmd, 0, ASSISTANT_TYPE_CLOCK, NULL);
|
|
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)
|
|
{
|
|
g_syncFlags |= 1 << ASSISTANT_TYPE_REMAIND;
|
|
|
|
__printAssistantSyncInfo(DBusCmdToString(pMsg->busCmd), pInfo);
|
|
|
|
__cleanupRemaindArray();
|
|
|
|
if(pInfo->pAlarmInfo && pInfo->nItems > 0)
|
|
{
|
|
err = __addNewItems(pInfo);
|
|
}
|
|
|
|
__assistantRspStatus(pMsg->busCmd, err);
|
|
|
|
free(pInfo->pAlarmInfo);
|
|
free(pInfo);
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
break;
|
|
|
|
case CMD_REMAIND_ADD:
|
|
pInfo = (PASSISTANT_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ASSISTANT_SYNC_RSP, TRUE, &err);
|
|
|
|
if(pInfo)
|
|
{
|
|
__printAssistantSyncInfo(DBusCmdToString(pMsg->busCmd), pInfo);
|
|
|
|
if(pInfo->pAlarmInfo && pInfo->nItems > 0)
|
|
{
|
|
err = __addNewItems(pInfo);
|
|
__assistantRspStatus(pMsg->busCmd, err);
|
|
|
|
if(err == 0)
|
|
{
|
|
__assistantNotifyChange(pMsg->busCmd, pInfo->nItems, ASSISTANT_TYPE_REMAIND, pInfo->pAlarmInfo);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
|
|
free(pInfo->pAlarmInfo);
|
|
free(pInfo);
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
break;
|
|
|
|
case CMD_REMAIND_REMOVE:
|
|
pNotifyInfo = (PASSISTANT_NOTIFY_INFO)Json2Struct((const char *)pMsg->pMsg,
|
|
JSON_ENGINE_ASSISTANT_NOTIFY, FALSE, &err);
|
|
|
|
if(pNotifyInfo)
|
|
{
|
|
__printAssistantNofifyInfo(DBusCmdToString(pMsg->busCmd), pNotifyInfo);
|
|
|
|
if(pNotifyInfo->nItems > 0)
|
|
{
|
|
__removeRemaindItem(pNotifyInfo);
|
|
__assistantRspStatus(pMsg->busCmd, 0);
|
|
__assistantArrayNotifyChange(pMsg->busCmd, pNotifyInfo->nItems, ASSISTANT_TYPE_REMAIND, pNotifyInfo->ids);
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
|
|
free(pNotifyInfo);
|
|
}
|
|
else
|
|
{
|
|
__assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS);
|
|
}
|
|
break;
|
|
|
|
case CMD_REMAIND_REMOVEALL:
|
|
__cleanupRemaindArray();
|
|
__assistantRspStatus(pMsg->busCmd, 0);
|
|
__assistantNotifyChange(pMsg->busCmd, 0, ASSISTANT_TYPE_REMAIND, NULL);
|
|
break;
|
|
}
|
|
|
|
return (NULL);
|
|
}
|
|
|
|
static void __dBusDeameonCb(MODULE_NAME modName, int status)
|
|
{
|
|
if(status)
|
|
{
|
|
LOG_EX(LOG_Error, "Daemon(%d) Msg: [%s]\n", modName, status == 0 ? "Connect" : "Disconnect");
|
|
}
|
|
else
|
|
{
|
|
LOG_EX(LOG_Info, "Daemon(%d) Msg: [%s]\n", modName, status == 0 ? "Connect" : "Disconnect");
|
|
}
|
|
|
|
#if 0
|
|
if(modName == MODULE_CONTROLLER && status == 0)
|
|
{
|
|
int 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);
|
|
|
|
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);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
static void __assistantSyncThread(void *pParam)
|
|
{
|
|
int ret, i = 0, isSynced = -1;
|
|
struct tm* pTmNextYear;
|
|
|
|
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,
|
|
g_pModInfoTable[MODULE_CONTROLLER].modAliase,
|
|
CMD_ALARM_SYNC_REQ, "");
|
|
|
|
LOG_EX(LOG_Debug, "Send CMD_ALARM_SYNC_REQ Command: %d\n", ret);
|
|
}
|
|
|
|
if((g_syncFlags & (1 << ASSISTANT_TYPE_REMAIND)) == 0)
|
|
{
|
|
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);
|
|
//while(g_syncFlags != ((1 << ASSISTANT_TYPE_CLOCK) | (1 << ASSISTANT_TYPE_REMAIND)));
|
|
|
|
|
|
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);
|
|
|
|
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);
|
|
#endif
|
|
|
|
pthread_detach(pthread_self());
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int ret = 0;
|
|
DBusConnection* pBus;
|
|
uv_loop_t* pLoop = GetDBusDefaultLoop();
|
|
uv_thread_t uvSyncThread;
|
|
|
|
pBus = DBusWithLibuvInit(pLoop, g_pModInfoTable[MODULE_ALARM].modAliase,
|
|
__dBusOnMessage,
|
|
__dBusDeameonCb,
|
|
NULL, &ret);
|
|
|
|
if(pBus == NULL)
|
|
{
|
|
fprintf(stderr, "DBusWithLibuvInit Error: %d\n", ret);
|
|
return 0;
|
|
}
|
|
|
|
uv_rwlock_init(&g_uvListRwLock);
|
|
|
|
AlarmTimerInit(pLoop);
|
|
|
|
uv_thread_create(&uvSyncThread, __assistantSyncThread, NULL);
|
|
RunUVLoop(pLoop);
|
|
|
|
while(TRUE)
|
|
{
|
|
usleep(1000);
|
|
}
|
|
|
|
return 0;
|
|
}
|