From 771a0e7b6b1276087515bbe94de28358cb92963b Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期四, 04 六月 2026 10:32:27 +0800
Subject: [PATCH] 优化老化;

---
 Plugin.TsExecution/SingleControl.xaml.cs |  354 ++++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 300 insertions(+), 54 deletions(-)

diff --git a/Plugin.TsExecution/SingleControl.xaml.cs b/Plugin.TsExecution/SingleControl.xaml.cs
index c82ecb6..373fcd4 100644
--- a/Plugin.TsExecution/SingleControl.xaml.cs
+++ b/Plugin.TsExecution/SingleControl.xaml.cs
@@ -1,8 +1,14 @@
-锘縰sing HMI.Core.Util;
+锘縰sing HMI.Core.Entity;
+using HMI.Core.Manager;
+using HMI.Core.Setting;
+using HMI.Core.Util;
 using HMI.Util;
 using NationalInstruments.TestStand.Interop.API;
+using NPOI.HSSF.UserModel;
+using NPOI.SS.UserModel;
 using Plugin.TsExecution.Entity;
 using System;
+using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.ComponentModel;
 using System.IO;
@@ -23,7 +29,6 @@
 
         protected void Set([CallerMemberName] string name = null)
         {
-
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
         }
 
@@ -36,11 +41,13 @@
             }
         }
         #endregion
-        private bool isLoadOK = false;
         private int index;
         private string CountIniPath;
 
         private string status = "Ready";
+
+        private ScreenTouch[] screens;
+        private ScreenGrid screenGrid;
 
         public string Status
         {
@@ -58,15 +65,15 @@
             }
         }
 
-        private double passNum;
-        public double PassNum
+        private int passNum;
+        public int PassNum
         {
             get => passNum;
             private set { Set(ref passNum, value); }
         }
 
-        private double failNum;
-        public double FailNum
+        private int failNum;
+        public int FailNum
         {
             get => failNum;
             private set { Set(ref failNum, value); }
@@ -99,6 +106,13 @@
             set { Set(ref barcode, value); }
         }
 
+        private string model = string.Empty;
+        public string Model
+        {
+            get { return model; }
+            set { Set(ref model, value); }
+        }
+
         private string elapseTime = "00:00:00";
         public string ElapseTime
         {
@@ -108,7 +122,8 @@
                 if (value == "Start Timing")
                 {
                     this.refreshTimer.Enabled = true;
-                    TimeNow = DateTime.Now;
+                    TestStartTime = DateTime.Now;
+                    StepStartTime = DateTime.Now;
                 }
                 else
                 {
@@ -122,6 +137,16 @@
             }
         }
 
+        private string socketName = string.Empty;
+        public string SocketName
+        {
+            get { return socketName; }
+            set
+            {
+                Set(ref socketName, value);
+            }
+        }
+
         private ObservableCollection<TestStep> _datasource = new ObservableCollection<TestStep>();
         public ObservableCollection<TestStep> Datasource
         {
@@ -132,12 +157,13 @@
             }
         }
 
-        private DateTime TimeNow = new DateTime();
+        private DateTime TestStartTime = new DateTime();
+        private DateTime StepStartTime = new DateTime();
         private TimeSpan TimeCount = new TimeSpan();
 
-        private Timer refreshTimer;
+        private System.Timers.Timer refreshTimer;
 
