Просмотр исходного кода

1、解决级联页面不刷新的问题
2、消除部分警告

guohui лет назад: 2
Родитель
Сommit
be90b5d7f7

+ 4 - 2
pro/CMakeLists.txt

@@ -72,7 +72,7 @@ set(PDU_SRC_LIST
 	${PROJECT_SOURCE_DIR}/src/xlist.c
 	${PROJECT_SOURCE_DIR}/src/thread.c
 	${PROJECT_SOURCE_DIR}/src/cascade.c
-        ${PROJECT_SOURCE_DIR}/src/cascade_slave.c
+    ${PROJECT_SOURCE_DIR}/src/cascade_slave.c
 	${PROJECT_SOURCE_DIR}/src/main.c
 
 	${PROJECT_SOURCE_DIR}/src/language_hashmap.c
@@ -83,7 +83,9 @@ set(PDU_SRC_LIST
 	${PROJECT_SOURCE_DIR}/src/hlw8110_handle.c
 	)
 
-
+set(NO_WARNNING_FLAGS "-Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${NO_WARNNING_FLAGS}")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${NO_WARNNING_FLAGS}")
 #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
 #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
 #target_link_options(my_target PRIVATE "-s")

+ 1 - 0
pro/letter/os/shell_port.c

@@ -18,6 +18,7 @@
 // #include <stddef.h>
 // #include <string.h>
 #include <sys/time.h>
+#include <string.h>
 // #include <pthread.h>
 
 Shell shell;

+ 17 - 16
pro/src/app.c

@@ -11,6 +11,7 @@
 #include "sensor_handle.h"
 #include "websocket_handle.h"
 #include "thread.h"
+#include "cascade.h"
 
 #include <sys/mman.h>
 #include <string.h>
@@ -109,8 +110,8 @@ void* power_thread(void* arg)
                                         _globalDeviceManager->_all_ctrl_board[i].product_type,
                                         _globalDeviceManager->_all_ctrl_board[i].product_saddr,
                                         _globalDeviceManager->_all_ctrl_board[i].product_number,
-                                        &_globalDeviceManager->_all_ctrl_board[i]._PowerInfo,
-                                            &_globalDeviceManager->_all_ctrl_board[i]._PowerWarninginfo);
+                                        _globalDeviceManager->_all_ctrl_board[i]._PowerInfo,
+                                            _globalDeviceManager->_all_ctrl_board[i]._PowerWarninginfo);
             if (ret<0)
             {
                 usleep(usleepTime);
@@ -118,8 +119,8 @@ void* power_thread(void* arg)
                                                 _globalDeviceManager->_all_ctrl_board[i].product_type,
                                                 _globalDeviceManager->_all_ctrl_board[i].product_saddr,
                                                 _globalDeviceManager->_all_ctrl_board[i].product_number,
-                                                &_globalDeviceManager->_all_ctrl_board[i]._PowerInfo,
-                                                &_globalDeviceManager->_all_ctrl_board[i]._PowerWarninginfo);
+                                                _globalDeviceManager->_all_ctrl_board[i]._PowerInfo,
+                                                _globalDeviceManager->_all_ctrl_board[i]._PowerWarninginfo);
             }
             // 输入总信息(三相)(后续应同步所有类型)
             if (_globalDeviceManager->_all_ctrl_board[i].product_saddr != 0 && _globalDeviceManager->_all_ctrl_board[i].product_type == TREE_AC_TYPE)
@@ -127,15 +128,15 @@ void* power_thread(void* arg)
                 usleep(usleepTime);
                 ret = g_switch_get_t_ac_in_info(&_globalDeviceManager->_globalRelaySampManger,
                                                 _globalDeviceManager->_all_ctrl_board[i].product_saddr, // saadr
-                                                &_globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo,
-                                                &_globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerWarninginfo);
+                                                _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo,
+                                                _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerWarninginfo);
                 if (ret < 0)
                 {
                     usleep(usleepTime);
                     ret = g_switch_get_t_ac_in_info(&_globalDeviceManager->_globalRelaySampManger,
                                                     _globalDeviceManager->_all_ctrl_board[i].product_saddr, // saadr
-                                                    &_globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo,
-                                                    &_globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerWarninginfo);
+                                                    _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo,
+                                                    _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerWarninginfo);
                 }
             }            
             usleep(usleepTime);
@@ -222,7 +223,7 @@ void* power_thread(void* arg)
                     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
                     memset(_globalPowerInfo.samp_time,0,sizeof(_globalPowerInfo.samp_time));
                     strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
-                    sprintf(buffer,".%03d",tv.tv_usec/1000);
+                    sprintf(buffer,".%03ld",tv.tv_usec/1000);
                     strcat(_globalPowerInfo.samp_time,buffer);
 
                     if (difftime(now,_globalPowerMangerTemp->product_log_time)>(sSaveTime/1000))
@@ -327,7 +328,7 @@ void* power_thread(void* arg)
 
                     memset(_globalPowerInfo.samp_time,0,sizeof(_globalPowerInfo.samp_time));
                     strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
-                    sprintf(buffer,".%03d",tv.tv_usec/1000);
+                    sprintf(buffer,".%03ld",tv.tv_usec/1000);
                     strcat(_globalPowerInfo.samp_time,buffer);
 
                     // sprintf(_globalPowerInfo.samp_time,"%04d-%02d-%02d %02d:%02d:%02d.%03d",
@@ -409,7 +410,7 @@ void* power_thread(void* arg)
                         strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
                         memset(_globalPowerInfo.samp_time, 0, sizeof(_globalPowerInfo.samp_time));
                         strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
-                        sprintf(buffer, ".%03d", tv.tv_usec / 1000);
+                        sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
                         strcat(_globalPowerInfo.samp_time, buffer);
 
                         if (difftime(now, _pTreeACPowerMangerTemp->product_log_time) > (sSaveTime / 1000))
@@ -450,7 +451,7 @@ void* power_thread(void* arg)
                     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
                     memset(_globalPowerInfo.samp_time,0,sizeof(_globalPowerInfo.samp_time));
                     strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
-                    sprintf(buffer,".%03d",tv.tv_usec/1000);
+                    sprintf(buffer,".%03ld",tv.tv_usec/1000);
                     strcat(_globalPowerInfo.samp_time,buffer);
 
                     // sprintf(_globalPowerInfo.samp_time,"%04d-%02d-%02d %02d:%02d:%02d.%03d",
@@ -618,7 +619,7 @@ void* power_thread(void* arg)
                 strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
                 memset(_globalPowerInfo.samp_time, 0, sizeof(_globalPowerInfo.samp_time));
                 strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
