Procházet zdrojové kódy

1、解决其它类型板子电量不能清理问题
2、增加一些判空操作,防崩溃

guohui před 2 roky
rodič
revize
6bd0911cad

+ 8 - 17
pro/src/app.c

@@ -1708,12 +1708,12 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     int io_thread_flag = 0 ;
     int sensor_thread_flag = 0 ;
     int nTac_chn=0;
-
-
-    //paras_load(&_globalDeviceManager->_globalDevInfo);
-
-    //初始化用户登录列表
+    
     INIT_LIST_HEAD(&_GlobalUserLoginInfo.list);
+    INIT_LIST_HEAD(&_globalDeviceManager->_globalPowerManger.list);
+    INIT_LIST_HEAD(&_globalDeviceManager->_globalPowerManger.list_Tree_AC);
+    INIT_LIST_HEAD(&_globalDeviceManager->_globalSensorManger.list);
+    INIT_LIST_HEAD(&_globalDeviceManager->g_new_global_breaker.list);
 
     //使用的通道
     _globalDeviceManager->useSlaveCount = 0 ;
@@ -1753,9 +1753,6 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     //打印参数
     //printf_global_device_info(&_globalDeviceManager->_globalDevInfo);
 
-    //电源管理表初始化
-    memset(&_globalDeviceManager->_globalPowerManger,0,sizeof(GlobalPowerManger));
-
     _globalDeviceManager->_globalPowerManger.global_over_manager = (GlobalOverManager*)malloc(sizeof(GlobalOverManager));
     if(_globalDeviceManager->_globalPowerManger.global_over_manager==NULL)
     {
@@ -1799,9 +1796,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
         {
             log_i("all chn data inserted ok.\n");
         }        
-    }
-
-    INIT_LIST_HEAD(&_globalDeviceManager->_globalPowerManger.list_Tree_AC);
+    } 
     
     if (_globalDeviceManager->_globalDevInfo.product.pwr_type==SmartPDU_Tree_AC_Tree
     ||_globalDeviceManager->_globalDevInfo.product.pwr_type==SmartPDU_Tree_AC_One
@@ -1862,7 +1857,8 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     }
     log_i("get all chn data ok.\n");
 