-        private string currentStep = "绛夊緟鎵爜";
+        private string currentStep = "";
         public string CurrentStep
         {
             get => currentStep;
@@ -198,21 +224,40 @@
 
         public int ProbeWarn { get; private set; }
 
+        private bool isAutoMode;
+        public bool IsAutoMode
+        {
+            get => isAutoMode;
+            set
+            {
+                Set(ref isAutoMode, value);
+            }
+        }
+
         public SingleControl(int Index, string CountIniPath, int probeWarn)
         {
-            this.CountIniPath = CountIniPath;
             DataContext = this;
+            this.CountIniPath = CountIniPath;
             this.index = Index;
             ProbeWarn = probeWarn;
 
-            refreshTimer = new Timer()
+            refreshTimer = new System.Timers.Timer()
             {
                 Interval = 100
             };
             refreshTimer.Elapsed += RefreshTimer_Elapsed;
-            ReadProbeCount();
+            RefreshProbeCount(null);
             ReadCounter();
             InitializeComponent();
+            try
+            {
+                var value = ParameterManager.GetCommonParameterByName("AutoTestMode");
+                IsAutoMode = bool.Parse(value.Value);
+            }
+            catch
+            {
+                IsAutoMode = true;
+            }
             //if (ProbeWarn > 0)
             //{
             //    probeWarnPanel.Visibility = Visibility.Visible;
@@ -243,7 +288,7 @@
 
             //AddTestData("1", "1", "1", "1", "1", "1", "1");
 
-            TimeCount = DateTime.Now - TimeNow;
+            TimeCount = DateTime.Now - TestStartTime;
             elapseTime = string.Format("{0:00}:{1:00}:{2:00}", TimeCount.Hours, TimeCount.Minutes, TimeCount.Seconds);
             Set("ElapseTime");
             Set("TestInfo");
@@ -274,8 +319,12 @@
                     Unit = unit,
                     Result = Status
                 };
-                Dispatcher.BeginInvoke(new Action(() =>
+                table.Dispatcher.Invoke(new Action(() =>
                 {
+                    var now = DateTime.Now;
+                    var span = now - StepStartTime;
+                    StepStartTime = now;
+                    data.ConsumeTime = $"{(span.TotalMilliseconds / 1000d).ToString("F2")}s";
                     Datasource.Add(data);
                     table.ScrollIntoView(data);
                 }));
@@ -328,16 +377,20 @@
             if (result == true)
             {
                 PassNum += 1;
+                //Interlocked.Increment(ref passNum);
+                //Set("PassNum");
             }
             else if (result == false)
             {
                 FailNum += 1;
+                //Interlocked.Increment(ref failNum);
+                //Set("FailNum");
             }
 
             TotalNum = PassNum + FailNum;
             if (TotalNum != 0)
             {
-                PassRate = (PassNum / TotalNum);
+                PassRate = ((double)PassNum / TotalNum);
             }
             else
             {
@@ -345,37 +398,6 @@
             }
             Set("NumInfo");
             this.WriteCounter();
-        }
-
-        /// <summary>
-        /// 浠巌ni璇诲彇鎺㈤拡浣跨敤娆℃暟
-        /// </summary>
-        private void ReadProbeCount()
-        {
-            try
-            {
-                var num = IniFileHelper.ReadIniData("Socket" + this.index.ToString(), "ProbeCount", "0", this.CountIniPath);
-                this.ProbeCount = int.Parse(num);
-            }
-            catch (Exception ex)
-            {
-                this.ProbeCount = 0;
-            }
-        }
-
-        /// <summary>
-        /// 鏇存柊鎺㈤拡浣跨敤娆℃暟
-        /// </summary>
-        /// <param name="count"></param>
-        private void UpdateProbeCount(int count)
-        {
-            /// 鍐欏埌閰嶇疆鏂囦欢
-            IniFileHelper.WriteIniData("Socket" + this.index.ToString(), "ProbeCount", count.ToString(), this.CountIniPath);
-            ProbeCount = count;
-
-            //if (ProbeWarn <= 0) probeCountAlarm.Visibility = Visibility.Collapsed;
-            //else if (count >= ProbeWarn) probeCountAlarm.Visibility = Visibility.Visible;
-            //else probeCountAlarm.Visibility = Visibility.Collapsed;
         }
 
         private void WriteCounter()
@@ -406,9 +428,48 @@
             this.UpdateTestCounter(null);
         }
 
+        public void WriteToExcel(string path)
+        {
+            Dispatcher.Invoke(() =>
+            {
+                try
+                {
+                    string suffix = Path.GetExtension(path);
+                    if (!string.Equals(".xlsx", suffix, StringComparison.OrdinalIgnoreCase) &&
+                    !string.Equals(".xls", suffix, StringComparison.OrdinalIgnoreCase))
+                    {
+                        path = path.Replace(suffix, ".xls");
+                    }
+
+                    FileInfo fi = new FileInfo(path);
+                    if (!fi.Directory.Exists)
+                    {
+                        fi.Directory.Create();  //鏂囦欢涓嶅瓨鍦紝鍒涘缓鏂囦欢
+                    }
+                    List<string[]> rows = new List<string[]>();
+                    rows.Add(new string[] { "娴嬭瘯鏃堕棿", "娴嬭瘯浜�", "娴嬭瘯璁惧", "鏉″舰鐮�", "娴嬭瘯缁撴灉" });
+                    rows.Add(new string[] { DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), UserInfo.User.Name, ParamSetting.StationName, Barcode, Status });
+                    rows.Add(new string[] { "椤圭洰鍚嶇О", "娴嬭瘯鍙傛暟", "娴嬭瘯鍊�", "涓婇檺", "涓嬮檺", "鍗曚綅", "缁撴灉" });
+                    if (Datasource != null && Datasource.Count > 0)
+                    {
+                        foreach (var data in Datasource)
+                        {
+                            rows.Add(new string[] { data.Name, data.Step, data.Value, data.LimitUp, data.LimitDown, data.Unit, data.Result });
+                        }
+                    }
+                    ExcelHelper.ExportExcel(path, rows);
+                }
+                catch (Exception ex)
+                {
+                    TsExecution.logger.Error("Write CSV File Failed.", ex);
+                }
+            });
+        }
+
+
         public void WriteToCSV(string path)
         {
-            Dispatcher.BeginInvoke(new Action(() =>
+            Dispatcher.Invoke(() =>
             {
                 try
                 {
@@ -438,7 +499,7 @@
                 {
                     TsExecution.logger.Error("Write CSV File Failed.", ex);
                 }
-            }));
+            });
         }
 
         public void ShowPausePanel()
