- {/* H/W 상태 표시 (윈폼 HWState와 동일) */}
- {hwStatus.map((hw) => {
- const colors = getStatusColor(hw.status);
- return (
-
-
-
{hw.name}
-
{hw.title}
+ <>
+ {/* 하드웨어 오류 표시 배너 - 화면 중앙 상단에 크게 표시 */}
+ {hardwareError && (
+
+
+
+
⚠
+
+ {hardwareError.message}
+
+
+ CHECK HARDWARE CONNECTION
+
- );
- })}
- {/* HOST 연결 상태 */}
-
-
-
- POS.X: {robotTarget.x.toFixed(3)}
- POS.Y: {robotTarget.y.toFixed(3)}
- POS.Z: {robotTarget.z.toFixed(3)}
-
-
+ )}
+
+
+ >
);
};
diff --git a/FrontEnd/pages/HomePage.tsx b/FrontEnd/pages/HomePage.tsx
index 7593840..56532da 100644
--- a/FrontEnd/pages/HomePage.tsx
+++ b/FrontEnd/pages/HomePage.tsx
@@ -8,6 +8,7 @@ import { MotionPanel } from '../components/MotionPanel';
import { CyberPanel } from '../components/common/CyberPanel';
import { ModelInfoPanel } from '../components/ModelInfoPanel';
import { ProcessedDataPanel } from '../components/ProcessedDataPanel';
+import { VisionDataPanel } from '../components/VisionDataPanel';
import { SystemStatusPanel } from '../components/SystemStatusPanel';
import { EventLogPanel } from '../components/EventLogPanel';
import { SystemState, Recipe, IOPoint, LogEntry, RobotTarget, ConfigItem } from '../types';
@@ -121,8 +122,13 @@ export const HomePage: React.FC
= ({
- {/* Bottom Docked - Processed Data Panel */}
-
+ {/* Left - Vision Data Panel (Recognized Data) - 세로 공간 최대 사용 */}
+
+
+
+
+ {/* Bottom Docked - Processed Data Panel (우측 사이드바 피함) */}
+
diff --git a/Handler/Project/Dialog/fWebView.cs b/Handler/Project/Dialog/fWebView.cs
index 817c3b7..b18d83e 100644
--- a/Handler/Project/Dialog/fWebView.cs
+++ b/Handler/Project/Dialog/fWebView.cs
@@ -277,6 +277,7 @@ namespace Project.Dialog
{
_hwUpdateCounter = 0;
BroadcastHWStatus();
+ BroadcastVisionData();
}
}
@@ -311,6 +312,37 @@ namespace Project.Dialog
}
}
+ // Vision Data 브로드캐스트 (listView21과 동일한 데이터)
+ private void BroadcastVisionData()
+ {
+ try
+ {
+ var bridge = new WebUI.MachineBridge(this);
+ string visionDataJson = bridge.GetVisionData();
+
+ var payload = new
+ {
+ type = "VISION_DATA_UPDATE",
+ data = JsonConvert.DeserializeObject(visionDataJson)
+ };
+
+ string json = JsonConvert.SerializeObject(payload);
+
+ // WebView2로 전송
+ if (webView != null && webView.CoreWebView2 != null)
+ {
+ webView.CoreWebView2.PostWebMessageAsJson(json);
+ }
+
+ // WebSocket으로 전송
+ _wsServer?.Broadcast(json);
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"[fWebView] Vision data broadcast error: {ex.Message}");
+ }
+ }
+
private List