-                sprintf(buffer, ".%03d", tv.tv_usec / 1000);
+                sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
                 strcat(_globalPowerInfo.samp_time, buffer);
                 if (difftime(now, _pTreeACPowerMangerTemp->product_log_time) > (sSaveTime / 1000))
                 {
@@ -636,7 +637,7 @@ void* power_thread(void* arg)
         //插入总电源信息
         gettimeofday(&tv, &tz);
         t = localtime(&tv.tv_sec);
-        sprintf(_globalTotalPowerInfo.samp_time,"%04d-%02d-%02d %02d:%02d:%02d.%03d",
+        sprintf(_globalTotalPowerInfo.samp_time,"%04d-%02d-%02d %02d:%02d:%02d.%03ld",
         t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec,tv.tv_usec/1000);
         //更新总电源信息
 
@@ -900,7 +901,7 @@ void* sensor_thread(void* arg)
             strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
             memset(_globalSensorMangerTemp->Cur_sensor_info.samp_time, 0, sizeof(_globalSensorMangerTemp->Cur_sensor_info.samp_time));
             strftime(_globalSensorMangerTemp->Cur_sensor_info.samp_time, sizeof(_globalSensorMangerTemp->Cur_sensor_info.samp_time), "%Y-%m-%d %H:%M:%S", t);
-            sprintf(buffer, ".%03d", tv.tv_usec / 1000);
+            sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
             strcat(_globalSensorMangerTemp->Cur_sensor_info.samp_time, buffer);
             if (difftime(now, _globalSensorMangerTemp->Cur_sensor_info.product_log_time) > (30000 / 1000))
             {
@@ -1234,7 +1235,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
         _globalDeviceManager->_globalPowerManger.product_saddr = 0 ;
         _globalDeviceManager->_globalPowerManger.product_ch_id = 0;
         _globalDeviceManager->_globalPowerManger.product_ch_addr = 0;
-        sprintf( _globalDeviceManager->_globalPowerManger.product_ch_name,"ALL_CH",_globalDeviceManager->_globalPowerManger.product_ch_id);
+        sprintf( _globalDeviceManager->_globalPowerManger.product_ch_name,"ALL_CH");//,_globalDeviceManager->_globalPowerManger.product_ch_id);
         _globalDeviceManager->_globalPowerManger.product_ch_type = type;
         _globalDeviceManager->_globalPowerManger.product_ch_status = 0;
         _globalDeviceManager->_globalPowerManger.product_ch_start_delay = 1000;     

+ 36 - 64
pro/src/appweb_handle.c

@@ -10,6 +10,9 @@
 #include "cfg.h"
 #include "cascade.h"
 #include "language_common.h"
+#include "websocket_handle.h"
+
+
 #define WEB_DEBUG 1
 
 typedef void (*http_fn_t)(void *arg);
@@ -107,7 +110,7 @@ static int http_reply(void *conn, int status, char *ack)
 static void httpAddCallback(char *uri, http_fn_t f)
 {
 #ifdef USE_WEBAPP
-    httpDefineAction(uri, f);
+    httpDefineAction(uri, (HttpAction)f);
 #else
     mg_handle_t *h=&webHandle.mg;
     if(h->cnt<FN_MAX-1) {
@@ -131,11 +134,11 @@ static void *web_thread(void *arg)
     rc = MPR_ERR_CANT_CREATE;
     if ((mpr = mprCreate(0, NULL, MPR_USER_EVENTS_THREAD)) == 0) {
         mprError("Cannot create runtime");
-        return -1;
+        return NULL;
     }
     if (httpCreate(HTTP_CLIENT_SIDE | HTTP_SERVER_SIDE) == 0) {
         mprError("Cannot create the HTTP services");
-        return -1;
+        return NULL;
     }
     
     mprStart();
@@ -144,7 +147,7 @@ static void *web_thread(void *arg)
     log_d("____ web root: %s\n", path);
     if (maParseConfig(path) < 0) {
         mprError("Cannot parse the config file %s", ME_CONFIG_FILE);
-        return -1;
+        return NULL;
     }
 
     webSetCallback();
@@ -152,7 +155,7 @@ static void *web_thread(void *arg)
     
     if (httpStartEndpoints() < 0) {
         mprError("Cannot start the web server");
-        return -1;
+        return NULL;
     }
     mprServiceEvents(-1, 0);
     mprDestroy();
@@ -351,7 +354,7 @@ static void changeLanguages(void* conn)
 
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s);
+    rx_body_buf = (char*)httpGetBodyInput(s);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
     struct mg_http_message *msg=s->ev_data;
@@ -455,7 +458,7 @@ static void loginOutFunc(void* conn)
 	
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s);
+    rx_body_buf = (char*)httpGetBodyInput(s);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
     struct mg_http_message *msg=s->ev_data;
@@ -519,7 +522,7 @@ static void overallStatusMonitoring(void* conn)
 
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s);
+    rx_body_buf = (char*)httpGetBodyInput(s);
     usleep(500000);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
@@ -960,7 +963,7 @@ static void channelStatusMonitoring(void* conn)
 
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s);
+    rx_body_buf = (char*)httpGetBodyInput(s);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
     struct mg_http_message *msg=s->ev_data;
@@ -996,8 +999,6 @@ static void channelStatusMonitoring(void* conn)
             //ResetChmData();
             //__globalDeviceManage._ReloadChm_flag=false;
         }
-        
-
 
         GlobalPowerInfo _powerInfo;
         GlobalPowerManger* _globalPowerMangerTemp = NULL ;
@@ -1016,20 +1017,11 @@ static void channelStatusMonitoring(void* conn)
             cmd.chId = _over_chn_pwr_request.productChId;
             cascade_request(&cmd);
 
-            ack_str = ctrl_sts_ack_to_json();
             goto quit;
         }
 
-        if(_over_chn_pwr_request.productChId==NULL)
-        {
-            //log_d("param no chn id.");
-        }
-        else
-        {
-            // product_chn_id = strtol(_over_chn_pwr_request.productChId,NULL,10);
-            product_chn_id = _over_chn_pwr_request.productChId;
-            log_d("product_chn_id:%d",product_chn_id);
-        }
+        product_chn_id = _over_chn_pwr_request.productChId;
+        
         _OverChnPwrAckInfo _over_chn_pwr_back_info;
         INIT_LIST_HEAD(&_over_chn_pwr_back_info.list);
         #if(1)
@@ -1060,10 +1052,8 @@ static void channelStatusMonitoring(void* conn)
                 log_e("_overChnPwrBackInfoTemp malloc err.");
             }
             //查询数据库总电源信息
