using CCDCount.DLL; using CCDCount.DLL.Tools; using CCDCount.MODEL.CameraClass; using CCDCount.MODEL.ConfigModel; using LogClass; using MvCameraControl; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Media.Imaging; namespace CCDCountWpf { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { #region 变量与实例 Uri ShowUri = null; public ModbusTcpClient modbusTcpClient = new ModbusTcpClient(); List Configs = null; bool IsShow = false; SystemMonitor monitor = new SystemMonitor(); #endregion #region 窗体事件 /// /// 主窗体构造函数 /// public MainWindow() { InitializeComponent(); DataContext = MessageBus.ShowBinding; //if(!modbusTcpClient.Connect("192.168.1.88")) if (!modbusTcpClient.Connect("127.0.0.1")) { FaultLog.RecordErrorMessage("Modbus通讯连接失败"); } if (File.Exists(".\\Config\\CCDCountConfig.xml")) { Configs = XmlStorage.DeserializeFromXml>(".\\Config\\CCDCountConfig.xml"); } SDKSystem.Initialize(); InitCameraIdentify(); MainPageBtn_Click(null, null); StartUpdataShowDataThread(); InitCamComboboxValue(); } /// /// 退出按钮点击事件 /// /// /// private void ExitBtn_Click(object sender, RoutedEventArgs e) { this.Close(); } /// /// 主界面按钮点击事件 /// /// /// private void MainPageBtn_Click(object sender, RoutedEventArgs e) { ShowUri = new Uri("WpfPage\\MainPage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } /// /// 开始运行按钮点击事件 /// /// /// private void RnIdentifyBtn_Click(object sender, RoutedEventArgs e) { if(RnIdentifyBtn_Text.Text == "开始运行") { RunCameraIdentify(); RnIdentifyBtn_Image.Source = new BitmapImage(new Uri("/FromImage/暂停.png", UriKind.Relative)); RnIdentifyBtn_Text.Text = "停止运行"; } else if(RnIdentifyBtn_Text.Text == "停止运行") { StopCameraIdentify(); RnIdentifyBtn_Image.Source = new BitmapImage(new Uri("/FromImage/运行.png", UriKind.Relative)); RnIdentifyBtn_Text.Text = "开始运行"; } } private void SettingBtn_Click(object sender, RoutedEventArgs e) { ShowUri = new Uri("WpfPage\\SettingPage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } private void ErrorMessageShowBtn_Click(object sender, RoutedEventArgs e) { ShowUri = new Uri("WpfPage\\MessagePage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } private void PlcSettingBtn_Click(object sender, RoutedEventArgs e) { ShowUri = new Uri("WpfPage\\PlcSettingPage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } private void UserMessageBtn_Click(object sender, RoutedEventArgs e) { if (MessageBus.NowLoginUserMessage != null) { if (!MessageBus.NowLoginUserMessage.IsAdmin) { MessageBox.Show("权限不足"); } else { ShowUri = new Uri("WpfPage\\UserManagementPage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } } else { MessageBox.Show("请先登录"); } } /// /// 窗体关闭事件 /// /// /// private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { SDKSystem.Finalize(); if (MessageBus.MainThreadS.Count != 0) { foreach (var item in MessageBus.MainThreadS) { item.DisposeCamera(); } } Environment.Exit(0); } #endregion #region 私有方法 private void InitCameraIdentify() { if (Configs.Count == 0) { MessageBox.Show("尚未添加相机,请前往配置页面配置相机"); return; } if (MessageBus.MainThreadS.Count != 0) { foreach (var item in MessageBus.MainThreadS) { item.StopMianThread(); } } MessageBus.MainThreadS = new List(); for (int i = 0; i < Configs.Count; i++) { MessageBus.MainThreadS.Add(new MainThreadClass(Configs[i].ShuLiConfigClass, Configs[i].CameraConfig)); MessageBus.MainThreadS[i].SetModbusClient(modbusTcpClient); MessageBus.MainThreadS[i].LoadCamera(); } } /// /// 启动相机识别 /// private void RunCameraIdentify() { for (int i = 0; i < MessageBus.MainThreadS.Count; i++) { if(MessageBus.MainThreadS[i].CameraConfigIsChange) { MessageBus.MainThreadS[i].ReLoadCameraConfig(); } //启动单相机实例的全部线程 if (!MessageBus.MainThreadS[i].StartMianThread()) { FaultLog.RecordErrorMessage(MessageBus.MainThreadS[i].cameraConfig.DeviceName + "_" + MessageBus.MainThreadS[i].cameraConfig.CameraSNNum + "启动失败"); //LOG.error(MessageBus.MainThreadS[i].cameraConfig.DeviceName + "_" + MessageBus.MainThreadS[i].cameraConfig.CameraSNNum + "启动失败"); MessageBox.Show(MessageBus.MainThreadS[i].cameraConfig.DeviceName + "_" + MessageBus.MainThreadS[i].cameraConfig.CameraSNNum + "启动失败"); continue; } } MessageBus.NowLoadCammeraSN = MessageBus.MainThreadS[0].cameraConfig.CameraSNNum; MessageBus.SeetingNowLoadInMaThreadsIndex = 0; MessageBus.NowLoadCameraIndex = 0; } /// /// 启动相机识别 /// private void StopCameraIdentify() { for (int i = 0; i < MessageBus.MainThreadS.Count; i++) { //启动单相机实例的全部线程 if (!MessageBus.MainThreadS[i].StopMianThread()) { FaultLog.RecordErrorMessage(MessageBus.MainThreadS[i].cameraConfig.DeviceName + "_" + MessageBus.MainThreadS[i].cameraConfig.CameraSNNum + "关闭失败"); MessageBox.Show(MessageBus.MainThreadS[i].cameraConfig.DeviceName + "_" + MessageBus.MainThreadS[i].cameraConfig.CameraSNNum + "关闭失败"); continue; } } } /// /// 启动更新显示数据线程 /// private void StartUpdataShowDataThread() { IsShow = true; Bitmap image1 = null; Bitmap image2 = null; Bitmap image3 = null; Bitmap image4 = null; const int targetMsPerFrame = 100; // 20FPS=50ms Stopwatch renderSW = new Stopwatch(); Task.Run(async () => { while (IsShow) { renderSW.Restart(); await Task.Run(() => { UpdataShuLiShowData(); UpdateMonitorMessage(); UpdateFaultLogMessage(); }); if (MessageBus.MainThreadS.Count == 0) { LOG.log(string.Format("{0}:当前未加载识别流程", "IdentifyCameraForm-StartShowImageThread")); Thread.Sleep(100); continue; } if(MessageBus.MainThreadS.Count>=1) { if (MessageBus.MainThreadS[0].HistoryActiveNum > 0) { MessageBus.MainThreadS[0].GetShowImage(2000, out image1); } else { MessageBus.MainThreadS[0].GetNullShowImage(4096, 2000, out image1); } if (image1 == null) { LOG.log(string.Format("{0}:相机一获取图片为空", "IdentifyCameraForm-StartShowImageThread")); continue; } } if (MessageBus.MainThreadS.Count >= 2) { if (MessageBus.MainThreadS[1].HistoryActiveNum > 0) { MessageBus.MainThreadS[1].GetShowImage(2000, out image2); } else { MessageBus.MainThreadS[1].GetNullShowImage(4096, 2000, out image2); } if (image2 == null) { LOG.log(string.Format("{0}:相机二获取图片为空", "IdentifyCameraForm-StartShowImageThread")); continue; } } if (MessageBus.MainThreadS.Count >= 3) { if (MessageBus.MainThreadS[2].HistoryActiveNum > 0) { MessageBus.MainThreadS[2].GetShowImage(2000, out image3); } else { MessageBus.MainThreadS[2].GetNullShowImage(4096, 2000, out image3); } if (image3 == null) { LOG.log(string.Format("{0}:相机三获取图片为空", "IdentifyCameraForm-StartShowImageThread")); continue; } } await Application.Current.Dispatcher.InvokeAsync(() => { BitmapImage thumbnailImage1 = null; BitmapImage thumbnailImage2 = null; BitmapImage thumbnailImage3 = null; BitmapImage thumbnailImage4 = null; if (image1 != null) { thumbnailImage1 = ConvertToBitmapImage(image1); MessageBus.ShowBinding.ThumbnailImage1 = thumbnailImage1; } if (image2 != null) { thumbnailImage2 = ConvertToBitmapImage(image2); MessageBus.ShowBinding.ThumbnailImage2 = thumbnailImage2; } if (image3 != null) { thumbnailImage3 = ConvertToBitmapImage(image3); MessageBus.ShowBinding.ThumbnailImage3 = thumbnailImage3; } if (image4 != null) { thumbnailImage4 = ConvertToBitmapImage(image4); MessageBus.ShowBinding.ThumbnailImage4 = thumbnailImage4; } if (MessageBus.NowLoadCameraIndex == 0) { MessageBus.ShowBinding.BitmapImage = thumbnailImage1; } else if (MessageBus.NowLoadCameraIndex == 2) { MessageBus.ShowBinding.BitmapImage = thumbnailImage2; } else if (MessageBus.NowLoadCameraIndex == 3) { MessageBus.ShowBinding.BitmapImage = thumbnailImage3; } else if (MessageBus.NowLoadCameraIndex == 4) { MessageBus.ShowBinding.BitmapImage = thumbnailImage4; } }); //进行精准20帧控制 int elapsed = (int)renderSW.ElapsedMilliseconds; //Console.WriteLine(elapsed); if (elapsed < targetMsPerFrame) { Thread.Sleep(targetMsPerFrame - elapsed); } //Thread.Sleep(50); } }); } /// /// 停止更新显示数据线程 /// private void StopUpdataShowDataThread() { IsShow = false; } /// /// 更新数粒显示数据 /// private void UpdataShuLiShowData() { if (MessageBus.MainThreadS.Count == 0) return; if(MessageBus.NowLoadCameraIndex == -1) return; if (MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].ShuLiState) { Application.Current.Dispatcher.Invoke(() => { MessageBus.ShowBinding.CameraStaticColor = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].CameraRunStatic == true ? System.Windows.Media.Brushes.Green : System.Windows.Media.Brushes.Red; MessageBus.ShowBinding.CamRunStatic = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].CameraRunStatic == true ? "运行中" : "未运行"; }); } else { Application.Current.Dispatcher.Invoke(() => { MessageBus.ShowBinding.CameraStaticColor = System.Windows.Media.Brushes.Yellow; MessageBus.ShowBinding.CamRunStatic = "视野遮挡"; }); } MessageBus.ShowBinding.AllActiveNum = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].HistoryActiveNum.ToString(); MessageBus.ShowBinding.AllOkNum = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].OkHistoryNum.ToString(); MessageBus.ShowBinding.AllNgNum = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].NgHistoryNum.ToString(); MessageBus.ShowBinding.ShuLiSpeed = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].GetOneSecondActiveNum().ToString(); } /// /// 更新监控信息 /// private void UpdateMonitorMessage() { MessageBus.ShowBinding.RamMonitor = monitor.GetAvailableMemory() > 1024 ? $"可用内存: {monitor.GetAvailableMemory() / 1024:0.00}GB" : $"可用内存: {monitor.GetAvailableMemory()}MB"; MessageBus.ShowBinding.CPUMonitor = $"CPU: {monitor.GetCpuUsage():0.00}%"; } /// /// 更新故障日志信息 /// private void UpdateFaultLogMessage() { MessageBus.ShowBinding.ErrMessageShowList = FaultLog.GetAllErrMessage(); } // Bitmap 转 BitmapImage 的辅助方法 private BitmapImage ConvertToBitmapImage(Bitmap bitmap) { using (MemoryStream memory = new MemoryStream()) { bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png); memory.Position = 0; var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.StreamSource = memory; bitmapImage.EndInit(); return bitmapImage; } } private void InitCamComboboxValue() { List CameraInfoList = new List(); MessageBus.CameraClass.GetCameraList(out CameraInfoList); if (CameraInfoList.Count > 0) { MessageBus.ShowBinding.CameraItems.Clear(); MessageBus.ShowBinding.CameraItems.Add(new CameraCoboxItem() { Name = "请选择相机", SNValue = "" }); foreach (var item in CameraInfoList) { MessageBus.ShowBinding.CameraItems.Add(new CameraCoboxItem() { Name = item.DeviceName + "_" + item.DeviceSN, SNValue = item.DeviceSN }); } } } #endregion } }