瀏覽代碼

添加设备列表,在刷新列表时会崩溃

guohui 2 年之前
父節點
當前提交
aacf5286ee

+ 1 - 1
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/.vscode/launch.json

@@ -5,7 +5,7 @@
     "version": "0.2.0",
     "version": "0.2.0",
     "configurations": [
     "configurations": [
         {
         {
-            "name": "(gdb) Launch",
+            "name": "GDB",
             "type": "cppdbg",
             "type": "cppdbg",
             "request": "launch",
             "request": "launch",
             "program": "${workspaceFolder}/build/smartPDU",
             "program": "${workspaceFolder}/build/smartPDU",

+ 2 - 23
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/.vscode/settings.json

@@ -29,27 +29,6 @@
         "websocket_handle.h": "c",
         "websocket_handle.h": "c",
         "xutility": "c",
         "xutility": "c",
         "system_error": "c",
         "system_error": "c",
-        "appweb.h": "c",
-        "sqlite3.h": "c",
-        "optional": "c",
-        "unordered_map": "c",
-        "vector": "c",
-        "memory": "c",
-        "string_view": "c",
-        "language_hashmap.h": "c",
-        "language_common.h": "c",
-        "ntpclient.h": "c",
-        "mongoose.h": "c",
-        "stdlib.h": "c",
-        "appweb_handle.h": "c",
-        "sstream": "c",
-        "initializer_list": "c",
-        "deque": "c",
-        "string": "c",
-        "modbus-tcp.h": "c",
-        "ioctl.h": "c",
-        "ioctls.h": "c",
-        "elog.h": "c"
-    },
-    "C_Cpp.errorSquiggles": "disabled"
+        "appweb.h": "c"
+    }
 }
 }

+ 46 - 0
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/appweb_handle.c

@@ -3275,6 +3275,52 @@ static void equipmentMintenance(void *conn)
     //查询设备列表
     //查询设备列表
     if(strcmp(_Over_equipment_mintenance.type,"listSbRestartQuery")==0)
     if(strcmp(_Over_equipment_mintenance.type,"listSbRestartQuery")==0)
     {
     {
+        // 查询设备总体参数
+       if (dev_get_device_info(__globalDeviceManage.db,__globalDeviceManage._global_device_info) != 0)
+        {
+            log_e("get device info error.\n");
+            http_reply(conn, 400, NULL);
+            return;
+        }
+
+        _over_back_sts_info.product_name = __globalDeviceManage._global_device_info->product_name;
+        _over_back_sts_info.product_number = __globalDeviceManage._global_device_info->product_number;
+        _over_back_sts_info.product_id = __globalDeviceManage._global_device_info->product_id;
+        _over_back_sts_info.product_Code = malloc(8);
+        strcpy(_over_back_sts_info.product_Code, "-");
+       // _over_back_sts_info.product_type = malloc(32);
+        //strcpy(_over_back_sts_info.product_type, "GC Series");
+        _over_back_sts_info.product_type=g_product_type_str[__globalDeviceManage._global_device_info->product_type];
+        _over_back_sts_info.productVersion = __globalDeviceManage._global_device_info->product_version;
+ 
+        _over_back_sts_info.product_sysTime = malloc(32);
+        struct tm *t;
+        struct timeval tv;
+        gettimeofday(&tv, NULL);
+        t = localtime(&tv.tv_sec);
+        sprintf(_over_back_sts_info.product_sysTime, "%04d-%02d-%02d %02d:%02d:%02d", t->tm_year + 1900, t->tm_mon + 1,
+                t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
+
+        long diff =0;
+        struct timespec ts;
+        if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0)
+        {
+          diff = ts.tv_sec;
+        }
+        sprintf(_over_back_sts_info.product_runTime, "%02ld:%02ld:%02ld", diff / 3600, (diff % 3600) / 60, diff % 60);
+        _over_back_sts_info.productAddr = getLocalIpAddress("eth0");
+
+        _over_back_sts_info.product_mac = get_mac_address("eth0");
+
+        _over_back_sts_info.product_RS485Addr = __globalDeviceManage._global_device_info->_gmodbus_info.product_modbus_addr;
+
+        //_over_back_sts_info.product_status = __globalDeviceManage._global_device_info ->product_status;
+        _over_back_sts_info.product_status = malloc(16);
+        strcpy(_over_back_sts_info.product_status, "online");
+
+        _over_back_sts_info.product_type_id=__globalDeviceManage._global_device_info->product_pwr_type;
+
+
          ack_str = over_product_list_info_to_json(&__globalDeviceManage, &_over_back_sts_info);
          ack_str = over_product_list_info_to_json(&__globalDeviceManage, &_over_back_sts_info);
     }
     }
     else if(strcmp(_Over_equipment_mintenance.type,"listShfwQuery")==0)
     else if(strcmp(_Over_equipment_mintenance.type,"listShfwQuery")==0)

