Bladeren bron

F427 NOR web,网页转.h字符串

liyi 1 jaar geleden
bovenliggende
commit
9e30f7ce26

+ 152 - 0
nor_web/api/channel_display.js

@@ -0,0 +1,152 @@
+// 通道集合
+let channelAllList = [];
+let channelAllList1 = [];
+
+
+
+function channel_display(j_data, channel_power_infro) {
+    channelAllList = [];
+    channelAllList1 = [];
+    length = channel_power_infro.length
+    for (let j = 1; j < length; j++) {
+        let alarm=channel_power_infro[j].alarm;
+        num = channel_power_infro[j].info.type
+            // 创建一个新的列表项元素
+        const channelFormData1 = {
+
+        };
+        //自动生成通道名称列
+        channelFormData1.productChName="CH" + j
+        //自动生成通道号
+        channelFormData1.productChId=j
+
+        // 开启延时
+        channelFormData1.firingInterval=channel_power_infro[j].info.start_delay
+
+        // 关闭延时
+        channelFormData1.closeInterval=channel_power_infro[j].info.stop_delay
+        channelFormData1.channel_power_infro=channel_power_infro[j];
+        channelAllList1.push(channelFormData1);
+        if(productTypeData.productType=='0'){
+            const channelFormData = {
+
+            };
+            if(alarm.c_upper!=0 || alarm.p_upper!=0 || alarm.v_lower!=0 || alarm.v_upper!=0 || alarm.w_upper!=0){
+                channelFormData.colorStyle='color: red;'
+            }else{
+                channelFormData.colorStyle=''
+            }
+            //自动生成设备名称列
+
+            //自动生成通道名称列
+            channelFormData.productChName="CH" + j
+            //自动生成通道号
+            channelFormData.productChId=j
+            //自动生成相序列
+            channelFormData.productPhOrder="L1"
+            // 自动生成电压列
+            var val = channel_power_infro[j].power[0].voltage / 10.0;
+            channelFormData.productChVoltage=val
+
+            // 自动生成电流列
+            var val = channel_power_infro[j].power[0].current / 10.0;
+            channelFormData.productChCurrent=val
+            // 自动生成功率列
+            var val = channel_power_infro[j].power[0].power / 1000.0;
+            channelFormData.productChPower= val
+
+
+            // 自动生成频率列
+            var val = channel_power_infro[j].power[0].freq / 100.0;
+            channelFormData.productChPowerFreq= val
+
+
+            // 自动生成耗电量列
+            var val = channel_power_infro[j].power[0].consump / 1000.0;
+            channelFormData.productChConsumption=val
+
+
+            // 自动生成功率因数列
+            // const factor_td = document.createElement('td');
+            // var val = channel_power_infro[j].power[0].factor / 100.0;
+
+            // 开启延时
+            channelFormData.firingInterval=channel_power_infro[j].info.start_delay
+
+            // 关闭延时
+            channelFormData.closeInterval=channel_power_infro[j].info.stop_delay
+
+
+            //通道状态
+            channel_status = channel_power_infro[j].status
+            channelFormData.productChStatus=channel_status
+            channelFormData.channel_power_infro=channel_power_infro[j]
+            channelAllList.push(channelFormData);
+        }else{
+
+            // 自动生成电压列
+            for(let m = 0; m < channel_power_infro[j].power.length; m++){
+                const channelFormData = {
+
+                };
+                if(alarm.c_upper!=0 || alarm.p_upper!=0 || alarm.v_lower!=0 || alarm.v_upper!=0 || alarm.w_upper!=0){
+                    channelFormData.colorStyle='color: red;'
+                }else{
+                    channelFormData.colorStyle=''
+                }
+                //自动生成设备名称列
+                //自动生成通道名称列
+                channelFormData.productChName="CH" + j
+                //自动生成通道号
+                channelFormData.productChId=j
+                //自动生成相序列
+                channelFormData.productPhOrder="L"+(m+1)
+
+                // 自动生成功率因数列
+                // const factor_td = document.createElement('td');
+                // var val = channel_power_infro[j].power[0].factor / 100.0;
+
+                // 开启延时
+                channelFormData.firingInterval=channel_power_infro[j].info.start_delay
+
+                // 关闭延时
+                channelFormData.closeInterval=channel_power_infro[j].info.stop_delay
+
+
+                //通道状态
+                channel_status = channel_power_infro[j].status
+
+                channelFormData.productChStatus=channel_status
+
+                var val = channel_power_infro[j].power[m].voltage / 10.0;
+                channelFormData.productChVoltage=val
+
+                // 自动生成电流列
+                var val = channel_power_infro[j].power[m].current / 10.0;
+                channelFormData.productChCurrent=val
+                // 自动生成功率列
+                var val = channel_power_infro[j].power[m].power / 1000.0;
+                channelFormData.productChPower= val
+
+
+                // 自动生成频率列
+                var val = channel_power_infro[j].power[m].freq / 100.0;
+                channelFormData.productChPowerFreq= val
+
+
+                // 自动生成耗电量列
+                var val = channel_power_infro[j].power[0].consump / 1000.0;
+                channelFormData.productChConsumption=val
+                channelFormData.channel_power_infro=channel_power_infro[j]
+                channelAllList.push(channelFormData);
+            }
+
+
+
+        }
+
+
+
+    }
+}
+

File diff suppressed because it is too large
+ 1819 - 0
nor_web/api/data.js


+ 106 - 0
nor_web/api/display_data.js

@@ -0,0 +1,106 @@
+function total_Infor(j, total_data, type) {
+    initialTotalFormList = [];
+    len = total_data.length
+        //显示总信息
+    for (let i = 0; i <= len - 1; i++) {
+        num = i + 1
+        voltage = total_data[i].voltage.toFixed(2)
+        current = total_data[i].current.toFixed(2)
+        power = total_data[i].power
+        power = power.toFixed(3)
+        consump = total_data[i].consump.toFixed(2)
+            // if (consump <= 0) {
+            //     consump = 0
+            // }
+            // consump = consump / 1000
+            // consump = consump.toFixed(3)
+        freq = total_data[i].freq.toFixed(2)
+        if (type == '0') {
+            initialFormData.totalVoltage = voltage; // 总电压
+            initialFormData.totalCurrent = current; // 总电流
+            initialFormData.totalPower = power; // 总功率
+            initialFormData.totalFrequency = freq; // 总频率
+            initialFormData.totalEnergy = consump; // 总耗电量
+            break
+        } else {
+            const initialChFormData = {};
+            initialChFormData.totalVoltage = voltage; // 总电压
+            initialChFormData.totalCurrent = current; // 总电流
+            initialChFormData.totalPower = power; // 总功率
+            initialChFormData.totalFrequency = freq; // 总频率
+            initialChFormData.totalEnergy = consump; // 总耗电量
+            initialTotalFormList.push(initialChFormData);
+        }
+
+    }
+
+
+}
+
+function Channel_Info(j_data, channel_power_infro) {
+    channel_length = channel_power_infro.length
+    channel_display(j_data, channel_power_infro, channel_infro)
+
+}
+
+function threshold_mannage(orgin_data, channel_power_infro) {
+    // 获取要插入新行的DOM元素
+    // const dataList = document.getElementById('threshold_mannage');
+    // // 清空现有的列表项
+    // dataList.innerHTML = '';
+    initialYzFormList = [];
+    channel_length = channel_power_infro.length
+        //遍历数据数组
+    for (let j = 1; j < channel_length; j++) {
+        const initialChFormData = {};
+        //自动生成名称列
+        initialChFormData.productChName = "CH" + j;
+        //自动生成编号列
+        initialChFormData.productChId = j;
+        //自动生成电流上限列
+        initialChFormData.currentUpperAction = channel_power_infro[j].thr.c_upper / 10.0;
+
+        // 自动生成电压上限列
+        initialChFormData.voltageUpperAction = channel_power_infro[j].thr.v_upper / 10.0;
+
+        // 自动生成电压下限列
+        initialChFormData.voltageDownAction = channel_power_infro[j].thr.v_lower / 10.0;
+
+        // 自动生成功率上限列
+        initialChFormData.powerUpperAction = channel_power_infro[j].thr.p_upper / 1000.0;
+
+        // 自动生成耗电量上限列
+        initialChFormData.alarmContentUpperAction = channel_power_infro[j].thr.w_upper / 1000.0;
+        initialChFormData.channel_power_infro = channel_power_infro[j]
+        initialYzFormList.push(initialChFormData);
+    }
+}
+
+function now_time() {
+    const now = new Date();
+
+    // 获取年、月、日、小时、分钟和秒
+    const year = now.getFullYear();
+    const month = now.getMonth() + 1;
+    const day = now.getDate();
+    const hours = now.getHours();
+    const minutes = now.getMinutes();
+    const seconds = now.getSeconds();
+
+    formattedTime = `${year}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day} ${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
+    return formattedTime
+}
+
+// 三相总体状态集合
+let initialTotalFormList = [];
+
+// 单项总体监控对象
+let initialFormData = {
+
+};
+
+// 阈值设置集合
+let initialYzFormList = [];
+
+
+let channel_power_infro1 = [];

+ 14 - 0
nor_web/api/index.js

@@ -0,0 +1,14 @@
+export  function    getApiBaseUrl (){
+    const { protocol, hostname, port } = window.location;
+
+    // 开发环境特殊处理
+    if (hostname === 'localhost' || hostname === '127.0.0.1') {
+        return 'http://localhost:8084/pdu'; // 开发服务器地址
+    }
+
+    // 生产环境使用当前域名
+    return port
+        ? `${protocol}//${hostname}:${port}/pdu`
+        : `${protocol}//${hostname}/pdu`;
+}
+