-            if(dev_search_latest_power_info(__globalDeviceManage.db,
-            __globalDeviceManage._global_device_info->product_id,
-            product_chn_id,
-            &_powerInfo)!=0)
+            if(dev_search_latest_power_info(__globalDeviceManage.db, __globalDeviceManage._global_device_info->product_id,
+                                            product_chn_id, &_powerInfo)!=0)
             {
                 log_e("serach total pwr err.");
             }
@@ -1499,7 +1489,7 @@ static void sensorStatusMonitoring(void* conn)
 
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s);
+    rx_body_buf = (char*)httpGetBodyInput(s);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
     struct mg_http_message *msg=s->ev_data;
@@ -1608,15 +1598,7 @@ static void sensorStatusMonitoring(void* conn)
     else if(strcmp(_over_all_sensor_request.type,"delete")==0)
     {
         log_d("start delete handle.");
-        int sensor_id_temp = 0 ;
-        if(_over_all_sensor_request.sensorId!=NULL)
-        {
-            sensor_id_temp = strtol(_over_all_sensor_request.sensorId,NULL,10);
-        }    
-        else
-        {
-            sensor_id_temp = 0 ;
-        }
+        int sensor_id_temp = _over_all_sensor_request.sensorId;
 
         if(dev_delete_sensor_manage(__globalDeviceManage.db, 1,sensor_id_temp)!=0)
         {
@@ -1642,14 +1624,8 @@ static void sensorStatusMonitoring(void* conn)
     {
         log_d("start update handle.");
         int sensor_id_temp = 0 ;
-        if(_over_all_sensor_request.sensorId!=NULL)
-        {
-            sensor_id_temp = _over_all_sensor_request.sensorId;
-        }
-        else
-        {
-            sensor_id_temp = 0;
-        }
+        sensor_id_temp = _over_all_sensor_request.sensorId;
+
         GlobalSensorManger *node = NULL;
         GlobalSensorManger *next = NULL;
         list_for_each_entry_safe(node, next, &__globalDeviceManage._globalSensorManger.list, list)
@@ -1768,14 +1744,8 @@ static void sensorStatusMonitoring(void* conn)
         memset(_globalSensorMangerTemp, 0, sizeof(GlobalSensorManger));
         //填充数据
         _globalSensorMangerTemp->product_id = __globalDeviceManage._global_device_info->product_id ;
-        if(_over_all_sensor_request.sensorId!=NULL)
-        {
-            _globalSensorMangerTemp->sensor_id = strtol(_over_all_sensor_request.sensorId,NULL,10);
-        }    
-        else
-        {
-             _globalSensorMangerTemp->sensor_id = 0 ;
-        }
+         _globalSensorMangerTemp->sensor_id = _over_all_sensor_request.sensorId;
+        
         _globalSensorMangerTemp->sensor_type = strtol(_over_all_sensor_request.sensorType,NULL,10);
         strcpy( _globalSensorMangerTemp->sensor_name,_over_all_sensor_request.sensorName);
         strcpy(_globalSensorMangerTemp->sensor_port_name,_over_all_sensor_request.comSlogan);
@@ -1793,7 +1763,7 @@ static void sensorStatusMonitoring(void* conn)
             case 6:_globalSensorMangerTemp->sensor_val_count = 0 ;break; //空调遥控器 没有值
         }
         //插入数据库
-        if(dev_insert_sensor_genera_manage(__globalDeviceManage.db,&_globalSensorMangerTemp)!=0)
+        if(dev_insert_sensor_genera_manage(__globalDeviceManage.db,_globalSensorMangerTemp)!=0)
         {
             log_e("dev insert error.");
         }
@@ -1983,7 +1953,7 @@ static void alarmProtect(void *conn)
     
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s);
+    rx_body_buf = (char*)httpGetBodyInput(s);
     usleep(100000);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
@@ -2261,7 +2231,7 @@ static void logInformation(void *conn)
     
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s);
+    rx_body_buf = (char*)httpGetBodyInput(s);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
     struct mg_http_message *msg=s->ev_data;
@@ -2456,7 +2426,7 @@ static void communicationManagement(void *conn)
 #ifdef USE_WEBAPP
     usleep(100000);
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s);
+    rx_body_buf = (char*)httpGetBodyInput(s);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
     struct mg_http_message *msg=s->ev_data;
@@ -2556,7 +2526,7 @@ static void serviceManagement(HttpStream *stream)
 
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s);
+    rx_body_buf = (char*)httpGetBodyInput(s);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
     struct mg_http_message *msg=s->ev_data;
@@ -2567,7 +2537,7 @@ static void serviceManagement(HttpStream *stream)
     cjson = json_to_service_manage(rx_body_buf,&_serviceManageRequestInfo);
     if(cjson==NULL)
     {
-        http_reply(conn, NULL, 400);
+        http_reply(conn, 400, NULL);
         return ;        
     }
     //查询smtp信息
@@ -2811,9 +2781,11 @@ static void serviceManagement(HttpStream *stream)
             {
                 // 当前日期
 
-                _PowerDSManage_t *new_data = (_PowerDSManage_t *)malloc(sizeof(_PowerDSManage_t));
-                // 清空数据
-                memset(new_data, 0, sizeof(new_data));
+                _PowerDSManage_t *new_data = (_PowerDSManage_t *)calloc(1, sizeof(_PowerDSManage_t));
+                if(!new_data) {
+                    log_e("___ new_data calloc failed!\n");
+                    break;
+                }
                 strcpy(new_data->ds_date, current_date);
                 strcpy(new_data->ds_time, _serviceManageRequestInfo._ds_info.channelTime);
                 new_data->set_stats = atoi(_serviceManageRequestInfo._ds_info.setStatus);
@@ -2853,7 +2825,7 @@ static void serviceManagement(HttpStream *stream)
             {
                 break;
             }
-            sscanf(pCharData, "%d %s %s", &nChID, &pcDate, &pcTime);
+            sscanf(pCharData, "%d %s %s", &nChID, pcDate, pcTime);
             list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
             {
                 if (_globalPowerMangerTemp->product_ch_id == nChID)
@@ -3279,7 +3251,7 @@ static void systemManagent(void *conn)
 
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s);
+    rx_body_buf = (char*)httpGetBodyInput(s);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
     struct mg_http_message *msg=s->ev_data;
@@ -3444,7 +3416,7 @@ static void equipmentMintenance(void *conn)
 
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
-    rx_body_buf = httpGetBodyInput(s); 
+    rx_body_buf = (char*)httpGetBodyInput(s); 
     usleep(500000);
 #else
     mg_stream_t *s=(mg_stream_t*)conn;

+ 225 - 172
pro/src/cascade.c

@@ -30,10 +30,9 @@
 
 
 
-
-
 int cur_dev_addr=1;
 static cascade_handle_t casHandle={.inited=0};
+static void* cmd_thread(void *arg);
 
 //////////////////////////////////////////////////
 static inline GlobalDeviceManager* get_dm(void)
@@ -74,15 +73,30 @@ static int slave_init(cascade_handle_t *cas)
 }
 static int slave_add(cascade_handle_t *cas, int addr)
 {
+    if(addr<=0) {
+        return -1;
+    }
+
     cas->slaves[addr].addr = addr;
     cas->slaves[addr].err  = 0;
     return 0;
 }