@@ -462,17 +523,202 @@
                     SequenceFileContext?.StationGlobals.SetValBoolean($"StationState.IsContinue_{index}", 1, true);
                     pausePanel.Visibility = Visibility.Collapsed;
                     break;
+                case "scannerSetting":
+                    //ScannerSetting setting = new ScannerSetting()
+                    //{
+                    //    Owner = Window.GetWindow(this)
+                    //};
+                    //setting.Open(true, $"Socket{index}", CountIniPath);
+                    ShowScannerPanel();
+                    break;
+                case "scannerOkBtn":
+                    SendSnr2Ts();
+                    break;
                 default:
                     break;
             }
         }
+        public void ShowScannerPanel()
+        {
+            //scannerPanel.Visibility = Visibility.Visible;
+        }
+
+        private void SendSnr2Ts()
+        {
+           
+        }
 
         private void pausePanel_Loaded(object sender, RoutedEventArgs e)
         {
-            var can = pausePanel;
-            var modal = visualModal;
-            Canvas.SetLeft(modal, (pausePanel.ActualWidth - visualModal.ActualWidth) / 2);
-            Canvas.SetTop(modal, (pausePanel.ActualHeight - visualModal.ActualHeight) / 2);
+            if (sender == pausePanel)
+            {
+                var can = pausePanel;
+                var modal = visualModal;
+                Canvas.SetLeft(modal, (pausePanel.ActualWidth - visualModal.ActualWidth) / 2);
+                Canvas.SetTop(modal, (pausePanel.ActualHeight - visualModal.ActualHeight) / 2);
+            }
+            else
+            {
+                //var can = scannerPanel;
+                //var modal = scannerVisualModal;
+                //Canvas.SetLeft(modal, (scannerPanel.ActualWidth - scannerVisualModal.ActualWidth) / 2);
+                //Canvas.SetTop(modal, (scannerPanel.ActualHeight - scannerVisualModal.ActualHeight) / 2);
+            }
+        }
+
+        public void RefreshScreen(int[][] configs)
+        {
+            //foreach (UIElement item in canvas.Children)
+            //{
+            //    if (item is ScreenTouch)
+            //    {
+            //        canvas.Children.Remove(item);
+            //    }
+            //}
+            screenContainer.Child = null;
+
+
+            screenGrid = new ScreenGrid(1, configs.Length);
+
+            screens = new ScreenTouch[configs.Length];
+
+            int space = 2 * (screens.Length + 1);
+            for (int i = 0; i < configs.Length; i++)
+            {
+                var screen = new ScreenTouch(configs[i][0], configs[i][1])
+                {
+                    Width = Math.Max((tableHeader.ActualHeight / 9 * 16 - space) / screens.Length, 0),
+                    Height = Math.Max((tableHeader.ActualHeight / 9 * 16 - space) / screens.Length / 16 * 9, 0)
+                };
+                screens[i] = screen;
+                screenGrid.AddScreen(screen, 0, i);
+            }
+            screenContainer.Child = screenGrid;
+
+            //canvas.Children.Add(screens[0]);
+            //Canvas.SetBottom(screens[0], 0);
+            //Canvas.SetRight(screens[0], 0);
+            //Panel.SetZIndex(screens[0], 999);
+        }
+
+        public void DrawScreenPoint(int index, int x, int y)
+        {
+            screens[index].DrawPoint(x, y);
+        }
+
+        /// <summary>
+        /// 缁樺浘涔嬪墠娓呯┖宸叉湁鐨�
+        /// </summary>
+        /// <param name="index"></param>
+        /// <param name="points"></param>
+        public void DrawScreenPoints(int index, int[][] points)
+        {
+            screens[index].DrawPoints(points);
+        }
+
+        /// <summary>
+        /// 缁樺浘涔嬪墠涓嶆竻绌哄凡鏈夌殑
+        /// </summary>
+        /// <param name="index"></param>
+        /// <param name="points"></param>
+        public void DrawNewScreenPoints(int index, int[][] points)
+        {
+            screens[index].DrawNewPoints(points);
+        }
+
+        public void ClearScreenPoint(int index)
+        {
+            screens[index].Clear();
+        }
+
+        public void RefreshProbeCount(ProductData product)
+        {
+            try
+            {
+                var num = IniFileHelper.ReadIniData($"Socket{this.index.ToString()}", "ProbeCount", "0", this.CountIniPath);
+                this.ProbeCount = int.Parse(num);
+            }
+            catch (Exception ex)
+            {
+                this.ProbeCount = 0;
+            }
+        }
+
+        /// <summary>
+        /// 鏇存柊鎺㈤拡浣跨敤娆℃暟
+        /// </summary>
+        /// <param name="count"></param>
+        private void UpdateProbeCount(int count)
+        {
+            /// 鍐欏埌閰嶇疆鏂囦欢
+            IniFileHelper.WriteIniData("Socket" + this.index.ToString(), "ProbeCount", count.ToString(), this.CountIniPath);
+            ProbeCount = count;
+
+            //if (ProbeWarn <= 0) probeCountAlarm.Visibility = Visibility.Collapsed;
+            //else if (count >= ProbeWarn) probeCountAlarm.Visibility = Visibility.Visible;
+            //else probeCountAlarm.Visibility = Visibility.Collapsed;
+        }
+
+        public void RefreshProduct(ProductData product)
+        {
+            if (product == null)
+            {
+                screenContainer.Child = null;
+                return;
+            }
+            try
+            {
+                string screenSize = ProductManager.GetParameterByProductAndName(product.Name, "ScreenTouch")?.Value;
+                if (string.IsNullOrEmpty(screenSize))
+                {
+                    screenContainer.Child = null;
+                    return;
+                }
+                string[] arr = screenSize.Split(';');
+                int[][] configs = new int[arr.Length][];
+
+                for (int i = 0; i < arr.Length; i++)
+                {
+                    string[] size = arr[i].Split(',');
+                    configs[i] = new int[2] { int.Parse(size[0]), int.Parse(size[1]) };
+                }
+                RefreshScreen(configs);
+            }
+            catch (Exception ex)
+            {
+                TsExecution.logger.Error("RefreshProduct Failed.", ex);
+                screenContainer.Child = null;
+            }
+        }
+
+        private void control_SizeChanged(object sender, SizeChangedEventArgs e)
+        {
+            if (screenGrid == null)
+            {
+                return;
+            }
+            //screenGrid.Height = tableHeader.ActualHeight - 2;
+            //screenGrid.Width = tableHeader.ActualHeight / 9 * 16 - 2;
+
+            int space = 2 * (screens.Length + 1);
+
+            for (int i = 0; i < screens.Length; i++)
+            {
+                var screen = screens[i];
+                screen.Width = Math.Max(Math.Floor((tableHeader.ActualHeight / 9 * 16 - space) / screens.Length), 0);
+                screen.Height = Math.Max(Math.Floor(screen.Width / 16 * 9), 0);
+            }
+        }
+
+        private void screenContainer_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
+        {
+            if (e.ClickCount == 2)
+            {
+                new ScreenTouchWin(screens)
+                {
+                    Owner = Window.GetWindow(this)
+                }.ShowDialog();
+            }
         }
     }
 }

--
Gitblit v1.9.1