+ 126 - 0
nor_web/api/operation.js

@@ -0,0 +1,126 @@
+// 总开
+function all_open() {
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_CH_ALL, 0, 0, 1, 0));
+}
+
+// 总关
+function all_close() {
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_CH_ALL, 0, 0, 0, 0));
+}
+
+// 通道开启
+function single_open(j_data, channel_power_infro, j) {
+    j_c_data = j_data
+    opreation_data = channel_power_infro
+    j_status = opreation_data[j].status;
+    if (j_status == 0) {
+        opreation_data[j].status = 1
+    }
+    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_SWITCH, 0, 0, opreation_data[j])
+        //var b = bin_to_pkt(a)
+    ws.send(a)
+}
+
+// 通道关闭
+function single_close(j_data, channel_power_infro, j) {
+    j_c_data = j_data
+    opreation_data = channel_power_infro
+    j_status = opreation_data[j].status;
+    if (j_status == 1) {
+        opreation_data[j].status = 0
+    }
+    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_SWITCH, 0, 0, opreation_data[j])
+        //var b = bin_to_pkt(a)
+    ws.send(a)
+}
+
+// 阈值设置
+function threshold_update(orgin_data) {
+    translate_data = orgin_data
+    console.log(translate_data)
+    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_THRESHOLD, 0, 1, translate_data)
+    ws.send(a)
+}
+// 延时设置保存
+function delay_update(orgin_data) {
+    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_OPEN_DELAY, 0, 1, orgin_data)
+    ws.send(a)
+    b = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_CLOSE_DELAY, 0, 1, orgin_data)
+    ws.send(b)
+}
+
+// 耗电量重置
+function power_reset(orgin_data) {
+    console.log(orgin_data)
+    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_CONSUMER_CLEAR, 0, 1, orgin_data)
+    ws.send(a)
+}
+
+// 网络设置
+function network_settings(data) {
+    console.log(data)
+    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_NETWORK, 0, 1, data)
+    ws.send(a)
+}
+
+// 485设置
+function modbus_settings(data) {
+    console.log(data)
+    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_MODBUS, 0, 1, data)
+    ws.send(a)
+}
+
+// snmp设置
+function snmp_settings(data) {
+    console.log(data)
+    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SNMP, 0, 1, data)
+    ws.send(a)
+}
+
+// 设备系统时间设置
+function sys_settings(data) {
+    console.log(data)
+    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SYS, 0, 1, data)
+    ws.send(a)
+}
+
+// 设备固件升级
+function sys_up_settings(data, file) {
+    console.log(data)
+    console.log(file)
+    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SYS, 0, 1, data)
+    ws.send(a)
+}
+
+// 状态监控请求
+function function1() {
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_POWER_TOTAL, 0, 0, 0));
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, 0, 0, 0));
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_SENSOR, 0, 0, 0, 0));
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SYS, 0, 0, 0));
+}
+
+//获取网络配置信息
+function function2() {
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_NETWORK, 0, 0, 0));
+}
+//获取485配置
+function function3() {
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_MODBUS, 0, 0, 0));
+
+}
+//获取SNMP配置
+function function4() {
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SNMP, 0, 0, 0));
+
+}
+// 获取设备配置
+function function5() {
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SYS, 0, 0, 0));
+
+}
+//获取传感器配置
+function function6() {
+    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_SENSOR, 0, 0, 0, 0));
+
+}

File diff suppressed because it is too large
+ 1 - 0
nor_web/api/petite-vue.min.js


+ 12 - 0
nor_web/api/sys_paras.js

@@ -0,0 +1,12 @@
+channle_datas = []
+let currentNumber = 1;
+let resultArray = [];
+const cyclesPerNumber = 3;
+let button_status = [];
+const data = [];
+const datas = []
+const finall_data = []
+const processing_data = {}
+function parasd_process(parasd_data) {
+
+}

+ 127 - 0
nor_web/api/ws.js

@@ -0,0 +1,127 @@
+let productTypeData = {
+
+};
+let data_alarm = [];
+let sensorc_list = [];
+let network_data = {}
+    // 485配置
+let cas_data = {}
+    // snmp
+let snmp_data = {}
+    // 设备信息
+let lang_data = {}
+
+let sensor_data = {}
+
+function on_ws_msg(js) {
+    console.log("执行")
+
+    // debugger
+    //总电源数据显示
+    if (js.powert != undefined) {
+        total_data = js.powert.total
+        type = js.powert.type
+        productTypeData.productType = type;
+        total_Infor(js, total_data, type)
+    }
+    //通道电源数据显示
+    if (js.powerc != undefined) {
+        channel_power_infro = js.powerc
+        channel_infro = channel_power_infro.power
+        alarm = js.powerc.alarm
+        channel_number = js.powerc.info // 通道基础信息
+        channel_power = js.powerc.power
+        j_data = js
+            // 通道号
+        Channel_Info(j_data, channel_power_infro)
+
+        // 阈值设置
+        threshold_mannage(js, channel_power_infro)
+            // systemAlarm(alarm)
+            //populateTable(j_data,channel_power)
+    }
+
+    // 警告
+    if (js.alarmd != undefined) {
+        alarmd_data = js.alarmd
+        data_alarm = [];
+        data_alarm = alarm_process(alarmd_data)
+
+    }
+    // 配置信息(网络配置,485配置,snmp,设备信息)
+
+    if (js.cas != undefined) {
+        cas_data = js.cas;
+    }
+    if (js.network != undefined) {
+        network_data = js.network
+    }
+    if (js.snmp != undefined) {
+        snmp_data = js.snmp
+        console.log("snmp数据--》")
+        console.log(snmp_data)
+    }
+    if (js.sensorc != undefined) {
+        sensor_data = js.sensorc;
+    }
+    // if (js.paras != undefined) {
+    //     // 设备信息
+    //     lang_data = js.paras.lang
+    // }
+    if (js.sensorc != undefined) {
+        sensorc_list = [];
+        // 传感器
+        sensorc_list = js.sensorc
+        console.log(sensorc_list)
+    }
+    if (js.sys != undefined) {
+        lang_data = js.sys
+            // console.log(lang_data)
+    }
+
+}
+
+function alarm_process(alarmd_data) {
+    const result = [];
+    const alarmProperties = alarmd_data.alarm;
+
+    const baseProperties = {
+        "ch": alarmd_data.ch,
+        "time": alarmd_data.time
+    };
+    let idCounter = 1;
+
+    for (const key in alarmProperties) {
+        if (alarmProperties.hasOwnProperty(key) && alarmProperties[key] == 1) {
+            const newObj = {...baseProperties, [key]: alarmProperties[key], "id": idCounter++ };
+            result.push(newObj);
+        }
+    }
+
+    return result;
+}
+
+function ws_hdr() {
+    var proto = window.location.protocol,
+        ws;
+    if (proto == 'https:') {
+        ws = 'wss://';
+    } else {
+        ws = 'ws://';
+    }
+    return ws;
+}
+
+function setActivePage(pageFunction, intervalTime) {
+
+    // 停止之前活动的页面定时函数
+    if (activePageIntervalId != null) {
+        clearInterval(activePageIntervalId);
+    }
+    activePageIntervalId = setInterval(pageFunction, intervalTime);
+}
+
+ws = new WS('ws://' + window.location.host + '/ws', on_ws_msg);
+
+// ws = new WS('ws://192.168.1.134/ws', on_ws_msg);
+// ws = new WS('ws://192.168.1.134/websocket/TMS-WebSocket', on_ws_msg);

+ 214 - 0
nor_web/change.sh

