Commit 3daecc29 authored by 陈伟灿's avatar 陈伟灿

Merge branch 'cwc' into 'master'

【修改内容】增加场景嵌套功能

See merge request chenweican/k-sdk!66
parents 32ba1614 90820df2
#include <stdio.h>
#include "kk_tsl_api.h"
#include "sqlite3.h"
#include "kk_log.h"
#include "kk_scene_handle.h"
extern sqlite3 *g_kk_pDb;
int kk_scene_db_init(void)
{
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *pcErr;
//eUtils_LockLock(&sLock);
_kk_scene_lock();
ctx->pDb = g_kk_pDb;
INFO_PRINT("scene db Database opened\n");
const char *pSceneTable = "CREATE TABLE IF NOT EXISTS SceneInfo( \
name varchar(255), \
sceneType INTEGER, \
enable INTEGER, \
sceneId varchar(255) UNIQUE)";
if (sqlite3_exec(ctx->pDb, pSceneTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
const char *pSceneTriggerTable = "CREATE TABLE IF NOT EXISTS SceneTriggerInfo( \
type varchar(255), \
deviceCode varchar(255), \
epNum INTEGER, \
propertyName varchar(255), \
compareType varchar(255), \
compareValue varchar(255), \
sceneId varchar(255))";
if (sqlite3_exec(ctx->pDb, pSceneTriggerTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
const char *pSceneConditionTable = "CREATE TABLE IF NOT EXISTS SceneConditionInfo( \
type varchar(255), \
startTime INTEGER, \
endTime INTEGER, \
crossDay INTEGER, \
repeat_days INTEGER, \
sceneId varchar(255))";
if (sqlite3_exec(ctx->pDb, pSceneConditionTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
const char *pSceneActionTable = "CREATE TABLE IF NOT EXISTS SceneActionInfo( \
type varchar(255), \
deviceCode varchar(255), \
epNum INTEGER, \
propertyName varchar(255), \
propertyValue varchar(255), \
delay INTEGER, \
sceneId varchar(255),\
gwdeviceCode varchar(255))";
if (sqlite3_exec(ctx->pDb, pSceneActionTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
const char *pSceneTimerTable = "CREATE TABLE IF NOT EXISTS SceneTimerInfo( \
week INTEGER, \
time INTEGER, \
sceneId varchar(255))";
if (sqlite3_exec(ctx->pDb, pSceneTimerTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
/*内嵌场景关联表*/
const char *pSceneEmbedTable = "CREATE TABLE IF NOT EXISTS SceneEmbedInfo( \
delay INTEGER, \
executeSceneId varchar(255), \
sceneId varchar(255))";
if (sqlite3_exec(ctx->pDb, pSceneTimerTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_update_scene_enable(int enable,const char *sceneId)
{
char *sqlCmd = NULL;
int len =0;
int rc = 0;
char *zErrMsg = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
//_kk_subDb_lock();
sqlCmd = sqlite3_mprintf("UPDATE SceneInfo SET enable=%d WHERE sceneId= '%s'",enable,sceneId);
INFO_PRINT("kk_scene_update_scene_enable,sqlCmd:%s\n",sqlCmd);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
//INFO_PRINT("Table updata data successfully\n");
}
sqlite3_free(sqlCmd);
//_kk_subDb_unlock();
return SUCCESS_RETURN;
}
int kk_scene_insert_scene_info(const char* name,const char* sceneType,const char* enable,const char* sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneInfo (name, sceneType,enable,sceneId) \
values ('%s','%d','%d','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,name,sceneType,enable,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
#if 0
static int kk_scene_check_trigger_exist(const char* type,const char* deviceCode,const char* epNum,const char* propertyName,
const char* compareType,const char* compareValue,const char* sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
sqlite3_stmt *stmt;
const char *selectCmd = "select * from SceneTriggerInfo WHERE deviceCode = '%s' and propertyName = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(selectCmd,,deviceCode,propertyName);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
*sceneType = sqlite3_column_int(stmt, DB_SCENEINFO_SCENETYPE);
*enable = sqlite3_column_int(stmt, DB_SCENEINFO_ENABLE);
res = SUCCESS_RETURN;
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
#endif
int kk_scene_insert_scene_trigger(const char* type,const char* deviceCode,const char* epNum,const char* propertyName,
const char* compareType,const char* compareValue,const char* sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneTriggerInfo (type, deviceCode,epNum,propertyName,compareType,compareValue,sceneId) \
values ('%s','%s','%d','%s','%s','%s','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,type,deviceCode,epNum,propertyName,compareType,compareValue,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_insert_scene_condition(const char* type,int startTime,int endTime,int crossDay,
char repeat_days,const char* sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneConditionInfo (type, startTime,endTime,crossDay,repeat_days,sceneId) \
values ('%s','%d','%d','%d','%d','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,type,startTime,endTime,crossDay,repeat_days,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_insert_scene_timer(time_t startTime,char weekflag,const char* sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneTimerInfo (week,time,sceneId) \
values ('%d','%d','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,weekflag,startTime,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_insert_scene_embed(int delay,const char* executeSceneId,const char* sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneEmbedInfo (delay,executeSceneId,sceneId) \
values ('%d','%s','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,delay,executeSceneId,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_insert_scene_action(const char* type,const char* deviceCode,int epNum,const char* propertyName,
const char* propertyValue,int delay,const char* sceneId,const char *gwdeviceCode)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneActionInfo (type, deviceCode,epNum,propertyName,propertyValue,delay,sceneId,gwdeviceCode) \
values ('%s','%s','%d','%s','%s','%d','%s','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,type,deviceCode,epNum,propertyName,propertyValue,delay,sceneId,gwdeviceCode);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_delete_scene_info(const char *sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *deleteCmd = "delete from SceneInfo where sceneId = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_delete_scene_trigger(const char *sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *deleteCmd = "delete from SceneTriggerInfo where sceneId = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_delete_scene_condition(const char *sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *deleteCmd = "delete from SceneConditionInfo where sceneId = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_delete_scene_timing(const char *sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *deleteCmd = "delete from SceneTimerInfo where sceneId = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_delete_scene_embed(const char *sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *deleteCmd = "delete from SceneEmbedInfo where sceneId = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_delete_scene_action(const char *sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
sqlite3_stmt *stmt;
kk_scene_delete_send_to_gw(sceneId);
const char *deleteCmd = "delete from SceneActionInfo where sceneId = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
#ifndef __KK_SCENE_DB_H__
#define __KK_SCENE_DB_H__
typedef enum{
DB_SCENETYPE_SCENE = 0,
DB_SCENETYPE_IFTT,
DB_SCENETYPE_TIMING,
DB_SCENETYPE_MUTICONTROL,
};
typedef enum{
DB_SCENEINFO_NAME = 0,
DB_SCENEINFO_SCENETYPE,
DB_SCENEINFO_ENABLE,
DB_SCENEINFO_SCENEID,
};
typedef enum{
DB_SCENETRIGGER_TYPE = 0,
DB_SCENETRIGGER_DEVICECODE,
DB_SCENETRIGGER_EPNUM,
DB_SCENETRIGGER_PROPERTYNAME,
DB_SCENETRIGGER_COMPARETYPE,
DB_SCENETRIGGER_COMPAREVALUE,
DB_SCENETRIGGER_SCENEID,
//DB_SCENETRIGGER_TRIGGERFLAG,
};
typedef enum{
DB_SCENECONDITION_TYPE = 0,
DB_SCENECONDITION_STARTTIME,
DB_SCENECONDITION_ENDTIME,
DB_SCENECONDITION_CROSSDAY,
DB_SCENECONDITION_REPEATDAY,
DB_SCENECONDITION_SCENEID,
};
typedef enum{
DB_SCENEACTION_TYPE = 0,
DB_SCENEACTION_DEVICECODE,
DB_SCENEACTION_EPNUM,
DB_SCENEACTION_PROPERTYNAME,
DB_SCENEACTION_PROPERTYVALUE,
DB_SCENEACTION_DELAY,
DB_SCENEACTION_SCENEID,
DB_SCENEACTION_GWDEVICECODE,
};
typedef enum{
DB_SCENETIMER_WEEK = 0,
DB_SCENETIMER_TIME,
DB_SCENETIMER_SCENEID,
};
typedef enum{
DB_SCENEEMBED_WEEK = 0,
DB_SCENEEMBED_EXECUTESCENEID,
DB_SCENEMBED_SCENEID,
};
#endif
/******************************************************************************/
/* */
/* 文件名: 版本 */
/* */
/* kk_scene_handle.c V1.0 */
/* */
/* 功能描述: */
/* 该文件包含了和场景设置服务相关的代码 */
/* */
/* 更改记录: */
/* */
/* 日期 作者 摘要 */
/* */
/* */
/* */
/******************************************************************************/
#include <stdio.h>
#include "kk_tsl_api.h"
#include "kk_dm_mng.h"
#include "sqlite3.h"
#include "kk_log.h"
#include "kk_scene_handle.h"
#include "kk_scene_db.h"
#include "cJSON.h"
#include <time.h>
extern int g_timezone;
extern sqlite3 *g_kk_pDb;
static void kk_scene_send_action_msg(kk_scene_action_info_t *pInfo);
static int kk_scene_update_starttime(kk_scene_timer_list_t *pInfo,int starttime,int current);
static time_t kk_scene_creat_timer_starttime(int week,int starttime,time_t current);
static int kk_scene_parse_repeatday(cJSON *repeatday);
typedef struct {
void *mutex;
sqlite3 *pDb;
void *s_scene_thread;
} kk_scene_ctx_t;
typedef enum{
DB_SCENETYPE_SCENE = 0,
DB_SCENETYPE_IFTT,
DB_SCENETYPE_TIMING,
};
typedef enum{
DB_SCENEINFO_NAME = 0,
DB_SCENEINFO_SCENETYPE,
DB_SCENEINFO_ENABLE,
DB_SCENEINFO_SCENEID,
};
typedef enum{
DB_SCENETRIGGER_TYPE = 0,
DB_SCENETRIGGER_DEVICECODE,
DB_SCENETRIGGER_EPNUM,
DB_SCENETRIGGER_PROPERTYNAME,
DB_SCENETRIGGER_COMPARETYPE,
DB_SCENETRIGGER_COMPAREVALUE,
DB_SCENETRIGGER_SCENEID,
};
typedef enum{
DB_SCENECONDITION_TYPE = 0,
DB_SCENECONDITION_STARTTIME,
DB_SCENECONDITION_ENDTIME,
DB_SCENECONDITION_CROSSDAY,
DB_SCENECONDITION_REPEATDAY,
DB_SCENECONDITION_SCENEID,
};
typedef enum{
DB_SCENEACTION_TYPE = 0,
DB_SCENEACTION_DEVICECODE,
DB_SCENEACTION_EPNUM,
DB_SCENEACTION_PROPERTYNAME,
DB_SCENEACTION_PROPERTYVALUE,
DB_SCENEACTION_DELAY,
DB_SCENEACTION_SCENEID,
DB_SCENEACTION_GWDEVICECODE,
};
typedef enum{
DB_SCENETIMER_WEEK = 0,
DB_SCENETIMER_TIME,
DB_SCENETIMER_SCENEID,
};
static kk_scene_action_delay_t *p_delay_action_list = NULL;
static kk_scene_embed_delay_t *p_delay_embed_list = NULL;
static kk_scene_timer_list_t *p_scene_timer_list = NULL;
extern uint64_t s_start_time;
static kk_scene_action_t *p_kk_scene_action = NULL;
static kk_scene_ctx_t s_kk_scene_ctx = {NULL};
static int kk_scene_check_value_ex(const char * compareType,const char * compareValue1,const char * compareValue2)
{
int res = FAIL_RETURN;
......@@ -92,8 +51,9 @@ static int kk_scene_check_value_ex(const char * compareType,const char * compare
ERROR_PRINT("[%d]kk_scene_check_value fail!!!\n",__LINE__);
return INVALID_PARAMETER;
}
printf("[%s][%d]compareValue1:%s,compareValue2:%s\n",__FUNCTION__,__LINE__,compareValue1,compareValue2);
if(!strcmp(compareType,"=") && !strcmp(compareValue1,compareValue2)){
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
res = 0;
}
else if(!strcmp(compareType,">") && strcmp(compareValue1,compareValue2) > 0){
......@@ -114,11 +74,11 @@ static int kk_scene_check_value_ex(const char * compareType,const char * compare
}
static kk_scene_ctx_t *_kk_scene_get_ctx(void)
kk_scene_ctx_t *_kk_scene_get_ctx(void)
{
return &s_kk_scene_ctx;
}
static void _kk_scene_lock(void)
void _kk_scene_lock(void)
{
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
if (ctx->mutex) {
......@@ -126,7 +86,7 @@ static void _kk_scene_lock(void)
}
}
static void _kk_scene_unlock(void)
void _kk_scene_unlock(void)
{
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
......@@ -135,107 +95,8 @@ static void _kk_scene_unlock(void)
}
}
static int _kk_scene_db_init(void)
{
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *pcErr;
//eUtils_LockLock(&sLock);
_kk_scene_lock();
ctx->pDb = g_kk_pDb;
INFO_PRINT("scene db Database opened\n");
const char *pSceneTable = "CREATE TABLE IF NOT EXISTS SceneInfo( \
name varchar(255), \
sceneType INTEGER, \
enable INTEGER, \
sceneId varchar(255) UNIQUE)";
if (sqlite3_exec(ctx->pDb, pSceneTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
const char *pSceneTriggerTable = "CREATE TABLE IF NOT EXISTS SceneTriggerInfo( \
type varchar(255), \
deviceCode varchar(255), \
epNum INTEGER, \
propertyName varchar(255), \
compareType varchar(255), \
compareValue varchar(255), \
sceneId varchar(255))";
if (sqlite3_exec(ctx->pDb, pSceneTriggerTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
const char *pSceneConditionTable = "CREATE TABLE IF NOT EXISTS SceneConditionInfo( \
type varchar(255), \
startTime INTEGER, \
endTime INTEGER, \
crossDay INTEGER, \
repeat_days INTEGER, \
sceneId varchar(255))";
if (sqlite3_exec(ctx->pDb, pSceneConditionTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
const char *pSceneActionTable = "CREATE TABLE IF NOT EXISTS SceneActionInfo( \
type varchar(255), \
deviceCode varchar(255), \
epNum INTEGER, \
propertyName varchar(255), \
propertyValue varchar(255), \
delay INTEGER, \
sceneId varchar(255),\
gwdeviceCode varchar(255))";
if (sqlite3_exec(ctx->pDb, pSceneActionTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
const char *pSceneTimerTable = "CREATE TABLE IF NOT EXISTS SceneTimerInfo( \
week INTEGER, \
time INTEGER, \
sceneId varchar(255))";
if (sqlite3_exec(ctx->pDb, pSceneTimerTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_scene_unlock();
return FAIL_RETURN;
}
_kk_scene_unlock();
return SUCCESS_RETURN;
}
#define KK_DEVICE_TSL_TYPE (0x08)
static kk_tsl_t *s_scene_shadow = NULL;
static int kk_scene_tsl_load(void)
......@@ -243,21 +104,26 @@ static int kk_scene_tsl_load(void)
int res = 0;
char *tsl_str = NULL;
int heartTime = 0;
char isDormancyDev = 0;
tsl_str = kk_load_json("15", KK_DEVICE_TSL_TYPE);
if(tsl_str != NULL)
{
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
res = kk_tsl_create(tsl_str,strlen(tsl_str),&s_scene_shadow,&heartTime);
res = kk_tsl_create(tsl_str,strlen(tsl_str),&s_scene_shadow,&heartTime,&isDormancyDev);
free(tsl_str);
if(res != 0){
return FAIL_RETURN;
}
}
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
return SUCCESS_RETURN;
}
static int kk_scene_check_able(char *sceneId)
/******************************************************************************/
/* 函 数 名: kk_scene_timer_check_able */
/* 描 述: check定时场景是否有效 */
/* 输入参数: mina_recmsg: 接收到的命令 */
/* 返 回 值: 返回'0'表示成功,其它返回值表示出错号 */
/******************************************************************************/
static int kk_scene_timer_check_able(char *sceneId)
{
int res = 0;
int sceneType = 0;
......@@ -276,18 +142,19 @@ static int kk_scene_timer_load(void)
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
sqlite3_stmt *stmt;
char *sceneId = NULL;
char *sqlCmd = "select * from SceneTimerInfo WHERE type = 'timeRange'";
char *sqlCmd = "select * from SceneTimerInfo;";
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
sceneId = sqlite3_column_text(stmt, DB_SCENETIMER_SCENEID);
if(kk_scene_check_able(sceneId) == SUCCESS_RETURN){
if(kk_scene_timer_check_able(sceneId) == SUCCESS_RETURN){
int starttime = sqlite3_column_int(stmt, DB_SCENETIMER_TIME);
int repeatday = sqlite3_column_int(stmt, DB_SCENETIMER_WEEK);
kk_scene_push_timer_info(starttime,repeatday,sceneId);
}
}
sqlite3_finalize(stmt);
return SUCCESS_RETURN;
}
......@@ -295,27 +162,27 @@ kk_tsl_t * kk_scene_shadow(void)
{
return s_scene_shadow;
}
static kk_scene_action_delay_t *p_delay_action_list = NULL;
static kk_scene_timer_list_t *p_scene_timer_list = NULL;
extern uint64_t s_start_time;
void *kk_scene_yield(void *args)
{
time_t current_time = 0;
kk_scene_action_delay_t *actionDelayInfo = NULL;
kk_scene_action_delay_t *pTemp = NULL;
kk_scene_embed_delay_t *embedDelayInfo = NULL;
kk_scene_embed_delay_t *pTempEmbed = NULL;
kk_scene_timer_list_t *scene_timer_list = NULL;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
while (1) {
current_time = HAL_GetTime();
/****系统起来15s后开始定时处理****/
if((HAL_UptimeMs() - s_start_time) <= 15000){
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
sleep(1);
continue;
}
_kk_scene_lock();
/*处理action delay*/
actionDelayInfo = p_delay_action_list;
while(actionDelayInfo){
INFO_PRINT("[%s][%d] current_time:%d\n",__FUNCTION__,__LINE__,current_time);
......@@ -341,13 +208,42 @@ void *kk_scene_yield(void *args)
}
}
_kk_scene_unlock();
sleep(1);
_kk_scene_lock();
/*处理场景嵌套delay*/
embedDelayInfo = p_delay_embed_list;
while(embedDelayInfo){
INFO_PRINT("[%s][%d] current_time:%d\n",__FUNCTION__,__LINE__,current_time);
INFO_PRINT("[%s][%d] embedDelayInfo->starttime:%d\n",__FUNCTION__,__LINE__,embedDelayInfo->starttime);
if(current_time >= embedDelayInfo->starttime){
kk_scene_execute_action(embedDelayInfo->executeSceneId);
if(embedDelayInfo == p_delay_embed_list){
pTempEmbed = p_delay_embed_list;
p_delay_embed_list = p_delay_embed_list->next;
free(pTempEmbed);
embedDelayInfo = p_delay_embed_list;
}
else{
pTempEmbed->next = embedDelayInfo->next;
free(embedDelayInfo);
embedDelayInfo = pTempEmbed->next;
}
}
else{
pTempEmbed= embedDelayInfo;
embedDelayInfo = embedDelayInfo->next;
}
}
_kk_scene_unlock();
sleep(1);
/*******定时模式**********/
_kk_scene_lock();
scene_timer_list = p_scene_timer_list;
while(scene_timer_list){
//INFO_PRINT("scene_timer_list->starttime:%d\n",scene_timer_list->starttime);
//INFO_PRINT("current_time %d\n",current_time);
INFO_PRINT("scene_timer_list->starttime:%d\n",scene_timer_list->starttime);
INFO_PRINT("current_time %d\n",current_time);
if(scene_timer_list->starttime != 0 && current_time >= scene_timer_list->starttime){
kk_scene_execute_action(scene_timer_list->sceneId);
kk_scene_update_starttime(scene_timer_list,scene_timer_list->starttime,current_time);
......@@ -372,7 +268,7 @@ int kk_scene_init(void)
return FAIL_RETURN;
}
_kk_scene_db_init();
kk_scene_db_init();
res = kk_scene_tsl_load();
if(res != SUCCESS_RETURN){
......@@ -380,7 +276,6 @@ int kk_scene_init(void)
}
kk_scene_timer_load();
res = pthread_create(&ctx->s_scene_thread, NULL, kk_scene_yield, NULL);
if (res < 0) {
ERROR_PRINT("HAL_ThreadCreate mid Failed\n");
......@@ -391,140 +286,6 @@ int kk_scene_init(void)
return SUCCESS_RETURN;
}
int kk_scene_update_scene_enable(int enable,const char *sceneId)
{
char *sqlCmd = NULL;
int len =0;
int rc = 0;
char *zErrMsg = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
//_kk_subDb_lock();
sqlCmd = sqlite3_mprintf("UPDATE SceneInfo SET enable=%d WHERE sceneId= '%s'",enable,sceneId);
INFO_PRINT("kk_scene_update_scene_enable,sqlCmd:%s\n",sqlCmd);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
//INFO_PRINT("Table updata data successfully\n");
}
sqlite3_free(sqlCmd);
//_kk_subDb_unlock();
return SUCCESS_RETURN;
}
static int kk_scene_insert_scene_info(const char* name,const char* sceneType,const char* enable,const char* sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneInfo (name, sceneType,enable,sceneId) \
values ('%s','%d','%d','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,name,sceneType,enable,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
static int kk_scene_insert_scene_trigger(const char* type,const char* deviceCode,const char* epNum,const char* propertyName,
const char* compareType,const char* compareValue,const char* sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneTriggerInfo (type, deviceCode,epNum,propertyName,compareType,compareValue,sceneId) \
values ('%s','%s','%d','%s','%s','%s','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,type,deviceCode,epNum,propertyName,compareType,compareValue,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
static int kk_scene_insert_scene_condition(const char* type,int startTime,int endTime,int crossDay,
char repeat_days,const char* sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneConditionInfo (type, startTime,endTime,crossDay,repeat_days,sceneId) \
values ('%s','%d','%d','%d','%d','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,type,startTime,endTime,crossDay,repeat_days,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
static int kk_scene_insert_scene_timer(char weekflag,int startTime,const char* sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneTimerInfo (week,time,sceneId) \
values ('%d','%d','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,weekflag,startTime,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
static int kk_scene_action_info_add(kk_scene_action_info_ex_t **head,kk_scene_action_detail_t detail)
{
int len;
......@@ -617,6 +378,46 @@ int kk_scene_action_add(const char *gwdeviceCode,const char *sceneId,kk_scene_ac
return SUCCESS_RETURN;
}
int kk_scene_delete_send_to_gw(const char *sceneId)
{
char gwdevice[][DEVICE_CODE_MAXLEN] = {0};
sqlite3_stmt *stmt;
char *sqlCmd = NULL;
char *zErrMsg = 0;
char *gwdeviceCode = NULL;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
int idx=0,num = 0;
int res = 0;
sqlCmd = sqlite3_mprintf("select * from SceneActionInfo WHERE sceneId = '%s'",sceneId);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
next:
while(sqlite3_step(stmt) == SQLITE_ROW){
gwdeviceCode = sqlite3_column_text(stmt,DB_SCENEACTION_GWDEVICECODE);
if(kk_subDev_check_scene_support(gwdeviceCode) == 1){
for(idx = 0; idx < num;idx++){
/*此网关已经发送过*/
if(!strcmp(gwdevice[idx],gwdeviceCode)){
INFO_PRINT("kk_scene_delete_send_to_gw repeat,ignore!!!\n");
goto next;
}
}
memcpy(gwdevice[num],gwdeviceCode,strlen(gwdeviceCode));
num++;
cJSON *root=cJSON_CreateObject();
cJSON_AddStringToObject(root,MSG_SCENE_SCENEID,sceneId);
char *out=cJSON_Print(root);
res = kk_msg_execute_scene_delete(out,gwdeviceCode);
cJSON_Delete(root);
free(out);
}
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
return res;
}
int kk_scene_action_info_send(int isUpdate)
{
......@@ -654,154 +455,22 @@ int kk_scene_action_add(const char *gwdeviceCode,const char *sceneId,kk_scene_ac
return SUCCESS_RETURN;
}
int kk_scene_insert_scene_action(const char* type,const char* deviceCode,int epNum,const char* propertyName,
const char* propertyValue,int delay,const char* sceneId,const char *gwdeviceCode)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *insertCmd = "insert into SceneActionInfo (type, deviceCode,epNum,propertyName,propertyValue,delay,sceneId,gwdeviceCode) \
values ('%s','%s','%d','%s','%s','%d','%s','%s');";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(insertCmd,type,deviceCode,epNum,propertyName,propertyValue,delay,sceneId,gwdeviceCode);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_delete_scene_info(const char *sceneId)
int kk_scene_muticontrol_info_send(cJSON* action,const char *gwdeviceCode,const char *sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *deleteCmd = "delete from SceneInfo where sceneId = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_delete_scene_trigger(const char *sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *deleteCmd = "delete from SceneTriggerInfo where sceneId = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_delete_scene_condition(const char *sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
const char *deleteCmd = "delete from SceneConditionInfo where sceneId = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
int kk_scene_delete_scene_action(const char *sceneId)
{
int res = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
char *gwdeviceCode = NULL;
char gwdevice[][DEVICE_CODE_MAXLEN] = {0};
int idx=0,num = 0;
sqlite3_stmt *stmt;
sqlCmd = sqlite3_mprintf("select * from SceneActionInfo WHERE sceneId = '%s'",sceneId);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
next:
while(sqlite3_step(stmt) == SQLITE_ROW){
gwdeviceCode = sqlite3_column_text(stmt,DB_SCENEACTION_GWDEVICECODE);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
if(kk_subDev_check_scene_support(gwdeviceCode) == 1){
for(idx = 0; idx < num;idx++){
if(!strcmp(gwdevice[idx],gwdeviceCode)){
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
goto next;
}
if(action == NULL || gwdeviceCode == NULL || sceneId == NULL){
return INVALID_PARAMETER;
}
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
memcpy(gwdevice[num],gwdeviceCode,strlen(gwdeviceCode));
num++;
cJSON *root=cJSON_CreateObject();
cJSON_AddStringToObject(root,MSG_SCENE_SCENEID,sceneId);
cJSON_AddStringToObject(root,MSG_SCENE_ACTIONS,action->valuestring);
char *out=cJSON_Print(root);
res = kk_msg_execute_scene_delete(out,gwdeviceCode);
printf("kk_scene_muticontrol_info_send:%s\n",out);
kk_msg_execute_scene_set(out,gwdeviceCode);
cJSON_Delete(root);
free(out);
}
}
sqlite3_finalize(stmt);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
const char *deleteCmd = "delete from SceneActionInfo where sceneId = '%s';";
_kk_scene_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,sceneId);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_scene_unlock();
return SUCCESS_RETURN;
}
static int kk_scene_parse_trigger_detail(const char *type,const cJSON *item,const char *sceneId)
{
int res = FAIL_RETURN;
......@@ -982,7 +651,7 @@ int kk_scene_parse_scene_condition(const cJSON* str,const char *sceneId)
return res;
}
}
else if(!strcmp("trigger/thing/property",type->valuestring)){
else if(!strcmp("condition/property",type->valuestring)){
kk_scene_parse_trigger_detail(type->valuestring,item,sceneId);
}
else{
......@@ -997,6 +666,7 @@ int kk_scene_parse_scene_condition(const cJSON* str,const char *sceneId)
int kk_scene_parse_scene_action(const cJSON* str,const char *sceneId,int isUpdate)
{
int res = 0;
int propertySetType = 0;
dm_mgr_dev_node_t *node = NULL;
if(str == NULL || sceneId == NULL){
ERROR_PRINT("kk_scene_parse_scene_action failed\n");
......@@ -1009,13 +679,24 @@ int kk_scene_parse_scene_action(const cJSON* str,const char *sceneId,int isUpdat
while(item != NULL){
cJSON *type = cJSON_GetObjectItem(item,MSG_SCENE_TYPE);
if(type == NULL) return FAIL_RETURN;
/*内嵌场景设置*/
if(type->valuestring == "action/scene")
{
cJSON *delay = cJSON_GetObjectItem(item,MSG_SCENE_DELAY);
if(delay == NULL) return FAIL_RETURN;
cJSON *exeucteSceneId = cJSON_GetObjectItem(item,MSG_SCENE_SCENEID);
if(exeucteSceneId == NULL) return FAIL_RETURN;
kk_scene_insert_scene_embed(delay->valueint,exeucteSceneId->valuestring,sceneId);
}
else
{
propertySetType = 1;
cJSON *propertyName = cJSON_GetObjectItem(item,MSG_SCENE_PROPERTYNAME);
if(propertyName == NULL) return FAIL_RETURN;
cJSON *propertyValue = cJSON_GetObjectItem(item,MSG_SCENE_PROPERTYVALUE);
if(propertyValue == NULL) return FAIL_RETURN;
cJSON *productType = cJSON_GetObjectItem(item,MSG_PRODUCT_TYPE_STR);
if(productType != NULL){
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
kk_subDev_set_action_by_productType(productType->valuestring,sceneId,propertyName->valuestring,
propertyValue->valuestring,type->valuestring);
}
......@@ -1051,9 +732,44 @@ int kk_scene_parse_scene_action(const cJSON* str,const char *sceneId,int isUpdat
return res;
}
}
}
item = item->next;
}
if(propertySetType){
kk_scene_action_info_send(isUpdate);
}
return SUCCESS_RETURN;
}
int kk_scene_parse_scene_muticontrol(const cJSON* str,const char *sceneId)
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
if(str == NULL){
ERROR_PRINT("kk_scene_parse_scene_muticontrol failed\n");
return INVALID_PARAMETER;
}
cJSON *action = cJSON_GetObjectItem(str,MSG_SCENE_ACTIONS);
if(action == NULL) return FAIL_RETURN;
cJSON * item = action->child;
while(item != NULL){
cJSON *type = cJSON_GetObjectItem(item,MSG_SCENE_TYPE);
if(type == NULL) return FAIL_RETURN;
if(!strcmp(type->valuestring,"action/thing/group")){
cJSON *deviceCode = cJSON_GetObjectItem(item,MSG_DEVICE_CODE_STR);
if(deviceCode == NULL) return FAIL_RETURN;
res = dm_mgr_get_device_by_devicecode(deviceCode->valuestring,&node);
if (res != SUCCESS_RETURN) {
item = item->next;
continue;
}
break;
}
item = item->next;
}
kk_scene_muticontrol_info_send(action,node->fatherDeviceCode,sceneId);
return SUCCESS_RETURN;
}
......@@ -1076,8 +792,11 @@ int kk_scene_parse_addscene(const cJSON* args,char *sceneId,int isUpdate)
if(!isUpdate){
HAL_GetTime_s(sceneId);//use time to create the sceneId
}
//sprintf(sceneId,"%lld",u64SceneKeyId);
/*多控直接下发给网关处理*/
if(enable->valueint == 1 && sceneType->valueint == DB_SCENETYPE_MUTICONTROL){
kk_scene_parse_scene_muticontrol(args,sceneId);
}
else{
res = kk_scene_insert_scene_info(name->valuestring,sceneType->valueint,enable->valueint,sceneId);
if(res != SUCCESS_RETURN){
INFO_PRINT("kk_scene_insert_scene_info fail!!!\n");
......@@ -1100,12 +819,14 @@ int kk_scene_parse_addscene(const cJSON* args,char *sceneId,int isUpdate)
ERROR_PRINT("kk_scene_parse_scene_action failed\n");
return FAIL_RETURN;
}
}
return SUCCESS_RETURN;
}
static void kk_scene_delete(char* sceneId)
{
kk_scene_remove_timer_info(sceneId);
kk_scene_delete_scene_timing(sceneId);
kk_scene_delete_scene_info(sceneId);
kk_scene_delete_scene_trigger(sceneId);
kk_scene_delete_scene_condition(sceneId);
......@@ -1146,6 +867,7 @@ int kk_scene_get_scene_info(const char* sceneId,int *sceneType,int *enable)
res = SUCCESS_RETURN;
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
return res;
}
static char kk_scene_date_to_week(time_t t)
......@@ -1250,11 +972,11 @@ int kk_scene_check_trigger_condition(const char *sceneId)
int propertyValueType = 0;
int conditionFlag = 0;
sqlite3_stmt *stmt;
char *currentValue = NULL;
char currentValue[64] = {0};
dm_mgr_dev_node_t *node = NULL;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
sqlCmd = sqlite3_mprintf("select * from SceneTriggerInfo WHERE sceneId = '%s' and type = '%s'",sceneId,"condition");
sqlCmd = sqlite3_mprintf("select * from SceneTriggerInfo WHERE sceneId = '%s' and type = '%s'",sceneId,"condition/property");
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
conditionFlag = 1;
......@@ -1263,27 +985,24 @@ int kk_scene_check_trigger_condition(const char *sceneId)
identifier = sqlite3_column_text(stmt,DB_SCENETRIGGER_PROPERTYNAME);
compareType = sqlite3_column_text(stmt,DB_SCENETRIGGER_COMPARETYPE);
compareValue = sqlite3_column_text(stmt,DB_SCENETRIGGER_COMPAREVALUE);
propertyValueType = kk_dm_get_property_type(pdeviceCode,identifier);
res = dm_mgr_get_device_by_devicecode(pdeviceCode,&node);
if (res != SUCCESS_RETURN) {
ERROR_PRINT("ERROR [%s][%d] res:%d\n",__FUNCTION__,__LINE__,res);
continue;
}
res = kk_tsl_get_value(kk_tsl_get_property_value,node->dev_shadow,identifier,NULL,&currentValue);
if(res != SUCCESS_RETURN){
ERROR_PRINT("ERROR [%s][%d] res:%d\n",__FUNCTION__,__LINE__,res);
continue;
}
kk_property_db_get_value_directly(pdeviceCode,identifier,currentValue);
printf("currentValue:%s\n",currentValue);
res = kk_scene_check_value_ex(compareType,currentValue,compareValue);
free(currentValue);
currentValue = NULL;
INFO_PRINT("kk_scene_check_value_ex:res:%d\n",res);
if(res != 0){
break;
}
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
/*如果没有设置条件,直接return success*/
if(conditionFlag == 0){
res = SUCCESS_RETURN;
}
INFO_PRINT("kk_scene_check_trigger_condition:res:%d\n",res);
return res;
}
......@@ -1348,7 +1067,6 @@ int kk_scene_check_condition(const char *sceneId)
}
}
else{
if(current >= startTime_m && current <= (startTime_m + duration)){
res = SUCCESS_RETURN;
}
......@@ -1359,13 +1077,13 @@ int kk_scene_check_condition(const char *sceneId)
}
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
/*如果没有设置条件,直接return success*/
if(conditionFlag == 0){
res = SUCCESS_RETURN;
}
INFO_PRINT("kk_scene_check_condition:res:%d\n",res);
return res;
}
......@@ -1479,6 +1197,7 @@ static void kk_scene_send_action_msg(kk_scene_action_info_t *pInfo)
valueType = kk_dm_get_property_type(pInfo->deviceCode,pInfo->propertyName);
if(valueType < 0){
ERROR_PRINT("[%d]kk_scene_send_action_msg valueType < 0!!!\n",__LINE__);
free(pInfo);
return 0;
}
switch(valueType){
......@@ -1506,7 +1225,32 @@ static void kk_scene_send_action_msg(kk_scene_action_info_t *pInfo)
free(pInfo);
return;
}
static int kk_scene_push_action_list(kk_scene_action_info_t *actionInfo,int delay)
{
kk_scene_action_delay_t *ptr = NULL,*ptemp = NULL;
if(actionInfo == NULL){
return INVALID_PARAMETER;
}
ptemp = ptr = p_delay_action_list;
while(ptr){
ptemp = ptr;
ptr = ptr->next;
}
ptr = malloc(sizeof(kk_scene_action_delay_t));
if(ptr == NULL) {
return MEMORY_NOT_ENOUGH;
}
memset(ptr,0x0,sizeof(kk_scene_action_delay_t));
ptr->starttime = HAL_GetTime()+delay;
ptr->action = actionInfo;
if(p_delay_action_list == NULL){
p_delay_action_list = ptr;
}else{
ptemp->next = ptr;
}
return SUCCESS_RETURN;
}
static int kk_scene_start_action(const char *deviceCode,const char *propertyName,const char *valueS,int delay)
{
int res = 0;
......@@ -1535,28 +1279,10 @@ static int kk_scene_start_action(const char *deviceCode,const char *propertyName
memcpy(actionInfo->propertyName,propertyName,strlen(propertyName));
memcpy(actionInfo->propertyValue,valueS,strlen(valueS));
if(delay == 0){
INFO_PRINT("[%s][%d]\n",__FUNCTION__,__LINE__);
kk_scene_send_action_msg(actionInfo);
}else{
INFO_PRINT("[%s][%d]delay:%d\n",__FUNCTION__,__LINE__,delay);
kk_scene_action_delay_t *ptr = NULL,*ptemp = NULL;
ptemp = ptr = p_delay_action_list;
while(ptr){
ptemp = ptr;
ptr = ptr->next;
}
ptr = malloc(sizeof(kk_scene_action_delay_t));
if(ptr == NULL) {
return MEMORY_NOT_ENOUGH;
}
memset(ptr,0x0,sizeof(kk_scene_action_delay_t));
ptr->starttime = HAL_GetTime()+delay;
ptr->action = actionInfo;
if(p_delay_action_list == NULL){
p_delay_action_list = ptr;
}else{
ptemp->next = ptr;
}
kk_scene_push_action_list(actionInfo,delay);
}
return SUCCESS_RETURN;
......@@ -1605,10 +1331,67 @@ next:
}
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
return res;
}
static int kk_scene_push_embed_list(int delay,const char* sceneId)
{
if(sceneId == NULL){
return INVALID_PARAMETER;
}
kk_scene_embed_delay_t *ptr = NULL,*ptemp = NULL;
_kk_scene_lock();
ptemp = ptr = p_delay_embed_list;
while(ptr){
ptemp = ptr;
ptr = ptr->next;
}
ptr = malloc(sizeof(kk_scene_embed_delay_t));
if(ptr == NULL) {
return MEMORY_NOT_ENOUGH;
}
memset(ptr,0x0,sizeof(kk_scene_embed_delay_t));
ptr->starttime = HAL_GetTime()+delay;
memcpy(ptr->executeSceneId,sceneId,strlen(sceneId));
if(p_delay_embed_list == NULL){
p_delay_embed_list = ptr;
}else{
ptemp->next = ptr;
}
_kk_scene_unlock();
return SUCCESS_RETURN;
}
static int kk_scene_embed_find(const char *sceneId)
{
int find = 0;
char *sqlCmd = NULL;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
sqlite3_stmt *stmt;
int delay = 0;
char *executeSceneId = NULL;
if(sceneId == NULL){
return INVALID_PARAMETER;
}
sqlCmd = sqlite3_mprintf("select * from SceneEmbedInfo WHERE sceneId= '%s'",sceneId);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
find = 1;
delay = sqlite3_column_int(stmt,DB_SCENEEMBED_WEEK);
executeSceneId = sqlite3_column_text(stmt,DB_SCENEEMBED_EXECUTESCENEID);
/*如果有延时,加入到队列*/
if(delay > 0){
kk_scene_push_embed_list(delay,executeSceneId);
}
else{
kk_scene_execute_action(executeSceneId);
}
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
return find;
}
int kk_scene_query_trigger_info(const char *deviceCode,cJSON *param)
{
......@@ -1644,9 +1427,10 @@ int kk_scene_query_trigger_info(const char *deviceCode,cJSON *param)
if(res == SUCCESS_RETURN){
res = kk_scene_check_trigger_condition(sceneId);
if(res == SUCCESS_RETURN){
_kk_scene_lock();
/*check是否时内嵌场景*/
if(kk_scene_embed_find(sceneId) == 0){
res = kk_scene_execute_action(sceneId);
_kk_scene_unlock();
}
}
}
}
......@@ -1655,7 +1439,7 @@ int kk_scene_query_trigger_info(const char *deviceCode,cJSON *param)
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
return res;
}
int kk_scene_iftt_check(const char*deviceCode,cJSON *param)
......
......@@ -2,6 +2,8 @@
#define __KK_SCENE_H__
#include "kk_tsl_common.h"
#include "sqlite3.h"
#include "kk_log.h"
typedef struct kk_scene_action_detail{
char deviceCode[DEVICE_CODE_MAXLEN];
......@@ -38,12 +40,24 @@ typedef struct kk_action_list{
struct kk_action_list *next;
} kk_scene_action_delay_t;
typedef struct kk_embedscene_list{
time_t starttime;
char executeSceneId[32];
struct kk_embedscene_list *next;
} kk_scene_embed_delay_t;
typedef struct kk_scene_timer_list{
time_t starttime;
char sceneId[32];
int repeatday;
struct kk_scene_timer_list *next;
} kk_scene_timer_list_t;
typedef struct {
void *mutex;
sqlite3 *pDb;
void *s_scene_thread;
} kk_scene_ctx_t;
int kk_scene_init(void);
......
CONFIG_ENV_CFLAGS += \
-mcpu=cortex-m4 -march=armv7-m -mthumb \
-mthumb-interwork -mlittle-endian \
-fno-short-enums \
-DCONFIG_PLATFORM_8711B -DM3 -w \
CONFIG_ENV_CFLAGS += \
-Os \
-DCONFIG_HTTP_AUTH_TIMEOUT=500 \
-DCONFIG_MID_HTTP_TIMEOUT=500 \
-DCONFIG_GUIDER_AUTH_TIMEOUT=500 \
-DCONFIG_MQTT_TX_MAXLEN=640 \
-DCONFIG_MQTT_RX_MAXLEN=1200 \
CONFIG_external_libs/mbedtls :=
CONFIG_tests :=
CROSS_PREFIX := arm-none-eabi-
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment