Files
CheckDevice/Check.Main/UI/FormControlPanel.cs
2025-10-20 14:47:17 +08:00

269 lines
10 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 Check.Main.Camera;
using Check.Main.Common;
using Check.Main.Infer;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace Check.Main.UI
{
public partial class FormControlPanel : DockContent
{
private bool _isDeviceReady = false; // 新的状态:设备是否已准备好
private bool _isDetecting = false; // 新的状态:是否正在检测中
// 用于跟踪设备运行状态的私有标志
private bool _isDeviceRunning = false;
public FormControlPanel()
{
InitializeComponent();
ConfigurationManager.OnConfigurationChanged += HandleConfigurationChanged;
UpdateUI();
}
/// <summary>
/// 处理全局配置在其他地方(如 FrmConfig被更改的事件
/// </summary>
private void HandleConfigurationChanged()
{
// 这是一个安全措施。如果设备正在运行时配置发生了变化,
// 最安全的做法是停止设备,以防止出现不可预知的行为。
if (_isDeviceRunning)
{
// 使用 Invoke 确保UI更新在正确的线程上执行
this.Invoke((Action)(() =>
{
ThreadSafeLogger.Log("相机配置已在运行时发生更改,设备将自动停止。请重新启动设备以应用新配置。");
//MessageBox.Show("相机配置已在运行时发生更改,设备将自动停止。请重新启动设备以应用新配置。",
// "配置变更", MessageBoxButtons.OK, MessageBoxIcon.Information);
// 触发与点击“关闭设备”按钮相同的逻辑
btnStartDevice_Click(this, EventArgs.Empty);
}));
}
}
//点击“ 启动设备” 按钮
private void btnStartDevice_Click(object sender, EventArgs e)
{
if (_isDeviceReady)//_isDeviceRunning
{
// --- 关闭流程 ---
ThreadSafeLogger.Log("用户点击“关闭设备”,开始完整关闭流程...");
// 如果正在检测,先停止它
if (_isDetecting)
{
btnStartCheck_Click(this, EventArgs.Empty); // 调用停止检测的逻辑
}
var mainForm = this.DockPanel.FindForm() as FrmMain;
CameraManager.Shutdown();
_isDeviceReady = false;
//// 1. 停止硬触发模拟器
//CameraManager.StopHardwareTriggerSimulator();
//// 2. 如果检测正在运行,则停止
//if (DetectionCoordinator.IsDetectionRunning)
//{
// DetectionCoordinator.StopDetection();
// UpdateDetectionButtonUI();
//}
// 3. 执行完整的系统关闭(包括相机硬件和检测协调器)
//CameraManager.Shutdown();
//YoloModelManager.Shutdown();
//_isDeviceRunning = false;
}
else
{
// --- 启动流程 ---
ThreadSafeLogger.Log("用户点击“启动设备”,开始新的启动流程...");
// 1. 从单一数据源获取完整的配置对象
var config = ConfigurationManager.GetCurrentConfig();
// 2. 验证相机配置的有效性
if (config.CameraSettings == null || !config.CameraSettings.Any(c => c.IsEnabled))
{
ThreadSafeLogger.Log("没有已启用的相机配置,启动中止。");
return;
}
// 3. 获取主窗体引用
var mainForm = this.DockPanel.FindForm() as FrmMain;
if (mainForm == null)
{
ThreadSafeLogger.Log("无法找到主窗体,启动中止。");
return;
}
// 4. 执行新的启动流程:
// 第一步初始化系统。这会准备好相机硬件、UI窗口和所有后台处理线程。
CameraManager.PrepareAll(config, mainForm);
_isDeviceReady = true;
//YoloModelManager.Initialize(config.ModelSettings);
//CameraManager.Initialize(config, mainForm);
//// 第二步:命令所有相机开始采集图像。
//CameraManager.StartAll();
//// 5. 如果有任何相机配置为软触发模式,我们启动模拟器来模拟触发信号
//if (config.CameraSettings.Any(c => c.IsEnabled && c.TriggerMode == TriggerModeType.Software))
//{
// ThreadSafeLogger.Log("检测到软触发相机,启动触发模拟器。");
// CameraManager.TriggerInterval = 100; // 根据需要设置间隔
// CameraManager.StartHardwareTriggerSimulator();
//}
//_isDeviceRunning = true;
}
UpdateUI();//UpdateDeviceButtonUI();
}
//点击 “开始检测” 按钮
private void btnStartCheck_Click(object sender, EventArgs e)
{
if (_isDetecting)
{
// --- 停止检测 ---
ThreadSafeLogger.Log("用户点击“停止检测”,暂停数据流...");
// 停止硬触发模拟器
//CameraManager.StopHardwareTriggerSimulator();
// 停止相机采集
CameraManager.StopAll();
// 停止统计
DetectionCoordinator.StopDetection();
_isDetecting = false;
}
else
{
// --- 开始检测 ---
ThreadSafeLogger.Log("用户点击“开始检测”,启动数据流...");
// 命令相机开始采集
CameraManager.StartAll();
// 启动硬触发模拟器(如果需要)
var config = ConfigurationManager.GetCurrentConfig();
if (config.CameraSettings.Any(c => c.IsEnabled && c.TriggerMode == TriggerModeType.Hardware))
{
ThreadSafeLogger.Log("相机设置为硬件触发模式,将由 PLC 输出脉冲信号控制拍照。");
//CameraManager.TriggerInterval = 100;
// CameraManager.StartHardwareTriggerSimulator();
}
// 开始统计
DetectionCoordinator.StartDetection();
_isDetecting = true;
}
UpdateUI();
//if (!_isDeviceRunning && !DetectionCoordinator.IsDetectionRunning)
//{
// ThreadSafeLogger.Log("设备未启动,无法开始检测。");
// return;
//}
//// 现在调用 DetectionCoordinator 中的方法
//if (DetectionCoordinator.IsDetectionRunning)
//{
// DetectionCoordinator.StopDetection();
//}
//else
//{
// DetectionCoordinator.StartDetection();
//}
//UpdateDetectionButtonUI();
}
#region UI
/// <summary>
/// 根据设备运行状态更新“设备”按钮的UI文本和颜色
/// </summary>
private void UpdateDeviceButtonUI()
{
if (_isDeviceRunning)
{
btnStartDevice.Text = "关闭设备";
btnStartDevice.BackColor = Color.Salmon;
}
else
{
btnStartDevice.Text = "启动设备";
btnStartDevice.BackColor = SystemColors.Control;
}
}
// 统一的UI更新方法
private void UpdateUI()
{
// --- 更新“设备”按钮 ---
if (_isDeviceReady)
{
btnStartDevice.Text = "关闭设备";
btnStartDevice.BackColor = Color.Salmon;
btnStartCheck.Enabled = true; // 设备就绪后,检测按钮才可用
}
else
{
btnStartDevice.Text = "启动设备";
btnStartDevice.BackColor = SystemColors.Control;
btnStartCheck.Enabled = false; // 设备未就绪,检测按钮不可用
}
// --- 更新“检测”按钮 ---
if (_isDetecting)
{
btnStartCheck.Text = "停止检测";
btnStartCheck.BackColor = Color.LightGreen;
btnStartDevice.Enabled = false; // 正在检测时,不允许关闭设备
}
else
{
btnStartCheck.Text = "开始检测";
btnStartCheck.BackColor = SystemColors.Control;
if (_isDeviceReady) btnStartDevice.Enabled = true; // 停止检测后,允许关闭设备
}
}
/// <summary>
/// 根据检测运行状态更新“检测”按钮的UI文本和颜色
/// </summary>
private void UpdateDetectionButtonUI()
{
//if (CameraManager.IsDetectionRunning)
//{
// btnStartCheck.Text = "停止检测";
// btnStartCheck.BackColor = Color.LightGreen;
//}
//else
//{
// btnStartCheck.Text = "启动检测";
// btnStartCheck.BackColor = SystemColors.Control;
//}
if (DetectionCoordinator.IsDetectionRunning)
{
btnStartCheck.Text = "停止检测";
btnStartCheck.BackColor = Color.LightGreen;
}
else
{
btnStartCheck.Text = "启动检测";
btnStartCheck.BackColor = SystemColors.Control;
}
}
#endregion
}
}