@@ -0,0 +1,214 @@
+#!/bin/bash
+
+# 文本文件转C头文件脚本
+# 支持中文和特殊字符
+# 用法: ./text_to_header.sh <输入文件> <输出头文件> <变量名>
+
+set -e
+
+# 显示颜色输出
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+
+# 显示用法信息
+show_usage() {
+    echo -e "${GREEN}用法: $0 <输入文件> <输出头文件> <变量名>${NC}"
+    echo -e "${GREEN}示例: $0 input.txt text_data.h my_text${NC}"
+    exit 1
+}
+
+# 检查工具是否安装
+check_tools() {
+    local tools=("hexdump" "sed" "awk" "basename" "wc" "file")
+    for tool in "${tools[@]}"; do
+        if ! command -v "$tool" &> /dev/null; then
+            echo -e "${RED}错误: 未找到工具 $tool${NC}"
+            exit 1
+        fi
+    done
+}
+
+# 检查参数
+if [ $# -ne 3 ]; then
+    show_usage
+fi
+
+INPUT_FILE="$1"
+OUTPUT_FILE="$2"
+VAR_NAME="$3"
+
+# 检查输入文件
+if [ ! -f "$INPUT_FILE" ]; then
+    echo -e "${RED}错误: 输入文件 '$INPUT_FILE' 不存在!${NC}"
+    exit 1
+fi
+
+# 检查文件编码
+FILE_ENCODING=$(file -b --mime-encoding "$INPUT_FILE")
+if [[ "$FILE_ENCODING" != "utf-8" && "$FILE_ENCODING" != "us-ascii" ]]; then
+    echo -e "${YELLOW}警告: 文件编码为 $FILE_ENCODING,建议使用UTF-8编码${NC}"
+fi
+
+# 获取文件信息
+FILENAME=$(basename "$INPUT_FILE")
+FILE_SIZE=$(wc -c < "$INPUT_FILE")
+TEXT_SIZE=$(wc -m < "$INPUT_FILE")
+
+echo -e "${GREEN}正在处理文件: $INPUT_FILE${NC}"
+echo -e "文件大小: $FILE_SIZE 字节"
+echo -e "文本长度: $TEXT_SIZE 字符"
+echo -e "编码: $FILE_ENCODING"
+
+# 创建头文件
+create_header() {
+    # 创建头文件头部
+    cat > "$OUTPUT_FILE" << EOF
+/* 自动生成的文本数据头文件 */
+/* 源文件: $FILENAME */
+/* 文件大小: $FILE_SIZE 字节 */
+/* 生成时间: $(date +"%Y-%m-%d %H:%M:%S") */
+/* 编码: $FILE_ENCODING */
+#ifndef ${VAR_NAME^^}_H
+#define ${VAR_NAME^^}_H
+
+#include <stddef.h>
+
+// 文本数据(UTF-8编码)
+const char *${VAR_NAME} = 
+EOF
+
+    # 使用hexdump处理文件内容
+    echo "正在转换文本内容..."
+    
+    # 临时文件用于处理转义
+    TEMP_FILE=$(mktemp)
+    
+    # 读取文件并处理转义字符
+    while IFS= read -r line || [ -n "$line" ]; do
+        # 转义特殊字符
+        line=$(printf "%s" "$line" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | sed 's/^/"/' | sed 's/$/\\n"/')
+        echo "    $line" >> "$TEMP_FILE"
+    done < "$INPUT_FILE"
+    
+    # 移除最后一行的换行符
+    sed -i '$ s/\\n"$/"/' "$TEMP_FILE"
+    
+    # 将处理后的内容添加到头文件
+    cat "$TEMP_FILE" >> "$OUTPUT_FILE"
+    
+    # 清理临时文件
+    rm -f "$TEMP_FILE"
+    
+    # 完成头文件
+    cat >> "$OUTPUT_FILE" << EOF
+;
+
+// 文本数据大小(包括null终止符)
+const size_t ${VAR_NAME}_size = $((FILE_SIZE + 1));
+
+// 文本长度(字符数)
+const size_t ${VAR_NAME}_length = $TEXT_SIZE;
+
+#endif /* ${VAR_NAME^^}_H */
+EOF
+
+    echo -e "${GREEN}成功生成头文件: $OUTPUT_FILE${NC}"
+}
+
+# 创建示例C文件
+create_example_c() {
+    local example_file="${OUTPUT_FILE%.h}_example.c"
+    local base_header=$(basename "$OUTPUT_FILE")
+    
+    cat > "$example_file" << EOF
+#include <stdio.h>
+#include <string.h>
+#include <locale.h>
+#include "$base_header"
+
+int main() {
+    // 设置locale以支持中文输出
+    setlocale(LC_ALL, "zh_CN.UTF-8");
+    
+    printf("=== 文本数据测试程序 ===\\n");
+    printf("文件: %s\\n", "$FILENAME");
+    printf("编码: %s\\n", "$FILE_ENCODING");
+    printf("\\n");
+    
+    printf("文本内容:\\n");
+    printf("----------------------------------------\\n");
+    printf("%s", ${VAR_NAME});
+    printf("----------------------------------------\\n");
+    printf("\\n");
+    
+    printf("统计信息:\\n");
+    printf("数组大小: %zu 字节\\n", ${VAR_NAME}_size);
+    printf("文本长度: %zu 字符\\n", ${VAR_NAME}_length);
+    printf("字符串长度: %zu 字节\\n", strlen(${VAR_NAME}));
+    printf("\\n");
+    
+    printf("十六进制查看(前64字节):\\n");
+    for (size_t i = 0; i < ${VAR_NAME}_size && i < 64; i++) {
+        printf("%02x ", (unsigned char)${VAR_NAME}[i]);
+        if ((i + 1) % 16 == 0) printf("\\n");
+    }
+    printf("\\n");
+    
+    return 0;
+}
+EOF
+
+    echo -e "${GREEN}创建示例C文件: $example_file${NC}"
+}
+
+# 创建编译脚本
+create_build_script() {
+    local build_script="build_${VAR_NAME}.sh"
+    local program_name="${VAR_NAME}_program"
+    
+    cat > "$build_script" << EOF
+#!/bin/bash
+# 自动编译脚本
+
+echo -e "\033[0;32m编译程序...\033[0m"
+gcc -Wall -std=c99 -o "$program_name" "${OUTPUT_FILE%.h}_example.c"
+if [ \$? -eq 0 ]; then
+    echo -e "\033[0;32m编译成功!\033[0m"
+    echo -e "\033[0;33m运行程序: ./$program_name\033[0m"
+else
+    echo -e "\033[0;31m编译失败!\033[0m"
+    exit 1
+fi
+EOF
+
+    chmod +x "$build_script"
+    echo -e "${GREEN}创建编译脚本: $build_script${NC}"
+}
+
+# 显示文件预览
+show_preview() {
+    echo -e "${YELLOW}文件预览(前10行):${NC}"
+    head -10 "$INPUT_FILE"
+    echo -e "${YELLOW}...${NC}"
+}
+
+# 主执行流程
+main() {
+    check_tools
+    show_preview
+    create_header
+    create_example_c
+    create_build_script
+    
+    echo -e "${GREEN}========================================${NC}"
+    echo -e "${GREEN}完成! 接下来可以:${NC}"
+    echo -e "1. 查看头文件: ${YELLOW}cat $OUTPUT_FILE${NC}"
+    echo -e "2. 编译程序: ${YELLOW}./build_${VAR_NAME}.sh${NC}"
+    echo -e "3. 运行程序: ${YELLOW}./${VAR_NAME}_program${NC}"
+    echo -e "${GREEN}========================================${NC}"
+}
+
+# 执行主函数
+main

+ 458 - 0
nor_web/css/index.css

@@ -0,0 +1,458 @@
+
+/* 或者针对特定按钮 */
+.swal2-confirm:hover {
+    background-color: #d33 !important; /* 保持与正常状态相同 */
+}
+.swal2-cancel:hover {
+    background-color: #3085d6 !important; /* 保持与正常状态相同 */
+}
+* {
+    box-sizing: border-box;
+}
+body {
+    font-family: Arial, sans-serif;
+    margin: 0;
+    padding: 20px;
+    min-width: 1200px;
+    overflow-x: auto;
+}
+.container {
+    display: flex;
+    flex-direction: column;
+    height: 95vh;
+    gap: 20px;
+}
+.summary-section {
+    border: 1px solid #ddd;
+    padding: 15px;
+    border-radius: 5px;
+    background-color: #f9f9f9;
+}
+.summary-table {
+    width: 100%;
+    border-collapse: collapse;
+}
+.summary-table th, .summary-table td {
+    border: 1px solid #ddd;
+    padding: 12px;
+    text-align: center;
+}
+.summary-table th {
+    background-color: #f2f2f2;
+}
+.summary-actions {
+    display: flex;
+    justify-content: space-between;
+    gap: 10px;
+    margin-top: 10px;
+}
+.device-section {
+    flex: 1;
+    height: 100px; /* 固定高度 */
+    overflow: auto;
+    border: 1px solid #ddd;
+    border-radius: 5px;
+}
+.device-table {
+    height: 50px; /* 容器高度 */
+    overflow-y: auto; /* 垂直滚动条 */
+    width: 100%;
+    border-collapse: collapse;
+}
+.device-table th, .device-table td {
+    border: 1px solid #ddd;
+    padding: 8px;
+    text-align: center;
+    white-space: nowrap;
+}
+.device-table th {
+    background-color: #f2f2f2;
+    position: sticky;
+    top: 0;
+}
+.status-section {
+    border: 1px solid #ddd;
+    padding: 15px;
+    border-radius: 5px;
+    background-color: #f9f9f9;
+}
+.status-boxes {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 15px;
+}
+.status-box {
+    border: 1px solid #ddd;
+    padding: 15px;
+    min-width: 150px;
+    text-align: center;
+    background-color: white;
+    border-radius: 5px;
+    flex: 1;
+}
+
+.status-active {
+    color: #4CAF50;
+    font-weight: bold;
+}
+.status-inactive {
+    color: #f44336;
+    font-weight: bold;
+}
+.left-buttons {
+    display: flex;
+    gap: 10px;
+}
+.right-buttons {
+    display: flex;
+    gap: 10px;
+}
+.button-container {
+    /*display: flex;*/
+    /*justify-content: center;*/
+    /*gap: 15px;*/
+    /*margin-top: 20px;*/
+    margin-bottom: 10px; display: flex;
+    justify-content: space-between; /* 左右分开 */
+    align-items: center;
+    padding: 15px;
+    background-color: #f5f5f5;
+    border-radius: 8px;
+}
+.btn {
+    padding: 8px 16px;
+    background-color: #4CAF50;
+    color: white;
+    border: none;
+    border-radius: 4px;
+    cursor: pointer;
+    font-weight: bold;
+}
+.btn-energy {
+    background-color: #2196F3;
+}
+.btn-close{
+    background-color: rgb(101, 107, 139);
+}
+.btn-threshold {
+    background-color: #ff9800;
+}
+.btn-delay {
+    background-color: #9c27b0;
+}
+.scrollable-table {
+    flex: 1;
+    overflow-y: auto;
+}
+.button-footer {
+    display: flex;
+    justify-content: center;
+    gap: 15px;
+    padding: 15px;
+    background-color: #f9f9f9;
+    border-top: 1px solid #ddd;
+}
+.table-container {
+    display: flex;
+    flex-direction: column;
+    height: 80vh; /* 视口高度百分比 */
+    max-height: 500px;
+    border: 1px solid #ddd;
+    border-radius: 5px;
+    min-width: 1000px; /* 最小宽度防止压缩 */
+}
+
+
+
+.selectStyle{
+    width: 200px;
+    height: 40px;
+    border-radius: 4px
+}
+/* 重置样式 */
+* {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+}
+
+
+
+.tab-container {
+    width: 100%;
+    height: 100%;
+    margin: 0 auto;
+    background: white;
+    border-radius: 8px;
+    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+    overflow: hidden;
+}
+
+.tab-header {
+    display: flex;
+    background-color: #f1f1f1;
+    border-bottom: 1px solid #ddd;
+}
+
+.tab-btn {
+    border-radius: 10px;
+    padding: 12px 20px;
+    background: none;
+    border: none;
+    cursor: pointer;
+    font-size: 16px;
+    transition: all 0.3s;
+    position: relative;
+}
+
+.tab-btn:hover {
+    background-color: #ddd;
+}
+
+.tab-btn.active {
+    background-color: #4CAF50;
+    color: white;
+}
+
+.tab-content {
+    height: 100%;
+    padding: 20px;
+    display: none;
+}
+
+.tab-content.active {
+    display: block;
+    animation: fadeIn 0.5s;
+}
+
+@keyframes fadeIn {
+    from { opacity: 0; }
+    to { opacity: 1; }
+}
+
+.tab-iframe {
+    width: 100%;
+    height: 100%;
+    border: none;
+}
+
+
+html, body {
+    height: 100%;
+    font-family: 'Arial', sans-serif;
+}
+
+.modal-content {
+    background: white;
+    padding: 20px;
+    border-radius: 8px;
+    max-width: 500px;
+    width: 80%;
+    max-height: 80vh;
+    overflow-y: auto;
+}
+
+
+.form-group {
+    margin-bottom: 15px;
+}
+
+.form-group label {
+    display: block;
+    margin-bottom: 5px;
+    font-weight: bold;
+}
+
+.form-group input[type="text"],
+.form-group input[type="date"],
+.form-group select,
+.form-group textarea {
+    width: 100%;
+    padding: 8px;
+    border: 1px solid #ddd;
+    border-radius: 4px;
+}
+.form-actions {
+    display: flex;
+    justify-content: flex-end;
+    gap: 10px;
+    margin-top: 20px;
+}
+
+.btn-on {
+    background-color: #4CAF50;
+    color: white;
+}
+.btn-off {
+    background-color: #f44336;
+    color: white;
+}
+.btn-all {
+    background-color: #2196F3;
+    color: white;
+}
+.btn-energy {
+    background-color: #2196F3;
+}
+.btn-close{
+    background-color: rgb(101, 107, 139);
+}
+.btn-threshold {
+    background-color: #ff9800;
+}
+.btn-delay {
+    background-color: #9c27b0;
+}
+.modal-overlay2 {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: rgba(0,0,0,0.5);
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    z-index: 1000;
+}
+.upload-container {
+    padding: 25px;
+}
+
+.upload-area {
+    border: 2px dashed #cbd5e1;
+    padding: 40px;
+    text-align: center;
+    background: #f8fafc;
+    cursor: pointer;
+}
+
+
+.file-input {
+    display: none;
+}
+
+.files-list {
+    margin-top: 30px;
+}
+
+.files-list h3 {
+    color: #334155;
+    margin-bottom: 15px;
+    padding-bottom: 10px;
+    border-bottom: 1px solid #e2e8f0;
+}
+
+.file-item {
+    display: flex;
+    align-items: center;
+    padding: 15px;
+    background: #f8fafc;
+    border-radius: 8px;
+    margin-bottom: 10px;
+    transition: all 0.3s ease;
+}
+
+.file-info {
+    flex-grow: 1;
+}
+
+.file-action-btn {
+    width: 36px;
+    height: 36px;
+    border-radius: 50%;
+    display: flex;
+    cursor: pointer;
+}
+
+.progress-bar {
+    height: 6px;
+    background: #e2e8f0;
+    border-radius: 3px;
+    margin-top: 8px;
+    overflow: hidden;
+}
+
+.modal-overlay {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: rgba(0,0,0,0.5);
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    z-index: 999;
+}
+
+
+
+
+
+.radio-group,
+.checkbox-group {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10px;
+}
+
+.radio-group label,
+.checkbox-group label {
+    display: flex;
+    align-items: center;
+    gap: 5px;
+    font-weight: normal;
+}
+
+
+button[type="submit"] {
+    background: #4CAF50;
+    color: white;
+}
+
+button[type="submit"]:disabled {
+    background: #ccc;
+}
+
+
+select.custom-select {
+    padding: 12px;
+    border: 1px solid #ddd;
+    border-radius: 6px;
+    background-color: white;
+    font-size: 16px;
+    color: #333;
+    appearance: none;
+    -webkit-appearance: none;
+    background-image: url('data:image/svg+xml;utf8,<svg fill="%23333" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M7 10l5 5 5-5z"/></svg>');
+    background-repeat: no-repeat;
+    background-position: right 10px center;
+    background-size: 16px;
+}
+
+/* 尝试设置option样式(效果有限) */
+select.custom-select option {
+    height: 40px;      /* 可能在某些浏览器中有效 */
+    padding: 12px;     /* 可能在某些浏览器中有效 */
+    font-size: 16px;   /* 通常有效 */
+    line-height: 2;    /* 可能有效 */
+}
+
+thead {
+    position: sticky;  /* 固定表头 */
+    top: 0;           /* 固定在容器顶部 */
+    z-index: 10;      /* 确保表头在内容之上 */
+}
+
+
+
+.divAll{
+    width: 100%;
+    height: 100%;
+    margin: 0 auto;
+    background: white;
+    border-radius: 8px;
+    box-shadow: 0 2px 10px rgb(0 0 0 / 10%);
+    overflow: hidden;
+}

+ 173 - 0
nor_web/h_html/channel_display.h

@@ -0,0 +1,173 @@
+/* 自动生成的文本数据头文件 */
+/* 源文件: channel_display.js */
+/* 文件大小: 5403 字节 */
+/* 生成时间: 2025-09-12 05:42:04 */
+/* 编码: utf-8 */
+#ifndef P_CHANNEL_DISPLAY_H
+#define P_CHANNEL_DISPLAY_H
+
+#include <stddef.h>
+
+// 文本数据(UTF-8编码)
+const char *p_channel_display = 
+    "// 通道集合\n"
+    "let channelAllList = [];\n"
+    "let channelAllList1 = [];\n"
+    
+    
+    
+    "function channel_display(j_data, channel_power_infro) {\n"
+    "    channelAllList = [];\n"
+    "    channelAllList1 = [];\n"
+    "    length = channel_power_infro.length\n"
+    "    for (let j = 1; j < length; j++) {\n"
+    "        let alarm=channel_power_infro[j].alarm;\n"
+    "        num = channel_power_infro[j].info.type\n"
+    "            // 创建一个新的列表项元素\n"
+    "        const channelFormData1 = {\n"
+    
+    "        };\n"
+    "        //自动生成通道名称列\n"
+    "        channelFormData1.productChName=\"CH\" + j\n"
+    "        //自动生成通道号\n"
+    "        channelFormData1.productChId=j\n"
+    
+    "        // 开启延时\n"
+    "        channelFormData1.firingInterval=channel_power_infro[j].info.start_delay\n"
+    
+    "        // 关闭延时\n"
+    "        channelFormData1.closeInterval=channel_power_infro[j].info.stop_delay\n"
+    "        channelFormData1.channel_power_infro=channel_power_infro[j];\n"
+    "        channelAllList1.push(channelFormData1);\n"
+    "        if(productTypeData.productType=='0'){\n"
+    "            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"
+    "            }else{\n"
+    "                channelFormData.colorStyle=''\n"
+    "            }\n"
+    "            //自动生成设备名称列\n"
+    
+    "            //自动生成通道名称列\n"
+    "            channelFormData.productChName=\"CH\" + j\n"
+    "            //自动生成通道号\n"
+    "            channelFormData.productChId=j\n"
+    "            //自动生成相序列\n"
+    "            channelFormData.productPhOrder=\"L1\"\n"
+    "            // 自动生成电压列\n"
+    "            var val = channel_power_infro[j].power[0].voltage / 10.0;\n"
+    "            channelFormData.productChVoltage=val\n"
+    
+    "            // 自动生成电流列\n"
+    "            var val = channel_power_infro[j].power[0].current / 10.0;\n"
+    "            channelFormData.productChCurrent=val\n"
+    "            // 自动生成功率列\n"
+    "            var val = channel_power_infro[j].power[0].power / 1000.0;\n"
+    "            channelFormData.productChPower= val\n"
+    
+    
+    "            // 自动生成频率列\n"
+    "            var val = channel_power_infro[j].power[0].freq / 100.0;\n"
+    "            channelFormData.productChPowerFreq= val\n"
+    
+    
+    "            // 自动生成耗电量列\n"
+    "            var val = channel_power_infro[j].power[0].consump / 1000.0;\n"
+    "            channelFormData.productChConsumption=val\n"
+    
+    
+    "            // 自动生成功率因数列\n"
+    "            // const factor_td = document.createElement('td');\n"
+    "            // var val = channel_power_infro[j].power[0].factor / 100.0;\n"
+    
+    "            // 开启延时\n"
+    "            channelFormData.firingInterval=channel_power_infro[j].info.start_delay\n"
+    
+    "            // 关闭延时\n"
+    "            channelFormData.closeInterval=channel_power_infro[j].info.stop_delay\n"
+    
+    
+    "            //通道状态\n"
+    "            channel_status = channel_power_infro[j].status\n"
+    "            channelFormData.productChStatus=channel_status\n"
+    "            channelFormData.channel_power_infro=channel_power_infro[j]\n"
+    "            channelAllList.push(channelFormData);\n"
+    "        }else{\n"
+    
+    "            // 自动生成电压列\n"
+    "            for(let m = 0; m < channel_power_infro[j].power.length; m++){\n"
+    "                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"
+    "                }else{\n"
+    "                    channelFormData.colorStyle=''\n"
+    "                }\n"
+    "                //自动生成设备名称列\n"
+    "                //自动生成通道名称列\n"
+    "                channelFormData.productChName=\"CH\" + j\n"
+    "                //自动生成通道号\n"
+    "                channelFormData.productChId=j\n"
+    "                //自动生成相序列\n"
+    "                channelFormData.productPhOrder=\"L\"+(m+1)\n"
+    
+    "                // 自动生成功率因数列\n"
+    "                // const factor_td = document.createElement('td');\n"
+    "                // var val = channel_power_infro[j].power[0].factor / 100.0;\n"
+    
+    "                // 开启延时\n"
+    "                channelFormData.firingInterval=channel_power_infro[j].info.start_delay\n"
+    
+    "                // 关闭延时\n"
+    "                channelFormData.closeInterval=channel_power_infro[j].info.stop_delay\n"
+    
+    
+    "                //通道状态\n"
+    "                channel_status = channel_power_infro[j].status\n"
+    
+    "                channelFormData.productChStatus=channel_status\n"
+    
+    "                var val = channel_power_infro[j].power[m].voltage / 10.0;\n"
+    "                channelFormData.productChVoltage=val\n"
+    
+    "                // 自动生成电流列\n"
+    "                var val = channel_power_infro[j].power[m].current / 10.0;\n"
+    "                channelFormData.productChCurrent=val\n"
+    "                // 自动生成功率列\n"
+    "                var val = channel_power_infro[j].power[m].power / 1000.0;\n"
+    "                channelFormData.productChPower= val\n"
+    
+    
+    "                // 自动生成频率列\n"
+    "                var val = channel_power_infro[j].power[m].freq / 100.0;\n"
+    "                channelFormData.productChPowerFreq= val\n"
+    
+    
+    "                // 自动生成耗电量列\n"
+    "                var val = channel_power_infro[j].power[0].consump / 1000.0;\n"
+    "                channelFormData.productChConsumption=val\n"
+    "                channelFormData.channel_power_infro=channel_power_infro[j]\n"
+    "                channelAllList.push(channelFormData);\n"
+    "            }\n"
+    
+    
+    
+    "        }\n"
+    
+    
+    
+    "    }\n"
+    "}\n"
+    
+;
+
+// 文本数据大小(包括null终止符)
+const size_t p_channel_display_size = 5404;
+
+// 文本长度(字符数)
+const size_t p_channel_display_length = 4969;
+
+#endif /* P_CHANNEL_DISPLAY_H */

File diff suppressed because it is too large
+ 1840 - 0
nor_web/h_html/data_js.h


+ 127 - 0
nor_web/h_html/display_data.h

@@ -0,0 +1,127 @@
+/* 自动生成的文本数据头文件 */
+/* 源文件: display_data.js */
+/* 文件大小: 3755 字节 */
+/* 生成时间: 2025-09-12 05:42:13 */
+/* 编码: utf-8 */
+#ifndef P_DISPLAY_DATA_H
+#define P_DISPLAY_DATA_H
+
+#include <stddef.h>
+
+// 文本数据(UTF-8编码)
+const char *p_display_data = 
+    "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"
+    "        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.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"
+    "        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"
+    "            break\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"
+    "            initialTotalFormList.push(initialChFormData);\n"
+    "        }\n"
+    
+    "    }\n"
+    
+    
+    "}\n"
+    
+    "function Channel_Info(j_data, channel_power_infro) {\n"
+    "    channel_length = channel_power_infro.length\n"
+    "    channel_display(j_data, channel_power_infro, channel_infro)\n"
+    
+    "}\n"
+    
+    "function threshold_mannage(orgin_data, channel_power_infro) {\n"
+    "    // 获取要插入新行的DOM元素\n"
+    "    // const dataList = document.getElementById('threshold_mannage');\n"
+    "    // // 清空现有的列表项\n"
+    "    // dataList.innerHTML = '';\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"
+    "        //自动生成编号列\n"
+    "        initialChFormData.productChId = j;\n"
+    "        //自动生成电流上限列\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"
+    
+    "        // 自动生成电压下限列\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"
+    
+    "        // 自动生成耗电量上限列\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"
+    
+    "function now_time() {\n"
+    "    const now = new Date();\n"
+    
+    "    // 获取年、月、日、小时、分钟和秒\n"
+    "    const year = now.getFullYear();\n"
+    "    const month = now.getMonth() + 1;\n"
+    "    const day = now.getDate();\n"
+    "    const hours = now.getHours();\n"
+    "    const minutes = now.getMinutes();\n"
+    "    const seconds = now.getSeconds();\n"
+    
+    "    formattedTime = `${year}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day} ${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;\n"
+    "    return formattedTime\n"
+    "}\n"
+    
+    "// 三相总体状态集合\n"
+    "let initialTotalFormList = [];\n"
+    
+    "// 单项总体监控对象\n"
+    "let initialFormData = {\n"
+    
+    "};\n"
+    
+    "// 阈值设置集合\n"
+    "let initialYzFormList = [];\n"
+    
+    
+    "let channel_power_infro1 = [];"
+;
+
+// 文本数据大小(包括null终止符)
+const size_t p_display_data_size = 3756;
+
+// 文本长度(字符数)
+const size_t p_display_data_length = 3439;
+
+#endif /* P_DISPLAY_DATA_H */

+ 479 - 0
nor_web/h_html/index_css.h

@@ -0,0 +1,479 @@
+/* 自动生成的文本数据头文件 */
+/* 源文件: index.css */
+/* 文件大小: 8112 字节 */
+/* 生成时间: 2025-09-12 05:42:15 */
+/* 编码: utf-8 */
+#ifndef P_CSS_INDEX_H
+#define P_CSS_INDEX_H
+
+#include <stddef.h>
+
+// 文本数据(UTF-8编码)
+const char *p_css_index = 
+    
+    "/* 或者针对特定按钮 */\n"
+    ".swal2-confirm:hover {\n"
+    "    background-color: #d33 !important; /* 保持与正常状态相同 */\n"
+    "}\n"
+    ".swal2-cancel:hover {\n"
+    "    background-color: #3085d6 !important; /* 保持与正常状态相同 */\n"
+    "}\n"
+    "* {\n"
+    "    box-sizing: border-box;\n"
+    "}\n"
+    "body {\n"
+    "    font-family: Arial, sans-serif;\n"
+    "    margin: 0;\n"
+    "    padding: 20px;\n"
+    "    min-width: 1200px;\n"
+    "    overflow-x: auto;\n"
+    "}\n"
+    ".container {\n"
+    "    display: flex;\n"
+    "    flex-direction: column;\n"
+    "    height: 95vh;\n"
+    "    gap: 20px;\n"
+    "}\n"
+    ".summary-section {\n"
+    "    border: 1px solid #ddd;\n"
+    "    padding: 15px;\n"
+    "    border-radius: 5px;\n"
+    "    background-color: #f9f9f9;\n"
+    "}\n"
+    ".summary-table {\n"
+    "    width: 100%;\n"
+    "    border-collapse: collapse;\n"
+    "}\n"
+    ".summary-table th, .summary-table td {\n"
+    "    border: 1px solid #ddd;\n"
+    "    padding: 12px;\n"
+    "    text-align: center;\n"
+    "}\n"
+    ".summary-table th {\n"
+    "    background-color: #f2f2f2;\n"
+    "}\n"
+    ".summary-actions {\n"
+    "    display: flex;\n"
+    "    justify-content: space-between;\n"
+    "    gap: 10px;\n"
+    "    margin-top: 10px;\n"
+    "}\n"
+    ".device-section {\n"
+    "    flex: 1;\n"
+    "    height: 100px; /* 固定高度 */\n"
+    "    overflow: auto;\n"
+    "    border: 1px solid #ddd;\n"
+    "    border-radius: 5px;\n"
+    "}\n"
+    ".device-table {\n"
+    "    height: 50px; /* 容器高度 */\n"
+    "    overflow-y: auto; /* 垂直滚动条 */\n"
+    "    width: 100%;\n"
+    "    border-collapse: collapse;\n"
+    "}\n"
+    ".device-table th, .device-table td {\n"
+    "    border: 1px solid #ddd;\n"
+    "    padding: 8px;\n"
+    "    text-align: center;\n"
+    "    white-space: nowrap;\n"
+    "}\n"
+    ".device-table th {\n"
+    "    background-color: #f2f2f2;\n"
+    "    position: sticky;\n"
+    "    top: 0;\n"
+    "}\n"
+    ".status-section {\n"
+    "    border: 1px solid #ddd;\n"
+    "    padding: 15px;\n"
+    "    border-radius: 5px;\n"
+    "    background-color: #f9f9f9;\n"
+    "}\n"
+    ".status-boxes {\n"
+    "    display: flex;\n"
+    "    flex-wrap: wrap;\n"
+    "    gap: 15px;\n"
+    "}\n"
+    ".status-box {\n"
+    "    border: 1px solid #ddd;\n"
+    "    padding: 15px;\n"
+    "    min-width: 150px;\n"
+    "    text-align: center;\n"
+    "    background-color: white;\n"
+    "    border-radius: 5px;\n"
+    "    flex: 1;\n"
+    "}\n"
+    
+    ".status-active {\n"
+    "    color: #4CAF50;\n"
+    "    font-weight: bold;\n"
+    "}\n"
+    ".status-inactive {\n"
+    "    color: #f44336;\n"
+    "    font-weight: bold;\n"
+    "}\n"
+    ".left-buttons {\n"
+    "    display: flex;\n"
+    "    gap: 10px;\n"
+    "}\n"
+    ".right-buttons {\n"
+    "    display: flex;\n"
+    "    gap: 10px;\n"
+    "}\n"
+    ".button-container {\n"
+    "    /*display: flex;*/\n"
+    "    /*justify-content: center;*/\n"
+    "    /*gap: 15px;*/\n"
+    "    /*margin-top: 20px;*/\n"
+    "    margin-bottom: 10px; display: flex;\n"
+    "    justify-content: space-between; /* 左右分开 */\n"
+    "    align-items: center;\n"
+    "    padding: 15px;\n"
+    "    background-color: #f5f5f5;\n"
+    "    border-radius: 8px;\n"
+    "}\n"
+    ".btn {\n"
+    "    padding: 8px 16px;\n"
+    "    background-color: #4CAF50;\n"
+    "    color: white;\n"
+    "    border: none;\n"
+    "    border-radius: 4px;\n"
+    "    cursor: pointer;\n"
+    "    font-weight: bold;\n"
+    "}\n"
+    ".btn-energy {\n"
+    "    background-color: #2196F3;\n"
+    "}\n"
+    ".btn-close{\n"
+    "    background-color: rgb(101, 107, 139);\n"
+    "}\n"
+    ".btn-threshold {\n"
+    "    background-color: #ff9800;\n"
+    "}\n"
+    ".btn-delay {\n"
+    "    background-color: #9c27b0;\n"
+    "}\n"
+    ".scrollable-table {\n"
+    "    flex: 1;\n"
+    "    overflow-y: auto;\n"
+    "}\n"
+    ".button-footer {\n"
+    "    display: flex;\n"
+    "    justify-content: center;\n"
+    "    gap: 15px;\n"
+    "    padding: 15px;\n"
+    "    background-color: #f9f9f9;\n"
+    "    border-top: 1px solid #ddd;\n"
+    "}\n"
+    ".table-container {\n"
+    "    display: flex;\n"
+    "    flex-direction: column;\n"
+    "    height: 80vh; /* 视口高度百分比 */\n"
+    "    max-height: 500px;\n"
+    "    border: 1px solid #ddd;\n"
+    "    border-radius: 5px;\n"
+    "    min-width: 1000px; /* 最小宽度防止压缩 */\n"
+    "}\n"
+    
+    
+    
+    ".selectStyle{\n"
+    "    width: 200px;\n"
+    "    height: 40px;\n"
+    "    border-radius: 4px\n"
+    "}\n"
+    "/* 重置样式 */\n"
+    "* {\n"
+    "    margin: 0;\n"
+    "    padding: 0;\n"
+    "    box-sizing: border-box;\n"
+    "}\n"
+    
+    
+    
+    ".tab-container {\n"
+    "    width: 100%;\n"
+    "    height: 100%;\n"
+    "    margin: 0 auto;\n"
+    "    background: white;\n"
+    "    border-radius: 8px;\n"
+    "    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n"
+    "    overflow: hidden;\n"
+    "}\n"
+    
+    ".tab-header {\n"
+    "    display: flex;\n"
+    "    background-color: #f1f1f1;\n"
+    "    border-bottom: 1px solid #ddd;\n"
+    "}\n"
+    
+    ".tab-btn {\n"
+    "    border-radius: 10px;\n"
+    "    padding: 12px 20px;\n"
+    "    background: none;\n"
+    "    border: none;\n"
+    "    cursor: pointer;\n"
+    "    font-size: 16px;\n"
+    "    transition: all 0.3s;\n"
+    "    position: relative;\n"
+    "}\n"
+    
+    ".tab-btn:hover {\n"
+    "    background-color: #ddd;\n"
+    "}\n"
+    
+    ".tab-btn.active {\n"
+    "    background-color: #4CAF50;\n"
+    "    color: white;\n"
+    "}\n"
+    
+    ".tab-content {\n"
+    "    height: 100%;\n"
+    "    padding: 20px;\n"
+    "    display: none;\n"
+    "}\n"
+    
+    ".tab-content.active {\n"
+    "    display: block;\n"
+    "    animation: fadeIn 0.5s;\n"
+    "}\n"
+    
+    "@keyframes fadeIn {\n"
+    "    from { opacity: 0; }\n"
+    "    to { opacity: 1; }\n"
+    "}\n"
+    
+    ".tab-iframe {\n"
+    "    width: 100%;\n"
+    "    height: 100%;\n"
+    "    border: none;\n"
+    "}\n"
+    
+    
+    "html, body {\n"
+    "    height: 100%;\n"
+    "    font-family: 'Arial', sans-serif;\n"
+    "}\n"
+    
+    ".modal-content {\n"
+    "    background: white;\n"
+    "    padding: 20px;\n"
+    "    border-radius: 8px;\n"
+    "    max-width: 500px;\n"
+    "    width: 80%;\n"
+    "    max-height: 80vh;\n"
+    "    overflow-y: auto;\n"
+    "}\n"
+    
+    
+    ".form-group {\n"
+    "    margin-bottom: 15px;\n"
+    "}\n"
+    
+    ".form-group label {\n"
+    "    display: block;\n"
+    "    margin-bottom: 5px;\n"
+    "    font-weight: bold;\n"
+    "}\n"
+    
+    ".form-group input[type=\"text\"],\n"
+    ".form-group input[type=\"date\"],\n"
+    ".form-group select,\n"
+    ".form-group textarea {\n"
+    "    width: 100%;\n"
+    "    padding: 8px;\n"
+    "    border: 1px solid #ddd;\n"
+    "    border-radius: 4px;\n"
+    "}\n"
+    ".form-actions {\n"
+    "    display: flex;\n"
+    "    justify-content: flex-end;\n"
+    "    gap: 10px;\n"
+    "    margin-top: 20px;\n"
+    "}\n"
+    
+    ".btn-on {\n"
+    "    background-color: #4CAF50;\n"
+    "    color: white;\n"
+    "}\n"
+    ".btn-off {\n"
+    "    background-color: #f44336;\n"
+    "    color: white;\n"
+    "}\n"
+    ".btn-all {\n"
+    "    background-color: #2196F3;\n"
+    "    color: white;\n"
+    "}\n"
+    ".btn-energy {\n"
+    "    background-color: #2196F3;\n"
+    "}\n"
+    ".btn-close{\n"
+    "    background-color: rgb(101, 107, 139);\n"
+    "}\n"
+    ".btn-threshold {\n"
+    "    background-color: #ff9800;\n"
+    "}\n"
+    ".btn-delay {\n"
+    "    background-color: #9c27b0;\n"
+    "}\n"
+    ".modal-overlay2 {\n"
+    "    position: fixed;\n"
+    "    top: 0;\n"
+    "    left: 0;\n"
+    "    right: 0;\n"
+    "    bottom: 0;\n"
+    "    background: rgba(0,0,0,0.5);\n"
+    "    display: flex;\n"
+    "    justify-content: center;\n"
+    "    align-items: center;\n"
+    "    z-index: 1000;\n"
+    "}\n"
+    ".upload-container {\n"
+    "    padding: 25px;\n"
+    "}\n"
+    
+    ".upload-area {\n"
+    "    border: 2px dashed #cbd5e1;\n"
+    "    padding: 40px;\n"
+    "    text-align: center;\n"
+    "    background: #f8fafc;\n"
+    "    cursor: pointer;\n"
+    "}\n"
+    
+    
+    ".file-input {\n"
+    "    display: none;\n"
+    "}\n"
+    
+    ".files-list {\n"
+    "    margin-top: 30px;\n"
+    "}\n"
+    
+    ".files-list h3 {\n"
+    "    color: #334155;\n"
+    "    margin-bottom: 15px;\n"
+    "    padding-bottom: 10px;\n"
+    "    border-bottom: 1px solid #e2e8f0;\n"
+    "}\n"
+    
+    ".file-item {\n"
+    "    display: flex;\n"
+    "    align-items: center;\n"
+    "    padding: 15px;\n"
+    "    background: #f8fafc;\n"
+    "    border-radius: 8px;\n"
+    "    margin-bottom: 10px;\n"
+    "    transition: all 0.3s ease;\n"
+    "}\n"
+    
+    ".file-info {\n"
+    "    flex-grow: 1;\n"
+    "}\n"
+    
+    ".file-action-btn {\n"
+    "    width: 36px;\n"
+    "    height: 36px;\n"
+    "    border-radius: 50%;\n"
+    "    display: flex;\n"
+    "    cursor: pointer;\n"
+    "}\n"
+    
+    ".progress-bar {\n"
+    "    height: 6px;\n"
+    "    background: #e2e8f0;\n"
+    "    border-radius: 3px;\n"
+    "    margin-top: 8px;\n"
+    "    overflow: hidden;\n"
+    "}\n"
+    
+    ".modal-overlay {\n"
+    "    position: fixed;\n"
+    "    top: 0;\n"
+    "    left: 0;\n"
+    "    right: 0;\n"
+    "    bottom: 0;\n"
+    "    background: rgba(0,0,0,0.5);\n"
+    "    display: flex;\n"
+    "    justify-content: center;\n"
+    "    align-items: center;\n"
+    "    z-index: 999;\n"
+    "}\n"
+    
+    
+    
+    
+    
+    ".radio-group,\n"
+    ".checkbox-group {\n"
+    "    display: flex;\n"
+    "    flex-wrap: wrap;\n"
+    "    gap: 10px;\n"
+    "}\n"
+    
+    ".radio-group label,\n"
+    ".checkbox-group label {\n"
+    "    display: flex;\n"
+    "    align-items: center;\n"
+    "    gap: 5px;\n"
+    "    font-weight: normal;\n"
+    "}\n"
+    
+    
+    "button[type=\"submit\"] {\n"
+    "    background: #4CAF50;\n"
+    "    color: white;\n"
+    "}\n"
+    
+    "button[type=\"submit\"]:disabled {\n"
+    "    background: #ccc;\n"
+    "}\n"
+    
+    
+    "select.custom-select {\n"
+    "    padding: 12px;\n"
+    "    border: 1px solid #ddd;\n"
+    "    border-radius: 6px;\n"
+    "    background-color: white;\n"
+    "    font-size: 16px;\n"
+    "    color: #333;\n"
+    "    appearance: none;\n"
+    "    -webkit-appearance: none;\n"
+    "    background-image: url('data:image/svg+xml;utf8,<svg fill=\"%23333\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 10l5 5 5-5z\"/></svg>');\n"
+    "    background-repeat: no-repeat;\n"
+    "    background-position: right 10px center;\n"
+    "    background-size: 16px;\n"
+    "}\n"
+    
+    "/* 尝试设置option样式(效果有限) */\n"
+    "select.custom-select option {\n"
+    "    height: 40px;      /* 可能在某些浏览器中有效 */\n"
+    "    padding: 12px;     /* 可能在某些浏览器中有效 */\n"
+    "    font-size: 16px;   /* 通常有效 */\n"
+    "    line-height: 2;    /* 可能有效 */\n"
+    "}\n"
+    
+    "thead {\n"
+    "    position: sticky;  /* 固定表头 */\n"
+    "    top: 0;           /* 固定在容器顶部 */\n"
+    "    z-index: 10;      /* 确保表头在内容之上 */\n"
+    "}\n"
+    
+    
+    
+    ".divAll{\n"
+    "    width: 100%;\n"
+    "    height: 100%;\n"
+    "    margin: 0 auto;\n"
+    "    background: white;\n"
+    "    border-radius: 8px;\n"
+    "    box-shadow: 0 2px 10px rgb(0 0 0 / 10%);\n"
+    "    overflow: hidden;\n"
+    "}"
+;
+
+// 文本数据大小(包括null终止符)
+const size_t p_css_index_size = 8113;
+
+// 文本长度(字符数)
+const size_t p_css_index_length = 7864;
+
+#endif /* P_CSS_INDEX_H */

File diff suppressed because it is too large
+ 1481 - 0
nor_web/h_html/index_html.h


+ 35 - 0
nor_web/h_html/index_js.h

@@ -0,0 +1,35 @@
+/* 自动生成的文本数据头文件 */
+/* 源文件: index.js */
+/* 文件大小: 417 字节 */
+/* 生成时间: 2025-09-12 05:42:13 */
+/* 编码: utf-8 */
+#ifndef P_INDEX_JS_H
+#define P_INDEX_JS_H
+
+#include <stddef.h>
+
+// 文本数据(UTF-8编码)
+const char *p_index_js = 
+    "export  function    getApiBaseUrl (){\n"
+    "    const { protocol, hostname, port } = window.location;\n"
+    
+    "    // 开发环境特殊处理\n"
+    "    if (hostname === 'localhost' || hostname === '127.0.0.1') {\n"
+    "        return 'http://localhost:8084/pdu'; // 开发服务器地址\n"
+    "    }\n"
+    
+    "    // 生产环境使用当前域名\n"
+    "    return port\n"
+    "        ? `${protocol}//${hostname}:${port}/pdu`\n"
+    "        : `${protocol}//${hostname}/pdu`;\n"
+    "}\n"
+    
+;
+
+// 文本数据大小(包括null终止符)
+const size_t p_index_js_size = 418;
+
+// 文本长度(字符数)
+const size_t p_index_js_length = 367;
+
+#endif /* P_INDEX_JS_H */

+ 147 - 0
nor_web/h_html/operation.h

@@ -0,0 +1,147 @@
+/* 自动生成的文本数据头文件 */
+/* 源文件: operation.js */
+/* 文件大小: 3700 字节 */
+/* 生成时间: 2025-09-12 05:42:14 */
+/* 编码: utf-8 */
+#ifndef P_OPERATION_H
+#define P_OPERATION_H
+
+#include <stddef.h>
+
+// 文本数据(UTF-8编码)
+const char *p_operation = 
+    "// 总开\n"
+    "function all_open() {\n"
+    "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_CH_ALL, 0, 0, 1, 0));\n"
+    "}\n"
+    
+    "// 总关\n"
+    "function all_close() {\n"
+    "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_CH_ALL, 0, 0, 0, 0));\n"
+    "}\n"
+    
+    "// 通道开启\n"
+    "function single_open(j_data, channel_power_infro, j) {\n"
+    "    j_c_data = j_data\n"
+    "    opreation_data = channel_power_infro\n"
+    "    j_status = opreation_data[j].status;\n"
+    "    if (j_status == 0) {\n"
+    "        opreation_data[j].status = 1\n"
+    "    }\n"
+    "    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_SWITCH, 0, 0, opreation_data[j])\n"
+    "        //var b = bin_to_pkt(a)\n"
+    "    ws.send(a)\n"
+    "}\n"
+    
+    "// 通道关闭\n"
+    "function single_close(j_data, channel_power_infro, j) {\n"
+    "    j_c_data = j_data\n"
+    "    opreation_data = channel_power_infro\n"
+    "    j_status = opreation_data[j].status;\n"
+    "    if (j_status == 1) {\n"
+    "        opreation_data[j].status = 0\n"
+    "    }\n"
+    "    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_SWITCH, 0, 0, opreation_data[j])\n"
+    "        //var b = bin_to_pkt(a)\n"
+    "    ws.send(a)\n"
+    "}\n"
+    
+    "// 阈值设置\n"
+    "function threshold_update(orgin_data) {\n"
+    "    translate_data = orgin_data\n"
+    "    console.log(translate_data)\n"
+    "    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_THRESHOLD, 0, 1, translate_data)\n"
+    "    ws.send(a)\n"
+    "}\n"
+    "// 延时设置保存\n"
+    "function delay_update(orgin_data) {\n"
+    "    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_OPEN_DELAY, 0, 1, orgin_data)\n"
+    "    ws.send(a)\n"
+    "    b = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_CLOSE_DELAY, 0, 1, orgin_data)\n"
+    "    ws.send(b)\n"
+    "}\n"
+    
+    "// 耗电量重置\n"
+    "function power_reset(orgin_data) {\n"
+    "    console.log(orgin_data)\n"
+    "    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_POWER_CH, SUB_TYPE.SUB_TYPE_POWER_CONSUMER_CLEAR, 0, 1, orgin_data)\n"
+    "    ws.send(a)\n"
+    "}\n"
+    
+    "// 网络设置\n"
+    "function network_settings(data) {\n"
+    "    console.log(data)\n"
+    "    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_NETWORK, 0, 1, data)\n"
+    "    ws.send(a)\n"
+    "}\n"
+    
+    "// 485设置\n"
+    "function modbus_settings(data) {\n"
+    "    console.log(data)\n"
+    "    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_MODBUS, 0, 1, data)\n"
+    "    ws.send(a)\n"
+    "}\n"
+    
+    "// snmp设置\n"
+    "function snmp_settings(data) {\n"
+    "    console.log(data)\n"
+    "    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SNMP, 0, 1, data)\n"
+    "    ws.send(a)\n"
+    "}\n"
+    
+    "// 设备系统时间设置\n"
+    "function sys_settings(data) {\n"
+    "    console.log(data)\n"
+    "    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SYS, 0, 1, data)\n"
+    "    ws.send(a)\n"
+    "}\n"
+    
+    "// 设备固件升级\n"
+    "function sys_up_settings(data, file) {\n"
+    "    console.log(data)\n"
+    "    console.log(file)\n"
+    "    a = pkt_to_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SYS, 0, 1, data)\n"
+    "    ws.send(a)\n"
+    "}\n"
+    
+    "// 状态监控请求\n"
+    "function function1() {\n"
+    "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_POWER_TOTAL, 0, 0, 0));\n"
+    "    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"
+    "}\n"
+    
+    "//获取网络配置信息\n"
+    "function function2() {\n"
+    "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_NETWORK, 0, 0, 0));\n"
+    "}\n"
+    "//获取485配置\n"
+    "function function3() {\n"
+    "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_MODBUS, 0, 0, 0));\n"
+    
+    "}\n"
+    "//获取SNMP配置\n"
+    "function function4() {\n"
+    "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SNMP, 0, 0, 0));\n"
+    
+    "}\n"
+    "// 获取设备配置\n"
+    "function function5() {\n"
+    "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_PARAS, SUB_TYPE.SUB_TYPE_PARAS_SYS, 0, 0, 0));\n"
+    
+    "}\n"
+    "//获取传感器配置\n"
+    "function function6() {\n"
+    "    ws.send(mk_hdr_bin(0, PKT_TYPE.PKT_TYPE_SENSOR, 0, 0, 0, 0));\n"
+    
+    "}"
+;
+
+// 文本数据大小(包括null终止符)
+const size_t p_operation_size = 3701;
+
+// 文本长度(字符数)
+const size_t p_operation_length = 3532;
+
+#endif /* P_OPERATION_H */

File diff suppressed because it is too large
+ 22 - 0
nor_web/h_html/petite-vue.min.h


+ 33 - 0
nor_web/h_html/sys_para.h

@@ -0,0 +1,33 @@
+/* 自动生成的文本数据头文件 */
+/* 源文件: sys_paras.js */
+/* 文件大小: 240 字节 */
+/* 生成时间: 2025-09-12 05:42:14 */
+/* 编码: us-ascii */
+#ifndef P_SYS_PARA_H
+#define P_SYS_PARA_H
+
+#include <stddef.h>
+
+// 文本数据(UTF-8编码)
+const char *p_sys_para = 
+    "channle_datas = []\n"
+    "let currentNumber = 1;\n"
+    "let resultArray = [];\n"
+    "const cyclesPerNumber = 3;\n"
+    "let button_status = [];\n"
+    "const data = [];\n"
+    "const datas = []\n"
+    "const finall_data = []\n"
+    "const processing_data = {}\n"
+    "function parasd_process(parasd_data) {\n"
+    
+    "}"
+;
+
+// 文本数据大小(包括null终止符)
+const size_t p_sys_para_size = 241;
+
+// 文本长度(字符数)
+const size_t p_sys_para_length = 240;
+
+#endif /* P_SYS_PARA_H */

+ 148 - 0
nor_web/h_html/ws.h

@@ -0,0 +1,148 @@
+/* 自动生成的文本数据头文件 */
+/* 源文件: ws.js */
+/* 文件大小: 3174 字节 */
+/* 生成时间: 2025-09-12 05:42:14 */
+/* 编码: utf-8 */
+#ifndef P_WS_H
+#define P_WS_H
+
+#include <stddef.h>
+
+// 文本数据(UTF-8编码)
+const char *p_ws = 
+    "let productTypeData = {\n"
+    
+    "};\n"
+    "let data_alarm = [];\n"
+    "let sensorc_list = [];\n"
+    "let network_data = {}\n"
+    "    // 485配置\n"
+    "let cas_data = {}\n"
+    "    // snmp\n"
+    "let snmp_data = {}\n"
+    "    // 设备信息\n"
+    "let lang_data = {}\n"
+    
+    "let sensor_data = {}\n"
+    
+    "function on_ws_msg(js) {\n"
+    "    console.log(\"执行\")\n"
+    
+    "    // debugger\n"
+    "    //总电源数据显示\n"
+    "    if (js.powert != undefined) {\n"
+    "        total_data = js.powert.total\n"
+    "        type = js.powert.type\n"
+    "        productTypeData.productType = type;\n"
+    "        total_Infor(js, total_data, type)\n"
+    "    }\n"
+    "    //通道电源数据显示\n"
+    "    if (js.powerc != undefined) {\n"
+    "        channel_power_infro = js.powerc\n"
+    "        channel_infro = channel_power_infro.power\n"
+    "        alarm = js.powerc.alarm\n"
+    "        channel_number = js.powerc.info // 通道基础信息\n"
+    "        channel_power = js.powerc.power\n"
+    "        j_data = js\n"
+    "            // 通道号\n"
+    "        Channel_Info(j_data, channel_power_infro)\n"
+    
+    "        // 阈值设置\n"
+    "        threshold_mannage(js, channel_power_infro)\n"
+    "            // systemAlarm(alarm)\n"
+    "            //populateTable(j_data,channel_power)\n"
+    "    }\n"
+    
+    "    // 警告\n"
+    "    if (js.alarmd != undefined) {\n"
+    "        alarmd_data = js.alarmd\n"
+    "        data_alarm = [];\n"
+    "        data_alarm = alarm_process(alarmd_data)\n"
+    
+    "    }\n"
+    "    // 配置信息(网络配置,485配置,snmp,设备信息)\n"
+    
+    "    if (js.cas != undefined) {\n"
+    "        cas_data = js.cas;\n"
+    "    }\n"
+    "    if (js.network != undefined) {\n"
+    "        network_data = js.network\n"
+    "    }\n"
+    "    if (js.snmp != undefined) {\n"
+    "        snmp_data = js.snmp\n"
+    "        console.log(\"snmp数据--》\")\n"
+    "        console.log(snmp_data)\n"
+    "    }\n"
+    "    if (js.sensorc != undefined) {\n"
+    "        sensor_data = js.sensorc;\n"
+    "    }\n"
+    "    // if (js.paras != undefined) {\n"
+    "    //     // 设备信息\n"
+    "    //     lang_data = js.paras.lang\n"
+    "    // }\n"
+    "    if (js.sensorc != undefined) {\n"
+    "        sensorc_list = [];\n"
+    "        // 传感器\n"
+    "        sensorc_list = js.sensorc\n"
+    "        console.log(sensorc_list)\n"
+    "    }\n"
+    "    if (js.sys != undefined) {\n"
+    "        lang_data = js.sys\n"
+    "            // console.log(lang_data)\n"
+    "    }\n"
+    
+    "}\n"
+    
+    "function alarm_process(alarmd_data) {\n"
+    "    const result = [];\n"
+    "    const alarmProperties = alarmd_data.alarm;\n"
+    
+    "    const baseProperties = {\n"
+    "        \"ch\": alarmd_data.ch,\n"
+    "        \"time\": alarmd_data.time\n"
+    "    };\n"
+    "    let idCounter = 1;\n"
+    
+    "    for (const key in alarmProperties) {\n"
+    "        if (alarmProperties.hasOwnProperty(key) && alarmProperties[key] == 1) {\n"
+    "            const newObj = {...baseProperties, [key]: alarmProperties[key], \"id\": idCounter++ };\n"
+    "            result.push(newObj);\n"
+    "        }\n"
+    "    }\n"
+    
+    "    return result;\n"
+    "}\n"
+    
+    "function ws_hdr() {\n"
+    "    var proto = window.location.protocol,\n"
+    "        ws;\n"
+    "    if (proto == 'https:') {\n"
+    "        ws = 'wss://';\n"
+    "    } else {\n"
+    "        ws = 'ws://';\n"
+    "    }\n"
+    "    return ws;\n"
+    "}\n"
+    
+    "function setActivePage(pageFunction, intervalTime) {\n"
+    
+    "    // 停止之前活动的页面定时函数\n"
+    "    if (activePageIntervalId != null) {\n"
+    "        clearInterval(activePageIntervalId);\n"
+    "    }\n"
+    "    activePageIntervalId = setInterval(pageFunction, intervalTime);\n"
+    "}\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);"
+;
+
+// 文本数据大小(包括null终止符)
+const size_t p_ws_size = 3175;
+
+// 文本长度(字符数)
+const size_t p_ws_length = 3016;
+
+#endif /* P_WS_H */

File diff suppressed because it is too large
+ 1460 - 0
nor_web/index.html


+ 12 - 0
nor_web/test.sh

@@ -0,0 +1,12 @@
+#! /bin/sh
+
+./change.sh index.html  ./h_html/index_html.h p_index_html
+./change.sh api/channel_display.js ./h_html/channel_display.h p_channel_display
+./change.sh api/data.js ./h_html/data_js.h p_data_js
+./change.sh api/display_data.js ./h_html/display_data.h p_display_data
+./change.sh api/index.js ./h_html/index_js.h p_index_js
+./change.sh api/operation.js ./h_html/operation.h p_operation
+./change.sh api/petite-vue.min.js ./h_html/petite-vue.min.h p_petite_vue
+./change.sh api/sys_paras.js ./h_html/sys_para.h p_sys_para
+./change.sh api/ws.js ./h_html/ws.h p_ws
+./change.sh css/index.css ./h_html/index_css.h p_css_index