Преглед изворни кода

F427网页和程序,告警显示,trap告警,阈值配置。

liyi пре 1 година
родитељ
комит
7e2806a622

+ 33 - 8
f407/applications/html_h/channel_display.h

@@ -1,7 +1,7 @@
 /* 自动生成的文本数据头文件 */
 /* 源文件: channel_display.js */
-/* 文件大小: 5403 字节 */
-/* 生成时间: 2025-09-12 05:42:04 */
+/* 文件大小: 6362 字节 */
+/* 生成时间: 2025-09-16 05:47:15 */
 /* 编码: utf-8 */
 #ifndef P_CHANNEL_DISPLAY_H
 #define P_CHANNEL_DISPLAY_H
@@ -22,6 +22,7 @@ const char *p_channel_display =
     "    length = channel_power_infro.length\n"
     "    for (let j = 1; j < length; j++) {\n"
     "        let alarm=channel_power_infro[j].alarm;\n"
+    "        let thr=channel_power_infro[j].thr;\n"
     "        num = channel_power_infro[j].info.type\n"
     "            // 创建一个新的列表项元素\n"
     "        const channelFormData1 = {\n"
@@ -43,10 +44,31 @@ const char *p_channel_display =
     "            const channelFormData = {\n"
     
     "            };\n"
-    "            if(alarm.c_upper!=0 || alarm.p_upper!=0 || alarm.v_lower!=0 || alarm.v_upper!=0 || alarm.w_upper!=0){\n"
-    "                channelFormData.colorStyle='color: red;'\n"
+    
+    "            if(alarm.c_upper!=0){\n"
+    "                channelFormData.colorStyledl='color: red;font-weight: bold;'\n"
+    "            }else{\n"
+    "                channelFormData.colorStyledl=''\n"
+    "            }\n"
+    "            if( alarm.p_upper!=0 ){\n"
+    "                channelFormData.colorStylegl='color: red;font-weight: bold;'\n"
+    "            }else{\n"
+    "                channelFormData.colorStylegl=''\n"
+    "            }\n"
+    "            if( alarm.v_lower!=0){\n"
+    "                channelFormData.colorStyledy2='color: #ff00ff;font-weight: bold;'\n"
+    "            }else{\n"
+    "                channelFormData.colorStyledy2=''\n"
+    "            }\n"
+    "            if( alarm.v_upper!=0){\n"
+    "                channelFormData.colorStyledy='color: red;font-weight: bold;'\n"
+    "            }else{\n"
+    "                channelFormData.colorStyledy=''\n"
+    "            }\n"
+    "            if(alarm.w_upper!=0){\n"
+    "                channelFormData.colorStylehdl='color: red;font-weight: bold;'\n"
     "            }else{\n"
-    "                channelFormData.colorStyle=''\n"
+    "                channelFormData.colorStylehdl=''\n"
     "            }\n"
     "            //自动生成设备名称列\n"
     
@@ -102,7 +124,10 @@ const char *p_channel_display =
     
     "                };\n"
     "                if(alarm.c_upper!=0 || alarm.p_upper!=0 || alarm.v_lower!=0 || alarm.v_upper!=0 || alarm.w_upper!=0){\n"
-    "                    channelFormData.colorStyle='color: red;'\n"
+    "                    channelFormData.colorStyledy='color: red;'\n"
+    "                    channelFormData.colorStyledl='color: red;'\n"
+    "                    channelFormData.colorStylegl='color: red;'\n"
+    "                    channelFormData.colorStylehdl='color: red;'\n"
     "                }else{\n"
     "                    channelFormData.colorStyle=''\n"
     "                }\n"
@@ -165,9 +190,9 @@ const char *p_channel_display =
 ;
 
 // 文本数据大小(包括null终止符)
-const size_t p_channel_display_size = 5404;
+const size_t p_channel_display_size = 6363;
 
 // 文本长度(字符数)
-const size_t p_channel_display_length = 4969;
+const size_t p_channel_display_length = 5928;
 
 #endif /* P_CHANNEL_DISPLAY_H */

+ 34 - 7
f407/applications/html_h/data_js.h

@@ -1,7 +1,7 @@
 /* 自动生成的文本数据头文件 */
 /* 源文件: data.js */
-/* 文件大小: 42870 字节 */
-/* 生成时间: 2025-09-12 05:42:05 */
+/* 文件大小: 43628 字节 */
+/* 生成时间: 2025-09-16 05:47:16 */
 /* 编码: utf-8 */
 #ifndef P_DATA_JS_H
 #define P_DATA_JS_H
@@ -1570,7 +1570,23 @@ const char *p_data_js =
     
     "}\n"
     
+    "function bin_to_his_alarm(bin) {\n"
+    "    var tmp, length = 0;\n"
+    
+    "    tmp = new DataView(bin, length);\n"
     
+    "    this.type = tmp.getUint8(0, true);\n"
+    "    length += 1;\n"
+    
+    "    this.date = array_to_string(bin.slice(length, length + 32));\n"
+    "    length += 32;\n"
+    
+    "    this.waning_context = array_to_string(bin.slice(length, length + 64));\n"
+    "    length += 64;\n"
+    
+    "    this.len = length;\n"
+    
+    "}\n"
     
     
     "function bin_to_snmp(bin) {\n"
@@ -1665,11 +1681,22 @@ const char *p_data_js =
     "                break;\n"
     
     "            case PKT_TYPE.PKT_TYPE_ALARM:\n"
-    "                h.alarmd = new bin_to_alarm(data);\n"
+    "                {\n"
+    "                    var length = 0;\n"
+    "                    var tmp = [];\n"
+    "                    for (var i = 0;; i++) {\n"
+    "                        tmp[i] = new bin_to_his_alarm(data.slice(length));\n"
+    "                        length += tmp[i].len;\n"
+    "                        if (length >= data.byteLength) {\n"
+    "                            break;\n"
+    "                        }\n"
+    "                    }\n"
+    "                    h.his_alarmd = tmp;\n"
+    "                }\n"
     "                break;\n"
     
     "            case PKT_TYPE.PKT_TYPE_SLAVE_LIST:\n"
-    "                h.alarmd = new bin_to_slist(data);\n"
+    "                //h.alarmd = new bin_to_slist(data);\n"
     "                break;\n"
     
     "            case PKT_TYPE.PKT_TYPE_PARAS:\n"
@@ -1791,7 +1818,7 @@ const char *p_data_js =
     "    function loop_send() {\n"
     "        console.log(\"PKT_TYPE_POWER_CH request\");\n"
     "        _send(mk_hdr(PKT_TYPE.PKT_TYPE_POWER_CH));\n"
-    "        setTimeout(loop_send, 2000);\n"
+    "        setTimeout(loop_send, 400);\n"
     "    }\n"
     
     
@@ -1832,9 +1859,9 @@ const char *p_data_js =
 ;
 
 // 文本数据大小(包括null终止符)
-const size_t p_data_js_size = 42871;
+const size_t p_data_js_size = 43629;
 
 // 文本长度(字符数)
-const size_t p_data_js_length = 42788;
+const size_t p_data_js_length = 43546;
 
 #endif /* P_DATA_JS_H */

+ 36 - 34
f407/applications/html_h/display_data.h

@@ -1,7 +1,7 @@
 /* 自动生成的文本数据头文件 */
 /* 源文件: display_data.js */
-/* 文件大小: 3755 字节 */
-/* 生成时间: 2025-09-12 05:42:13 */
+/* 文件大小: 3721 字节 */
+/* 生成时间: 2025-09-16 05:47:24 */
 /* 编码: utf-8 */
 #ifndef P_DISPLAY_DATA_H
 #define P_DISPLAY_DATA_H
@@ -10,37 +10,38 @@
 
 // 文本数据(UTF-8编码)
 const char *p_display_data = 
-    "function total_Infor(j, total_data, type) {\n"
-    "    initialTotalFormList = [];\n"
+    "function total_Infor(j, total_data,type) {\n"
+    "    initialTotalFormList=[];\n"
     "    len = total_data.length\n"
     "        //显示总信息\n"
-    "    for (let i = 0; i <= len - 1; i++) {\n"
+    "    for (let i = 0; i <=len-1; i++) {\n"
     "        num = i + 1\n"
     "        voltage = total_data[i].voltage.toFixed(2)\n"
     "        current = total_data[i].current.toFixed(2)\n"
     "        power = total_data[i].power\n"
+    "        power = power / 1000\n"
     "        power = power.toFixed(3)\n"
     "        consump = total_data[i].consump.toFixed(2)\n"
-    "            // if (consump <= 0) {\n"
-    "            //     consump = 0\n"
-    "            // }\n"
-    "            // consump = consump / 1000\n"
-    "            // consump = consump.toFixed(3)\n"
+    "        // if (consump <= 0) {\n"
+    "        //     consump = 0\n"
+    "        // }\n"
+    "        // consump = consump / 1000\n"
+    "        // consump = consump.toFixed(3)\n"
     "        freq = total_data[i].freq.toFixed(2)\n"
-    "        if (type == '0') {\n"
-    "            initialFormData.totalVoltage = voltage; // 总电压\n"
-    "            initialFormData.totalCurrent = current; // 总电流\n"
-    "            initialFormData.totalPower = power; // 总功率\n"
-    "            initialFormData.totalFrequency = freq; // 总频率\n"
-    "            initialFormData.totalEnergy = consump; // 总耗电量\n"
+    "        if(type=='0'){\n"
+    "            initialFormData.totalVoltage=voltage ; // 总电压\n"
+    "            initialFormData.totalCurrent=current ; // 总电流\n"
+    "            initialFormData.totalPower=power;  // 总功率\n"
+    "            initialFormData.totalFrequency=freq; // 总频率\n"
+    "            initialFormData.totalEnergy=consump; // 总耗电量\n"
     "            break\n"
-    "        } else {\n"
+    "        }else{\n"
     "            const initialChFormData = {};\n"
-    "            initialChFormData.totalVoltage = voltage; // 总电压\n"
-    "            initialChFormData.totalCurrent = current; // 总电流\n"
-    "            initialChFormData.totalPower = power; // 总功率\n"
-    "            initialChFormData.totalFrequency = freq; // 总频率\n"
-    "            initialChFormData.totalEnergy = consump; // 总耗电量\n"
+    "            initialChFormData.totalVoltage=voltage ; // 总电压\n"
+    "            initialChFormData.totalCurrent=current ; // 总电流\n"
+    "            initialChFormData.totalPower=power;  // 总功率\n"
+    "            initialChFormData.totalFrequency=freq; // 总频率\n"
+    "            initialChFormData.totalEnergy=consump; // 总耗电量\n"
     "            initialTotalFormList.push(initialChFormData);\n"
     "        }\n"
     
@@ -60,30 +61,30 @@ const char *p_display_data =
     "    // const dataList = document.getElementById('threshold_mannage');\n"
     "    // // 清空现有的列表项\n"
     "    // dataList.innerHTML = '';\n"
-    "    initialYzFormList = [];\n"
+    "    initialYzFormList=[];\n"
     "    channel_length = channel_power_infro.length\n"
     "        //遍历数据数组\n"
     "    for (let j = 1; j < channel_length; j++) {\n"
     "        const initialChFormData = {};\n"
     "        //自动生成名称列\n"
-    "        initialChFormData.productChName = \"CH\" + j;\n"
+    "        initialChFormData.productChName=\"CH\" + j;\n"
     "        //自动生成编号列\n"
-    "        initialChFormData.productChId = j;\n"
+    "        initialChFormData.productChId=j;\n"
     "        //自动生成电流上限列\n"
-    "        initialChFormData.currentUpperAction = channel_power_infro[j].thr.c_upper / 10.0;\n"
+    "        initialChFormData.currentUpperAction= channel_power_infro[j].thr.c_upper / 10.0;\n"
     
     "        // 自动生成电压上限列\n"
-    "        initialChFormData.voltageUpperAction = channel_power_infro[j].thr.v_upper / 10.0;\n"
+    "        initialChFormData.voltageUpperAction=channel_power_infro[j].thr.v_upper / 10.0;\n"
     
     "        // 自动生成电压下限列\n"
