Files
JoyD/Windows/CS/Framework4.0/XCamera/Test/Form1.cs
2026-03-18 08:58:39 +08:00

782 lines
26 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using ErrorEventArgs = XCamera.Models.ErrorEventArgs;
using InfoEventArgs = XCamera.Models.InfoEventArgs;
using XCamera.Models;
namespace Test
{
public partial class Form1 : Form
{
private bool _isInitialized = false;
private bool _isConnected = false;
private bool _isCapturing = false;
private string _cameraIpAddress = "192.168.100.10"; // 默认IP地址
public Form1()
{
InitializeComponent();
// 检查是否处于设计模式
if (!DesignMode)
{
InitializeEvents();
}
UpdateUI();
}
/// <summary>
/// 初始化事件处理
/// </summary>
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;
global::XCamera.XCamera.InfoOccurred += OnInfoOccurred;
global::XCamera.XCamera.ImageCaptured += OnImageCaptured;
}
/// <summary>
/// 1. 初始化
/// </summary>
private void btnInitialize_Click(object sender, EventArgs e)
{
try
{
LogMessage("正在初始化SDK...");
// 初始化SDK不加载配置文件
if (global::XCamera.XCamera.Initialize())
{
_isInitialized = true;
LogMessage("SDK初始化成功");
LogMessage("现在可以设置配置文件或启动摄像头");
}
else
{
LogMessage("SDK初始化失败");
}
}
catch (Exception ex)
{
LogMessage($"初始化错误: {ex.Message}");
}
UpdateUI();
}
/// <summary>
/// 2. 设置配置文件路径
/// </summary>
private void btnSetConfigFile_Click(object sender, EventArgs e)
{
try
{
using (FolderBrowserDialog folderDialog = new FolderBrowserDialog())
{
// 设置默认路径为程序目录下的config文件夹
string defaultConfigPath = Path.Combine(Application.StartupPath, "config");
if (Directory.Exists(defaultConfigPath))
{
folderDialog.SelectedPath = defaultConfigPath;
}
else
{
folderDialog.SelectedPath = Application.StartupPath;
}
folderDialog.Description = "选择配置目录";
folderDialog.ShowNewFolderButton = false;
if (folderDialog.ShowDialog() == DialogResult.OK)
{
LogMessage($"正在设置配置目录: {folderDialog.SelectedPath}");
if (global::XCamera.XCamera.SetConfigPath(folderDialog.SelectedPath))
{
LogMessage("配置目录设置成功!");
// 显示配置信息
var config = global::XCamera.XCamera.GetCurrentConfig();
if (config != null)
{
LogMessage($"LED区域数: {config.LedRegions.Count}");
LogMessage($"TCP端口: {config.TcpPort}");
LogMessage($"用户名: {config.Username}");
LogMessage($"通道: {config.Channel}");
}
}
else
{
LogMessage("配置目录设置失败!");
}
}
}
}
catch (Exception ex)
{
LogMessage($"配置目录设置错误: {ex.Message}");
}
}
/// <summary>
/// 3. 设置IP地址
/// </summary>
private void btnSetIP_Click(object sender, EventArgs e)
{
try
{
if (!_isInitialized)
{
LogMessage("请先初始化!");
return;
}
string ipAddress = txtIpAddress.Text.Trim();
if (string.IsNullOrEmpty(ipAddress))
{
LogMessage("IP地址不能为空");
return;
}
if (global::XCamera.XCamera.SetIP(ipAddress))
{
_cameraIpAddress = ipAddress;
LogMessage($"IP地址设置成功: {ipAddress}");
}
else
{
LogMessage($"IP地址设置失败: {ipAddress}");
}
}
catch (Exception ex)
{
LogMessage($"设置IP地址错误: {ex.Message}");
}
}
/// <summary>
/// 5. 启动摄像头
/// </summary>
private void btnStartCamera_Click(object sender, EventArgs e)
{
try
{
if (!_isInitialized)
{
LogMessage("请先初始化!");
return;
}
LogMessage("正在启动摄像头...");
// 使用camera控件的窗口句柄进行预览
if (global::XCamera.XCamera.StartCamera(camera.Handle))
{
LogMessage("摄像头启动成功!");
}
else
{
LogMessage("摄像头启动失败!");
}
}
catch (Exception ex)
{
LogMessage($"启动摄像头错误: {ex.Message}");
}
UpdateUI();
}
/// <summary>
/// 6. 开始捕获图像
/// </summary>
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();
}
/// <summary>
/// 7. LED灯识别
/// </summary>
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}");
}
}
/// <summary>
/// 8. 状态查询
/// </summary>
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()}");
}
// 显示图像
DisplayLedImage(statuses);
}
catch (Exception ex)
{
LogMessage($"状态查询错误: {ex.Message}");
}
}
/// <summary>
/// 9. 区域编辑器
/// </summary>
private void btnShowRegionEditor_Click(object sender, EventArgs e)
{
try
{
LogMessage("正在打开区域编辑器...");
global::XCamera.XCamera.ShowRegionEditor();
LogMessage("区域编辑器已关闭");
}
catch (Exception ex)
{
LogMessage($"区域编辑器错误: {ex.Message}");
}
}
/// <summary>
/// 9. 关闭
/// </summary>
private void btnShutdown_Click(object sender, EventArgs e)
{
try
{
LogMessage("正在关闭...");
// 停止捕获
if (_isCapturing)
{
global::XCamera.XCamera.StopCapture();
LogMessage("捕获已停止");
}
// 停止摄像头
if (_isConnected)
{
global::XCamera.XCamera.StopCamera();
LogMessage("摄像头已停止");
}
// 关闭SDK
if (_isInitialized)
{
global::XCamera.XCamera.Shutdown();
LogMessage("SDK已关闭");
}
LogMessage("关闭完成!");
}
catch (Exception ex)
{
LogMessage($"关闭错误: {ex.Message}");
}
// 重置状态
_isInitialized = false;
_isConnected = false;
_isCapturing = false;
UpdateUI();
}
/// <summary>
/// 停止捕获
/// </summary>
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();
}
/// <summary>
/// 停止摄像头
/// </summary>
private void btnStopCamera_Click(object sender, EventArgs e)
{
try
{
if (!_isConnected)
{
LogMessage("当前未连接摄像头!");
return;
}
LogMessage("正在停止摄像头...");
global::XCamera.XCamera.StopCamera();
LogMessage("停止摄像头成功!");
}
catch (Exception ex)
{
LogMessage($"停止摄像头错误: {ex.Message}");
}
UpdateUI();
}
/// <summary>
/// LED状态更新事件处理
/// </summary>
private void OnLedStatusUpdated(object sender, LedStatusEventArgs e)
{
if (InvokeRequired)
{
BeginInvoke(new Action<object, LedStatusEventArgs>(OnLedStatusUpdated), sender, e);
return;
}
// 更新状态
_isConnected = global::XCamera.XCamera.IsConnected;
_isCapturing = global::XCamera.XCamera.IsCapturing;
UpdateUI();
// 显示LED状态
if (e.Statuses.Count > 0)
{
LogMessage($"LED状态更新 ({e.Statuses.Count} 个):");
foreach (var status in e.Statuses)
{
LogMessage($" {status.GetStatusDescription()}");
}
// 显示图像
DisplayLedImage(e.Statuses);
}
}
/// <summary>
/// 连接状态变更事件处理
/// </summary>
private void OnConnectionStateChanged(object sender, ConnectionStateEventArgs e)
{
if (InvokeRequired)
{
BeginInvoke(new Action<object, ConnectionStateEventArgs>(OnConnectionStateChanged), sender, e);
return;
}
_isConnected = e.IsConnected;
UpdateUI();
if (e.IsConnected)
{
LogMessage("摄像头已连接");
}
else
{
LogMessage("摄像头已断开");
}
}
/// <summary>
/// 捕获状态变更事件处理
/// </summary>
private void OnCaptureStateChanged(object sender, CaptureStateEventArgs e)
{
if (InvokeRequired)
{
BeginInvoke(new Action<object, CaptureStateEventArgs>(OnCaptureStateChanged), sender, e);
return;
}
_isCapturing = e.IsCapturing;
UpdateUI();
if (e.IsCapturing)
{
LogMessage("开始捕获图像");
}
else
{
LogMessage("停止捕获图像");
}
}
/// <summary>
/// 错误事件处理
/// </summary>
private void OnErrorOccurred(object sender, ErrorEventArgs e)
{
if (InvokeRequired)
{
BeginInvoke(new Action<object, ErrorEventArgs>(OnErrorOccurred), sender, e);
return;
}
LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] 错误: {e.ErrorMessage}");
}
/// <summary>
/// 信息事件处理
/// </summary>
private void OnInfoOccurred(object sender, InfoEventArgs e)
{
if (InvokeRequired)
{
BeginInvoke(new Action<object, InfoEventArgs>(OnInfoOccurred), sender, e);
return;
}
LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] {e.InfoMessage}");
}
/// <summary>
/// 图像捕获事件处理
/// </summary>
private void OnImageCaptured(object sender, ImageCapturedEventArgs e)
{
if (InvokeRequired)
{
BeginInvoke(new Action<object, ImageCapturedEventArgs>(OnImageCaptured), sender, e);
return;
}
try
{
// 显示捕获的图像
if (e.Image != null)
{
// 清理之前的图像
if (LedImage.Image != null)
{
var oldImage = LedImage.Image;
LedImage.Image = null;
oldImage.Dispose();
}
// 如果LED状态为空直接显示原图
if (e.LedStatuses == null || e.LedStatuses.Count == 0)
{
LedImage.Image = (System.Drawing.Image)e.Image.Clone();
}
else
{
// 创建带LED区域标注的图像
var annotatedImage = CreateAnnotatedImage(e.Image, e.LedStatuses);
LedImage.Image = annotatedImage;
}
// 调整显示模式
LedImage.SizeMode = PictureBoxSizeMode.Zoom;
}
}
catch (Exception ex)
{
LogMessage($"显示图像失败: {ex.Message}");
}
}
/// <summary>
/// 创建带LED区域标注的图像
/// </summary>
private System.Drawing.Image CreateAnnotatedImage(System.Drawing.Image originalImage, List<LedStatus> ledStatuses)
{
// 创建位图副本
var bitmap = new Bitmap(originalImage.Width, originalImage.Height);
using (var g = Graphics.FromImage(bitmap))
{
// 绘制原始图像
g.DrawImage(originalImage, 0, 0, originalImage.Width, originalImage.Height);
// 绘制LED状态信息
for (int i = 0; i < ledStatuses.Count; i++)
{
var status = ledStatuses[i];
// 根据状态设置颜色
Color ledColor = GetLedColor(status);
// 计算LED显示位置
int ledSize = 40;
int spacing = 60;
int startX = 20;
int startY = 20;
int x = startX + (i % 5) * spacing;
int y = startY + (i / 5) * spacing;
// 绘制LED圆形
Rectangle ledRect = new Rectangle(x, y, ledSize, ledSize);
using (var ledBrush = new SolidBrush(ledColor))
{
g.FillEllipse(ledBrush, ledRect);
}
// 绘制LED边框
using (var borderPen = new Pen(Color.Black, 2))
{
g.DrawEllipse(borderPen, ledRect);
}
// 绘制标签
using (var font = new Font("Arial", 8))
using (var textBrush = new SolidBrush(Color.White))
{
string label = status.RegionName;
g.DrawString(label, font, textBrush, x, y + ledSize + 2);
string stateText = status.State.ToString();
if (status.IsBlinking)
stateText = "Blinking";
g.DrawString(stateText, font, textBrush, x, y + ledSize + 15);
}
}
}
return bitmap;
}
/// <summary>
/// 显示LED图像
/// </summary>
private void DisplayLedImage(List<LedStatus> 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;
}
}
/// <summary>
/// 获取LED颜色
/// </summary>
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;
}
}
/// <summary>
/// 更新UI状态
/// </summary>
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;
}
/// <summary>
/// 窗体关闭事件
/// </summary>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
// 确保在关闭时清理资源
if (_isCapturing)
{
global::XCamera.XCamera.StopCapture();
}
if (_isConnected)
{
global::XCamera.XCamera.StopCamera();
}
if (_isInitialized)
{
global::XCamera.XCamera.Shutdown();
}
}
catch (Exception ex)
{
// 忽略关闭时的错误
System.Diagnostics.Debug.WriteLine($"关闭错误: {ex.Message}");
}
}
/// <summary>
/// 日志消息
/// </summary>
private void LogMessage(string message)
{
if (InvokeRequired)
{
BeginInvoke(new Action<string>(LogMessage), message);
return;
}
string timestamp = DateTime.Now.ToString("HH:mm:ss.fff");
txtLog.AppendText($"[{timestamp}] {message}" + Environment.NewLine);
txtLog.ScrollToCaret();
}
}
}