10.20PLC+相机2.3视觉修改
This commit is contained in:
		
							
								
								
									
										268
									
								
								Check.Main/UI/FormControlPanel.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								Check.Main/UI/FormControlPanel.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,268 @@ | ||||
| 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 | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user