+static int slave_rm(cascade_handle_t *cas, int addr)
+{
+    if(addr<=0) {
+        return -1;
+    }
+
+    cas->slaves[addr].addr = -1;
+    cas->slaves[addr].err  = 0;
+    return 0;
+}
+
 static int slave_cnt(cascade_handle_t *cas)
 {
     int i,cnt=0;
     for(i=1; i<=CASCADE_MAX; i++) {
-        if(cas->slaves[i].addr>=0) {
+        if(cas->slaves[i].addr>0) {
             cnt++;
         }
     }
@@ -94,7 +108,7 @@ static slave_t* slave_get(cascade_handle_t *cas, int addr)
 }
 static int slave_find(cascade_handle_t *cas, int addr)
 {
-    if(cas->slaves[addr].addr>=0) {
+    if(cas->slaves[addr].addr>0) {
         return 1;
     }
     return 0;
@@ -262,13 +276,40 @@ static int mb_deinit(cascade_handle_t *cas)
     g_modbus_deinit(&cas->m);
     return 0;
 }
+static int _mb_scan(cascade_handle_t *cas, int addr)
+{
+    uint16_t tmp;
+    return g_modbus_read_x_reg(&cas->m, addr, CASCADE_REG_SCAN, 1, &tmp);
+}
 static int _mb_read(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int cnt)
 {
-    return g_modbus_read_x_reg(&cas->m, addr, reg, cnt, data);
+    int r;
+    r = g_modbus_read_x_reg(&cas->m, addr, reg, cnt, data);
+    if(r<0) {
+        cas->slaves[addr].err++;
+        if(cas->slaves[addr].err>ERR_MAX) {
+            slave_rm(cas, addr);
+        }
+    }
+    else {
+        cas->slaves[addr].err = 0;
+    }
+    return r;
 }
 static int _mb_write(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int cnt)
 {
-    return g_modbus_write_x_reg(&cas->m, addr, reg, cnt, data);
+    int r;
+    r = g_modbus_write_x_reg(&cas->m, addr, reg, cnt, data);
+    if(r<0) {
+        cas->slaves[addr].err++;
+        if(cas->slaves[addr].err>ERR_MAX) {
+            slave_rm(cas, addr);
+        }
+    }
+    else {
+        cas->slaves[addr].err = 0;
+    }
+    return r;
 }
 static int _mb_recv(cascade_handle_t *cas, uint8_t *buf)
 {
@@ -320,6 +361,18 @@ static void memcpy_swap(uint8_t *dst, uint8_t *src, int len)
         dst[i+1] = src[i];
     }
 }
+static int print_hdr(char *s, mb_hdr_t *h)
+{
+    LOGD("____%s___ h.addr: %d\n", s, h->addr);
+    LOGD("____%s___ h.func: %d\n", s, h->func);
+    LOGD("____%s___ h.reg: %d\n",  s, h->reg);
+    LOGD("____%s___ h.regcnt: %d\n", s, h->regcnt);
+    LOGD("____%s___ h.dlen: %d\n", s, h->dlen);
+    LOGD("____%s___ h.data: %d\n", s, h->data);
+    LOGD("\n");
+
+    return 0;
+}
 static int mb_hdr(uint8_t *data, int datalen, mb_hdr_t *h)
 {
     h->addr = data[0];
@@ -335,6 +388,7 @@ static int mb_hdr(uint8_t *data, int datalen, mb_hdr_t *h)
 
         memswap(h->data, h->dlen+h->dlen%2);
     }
+    //print_hdr("sss", h);
 
     return 0;
 }