-    "        initialChFormData.voltageDownAction = channel_power_infro[j].thr.v_lower / 10.0;\n"
+    "        initialChFormData.voltageDownAction=channel_power_infro[j].thr.v_lower / 10.0;\n"
     
     "        // 自动生成功率上限列\n"
-    "        initialChFormData.powerUpperAction = channel_power_infro[j].thr.p_upper / 1000.0;\n"
+    "        initialChFormData.powerUpperAction=channel_power_infro[j].thr.p_upper / 1000.0;\n"
     
     "        // 自动生成耗电量上限列\n"
-    "        initialChFormData.alarmContentUpperAction = channel_power_infro[j].thr.w_upper / 1000.0;\n"
-    "        initialChFormData.channel_power_infro = channel_power_infro[j]\n"
+    "        initialChFormData.alarmContentUpperAction=channel_power_infro[j].thr.w_upper / 1000.0;\n"
+    "        initialChFormData.channel_power_infro=channel_power_infro[j]\n"
     "        initialYzFormList.push(initialChFormData);\n"
     "    }\n"
     "}\n"
@@ -115,13 +116,14 @@ const char *p_display_data =
     "let initialYzFormList = [];\n"
     
     
-    "let channel_power_infro1 = [];"
+    "let channel_power_infro1=[];\n"
+    
 ;
 
 // 文本数据大小(包括null终止符)
-const size_t p_display_data_size = 3756;
+const size_t p_display_data_size = 3722;
 
 // 文本长度(字符数)
-const size_t p_display_data_length = 3439;
+const size_t p_display_data_length = 3405;
 
 #endif /* P_DISPLAY_DATA_H */

+ 160 - 6
f407/applications/html_h/index_css.h

@@ -1,7 +1,7 @@
 /* 自动生成的文本数据头文件 */
 /* 源文件: index.css */
-/* 文件大小: 8112 字节 */
-/* 生成时间: 2025-09-12 05:42:15 */
+/* 文件大小: 10638 字节 */
+/* 生成时间: 2025-09-16 05:47:26 */
 /* 编码: utf-8 */
 #ifndef P_CSS_INDEX_H
 #define P_CSS_INDEX_H
@@ -260,7 +260,7 @@ const char *p_css_index =
     "    border-radius: 8px;\n"
     "    max-width: 500px;\n"
     "    width: 80%;\n"
-    "    max-height: 80vh;\n"
+    "    max-height: 95vh;\n"
     "    overflow-y: auto;\n"
     "}\n"
     
@@ -467,13 +467,167 @@ const char *p_css_index =
     "    border-radius: 8px;\n"
     "    box-shadow: 0 2px 10px rgb(0 0 0 / 10%);\n"
     "    overflow: hidden;\n"
-    "}"
+    "}\n"
+    
+    
+    
+    "/*-----------------*/\n"
+    "header {\n"
+    "    text-align: center;\n"
+    "    margin-bottom: 30px;\n"
+    "    padding: 20px;\n"
+    "    background: white;\n"
+    "    border-radius: 10px;\n"
+    "    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n"
+    "}\n"
+    
+    "h1 {\n"
+    "    color: #2c3e50;\n"
+    "    margin-bottom: 10px;\n"
+    "}\n"
+    
+    ".description {\n"
+    "    color: #7f8c8d;\n"
+    "    font-size: 1.1rem;\n"
+    "    max-width: 600px;\n"
+    "    margin: 0 auto;\n"
+    "}\n"
+    
+    ".multi-select-container {\n"
+    "    background: white;\n"
+    "    border-radius: 10px;\n"
+    "    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n"
+    "    padding: 20px;\n"
+    "    margin-bottom: 30px;\n"
+    "}\n"
+    
+    ".select-header {\n"
+    "    display: flex;\n"
+    "    justify-content: space-between;\n"
+    "    align-items: center;\n"
+    "    margin-bottom: 15px;\n"
+    "    padding-bottom: 10px;\n"
+    "    border-bottom: 1px solid #eee;\n"
+    "}\n"
+    
+    ".select-title {\n"
+    "    font-weight: 600;\n"
+    "    color: #2c3e50;\n"
+    "}\n"
+    
+    ".select-all {\n"
+    "    background: none;\n"
+    "    border: none;\n"
+    "    color: #3498db;\n"
+    "    cursor: pointer;\n"
+    "    font-size: 0.9rem;\n"
+    "    font-weight: 500;\n"
+    "    padding: 5px 10px;\n"
+    "    border-radius: 4px;\n"
+    "}\n"
+    
+    ".select-all:hover {\n"
+    "    background-color: #f1f8ff;\n"
+    "}\n"
+    
+    "select[multiple] {\n"
+    "    width: 100%;\n"
+    "    padding: 10px;\n"
+    "    border: 1px solid #ddd;\n"
+    "    border-radius: 4px;\n"
+    "    background-color: #f8f9fa;\n"
+    "    height: 200px;\n"
+    "    margin-bottom: 15px;\n"
+    "}\n"
+    
+    "select[multiple] option {\n"
+    "    padding: 8px;\n"
+    "    margin: 4px 0;\n"
+    "    border-radius: 4px;\n"
+    "}\n"
+    
+    "select[multiple] option:hover {\n"
+    "    background-color: #e3f2fd;\n"
+    "}\n"
+    
+    "select[multiple] option:checked {\n"
+    "    background-color: #3498db;\n"
+    "    color: white;\n"
+    "}\n"
+    
+    ".selected-count {\n"
+    "    margin-top: 15px;\n"
+    "    font-size: 0.9rem;\n"
+    "    color: #7f8c8d;\n"
+    "}\n"
+    
+    ".selected-items {\n"
+    "    /*margin-top: 20px;*/\n"
+    "    padding: 15px;\n"
+    "    background-color: #f8f9fa;\n"
+    "    border-radius: 6px;\n"
+    "    border-left: 4px solid #3498db;\n"
+    "}\n"
+    
+    ".selected-items h3 {\n"
+    "    margin-bottom: 10px;\n"
+    "    color: #2c3e50;\n"
+    "    font-size: 1rem;\n"
+    "}\n"
+    
+    ".selected-tags {\n"
+    "    display: flex;\n"
+    "    flex-wrap: wrap;\n"
+    "    gap: 8px;\n"
+    "}\n"
+    
+    ".tag {\n"
+    "    background-color: #3498db;\n"
+    "    color: white;\n"
+    "    padding: 5px 10px;\n"
+    "    border-radius: 20px;\n"
+    "    font-size: 0.85rem;\n"
+    "    display: flex;\n"
+    "    align-items: center;\n"
+    "}\n"
+    
+    ".tag button {\n"
+    "    background: none;\n"
+    "    border: none;\n"
+    "    color: white;\n"
+    "    margin-left: 5px;\n"
+    "    cursor: pointer;\n"
+    "    font-weight: bold;\n"
+    "}\n"
+    
+    ".no-selection {\n"
+    "    color: #95a5a6;\n"
+    "    font-style: italic;\n"
+    "}\n"
+    
+    ".code-example {\n"
+    "    background-color: #2d2d2d;\n"
+    "    color: #f8f8f2;\n"
+    "    padding: 15px;\n"
+    "    border-radius: 5px;\n"
+    "    margin-top: 20px;\n"
+    "    overflow-x: auto;\n"
+    "    font-family: 'Fira Code', monospace;\n"
+    "}\n"
+    
+    "footer {\n"
+    "    text-align: center;\n"
+    "    margin-top: 40px;\n"
+    "    color: #7f8c8d;\n"
+    "    font-size: 0.9rem;\n"
+    "}\n"
+    
 ;
 
 // 文本数据大小(包括null终止符)
-const size_t p_css_index_size = 8113;
+const size_t p_css_index_size = 10639;
 
 // 文本长度(字符数)
-const size_t p_css_index_length = 7864;
+const size_t p_css_index_length = 10390;
 
 #endif /* P_CSS_INDEX_H */

+ 281 - 50
f407/applications/html_h/index_html.h

@@ -1,7 +1,7 @@
 /* 自动生成的文本数据头文件 */
 /* 源文件: index.html */
-/* 文件大小: 57177 字节 */
-/* 生成时间: 2025-09-12 05:41:57 */
+/* 文件大小: 68489 字节 */
+/* 生成时间: 2025-09-16 05:47:07 */
 /* 编码: utf-8 */
 #ifndef P_INDEX_HTML_H
 #define P_INDEX_HTML_H
@@ -60,7 +60,7 @@ const char *p_index_html =
     "            <div class=\"left-buttons\">\n"
     "              <button @click=\"showFzszModal = true;\" class=\"btn btn-threshold\">阈值设置</button>\n"
     "              <button @click=\"showysszModal=true\" class=\"btn btn-delay\">延时设置</button>\n"
-    "              <button @click=\"showFormModal = true\" class=\"btn btn-energy\">耗电量重置</button>\n"
+    "              <button @click=\" hdlsz()\" class=\"btn btn-energy\">耗电量重置</button>\n"
     "            </div>\n"
     "            <div  class=\"right-buttons\">\n"
     "              <button @click=\"toggleAllDevices(true)\" class=\" btn btn-energy\">总开</button>\n"
@@ -116,15 +116,16 @@ const char *p_index_html =
     "            </thead>\n"
     "            <tbody>\n"
     "            <tr v-for=\"device in channelList\">\n"
-    "              <td :style=\"device.colorStyle\">{{ device.productChName }}</td>\n"
-    "              <td :style=\"device.colorStyle\">{{ device.productPhOrder }}</td>\n"
-    "              <td :style=\"device.colorStyle\">{{ device.productChVoltage }}</td>\n"
-    "              <td :style=\"device.colorStyle\">{{ device.productChCurrent }}</td>\n"
-    "              <td :style=\"device.colorStyle\">{{ device.productChPower }}</td>\n"
-    "              <td :style=\"device.colorStyle\">{{ device.productChPowerFreq }}</td>\n"
-    "              <td :style=\"device.colorStyle\">{{ device.productChConsumption }}</td>\n"
-    "              <td :style=\"device.colorStyle\">{{ device.firingInterval }}</td>\n"
-    "              <td :style=\"device.colorStyle\">{{ device.closeInterval }}</td>\n"
+    "              <td >{{ device.productChName }}</td>\n"
+    "              <td >{{ device.productPhOrder }}</td>\n"
+    "              <td v-if=\"device.colorStyledy!=''\" :style=\"device.colorStyledy\">{{ device.productChVoltage }}</td>\n"
+    "              <td v-else  :style=\"device.colorStyledy2\">{{ device.productChVoltage }}</td>\n"
+    "              <td :style=\"device.colorStyledl\">{{ device.productChCurrent }}</td>\n"
+    "              <td  :style=\"device.colorStylegl\">{{ device.productChPower }}</td>\n"
+    "              <td>{{ device.productChPowerFreq }}</td>\n"
+    "              <td :style=\"device.colorStylehdl\">{{ device.productChConsumption }}</td>\n"
+    "              <td >{{ device.firingInterval }}</td>\n"
+    "              <td >{{ device.closeInterval }}</td>\n"
     "              <td :class=\"device.productChStatus ? 'status-active' : 'status-inactive'\">\n"
     "                {{ device.productChStatus==1 ? '接通' : '断开' }}\n"
     "              </td>\n"
@@ -147,12 +148,12 @@ const char *p_index_html =
     "          <div class=\"status-box\">\n"
     "            <h3>温度</h3>\n"
     "            <p v-if=\"statusData.temperatureStatus==0\" style=\"color: red\">{{ statusData.temperature }}</p>\n"
-    "            <p v-else>{{ statusData.temperature }} </p>\n"
+    "            <p v-else :style=\"statusData.tempcolorStyle\">{{ statusData.temperature }} </p>\n"
     "          </div>\n"
     "          <div class=\"status-box\">\n"
     "            <h3>湿度</h3>\n"
     "            <p v-if=\"statusData.temperatureStatus==0\" style=\"color: red\">{{ statusData.humidity }}</p>\n"