+ 32 - 15
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/cascade.c

@@ -43,7 +43,9 @@ typedef struct {
 }cascade_handle_t;
 }cascade_handle_t;
 
 
 int cur_dev_addr=0;
 int cur_dev_addr=0;
-static cascade_handle_t casHandle={.inited=0}; 
+static cascade_handle_t casHandle={.inited=0};
+static int add_slave(cascade_handle_t *cas, int addr);
+
 
 
 
 
 static inline GlobalDeviceManager* get_dm(void)
 static inline GlobalDeviceManager* get_dm(void)
@@ -68,19 +70,19 @@ static int mbus_init(cascade_handle_t *cas, char *path, int mode, int addr, uint
 
 
     r = modbus_connect(cas->mb);
     r = modbus_connect(cas->mb);
     if (r!=0) {
     if (r!=0) {
-        LOGD("____modbus_connect failed, %s\n", modbus_strerror(errno));
+        LOGE("____modbus_connect failed, %s\n", modbus_strerror(errno));
         return -1;
         return -1;
     }
     }
 
 
-    r = modbus_rtu_set_serial_mode(cas->mb, MODBUS_RTU_RS485);
+    //r = modbus_rtu_set_serial_mode(cas->mb, MODBUS_RTU_RS485);
     if (r != 0){
     if (r != 0){
-        LOGD("____modbus_rtu_set_serial_mode failed, %s\n", modbus_strerror(errno));
+        LOGE("____modbus_rtu_set_serial_mode failed, %s\n", modbus_strerror(errno));
         //return -1;
         //return -1;
     }
     }
 
 
     r = modbus_rtu_set_rts(cas->mb, MODBUS_RTU_RTS_NONE);
     r = modbus_rtu_set_rts(cas->mb, MODBUS_RTU_RTS_NONE);
     if (r != 0) {
     if (r != 0) {
-        LOGD("____modbus_rtu_set_rts failed, %s\n", modbus_strerror(errno));
+        LOGE("____modbus_rtu_set_rts failed, %s\n", modbus_strerror(errno));
         return -1;
         return -1;
     }
     }
     r = modbus_set_error_recovery(cas->mb, MODBUS_ERROR_RECOVERY_PROTOCOL);
     r = modbus_set_error_recovery(cas->mb, MODBUS_ERROR_RECOVERY_PROTOCOL);
@@ -180,7 +182,7 @@ static int cascade_scan(cascade_handle_t *cas)
         r = mbus_read(cas, i, 6000, tmp, 10);
         r = mbus_read(cas, i, 6000, tmp, 10);
         if(r>0) {
         if(r>0) {
             LOGD("____ scan addr:%d, %d  0x%04x, 0x%04x\n", i, r, tmp[0], tmp[1]);
             LOGD("____ scan addr:%d, %d  0x%04x, 0x%04x\n", i, r, tmp[0], tmp[1]);
-            //xlist_append(cas->l, 0, &i, sizeof(i));
+            //add_slave(cas, i);
         }
         }
         else {
         else {
             LOGD("____ scan fail, %s\n", modbus_strerror(errno));
             LOGD("____ scan fail, %s\n", modbus_strerror(errno));
@@ -203,6 +205,7 @@ static void power_init(void)
     
     
     dm2->_global_device_info->product_pwr_type = SmartPDU_AC;
     dm2->_global_device_info->product_pwr_type = SmartPDU_AC;
     dm2->_global_device_info->product_id = 1;
     dm2->_global_device_info->product_id = 1;
+    //dm2->_global_device_info->product_type_id = 2;
     sprintf(dm2->_global_device_info->product_name, "SmartPDU_AC");
     sprintf(dm2->_global_device_info->product_name, "SmartPDU_AC");
     strcpy(dm2->_global_device_info->product_number, "11");
     strcpy(dm2->_global_device_info->product_number, "11");
     strcpy(dm2->_global_device_info->product_status, "");
     strcpy(dm2->_global_device_info->product_status, "");
@@ -376,12 +379,28 @@ static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
 
 
     return 0;
     return 0;
 }
 }
-
+static int add_slave(cascade_handle_t *cas, int addr)
+{
+    int r,tmp=addr;
+    r = xlist_append(cas->l, 0, &tmp, sizeof(tmp));
+    if(r) {
+        LOGE("___ add slave %d failed\n", addr);
+    }
+    return r;
+}
+static int add_slaves(cascade_handle_t *cas, int s, int e)
+{
+    int i,r;
+    for(i=s; i<=e; i++) {
+        r = add_slave(cas, i);
+    }
+    return 0;
+}
 
 
 
 
 int cascade_init(void)
 int cascade_init(void)
 {
 {
-    int r=0,addr=0;
+    int r=0;
     list_cfg_t lc;
     list_cfg_t lc;
     cascade_handle_t *cas=&casHandle;
     cascade_handle_t *cas=&casHandle;
     ModbusInfo_t *info=&get_dm()->_global_device_info->_gmodbus_info;
     ModbusInfo_t *info=&get_dm()->_global_device_info->_gmodbus_info;
@@ -389,11 +408,10 @@ int cascade_init(void)
     paras_load();
     paras_load();
     power_init();
     power_init();
 
 
-    lc.log = 0;
+    lc.log = 1;
     lc.max = 100;
     lc.max = 100;
     lc.mode = LIST_FULL_FIFO;
     lc.mode = LIST_FULL_FIFO;
     cas->l = xlist_init(&lc);
     cas->l = xlist_init(&lc);
-    xlist_append(cas->l, 0, &addr, sizeof(addr));
     
     
     cas->map = modbus_mapping_new(
     cas->map = modbus_mapping_new(
         MODBUS_MAX_READ_BITS,
         MODBUS_MAX_READ_BITS,
@@ -403,11 +421,11 @@ int cascade_init(void)
     );
     );
     set_modbus(cas, info);
     set_modbus(cas, info);
 
 
-    //cas->addr = 1;
+    add_slave(cas, 0);
+    add_slaves(cas, 1, 10);
+
     sys_start_thread(THREAD_ID_CASCADE, cascade_thread, cas);
     sys_start_thread(THREAD_ID_CASCADE, cascade_thread, cas);
     sys_start_thread(THREAD_ID_SCAN, scan_thread, cas);
     sys_start_thread(THREAD_ID_SCAN, scan_thread, cas);
-
-    //while(1) sleep(10);
         
         
     return 0;
     return 0;
 }
 }
@@ -449,8 +467,7 @@ int cascade_get_dlist(dev_list_t *dl)
     }
     }
 
 
     dl->addr = p;
     dl->addr = p;
