265 lines
9.9 KiB
C#
265 lines
9.9 KiB
C#
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.Software))
|
||
{
|
||
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
|
||
}
|
||
}
|