-    "            <p v-else>{{ statusData.humidity }} </p>\n"
+    "            <p v-else :style=\"statusData.humcolorStylesx\">{{ statusData.humidity }} </p>\n"
     
     "          </div>\n"
     "          <div class=\"status-box\">\n"
@@ -163,9 +164,9 @@ const char *p_index_html =
     "          <div class=\"status-box\">\n"
     "            <h3>CO2</h3>\n"
     "            <p v-if=\"statusData.smokeStatus==0\" style=\"color: red\">{{ statusData.smoke }}</p>\n"
-    "            <p v-else>{{ statusData.smoke }} </p>\n"
+    "            <p v-else :style=\"statusData.smokecolorStylesx\">{{ statusData.smoke }} </p>\n"
     "          </div>\n"
-    "          <div class=\"status-box\">\n"
+    "          <div class=\"status-box\"  @click=\"showFzszModalgj=true\" style=\" cursor: pointer;  position: relative;    \">\n"
     "            <h3>报警</h3>\n"
     "            <p>{{ statusData.alarm1 }}</p>\n"
     "          </div>\n"
@@ -178,10 +179,31 @@ const char *p_index_html =
     "          <!-- 下拉选择 -->\n"
     "          <div class=\"form-group\" >\n"
     "            <label>通道:</label>\n"
-    "            <select   v-model=\"formData.channel_power_infro\"  class=\"custom-select\">\n"
-    "              <option :value=\"null\" disabled selected hidden style=\"color: #aaa;\">请选择耗电量复位通道...</option>\n"
-    "              <option   v-for=\"option in  channelList1\" :value=\"option.channel_power_infro\">{{ option.productChName }}</option>\n"
+    "            <div class=\"select-header\">\n"
+    "              <p class=\"hint\">提示:使用Ctrl/Cmd键进行多选</p>\n"
+    "              <button class=\"select-all\" @click=\"toggleSelectAll2\">\n"
+    "                {{ formData.productChIds.length === Object.keys(channelList1).length  ? '取消全选' : '全选' }}\n"
+    "              </button>\n"
+    "            </div>\n"
+    "            <select v-model=\"formData.productChIds\" multiple  >\n"
+    "              <option    v-for=\"option in  channelList1\" :value=\"option.productChId\">{{ option.productChName }}</option>\n"
     "            </select>\n"
+    
+    "            <div class=\"selected-items\">\n"
+    "              <h3>已选通道:</h3>\n"
+    "              <div class=\"selected-tags\">\n"
+    "                <span v-if=\"formData.productChIds.length === 0\" class=\"no-selection\">暂无选择</span>\n"
+    "                <div v-for=\"id in formData.productChIds\" :key=\"id\" class=\"tag\">\n"
+    "                  {{ getOptionName2(id) }}\n"
+    "                  <button @click=\"removeOption2(id)\">×</button>\n"
+    "                </div>\n"
+    "              </div>\n"
+    "            </div>\n"
+    "            <!--<label>通道:</label>-->\n"
+    "            <!--<select   v-model=\"formData.channel_power_infro\"  class=\"custom-select\">-->\n"
+    "              <!--<option :value=\"null\" disabled selected hidden style=\"color: #aaa;\">请选择耗电量复位通道...</option>-->\n"
+    "              <!--<option   v-for=\"option in  channelList1\" :value=\"option.channel_power_infro\">{{ option.productChName }}</option>-->\n"
+    "            <!--</select>-->\n"
     "          </div>\n"
     "          <!-- 表单按钮 -->\n"
     "          <div class=\"form-actions\">\n"
@@ -195,6 +217,7 @@ const char *p_index_html =
     "      <div @vue:mounted=\"fzszData\"  v-if=\"showFzszModal\" class=\"modal-overlay\"  >\n"
     "        <div class=\"modal-content\" style=\"max-width: 100%;overflow-y: hidden\">\n"
     "          <h2>阈值设置</h2>\n"
+    "          <button @click=\"handleUpdateList()\" style=\"margin: 10px;\" :class=\"   'btn btn-on'\">批量设置 </button>\n"
     "          <div class=\"scrollable-table\" style=\"    max-height: 60vh; \">\n"
     "            <table class=\"device-table\">\n"
     "              <thead>\n"
@@ -211,7 +234,7 @@ const char *p_index_html =
     "              </thead>\n"
     "              <tbody>\n"
     "              <tr v-for=\"power in powerThresholdList\" :key=\"power.productChId\">\n"
-    "                <td :style=\"{{ power.colorStyle }}\">{{ power.productChName }}</td>\n"
+    "                <td>{{ power.productChName }}</td>\n"
     "                <td>{{ power.productChId }}</td>\n"
     "                <td>{{ power.currentUpperAction }}</td>\n"
     "                <td>{{ power.voltageUpperAction }}</td>\n"
@@ -237,7 +260,30 @@ const char *p_index_html =
     "      <!-- 阈值设置单设备弹窗内容 -->\n"
     "      <div v-if=\"showFzszModal2\" class=\"modal-overlay\"  >\n"
     "        <div class=\"modal-content\">\n"
-    "          <div class=\"form-group\" >\n"
+    "          <div class=\"form-group\" v-if=\"fzscData.list=='1'\" >\n"
+    "            <label>通道:</label>\n"
+    "            <div class=\"select-header\">\n"
+    "              <p class=\"hint\">提示:使用Ctrl/Cmd键进行多选</p>\n"
+    "              <button class=\"select-all\" @click=\"toggleSelectAll\">\n"
+    "                {{ fzscData.productChIds.length === Object.keys(channelList1).length  ? '取消全选' : '全选' }}\n"
+    "              </button>\n"
+    "            </div>\n"
+    "            <select v-model=\"fzscData.productChIds\" multiple  >\n"
+    "              <option    v-for=\"option in  channelList1\" :value=\"option.productChId\">{{ option.productChName }}</option>\n"
+    "            </select>\n"
+    
+    "            <div class=\"selected-items\">\n"
+    "              <h3>已选通道:</h3>\n"
+    "              <div class=\"selected-tags\">\n"
+    "                <span v-if=\"fzscData.productChIds.length === 0\" class=\"no-selection\">暂无选择</span>\n"
+    "                <div v-for=\"id in fzscData.productChIds\" :key=\"id\" class=\"tag\">\n"
+    "                  {{ getOptionName(id) }}\n"
+    "                  <button @click=\"removeOption(id)\">×</button>\n"
+    "                </div>\n"
+    "              </div>\n"
+    "            </div>\n"
+    "          </div>\n"
+    "          <div class=\"form-group\"  v-if=\"fzscData.list==''\">\n"
     "            <label>通道号:</label>\n"
     "            <input type=\"text\" v-model=\"fzscData.productChId\"  readonly >\n"
     "          </div>\n"
@@ -261,7 +307,6 @@ const char *p_index_html =
     "            <label>耗电量上限:</label>\n"
     "            <input type=\"text\" v-model=\"fzscData.alarmContentUpperAction\">\n"
     "          </div>\n"
-    
     "          <!-- 表单按钮 -->\n"
     "          <div class=\"form-actions\">\n"
     "            <button  class=\"btn  btn-energy\" @click=\"fzscClick()\"  >提交</button>\n"
@@ -330,6 +375,35 @@ const char *p_index_html =
     "        </div>\n"
     "      </div>\n"
     
+    "      <!--告警信息弹窗-->\n"
+    "      <div    v-if=\"showFzszModalgj\" class=\"modal-overlay\"  >\n"
+    "        <div class=\"modal-content\" style=\"max-width: 100%;overflow-y: hidden\">\n"
+    "          <div class=\"scrollable-table\" style=\"    max-height: 60vh; \">\n"
+    "            <table class=\"device-table\">\n"
+    "              <thead>\n"
+    "              <tr>\n"
+    "                <th>序号</th>\n"
+    "                <th>报警时间</th>\n"
+    "                <th>报警类型</th>\n"
+    "                <th>报警信息</th>\n"
+    "              </tr>\n"
+    "              </thead>\n"
+    "              <tbody>\n"
+    "              <tr  v-for=\"(item, index) in his_alarmd\" :key=\"index\">\n"
+    "                <td>{{  item.number   }}</td>\n"
+    "                <td>{{ item.date }}</td>\n"
+    "                <td>{{ item.type }}</td>\n"
+    "                <td>{{ item.waning_context }}</td>\n"
+    "              </tr>\n"
+    "              </tbody>\n"
+    "            </table>\n"
+    "          </div>\n"
+    "          <!-- 表单按钮 -->\n"
+    "          <div class=\"button-footer form-actions\">\n"
+    "            <button type=\"button\"  class=\"btn  btn-energy\" @click=\"fzscClickClosegj()\">取消</button>\n"
+    "          </div>\n"
+    "        </div>\n"
+    "      </div>\n"
     
     "    </div>\n"
     
@@ -738,10 +812,19 @@ const char *p_index_html =
     "                    delay_update(this.saveDataAll.channel_power_infro)\n"
     "                    this.ysszClickClose2()\n"
     "                }else if(this.popType=='hdlcz'){\n"
-    "                    power_reset(this.saveDataAll.channel_power_infro)\n"
+    "                    for(const ket in this.saveDataAll.channel_power_infros){\n"
+    "                        power_reset(this.saveDataAll.channel_power_infros[ket])\n"
+    "                    }\n"
     "                    this.hdlczClickClose()\n"
     "                }else if(this.popType=='fzsz'){\n"
-    "                    threshold_update(this.saveDataAll.channel_power_infro)\n"
+    "                    if(this.saveDataAll.list=='1'){\n"
+    "                        for(const ket in this.saveDataAll.channel_power_infros){\n"
+    "                            threshold_update(this.saveDataAll.channel_power_infros[ket])\n"
+    "                        }\n"
+    "                    }else{\n"
+    "                        threshold_update(this.saveDataAll.channel_power_infro)\n"
+    "                    }\n"
+    
     "                    this.fzscClickClose2()\n"
     "                }else if(this.popType=='tdkg'){\n"
     
@@ -792,12 +875,16 @@ const char *p_index_html =
     "            showFormModal:false,\n"
     "            // 阈值设置\n"
     "            showFzszModal:false,\n"
+    "            //告警\n"
+    "            showFzszModalgj:false,\n"
     "            showFzszModal2:false,\n"
     "            showysszModal:false,\n"
     "            showysszModal2:false,\n"
-    "            formData:{productChName:null,productChId:null,channel_power_infro:null},\n"
+    "            formData:{productChName:null,productChId:null,channel_power_infro:null,productChIds:[]},\n"
     "            powerThresholdList:[],\n"
-    "            fzscData:{},\n"
+    "            fzscData:{\n"
+    "                productChIds:[]\n"
+    "            },\n"
     "            items: [],\n"
     "            newItem: '',\n"
     "            loading: false,\n"
@@ -836,6 +923,7 @@ const char *p_index_html =
     "            channelList1:[],\n"
     "            ysszList:[],\n"
     "            totalFormList:[],\n"
+    "            his_alarmd:[],\n"
     "            ysszData2:{},\n"
     "            popMessage:'',\n"
     "            popType:'',\n"
@@ -889,6 +977,68 @@ const char *p_index_html =
     "            /** 阈值设置按钮操作 */\n"
     "            handleUpdate(row) {\n"
     "                this.fzscData = JSON.parse(JSON.stringify(row));\n"