-    dl->addr[0] = 0;
-    dl->cnt = 1;
+    dl->cnt = 0;
     xlist_iterator(cas->l, NULL, dlist_fn, dl);
     xlist_iterator(cas->l, NULL, dlist_fn, dl);
 
 
     return 0;
     return 0;

+ 41 - 24
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/json_handle.c

@@ -689,7 +689,9 @@ char* user_routers_info_to_json(void)
     cJSON_AddItemToObject(root, "data", data_array);
     cJSON_AddItemToObject(root, "data", data_array);
 
 
     //转换
     //转换
-    str = cJSON_Print(root);    
+    str = cJSON_Print(root);
+
+    return str;  
 }
 }
 
 
 /// @brief 获取登录用户信息
 /// @brief 获取登录用户信息
@@ -917,6 +919,8 @@ char* over_product_list_info_to_json(GlobalDeviceManager *dm, _OverBackStsInfo*
     int i,r;
     int i,r;
     char* str = NULL;
     char* str = NULL;
     dev_list_t dl;
     dev_list_t dl;
+    char temp0[8] = {0};
+    char temp1[16] = {0};
 
 
     // 创建 JSON 对象
     // 创建 JSON 对象
     cJSON* root = cJSON_CreateObject();   
     cJSON* root = cJSON_CreateObject();   
@@ -927,17 +931,12 @@ char* over_product_list_info_to_json(GlobalDeviceManager *dm, _OverBackStsInfo*
     //添加第一条记录
     //添加第一条记录
     cJSON* data_filed = cJSON_CreateObject();
     cJSON* data_filed = cJSON_CreateObject();
 
 
-    _over_back_sts_info->product_name = dm->_global_device_info->product_name;
-    _over_back_sts_info->product_number = dm->_global_device_info->product_number;
-    _over_back_sts_info->product_id = dm->_global_device_info->product_id;
-    //_over_back_sts_info->product_type = g_product_type_str[dm->_global_device_info->product_type];
-    _over_back_sts_info->product_type_id=dm->_global_device_info->product_pwr_type;
-    _over_back_sts_info->product_status = dm->_global_device_info ->product_status;
-
     r = cascade_get_dlist(&dl);
     r = cascade_get_dlist(&dl);
     if(r==0) {
     if(r==0) {
         char tmpname[100];
         char tmpname[100];
         for(i=0; i<dl.cnt; i++) {
         for(i=0; i<dl.cnt; i++) {
+
+            //printf("______ addr: %d 000\n", dl.addr[i]);
             if(dl.addr[i]==0) {
             if(dl.addr[i]==0) {
                 sprintf(tmpname, "%s", _over_back_sts_info->product_name);
                 sprintf(tmpname, "%s", _over_back_sts_info->product_name);
             }
             }
@@ -951,29 +950,47 @@ char* over_product_list_info_to_json(GlobalDeviceManager *dm, _OverBackStsInfo*
             cJSON_AddStringToObject(data_filed, "productNumber", _over_back_sts_info->product_number);
             cJSON_AddStringToObject(data_filed, "productNumber", _over_back_sts_info->product_number);
             cJSON_AddStringToObject(data_filed, "productCode", _over_back_sts_info->product_Code);
             cJSON_AddStringToObject(data_filed, "productCode", _over_back_sts_info->product_Code);
             cJSON_AddStringToObject(data_filed, "productModel", _over_back_sts_info->product_type);
             cJSON_AddStringToObject(data_filed, "productModel", _over_back_sts_info->product_type);
-            cJSON_AddStringToObject(data_filed, "productVersion", _over_back_sts_info->productVersion);
-            cJSON_AddStringToObject(data_filed, "systemTime", _over_back_sts_info->product_sysTime);
-            cJSON_AddStringToObject(data_filed, "runTime", _over_back_sts_info->product_runTime);
-            cJSON_AddStringToObject(data_filed, "IPadress", _over_back_sts_info->productAddr);
-            cJSON_AddStringToObject(data_filed, "MACadress", _over_back_sts_info->product_mac);
-            char temp0[8] = {0};
-            sprintf(temp0, "%d", _over_back_sts_info->product_RS485Addr);
-            cJSON_AddStringToObject(data_filed, "RSadress", temp0);
-            char temp1[16] = {0};
+
+            if(dl.addr[i]==0) {
+                cJSON_AddStringToObject(data_filed, "productVersion", _over_back_sts_info->productVersion);
+                cJSON_AddStringToObject(data_filed, "systemTime", _over_back_sts_info->product_sysTime);
+                cJSON_AddStringToObject(data_filed, "runTime", _over_back_sts_info->product_runTime);
+                cJSON_AddStringToObject(data_filed, "IPadress", _over_back_sts_info->productAddr);
+                cJSON_AddStringToObject(data_filed, "MACadress", _over_back_sts_info->product_mac);
+            }
+            else {
+                cJSON_AddStringToObject(data_filed, "productVersion", " ");
+                cJSON_AddStringToObject(data_filed, "systemTime", " ");
+                cJSON_AddStringToObject(data_filed, "runTime", " ");
+                cJSON_AddStringToObject(data_filed, "IPadress", " ");
+                cJSON_AddStringToObject(data_filed, "MACadress", " ");
+            }
+
+            if(dl.addr[i]==0) {
+                cJSON_AddStringToObject(data_filed, "RSadress", " "); 
+            }
+            else {
+                sprintf(temp0, "%d", dl.addr[i]);
+                cJSON_AddStringToObject(data_filed, "RSadress", temp0);
+            }
+
             sprintf(temp1, "%d", _over_back_sts_info->product_type_id);
             sprintf(temp1, "%d", _over_back_sts_info->product_type_id);
             cJSON_AddStringToObject(data_filed, "productType", temp1);
             cJSON_AddStringToObject(data_filed, "productType", temp1);
+
             cJSON_AddStringToObject(data_filed, "productStatus", _over_back_sts_info->product_status);
             cJSON_AddStringToObject(data_filed, "productStatus", _over_back_sts_info->product_status);
+
+            cJSON_AddItemToObject(data_root_array, "data", data_filed);
         }
         }
+        cascade_free_dlist(&dl);
     }
     }
-
-    cJSON_AddItemToObject(data_root_array, "data", data_filed);
-    //第二条记录
     cJSON_AddItemToObject(root, "data", data_root_array);
     cJSON_AddItemToObject(root, "data", data_root_array);
-
-    //添加结果
     cJSON_AddStringToObject(root, "msg", "操作成功");
     cJSON_AddStringToObject(root, "msg", "操作成功");
-    //转换
-    str = cJSON_Print(root);    
+
+    printf("_____ cascade get dev 222\n");
+    str = cJSON_Print(root);
+    printf("_____ cascade get dev 333\n");
+
+    printf("_________ %s\n", str);
     //释放资源
     //释放资源
     cJSON_Delete(root);
     cJSON_Delete(root);
     return str;
     return str;

+ 17 - 15
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/xlist.c

@@ -83,7 +83,7 @@ static list_node_t* node_from_free(list_t *l, int dlen)
     list_node_t *tmp=NULL;
     list_node_t *tmp=NULL;
     dlist_t *dl=&l->free;
     dlist_t *dl=&l->free;
     
     
-    tmp = dl->head;         //从头部开始搜索合适节点
+    tmp = dl->head;         //锟斤拷头锟斤拷锟斤拷始锟斤拷锟斤拷锟斤拷锟绞节碉拷
     while(tmp) {
     while(tmp) {
         if(tmp->data.buf && tmp->data.blen>=dlen) {
         if(tmp->data.buf && tmp->data.blen>=dlen) {
             
             
@@ -127,8 +127,8 @@ static int node_to_free(list_t *l, list_node_t *node)
     list_node_t *tail=NULL;
     list_node_t *tail=NULL;
     dlist_t *dl=&l->free;
     dlist_t *dl=&l->free;
     
     
-    tail = dl->tail;          //新节点加在free列表尾部
-    if(tail==NULL) {          //无节点
+    tail = dl->tail;          //锟铰节碉拷锟斤拷锟絝ree锟叫憋拷尾锟斤拷
+    if(tail==NULL) {          //锟睫节碉拷
         node->prev = NULL;
         node->prev = NULL;
         node->next = NULL;
         node->next = NULL;
         
         
@@ -328,8 +328,10 @@ handle_t xlist_init(list_cfg_t *cfg)
         return NULL;
         return NULL;
     
     
     l = MALLOC(sizeof(list_t));
     l = MALLOC(sizeof(list_t));
-    if (!l)
+    if (!l) {
+        LOGE("xlist_init malloc failed\n");
         return NULL;
         return NULL;
+    }
     
     
     l->used.head = NULL;
     l->used.head = NULL;
     l->used.tail = NULL;
     l->used.tail = NULL;
@@ -536,12 +538,12 @@ int xlist_insert(handle_t l, node_t *node, int index)
     }
     }
     
     
     if (hl->cfg.max>0 && hl->used.size>=hl->cfg.max) {
     if (hl->cfg.max>0 && hl->used.size>=hl->cfg.max) {
-        //链表装满时, 根据策略丢数据
-        //如果要插入的位置为末尾, 则丢弃
+        //锟斤拷锟斤拷装锟斤拷时, 锟斤拷锟捷诧拷锟皆讹拷锟斤拷锟斤拷
+        //锟斤拷锟揭�拷锟斤拷锟斤拷位锟斤拷为末尾, 锟斤拷锟斤拷
         if(index<0 || index>=hl->used.size-1) {
         if(index<0 || index>=hl->used.size-1) {
-            if(hl->cfg.mode==LIST_FULL_FILO) { //策略为丢新数据时
+            if(hl->cfg.mode==LIST_FULL_FILO) { //锟斤拷锟斤拷为锟斤拷锟斤拷锟斤拷锟斤拷时
                 if (hl->cfg.log) {
                 if (hl->cfg.log) {
-                    //LOGW("___list_insert, list full, discard the new data\n");
+                    LOGW("___list_insert, list full, discard the new data\n");
                 }
                 }
                 r = -2; goto quit;
                 r = -2; goto quit;
             }
             }
@@ -550,10 +552,10 @@ int xlist_insert(handle_t l, node_t *node, int index)
                 //LOGW("___list_insert, list full, discard the old data\n");
                 //LOGW("___list_insert, list full, discard the old data\n");
             }
             }
             
             
-            xd = node_get(hl, 0);              //找最老的数据丢
+            xd = node_get(hl, 0);              //锟斤拷锟斤拷锟较碉拷锟斤拷锟捷讹拷
             node_remove(hl, xd, 1);
             node_remove(hl, xd, 1);
         }
         }
-        else {  //如果插入位置位于中间, 则需丢最后一个数据
+        else {  //�������λ��λ���м�, ���趪���һ������
             if (hl->cfg.log) {
             if (hl->cfg.log) {
                 LOGW("___list_insert, insert to the middle, discard the last data\n");
                 LOGW("___list_insert, insert to the middle, discard the last data\n");
             }
             }
@@ -598,16 +600,16 @@ int xlist_insert_node(handle_t l, list_node_t *lnode, int index)
     }
     }
     
     
     if (hl->cfg.max>0 && hl->used.size>=hl->cfg.max) {
     if (hl->cfg.max>0 && hl->used.size>=hl->cfg.max) {
-        //链表装满时, 根据策略丢数据
-        //如果要插入的位置为末尾, 则丢弃
+        //锟斤拷锟斤拷装锟斤拷时, 锟斤拷锟捷诧拷锟皆讹拷锟斤拷锟斤拷
+        //锟斤拷锟揭�拷锟斤拷锟斤拷位锟斤拷为末尾, 锟斤拷锟斤拷
         if(index<0 || index>=hl->used.size-1) {
         if(index<0 || index>=hl->used.size-1) {
-            if(hl->cfg.mode==LIST_FULL_FILO) { //策略为丢新数据时
+            if(hl->cfg.mode==LIST_FULL_FILO) { //锟斤拷锟斤拷为锟斤拷锟斤拷锟斤拷锟斤拷时
                 r = 0; goto quit;
                 r = 0; goto quit;
             }
             }
-            xd = node_get(hl, 0);              //找最老的数据丢
+            xd = node_get(hl, 0);              //锟斤拷锟斤拷锟较碉拷锟斤拷锟捷讹拷
             node_remove(hl, xd, 1);
             node_remove(hl, xd, 1);
         }
         }
-        else {  //如果插入位置位于中间, 则需丢最后一个数据
+        else {  //�������λ��λ���м�, ���趪���һ������
             xd = node_get(hl, hl->used.size-1);
             xd = node_get(hl, hl->used.size-1);
             node_remove(hl, xd, 1);
             node_remove(hl, xd, 1);
         }
         }