From 726490f83db7974f40aef2d2fcb71181102bba6e Mon Sep 17 00:00:00 2001 From: jinchao <383321154@qq.com> Date: Fri, 13 Jun 2025 17:10:42 +0800 Subject: [PATCH] =?UTF-8?q?V0.22.0.250613=5Falpha:=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=87=87=E9=9B=86=E9=A1=B5=E9=9D=A2=E5=B8=83=E5=B1=80=E7=BB=98?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Release/database/XNSim.db | Bin 1224704 -> 1224704 bytes XNMonitorServer/CSVDataInjectThread.cpp | 42 +-- XNSimHtml/components/data-collection.js | 334 ++++++++++++++++++++++-- XNSimHtml/components/data-monitor.js | 16 +- 4 files changed, 352 insertions(+), 40 deletions(-) diff --git a/Release/database/XNSim.db b/Release/database/XNSim.db index 1aae7f283527f86e51345797b40eb4468a634038..e6303a5e9c7deaada034bf4a006a3fca83ba4bc6 100644 GIT binary patch delta 1027 zcmZWn+fUO_7;ifrv|YQ2mjw}rn!QLidsZXw(GpLX1We=@>A? z!7xs00L9yM5g8YS>NfNr@QF7cOi1Lk+Y4$!!js~+HOPa>`SqNB=ewQX?^EXvsdI<= zD#*nBE%jt#;!J#xV-ro<+~oC^bJtp!cjVq>Pk8yXzI>Xbj+EO^5iX*~#*a8=**WGH zbC}*$8Y`K!pVc>yll$!J34)*rulIPk?J&*3p*~!xou4ABd3C^yCvmhNr=FO-E&&g=!QO5Ct*d6JQ0a z1R4GnLDCk|tb)<{PDU?5Oo2xgbygdXQH%5{nuIL?uuMOTRKo#rNA3E~=IMq#7tLs-O8u z?c`X-R!$0jQS=LnuKlKF*HMeI_Jz0Y_SOkC!5RTcvcKu_`PDZZ6Chsz#PuUtKB--0 zZ62+XwK0)JrwyY6&AS3$cKc|fN$A*6a=HPvh+R6+8^+!(_{gL_1bZ#tzWBouq7kN>` AApigX delta 424 zcmZp8;MMTJYl1Z6?1?hYjI%c;OtI$?4UC6aw?`jiG-sSXX*;9v^rgocCAaU}&e+E^-RBhJ z#_4}|F}~ma<}@Qe%l6;<895*Dv2s^4^BeIs@D}sra93|u6v*VBUcH*>BYzW%2rq-G zVR56cxHyNg<@D+`Os%?4*YA1JzUBGsiO>3$KVQB6#r_%3rZ0H5c`8KYX~%{qyZ1kz zGynPSj%RBZP1jn>q^w}3YiyukXkuk*Xk~0>Wnf@rU}UOmV5)0msbFAcWoop&U@g-W zCuU3D>C@RiFhy=p`oN^cJ28NF`}Ds|mjsy>x=ugC$84=?ZfR~{VQOk=p_h}N4l%<_ z*U&fwXoiW2m5G_2nUO`*^g?cC`RTIU%v|kX_?dy21&CRJm<@>8ftUk`Ij4W&=MoTL z8$Kr8^ng4@4K3vo^X0LL+& A9RL6T diff --git a/XNMonitorServer/CSVDataInjectThread.cpp b/XNMonitorServer/CSVDataInjectThread.cpp index 699d226..1a875e9 100644 --- a/XNMonitorServer/CSVDataInjectThread.cpp +++ b/XNMonitorServer/CSVDataInjectThread.cpp @@ -58,26 +58,36 @@ bool CSVDataInjectThread::Initialize(std::vector injectDataInfos void CSVDataInjectThread::parseHeaderField(const std::string &headerField) { CSVHeaderField csvHeaderField; - csvHeaderField.fieldName = headerField.substr(0, headerField.find('[')); + csvHeaderField.fieldName = headerField.substr(0, headerField.find('(')); csvHeaderField.arrayDim = 0; csvHeaderField.arrayIndex1 = 0; csvHeaderField.arrayIndex2 = 0; - if (headerField.find('[') != std::string::npos) { - // 处理一维数组 - size_t firstBracketPos = headerField.find('['); - size_t firstBracketEndPos = headerField.find(']'); - csvHeaderField.arrayIndex1 = std::stoi( - headerField.substr(firstBracketPos + 1, firstBracketEndPos - firstBracketPos - 1)); - csvHeaderField.arrayDim = 1; - - // 检查是否有第二个方括号,判断是否为二维数组 - if (headerField.find('[', firstBracketEndPos) != std::string::npos) { - size_t secondBracketPos = headerField.find('[', firstBracketEndPos); - size_t secondBracketEndPos = headerField.find(']', secondBracketPos); - csvHeaderField.arrayIndex2 = std::stoi(headerField.substr( - secondBracketPos + 1, secondBracketEndPos - secondBracketPos - 1)); - csvHeaderField.arrayDim = 2; + if (headerField.find('(') != std::string::npos) { + // 处理一维或二维数组,格式为interfaceName(1)或interfaceName(1,2) + size_t firstParenPos = headerField.find('('); + size_t lastParenPos = headerField.find(')'); + std::string indexStr = + headerField.substr(firstParenPos + 1, lastParenPos - firstParenPos - 1); + if (indexStr.find('_') != std::string::npos) { + // 二维数组 + size_t commaPos = indexStr.find('_'); + csvHeaderField.arrayIndex1 = std::stoi(indexStr.substr(0, commaPos)) - 1; + if (csvHeaderField.arrayIndex1 < 0) { + return; + } + csvHeaderField.arrayIndex2 = std::stoi(indexStr.substr(commaPos + 1)) - 1; + if (csvHeaderField.arrayIndex2 < 0) { + return; + } + csvHeaderField.arrayDim = 2; + } else { + // 一维数组 + csvHeaderField.arrayIndex1 = std::stoi(indexStr) - 1; + if (csvHeaderField.arrayIndex1 < 0) { + return; + } + csvHeaderField.arrayDim = 1; } } diff --git a/XNSimHtml/components/data-collection.js b/XNSimHtml/components/data-collection.js index ca1bcd3..b8dcfeb 100644 --- a/XNSimHtml/components/data-collection.js +++ b/XNSimHtml/components/data-collection.js @@ -2,13 +2,119 @@ class DataCollection extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); + this.monitorStatus = 0; // 0-未监控,1-监控中,2-错误 + this.statusTimer = null; } - connectedCallback() { + getCurrentSelection() { + const selection = localStorage.getItem('xnsim-selection'); + if (!selection) { + return { plane: '', configurationId: '', domainId: '' }; + } + try { + const parsedSelection = JSON.parse(selection); + return { + plane: parsedSelection.plane || '', + configurationId: parsedSelection.configurationId || '', + domainId: parsedSelection.domainId || '' + }; + } catch (error) { + return { plane: '', configurationId: '', domainId: '' }; + } + } + + async loadInterfaces() { + try { + const { configurationId } = this.getCurrentSelection(); + if (!configurationId) { + console.warn('未找到配置ID'); + this.interfaces = []; + return; + } + const response = await fetch(`/api/interface/list?systemName=XNSim&confID=${configurationId}`); + const data = await response.json(); + this.interfaces = data; + } catch (error) { + console.error('加载接口数据失败:', error); + this.interfaces = []; + } + } + + async connectedCallback() { + await this.loadInterfaces(); this.render(); + + setTimeout(() => { + this.startStatusTimer(); + }, 1000); + } + + startStatusTimer() { + if (this.statusTimer) { + clearInterval(this.statusTimer); + } + this.statusTimer = setInterval(async () => { + try { + const res = await fetch('/api/dds-monitor/status'); + if (!res.ok) throw new Error('网络错误'); + const data = await res.json(); + if (data.isInitialized) { + this.monitorStatus = 1; + } else { + this.monitorStatus = 0; + } + } catch (e) { + this.monitorStatus = 2; + } + this.updateMonitorStatus(); + }, 1000); + } + + disconnectedCallback() { + if (this.statusTimer) { + clearInterval(this.statusTimer); + this.statusTimer = null; + } + } + + updateMonitorStatus() { + const statusIndicator = this.shadowRoot.getElementById('statusIndicator'); + const statusText = this.shadowRoot.getElementById('statusText'); + if (statusIndicator) { + statusIndicator.classList.remove('active', 'inactive', 'error'); + switch (this.monitorStatus) { + case 1: + statusIndicator.classList.add('active'); + break; + case 2: + statusIndicator.classList.add('error'); + break; + default: + statusIndicator.classList.add('inactive'); + } + } + if (statusText) { + switch (this.monitorStatus) { + case 1: + statusText.textContent = '监控中'; + break; + case 2: + statusText.textContent = '监控错误'; + break; + default: + statusText.textContent = '未监控'; + } + } } render() { + // 树型控件分组 + const groupedInterfaces = (this.interfaces || []).reduce((groups, item) => { + const group = groups[item.ModelStructName] || []; + group.push(item); + groups[item.ModelStructName] = group; + return groups; + }, {}); this.shadowRoot.innerHTML = ` -
-
-
数据采集
+
+
+
+
+ 未监控 +
+
+
+
+
+
+
+ + +
+
+
+
脚本文件
+ +
+
+
采集频率 (Hz)
+ +
+
+
采集时长 (秒)
+ +
+
+
输出文件
+ +
+
+
+
+
采集列表:
+
+ +
+
-
数据采集组件内容(待实现)
`; + this.updateMonitorStatus(); } } diff --git a/XNSimHtml/components/data-monitor.js b/XNSimHtml/components/data-monitor.js index 767ea74..14a01fe 100644 --- a/XNSimHtml/components/data-monitor.js +++ b/XNSimHtml/components/data-monitor.js @@ -1387,8 +1387,8 @@ class DataMonitor extends HTMLElement { 接口名
结构体名
- 数据
- 注入值
+ 数据
+ 注入值
注入频率(Hz)
操作 @@ -2142,13 +2142,13 @@ class DataMonitor extends HTMLElement { for (let i = 1; i < validateResult.headers.length; i++) { const header = validateResult.headers[i]; // 提取接口名称和数组索引 - const match = header.match(/^(.+?)(?:\[(\d+)\](?:\[(\d+)\])?)?$/); + const match = header.match(/^(.+?)\((\d+)(?:_(\d+))?\)$/); if (!match) continue; const baseInterfaceName = match[1]; - const index1 = match[2] ? parseInt(match[2]) : null; - const index2 = match[3] ? parseInt(match[3]) : null; - + const index1 = match[2] ? parseInt(match[2], 10) - 1 : null; + const index2 = match[3] ? parseInt(match[3], 10) - 1 : null; + console.log(index1, index2); const interfaceInfo = this.interfaces.find(interfaceItem => interfaceItem.InterfaceName === baseInterfaceName ); @@ -2172,13 +2172,13 @@ class DataMonitor extends HTMLElement { if (index1 !== null) { if (index2 !== null) { // 二维数组 - if (index1 >= interfaceInfo.InterfaceArraySize_1 || index2 >= interfaceInfo.InterfaceArraySize_2) { + if (index1 >= interfaceInfo.InterfaceArraySize_1 || index2 >= interfaceInfo.InterfaceArraySize_2 || index1 < 0 || index2 < 0) { console.warn(`接口 ${baseInterfaceName} 的数组索引 [${index1}][${index2}] 超出范围`); continue; } } else { // 一维数组 - if (index1 >= interfaceInfo.InterfaceArraySize_1) { + if (index1 >= interfaceInfo.InterfaceArraySize_1 || index1 < 0) { console.warn(`接口 ${baseInterfaceName} 的数组索引 [${index1}] 超出范围`); continue; }