+    "                this.fzscData.list='';\n"
+    "                this.showFzszModal2 = true;\n"
+    "                // this.title = this.$t('pz');\n"
+    "            },\n"
+    "            getOptionName(id) {\n"
+    "                for(const key in   this.channelList1){\n"
+    "                    if(this.channelList1[key].productChId===id){\n"
+    "                        return this.channelList1[key].productChName\n"
+    "                        break\n"
+    "                    }\n"
+    "                }\n"
+    "                ;\n"
+    "            },\n"
+    "            removeOption(id) {\n"
+    "                this.fzscData.productChIds = this.fzscData.productChIds.filter(optId => optId !== id);\n"
+    "            },\n"
+    "            toggleSelectAll() {\n"
+    
+    "                if (this.fzscData.productChIds.length === Object.keys(this.channelList1).length ) {\n"
+    "                    this.fzscData.productChIds = [];\n"
+    "                } else {\n"
+    "                    for(const key in   this.channelList1){\n"
+    "                        this.fzscData.productChIds.push(this.channelList1[key].productChId)\n"
+    "                    }\n"
+    
+    "                   // this.fzscData.productChIds = this.channelList1.map(option => option.productChId);\n"
+    "                }\n"
+    "            },\n"
+    
+    "            getOptionName2(id) {\n"
+    "                for(const key in   this.channelList1){\n"
+    "                    if(this.channelList1[key].productChId===id){\n"
+    "                        return this.channelList1[key].productChName\n"
+    "                        break\n"
+    "                    }\n"
+    "                }\n"
+    "                ;\n"
+    "            },\n"
+    "            removeOption2(id) {\n"
+    "                this.formData.productChIds = this.formData.productChIds.filter(optId => optId !== id);\n"
+    "            },\n"
+    "            toggleSelectAll2() {\n"
+    "                if (this.formData.productChIds.length === Object.keys(this.channelList1).length ) {\n"
+    "                    this.formData.productChIds = [];\n"
+    "                } else {\n"
+    "                    for(const key in   this.channelList1){\n"
+    "                        this.formData.productChIds.push(this.channelList1[key].productChId)\n"
+    "                    }\n"
+    
+    "                   // this.fzscData.productChIds = this.channelList1.map(option => option.productChId);\n"
+    "                }\n"
+    "            },\n"
+    "  /** 阈值设置按钮操作 */\n"
+    "            handleUpdateList() {\n"
+    "                this.fzscData.list='1';\n"
+    "                this.fzscData.productChIds=[];\n"
+    "                this.fzscData.currentUpperAction='';\n"
+    "                this.fzscData.voltageUpperAction='';\n"
+    "                this.fzscData.voltageDownAction='';\n"
+    "                this.fzscData.powerUpperAction='';\n"
+    "                this.fzscData.alarmContentUpperAction='';\n"
+    
     "                this.showFzszModal2 = true;\n"
     "                // this.title = this.$t('pz');\n"
     "            },\n"
@@ -916,6 +1066,9 @@ const char *p_index_html =
     "                this.powerThresholdList=[];\n"
     "                //    this.formData.productChId=null;\n"
     "            },\n"
+    "            fzscClickClosegj(){\n"
+    "                this.showFzszModalgj = false;\n"
+    "            },\n"
     
     "            fzscClickClose2(){\n"
     "                this.showFzszModal2 = false\n"
@@ -930,11 +1083,27 @@ const char *p_index_html =
     "                this.showysszModal2 = false;\n"
     "            },\n"
     
+    "            hdlsz(){\n"
+    "                this.formData.productChIds=[]\n"
+    "                this.showFormModal = true\n"
+    "            },\n"
+    
     "            // 耗电量重置\n"
     "            async hdlczClick(){\n"
     "                const params={};\n"
+    "                let lists=[]\n"
+    "                console.log( this.formData.productChIds)\n"
+    "                for( const id in  this.formData.productChIds){\n"
+    "                    for( const key in  this.powerThresholdList ){\n"
+    "                        if(this.formData.productChIds[id]== this.powerThresholdList[key].productChId){\n"
+    "                            lists.push(this.powerThresholdList[key].channel_power_infro);\n"
+    "                            break\n"
+    "                        }\n"
+    "                    }\n"
+    "                }\n"
+    "                params.channel_power_infros= lists;\n"
     
-    "                params.channel_power_infro=this.formData.channel_power_infro;\n"
+    "              //  params.channel_power_infro=this.formData.channel_power_infro;\n"
     "                this.popMessage=\"确认要重置此通道吗?\";\n"
     "                // const result = await confirmAction({\n"
     "                //     title: message\n"
@@ -949,12 +1118,46 @@ const char *p_index_html =
     "            // 阈值设置保存\n"
     "            async fzscClick(){\n"
     "                const params={};\n"
-    "                params.channel_power_infro=this.fzscData.channel_power_infro;\n"
-    "                params.channel_power_infro.thr.w_upper=this.fzscData.alarmContentUpperAction* 1000;\n"
-    "                params.channel_power_infro.thr.c_upper=this.fzscData.currentUpperAction* 10;\n"
-    "                params.channel_power_infro.thr.p_upper=this.fzscData.powerUpperAction* 1000;\n"
-    "                params.channel_power_infro.thr.v_lower=this.fzscData.voltageDownAction* 10;\n"
-    "                params.channel_power_infro.thr.v_upper=this.fzscData.voltageUpperAction* 10;\n"
+    "                params.list=this.fzscData.list;\n"
+    "                if(this.fzscData.list=='1'){\n"
+    "                    if(this.fzscData.productChIds.length==0){\n"
+    "                        alert(\"请选择通道\")\n"
+    "                        return\n"
+    "                    }\n"
+    "                    if(this.fzscData.alarmContentUpperAction=='' || this.fzscData.currentUpperAction=='' || this.fzscData.voltageDownAction==''  || this.fzscData.voltageUpperAction==''){\n"
+    "                        alert(\"存在未设置项,请重试\")\n"
+    "                        return\n"
+    "                    }\n"
+    "                    if(this.fzscData.voltageUpperAction!=0 && this.fzscData.voltageDownAction !=0 && this.fzscData.voltageUpperAction* 10<=this.fzscData.voltageDownAction* 10){\n"
+    "                        alert(\"电压上限需要大于下限\")\n"
+    "                        return\n"
+    "                    }\n"
+    "                    let lists=[]\n"
+    "                    for( const id in  this.fzscData.productChIds){\n"
+    "                        for( const key in  this.powerThresholdList ){\n"
+    "                               if(this.fzscData.productChIds[id]== this.powerThresholdList[key].productChId){\n"
+    "                                   let param=this.powerThresholdList[key].channel_power_infro;\n"
+    "                                   param.thr.w_upper=this.fzscData.alarmContentUpperAction* 1000;\n"
+    "                                   param.thr.c_upper=this.fzscData.currentUpperAction* 10;\n"
+    "                                   param.thr.p_upper=this.fzscData.powerUpperAction* 1000;\n"
+    "                                   param.thr.v_lower=this.fzscData.voltageDownAction* 10;\n"
+    "                                   param.thr.v_upper=this.fzscData.voltageUpperAction* 10;\n"
+    "                                   lists.push(param);\n"
+    "                                      break\n"
+    "                               }\n"
+    "                        }\n"
+    "                    }\n"
+    "                    params.channel_power_infros= lists;\n"
+    
+    "                }else{\n"
+    "                    params.channel_power_infro=this.fzscData.channel_power_infro;\n"
+    "                    params.channel_power_infro.thr.w_upper=this.fzscData.alarmContentUpperAction* 1000;\n"
+    "                    params.channel_power_infro.thr.c_upper=this.fzscData.currentUpperAction* 10;\n"
+    "                    params.channel_power_infro.thr.p_upper=this.fzscData.powerUpperAction* 1000;\n"
+    "                    params.channel_power_infro.thr.v_lower=this.fzscData.voltageDownAction* 10;\n"
+    "                    params.channel_power_infro.thr.v_upper=this.fzscData.voltageUpperAction* 10;\n"
+    
+    "                }\n"
     
     "                this.popMessage=\"确认要保存吗?\";\n"
     "                // const result = await confirmAction({\n"
@@ -1005,18 +1208,7 @@ const char *p_index_html =
     
     "            // 获取数据方法\n"
     "            async fetchData() {\n"
-    "                // var js={\n"
-    "                //     \"sys\":{\n"
-    "                //         \"lang\": 0,\n"
-    "                //         \"tzone\": 8,\n"
-    "                //         \"route\": 90,\n"
-    "                //         \"ver\": \"V1.0.0\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\",\n"
-    "                //         \"sys_time\": \"2025/09/09 01:00:06\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\",\n"
-    "                //         \"len\": 52\n"
-    "                //     }\n"
-    "                //\n"
-    "                // }\n"
-    "                // on_ws_msg(js)\n"
+    "         \n"
     "                function5();\n"
     "                this.queryTotalStatus5();\n"
     "                if (activePageIntervalId1 != null) {\n"
@@ -1024,7 +1216,7 @@ const char *p_index_html =
     "                };\n"
     "                activePageIntervalId1 = setInterval(() => {\n"
     "                    if(tabId=='tab1'){\n"
-    "                        function1();\n"
+    "                         function1();\n"
     "                        this.queryTotalStatus();\n"
     "                        if(this.wlszForm4.sys_time=='' || this.wlszForm4.sys_time==null){\n"
     "                            this.queryTotalStatus5();\n"
@@ -1063,8 +1255,23 @@ const char *p_index_html =
     "                this.channelList1 = {...channelAllList1};\n"
     "                this.powerThresholdList = {...initialYzFormList};\n"
     "                this.ysszList = {...channelAllList1};\n"
-    "                if({...data_alarm}!=null){\n"
-    "                    this.statusData.alarm1 =  Object.keys({...data_alarm}).length;\n"
+    "                if({...his_alarm}!=null){\n"
+    "                    this.statusData.alarm1 =  Object.keys({...his_alarm}).length;\n"
+    "                    var alarmds={...his_alarm};\n"
+    "                    this.his_alarmd=[]\n"
+    "                    for(var i=0;i<Object.keys({...his_alarm}).length ;i++){\n"
+    "                        var open=alarmds[i];\n"
+    "                            open.number=i+1;\n"
+    "                        open.date= (open.date.replace(/\\\\u0000/g, '\\u0000')).replace(/\\u0000/g, '');\n"
+    "                        open.waning_context= (open.waning_context.replace(/\\\\u0000/g, '\\u0000')).replace(/\\u0000/g, '');\n"
+    "                        if(open.type==0){\n"
+    "                            open.type='电量信息报警'\n"
+    "                        }else if(open.type==1){\n"
+    "                            open.type='传感器报警'\n"
+    "                        }\n"
+    "                        this.his_alarmd.push(open)\n"
+    "                    }\n"
+    
     "                }\n"
     "                if({...sensorc_list}!=null && Object.keys({...sensorc_list}).length>0){\n"
     "                   let sencorList={...sensorc_list};\n"
@@ -1074,7 +1281,24 @@ const char *p_index_html =
     "                               try{\n"
     "                                   let sensor_val =sencorList[key].sensor_val\n"
     "                                   this.statusData.temperature=sensor_val[1].val.toFixed(2)\n"
+    
+    "                                   if(sensor_val[1].s_alarm  & 0x1){ // 上限\n"
+    "                                       this.statusData.tempcolorStyle='color: red;font-weight: bold;'\n"
+    "                                   }else if(sensor_val[1].s_alarm & 0x2){ // 下限\n"
+    "                                       this.statusData.tempcolorStyle='color:  #ff00ff;font-weight: bold;'\n"
+    "                                   }else{\n"
+    "                                       this.statusData.tempcolorStyle=''\n"
+    "                                   }\n"
+    
     "                                   this.statusData.humidity=sensor_val[0].val.toFixed(2)\n"
+    
+    "                                   if(sensor_val[0].s_alarm  & 0x1){ // 上限\n"
+    "                                       this.statusData.humcolorStylesx='color: red;font-weight: bold;'\n"
+    "                                   }else if(sensor_val[0].s_alarm & 0x2){ // 下限\n"
+    "                                       this.statusData.humcolorStylesx='color:  #ff00ff;font-weight: bold;'\n"
+    "                                   }else{\n"
+    "                                       this.statusData.humcolorStylesx=''\n"
+    "                                   }\n"
     "                               }catch (e) {\n"
     "                                   console.log(\"温湿度传感器赋值失败\")\n"
     "                               }\n"
@@ -1104,6 +1328,13 @@ const char *p_index_html =
     "                               try{\n"
     "                                   let sensor_val =sencorList[key].sensor_val\n"
     "                                   this.statusData.smoke=sensor_val[0].val.toFixed(2)\n"