-    INIT_LIST_HEAD(&_globalDeviceManager->_globalPowerManger.list);
+    
+
     // 初始化modbus,搜寻子设备
     ret = g_modbus_init(&_globalDeviceManager->_globalRelaySampManger,
                         INTERL_MODBUS_PORT,
@@ -1927,11 +1923,6 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     ResetChmData(0);
 
 #if 1
-    //初始化传感器列表
-    INIT_LIST_HEAD(&_globalDeviceManager->_globalSensorManger.list);
-    INIT_LIST_HEAD(&_globalDeviceManager->g_new_global_breaker.list);
-    //获取传感器管理信息 
-    /////////////////////////////////////////
     ///todo:此信息需要和数据库更新以后在关联
     ret = dev_get_sensor_manage_info(_globalDeviceManager->db,
                                     _globalDeviceManager->_globalDevInfo.product.id,

+ 28 - 10
pro/src/appweb_handle.c

@@ -1805,26 +1805,44 @@ static void channelStatusMonitoring(void* conn)
             _globalPowerMangerTemp=NULL;
             list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
             {
-                    if (g_pwr_ch_id != _globalPowerMangerTemp->product_ch_id)
-                    {
-                        continue;
+                if (g_pwr_ch_id != _globalPowerMangerTemp->product_ch_id)
+                {
+                    continue;
+                }
+
+                if(__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_DC) {
+                    //;
+                }
+                else {
+                    if(__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_AC) {
+                        if (g_switch_set_t_ac_chn_reset(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr, _globalPowerMangerTemp->product_ch_addr-1)<0)
+                        {
+                            log_e("Error: g_switch_set_t_ac_chn_reset");
+                        }
+                        usleep(100000);
                     }
-                    if (__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One || __globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B || __globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree)
-                    {
+                    else {
                         GlobalTreeACManager *_globalTACManager = NULL;
                         list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
                         {
-                            if (g_switch_set_t_ac_phchn_reset(&__globalDeviceManage._globalRelaySampManger, _globalTACManager->product_saddr, _globalTACManager->product_ch_addr-1) < 0)
-                            {
-                                log_e("Error: phchn_reset");
+                            if(__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree) {
+                                if (g_switch_set_t_ac_phchn_reset(&__globalDeviceManage._globalRelaySampManger, _globalTACManager->product_saddr, _globalTACManager->product_ch_addr-1) < 0)
+                                {
+                                    log_e("Error: g_switch_set_t_ac_phchn_reset");
+                                }
+                            }
+                            else {
+                                if (g_switch_set_t_ac_chn_reset(&__globalDeviceManage._globalRelaySampManger, _globalTACManager->product_saddr, _globalTACManager->product_ch_addr-1)<0)
+                                {
+                                    log_e("Error: g_switch_set_t_ac_chn_reset");
+                                }
                             }
                             usleep(100000);//延时50ms,等待控制板串口写完
                         }
                     }
-                    break;
+                }
             }
             pCHlist = strtok_r(NULL, ",", &pCHListSave);
-
         }
         char log_buff[256];
         sprintf(log_buff, "Reset power consumption!");

+ 2 - 2
pro/src/common.c

@@ -13,8 +13,8 @@
 #define LOG_TAG    "main"
 
 
-GlobalDeviceManager __globalDeviceManage;
-GlobalDeviceManager __globalDeviceManage2;
+GlobalDeviceManager __globalDeviceManage={0};
+GlobalDeviceManager __globalDeviceManage2={0};
 
 unsigned long __globalSxIdx;
 NTPClient* globalNTPclient;

+ 88 - 84
pro/src/json_handle.c

@@ -2852,97 +2852,101 @@ char *ws_sensor_status_ack_to_json(GlobalSensorManger *_globalSensorManger)
     // 获取传感器当前的最新值
     GlobalSensorInfo _globalSensorInfo;
     GlobalSensorManger *_globalSensorManagerTemp = NULL;
-    list_for_each_entry(_globalSensorManagerTemp, &_globalSensorManger->list, list)
-    {
-        _OverSensorBackInfo *_overSensorBackInfoTemp = (_OverSensorBackInfo *)malloc(sizeof(_OverSensorBackInfo));
-        if (_overSensorBackInfoTemp == NULL)
-            log_e("_OverSensorBackInfo malloc error.");
-        memset(_overSensorBackInfoTemp, 0, sizeof(_OverSensorBackInfo));
-        // 基本信息
-        _overSensorBackInfoTemp->sensorId = _globalSensorManagerTemp->sensor_id;
-        strcpy(_overSensorBackInfoTemp->sensorName,language_sensor_name[__globalDeviceManage._globalDevInfo.product.language][(int)_globalSensorManagerTemp->sensor_type]);
-        
-        _overSensorBackInfoTemp->sensorType = _globalSensorManagerTemp->sensor_type;
-        memcpy(&_overSensorBackInfoTemp->comSlogan, &_globalSensorManagerTemp->sensor_port_name, sizeof(_overSensorBackInfoTemp->comSlogan));
-        // strcpy(_overSensorBackInfoTemp->comSlogan,_globalSensorManagerTemp->sensor_port_name);
-
-        // 485独有
-        _overSensorBackInfoTemp->connectionStatus = _globalSensorManagerTemp->sensor_status;
-        _overSensorBackInfoTemp->nodeNumber = __globalDeviceManage._globalSensorManger.sensor_node_number;
-        if (_globalSensorManagerTemp->sensor_interface_type == 1)
-        {
-            _overSensorBackInfoTemp->sensorAddr = _globalSensorManagerTemp->sensor_addr;
-            _overSensorBackInfoTemp->sensorBaud = _globalSensorManagerTemp->sensor_baud;
-            strcpy(_overSensorBackInfoTemp->sensorvaluech, "RS485");
-        }
-        else
-        {
-            _overSensorBackInfoTemp->connectionStatus = -1;
-            strcpy(_overSensorBackInfoTemp->sensorvaluech, _overSensorBackInfoTemp->comSlogan);
-            _overSensorBackInfoTemp->nodeNumber = _globalSensorManagerTemp->sensor_addr;
-        }
 
-        // 拿数据
-        memset(&_globalSensorInfo, 0, sizeof(_globalSensorInfo));
-        switch (_globalSensorManagerTemp->sensor_type)
-        {
-        case 0: // 温湿度传感器 2个值
-        {
-            _overSensorBackInfoTemp->temperatureValue = _globalSensorManagerTemp->Cur_sensor_info.val1;
-            _overSensorBackInfoTemp->humidityValue = _globalSensorManagerTemp->Cur_sensor_info.val2;
-        }
-        break;
-        case 1: // 烟雾传感器 1个值
+    if(!list_empty(&_globalSensorManger->list)) {
+        list_for_each_entry(_globalSensorManagerTemp, &_globalSensorManger->list, list)
         {
+            _OverSensorBackInfo *_overSensorBackInfoTemp = (_OverSensorBackInfo *)malloc(sizeof(_OverSensorBackInfo));
+            if (_overSensorBackInfoTemp == NULL)
+                log_e("_OverSensorBackInfo malloc error.");
+            memset(_overSensorBackInfoTemp, 0, sizeof(_OverSensorBackInfo));
+            // 基本信息
+            _overSensorBackInfoTemp->sensorId = _globalSensorManagerTemp->sensor_id;
+            strcpy(_overSensorBackInfoTemp->sensorName,language_sensor_name[__globalDeviceManage._globalDevInfo.product.language][(int)_globalSensorManagerTemp->sensor_type]);
+            
+            _overSensorBackInfoTemp->sensorType = _globalSensorManagerTemp->sensor_type;
+            memcpy(&_overSensorBackInfoTemp->comSlogan, &_globalSensorManagerTemp->sensor_port_name, sizeof(_overSensorBackInfoTemp->comSlogan));
+            // strcpy(_overSensorBackInfoTemp->comSlogan,_globalSensorManagerTemp->sensor_port_name);
+
+            // 485独有
+            _overSensorBackInfoTemp->connectionStatus = _globalSensorManagerTemp->sensor_status;
+            _overSensorBackInfoTemp->nodeNumber = __globalDeviceManage._globalSensorManger.sensor_node_number;
+            if (_globalSensorManagerTemp->sensor_interface_type == 1)
+            {
+                _overSensorBackInfoTemp->sensorAddr = _globalSensorManagerTemp->sensor_addr;
+                _overSensorBackInfoTemp->sensorBaud = _globalSensorManagerTemp->sensor_baud;
+                strcpy(_overSensorBackInfoTemp->sensorvaluech, "RS485");
+            }
+            else
+            {
+                _overSensorBackInfoTemp->connectionStatus = -1;
+                strcpy(_overSensorBackInfoTemp->sensorvaluech, _overSensorBackInfoTemp->comSlogan);
+                _overSensorBackInfoTemp->nodeNumber = _globalSensorManagerTemp->sensor_addr;
+            }
 
-            _overSensorBackInfoTemp->alarmStatus = !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
-        }
-        break;
-        case 2: // 水浸传感器 1个值  c
-        {
-            _overSensorBackInfoTemp->waterImmersionState = !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
-        }
-        break;
-        case 3: // 门禁传感器
-        {
-            _overSensorBackInfoTemp->accessControlStatus = !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
-        }
-        break;
-        case 4: // 气体传感器 1个值
-        {
-            _overSensorBackInfoTemp->gasConcentration = _globalSensorManagerTemp->Cur_sensor_info.val1; // 气体浓度
-        }
-        break;
-        case 5: // 气压气流传感器 2个值
-        {
-            _overSensorBackInfoTemp->airPressureValue = _globalSensorManagerTemp->Cur_sensor_info.val1; // 气压
-            _overSensorBackInfoTemp->airflowValue = _globalSensorManagerTemp->Cur_sensor_info.val2;     // 气流
-        };
-        break;
-        case 6: // 空调遥控器 没有值
-        {
+            // 拿数据
+            memset(&_globalSensorInfo, 0, sizeof(_globalSensorInfo));
+            switch (_globalSensorManagerTemp->sensor_type)
+            {
+            case 0: // 温湿度传感器 2个值
+            {
+                _overSensorBackInfoTemp->temperatureValue = _globalSensorManagerTemp->Cur_sensor_info.val1;
+                _overSensorBackInfoTemp->humidityValue = _globalSensorManagerTemp->Cur_sensor_info.val2;
+            }
+            break;
+            case 1: // 烟雾传感器 1个值
+            {
+
+                _overSensorBackInfoTemp->alarmStatus = !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
+            }
+            break;
+            case 2: // 水浸传感器 1个值  c
+            {
+                _overSensorBackInfoTemp->waterImmersionState = !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
+            }
+            break;
+            case 3: // 门禁传感器
+            {
+                _overSensorBackInfoTemp->accessControlStatus = !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
+            }
+            break;
+            case 4: // 气体传感器 1个值
+            {
+                _overSensorBackInfoTemp->gasConcentration = _globalSensorManagerTemp->Cur_sensor_info.val1; // 气体浓度
+            }
+            break;
+            case 5: // 气压气流传感器 2个值
+            {
+                _overSensorBackInfoTemp->airPressureValue = _globalSensorManagerTemp->Cur_sensor_info.val1; // 气压
+                _overSensorBackInfoTemp->airflowValue = _globalSensorManagerTemp->Cur_sensor_info.val2;     // 气流
+            };
+            break;
+            case 6: // 空调遥控器 没有值
+            {
+            }
+            break;
+            case 7:
+            {
+                _overSensorBackInfoTemp->temperatureValue = _globalSensorManagerTemp->Cur_sensor_info.val1;
+                _overSensorBackInfoTemp->temperatureValue2 = _globalSensorManagerTemp->Cur_sensor_info.val2;
+            }
+            }
+            // 入队
+            list_add_tail(&_overSensorBackInfoTemp->list, &_over_all_sensor_back_info.list);
         }
-        break;
-        case 7:
+        // 转换
+
+        strRet = over_all_sensor_info_to_json(&_over_all_sensor_back_info, 1);
+        // 释放资源
+        _OverSensorBackInfo *node;
+        _OverSensorBackInfo *next;
+        list_for_each_entry_safe(node, next, &_over_all_sensor_back_info.list, list)
         {
-            _overSensorBackInfoTemp->temperatureValue = _globalSensorManagerTemp->Cur_sensor_info.val1;
-            _overSensorBackInfoTemp->temperatureValue2 = _globalSensorManagerTemp->Cur_sensor_info.val2;
-        }
+            list_del(&node->list);
+            free(node);
         }
-        // 入队
-        list_add_tail(&_overSensorBackInfoTemp->list, &_over_all_sensor_back_info.list);
-    }
-    // 转换
-
-    strRet = over_all_sensor_info_to_json(&_over_all_sensor_back_info, 1);
-    // 释放资源
-    _OverSensorBackInfo *node;
-    _OverSensorBackInfo *next;
-    list_for_each_entry_safe(node, next, &_over_all_sensor_back_info.list, list)
-    {
-        list_del(&node->list);
-        free(node);
     }
+    
     return strRet;
 }
 

+ 7 - 4
pro/src/mqtt.c

@@ -226,7 +226,7 @@ static GlobalPowerManger* get_power(mqtt_handle_t *h, int ch)
 }
 static int set_ch(mqtt_handle_t *h, int ch, int flag)
 {
-    int sendAddr=0;
+    int r,sendAddr=0;
     GlobalPowerManger *tmp=NULL;
     list_for_each_entry(tmp, &h->dm->_globalPowerManger.list, list)
     {
@@ -234,7 +234,10 @@ static int set_ch(mqtt_handle_t *h, int ch, int flag)
         sendAddr = tmp->product_saddr;
 
         if(tmp->product_ch_id==ch) {
-            g_switch_set_all_chn_ctrl(&h->dm->_globalRelaySampManger, tmp, tmp->product_saddr, tmp->product_ch_addr, flag, false);
+            r = g_switch_set_all_chn_ctrl(&h->dm->_globalRelaySampManger, tmp, tmp->product_saddr, tmp->product_ch_addr, flag, false);
+            if(r<0) {
+                LOGE("___ g_switch_set_all_chn_ctrl failed, saddr: %d, ch_addr: %d\n", tmp->product_saddr, tmp->product_ch_addr);
+            }
             break;
         }
 
@@ -842,12 +845,12 @@ static int get_cmd(char *json)
     int cmd=-1;
 
     cJSON* cjson=cJSON_Parse(json);
+
     if(cjson) {
         cJSON* order=cJSON_GetObjectItem(cjson,"order");
         if(order && order->valuestring) {
             cmd = atoi(order->valuestring);
         }
-
         cJSON_Delete(cjson);
     }
 
@@ -1018,7 +1021,7 @@ static int my_recv(char *topic, char *data)
                 {
                     int ch=atoi(topic+strlen(temp));
                     cmd = get_cmd(data);
-                    LOGD("___ MQTT_SUB_CMD_POWER_CHN, %d\n", ch);
+                    LOGD("___ MQTT_SUB_CMD_POWER_CHN, %d, %d\n", ch, cmd);
 
                     if(cmd==0 || cmd==1) {
                         set_ch(h, ch, cmd);

+ 1 - 1
pro/src/sqlite_handle.c

@@ -94,7 +94,7 @@ int sqlite_init(sqlite3** db,pthread_mutex_t* pDBMutex, const char* daba_name)
     ret = sqlite3_open(daba_name,db);
     if(ret != SQLITE_OK)
         return -1 ;
-    char SetData[]="PRAGMA cache_size = 0; VACUUM;";
+    char SetData[]="PRAGMA cache_size = 0";
     ret = sqlite3_exec(*db,SetData,NULL,NULL,&errorMsg);
     return 0;
 }

+ 26 - 1
pro/src/switch_ctrl.c

@@ -1597,6 +1597,8 @@ int g_switch_set_dcpdu_min_cur_threshold(void* manger,int saddr,char chn,GlobalO
 
     return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
 }
+
+
 int g_switch_set_dcpdu_reset(void* manger,int saddr)
 {
     return 0;
@@ -2053,7 +2055,7 @@ int g_switch_set_t_ac_phchn_reset(void *manger, int saddr, int nChn)
     unsigned int offset = 0;
     unsigned short data_temp[2];
     int ret = 0;
-    // 重置耗电量
+    
     offset = _SWITCH_T_AC_RESET_CONSUMPTION_PH+nChn;
     data_temp[0] = 1;
     data_temp[1] = 1;
@@ -2065,6 +2067,29 @@ int g_switch_set_t_ac_phchn_reset(void *manger, int saddr, int nChn)
     return 0;
 }
 
+int g_switch_set_t_ac_chn_reset(void *manger, int saddr, int nChn)
+{
+    if (saddr <= 0 || saddr >= MAX_CHN_COUNT)
+    {
+        return -1;
+    }
+    unsigned int offset = 0;
+    unsigned short data_temp[2];
+    int ret = 0;
+    
+    offset = _SWITCH_T_AC_RESET_CONSUMPTION_+nChn;
+    data_temp[0] = 1;
+    data_temp[1] = 1;
+    ret = g_modbus_write_x_reg(manger, saddr, offset, 2, data_temp);
+    if (ret < 0)
+    {
+        return ret;
+    }
+    return 0;
+}
+
+
+
 //重设板子信息
 int g_switch_set_t_ac_reset(void* manger,int saddr)
 {

+ 4 - 1
pro/src/switch_ctrl.h

@@ -69,7 +69,7 @@ enum MODBUS_MODE
 #define _SWITCH_T_AC_IN_INFO               0x1771          //三项交流输入
 #define _SWITCH_T_AC_OUT_INFO              0x177D          //三项交流输出
 #define _SWITCH_T_AC_OUT_ENABLE            0x182E          //三项交流输出按通道开关状态及控制使能
-#define _SWITCH_T_AC_NF_STATUS            0x1837          //三项交流零线断路器状态
+#define _SWITCH_T_AC_NF_STATUS             0x1837          //三项交流零线断路器状态
 #define _SWITCH_T_AC_CH_OUT_ENABLE         0x183A          //三项交流延时时间
 #define _SWITCH_T_AC_IN_ENABLE             0x182D          //三项交流输入超限使能
 #define _SWITCH_T_AC_OUT_ERROR             0x17DE          //三项交流输出故障状态
@@ -88,6 +88,8 @@ enum MODBUS_MODE
 
 #define _SWITCH_T_AC_ALARM_MISSING_PH      0x1856          //缺相报警
 #define _SWITCH_T_AC_ALARM_CTRL            0x1860          //超限动作
+
+#define _SWITCH_T_AC_RESET_CONSUMPTION_    0x1408          //重置PH耗电量
 #define _SWITCH_T_AC_RESET_CONSUMPTION_PH  0x189C          //重置PH耗电量
 #define _SWITCH_T_AC_RESET_CONSUMPTION     0x18A5          //重置all耗电量
 
@@ -166,6 +168,7 @@ int g_switch_set_t_ac_phchn_ctrl(void* manger,int saddr,unsigned char chn,unsign
 int g_switch_set_t_ac_ctrl(void* manger,int saddr,unsigned short* sts);
 int g_switch_set_t_ac_reset(void* manger,int saddr);
 int g_switch_set_t_ac_phchn_reset(void* manger,int saddr,int nChn);
+int g_switch_set_t_ac_chn_reset(void *manger, int saddr, int nChn);
 
 //GPIO通道状态
 int g_switch_get_gpio_status(int ngpio,int* status);

+ 5 - 4
pro/src/websocket_handle.c

@@ -46,7 +46,7 @@ static int ws_is_online(ws_handle_t *wh)
 }
 static int ws_send(ws_handle_t *wh, void *data, int len, int isBinary) 
 {
-    if(!wh->c) {
+    if((!wh->c) || (!data) || (len<=0)) {
         return -1;
     }
 #ifdef USE_WS2
@@ -196,9 +196,10 @@ static void web_update(ws_handle_t *wh)
             //lock_s_hold(LOCK_ID_SENSOR);
             json_str = ws_sensor_status_ack_to_json(&gdm->_globalSensorManger);
             //lock_s_release(LOCK_ID_SENSOR);
-
-            ws_send_data(wh, json_str, strlen(json_str));
-            cJSON_free(json_str);
+            if(json_str) {
+                ws_send_data(wh, json_str, strlen(json_str));
+                cJSON_free(json_str);
+            }
         }
 		
         // breaker info