@@ -406,8 +460,7 @@ static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
         memcpy(buff, d->data+wlen, xlen);
         r = _mb_write(cas, addr, CASCADE_REG_WRITE, buff, xlen/2);
         if(r<0) {
-            //LOGE("___ _mb_write, addr: %d, reg: %d, cnt: %d\n", addr, CASCADE_REG_WRITE, xlen/2);
-            LOGE("___ _mb_write failed, errno: %d, %s\n", errno, modbus_strerror(errno));
+            LOGE("___ _mb_write, addr: %d, reg: %d, cnt: %d, %s\n", addr, CASCADE_REG_WRITE, xlen/2, modbus_strerror(errno));
             return -1;
         }
         if(wlen+r*2>=d->dlen) {
@@ -434,19 +487,17 @@ static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd
 }
 static int mb_receive(cascade_handle_t *cas)
 {
-    int r=0,rlen=0;
+    int r=-1,rc,rlen=0;
     mb_hdr_t h;
-    board_info_t        info;
-    modbus_mapping_t *map=NULL;
     uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
-    static int precmd=-1;
     static int sendlen=0;
+    cmd_data_t *cmd=NULL;
     
-    r = _mb_recv(cas, buff);
-    if(r<0) {
+    rc = _mb_recv(cas, buff);
+    if(rc<0) {
         return -1;
     }
-    mb_hdr(buff, r, &h);
+    mb_hdr(buff, rc, &h);
 
 #if 1
     //do not know why slave can receive all address data
@@ -454,64 +505,33 @@ static int mb_receive(cascade_handle_t *cas)
         return -1;
     }
 #endif
-    //LOGD("____ slave recv, reg: %d\n", h.reg);
 
-    //如果是非自定义寄存器则跳出
-    if(h.reg==CASCADE_REG_READ || h.reg==CASCADE_REG_WRITE) {
-        if(h.data) {
-            cmd_data_t *cmd = (cmd_data_t*)h.data;
-            cas->cmd = *cmd;
-
-            precmd  = cmd->cmd;
-            sendlen = 0;
+    switch(h.reg) {
+        case CASCADE_REG_SCAN:
+        {
+            r = _mb_reply(cas, buff, rc, cas->map2);
         }
+        break;
+
+        case CASCADE_REG_WRITE:
+        {
+            if(h.data) {
+                cmd = (cmd_data_t*)h.data;
+                if(cmd->cmd>=CASCADE_CMD_GET_INFO) {
+                    cas->cmd = *cmd;
+                }
+                sendlen = 0;
+            }
 
-        if(h.reg==CASCADE_REG_WRITE) {
-            switch(cas->cmd.cmd) {
+            switch(cmd->cmd) {
                 case CASCADE_CMD_OPEN:
                 case CASCADE_CMD_CLOSE:
                 {
-                    int i,t=0;
-                    char buff[80];
-                    board_info_t *info=&cas->info;
-                    GlobalDeviceManager *dm=get_dm();
-
-                    if(cas->cmd.cmd==CASCADE_CMD_OPEN) {
-                        LOGD("____ slave CASCADE_CMD_OPEN\n");
-                    }
-                    else {
-                        LOGD("____ slave CASCADE_CMD_CLOSE\n");
-                    }
-
-                    int flag=(cas->cmd.cmd==CASCADE_CMD_OPEN)?1:0;
-                    if(cas->cmd.chId == 0xff) {
-                        for(i=0; i<info->cnt; i++) {
-                            if(info->channel[i].addr>0) {
-                                t = g_switch_set_all_ctrl(&dm->_globalRelaySampManger, info->channel[i].type, info->channel[i].addr, flag);
-                                if(t) {
-                                    LOGE("___ %d %s failed\n", info->channel[i].addr, (cas->cmd.cmd==CASCADE_CMD_OPEN)?"open":"close");
-                                }
-                            }
-                        }
-                    }
-                    else {
-                        GlobalPowerManger *tmp=NULL;
-                        list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
-                        {
-                            if(tmp->product_ch_id==cas->cmd.chId) {
-                                t = g_switch_set_all_chn_ctrl(&dm->_globalRelaySampManger, tmp, tmp->product_saddr, tmp->product_ch_addr, flag, false);
-                                break;
-                            }
-                        }
+                    cmd_data_t *pcmd=malloc(sizeof(cmd_data_t));
+                    if(pcmd) {
+                        *pcmd = *cmd;
+                        thread_start_simp(cmd_thread, pcmd, 4*MB);
                     }
-
-                    if(cas->cmd.cmd==CASCADE_CMD_OPEN) {
-                        sprintf(buff,"$开启$|$所有$|$通道$");
-                    }
-                    else {
-                        sprintf(buff,"$关闭$|$所有$|$通道$");
-                    }
-                    dev_insert_alarm_ctrl(dm->db, dm->_global_device_info->product_id,3,buff);
                 }
                 break;
 
@@ -523,82 +543,72 @@ static int mb_receive(cascade_handle_t *cas)
                 break;
             }
 
-            r = _mb_reply(cas, buff, r, cas->map2);
+            r = _mb_reply(cas, buff, rc, cas->map2);
         }
-        else {
-            if(h.regcnt==1) {
-                LOGD("____ CASCADE SCAN\n");
-                r = _mb_reply(cas, buff, r, cas->map2);
-            }
-            else {
+        break;
+
+        case CASCADE_REG_READ:
+        {
+            cmd = &cas->cmd;
 
-                LOGD("____ CASCADE_REG_READ %d\n", cas->cmd.cmd);
-                switch(cas->cmd.cmd) {
+            //LOGD("____ CASCADE_REG_READ %d\n", cmd->cmd);
+            switch(cmd->cmd) {
 
-                    case CASCADE_CMD_GET_INFO:
-                    {
-                        LOGD("_____ slave CASCADE_CMD_GET_INFO\n");
-                        slave_get_info(cas, 0);      //hardread will cost long time
-                        memcpy(cas->map2->tab_registers+(h.reg-CASCADE_REG_OFFSET), (char*)&cas->info+sendlen, h.regcnt*2);
-                    }
-                    break;
-
-                    case CASCADE_CMD_QUERY_CH:
-                    {
-                #if 0
-                        if(cas->cmd.obj==OBJ_OVERALL) {
-                            LOGD("___ slave CASCADE_CMD_QUERY_CH, overall\n");
-
-                            slave_get_all_data(cas);
-                            memcpy(cas->map2->tab_registers+(h.reg-CASCADE_REG_OFFSET), ((char*)&cas->allInfo)+sendlen, h.regcnt*2);
-                        }
-                        else
-                #endif
-                        {
-                            LOGD("___ slave CASCADE_CMD_QUERY_CH, channel\n");
-
-                            slave_get_ch_data(cas);
-                            memcpy(cas->map2->tab_registers+(h.reg-CASCADE_REG_OFFSET), ((char*)&cas->chInfo)+sendlen, h.regcnt*2);
-                        }
-                    }
-                    break;
-
-                    case CASCADE_CMD_QUERY_VOL:break;
-                    case CASCADE_CMD_QUERY_CUR:break;
-                    case CASCADE_CMD_QUERY_PWR:break;
-                    case CASCADE_CMD_QUERY_PWRQ:break;
-                    case CASCADE_CMD_QUERY_HIS:break;
-                    case CASCADE_CMD_QUERY_TOTAL:break;
-                    case CASCADE_CMD_QUERY_TOTAL_PWR:break;
+                case CASCADE_CMD_GET_INFO:
+                {
+                    LOGD("_____ slave CASCADE_CMD_GET_INFO\n");
+                    slave_get_info(cas, 0);      //hardread will cost long time
+                    memcpy(cas->map2->tab_registers+(h.reg-CASCADE_REG_OFFSET), (char*)&cas->info+sendlen, h.regcnt*2);
                 }
+                break;
+
+                case CASCADE_CMD_QUERY_CH:
+                {
+                    LOGD("___ slave CASCADE_CMD_QUERY_CH\n");
 
-                r = _mb_reply(cas, buff, r, cas->map2);
-                if(r>0) {
-                    sendlen += h.regcnt*2;
-                    //LOGD("____  slave sendlen: %d, h.dlen: %d, r: %d\n", sendlen, h.dlen, r);
+                    slave_get_ch_data(cas);
+                    memcpy(cas->map2->tab_registers+(h.reg-CASCADE_REG_OFFSET), ((char*)&cas->chInfo)+sendlen, h.regcnt*2);
                 }
+                break;
+
+                case CASCADE_CMD_QUERY_VOL:break;
+                case CASCADE_CMD_QUERY_CUR:break;
+                case CASCADE_CMD_QUERY_PWR:break;
+                case CASCADE_CMD_QUERY_PWRQ:break;
+                case CASCADE_CMD_QUERY_HIS:break;
+                case CASCADE_CMD_QUERY_TOTAL:break;
+                case CASCADE_CMD_QUERY_TOTAL_PWR:break;
+            }
+
+            r = _mb_reply(cas, buff, rc, cas->map2);
+            if(r>0) {
+                sendlen += h.regcnt*2;
+                //LOGD("____  slave sendlen: %d, h.dlen: %d, r: %d\n", sendlen, h.dlen, r);
             }
         }
-    }
-    else {
-        Modbus_Manger *mm=&get_dm()->_globalRelaySampManger;
+        break;
+
+        default:
+        {
+            Modbus_Manger *mm=&get_dm()->_globalRelaySampManger;
 
-        LOGD("___ slave XXXXXXXXXXX\n");
+            LOGD("___ slave XXXXXXXXXXX\n");
 
-        if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
-            cascade_slave_read(cas, h.reg, h.regcnt);
-        }
-        else if(h.func==MODBUS_FC_WRITE_SINGLE_REGISTER) {
-            cascade_slave_write(cas, h.reg, h.regcnt);
-        }
+            if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
+                cascade_slave_read(cas, h.reg, h.regcnt);
+            }
+            else if(h.func==MODBUS_FC_WRITE_SINGLE_REGISTER) {
+                cascade_slave_write(cas, h.reg, h.regcnt);
+            }
 
-        r = _mb_reply(cas, buff, r, cas->map);
+            r = _mb_reply(cas, buff, rc, cas->map);
+        }
     }
 
     return r ;
 }
 /////////////////////////////////////////////////////////////////////////
-static int cascade_scan(cascade_handle_t *cas)
+static int master_scan(cascade_handle_t *cas)
 {
     int i,r=0 ;
     uint16_t tmp[10];
@@ -608,7 +618,7 @@ static int cascade_scan(cascade_handle_t *cas)
     }
 
     if(!slave_find(cas, cas->scanAddr)) {
-         r = _mb_read(cas, cas->scanAddr, CASCADE_REG_READ, tmp, 1);
+         r = _mb_scan(cas, cas->scanAddr);
         if(r>0) {
             LOGD("____ find a slave, addr: %d\n", cas->scanAddr);
             slave_add(cas, cas->scanAddr);
@@ -674,7 +684,7 @@ static int power_add(cascade_handle_t *cas)
     GlobalPowerManger* pm=NULL;
     board_info_t *info=&cas->info;
 
-    LOGD("__**___ master add channel to the list, cnt: %d\n", info->cnt);
+    LOGD("____ master add channel to the list, cnt: %d\n", info->cnt);
     cascade_lock();
 
     power_clear(cas);
@@ -732,8 +742,10 @@ static int power_ch_update(cascade_handle_t *cas)
     power_info_t *power=cas->chInfo.power;
 
     if(cas->chInfo.cnt==0 || list_empty(&dm2->_globalPowerManger.list)) {
+        LOGE("___ chInfo.cnt is 0\n");
         return -1;
     }
+    //LOGD("___ chInfo.info[0].status: %d\n", power[0].pwrinfo.status);
 
     list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
     {
@@ -804,7 +816,7 @@ static int power_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
 }
 
 #define REGS(x)    (((x)+(x)%2)/2)
-static int master_request(cascade_handle_t *cas, cmd_data_t *cmd)
+static int master_cmd(cascade_handle_t *cas, cmd_data_t *cmd)
 {
     int i,r;
     GlobalPowerManger *tmp=NULL;
@@ -825,7 +837,7 @@ static int master_request(cascade_handle_t *cas, cmd_data_t *cmd)
         {
             LOGD("____ master CMD: %d\n", cmd->cmd);
 
-            wdata.dlen = sizeof(*cmd);
+            wdata.dlen = sizeof(cmd_data_t);
             wdata.data = (uint8_t*)cmd;
             r = mb_write(cas, cur_dev_addr, &wdata);
         }
@@ -833,25 +845,32 @@ static int master_request(cascade_handle_t *cas, cmd_data_t *cmd)
 
         case CASCADE_CMD_GET_INFO:
         {
-            wdata.dlen = sizeof(*cmd);
+            wdata.dlen = sizeof(cmd_data_t);
             wdata.data = (uint8_t*)cmd;
 
-            rdata.dlen = sizeof(cas->info);
-            rdata.data = (uint8_t*)&cas->info;
+            rdata.dlen = 1;
+            rdata.data = (uint8_t*)&cas->info.cnt;
 
             LOGD("_____ master send CASCADE_CMD_GET_INFO\n");
             r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
             if(r==0) {
-                power_add(cas);
+                LOGD("______cas->info.cnt: %d\n", cas->info.cnt);
+                rdata.dlen = sizeof(cas->info.cnt);
+                rdata.data = (uint8_t*)&cas->info;
+                r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
+                if(r==0) {
+                    power_add(cas);
+                }
             }
             else {
-                LOGE("_____ master request CASCADE_CMD_GET_INFO failed\n");
+                LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
             }
         }
         break;
 
         default:
-        return -1;
+        cas->cmd = *cmd;
+        r = 0;
     }
 
     return r;
@@ -861,7 +880,7 @@ static int master_query(cascade_handle_t *cas)
     int i,r;
     GlobalPowerManger *tmp=NULL;
     GlobalDeviceManager *dm2=get_dm2();
-    GlobalDeviceInfo    *dev=&dm2->_global_device_info;
+    GlobalDeviceInfo    *dev=dm2->_global_device_info;
     cmd_data_t *cmd=&cas->cmd;
     data_t rdata,wdata;
 
@@ -876,28 +895,22 @@ static int master_query(cascade_handle_t *cas)
 
         case CASCADE_CMD_QUERY_CH:
         {
-            //LOGD("____ master query CASCADE_CMD_QUERY_CH\n");
+            //LOGD("____ master query CASCADE_CMD_QUERY_CH, cnt: %d\n", cas->info.cnt);
             if(cas->info.cnt==0) {
                 return -1;
             }
 
-#if 0
-            if(cmd->obj==OBJ_OVERALL) {
-                rdata.dlen = sizeof(PowerInfo);
-                rdata.data = (uint8_t*)cas->allInfo.info;
-            }
-            else
-#endif
-            {
-                cas->chInfo.cnt = 0;
-                rdata.dlen = sizeof(uint8_t)+sizeof(power_info_t)*cas->info.cnt;
-                rdata.data = (uint8_t*)&cas->chInfo;
-            }
+            cas->chInfo.cnt = 0;
+            rdata.dlen = sizeof(uint8_t)+sizeof(power_info_t)*cas->info.cnt;
+            rdata.data = (uint8_t*)&cas->chInfo;
             
             r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
             if(r==0) {
                 power_ch_update(cas);
             }
+            else {
+                LOGE("____ master query CASCADE_CMD_QUERY_CH failed\n");
+            }
         }
         break;
 
@@ -1014,6 +1027,7 @@ static int master_query(cascade_handle_t *cas)
         break;
 
         default:
+        LOGD("____ master query cmd: %d\n", cmd->cmd);
         return -1;
     }
 
@@ -1054,13 +1068,70 @@ static void* scan_thread(void *arg)
     
     while(h->quit==0) {
         if(get_mb()->product_modbus_type==0) {  //master
-            r = cascade_scan(cas);
+            r = master_scan(cas);
         }
         sleep(1);
     }
 
     pthread_exit(NULL);
 }
+static void* cmd_thread(void *arg)
+{
+    int i,t=0;
+    char temp[100];
+    cascade_handle_t *cas=&casHandle;
+    board_info_t *info=&cas->info;
+    GlobalDeviceManager *dm=get_dm();
+    cmd_data_t *pcmd=(cmd_data_t*)arg;
+
+    if(pcmd->cmd==CASCADE_CMD_OPEN) {
+        LOGD("____ slave CASCADE_CMD_OPEN\n");
+    }
+    else {
+        LOGD("____ slave CASCADE_CMD_CLOSE\n");
+    }
+
+    int flag=(pcmd->cmd==CASCADE_CMD_OPEN)?1:0;
+    if(pcmd->chId == 0xff) {
+        int sendAddr = 0;
+        for(i=0; i<info->cnt; i++) {
+            if(info->channel[i].addr>0) {
+                if(info->channel[i].addr==sendAddr) {
+                    continue;
+                }
+                else {
+                    sendAddr = info->channel[i].addr;
+                }
+
+                t = g_switch_set_all_ctrl(&dm->_globalRelaySampManger, info->channel[i].type, info->channel[i].addr, flag);
+                if(t<0) {
+                    LOGE("___ %d %s failed\n", info->channel[i].addr, (pcmd->cmd==CASCADE_CMD_OPEN)?"open":"close");
+                }
+            }
+        }
+    }
+    else {
+        GlobalPowerManger *tmp=NULL;
+        list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
+        {
+            if(tmp->product_ch_id==pcmd->chId) {
+                t = g_switch_set_all_chn_ctrl(&dm->_globalRelaySampManger, tmp, tmp->product_saddr, tmp->product_ch_addr, flag, false);
+                break;
+            }
+        }
+    }
+
+    if(pcmd->cmd==CASCADE_CMD_OPEN) {
+        sprintf(temp,"$开启$|$所有$|$通道$");
+    }
+    else {
+        sprintf(temp,"$关闭$|$所有$|$通道$");
+    }
+    dev_insert_alarm_ctrl(dm->db, dm->_global_device_info->product_id,3,temp);
+    free(pcmd);
+
+    pthread_exit(NULL);
+}
 static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
 {
     int r;
@@ -1095,7 +1166,6 @@ int cascade_init(void)
     pthread_mutex_init(&cas->mutex, NULL);
     
     cas->scanAddr = 1;
-    //cas->map = modbus_mapping_new(0,0,MAX_READ_REGS,MAX_WRITE_REGS);
     cas->map2 = modbus_mapping_new_start_address(0,0,0,0,
                                                  CASCADE_REG_READ,  MAX_READ_REGS2,
                                                  CASCADE_REG_WRITE, MAX_WRITE_REGS2);
@@ -1103,13 +1173,6 @@ int cascade_init(void)
     set_modbus(cas, get_mb());
     slave_add(cas, 0);
 
-#if 0
-    lc.log = 0;
-    lc.max = 200;
-    lc.mode = LIST_FULL_FIFO;
-    cas->list = xlist_init(&lc);
-#endif
-
     thread_start(THREAD_ID_CASCADE, cascade_thread, cas, 4*MB, 0);
     thread_start(THREAD_ID_SCAN, scan_thread, cas, 4*MB, 0);
         
@@ -1120,7 +1183,7 @@ int cascade_init(void)
 int cascade_set_modbus(ModbusInfo_t *info)
 {
     cascade_handle_t *cas=&casHandle;
-    if(!info || info->product_modbus_type>1 || info->product_modbus_addr>CASCADE_MAX) {
+    if(!info || info->product_modbus_addr>CASCADE_MAX) {
         return -1;
     }
 
@@ -1174,28 +1237,18 @@ int cascade_request(cmd_data_t *cmd)
     
     if(cmd->cmd==CASCADE_CMD_QUERY_CH) {
         cmd_data_t cmd2=*cmd;
-
         cmd2.cmd = CASCADE_CMD_GET_INFO;
-        r = master_request(cas, &cmd2);
+        r = master_cmd(cas, &cmd2);
     }
 
     if(r==0) {
-        cas->cmd = *cmd;
-        r = master_request(cas, cmd);
+        r = master_cmd(cas, cmd);
     }
 
     return r;
 }
 
 
-int cascade_is_offline(int addr)
-{
-    slave_t *sl=slave_get(&casHandle, addr);
-
-    return (sl->addr>=ERR_MAX)?1:0;
-}
-
-
 int cascade_lock(void)
 {
     cascade_handle_t *cas=&casHandle;

+ 6 - 1
pro/src/cascade.h

@@ -19,15 +19,20 @@
 #define MAX_WRITE_REGS2                 50000
 
 
-#define CASCADE_REG_OFFSET              10
+#define CASCADE_REG_OFFSET              0x10
+
 #define CASCADE_REG_READ                (CASCADE_REG_OFFSET+0)
 #define CASCADE_REG_WRITE               (CASCADE_REG_OFFSET+1)
+#define CASCADE_REG_SCAN                (CASCADE_REG_OFFSET+2)
+
+
 
 enum {
     CASCADE_CMD_OPEN=0,
     CASCADE_CMD_CLOSE,
     CASCADE_CMD_SAVE,
     CASCADE_CMD_SAVE3,
+
     CASCADE_CMD_GET_INFO,
 
     CASCADE_CMD_QUERY_CH,

+ 10 - 6
pro/src/io.c

@@ -5,6 +5,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <string.h>
+#include <stdio.h>
 
 static int gpio_config(int gpio_id,const char *attr, const char *val)
 {
@@ -29,23 +30,26 @@ static int gpio_config(int gpio_id,const char *attr, const char *val)
 }
 
 
-static int gpio_read_config(int gpio_id,const char *attr, const char *val)
+static int gpio_read_config(int gpio_id,const char *attr, int *val)
 {
+    char tmp[4];
     char file_path[100];
     char gpio_path[100];    
     int len;
-    int fd;
+    int fd=-1;
 
     sprintf(file_path, "%s/%s", gpio_path, attr);
     if (0 > (fd = open(file_path, O_WRONLY))) {
         printf("open error");
         return fd;
     }
-    if (len != read(fd, val, 1)) {
-        printf("write error");
+    if (len = read(fd, tmp, 1)<=0) {
+        printf("read error");
         close(fd);
         return -1;
     }
+    tmp[1] = 0;
+    *val = atoi(tmp);
     close(fd);  //关闭文件
     return 0;
 }
@@ -56,7 +60,7 @@ static int gpio_read_config(int gpio_id,const char *attr, const char *val)
 int io_init(int gpio_id)
 {
     char gpio_path[100];    
-    sprintf(gpio_path, "/sys/class/gpio/gpio%s", gpio_id);
+    sprintf(gpio_path, "/sys/class/gpio/gpio%d", gpio_id);
     //如果目录不存在 则需要导出
     if(access(gpio_path, F_OK)) 
     {
@@ -85,7 +89,7 @@ int io_init(int gpio_id)
 int io_deinit(int gpio_id)
 {
     char gpio_path[100];    
-    sprintf(gpio_path, "/sys/class/gpio/gpio%s", gpio_id);
+    sprintf(gpio_path, "/sys/class/gpio/gpio%d", gpio_id);
     //如果目录不存在 则需要导出
     if(access(gpio_path, F_OK)) 
     {

+ 2 - 9
pro/src/json_handle.c

@@ -882,7 +882,7 @@ cJSON* json_to_over_equipment_mintenance(const char* str,_Equipment_Mintenance*
 }
 /// @brief 返回系统信息
 /// @return 
-int json_to_system_config_info(void)
+char* json_to_system_config_info(void)
 {
     char* str = NULL;
     // 创建 JSON 对象
@@ -1060,14 +1060,7 @@ char* over_product_list_info_to_json(GlobalDeviceManager *dm, _OverBackStsInfo*
 
                         sprintf(temp, "%d", _over_back_sts_info->product_type_id);
                         cJSON_AddStringToObject(data_filed, "productType", temp);
-                        
-                        if(dl.slave[i].err>=ERR_MAX) {
-                            cJSON_AddStringToObject(data_filed, "productStatus", "offline");
-                        }
-                        else {
-                            cJSON_AddStringToObject(data_filed, "productStatus", "online");
-                        }
-
+                        cJSON_AddStringToObject(data_filed, "productStatus", "online");
                         cJSON_AddItemToArray(root_array, data_filed);
                     }
                     //如果是listSbWhQuery请求,只推送当前PDU信息

+ 1 - 1
pro/src/json_handle.h

@@ -469,7 +469,7 @@ char* log_AthFailedinfo_to_json();
 char* user_info_to_json(void);
 char* user_routers_info_to_json(void);
 
-int json_to_system_config_info(void);
+char* json_to_system_config_info(void);
 
 
 cJSON* json_to_overall_status_monitor(const char* str,_Over_All_Sts_Monitor* _over_all_sts_monitor);

+ 3 - 1
pro/src/lcd_app.c

@@ -1,12 +1,14 @@
 #include "lcd_app.h"
+#include "io.h"
 #include <fcntl.h>
 #include <poll.h>
 #include <unistd.h>
+#include <string.h>
 #define KEY_UP_NUMBER 100
 
 
 
-void* key_event_callback(void* arg)
+int key_event_callback(void* arg)
 {
     /*对IO值进行poll侦听*/
 	int fd=open("/sys/class/gpio/pioC2/value",O_RDONLY);

+ 2 - 0
pro/src/lcd_drv.c

@@ -68,6 +68,8 @@ int lcd_deinit(void)
     io_set_dir(BACKLIGHT_GPIO_NUM,0);
     io_set_value(BACKLIGHT_GPIO_NUM,0);
     io_deinit(BACKLIGHT_GPIO_NUM);
+
+	return 0;
 }
 
 /// @brief 画点

+ 3 - 3
pro/src/sensor_handle.c

@@ -12,7 +12,7 @@
 int _g_sensor_get_temperature_value(void* manger,int saddr,float* temp,float* humi)
 {
     int ret = 0 ;
-    short data_temp[2] = {0};
+    unsigned short data_temp[2] = {0};
     ret = g_modbus_read_x_reg(manger,saddr,0,2,data_temp);
     if(ret<=0)
         return -1 ;
@@ -28,7 +28,7 @@ int _g_sensor_get_temperature_value(void* manger,int saddr,float* temp,float* hu
 /// @param saadr 
 /// @param sts 
 /// @return 
-int _gsensor_get_io_status(int saadr,unsigned char* sts)
+int _gsensor_get_io_status(int saddr,unsigned char* sts)
 {
     int val;
     struct gpiod_line *line;
@@ -44,7 +44,7 @@ int _gsensor_get_io_status(int saadr,unsigned char* sts)
 /// @param saadr 
 /// @param sts 
 /// @return 
-int _gsensor_set_io_status(int saadr,unsigned char sts)
+int _gsensor_set_io_status(int saddr,unsigned char sts)
 {
     int val;
 

+ 1 - 1
pro/src/sensor_handle.h

@@ -5,7 +5,7 @@
 int _g_sensor_get_temperature_value(void* manger,int saddr,float* temp,float* humi);
 
 
-int _gsensor_get_io_status(int saadr,unsigned char* sts);
+int _gsensor_get_io_status(int saddr,unsigned char* sts);
 
 #endif
 

+ 9 - 3
pro/src/sys.c

@@ -13,10 +13,12 @@
 #include "cfg.h"
 
 #if 0
-//#define LOGE  log_e
-//#define LOGD  log_d
+#define LOGE  log_e
+#define LOGW  log_w
+#define LOGD  log_d
 #else
 #define LOGD  printf
+#define LOGW  printf
 #define LOGE  printf
 #endif
 
@@ -836,7 +838,11 @@ int sys_set_net(NetworkInfo_t *para, int ipVersion)
 #elif defined USE_FILE
     NetworkInfo_t para2;
     r = get_net(&para2);
-    if(r==0 && memcmp(para, &para2, sizeof(NetworkInfo_t))) {
+    if(r==0) {
+        if(memcmp(para, &para2, sizeof(NetworkInfo_t))==0) {
+            LOGW("restart %s failed\n", DFLT_NIC);
+            return -1;
+        }
         r = set_net(para);
     }
     else {

+ 10 - 0
pro/src/thread.c

@@ -59,7 +59,17 @@ int thread_stop_all(void)
 }
 
 
+int thread_start_simp(thread_fn fn, void *arg, int stksize)
+{
+    int r;
+    pthread_t tid;
+    pthread_attr_t attr;
 
+    pthread_attr_init(&attr);
+    pthread_attr_setstacksize(&attr, stksize);
+    
+    return pthread_create(&tid, &attr, fn, arg);
+}
 
 
 

+ 1 - 0
pro/src/thread.h

@@ -41,6 +41,7 @@ int thread_start(int id, thread_fn fn, void *arg, int stksize, int prio);
 int thread_stop(int id);
 int thread_stop_all(void);
 
+int thread_start_simp(thread_fn fn, void *arg, int stksize);
 
 #ifdef __cplusplus
 }