+    "                                   if(sensor_val[0] & 0x1 ){ // 上限\n"
+    "                                       this.statusData.smokecolorStylesx='color: red;font-weight: bold;'\n"
+    "                                   }else if(sensor_val[0] & 0x2){ // 下限\n"
+    "                                       this.statusData.smokecolorStylesx='color:  #ff00ff;font-weight: bold;'\n"
+    "                                   }else{\n"
+    "                                       this.statusData.smokecolorStylesx=''\n"
+    "                                   }\n"
     "                               }catch (e) {\n"
     "                                   console.log(\"CO2传感器赋值失败\")\n"
     "                               }\n"
@@ -1473,9 +1704,9 @@ const char *p_index_html =
 ;
 
 // 文本数据大小(包括null终止符)
-const size_t p_index_html_size = 57178;
+const size_t p_index_html_size = 68490;
 
 // 文本长度(字符数)
-const size_t p_index_html_length = 55265;
+const size_t p_index_html_length = 66291;
 
 #endif /* P_INDEX_HTML_H */

+ 1 - 1
f407/applications/html_h/index_js.h

@@ -1,7 +1,7 @@
 /* 自动生成的文本数据头文件 */
 /* 源文件: index.js */
 /* 文件大小: 417 字节 */
-/* 生成时间: 2025-09-12 05:42:13 */
+/* 生成时间: 2025-09-16 05:47:25 */
 /* 编码: utf-8 */
 #ifndef P_INDEX_JS_H
 #define P_INDEX_JS_H

+ 5 - 4
f407/applications/html_h/operation.h

@@ -1,7 +1,7 @@
 /* 自动生成的文本数据头文件 */
 /* 源文件: operation.js */
-/* 文件大小: 3700 字节 */
-/* 生成时间: 2025-09-12 05:42:14 */
+/* 文件大小: 3765 字节 */
+/* 生成时间: 2025-09-16 05:47:25 */
 /* 编码: utf-8 */
 #ifndef P_OPERATION_H
 #define P_OPERATION_H
@@ -110,6 +110,7 @@ const char *p_operation =
     "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, 0, 0, 0));\n"
     "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_SENSOR, 0, 0, 0, 0));\n"
     "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SYS, 0, 0, 0));\n"
+    "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_ALARM, 0, 0, 0, 0));\n"
     "}\n"
     
     "//获取网络配置信息\n"
@@ -139,9 +140,9 @@ const char *p_operation =
 ;
 
 // 文本数据大小(包括null终止符)
-const size_t p_operation_size = 3701;
+const size_t p_operation_size = 3766;
 
 // 文本长度(字符数)
-const size_t p_operation_length = 3532;
+const size_t p_operation_length = 3597;
 
 #endif /* P_OPERATION_H */

+ 1 - 1
f407/applications/html_h/petite-vue.min.h

@@ -1,7 +1,7 @@
 /* 自动生成的文本数据头文件 */
 /* 源文件: petite-vue.min.js */
 /* 文件大小: 16901 字节 */
-/* 生成时间: 2025-09-12 05:42:14 */
+/* 生成时间: 2025-09-16 05:47:25 */
 /* 编码: us-ascii */
 #ifndef P_PETITE_VUE_H
 #define P_PETITE_VUE_H

+ 1 - 1
f407/applications/html_h/sys_para.h

@@ -1,7 +1,7 @@
 /* 自动生成的文本数据头文件 */
 /* 源文件: sys_paras.js */
 /* 文件大小: 240 字节 */
-/* 生成时间: 2025-09-12 05:42:14 */
+/* 生成时间: 2025-09-16 05:47:25 */
 /* 编码: us-ascii */
 #ifndef P_SYS_PARA_H
 #define P_SYS_PARA_H

+ 14 - 7
f407/applications/html_h/ws.h

@@ -1,7 +1,7 @@
 /* 自动生成的文本数据头文件 */
 /* 源文件: ws.js */
-/* 文件大小: 3174 字节 */
-/* 生成时间: 2025-09-12 05:42:14 */
+/* 文件大小: 3306 字节 */
+/* 生成时间: 2025-09-16 05:47:25 */
 /* 编码: utf-8 */
 #ifndef P_WS_H
 #define P_WS_H
@@ -25,6 +25,8 @@ const char *p_ws =
     
     "let sensor_data = {}\n"
     
+    "let his_alarm = []\n"
+    
     "function on_ws_msg(js) {\n"
     "    console.log(\"执行\")\n"
     
@@ -84,13 +86,18 @@ const char *p_ws =
     "        sensorc_list = [];\n"
     "        // 传感器\n"
     "        sensorc_list = js.sensorc\n"
-    "        console.log(sensorc_list)\n"
+    "            // console.log(sensorc_list)\n"
     "    }\n"
     "    if (js.sys != undefined) {\n"
     "        lang_data = js.sys\n"
     "            // console.log(lang_data)\n"
     "    }\n"
     
+    "    if (js.his_alarmd != undefined) {\n"
+    "        his_alarm = js.his_alarmd;\n"
+    "        console.log(his_alarm)\n"
+    "    }\n"
+    
     "}\n"
     
     "function alarm_process(alarmd_data) {\n"
@@ -133,16 +140,16 @@ const char *p_ws =
     "    activePageIntervalId = setInterval(pageFunction, intervalTime);\n"
     "}\n"
     
-    "ws = new WS('ws://' + window.location.host + '/ws', on_ws_msg);\n"
+    "ws = new WS('ws://'+window.location.host+'/ws',on_ws_msg);\n"
     
     "// ws = new WS('ws://192.168.1.134/ws', on_ws_msg);\n"
-    "// ws = new WS('ws://192.168.1.134/websocket/TMS-WebSocket', on_ws_msg);"
+    "//ws = new WS('ws://192.168.1.134/websocket/TMS-WebSocket', on_ws_msg);"
 ;
 
 // 文本数据大小(包括null终止符)
-const size_t p_ws_size = 3175;
+const size_t p_ws_size = 3307;
 
 // 文本长度(字符数)
-const size_t p_ws_length = 3016;
+const size_t p_ws_length = 3148;
 
 #endif /* P_WS_H */

+ 38 - 38
f407/applications/net.c

@@ -425,44 +425,44 @@ int net_init(void)
 //  }
 	
 	
-	paras_data_t* para = paras_get();
-	
-	if(para->netwk.mode == 0)			//dhcp
-	{
-		//获取dhcp ipaddr and 
-		struct dhcp* dhcp = netif_dhcp_data(handle_net.netif);
-		if(!dhcp)
-		{
-			LOG_E("___ %s dhcp failed!!\n",DFLT_NIC);
-			goto failed;
-		}
-		
-		if(dhcp->state == DHCP_STATE_REBINDING)
-		{
-			//dhcp->offered_ip_addr.addr = 
-			//filt 
-			char * str =  ip4addr_ntoa(netif_ip4_addr(handle_net.netif));
-			LOG_D("____%s\n",str);
-			memcpy(para->netwk.ipaddr,str,strlen(str));
-			str =  ip4addr_ntoa(netif_ip4_netmask(handle_net.netif));
-			LOG_D("____%s\n",str);
-			memcpy(para->netwk.mask,str,strlen(str));
-			
-			str =  ip4addr_ntoa(netif_ip4_gw(handle_net.netif));
-			memcpy(para->netwk.gateway,str,strlen(str));
-			LOG_D("____%s\n",str);
-			
-		}else
-		{
-			
-		}
-		
-	}else if(para->netwk.mode == 1)   //static
-	{
-		netifapi_dhcp_stop(handle_net.netif);
-		ip_set_static();
-	}
-	
+//	paras_data_t* para = paras_get();
+//	
+//	if(para->netwk.mode == 0)			//dhcp
+//	{
+//		//获取dhcp ipaddr and 
+//		struct dhcp* dhcp = netif_dhcp_data(handle_net.netif);
+//		if(!dhcp)
+//		{
+//			LOG_E("___ %s dhcp failed!!\n",DFLT_NIC);
+//			goto failed;
+//		}
+//		
+//		if(dhcp->state == DHCP_STATE_REBINDING)
+//		{
+//			//dhcp->offered_ip_addr.addr = 
+//			//filt 
+//			char * str =  ip4addr_ntoa(netif_ip4_addr(handle_net.netif));
+//			LOG_D("____%s\n",str);
+//			memcpy(para->netwk.ipaddr,str,strlen(str));
+//			str =  ip4addr_ntoa(netif_ip4_netmask(handle_net.netif));
+//			LOG_D("____%s\n",str);
+//			memcpy(para->netwk.mask,str,strlen(str));
+//			
+//			str =  ip4addr_ntoa(netif_ip4_gw(handle_net.netif));
+//			memcpy(para->netwk.gateway,str,strlen(str));
+//			LOG_D("____%s\n",str);
+//			
+//		}else
+//		{
+//			
+//		}
+//		
+//	}else if(para->netwk.mode == 1)   //static
+//	{
+//		netifapi_dhcp_stop(handle_net.netif);
+//		ip_set_static();
+//	}
+//	
 	
 	
 	return 0;

+ 6 - 4
f407/applications/rtconfig.h

@@ -26,6 +26,7 @@
 #define RT_IDLE_HOOK_LIST_SIZE 4
 #define IDLE_THREAD_STACK_SIZE 1024
 
+#define RT_DEBUGING_AUTO_INIT
 
 // kservice optimization
 //#define RT_USING_DEBUG
@@ -164,9 +165,10 @@
 #define RT_LWIP_MEM_ALIGNMENT 4
 
 //lwip debug setting
-//#define RT_LWIP_DEBUG
+#define RT_LWIP_DEBUG
 //#define RT_LWIP_PBUF_DEBUG
 //#define RT_LWIP_TCPIP_DEBUG
+#define RT_LWIP_DHCP_DEBUG
 
 
 #define RT_LWIP_TCP
@@ -180,9 +182,9 @@
 #define IP_SOF_BROADCAST 1
 #define IP_SOF_BROADCAST_RECV 1
 
-#define RT_LWIP_IPADDR   "192.168.1.166"
-#define RT_LWIP_GWADDR   "192.168.1.1"
-#define RT_LWIP_MSKADDR  "255.255.255.0"
+//#define RT_LWIP_IPADDR   "192.168.1.166"
+//#define RT_LWIP_GWADDR   "192.168.1.1"
+//#define RT_LWIP_MSKADDR  "255.255.255.0"
 #define RT_LWIP_UDP
 #define RT_LWIP_TCP
 #define RT_LWIP_RAW

+ 1 - 1
f407/applications/ui/menu.c

