Commit 0bc4dfcd authored by chen.weican's avatar chen.weican

【修改内容】Merge modification from jiaqing

【提交人】陈伟灿
parents 391a1271 ef9e834f
This diff is collapsed.
#include <stdint.h>
#ifndef __SERIAL_H__
#define __SERIAL_H__
#include <syslog.h>
#if defined __cplusplus
extern "C" {
#endif
/****************************************************************************/
/*** Include files ***/
/****************************************************************************/
/****************************************************************************/
/*** Macro Definitions ***/
/****************************************************************************/
#define _SERIAL_LOG(level, fmt, args...) \
do \
{ \
syslog(level, fmt, ##args); \
printf("\n["__FILE__":%d] "fmt,__LINE__, ##args); \
} while(0)
#define SERIAL_LOG_DBG(fmt, args...) _SERIAL_LOG(LOG_DEBUG, fmt, ##args)
#define SERIAL_LOG_ERR(fmt, args...) _SERIAL_LOG(LOG_ERR, fmt, ##args)
#define SERIAL_NAME "/dev/ttyUSB0"//"/dev/ttyS0"
#define SERIAL_BAUD 115200
/****************************************************************************/
/*** Type Definitions ***/
/****************************************************************************/
typedef enum
{
E_ERROR = -1,
E_SERIAL_OK = 0,
E_SERIAL_ERROR,
E_SERIAL_NODATA,
E_SERIAL_FD_ERROR,
} teSerial_Status;
/****************************************************************************/
/*** Local Function Prototypes ***/
/****************************************************************************/
/****************************************************************************/
/*** Exported Variables ***/
/****************************************************************************/
extern int serial_fd;
/****************************************************************************/
/*** Local Variables ***/
/****************************************************************************/
/****************************************************************************/
/*** Exported Functions ***/
/****************************************************************************/
void eSerial_start();
void eSerial_stop();
teSerial_Status eSerial_Init(char *name, uint32_t baud, int *piserial_fd);
teSerial_Status eSerial_Read(unsigned char *data);
teSerial_Status eSerial_Write(const unsigned char data);
teSerial_Status eSerial_ReadBuffer(unsigned char *data, int *count);
teSerial_Status eSerial_WriteBuffer(unsigned char *data, uint32_t count);
/****************************************************************************/
/*** Local Functions ***/
/****************************************************************************/
/****************************************************************************/
/*** END OF FILE ***/
/****************************************************************************/
#if defined __cplusplus
}
#endif
#endif /* __SERIAL_H__ */
......@@ -18,6 +18,9 @@
#include "kk_lan_ctrl.h"
#include "kk_lan_sync.h"
#include "kk_voice_panel_handle.h"
const char DM_MSG_TO_MIDDWARE[] = "{\"msgtype\":\"%s\",\"productCode\":\"%s\",\"deviceCode\":\"%s\"}";
char *strrpl(char *in, char *out, int outlen, char *src, char *dst)
{
......@@ -297,6 +300,7 @@ cJSON * kk_zb_dev_hw_info_build_by_deviceCode(int sockfd,const char *deviceCode,
return NULL;
}
static void kk_zb_devs_hw_ack(int sockfd,cJSON *conditions)
{
int i,size;
......@@ -366,6 +370,7 @@ int kk_data_handle(cJSON *json,int sockfd)
kk_handle_del_history_info(key->valuestring);
}
}else{
kk_ccu_opcode_handle(json);
}
}
......@@ -687,13 +692,16 @@ void KK_Data_FromMid(void* str,int len)
if((json= cJSON_Parse(str)) == NULL) {
return;
}
info = cJSON_GetObjectItem(json, MSG_INFO_STR);
payload = cJSON_GetObjectItem(json, MSG_PAYLOAD_STR);
if(info==NULL || payload==NULL ||
info->type != cJSON_Object ||payload->type!= cJSON_Object){
cJSON_Delete(json);
return;
}
msgtype = cJSON_GetObjectItem(info, MSG_TYPE_STR);
productCode = cJSON_GetObjectItem(info, MSG_PRODUCT_CODE_STR);
deviceCode= cJSON_GetObjectItem(info, MSG_DEVICE_CODE_STR);
......@@ -708,10 +716,12 @@ void KK_Data_FromMid(void* str,int len)
if (strstr(msgtype->valuestring,SYNC_MSG_TYPE_REPLY) != NULL){
kk_parse_syncinfo(payload);
kk_create_syncinfo_to_sdk(payload);
kk_vp_syncinfo_handle(payload);
}
else if(strstr(msgtype->valuestring,"/thing/event/property/post")!= NULL){
if(is_ccu_msg(productCode,deviceCode)){
int type;
if((type = is_arming_status_notify(payload))!=-1){
arming_status_notify(type);
......
......@@ -193,7 +193,7 @@ static char *kk_open_lan_cfg_file(char *deviceCode)
return buf;
}
//todo:
int kk_creater_nodeid(char *deviceCode,int channel,char *nodeId)
int kk_creater_nodeid(char *deviceCode,int channel,char *nodeId,int operate_type)
{
static int next = 1;
int node=-1;
......@@ -212,7 +212,7 @@ int kk_creater_nodeid(char *deviceCode,int channel,char *nodeId)
while(kk_check_lan_node(next)){
++next;
}
if(0==kk_lan_db_node_insert(deviceCode,channel,next)){
if(0==kk_lan_db_node_insert(deviceCode,channel,next,operate_type)){
node=next;
}
}
......
......@@ -34,7 +34,7 @@ int kk_create_devices_to_sdk(cJSON *root);
int _deviceCode_switchto_mac(char * deviceCode,char *mac);
int mac_switchto_deviceCode(char *mac,char * deviceCode);
int kk_map_dev_search_by_deviceCode(char *deviceCode, kk_map_dev_node_t **node);
kk_map_dev_ctx *_kk_map_dev_ctx(void);
int kk_map_dev_init(void);
int kk_creater_nodeid(char *deviceCode,int channel,char *nodeId);
#endif
\ No newline at end of file
#endif
......@@ -151,10 +151,14 @@ int kk_ccu_opcode_handle(cJSON *root)
kk_lan_db_deviceCode_get(atoi(nodeId->valuestring),deviceCode);
//execute scene
if((requester!=NULL) &&(strcmp(requester->valuestring,HJ_PROFILE)==0) &&
(strcmp(opcode->valuestring,"SWITCH")==0)){
msg=scene_execute(nodeId->valuestring);
kk_ipc_send_json(msg);
return 0;
......
......@@ -19,6 +19,10 @@
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "com_api.h"
#include "kk_product.h"
#include "kk_findccu_handle.h"
......@@ -27,32 +31,35 @@
//#include "kk_lan_queue.h"
#include "kk_lan_node_db.h"
#include "kk_lan_voice_panel.h"
#include "kk_data_mng.h"
static char s_ccuid[DEVICE_CODE_LEN] = {0};
int kk_lan_get_ccuid(_OU_ char *device_code)
{
strncpy(device_code, s_ccuid, strlen(s_ccuid));
printf("kk_lan_get_ccuid:%s\n",s_ccuid);
return strlen(s_ccuid);
{
strncpy(device_code, s_ccuid, strlen(s_ccuid));
printf("kk_lan_get_ccuid:%s\n",s_ccuid);
return strlen(s_ccuid);
}
static int _setDevice_Code(_IN_ char *device_code,int len)
{
memset(s_ccuid, 0x0, DEVICE_CODE_LEN);
printf("_setDevice_Code:%s\n",device_code);
strncpy(s_ccuid, device_code, len);
return len;
memset(s_ccuid, 0x0, DEVICE_CODE_LEN);
printf("_setDevice_Code:%s\n",device_code);
strncpy(s_ccuid, device_code, len);
return len;
}
extern int HAL_Execel_cmd(char * cmd,char * buf,int buf_len,int* ret_len);
static void kk_lan_ccuid_init(void)
{
uint8_t ccuid[DEVICE_CODE_LEN] = {0};
int ccuid_len = 0;
HAL_Execel_cmd(GET_CCUID_CMD,(char *)ccuid,sizeof(ccuid),&ccuid_len);
printf("GET_CCUID_CMD:%s\n",ccuid);
if(ccuid_len > 0 && ccuid_len <= DEVICE_CODE_LEN){
_setDevice_Code(ccuid,ccuid_len-1);
}else{
uint8_t ccuid[DEVICE_CODE_LEN] = {0};
int ccuid_len = 0;
HAL_Execel_cmd(GET_CCUID_CMD,(char *)ccuid,sizeof(ccuid),&ccuid_len);
printf("GET_CCUID_CMD:%s\n",ccuid);
if(ccuid_len > 0 && ccuid_len <= DEVICE_CODE_LEN){
_setDevice_Code((char *)ccuid,ccuid_len-1);
}else{
_setDevice_Code(KK_CCU_ID,strlen(KK_CCU_ID));
}
}
}
......@@ -71,6 +78,7 @@ int main(int argc, char* argv[])
kk_findccu_handle_init();
kk_map_dev_init();
kk_login_init();
kk_voice_panel_init();
//lan_queue_init();
kk_lan_db_node_init();
......
......@@ -46,7 +46,8 @@ static int _kk_lan_node_db_Init(void)
idx INTEGER PRIMARY KEY, \
deviceCode varchar(33), \
channel INTEGER, \
nodeId INTEGER)";
nodeId INTEGER, \
operate_type INTEGER)";
char *pcErr;
......@@ -233,10 +234,10 @@ static int kk_lan_db_node_update(const char *deviceCode,int channel,int node)
*返 回 值: 0:成功;其他:失败
*其他说明:属性的值插入的时候先置空,后续再update
*************************************************************/
int kk_lan_db_node_insert(const char *deviceCode,int channel,int node)
int kk_lan_db_node_insert(const char *deviceCode,int channel,int node,int operate_type)
{
const char *insertCmd = "insert into Map2Node (deviceCode,channel,nodeId) \
values ('%s','%d','%d');";
const char *insertCmd = "insert into Map2Node (deviceCode,channel,nodeId,operate_type) \
values ('%s','%d','%d','%d');";
char *sqlCmd = NULL;
int rc = 0;
char *zErrMsg = 0;
......@@ -250,7 +251,7 @@ int kk_lan_db_node_insert(const char *deviceCode,int channel,int node)
}
_kk_lan_node_db_lock();
sqlCmd = sqlite3_mprintf(insertCmd,deviceCode,channel,node);
sqlCmd = sqlite3_mprintf(insertCmd,deviceCode,channel,node,operate_type);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
......
......@@ -18,7 +18,7 @@ enum{
};
int kk_lan_db_node_init(void);
int kk_lan_db_node_insert(const char *deviceCode,int channel,int node);
int kk_lan_db_node_insert(const char *deviceCode,int channel,int node,int operate_type);
int kk_lan_db_node_get(const char *deviceCode,int channel);
int kk_lan_db_node_get_all(const char *deviceCode,int *nodes);
......
......@@ -226,10 +226,9 @@ static int kk_sync_scene_condition(cJSON *condition,SYN_SCENE_ITEM **build)
int get_flag = 0;
SYN_SCENE_ITEM *ptr=*build;
printf("kk_sync_scene_condition,num=%d\n",num);
for(i=0;i<num;i++){
cJSON *item;
printf("i=%d\n",i);
item = cJSON_GetArrayItem(condition,i);
startTime = cJSON_GetObjectItem(item,"startTime");
......@@ -293,20 +292,18 @@ cJSON *kk_sync_scence_to_sdk(cJSON *root,cJSON *data)
if(strcmp(sceneType->valuestring,"")==){
}*/
//printf("--------------------------->[%s][%d]\n",__FUNCTION__,__LINE__);
pScene->act_num = kk_sync_actions(actions,&pScene->act,&pScene->room_id);
//printf("--------------------------->[%s][%d]\n",__FUNCTION__,__LINE__);
kk_sync_scene_condition(condition,&pScene);
//printf("--------------------------->[%s][%d]\n",__FUNCTION__,__LINE__);
pScene->scene_id = sceneId->valuestring;
pScene->name = name->valuestring;
pScene->pannel_id = NULL;
sceneItem = kk_scene_build(&pScene);
//printf("--------------------------->[%s][%d]\n",__FUNCTION__,__LINE__);
cJSON_AddItemToArray(scenesAry,sceneItem);
// printf("[%s][%d]%s\n",__FUNCTION__,__LINE__,cJSON_Print(sceneItem));
}
......@@ -332,10 +329,8 @@ int _kk_sync_device_item(cJSON *deviceCode,cJSON *epNum,cJSON *name,cJSON *roomI
list_for_each_entry(node, &ctx->dev_list, linked_list, kk_map_dev_node_t) {
if (node != NULL) {
printf("node->deviceCode=%s,%s\n",node->deviceCode,deviceCode->valuestring);
if(strlen(node->deviceCode)==strlen(deviceCode->valuestring) &&
!strcmp(node->deviceCode,deviceCode->valuestring)){
cJSON *subdevicesItem = cJSON_CreateObject();
if(epNum==NULL ||epNum->type!=cJSON_String){
......
#include <stdio.h>
#include <syslog.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include "kk_log.h"
#include "kk_lan_voice_panel.h"
#include "kk_voice_panel_cfg.h"
#include "kk_voice_panel_handle.h"
#include "Serial.h"
#include "uart_proto.h"
static pthread_mutex_t v_mux;
extern int serial_fd;
static void *kk_vp_uart_thread(void *arg)
{
fd_set rd;
int nFlag;
struct timeval tval = {2,0};
int count = 0;
unsigned char data_buf[512];
teSerial_Status ret = E_SERIAL_ERROR;
INFO_PRINT("[%s] start...\n",__FUNCTION__);
eSerial_start();
while (1)
{
FD_ZERO(&rd);
FD_SET(serial_fd,&rd);
nFlag = select(serial_fd + 1, &rd, NULL, NULL, &tval);
if(0 > nFlag)
{
ERROR_PRINT("uartRecv():select error !\n");
ERROR_PRINT("uartRecv errno = %d", errno);
usleep( 100000 );
}
else if(0 == nFlag)
{
usleep( 100000 );
}
else
{
if(FD_ISSET(serial_fd, &rd))
{
ret = eSerial_Read(&data_buf[count]);
if(ret == E_SERIAL_OK)
{
if(get_uart_frame((uint8_t *)data_buf,1))
{
uart_frame_handle();
}
}
else if(ret == E_SERIAL_FD_ERROR)
{
eSerial_start();
}
}
}
}
ERROR_PRINT("[%s]thread end...\n",__FUNCTION__);
}
typedef struct {
int next_ver;
int f_ver;
int f_size;
int crc32;
}vpCFGInfo;
typedef struct{
int state;
vpCFGInfo cfg_info;
int updateFlag;
}VP_MANAGE;
VP_MANAGE vp_mag;
char *vp_file_load(const char *path)
{
char *buff = NULL;
char *pRead = NULL;
int t_len = 0;
int remain = 0;
int r_len = 0;
FILE *fp = NULL;
int size = 0;
INFO_PRINT("[%s]vp load file(%s)\n",__FUNCTION__,path);
fp = fopen (path,"r");
if(fp==NULL){
printf("open err.\n");
return NULL;
}
fseek (fp, 0, SEEK_END);
size=ftell(fp);
printf("size=%d\n",size);
fseek (fp, 0, SEEK_SET);
buff = malloc(size+1);
memset(buff,0,size+1);
pRead = buff;
remain = size;
while(remain>0){
r_len = fread(pRead, 1, size, fp);
if(remain>=r_len){
remain -= r_len;
pRead+=r_len;
}else{
remain = 0;
pRead[size] = '\0';
}
}
fclose(fp);
return buff;
}
static int _vp_config_file_version_load(void)
{
cJSON *json = NULL;
cJSON *version = NULL;
char *pFile = vp_file_load(VP_CONFIG_FILE);
if(pFile==NULL){
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
return 0;
}
if((json = cJSON_Parse(pFile))==NULL){
free(pFile);
return 0;
}
version = cJSON_GetObjectItem(json,"version");
if(version!=NULL &&version->type==cJSON_Number){
vp_mag.cfg_info.f_ver = version->valueint;
vp_mag.cfg_info.next_ver = version->valueint;
printf("[vp load config version]%d\n",vp_mag.cfg_info.f_ver);
}
cJSON_Delete(json);
free(pFile);
}
void kk_vp_set_updateFlag(int flag)
{
vp_mag.updateFlag = (flag!=0)?1:0;
}
void kk_vp_config_file_update(void)
{
if(vp_mag.updateFlag==0){
return ;
}
if(vp_mag.state == UPDATING_8009_CONFIG_FILE_INFO||
vp_mag.state == START_8009_CONFIG_FILE_UPDATE){
kk_vp_set_state_machine(STOP_8009_CONFIG_FILE_UPDATE);
}else{
kk_vp_set_state_machine(START_8009_CONFIG_FILE_UPDATE);
}
kk_vp_set_updateFlag(0);
}
void kk_vp_set_state_machine(int state)
{
if(vp_mag.state!=state){
INFO_PRINT("[vp state machine]%d->%d\n",vp_mag.state,state);
vp_mag.state = state;
}
}
void kk_vp_get_config_file_version(int ver)
{
return vp_mag.cfg_info.next_ver;
}
void kk_vp_set_config_file_version(int ver)
{
vp_mag.cfg_info.f_ver = (vp_mag.cfg_info.f_ver>ver)?vp_mag.cfg_info.f_ver:ver;
printf("[cfg ver]File Version=%08x\n",vp_mag.cfg_info.f_ver);
}
void kk_vp_cfg_info_set(uint32_t f_ver,uint32_t f_size,uint32_t crc32)
{
vp_mag.cfg_info.next_ver = f_ver;
vp_mag.cfg_info.f_ver = f_ver;
vp_mag.cfg_info.f_size = f_size;
vp_mag.cfg_info.crc32 = crc32;
printf("[set cfg info]File Version=%08x,File Size=%08x,CRC32=%08x\n",f_ver,f_size,crc32);
}
void kk_vp_cfg_info_check(uint32_t f_ver,uint32_t f_size,uint32_t crc32)
{
if(vp_mag.cfg_info.f_ver!=f_ver ||
vp_mag.cfg_info.crc32!=crc32){
printf("[VP]File Version=%08x,File Size=%08x,CRC32=%08x\n",f_ver,f_size,crc32);
printf("[LAN]File Version=%08x,File Size=%08x,CRC32=%08x\n",vp_mag.cfg_info.f_ver,vp_mag.cfg_info.f_size,vp_mag.cfg_info.crc32);
kk_vp_set_updateFlag(1);
printf("[%s][%d]update config file.\n",__FUNCTION__,__LINE__);
}
}
void kk_vp_update_result_check(uint8_t status,uint32_t f_ver)
{
if(status==0 && (vp_mag.cfg_info.f_ver==f_ver) ){
vp_mag.cfg_info.next_ver=vp_mag.cfg_info.f_ver+1;
printf("[cfg ver]File Version=%08x\n",vp_mag.cfg_info.f_ver);
kk_vp_set_state_machine(GET_8009_CONFIG_FILE_INFO);
}else{
kk_vp_set_updateFlag(1);
printf("[%s][%d]update config file.\n",__FUNCTION__,__LINE__);
}
}
int kk_vp_config_file_info_check(int f_ver,int f_size,int crc32)
{
kk_vp_set_state_machine(UPDATING_8009_CONFIG_FILE_INFO);
if(vp_mag.cfg_info.f_ver==f_ver &&
vp_mag.cfg_info.f_size==f_size &&
vp_mag.cfg_info.crc32==crc32){
kk_vp_set_state_machine(UPDATING_8009_CONFIG_FILE_INFO);
return 1;
}
return 0;
}
void kk_vp_manage_init(void)
{
vp_scene_id_map_load();
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
_vp_config_file_version_load();
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
vp_mag.cfg_info.f_size = _vp_get_cfg_file_size();
vp_mag.cfg_info.crc32 = _vp_get_cfg_file_crc32();
}
void *kk_vp_manage_thread(void *arg)
{
INFO_PRINT("[%s] start...\n",__FUNCTION__);
kk_vp_manage_init();
while (1)
{
kk_vp_config_file_update();
switch(vp_mag.state){
case GET_8009_SNAPSHOOT_STATE:
kk_vp_get_8009_snapshoot();
sleep(5);
break;
case SET_8009_SYSTEM:
kk_vp_set_8009_system_time();
sleep(5);
break;
case START_8009_CONFIG_FILE_UPDATE:
kk_vp_config_file_update_start(vp_mag.cfg_info.next_ver);
kk_vp_set_state_machine(UPDATING_8009_CONFIG_FILE_INFO);
break;
case UPDATING_8009_CONFIG_FILE_INFO:
//todo :超时取消
break;
case STOP_8009_CONFIG_FILE_UPDATE:
kk_vp_config_file_update_stop(vp_mag.cfg_info.f_ver);
if(vp_mag.updateFlag==1){
kk_vp_set_state_machine(UPDATING_8009_CONFIG_FILE_INFO);
}else{
kk_vp_set_state_machine(GET_8009_CONFIG_FILE_INFO);
}
sleep(3);
break;
case GET_8009_CONFIG_FILE_INFO:
kk_vp_get_config_file_info();
sleep(15);
break;
default:
break;
}
usleep(50*1000);
}
ERROR_PRINT("[%s]thread end...\n",__FUNCTION__);
}
int kk_voice_panel_init(void)
{
size_t s = 1500;
pthread_t uart_tid = 0;
pthread_t mag_tid = 0;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, s);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (pthread_mutex_init(&v_mux, NULL) != 0) {
pthread_attr_destroy(&attr);
ERROR_PRINT("pthread_mutex_init v_mux fail.\n");
return -1;
}
if((pthread_create(&uart_tid, &attr, kk_vp_uart_thread, NULL))!= 0 ) {
pthread_attr_destroy(&attr);
ERROR_PRINT("pthread_create kk_voice_panel fail\n");
return -2;
}
if((pthread_create(&mag_tid, NULL, kk_vp_manage_thread, NULL))!= 0 ) {
ERROR_PRINT("pthread_create kk_voice_panel fail\n");
return -3;
}
/*if((pthread_create(&tid3, NULL, kk_voice_panel_333, NULL))!= 0 ) {
ERROR_PRINT("pthread_create kk_voice_panel fail\n");
return -4;
}*/
return 0;
}
#ifndef _KK_LAN_VOICE_PANEL_H
#define _KK_LAN_VOICE_PANEL_H
int kk_voice_panel_init(void);
#define GET_8009_SNAPSHOOT_STATE 0
#define SET_8009_SYSTEM 1
#define START_8009_CONFIG_FILE_UPDATE 2
#define UPDATING_8009_CONFIG_FILE_INFO 3
#define STOP_8009_CONFIG_FILE_UPDATE 4
#define GET_8009_CONFIG_FILE_INFO 5
void kk_vp_set_state_machine(int state);
void kk_vp_set_config_file_version(int ver);
int kk_vp_config_file_info_check(int f_ver,int f_size,int crc32);
void kk_vp_update_result_check(uint8_t status,uint32_t f_ver);
void kk_vp_set_config_file_version(int ver);
void kk_vp_cfg_info_check(uint32_t f_ver,uint32_t f_size,uint32_t crc32);
void kk_vp_cfg_info_set(uint32_t f_ver,uint32_t f_size,uint32_t crc32);
void kk_vp_set_updateFlag(int flag);
#endif
#include "kk_data_mng.h"
#include "kk_lan_vp_ctrl.h"
#include "cJSON.h"
cJSON *PowerSwitch_msg_build(int ep,int onoff)
{
char epNum[12] = {0};
cJSON *params = cJSON_CreateObject();
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
memset(epNum,0,sizeof(epNum));
snprintf(epNum,sizeof(epNum),"%d",ep);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
cJSON_AddStringToObject(params,"epNum",epNum);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
cJSON_AddNumberToObject(params,"PowerSwitch",onoff);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
return params;
}
static int is_light_dev(int pid);
static cJSON *light_dev(int ep,int onoff);
static cJSON *light_dev_handle(int ep,uint8_t *arg);
static int is_curtain_dev(int pid);
static cJSON *curtain_dev_msg_build(int ep,int OperationMode);
static cJSON *curtain_dev_handle(int ep,uint8_t *arg);
static int is_outlet_dev(int pid);
static cJSON *outlet_msg_build(int ep,int onoff);
static cJSON *outlet_dev_handle(int ep,uint8_t *arg);
typedef int (*pid_mth_func)(int pid);
typedef cJSON *(*dev_handle)(int ep,uint8_t *arg);
typedef struct{
pid_mth_func mth;
dev_handle handle;
}KK_VP_CTRL;
static KK_VP_CTRL vp_ctrl_table[]={
{is_light_dev,light_dev_handle},
{is_curtain_dev,curtain_dev_handle},
{is_outlet_dev,outlet_dev_handle}
};
static int light_dev_pid[]={
3023,3024
};
static int curtain_dev_pid[]={
3067
};
static int outlet_dev_pid[]={
3020
};
static int is_light_dev(int pid)
{
int i;
for(i=0;i<sizeof(light_dev_pid)/sizeof(int);i++){
if(pid==light_dev_pid[i]){
return 1;
}
}
return 0;
}
static int is_curtain_dev(int pid)
{
int i;
for(i=0;i<sizeof(curtain_dev_pid)/sizeof(int);i++){
if(pid==curtain_dev_pid[i]){
return 1;
}
}
return 0;
}
static int is_outlet_dev(int pid)
{
int i;
for(i=0;i<sizeof(outlet_dev_pid)/sizeof(int);i++){
if(pid==outlet_dev_pid[i]){
return 1;
}
}
return 0;
}
static cJSON *light_msg_build(int ep,int onoff)
{
return PowerSwitch_msg_build(ep,onoff);
}
static cJSON *light_dev_handle(int ep,uint8_t *arg)
{
uint8_t skill_type = arg[0];
printf("[%s][%d]skill_type=%d,ep=%d\n",__FUNCTION__,__LINE__,skill_type,ep);
switch(skill_type){
case VP_CTRL_OPEN://
return light_msg_build(ep,1);
case VP_CTRL_CLOSE:
return light_msg_build(ep,0);
default:break;
}
return NULL;
}
static cJSON *curtain_dev_msg_build(int ep,int OperationMode)
{
char epNum[12] = {0};
cJSON *params = cJSON_CreateObject();
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
memset(epNum,0,sizeof(epNum));
snprintf(epNum,sizeof(epNum),"%d",ep);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
cJSON_AddStringToObject(params,"epNum",epNum);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
cJSON_AddNumberToObject(params,"OperationMode",OperationMode);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
return params;
}
static cJSON *curtain_dev_handle(int ep,uint8_t *arg)
{
uint8_t skill_type = arg[0];
printf("[%s][%d]skill_type=%d,ep=%d\n",__FUNCTION__,__LINE__,skill_type,ep);
switch(skill_type){
case VP_CTRL_OPEN://
return curtain_dev_msg_build(ep,1);
case VP_CTRL_CLOSE:
return curtain_dev_msg_build(ep,0);
case VP_CTRL_STOP:
return curtain_dev_msg_build(ep,2);
default:break;
}
return NULL;
}
static cJSON *outlet_msg_build(int ep,int onoff)
{
return PowerSwitch_msg_build(ep,onoff);
}
static cJSON *outlet_dev_handle(int ep,uint8_t *arg)
{
uint8_t skill_type = arg[0];
printf("[%s][%d]skill_type=%d,ep=%d\n",__FUNCTION__,__LINE__,skill_type,ep);
switch(skill_type){
case VP_CTRL_OPEN://
return outlet_msg_build(ep,1);
case VP_CTRL_CLOSE:
return outlet_msg_build(ep,0);
default:break;
}
return NULL;
}
void kk_lan_vp_control(uint8_t num,uint32_t nodeIdAry[],uint8_t *arg)
{
uint8_t i,j;
int ep;
int pid = 0;
char productCode[32] = {0};
char deviceCode[32] = {0};
cJSON *msg = NULL;
cJSON *params = NULL;
kk_map_dev_node_t *node = NULL;
KK_VP_CTRL *pVpCtr = vp_ctrl_table;
for(i=0;i<num;i++){
memset(deviceCode,0,sizeof(deviceCode));
memset(productCode,0,sizeof(productCode));
kk_lan_db_deviceCode_get(nodeIdAry[i],deviceCode);
kk_lan_db_channel_get(nodeIdAry[i],&ep);
if(kk_map_dev_search_by_deviceCode(deviceCode,&node) != 0){
continue ;
}
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
snprintf(productCode,sizeof(productCode),"%s",node->productCode);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
pid = atoi(productCode);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
params = NULL;
for(j=0;j<sizeof(vp_ctrl_table)/sizeof(KK_VP_CTRL);j++,pVpCtr++){
if(pVpCtr->mth!=NULL && pVpCtr->handle!=NULL){
if(pVpCtr->mth(pid)){
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
params = pVpCtr->handle(ep,arg);
break;
}
}
}
if(params!=NULL){
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
msg=property_set(productCode,deviceCode,"*","*",params);
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
kk_ipc_send_json(msg);
}
}
}
#ifndef _KK_LAN_VP_CTRL_H
#define _KK_LAN_VP_CTRL_H
#include "kk_newccu_msg.h"
#include "kk_lan_node_db.h"
#define VP_CTRL_OPEN 0X01
#define VP_CTRL_CLOSE 0X02
#define VP_CTRL_STOP 0X03
#define VP_CTRL_GO_ON 0X04
#define VP_CTRL_QUERY_ONOFF_STATUS 0X05
#define VP_CTRL_QUERY_AIR_QUALITY 0X06
#define VP_CTRL_QUERY_HUMIDITY 0X07
#define VP_CTRL_QUERY_WATER_TMP 0X08
#define VP_CTRL_QUERY_TMP 0X09
#define VP_CTRL_QUERY_WEATHER 0X0A
#define VP_CTRL_PLAY 0X0C
#define VP_CTRL_LEAVE_UP 0X0D
#define VP_CTRL_LEAVE_DOWN 0X0E
#define VP_CTRL_LEAVE_SET 0X0F
#define VP_CTRL_WINDSPEE_UP 0X10
#define VP_CTRL_WINDSPEE_DOWN 0X11
#define VP_CTRL_WINDSPEE_SET 0X12
#define VP_CTRL_OPEN_LITTLE 0X16
#define VP_CTRL_UP 0X17
#define VP_CTRL_DOWN 0X18
#define VP_CTRL_BRIGHTNESS_DOWN 0X19
#define VP_CTRL_BRIGHTNESS_UP 0X1A
#define VP_CTRL_BRIGHTNESS_SET 0X1B
#define VP_CTRL_MODE 0X1C
#define VP_CTRL_PREVIOUS 0X1E
#define VP_CTRL_NEXT 0X1F
#define VP_CTRL_WIND_DIR 0x20
#define VP_CTRL_TMP_UP 0X23
#define VP_CTRL_TMP_DOWN 0x24
#define VP_CTRL_TMP_SET 0x25
#define VP_CTRL_SET_COLOR 0x26
#define VP_CTRL_SET_COLOR_TMP 0x27
#define VP_CTRL_ALTITUDE 0x28
void kk_lan_vp_control(uint8_t num,uint32_t nodeIdAry[],uint8_t *arg);
#endif
......@@ -12,6 +12,25 @@
#include "kk_newccu_msg.h"
#include "kk_product.h"
static pthread_mutex_t *mutex = NULL;
int kk_new_msg_init(void)
{
int err = 0;
mutex = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
if (0 != (err = pthread_mutex_init(mutex, NULL))) {
free(mutex);
mutex = NULL;
printf("mutex init fail.");
}
return err;
}
cJSON *property_info_build(const char *msgtype,const char *productCode,const char *deviceCode)
......@@ -116,13 +135,22 @@ int kk_ipc_send_json(cJSON *root)
if(root==NULL){
return -1;
}
if(mutex==NULL){
kk_new_msg_init();
}
msg=cJSON_Print(root);
printf("[lan->midware]json:\n%s\n",msg);
cJSON_Minify(msg);
pthread_mutex_lock(mutex);
kk_ipc_send(IPC_APP2MID, msg, strlen(msg)+1);
pthread_mutex_unlock(mutex);
free(msg);
cJSON_Delete(root);
return 0;
}
......
......@@ -13,6 +13,9 @@ cJSON * property_report(const char *productCode,const char *deviceCode,const cha
int kk_ipc_send_json(cJSON *root);
cJSON * scene_execute(const char *sceneId);
......
......@@ -172,7 +172,7 @@ cJSON *kk_devicestatus_build(kk_map_dev_node_t *node)
status = cJSON_CreateObject();
kk_creater_nodeid(node->deviceCode,1,nodeid);
kk_creater_nodeid(node->deviceCode,1,nodeid,atoi(node->opearteType));
cJSON_AddStringToObject(status, OPCODE_STRING, node->syn_opcode);
cJSON_AddNumberToObject(status, NODEID_STRING, atoi(nodeid));
......
This diff is collapsed.
#ifndef _KK_VOICE_PANEL_CFG_H
#define _KK_VOICE_PANEL_CFG_H
#include "cJSON.h"
#define _OUT
#define _IN
typedef struct{
char nodeId[17];
char name[32];
char ch[8];
char operateType[12];
char room[24];
char mac[24];
char online[6];
char pid[17];
}VP_ZB_DEV_ITEM;
typedef struct{
char id[24];
char name[32];
char room[24];
char type[12];
}VP_SCENE_ITEM;
typedef struct{
char id[24];
char name[32];
}VP_ROOM_ITEM;
typedef struct{
char *ac_gw_nodeId;
char *addr;
char *nodeId;
char *name;
char *operateType;
char *room;
int online;
}VP_AC_INDOOR_ITEM;
typedef struct{
char nodeId[12];
char mac[24];
char name[32];
}VP_GW_ITEM;
typedef struct{
cJSON *controller_buttons_config;
cJSON *gws;
cJSON *infrared_codelib_info;
cJSON *other_devices;
cJSON *rooms;
cJSON *scenes;
cJSON *zigbee_devices;
}VP_CFG_JSON;
int kk_vp_cfg_init(void);
_OUT int kk_vp_syncinfo(_IN cJSON *payload,_IN int ver,_OUT cJSON **root);
#endif
This diff is collapsed.
#ifndef _KK_VOICE_PANEL_HANDLE_H
#define _KK_VOICE_PANEL_HANDLE_H
#include "uart_proto.h"
#include "kk_lan_voice_panel.h"
#include "kk_voice_panel_cfg.h"
#define VP_CONFIG_FILE_MD5 "voice_data.MD5"
#define VP_CONFIG_FILE "/etc/smarthome/voice_data.json"
#define VP_CONFIG_FILE_TAR_GZ "voice_data.tar.gz"
#define OPCODE_8009_SNAPSHOOT 0x1000
#define OPCODE_SNAPSHOOT 0x1001
#define OPCODE_SCENE_ID_NOTIFY 0x1003
#define OPCODE_SYSTEM_TIME_SET 0x1009
#define OPCODE_SYSTEM_TIME_GET 0x100A
#define OPCODE_ACTION_NOTIFY 0x100B
#define OPCODE_CONFIG_FILE_UPDATE_NOTIFY 0x100C
#define OPCODE_CONFIG_DATA_REQUEST 0x100D
#define OPCODE_CONFIG_FILE_UPDATE_STOP 0x100E
#define OPCODE_CONFIG_FILE_INFO_GET 0x100F
#define OPCODE_CONFIG_FILE_UPDATE_STATUS 0x1010
#define EXECUTE_CMD(cmd) do {\
printf("\n[%s][%d]------------------execte cmd------------------\n",__FUNCTION__,__LINE__);\
printf("%s\n",cmd);\
}while(0)
#define VP_SEND_PRINT(format,...) printf("\n\033[33;32m"format"\033[0m\n",##__VA_ARGS__)
#define VP_RECV_PRINT(format,...) printf("\n\033[33;34m"format"\033[0m\n",##__VA_ARGS__)
typedef void (*vp_handle_func)(pro_data_t *pro_data);
typedef struct
{
uint16_t opcode;
vp_handle_func func;
}VP_OPCODE_HANDLE;
int vp_scene_id_map_load(void);
void vp_scene_id_map_deinit(void);
int vp_scene_id_item_add(int scene_id);
//主机快照请求
void vp_8009_snapshoot_get(void);
void kk_vp_set_8009_system_time(void);
void kk_vp_config_file_update_start(uint32_t ver);
void kk_vp_config_file_update_stop(uint32_t ver);
void kk_vp_get_config_file_info(void);
void kk_vp_get_8009_snapshoot(void);
void kk_vp_syncinfo_handle(_IN cJSON *payload);
int kk_vp_opcode_handle(_IN pro_data_t *pro_data);
int _vp_get_cfg_file_crc32(void);
int _vp_get_cfg_file_size(void);
#endif
This diff is collapsed.
#ifndef __UART_PROTO_H__
#define __UART_PROTO_H__
#include <syslog.h>
#include "infra_types.h"
#ifdef __cplusplus
extern "C"
{
#endif
#define GW_LOG(level, fmt, args...) \
do \
{ \
syslog(level, fmt, ##args); \
printf("\n["__FILE__":%d] "fmt,__LINE__, ##args); \
} while(0)
#define GW_LOG_DBG(fmt, args...) GW_LOG(LOG_DEBUG, fmt, ##args)
#define GW_LOG_ERR(fmt, args...) GW_LOG(LOG_ERR, fmt, ##args)
//define protocal field size
#define PRO_SOF_SIZE 2
#define PRO_CONTORL_FIELD_SIZE 1
#define PRO_LEN_SIZE 2
#define PRO_CRC_SIZE 2
#define PRO_SEQ_SIZE 2
#define PRO_MIN_DATA_SIZE 4 // channel(1) + opcode(2) + args(1)
#define PRO_LINK_PAKCET_SIZE 13
#define PRO_APP_PACKET_MIN_SIZE 13
//define field index
#define PRO_SOF_INDEX 0
#define PRO_LEN_INDEX (PRO_SOF_INDEX + PRO_SOF_SIZE)
#define PRO_CF_INDEX (PRO_LEN_INDEX + PRO_LEN_SIZE)
#define PRO_SEQ_INDEX (PRO_CF_INDEX + PRO_CONTORL_FIELD_SIZE)
#define PRO_DATA_INDEX (PRO_SEQ_INDEX + PRO_SEQ_SIZE)
//define SOF
#define PRO_SOF_1 0xAA
#define PRO_SOF_2 0x55
#define DEV_UART_RECV_BUFFER_SIZE 255
#define MAC_ADDR 0x00000
/***************OPCODE*******************/
#define OPCODE_CONNECT_STATUS_QUERY 0x0000 //ͨѶ״̬ѯ
#define OPCODE_BURN_MAC 0x0001
#define OPCODE_READ_MAC 0x0002
#define OPCODE_SET_SN 0x0003
#define OPCODE_GET_SN 0x0004
#define OPCODE_READ_VERSION 0x0005
#define OPCODE_EXIT_SUBBOARD_TEST 0x0006
#define OPCODE_READ_MAC_FROM_FLASH 0x0007
#define OPCODE_SYSTEM_RESTART 0x0008
/*********************************/
typedef enum
{
E_Proto_OK = 0,
E_Proto_ERROR,
} teProto_Status;
typedef struct
{
uint8_t data_len;
uint8_t data[DEV_UART_RECV_BUFFER_SIZE];
} uart_data_t;
typedef enum
{
SOP_STATE1 = 0,
SOP_STATE2,
LENGTH_STATE1,
LENGTH_STATE2,
CONTROL_FIELD_STATE1,
SEQ_STATE1,
SEQ_STATE2,
DATA_STATE,
CRC16_STATE1,
CRC16_STATE2,
} utp_state_t;
typedef struct
{
uint8_t ack;
uint8_t dir;
uint8_t sof_flag;
uint8_t mf_flag;
} control_field_t;
typedef struct
{
uint16_t length;
control_field_t cf;
uint16_t seq;
uint8_t ch;
uint16_t opcode;
uint16_t args_len;
uint8_t arg[256];
} pro_data_t;
int my_system(const char * cmd);
uint32_t make_crc32(uint8_t *msg, uint16_t len);
uint16_t make_crc16(uint8_t *msg, uint16_t len);
uint8_t cf_to_uint8_t(control_field_t *cf);
uint8_t pro_check_uart_frame(uint8_t *data, uint16_t data_len);
void dev_send_uart(uint8_t *data, uint16_t data_len);
int get_proto_frame(uint8_t *data, uint16_t data_len, pro_data_t *pro_data);
void pro_send_link_ack(pro_data_t *pro_data);
uint8_t proto_frame_to_uart(pro_data_t *pro_data, uint8_t *uart_data);
int get_uart_frame(uint8_t * buf,int len);
void uart_frame_handle();
#ifdef __cplusplus
}
#endif
#endif /* __DEV_PROTO_H__ */
......@@ -19,6 +19,7 @@ void kk_sendData2app(void *info, void *payload,int isAsync){
cJSON_AddItemToObject(root, "info", infoObj);
cJSON_AddItemToObject(root, "payload",payloadObj);
buf = cJSON_Print(root);
cJSON_Minify(buf);
if(isAsync){
dm_queue_msg_insert4(buf);
......
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