项目基础代码完成

This commit is contained in:
zqm
2026-03-16 17:05:54 +08:00
parent f3dd091d2c
commit e4502c338a
23 changed files with 1930 additions and 142 deletions

View File

@@ -0,0 +1,567 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using XCamera;
using XCamera.Models;
namespace Test
{
public partial class Form1 : Form
{
private bool _isInitialized = false;
private bool _isConnected = false;
private bool _isCapturing = false;
private Thread _captureThread;
private bool _shouldStopCapture = false;
public Form1()
{
InitializeComponent();
InitializeEvents();
UpdateUI();
}
/// <summary>
/// 初始化事件处理
/// </summary>
private void InitializeEvents()
{
// 订阅XCamera事件
XCamera.LedStatusUpdated += OnLedStatusUpdated;
XCamera.ConnectionStateChanged += OnConnectionStateChanged;
XCamera.CaptureStateChanged += OnCaptureStateChanged;
XCamera.ErrorOccurred += OnErrorOccurred;
}
/// <summary>
/// 1. 初始化
/// </summary>
private void btnInitialize_Click(object sender, EventArgs e)
{
try
{
LogMessage("正在初始化...");
// 使用默认配置文件路径
string configPath = System.IO.Path.Combine(Application.StartupPath, "config", "sample_config.json");
if (XCamera.Initialize(configPath))
{
_isInitialized = true;
LogMessage("初始化成功!");
// 显示配置信息
var config = 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();
}
/// <summary>
/// 2. 设置配置文件路径
/// </summary>
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 (XCamera.SetConfigFile(openFileDialog.FileName))
{
LogMessage("配置文件加载成功!");
// 显示配置信息
var config = XCamera.GetCurrentConfig();
if (config != null)
{
LogMessage($"摄像头IP: {config.IpAddress}");
LogMessage($"LED区域数: {config.LedRegions.Count}");
}
}
else
{
LogMessage("配置文件加载失败!");
}
}
}
}
catch (Exception ex)
{
LogMessage($"配置文件加载错误: {ex.Message}");
}
}
/// <summary>
/// 3. 启动摄像头
/// </summary>
private void btnStartCamera_Click(object sender, EventArgs e)
{
try
{
if (!_isInitialized)
{
LogMessage("请先初始化!");
return;
}
LogMessage("正在启动摄像头...");
if (XCamera.StartCamera())
{
LogMessage("摄像头启动成功!");
}
else
{
LogMessage("摄像头启动失败!");
}
}
catch (Exception ex)
{
LogMessage($"启动摄像头错误: {ex.Message}");
}
UpdateUI();
}
/// <summary>
/// 4. 开始捕获图像
/// </summary>
private void btnStartCapture_Click(object sender, EventArgs e)
{
try
{
if (!_isConnected)
{
LogMessage("请先连接摄像头!");
return;
}
if (_isCapturing)
{
LogMessage("已经在捕获中!");
return;
}
LogMessage("正在开始捕获图像...");
if (XCamera.StartCapture(1000)) // 1秒间隔
{
LogMessage("开始捕获图像成功!");
}
else
{
LogMessage("开始捕获图像失败!");
}
}
catch (Exception ex)
{
LogMessage($"开始捕获错误: {ex.Message}");
}
UpdateUI();
}
/// <summary>
/// 5. LED灯识别
/// </summary>
private void btnDetectLeds_Click(object sender, EventArgs e)
{
try
{
if (!_isConnected)
{
LogMessage("请先连接摄像头!");
return;
}
LogMessage("正在识别LED灯...");
var statuses = XCamera.DetectLeds();
LogMessage($"检测到 {statuses.Count} 个LED灯:");
foreach (var status in statuses)
{
LogMessage($" {status.GetStatusDescription()}");
}
// 显示图像(如果有的话)
DisplayLedImage(statuses);
}
catch (Exception ex)
{
LogMessage($"LED识别错误: {ex.Message}");
}
}
/// <summary>
/// 6. 状态查询
/// </summary>
private void btnGetLedStatuses_Click(object sender, EventArgs e)
{
try
{
if (!_isConnected)
{
LogMessage("请先连接摄像头!");
return;
}
LogMessage("正在查询LED状态...");
var statuses = XCamera.GetLedStatuses();
LogMessage($"当前LED状态 ({statuses.Count} 个):");
foreach (var status in statuses)
{
LogMessage($" {status.GetStatusDescription()}");
}
}
catch (Exception ex)
{
LogMessage($"状态查询错误: {ex.Message}");
}
}
/// <summary>
/// 7. 区域设置窗口
/// </summary>
private void btnShowRegionEditor_Click(object sender, EventArgs e)
{
try
{
LogMessage("正在打开区域编辑器...");
XCamera.ShowRegionEditor();
LogMessage("区域编辑器已关闭");
}
catch (Exception ex)
{
LogMessage($"区域编辑器错误: {ex.Message}");
}
}
/// <summary>
/// 8. 资源释放
/// </summary>
private void btnShutdown_Click(object sender, EventArgs e)
{
try
{
LogMessage("正在释放资源...");
if (_isCapturing)
{
XCamera.StopCapture();
}
if (_isConnected)
{
XCamera.StopCamera();
}
XCamera.Shutdown();
_isInitialized = false;
_isConnected = false;
_isCapturing = false;
LogMessage("资源已释放");
}
catch (Exception ex)
{
LogMessage($"资源释放错误: {ex.Message}");
}
UpdateUI();
}
/// <summary>
/// 停止捕获
/// </summary>
private void btnStopCapture_Click(object sender, EventArgs e)
{
try
{
if (!_isCapturing)
{
LogMessage("当前未在捕获中!");
return;
}
LogMessage("正在停止捕获...");
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("正在停止摄像头...");
if (_isCapturing)
{
XCamera.StopCapture();
}
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;
}
LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] LED状态更新:");
foreach (var status in e.Statuses)
{
LogMessage($" {status.GetStatusDescription()}");
}
}
/// <summary>
/// 连接状态变更事件处理
/// </summary>
private void OnConnectionStateChanged(object sender, ConnectionStateEventArgs e)
{
if (InvokeRequired)
{
BeginInvoke(new Action<object, ConnectionStateEventArgs>(OnConnectionStateChanged), sender, e);
return;
}
_isConnected = e.IsConnected;
LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] 摄像头连接状态: {(e.IsConnected ? "" : "")}");
UpdateUI();
}
/// <summary>
/// 捕获状态变更事件处理
/// </summary>
private void OnCaptureStateChanged(object sender, CaptureStateEventArgs e)
{
if (InvokeRequired)
{
BeginInvoke(new Action<object, CaptureStateEventArgs>(OnCaptureStateChanged), sender, e);
return;
}
_isCapturing = e.IsCapturing;
LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] 图像捕获状态: {(e.IsCapturing ? "" : "")}");
UpdateUI();
}
/// <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 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();
}
/// <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 = "状态: 未初始化";
lblStatus.ForeColor = _isConnected ? Color.Green : Color.Red;
}
/// <summary>
/// 窗体关闭事件
/// </summary>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
// 确保释放资源
if (_isCapturing)
{
XCamera.StopCapture();
}
if (_isConnected)
{
XCamera.StopCamera();
}
if (_isInitialized)
{
XCamera.Shutdown();
}
}
catch
{
// 忽略关闭时的错误
}
}
}
}