@@ -209,7 +209,7 @@ static void menu_system_paint(menu_handle_t *h, int font1, int font2, int item_h
     lcd_draw_string(10, item_h*3, LCD_WIDTH-10, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 		
 		
-    sprintf(tmp, "IP:%s", RT_LWIP_IPADDR);//getLocalIpAddress("e0"));
+    //sprintf(tmp, "IP:%s", RT_LWIP_IPADDR);//getLocalIpAddress("e0"));
     lcd_draw_string(10, item_h*4, LCD_WIDTH-10, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
     //lcd_refresh();
 }

Разлика између датотеке није приказан због своје велике величине
+ 44346 - 0
f407/project/app/JLinkLog.txt


+ 47 - 0
f407/project/app/JLinkSettings.ini

@@ -0,0 +1,47 @@
+[BREAKPOINTS]
+ForceImpTypeAny = 0
+ShowInfoWin = 1
+EnableFlashBP = 2
+BPDuringExecution = 0
+[CFI]
+CFISize = 0x00
+CFIAddr = 0x00
+[CPU]
+MonModeVTableAddr = 0xFFFFFFFF
+MonModeDebug = 0
+MaxNumAPs = 0
+LowPowerHandlingMode = 0
+OverrideMemMap = 0
+AllowSimulation = 1
+ScriptFile=""
+[FLASH]
+RMWThreshold = 0x400
+Loaders=""
+EraseType = 0x00
+CacheExcludeSize = 0x00
+CacheExcludeAddr = 0x00
+MinNumBytesFlashDL = 0
+SkipProgOnCRCMatch = 1
+VerifyDownload = 1
+AllowCaching = 1
+EnableFlashDL = 2
+Override = 1
+Device="ARM7"
+[GENERAL]
+WorkRAMSize = 0x00
+WorkRAMAddr = 0x00
+RAMUsageLimit = 0x00
+[SWO]
+SWOLogFile=""
+[MEM]
+RdOverrideOrMask = 0x00
+RdOverrideAndMask = 0xFFFFFFFF
+RdOverrideAddr = 0xFFFFFFFF
+WrOverrideOrMask = 0x00
+WrOverrideAndMask = 0xFFFFFFFF
+WrOverrideAddr = 0xFFFFFFFF
+[RAM]
+VerifyDownload = 0x00
+[MEM_MAP]
+[DYN_MEM_MAP]
+NumUserRegion = 0x00

+ 1 - 0
f407/project/app/LoadSym.ini

@@ -0,0 +1 @@
+LOAD %L INCREMENTAL

+ 0 - 4
f407/project/app/app.uvoptx

@@ -117,10 +117,6 @@
         <pMon>Segger\JL2CM3.dll</pMon>
       </DebugOpt>
       <TargetDriverDllRegistry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>DLGUARM</Key>
-        </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Key>ARMRTXEVENTFLAGS</Key>

+ 1 - 1
f427/applications/datadef.h

@@ -10,7 +10,7 @@
 
 #define POWER_CH_MAX                12
 #define POWER_BOARD_MAX             32
-#define POWER_BOARD_TIMEOUT         200
+#define POWER_BOARD_TIMEOUT         100
 #define POWER_RETRY_TIMES           3
 #define POWER_SLAVE_CH_MAX          32
 #define POWER_CASCADE_MAX           32

+ 20 - 0
f427/applications/fifo/fifo.c

@@ -72,6 +72,26 @@ bool generic_list_append(GenericFixedList *list, const void *data, size_t data_s
     }
 }
 
+void generic_list_get(GenericFixedList *list,void * data,uint8_t lenth)
+{
+	if(lenth >= list->current_size)
+		lenth = list->current_size;
+	if(lenth == 0)
+			return;
+	
+	GenericNode *p_node = list->head;
+	int i = 0;
+	int p_start = 0;
+	for(;;p_node = p_node->next,i++)
+	{
+		memcpy(data+p_start,p_node->data,p_node->data_size);
+		p_start += p_node->data_size;
+		if(p_node == list->tail)
+		{
+			break;
+		}
+	}
+}
 
 void generic_list_destroy(GenericFixedList *list) {
     if (list->current_size > 0) {

+ 9 - 3
f427/applications/fifo/fifo.h

@@ -5,7 +5,7 @@
 #include "stddef.h"
 #include "stdbool.h"
 
-
+#include "stdint.h"
 
 
 
@@ -19,17 +19,20 @@ typedef struct GenericNode {
 typedef struct {
     GenericNode *head;
     GenericNode *tail;
-    int max_size;
-    int current_size;
+    uint32_t max_size;
+    uint32_t current_size;
 } GenericFixedList;
 
 
 GenericNode* generic_node_create(const void *data, size_t data_size);
 GenericFixedList* generic_list_create(int max_size);
 
+void generic_list_get(GenericFixedList *list,void * data,uint8_t lenth);
+
 bool generic_list_append(GenericFixedList *list, const void *data, size_t data_size);
 
 
+
 void generic_list_destroy(GenericFixedList *list);
 
 
@@ -43,4 +46,7 @@ int generic_list_get_count(GenericFixedList *list);
 
 
 
+
+
+
 #endif

+ 3 - 1
f427/applications/main.c

@@ -16,6 +16,7 @@
 #include "snmp.h"
 #include "net.h"
 #include "wanning.h"
+#include "sensor.h"
 
 //https://embedded-rd.blog.csdn.net/article/details/109643188
 
@@ -118,6 +119,7 @@ int main(void)
     sys_init();
     user_init();
     while (1) {
-			sleep(2);
+			sensor_query();
+			sleep(1);
     }
 }

+ 54 - 47
f427/applications/power.c

@@ -573,7 +573,7 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 										if(!old_v_upper && pch->alarm.v_upper)
 										{
 											
-											memset(&info.waning_context,0,sizeof(32));
+											memset(&info.waning_context,0,sizeof(64));
 											sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
 											sprintf(info.waning_context,"%s over max voltage",pch->info.name);
 											wanning_insert(info);
@@ -584,9 +584,9 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 												data.ID = i;
 												data.Alarmid = ALARM_TYPE_POWER;
 												memcpy(data.AlarmDate,info.date,32);
-												memcpy(data.AlarmContext,info.waning_context,32);
-												send_snmp_tarp();
-												//snmp_power_alarm_trap(&t_info);
+												memcpy(data.AlarmContext,info.waning_context,64);
+//												send_snmp_tarp();
+												snmp_power_alarm_trap(&data);
 //												system("snmp");
 											}
 											beep_set(1);
@@ -594,74 +594,78 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 									
 										if(!old_v_lower && pch->alarm.v_lower)
 										{
-											memset(&info.waning_context,0,sizeof(32));
+											memset(&info.waning_context,0,sizeof(64));
 											sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
 											sprintf(info.waning_context,"%s over min voltage",pch->info.name);
 											wanning_insert(info);
-//											if(paras_get()->snmp.trapmode == 1)
-//											{
-//												AlarmTrapinfo t_info={0};
-//												t_info.ID = i;
-//												t_info.Alarmid = ALARM_TYPE_POWER;
-//												memcpy(t_info.AlarmDate,info.date,32);
-//												memcpy(t_info.AlarmContext,info.waning_context,32);
-//												snmp_power_alarm_trap(&t_info);
-//											}
+											if(paras_get()->snmp.trapmode == 1)
+											{
+												//AlarmTrapinfo t_info={0};
+												data.ID = i;
+												data.Alarmid = ALARM_TYPE_POWER;
+												memcpy(data.AlarmDate,info.date,32);
+												memcpy(data.AlarmContext,info.waning_context,64);
+//												send_snmp_tarp();
+												snmp_power_alarm_trap(&data);
+											}
 											beep_set(1);
 										}									
 									
 										if(!old_c_upper && pch->alarm.c_upper)
 										{
-											memset(&info.waning_context,0,sizeof(32));
+											memset(&info.waning_context,0,sizeof(64));
 											sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
 											sprintf(info.waning_context,"%s over max current",pch->info.name);
 											wanning_insert(info);
 											beep_set(1);
-//											if(paras_get()->snmp.trapmode == 1)
-//											{
-//												AlarmTrapinfo t_info={0};
-//												t_info.ID = i;
-//												t_info.Alarmid = ALARM_TYPE_POWER;
-//												memcpy(t_info.AlarmDate,info.date,32);
-//												memcpy(t_info.AlarmContext,info.waning_context,32);
-//												snmp_power_alarm_trap(&t_info);
-//											}
+											if(paras_get()->snmp.trapmode == 1)
+											{
+												//AlarmTrapinfo t_info={0};
+												data.ID = i;
+												data.Alarmid = ALARM_TYPE_POWER;
+												memcpy(data.AlarmDate,info.date,32);
+												memcpy(data.AlarmContext,info.waning_context,64);
+//												send_snmp_tarp();
+												snmp_power_alarm_trap(&data);
+											}
 										}										
 
 										if(!old_p_upper && pch->alarm.p_upper)
 										{
-											memset(&info.waning_context,0,sizeof(32));
+											memset(&info.waning_context,0,sizeof(64));
 											sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
 											sprintf(info.waning_context,"%s over max power",pch->info.name);
 											wanning_insert(info);
 											beep_set(1);
-//											if(paras_get()->snmp.trapmode == 1)
-//											{
-//												AlarmTrapinfo t_info={0};
-//												t_info.ID = i;
-//												t_info.Alarmid = ALARM_TYPE_POWER;
-//												memcpy(t_info.AlarmDate,info.date,32);
-//												memcpy(t_info.AlarmContext,info.waning_context,32);
-//												snmp_power_alarm_trap(&t_info);
-//											}
+											if(paras_get()->snmp.trapmode == 1)
+											{
+												//AlarmTrapinfo t_info={0};
+												data.ID = i;
+												data.Alarmid = ALARM_TYPE_POWER;
+												memcpy(data.AlarmDate,info.date,32);
+												memcpy(data.AlarmContext,info.waning_context,64);
+//												send_snmp_tarp();
+												snmp_power_alarm_trap(&data);
+											}
 										}				
 
 										if(!old_w_upper && pch->alarm.w_upper)
 										{
-											memset(&info.waning_context,0,sizeof(32));
+											memset(&info.waning_context,0,sizeof(64));
 											sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
 											sprintf(info.waning_context,"%s over max consumer",pch->info.name);
 											wanning_insert(info);
 											beep_set(1);
-//											if(paras_get()->snmp.trapmode == 1)
-//											{
-//												AlarmTrapinfo t_info={0};
-//												t_info.ID = i;
-//												t_info.Alarmid = ALARM_TYPE_POWER;
-//												memcpy(t_info.AlarmDate,info.date,32);
-//												memcpy(t_info.AlarmContext,info.waning_context,32);
-//												snmp_power_alarm_trap(&t_info);
-//											}
+											if(paras_get()->snmp.trapmode == 1)
+											{
+												//AlarmTrapinfo t_info={0};
+												data.ID = i;
+												data.Alarmid = ALARM_TYPE_POWER;
+												memcpy(data.AlarmDate,info.date,32);
+												memcpy(data.AlarmContext,info.waning_context,64);
+//												send_snmp_tarp();
+												snmp_power_alarm_trap(&data);
+											}
 										}														
                     //pch->alarm.ph_loss   = 0;
                 }
@@ -1080,13 +1084,16 @@ static int power_copy(power_handle_t *h)
 static int board_query(power_handle_t *h)
 {
     int i,r;
-    
+
+		time_t t=time(NULL);
+		//printf("....................%ld\n",(uint32_t)t);
     for(i=0; i<h->brd_max; i++) {
         r = board_read(h, h->pbrd[i]);
     }
     total_proc(h);
     power_copy(h);
-    
+		 t=time(NULL);
+		//printf("____________________%ld\n",(uint32_t)t);
     return r;
 }
 static void power_thread(void *arg)
@@ -1098,7 +1105,7 @@ static void power_thread(void *arg)
     
     while(th->quit==0) {
         board_query(h);
-        sleep(1);
+        usleep(300000);
     }
 }
 

+ 91 - 17
f427/applications/sensor.c

@@ -4,6 +4,10 @@
 #include "lock.h"
 #include "sensor.h"
 #include "paras.h"
+#include "snmp.h"
+#include "beep.h"
+#include "wanning.h"
+
 
 
 
@@ -64,6 +68,10 @@ int sensor_init(void)
 			ssHandle.all.data[0].info.type = SENSOR_TYPE_TEMP_HUMI;
 			ssHandle.all.data[0].info.status = 0;
 			ssHandle.all.data[0].info.num_val = 2;
+//			p_d->sensor[0].th_max_1 = 10000;
+//			p_d->sensor[0].th_min_1 = 7000;
+//			p_d->sensor[0].th_max_2 = 1500;
+//			p_d->sensor[0].th_min_2 = 1000;
 			if(p_d->sensor[0].th_max_1 != 0)
 			{
 				ssHandle.all.data[0].val[0].thr.max = ((float)p_d->sensor[0].th_max_1 /100.0);
@@ -283,10 +291,14 @@ static int my_read(sensor_data_t *data)
 }
 
 
+extern AlarmTrapinfo data;
+
 int sensor_query(void)
 {
     int i,r=-1;
     sensor_handle_t *h=&ssHandle;
+		waning_info_t info= {0};
+		info.type = ALARM_TYPE_SENSOR;
     lock_on(h->lck);
     for(i=0; i<h->all.cnt; i++) {
         r = my_read(&h->all.data[i]);
@@ -302,8 +314,23 @@ int sensor_query(void)
 							ssHandle.all.data[i].val[0].s_alarm.max_up = 1;
 							if(back_waning_up != ssHandle.all.data[i].val[0].s_alarm.max_up)
 							{
-								//todo beep 报警
-								//todo send mail
+									time_t t=time(NULL);
+										struct tm *tm=localtime(&t);
+									memset(&info.waning_context,0,sizeof(64));
+									sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
+									sprintf(info.waning_context,"%s value 1 over max threshold!!",ssHandle.all.data[i].info.name);
+									wanning_insert(info);
+
+									if(paras_get()->snmp.trapmode == 1)
+									{
+												//AlarmTrapinfo t_info={0};
+											data.ID = i;
+											data.Alarmid = ALARM_TYPE_SENSOR;
+											memcpy(data.AlarmDate,info.date,32);
+											memcpy(data.AlarmContext,info.waning_context,64);
+											snmp_sensor_alarm_trap(&data);
+									}
+									beep_set(1);
 							}
 						}else
 						{
@@ -318,8 +345,23 @@ int sensor_query(void)
 							ssHandle.all.data[i].val[0].s_alarm.min_down = 1;
 							if(back_waning_down != ssHandle.all.data[i].val[0].s_alarm.min_down)
 							{
-								//todo beep 报警
-								//todo send mail
+									time_t t=time(NULL);
+										struct tm *tm=localtime(&t);
+									memset(&info.waning_context,0,sizeof(64));
+									sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
+									sprintf(info.waning_context,"%s value 1 over min threshold!!",ssHandle.all.data[i].info.name);
+									wanning_insert(info);
+
+									if(paras_get()->snmp.trapmode == 1)
+									{
+												//AlarmTrapinfo t_info={0};
+											data.ID = i;
+											data.Alarmid = ALARM_TYPE_SENSOR;
+											memcpy(data.AlarmDate,info.date,32);
+											memcpy(data.AlarmContext,info.waning_context,64);
+											snmp_sensor_alarm_trap(&data);
+									}
+									beep_set(1);
 							}
 						}else
 						{
@@ -328,20 +370,37 @@ int sensor_query(void)
 					}
 					if(ssHandle.all.data[i].info.num_val == 2)
 					{
-						uint8_t  back_waning_up = ssHandle.all.data[i].val[1].s_alarm.max_up;
-						if(ssHandle.all.data[i].val[1].value > ssHandle.all.data[i].val[1].thr.max)
+						if(ssHandle.all.data[i].val[0].thr.en.th_sen_max_en)
 						{
-							ssHandle.all.data[i].val[1].s_alarm.max_up = 1;
-							if(back_waning_up != ssHandle.all.data[i].val[1].s_alarm.max_up)
+							uint8_t  back_waning_up = ssHandle.all.data[i].val[1].s_alarm.max_up;
+							if(ssHandle.all.data[i].val[1].value > ssHandle.all.data[i].val[1].thr.max)
 							{
-									//todo beep 报警
-									//todo send mail
+								ssHandle.all.data[i].val[1].s_alarm.max_up = 1;
+								if(back_waning_up != ssHandle.all.data[i].val[1].s_alarm.max_up)
+								{
+										memset(&info.waning_context,0,sizeof(64));
+										time_t t=time(NULL);
+											struct tm *tm=localtime(&t);
+										sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
+										sprintf(info.waning_context,"%s value 2 over max threshold!!",ssHandle.all.data[i].info.name);
+										wanning_insert(info);
+
+										if(paras_get()->snmp.trapmode == 1)
+										{
+													//AlarmTrapinfo t_info={0};
+												data.ID = i;
+												data.Alarmid = ALARM_TYPE_SENSOR;
+												memcpy(data.AlarmDate,info.date,32);
+												memcpy(data.AlarmContext,info.waning_context,64);
+												snmp_sensor_alarm_trap(&data);
+										}
+										beep_set(1);
+								}
+								}else
+								{
+									ssHandle.all.data[i].val[1].s_alarm.max_up = 0;
+								}				
 							}
-							}else
-							{
-								ssHandle.all.data[i].val[1].s_alarm.max_up = 0;
-							}				
-						
 							if(ssHandle.all.data[i].val[1].thr.en.th_sen_min_en)
 							{
 								uint8_t  back_waning_down = ssHandle.all.data[i].val[1].s_alarm.min_down;
@@ -350,8 +409,23 @@ int sensor_query(void)
 									ssHandle.all.data[i].val[1].s_alarm.min_down = 1;
 									if(back_waning_down != ssHandle.all.data[i].val[1].s_alarm.min_down)
 									{
-									//todo beep 报警
-									//todo send mail
+										memset(&info.waning_context,0,sizeof(64));
+										time_t t=time(NULL);
+										struct tm *tm=localtime(&t);
+										sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
+										sprintf(info.waning_context,"%s value 2 over min threshold!!",ssHandle.all.data[i].info.name);
+										wanning_insert(info);
+
+										if(paras_get()->snmp.trapmode == 1)
+										{
+													//AlarmTrapinfo t_info={0};
+												data.ID = i;
+												data.Alarmid = ALARM_TYPE_SENSOR;
+												memcpy(data.AlarmDate,info.date,32);
+												memcpy(data.AlarmContext,info.waning_context,64);
+												snmp_sensor_alarm_trap(&data);
+										}
+										beep_set(1);
 									}
 								}else
 								{

+ 26 - 24
f427/applications/snmp.c

@@ -1344,7 +1344,7 @@ void snmp_sensor_alarm_trap(AlarmTrapinfo *data)
 		snmp_oid_assign(&vb3.oid, pduAlarmDate_oid, LWIP_ARRAYSIZE(pduAlarmDate_oid));
 		
     vb.type = SNMP_ASN1_TYPE_INTEGER;
-    vb.value = (void*)&a;
+    vb.value = (void*)&(data->ID);;
     vb.value_len = 4;
 		
 	  vb1.type = SNMP_ASN1_TYPE_INTEGER;
@@ -1377,27 +1377,27 @@ AlarmTrapinfo data = {
 };
 
 
-void *snmp_thread(void *args)
-{
-	while(1)
-	{
-		 pthread_mutex_lock(&snmp_smart.mutex);
-		 while(pthread_cond_wait(&snmp_smart.cond, &snmp_smart.mutex));
-		 if(paras_get()->snmp.trapmode == 1)
-			 snmp_power_alarm_trap(&data);
-//				system("snmp");
-			
-		 pthread_mutex_unlock(&snmp_smart.mutex);
-	}
-}
+//void *snmp_thread(void *args)
+//{
+//	while(1)
+//	{
+//		 pthread_mutex_lock(&snmp_smart.mutex);
+//		 while(pthread_cond_wait(&snmp_smart.cond, &snmp_smart.mutex));
+//		 if(paras_get()->snmp.trapmode == 1)
+//			 snmp_power_alarm_trap(&data);
+////				system("snmp");
+//			
+//		 pthread_mutex_unlock(&snmp_smart.mutex);
+//	}
+//}
 
 
-void send_snmp_tarp(void)
-{
-	pthread_mutex_lock(&snmp_smart.mutex);
-	pthread_cond_signal(&snmp_smart.cond);
-	pthread_mutex_unlock(&snmp_smart.mutex);
-}
+//void send_snmp_tarp(void)
+//{
+//	pthread_mutex_lock(&snmp_smart.mutex);
+//	pthread_cond_signal(&snmp_smart.cond);
+//	pthread_mutex_unlock(&snmp_smart.mutex);
+//}
 
 
 void cmd_snmp_test(int argc, char **argv)
@@ -1433,6 +1433,8 @@ void netif_event_callback(struct netif *netif) {
 
 static void mibs_init(void) {
 			paras_data_t *para = paras_get();
+			//snmp_v2c_enable(1);
+			//snmp_v2c_enabled();
 //		uint16_t len = 0;
 //		len= strlen((const char *)snmp_smart.sysdescr);
 //    snmp_mib2_set_sysdescr(snmp_smart.sysdescr, &len);
@@ -1448,9 +1450,9 @@ static void mibs_init(void) {
 //	
 //	  snmp_set_device_enterprise_oid(&snmp_smart.device_enterprose_oid);
 	
-		pthread_mutex_init(&snmp_smart.mutex,NULL);
-	  pthread_cond_init(&snmp_smart.cond,NULL);
-	
+//		pthread_mutex_init(&snmp_smart.mutex,NULL);
+//	  pthread_cond_init(&snmp_smart.cond,NULL);
+//	
 	
     snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_DISABLED);
 		snmp_strap_set();
@@ -1467,7 +1469,7 @@ static void mibs_init(void) {
 		
 		//snmp_send_trap_specific();
 		
-		pthread_create(&snmp_smart.id,NULL,snmp_thread,NULL);
+//		pthread_create(&snmp_smart.id,NULL,snmp_thread,NULL);
 		//pthread_detach(snmp_smart.id);
 }
 

+ 1 - 1
f427/applications/sys.c

@@ -190,7 +190,7 @@ int sys_init(void)
     mb_init();
     sensor_init();
     //breaker_init();
-    thread_start(THREAD_ID_POLL, poll_thread, NULL);
+    //thread_start(THREAD_ID_POLL, poll_thread, NULL);
 
     return 0;
 }

+ 68 - 21
f427/applications/ui/menu.c

@@ -259,22 +259,50 @@ static void menu_input_paint(menu_handle_t *h, int font1, int font2, int item_h,
     sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_FACTOR), pttl->total[0].factor);
     lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 #else
-    sprintf(tmp, "%s:    %0.2f", lang_get_str(h->lang, STR_ID_VOLTAGE), pttl->voltage);
-    lcd_draw_string(5, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 		
-		sprintf(tmp, "%s:    %0.2f", lang_get_str(h->lang, STR_ID_CURRENT), pttl->current);
-    lcd_draw_string(5, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 		
+    sprintf(tmp, "%s:", lang_get_str(h->lang, STR_ID_VOLTAGE));
+    lcd_draw_string(5, item_h, LCD_WIDTH/2-5, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 		
+		
+    sprintf(tmp, "%0.2f",pttl->voltage);
+    lcd_draw_string(LCD_WIDTH/2, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		
+		
+		
+		sprintf(tmp, "%s:", lang_get_str(h->lang, STR_ID_CURRENT));
+    lcd_draw_string(5, item_h*2, LCD_WIDTH/2-5, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		
+		sprintf(tmp, "%0.2f",pttl->current);
+    lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);		
+		
+		
+		
+
+    sprintf(tmp, "%s:", lang_get_str(h->lang, STR_ID_POWER));
+    lcd_draw_string(5, item_h*3, LCD_WIDTH/2-5, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		
+		
+    sprintf(tmp, "%0.2f",pttl->power);
+    lcd_draw_string(LCD_WIDTH/2, item_h*3, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+    sprintf(tmp, "%s:",lang_get_str(h->lang, STR_ID_FACTOR));
+    lcd_draw_string(5, item_h*4, LCD_WIDTH/2-5, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		
+		
+    sprintf(tmp, "%0.2f", pttl->factor);
+    lcd_draw_string(LCD_WIDTH/2, item_h*4, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+
 
-    sprintf(tmp, "%s:    %0.2f", lang_get_str(h->lang, STR_ID_POWER), pttl->power);
-    lcd_draw_string(5, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 
-    sprintf(tmp, "%s:    %0.2f",lang_get_str(h->lang, STR_ID_FACTOR), pttl->factor);
-    lcd_draw_string(5, item_h*4, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 #endif
-    sprintf(tmp, "%s:    %0.2f", lang_get_str(h->lang, STR_ID_CONSUMP), pttl->consump);
-    lcd_draw_string(5, item_h*5, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    sprintf(tmp, "%s:", lang_get_str(h->lang, STR_ID_CONSUMP));
+    lcd_draw_string(5, item_h*5, LCD_WIDTH/2-5, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+
+    sprintf(tmp, "%0.2f", pttl->consump);
+    lcd_draw_string(LCD_WIDTH/2, item_h*5, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 
     //lcd_refresh();
     
@@ -325,20 +353,39 @@ static void menu_output_paint(menu_handle_t *h, int font1, int font2, int item_h
     sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
     lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 #else
-    sprintf(tmp, "%s:    %s", lang_get_str(h->lang, STR_ID_SWITCH), pon);
-    lcd_draw_string(5, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-		sprintf(tmp, "%s:    %0.2f",lang_get_str(h->lang, STR_ID_CURRENT), ((float)all->pch[h->ch_out+1].power[0].current/10.0));
-    lcd_draw_string(5, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-    sprintf(tmp, "%s:    %0.2f", lang_get_str(h->lang, STR_ID_POWER), (((float)all->pch[h->ch_out+1].power[0].power)/1000.0));
-    lcd_draw_string(5, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		//LCD_WIDTH/2
+		
+    sprintf(tmp, "%s:", lang_get_str(h->lang, STR_ID_SWITCH));
+    lcd_draw_string(5, item_h, LCD_WIDTH/2-5, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		sprintf(tmp, "%s", pon);
+		lcd_draw_string(LCD_WIDTH/2, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		
+		
 		
+		sprintf(tmp, "%s:",lang_get_str(h->lang, STR_ID_CURRENT));
+    lcd_draw_string(5, item_h*2,  LCD_WIDTH/2-5, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		sprintf(tmp, "%0.2f", ((float)all->pch[h->ch_out+1].power[0].current)/10.0);
+		lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 		
-    sprintf(tmp, "%s:    %0.2f", lang_get_str(h->lang, STR_ID_FACTOR),(all->pch[h->ch_out+1].power[0].factor)/100.0);
-    lcd_draw_string(5, item_h*4, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		
+		
+		sprintf(tmp, "%s:",lang_get_str(h->lang, STR_ID_POWER));
+    lcd_draw_string(5, item_h*3,  LCD_WIDTH/2-5, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		sprintf(tmp, "%0.2f", ((float)all->pch[h->ch_out+1].power[0].power)/1000.0);
+		lcd_draw_string(LCD_WIDTH/2, item_h*3, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		
+		
+		sprintf(tmp, "%s:",lang_get_str(h->lang, STR_ID_FACTOR));
+    lcd_draw_string(5, item_h*4,  LCD_WIDTH/2-5, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		sprintf(tmp, "%0.2f", ((float)all->pch[h->ch_out+1].power[0].factor)/100.0);
+		lcd_draw_string(LCD_WIDTH/2, item_h*4, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		
+	
 #endif
-    sprintf(tmp, "%s:    %0.2f", lang_get_str(h->lang, STR_ID_CONSUMP), (all->pch[h->ch_out+1].power[0].consump)/1000.0);
-    lcd_draw_string(5, item_h*5, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-
+		sprintf(tmp, "%s:",lang_get_str(h->lang, STR_ID_CONSUMP));
+    lcd_draw_string(5, item_h*5,  LCD_WIDTH/2-5, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		sprintf(tmp, "%0.2f", ((float)all->pch[h->ch_out+1].power[0].consump)/1000.0);
+		lcd_draw_string(LCD_WIDTH/2, item_h*5, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);	
     //lcd_refresh();
     
 }

+ 54 - 0
f427/applications/wanning.c

@@ -0,0 +1,54 @@
+#include "wanning.h"
+#include "fifo.h"
+#include "pthread.h"
+#include "rtthread.h"
+
+typedef struct {
+
+	GenericFixedList *list;
+	pthread_mutex_t mutex;
+}wanning_cache_t;
+
+
+static wanning_cache_t wan;
+
+
+void wanning_init()
+{
+		wan.list = generic_list_create(MAX_WANIING_LENTH);
+		pthread_mutex_init(&wan.mutex,NULL);
+}
+
+
+void wanning_insert(waning_info_t wanning)
+{
+	pthread_mutex_lock(&wan.mutex);
+	generic_list_append(wan.list,&wanning,sizeof(waning_info_t));
+	pthread_mutex_unlock(&wan.mutex);
+}
+
+int wanning_get_count()
+{
+	int val = 0;
+	pthread_mutex_lock(&wan.mutex);
+	val = generic_list_get_count(wan.list);
+	pthread_mutex_unlock(&wan.mutex);
+	return val;
+}
+
+int wanning_get(waning_info_t *waning,uint8_t lenth)
+{
+	if(waning)
+	{
+		pthread_mutex_lock(&wan.mutex);
+		generic_list_get(wan.list,waning,lenth);
+		pthread_mutex_unlock(&wan.mutex);
+	}
+	return 0;
+}
+
+
+void wanning_deinit()
+{
+	
+}

+ 33 - 0
f427/applications/wanning.h

@@ -0,0 +1,33 @@
+#ifndef _WANNING_H_
+#define _WANNING_H_
+
+
+#include "stdint.h"
+
+#define MAX_WANIING_LENTH   20
+
+
+
+typedef struct {
+	uint8_t type;
+	char date[32];
+	char waning_context[64];
+}waning_info_t;
+
+
+
+void wanning_init();
+
+void wanning_insert(waning_info_t wanning);
+
+int wanning_get(waning_info_t *waning,uint8_t lenth);
+
+int wanning_get_count();
+
+void wanning_deinit();
+
+
+#endif
+
+
+

+ 41 - 2
f427/applications/web.c

@@ -17,6 +17,7 @@
 #include "net.h"
 #include "cfg.h"
 #include "lcd.h"
+#include "wanning.h"
 
 #define TIMER_INTERVAL      1000
 #define ONCE_SEND_CNT       13
@@ -182,8 +183,6 @@ static void send_powerc(web_handle_t *h, mg_conn_t *c, uint8_t addr)
 				hdr->flag = bag;
 				i += ONCE_SEND_CNT;
 			}
-			usleep(100000);
-
 			ws_send(c, h->buf, xlen, 1);
 		}while(count > 0);
 		
@@ -240,6 +239,31 @@ static void send_sensor(web_handle_t *h, mg_conn_t *c, uint8_t addr)
     ws_send(c, h->buf, xlen, 1);
    // sensor_data_free(&all);
 }
+
+static void send_his_alarm(web_handle_t *h, mg_conn_t *c,uint8_t addr)
+{
+	
+		int i,j,xlen,offset,times,left;
+    pkt_hdr_t *hdr=NULL;	
+	
+    hdr = (pkt_hdr_t*)h->buf;
+    hdr->magic = PKT_MAGIC;
+    hdr->addr  = addr;
+    hdr->type  = PKT_TYPE_ALARM;
+    hdr->nack  = 0;
+		
+		uint16_t count = wanning_get_count();
+		hdr->flag = count;
+		waning_info_t *wanning = (waning_info_t *)hdr->data;
+		wanning_get(wanning, count);
+	
+		hdr->dlen = count*sizeof(waning_info_t);
+		
+		xlen = count*sizeof(waning_info_t)+sizeof(pkt_hdr_t);
+		ws_send(c, h->buf, xlen, 1);
+}
+
+
 static void send_breaker(web_handle_t *h, mg_conn_t *c, uint8_t addr)
 {
     int i,j,xlen,offset,times,left;
@@ -728,6 +752,9 @@ static int ws_handle(web_handle_t *h, pkt_hdr_t *hdr, mg_conn_t *c)
         
         case PKT_TYPE_SENSOR:
         {
+					if(hdr->dlen>0) {
+						
+					}else
             send_sensor(h, c, hdr->addr);
         }
         break;
@@ -749,6 +776,18 @@ static int ws_handle(web_handle_t *h, pkt_hdr_t *hdr, mg_conn_t *c)
             send_dlist(h, c);
         }
         break;
+				case PKT_TYPE_ALARM:
+				{
+					if(hdr->flag>0) {
+						
+					}else
+					{
+						send_his_alarm(h, c, hdr->addr);
+					}
+				}
+				break;
+				default:
+					break;
     }
 }
 

Разлика између датотеке није приказан због своје велике величине
+ 127 - 55
f427/project/all.uvmpw.uvgui.Gowon


Разлика између датотеке није приказан због своје велике величине
+ 44885 - 44492
f427/project/app/JLinkLog.txt


Разлика између датотеке није приказан због своје велике величине
+ 42 - 42
f427/project/app/app.uvguix.Gowon


+ 6 - 168
f427/project/app/app.uvoptx

@@ -120,7 +120,6 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name></Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -152,186 +151,25 @@
         <Bp>
           <Number>0</Number>
           <Type>0</Type>
-          <LineNumber>1441</LineNumber>
+          <LineNumber>314</LineNumber>
           <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
+          <Address>134589158</Address>
           <ByteObject>0</ByteObject>
           <HtxType>0</HtxType>
           <ManyObjects>0</ManyObjects>
           <SizeOfObject>0</SizeOfObject>
           <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>&lt;1&gt;..\..\applications\snmp.c</Filename>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>&lt;1&gt;..\..\applications\sensor.c</Filename>
           <ExecCommand></ExecCommand>
-          <Expression></Expression>
-        </Bp>
-        <Bp>
-          <Number>1</Number>
-          <Type>0</Type>
-          <LineNumber>589</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>&lt;1&gt;..\..\applications\power.c</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression></Expression>
+          <Expression>\\app\../../applications/sensor.c\314</Expression>
         </Bp>
       </Breakpoint>
       <WatchWindow1>
         <Ww>
           <count>0</count>
           <WinNumber>1</WinNumber>
-          <ItemText>info</ItemText>
-        </Ww>
-        <Ww>
-          <count>1</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>h-&gt;mounted</ItemText>
-        </Ww>
-        <Ww>
-          <count>2</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>name</ItemText>
-        </Ww>
-        <Ww>
-          <count>3</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>path</ItemText>
-        </Ww>
-        <Ww>
-          <count>4</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>cmd</ItemText>
-        </Ww>
-        <Ww>
-          <count>5</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>req</ItemText>
-        </Ww>
-        <Ww>
-          <count>6</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>cache_buf</ItemText>
-        </Ww>
-        <Ww>
-          <count>7</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>req</ItemText>
-        </Ww>
-        <Ww>
-          <count>8</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>p</ItemText>
-        </Ww>
-        <Ww>
-          <count>9</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>p_d</ItemText>
-        </Ww>
-        <Ww>
-          <count>10</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>h</ItemText>
-        </Ww>
-        <Ww>
-          <count>11</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>hdr</ItemText>
-        </Ww>
-        <Ww>
-          <count>12</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>hdr</ItemText>
-        </Ww>
-        <Ww>
-          <count>13</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>data</ItemText>
-        </Ww>
-        <Ww>
-          <count>14</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>hdr-&gt;data[3]</ItemText>
-        </Ww>
-        <Ww>
-          <count>15</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>data</ItemText>
-        </Ww>
-        <Ww>
-          <count>16</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>hdr</ItemText>
-        </Ww>
-        <Ww>
-          <count>17</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>all</ItemText>
-        </Ww>
-        <Ww>
-          <count>18</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>pd</ItemText>
-        </Ww>
-        <Ww>
-          <count>19</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>pd-&gt;pch[7]</ItemText>
-        </Ww>
-        <Ww>
-          <count>20</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>h-&gt;pch[7]</ItemText>
-        </Ww>
-        <Ww>
-          <count>21</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>all.pch[8]</ItemText>
-        </Ww>
-        <Ww>
-          <count>22</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>pd-&gt;pch[8]</ItemText>
-        </Ww>
-        <Ww>
-          <count>23</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>h-&gt;pch[8]</ItemText>
-        </Ww>
-        <Ww>
-          <count>24</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>p</ItemText>
-        </Ww>
-        <Ww>
-          <count>25</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>para</ItemText>
-        </Ww>
-        <Ww>
-          <count>26</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>p</ItemText>
-        </Ww>
-        <Ww>
-          <count>27</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>data</ItemText>
-        </Ww>
-        <Ww>
-          <count>28</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>para-&gt;snmp.nms_ip</ItemText>
-        </Ww>
-        <Ww>
-          <count>29</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>ip_addr</ItemText>
+          <ItemText>new_node-&gt;data[0]</ItemText>
         </Ww>
       </WatchWindow1>
       <Tracepoint>

Разлика између датотеке није приказан због своје велике величине
+ 6 - 6
f427/project/boot/boot.uvguix.Gowon