using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; using XCamera.Models; namespace Test { public partial class Form1 : Form { private bool _isInitialized = false; private bool _isConnected = false; private bool _isCapturing = false; public Form1() { InitializeComponent(); // 检查是否处于设计模式 if (!DesignMode) { InitializeEvents(); } UpdateUI(); } /// /// 初始化事件处理 /// private void InitializeEvents() { // 避免在设计模式下订阅事件 if (DesignMode) return; // 订阅XCamera事件 global::XCamera.XCamera.LedStatusUpdated += OnLedStatusUpdated; global::XCamera.XCamera.ConnectionStateChanged += OnConnectionStateChanged; global::XCamera.XCamera.CaptureStateChanged += OnCaptureStateChanged; global::XCamera.XCamera.ErrorOccurred += OnErrorOccurred; } /// /// 1. 初始化 /// private void btnInitialize_Click(object sender, EventArgs e) { try { LogMessage("正在初始化..."); // 使用默认配置文件路径 string configPath = System.IO.Path.Combine(Application.StartupPath, "config", "sample_config.json"); if (global::XCamera.XCamera.Initialize(configPath)) { _isInitialized = true; LogMessage("初始化成功!"); // 显示配置信息 var config = global::XCamera.XCamera.GetCurrentConfig(); if (config != null) { LogMessage($"摄像头IP: {config.IpAddress}"); LogMessage($"TCP端口: {config.TcpPort}"); LogMessage($"LED区域数: {config.LedRegions.Count}"); } } else { LogMessage("初始化失败!"); } } catch (Exception ex) { LogMessage($"初始化错误: {ex.Message}"); } UpdateUI(); } /// /// 2. 设置配置文件路径 /// private void btnSetConfigFile_Click(object sender, EventArgs e) { try { using (OpenFileDialog openFileDialog = new OpenFileDialog()) { openFileDialog.Filter = "JSON文件|*.json|所有文件|*.*"; openFileDialog.Title = "选择配置文件"; if (openFileDialog.ShowDialog() == DialogResult.OK) { LogMessage($"正在加载配置文件: {openFileDialog.FileName}"); if (global::XCamera.XCamera.SetConfigFile(openFileDialog.FileName)) { LogMessage("配置文件加载成功!"); // 显示配置信息 var config = global::XCamera.XCamera.GetCurrentConfig(); if (config != null) { LogMessage($"摄像头IP: {config.IpAddress}"); LogMessage($"LED区域数: {config.LedRegions.Count}"); } } else { LogMessage("配置文件加载失败!"); } } } } catch (Exception ex) { LogMessage($"配置文件加载错误: {ex.Message}"); } } /// /// 3. 启动摄像头 /// private void btnStartCamera_Click(object sender, EventArgs e) { try { if (!_isInitialized) { LogMessage("请先初始化!"); return; } LogMessage("正在启动摄像头..."); if (global::XCamera.XCamera.StartCamera()) { LogMessage("摄像头启动成功!"); } else { LogMessage("摄像头启动失败!"); } } catch (Exception ex) { LogMessage($"启动摄像头错误: {ex.Message}"); } UpdateUI(); } /// /// 4. 开始捕获图像 /// private void btnStartCapture_Click(object sender, EventArgs e) { try { if (!_isConnected) { LogMessage("请先连接摄像头!"); return; } if (_isCapturing) { LogMessage("已经在捕获中!"); return; } LogMessage("正在开始捕获图像..."); if (global::XCamera.XCamera.StartCapture(1000)) // 1秒间隔 { LogMessage("开始捕获图像成功!"); } else { LogMessage("开始捕获图像失败!"); } } catch (Exception ex) { LogMessage($"开始捕获错误: {ex.Message}"); } UpdateUI(); } /// /// 5. LED灯识别 /// private void btnDetectLeds_Click(object sender, EventArgs e) { try { if (!_isConnected) { LogMessage("请先连接摄像头!"); return; } LogMessage("正在识别LED灯..."); var statuses = global::XCamera.XCamera.DetectLeds(); LogMessage($"检测到 {statuses.Count} 个LED灯:"); foreach (var status in statuses) { LogMessage($" {status.GetStatusDescription()}"); } // 显示图像(如果有的话) DisplayLedImage(statuses); } catch (Exception ex) { LogMessage($"LED识别错误: {ex.Message}"); } } /// /// 6. 状态查询 /// private void btnGetLedStatuses_Click(object sender, EventArgs e) { try { if (!_isConnected) { LogMessage("请先连接摄像头!"); return; } LogMessage("正在查询LED状态..."); var statuses = global::XCamera.XCamera.GetLedStatuses(); LogMessage($"当前LED状态 ({statuses.Count} 个):"); foreach (var status in statuses) { LogMessage($" {status.GetStatusDescription()}"); } } catch (Exception ex) { LogMessage($"状态查询错误: {ex.Message}"); } } /// /// 7. 区域设置窗口 /// private void btnShowRegionEditor_Click(object sender, EventArgs e) { try { LogMessage("正在打开区域编辑器..."); global::XCamera.XCamera.ShowRegionEditor(); LogMessage("区域编辑器已关闭"); } catch (Exception ex) { LogMessage($"区域编辑器错误: {ex.Message}"); } } /// /// 8. 资源释放 /// private void btnShutdown_Click(object sender, EventArgs e) { try { LogMessage("正在释放资源..."); if (_isCapturing) { global::XCamera.XCamera.StopCapture(); } if (_isConnected) { global::XCamera.XCamera.StopCamera(); } global::XCamera.XCamera.Shutdown(); _isInitialized = false; _isConnected = false; _isCapturing = false; LogMessage("资源已释放"); } catch (Exception ex) { LogMessage($"资源释放错误: {ex.Message}"); } UpdateUI(); } /// /// 停止捕获 /// private void btnStopCapture_Click(object sender, EventArgs e) { try { if (!_isCapturing) { LogMessage("当前未在捕获中!"); return; } LogMessage("正在停止捕获..."); global::XCamera.XCamera.StopCapture(); LogMessage("捕获已停止"); } catch (Exception ex) { LogMessage($"停止捕获错误: {ex.Message}"); } UpdateUI(); } /// /// 停止摄像头 /// private void btnStopCamera_Click(object sender, EventArgs e) { try { if (!_isConnected) { LogMessage("摄像头未连接!"); return; } LogMessage("正在停止摄像头..."); if (_isCapturing) { global::XCamera.XCamera.StopCapture(); } global::XCamera.XCamera.StopCamera(); LogMessage("摄像头已停止"); } catch (Exception ex) { LogMessage($"停止摄像头错误: {ex.Message}"); } UpdateUI(); } /// /// LED状态更新事件处理 /// private void OnLedStatusUpdated(object sender, LedStatusEventArgs e) { if (InvokeRequired) { BeginInvoke(new Action(OnLedStatusUpdated), sender, e); return; } LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] LED状态更新:"); foreach (var status in e.Statuses) { LogMessage($" {status.GetStatusDescription()}"); } } /// /// 连接状态变更事件处理 /// private void OnConnectionStateChanged(object sender, ConnectionStateEventArgs e) { if (InvokeRequired) { BeginInvoke(new Action(OnConnectionStateChanged), sender, e); return; } _isConnected = e.IsConnected; LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] 摄像头连接状态: {(e.IsConnected ? "已连接" : "已断开")}"); UpdateUI(); } /// /// 捕获状态变更事件处理 /// private void OnCaptureStateChanged(object sender, CaptureStateEventArgs e) { if (InvokeRequired) { BeginInvoke(new Action(OnCaptureStateChanged), sender, e); return; } _isCapturing = e.IsCapturing; LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] 图像捕获状态: {(e.IsCapturing ? "开始捕获" : "停止捕获")}"); UpdateUI(); } /// /// 错误事件处理 /// private void OnErrorOccurred(object sender, ErrorEventArgs e) { if (InvokeRequired) { BeginInvoke(new Action(OnErrorOccurred), sender, e); return; } LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] 错误: {e.ErrorMessage}"); } /// /// 日志消息 /// private void LogMessage(string message) { if (InvokeRequired) { BeginInvoke(new Action(LogMessage), message); return; } string timestamp = DateTime.Now.ToString("HH:mm:ss.fff"); txtLog.AppendText($"[{timestamp}] {message}" + Environment.NewLine); txtLog.ScrollToCaret(); } /// /// 显示LED图像 /// private void DisplayLedImage(List statuses) { // 这里可以添加显示LED图像的逻辑 // 例如:在PictureBox中绘制LED状态的可视化表示 if (statuses.Count > 0) { // 创建简单的可视化表示 Bitmap bitmap = new Bitmap(LedImage.Width, LedImage.Height); using (Graphics g = Graphics.FromImage(bitmap)) { g.Clear(Color.Black); int ledCount = statuses.Count; int ledWidth = LedImage.Width / Math.Max(ledCount, 1); int ledHeight = LedImage.Height / 2; for (int i = 0; i < statuses.Count; i++) { var status = statuses[i]; Rectangle ledRect = new Rectangle(i * ledWidth + 10, LedImage.Height / 4, ledWidth - 20, ledHeight); // 根据状态设置颜色 Color ledColor = GetLedColor(status); using (Brush brush = new SolidBrush(ledColor)) { g.FillEllipse(brush, ledRect); } // 绘制标签 using (Font font = new Font("Arial", 8)) using (Brush textBrush = new SolidBrush(Color.White)) { string label = $"{status.RegionName}\n{status.State}"; g.DrawString(label, font, textBrush, ledRect.X, ledRect.Bottom + 5); } } } LedImage.Image = bitmap; } } /// /// 获取LED颜色 /// private Color GetLedColor(LedStatus status) { if (status.State == LedState.Off) return Color.Gray; switch (status.DetectedColor) { case LedColor.Red: return status.IsBlinking ? Color.Pink : Color.Red; case LedColor.Yellow: return status.IsBlinking ? Color.LightYellow : Color.Yellow; case LedColor.Blue: return status.IsBlinking ? Color.LightBlue : Color.Blue; case LedColor.Green: return status.IsBlinking ? Color.LightGreen : Color.Green; default: return Color.DarkGray; } } /// /// 更新UI状态 /// private void UpdateUI() { btnInitialize.Enabled = !_isInitialized; btnSetConfigFile.Enabled = _isInitialized; btnStartCamera.Enabled = _isInitialized && !_isConnected; btnStopCamera.Enabled = _isConnected; btnStartCapture.Enabled = _isConnected && !_isCapturing; btnStopCapture.Enabled = _isCapturing; btnDetectLeds.Enabled = _isConnected; btnGetLedStatuses.Enabled = _isConnected; btnShowRegionEditor.Enabled = _isInitialized; btnShutdown.Enabled = _isInitialized; // 更新状态标签 if (_isCapturing) lblStatus.Text = "状态: 正在捕获"; else if (_isConnected) lblStatus.Text = "状态: 已连接"; else if (_isInitialized) lblStatus.Text = "状态: 已初始化"; else lblStatus.Text = "状态: 未初始化"; // ToolStripStatusLabel没有ForeColor属性,我们可以使用BackColor或者保持默认样式 // 如果需要颜色变化,可以考虑使用BackColor // lblStatus.BackColor = _isConnected ? Color.LightGreen : Color.LightPink; } /// /// 窗体关闭事件 /// private void Form1_FormClosing(object sender, FormClosingEventArgs e) { try { // 避免在设计模式下执行外部代码 if (DesignMode) return; // 确保释放资源 if (_isCapturing) { global::XCamera.XCamera.StopCapture(); } if (_isConnected) { global::XCamera.XCamera.StopCamera(); } if (_isInitialized) { global::XCamera.XCamera.Shutdown(); } } catch { // 忽略关闭时的错误 } } } }