Commit 942006cb authored by chen.weican's avatar chen.weican

【修改内容】增加空调内机多控功能

【提交人】陈伟灿
parent d4fa60b3
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include "kk_group_db.h" #include "kk_group_db.h"
#include "kk_alarm_handle.h" #include "kk_alarm_handle.h"
#include "kk_history_db.h" #include "kk_history_db.h"
#include "kk_mutictrl_handle.h"
int g_timezone = 8; int g_timezone = 8;
char * g_filerToPlatTable[] = char * g_filerToPlatTable[] =
...@@ -2136,6 +2137,7 @@ int main(const int argc, const char **argv) ...@@ -2136,6 +2137,7 @@ int main(const int argc, const char **argv)
kk_group_db_init(); kk_group_db_init();
kk_motor_bind_db_init(); kk_motor_bind_db_init();
kk_scene_init(); kk_scene_init();
kk_mutictrl_init();
g_timezone = HAL_Get_TimeZone(); g_timezone = HAL_Get_TimeZone();
mid_ctx->g_mid_dispatch_thread_running = 1; mid_ctx->g_mid_dispatch_thread_running = 1;
......
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlite3.h" #include "sqlite3.h"
#include "kk_log.h" #include "kk_log.h"
#include "kk_hal.h" #include "kk_hal.h"
...@@ -11,9 +13,136 @@ ...@@ -11,9 +13,136 @@
#include "kk_property_db.h" #include "kk_property_db.h"
#include "kk_mutictrl_handle.h" #include "kk_mutictrl_handle.h"
#include "kk_scene_handle.h" #include "kk_scene_handle.h"
mutictrl_timestamp_t g_mc_stamp = {0}; #include "kk_utils.h"
// g_mc_stamp[6] = {0};
#if 1 #if 1
void split(char *src,const char *separator,char **dest,int *num); void split(char *src,const char *separator,char **dest,int *num);
int kk_mutictrl_rm_list(mutictrl_record_t *node);
static dm_mutictrl_ctx g_dm_mutictrl = {0};
static dm_mutictrl_ctx *_dm_mutictrl_get_ctx(void)
{
return &g_dm_mutictrl;
}
static void _dm_mutictrl_mutex_lock(void)
{
dm_mutictrl_ctx *ctx = _dm_mutictrl_get_ctx();
if (ctx->mutex) {
kk_MutexLock(ctx->mutex);
}
}
static void _dm_mutictrl_mutex_unlock(void)
{
dm_mutictrl_ctx *ctx = _dm_mutictrl_get_ctx();
if (ctx->mutex) {
kk_MutexUnLock(ctx->mutex);
}
}
void *kk_muti_dispatch_yield(void *args)
{
dm_mutictrl_ctx *ctx = _dm_mutictrl_get_ctx();
time_t timestampnow = 0;
while (1) {
mutictrl_record_t *search_node = NULL;
timestampnow = HAL_Uptimes();
_dm_mutictrl_mutex_lock();
list_for_each_entry(search_node, &ctx->mutictrl_list, linked_list, mutictrl_record_t) {
if (timestampnow - search_node->timestamp >=5){
INFO_PRINT("kk_muti_dispatch_yield kk_mutictrl_rm_list\n");
kk_mutictrl_rm_list(search_node);
}
}
_dm_mutictrl_mutex_unlock();
usleep(500000);
}
return NULL;
}
int kk_mutictrl_init(void)
{
int res = 0;
dm_mutictrl_ctx *ctx = _dm_mutictrl_get_ctx();
memset(ctx, 0, sizeof(dm_mutictrl_ctx));
ctx->mutex = kk_MutexCreate();
if (ctx->mutex == NULL) {
return -1;
}
INIT_LIST_HEAD(&ctx->mutictrl_list);
res = pthread_create((pthread_t *)&ctx->g_mutictrl_thread, NULL, kk_muti_dispatch_yield, NULL);
if (res < 0) {
ERROR_PRINT("HAL_ThreadCreate mid Failed\n");
//IOT_Linkkit_Close(mid_ctx->master_devid);
return -1;
}
return 0;
}
int kk_mutictrl_add_list(char *sceneId,char *deviceCode,int ep)
{
dm_mutictrl_ctx *ctx = _dm_mutictrl_get_ctx();
mutictrl_record_t *node = NULL;
mutictrl_record_t *search_node = NULL;
_dm_mutictrl_mutex_lock();
list_for_each_entry(search_node, &ctx->mutictrl_list, linked_list, mutictrl_record_t) {
if (search_node->epNum == ep &&
(memcmp(search_node->deviceCode, deviceCode, strlen(deviceCode)) == 0)&&
(memcmp(search_node->sceneId, sceneId, strlen(sceneId)) == 0)) {
/* dm_log_debug("Device Found, Product Key: %s, Device Name: %s", product_key, device_name); */
_dm_mutictrl_mutex_unlock();
return SUCCESS_RETURN;
}
}
node = malloc(sizeof(mutictrl_record_t));
if (node == NULL) {
_dm_mutictrl_mutex_unlock();
return MEMORY_NOT_ENOUGH;
}
memset(node, 0, sizeof(mutictrl_record_t));
memcpy(node->sceneId,sceneId,strlen(sceneId));
memcpy(node->deviceCode,deviceCode,strlen(deviceCode));
node->epNum = ep;
node->timestamp = HAL_Uptimes();
INFO_PRINT("kk_mutictrl_add_list[%s][%d]\n",deviceCode,ep);
INIT_LIST_HEAD(&node->linked_list);
list_add_tail(&node->linked_list, &ctx->mutictrl_list);
_dm_mutictrl_mutex_unlock();
return 0;
}
int kk_mutictrl_get_by_devicecode(char *deviceCode,char *sceneId,int ep, mutictrl_record_t **node)
{
dm_mutictrl_ctx *ctx = _dm_mutictrl_get_ctx();
mutictrl_record_t *search_node = NULL;
list_for_each_entry(search_node, &ctx->mutictrl_list, linked_list, mutictrl_record_t) {
if (search_node->epNum == ep &&
(memcmp(search_node->deviceCode, deviceCode, strlen(deviceCode)) == 0)&&
(memcmp(search_node->sceneId, sceneId, strlen(sceneId)) == 0)) {
/* dm_log_debug("Device Found, Product Key: %s, Device Name: %s", product_key, device_name); */
if (node) {
*node = search_node;
}
return SUCCESS_RETURN;
}
}
ERROR_PRINT("kk_mutictrl_get_by_devicecode, deviceCode: %s\n", deviceCode);
return FAIL_RETURN;
}
int kk_mutictrl_rm_list(mutictrl_record_t *node)
{
dm_mutictrl_ctx *ctx = _dm_mutictrl_get_ctx();
if(node == NULL){
return -1;
}
//_dm_mutictrl_mutex_lock();
INFO_PRINT("kk_mutictrl_rm_list[%s][%d]\n",node->deviceCode,node->epNum);
list_del(&node->linked_list);
free(node);
node = NULL;
//_dm_mgr_mutex_unlock();
return SUCCESS_RETURN;
}
char * g_manualMutiCtrlDev[] = char * g_manualMutiCtrlDev[] =
{ {
(char *){"3062"}, (char *){"3062"},
...@@ -75,7 +204,7 @@ static int _kk_get_MutiCtrl_sceneId(char *deviceCode,char *sceneId,int epNum) ...@@ -75,7 +204,7 @@ static int _kk_get_MutiCtrl_sceneId(char *deviceCode,char *sceneId,int epNum)
} }
return -1; return -1;
} }
static int _kk_manual_mutictrl_set(cJSON *param,char *setDeviceCode,int ep,char* srcDeviceCode,int isMutiEp) static int _kk_manual_mutictrl_set(cJSON *param,char *setDeviceCode,int ep,char* srcDeviceCode,int isMutiEp,char *sceneId)
{ {
int res = 0,idx = 0; int res = 0,idx = 0;
char valueStr[32] = {0}; char valueStr[32] = {0};
...@@ -87,6 +216,7 @@ static int _kk_manual_mutictrl_set(cJSON *param,char *setDeviceCode,int ep,char* ...@@ -87,6 +216,7 @@ static int _kk_manual_mutictrl_set(cJSON *param,char *setDeviceCode,int ep,char*
int num = 0; int num = 0;
char epStr[4] = {0}; char epStr[4] = {0};
int offflag = 0; int offflag = 0;
int exexuteFlag = 0;
cJSON *propertyItem = NULL; cJSON *propertyItem = NULL;
res = dm_mgr_get_device_by_devicecode((char*)srcDeviceCode, &node); res = dm_mgr_get_device_by_devicecode((char*)srcDeviceCode, &node);
if(res != SUCCESS_RETURN){ if(res != SUCCESS_RETURN){
...@@ -142,15 +272,15 @@ static int _kk_manual_mutictrl_set(cJSON *param,char *setDeviceCode,int ep,char* ...@@ -142,15 +272,15 @@ static int _kk_manual_mutictrl_set(cJSON *param,char *setDeviceCode,int ep,char*
sprintf(newIdentifier,"%s",propertiesTmp); sprintf(newIdentifier,"%s",propertiesTmp);
} }
} }
INFO_PRINT("[%s][%d]valueStr:%s\n",__FUNCTION__,__LINE__,valueStr); //INFO_PRINT("[%s][%d]valueStr:%s\n",__FUNCTION__,__LINE__,valueStr);
INFO_PRINT("[%s][%d]newIdentifier:%s\n",__FUNCTION__,__LINE__,newIdentifier); //INFO_PRINT("[%s][%d]newIdentifier:%s\n",__FUNCTION__,__LINE__,newIdentifier);
if(strcmp(setDevnode->productCode,"3062") == 0){ if(strcmp(setDevnode->productCode,"3062") == 0){
kk_indoorair_property_db_get_value_directly((const char*)setDeviceCode,(const char*)newIdentifier,oldvalueStr,ep); kk_indoorair_property_db_get_value_directly((const char*)setDeviceCode,(const char*)newIdentifier,oldvalueStr,ep);
}else{ }else{
kk_property_db_get_value_directly((const char*)setDeviceCode,(const char*)newIdentifier,oldvalueStr); kk_property_db_get_value_directly((const char*)setDeviceCode,(const char*)newIdentifier,oldvalueStr);
} }
INFO_PRINT("[%s][%d]oldvalueStr:%s\n",__FUNCTION__,__LINE__,oldvalueStr); //INFO_PRINT("[%s][%d]oldvalueStr:%s\n",__FUNCTION__,__LINE__,oldvalueStr);
INFO_PRINT("[%s][%d]setDeviceCode:%s\n",__FUNCTION__,__LINE__,setDeviceCode); //INFO_PRINT("[%s][%d]setDeviceCode:%s\n",__FUNCTION__,__LINE__,setDeviceCode);
if(strcmp(oldvalueStr,valueStr) == 0){ if(strcmp(oldvalueStr,valueStr) == 0){
continue; continue;
}else{ }else{
...@@ -175,10 +305,10 @@ static int _kk_manual_mutictrl_set(cJSON *param,char *setDeviceCode,int ep,char* ...@@ -175,10 +305,10 @@ static int _kk_manual_mutictrl_set(cJSON *param,char *setDeviceCode,int ep,char*
cJSON_AddStringToObject(param, "epNum", epStr); cJSON_AddStringToObject(param, "epNum", epStr);
paramstr=cJSON_Print(param); paramstr=cJSON_Print(param);
offflag = 1; offflag = 1;
}else{ }else{
paramstr=cJSON_Print(params); paramstr=cJSON_Print(params);
} }
exexuteFlag = 1;
kk_msg_execute_property_set(setDevnode->productCode,setDevnode->deviceCode,paramstr,setDevnode->fatherDeviceCode); kk_msg_execute_property_set(setDevnode->productCode,setDevnode->deviceCode,paramstr,setDevnode->fatherDeviceCode);
free(paramstr); free(paramstr);
cJSON_Delete(params); cJSON_Delete(params);
...@@ -189,6 +319,18 @@ static int _kk_manual_mutictrl_set(cJSON *param,char *setDeviceCode,int ep,char* ...@@ -189,6 +319,18 @@ static int _kk_manual_mutictrl_set(cJSON *param,char *setDeviceCode,int ep,char*
} }
} }
} }
if(exexuteFlag == 0){
mutictrl_record_t *search_node = NULL;
_dm_mutictrl_mutex_lock();
res = kk_mutictrl_get_by_devicecode((char*)setDeviceCode,sceneId,ep,&search_node);
if(res == 0){
kk_mutictrl_rm_list(search_node);
_dm_mutictrl_mutex_unlock();
INFO_PRINT("[%s][%d]\n",__FUNCTION__,__LINE__);
return -1;
}
_dm_mutictrl_mutex_unlock();
}
return 0; return 0;
} }
static int _kk_manual_mutictrl_ctrl(char *sceneId,char *deviceCode,int ep,cJSON *param,int isMutiEp) static int _kk_manual_mutictrl_ctrl(char *sceneId,char *deviceCode,int ep,cJSON *param,int isMutiEp)
...@@ -206,9 +348,7 @@ static int _kk_manual_mutictrl_ctrl(char *sceneId,char *deviceCode,int ep,cJSON ...@@ -206,9 +348,7 @@ static int _kk_manual_mutictrl_ctrl(char *sceneId,char *deviceCode,int ep,cJSON
if(isManualDev == -1){ if(isManualDev == -1){
return -1; return -1;
} }
memset(g_mc_stamp.sceneId,0x0,sizeof(g_mc_stamp.sceneId));
memcpy(g_mc_stamp.sceneId,sceneId,strlen(sceneId));
g_mc_stamp.timestamp = HAL_Uptimes();
sqlCmd = sqlite3_mprintf("select * from SceneActionInfo WHERE sceneId= '%s' and type = '%s'",sceneId,"action/thing/group");//actice判断设备是否移入待分配 sqlCmd = sqlite3_mprintf("select * from SceneActionInfo WHERE sceneId= '%s' and type = '%s'",sceneId,"action/thing/group");//actice判断设备是否移入待分配
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL); sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){ while(sqlite3_step(stmt) == SQLITE_ROW){
...@@ -217,12 +357,12 @@ static int _kk_manual_mutictrl_ctrl(char *sceneId,char *deviceCode,int ep,cJSON ...@@ -217,12 +357,12 @@ static int _kk_manual_mutictrl_ctrl(char *sceneId,char *deviceCode,int ep,cJSON
if(strcmp(pdeviceCode,deviceCode) == 0 && ep == epNum){//过滤掉刚上报的这路 if(strcmp(pdeviceCode,deviceCode) == 0 && ep == epNum){//过滤掉刚上报的这路
continue; continue;
} }
kk_mutictrl_add_list(sceneId,pdeviceCode,epNum);
isAutoCtrlDev = _kk_check_manualMutiCtrlDev((const char*)pdeviceCode); isAutoCtrlDev = _kk_check_manualMutiCtrlDev((const char*)pdeviceCode);
if(isAutoCtrlDev == 0){//过滤下自动多控设备,手动多控设备先都手动执行下 if(isAutoCtrlDev == 0){//过滤下自动多控设备,手动多控设备先都手动执行下
continue; continue;
} }
printf("[%s][%d]\n",__FUNCTION__,__LINE__); _kk_manual_mutictrl_set(param,pdeviceCode,epNum,deviceCode,isMutiEp,sceneId);
_kk_manual_mutictrl_set(param,pdeviceCode,epNum,deviceCode,isMutiEp);
} }
sqlite3_free(sqlCmd); sqlite3_free(sqlCmd);
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
...@@ -237,7 +377,8 @@ static int _kk_manual_mutictrl_ctrl(char *sceneId,char *deviceCode,int ep,cJSON ...@@ -237,7 +377,8 @@ static int _kk_manual_mutictrl_ctrl(char *sceneId,char *deviceCode,int ep,cJSON
} }
isAutoCtrlDev = _kk_check_manualMutiCtrlDev((const char*)pdeviceCode); isAutoCtrlDev = _kk_check_manualMutiCtrlDev((const char*)pdeviceCode);
if(isAutoCtrlDev == 0){//手动多控设备先都手动执行下,过滤下自动多控设备 if(isAutoCtrlDev == 0){//手动多控设备先都手动执行下,过滤下自动多控设备
_kk_manual_mutictrl_set(param,pdeviceCode,epNum,deviceCode,isMutiEp); //kk_mutictrl_add_list(sceneId,pdeviceCode,epNum);
_kk_manual_mutictrl_set(param,pdeviceCode,epNum,deviceCode,isMutiEp,sceneId);
break; break;
} }
} }
...@@ -303,13 +444,18 @@ int kk_manual_mutictrl_execute(const char*deviceCode,cJSON *param) ...@@ -303,13 +444,18 @@ int kk_manual_mutictrl_execute(const char*deviceCode,cJSON *param)
INFO_PRINT("[%s][%d]\n",__FUNCTION__,__LINE__); INFO_PRINT("[%s][%d]\n",__FUNCTION__,__LINE__);
return -1; return -1;
} }
//if(strcmp(sceneId,g_mc_stamp.sceneId) == 0 && HAL_Uptimes() - g_mc_stamp.timestamp <= 2 ){ mutictrl_record_t *search_node = NULL;
//INFO_PRINT("muti ctrl alread exexute !!!\n"); _dm_mutictrl_mutex_lock();
//return -1; res = kk_mutictrl_get_by_devicecode((char*)deviceCode,sceneId,ep,&search_node);
//} if(res == 0){
kk_mutictrl_rm_list(search_node);
_dm_mutictrl_mutex_unlock();
INFO_PRINT("[%s][%d]\n",__FUNCTION__,__LINE__);
return -1;
}
_dm_mutictrl_mutex_unlock();
INFO_PRINT("sceneId:%s\n",sceneId); INFO_PRINT("sceneId:%s\n",sceneId);
_kk_manual_mutictrl_ctrl(sceneId,(char*)deviceCode,ep,param,isMutiEp); _kk_manual_mutictrl_ctrl(sceneId,(char*)deviceCode,ep,param,isMutiEp);
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
#endif #endif
\ No newline at end of file
#ifndef __KK_MUTICTRL_HANDLE_H__ #ifndef __KK_MUTICTRL_HANDLE_H__
#define __KK_MUTICTRL_HANDLE_H__ #define __KK_MUTICTRL_HANDLE_H__
#include "cJSON.h" #include "cJSON.h"
#include "klist.h"
typedef struct{ typedef struct{
char sceneId[16]; char sceneId[16];
char deviceCode[32];
int epNum;
int count;
time_t timestamp; time_t timestamp;
}mutictrl_timestamp_t; struct list_head linked_list;
}mutictrl_record_t;
typedef struct {
void *mutex;
void *g_mutictrl_thread;
struct list_head mutictrl_list;
} dm_mutictrl_ctx;
int kk_virtual_mutictrl_check(const char*deviceCode,cJSON *param); int kk_virtual_mutictrl_check(const char*deviceCode,cJSON *param);
int kk_manual_mutictrl_execute(const char*deviceCode,cJSON *param); int kk_manual_mutictrl_execute(const char*deviceCode,cJSON *param);
int kk_mutictrl_init(void);
#endif #endif
\ No newline at end of file
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