From ef52fd6fd07508883dce4eb002acda59f0169e59 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期四, 23 四月 2026 10:19:33 +0800
Subject: [PATCH] 优化;

---
 Plugin.TsExecution/TsExecution.xaml.cs |  196 ++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 144 insertions(+), 52 deletions(-)

diff --git a/Plugin.TsExecution/TsExecution.xaml.cs b/Plugin.TsExecution/TsExecution.xaml.cs
index 289d5be..4578fdb 100644
--- a/Plugin.TsExecution/TsExecution.xaml.cs
+++ b/Plugin.TsExecution/TsExecution.xaml.cs
@@ -20,6 +20,7 @@
 using System.ComponentModel;
 using System.IO;
 using System.Linq;
+using System.Runtime.InteropServices;
 using System.Timers;
 using System.Windows;
 using System.Windows.Controls;
@@ -50,6 +51,8 @@
         private SequenceFile modeSeq = null;
         public AxApplicationMgr AxApplicationMgr;
         private Execution execution = null;
+
+        private SequenceContext sequenceContext = null;
 
         private Chart chart;
         #endregion
@@ -101,6 +104,13 @@
             {
                 Set(ref selectedProduct, value);
                 CurrentProductModel = value?.Name;
+                if (tsSockets != null)
+                {
+                    foreach (SingleControl socket in tsSockets)
+                    {
+                        socket.RefreshProduct(value);
+                    }
+                }
                 SetTestSeqFile(value);
             }
         }
@@ -446,6 +456,13 @@
                 SelectedProduct = tempProduct;
             }
             RefershUI();
+            if (tsSockets != null)
+            {
+                foreach (SingleControl socket in tsSockets)
+                {
+                    socket.RefreshProduct(SelectedProduct);
+                }
+            }
             SampleStatus = false;
         }
 
@@ -471,24 +488,31 @@
         private void InitTsEngine()
         {
             AxApplicationMgr = TestAppManager.GetAxApplicationMgr();
+
+
+            //AxApplicationMgr. += AxApplicationMgr_EndExecution;
             AxApplicationMgr.EndExecution += AxApplicationMgr_EndExecution;
-            AxApplicationMgr.ExitApplication += new EventHandler(this.AxApplicationMgr_ExitApplication);
-            AxApplicationMgr.UIMessageEvent +=
-                new _ApplicationMgrEvents_UIMessageEventEventHandler(this.AxApplicationMgr_UIMessageEvent);
-            AxApplicationMgr.ExecutionClosed +=
-                new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.AxApplicationMgr_ExecutionClosed);
+
+            AxApplicationMgr.ExitApplication += this.AxApplicationMgr_ExitApplication;
+            AxApplicationMgr.UIMessageEvent += this.AxApplicationMgr_UIMessageEvent;
+            AxApplicationMgr.ExecutionClosed += this.AxApplicationMgr_ExecutionClosed;
 
             ((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).BeginInit();
             host.Child = AxApplicationMgr;
             ((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).EndInit();
         }
 
+        private volatile bool canSwitchModel = false;
+        private volatile Action switchAction = null;
+
         private void AxApplicationMgr_EndExecution(object sender, _ApplicationMgrEvents_EndExecutionEvent e)
         {
             log.Info("AxApplicationMgr_EndExecution");
             if (ReleaseSequenceFile())
             {
+                IsTesting = false;
                 log.Info("Release SeqFile Success!");
+                if (canSwitchModel) switchAction?.Invoke();
             }
             else
             {
@@ -594,10 +618,21 @@
         private void RefershUI()
         {
             panel.Children.Clear();
+            string[] names = ParamSetting.SocketNames.Split(',');
+
             //閲嶆柊鐢熸垚瀛愰潰鏉�
             for (int i = 0; i < this.socketNum; i++)
             {
-                SingleControl control = new SingleControl(i, CountIniPath, this.probeWarn);
+                string name = string.Empty;
+                if (i < names.Length)
+                {
+                    name = names[i];
+                }
+
+                SingleControl control = new SingleControl(i, CountIniPath, this.probeWarn)
+                {
+                    SocketName = name
+                };
                 panel.Children.Add(control);
                 tsSockets.Add(control);
 
@@ -1026,8 +1061,16 @@
         /// </summary>
         private void StartSequence()
         {
+            log.Info($"Start ATE Seq isLoadOK:{isLoadOK}");
             if (!isLoadOK) return;
-
+            try
+            {
+                engine?.Globals.SetValBoolean("StationState.StopTest", 1, false);
+            }
+            catch (Exception ex)
+            {
+                log.Error("Reset StopTest Failed.", ex);
+            }
             if (ParamSetting.EnableAutoModel)
             {
                 try
@@ -1085,35 +1128,12 @@
 
         public void StopSequenceClick()
         {
+            canSwitchModel = false;
+            switchAction = null;
             ShowMask(() =>
             {
                 bool stoped = StopSequence();
-                if (stoped)
-                {
-                    IsTesting = false;
-                }
             }, null, null, LangUtil.Get("App.SequenceIsStopping"));
-            //new MaskWindow((WindowX)Window.GetWindow(this),
-            //        (win) =>
-            //        {
-            //            try
-            //            {
-            //                bool stoped = StopSequence();
-            //                if (stoped)
-            //                {
-            //                    IsTesting = false;
-            //                }
-            //            }
-            //            finally
-            //            {
-            //                Dispatcher.Invoke(() =>
-            //                {
-
-            //                    win.Close();
-            //                });
-            //            }
-            //        }
-            //        ).Info(LangUtil.Get("App.SequenceIsStopping"));
         }
 
         /// <summary>
@@ -1123,23 +1143,21 @@
         {
             try
             {
-                if (this.tsSockets.Count > 0)
-                {
-                    for (int i = 0; i < tsSockets.Count; i++)
-                    {
-                        var context = this.tsSockets[i].SequenceFileContext;
-                        //bool val = context.StationGlobals.Exists("StationState.StopTest", 0);
-                        //if (val)
-                        //{
-                        //    context.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
-                        //    bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
-                        //}
-                        context?.StationGlobals.SetValBoolean("StationState.StopTest", 1, true);
-                    }
-                }
+                //if (this.tsSockets.Count > 0)
+                //{
+                //    for (int i = 0; i < tsSockets.Count; i++)
+                //    {
+                //        var context = this.tsSockets[i].SequenceFileContext;
+                //        context?.StationGlobals.SetValBoolean("StationState.StopTest", 1, true);
+                //    }
+                //}
+                engine.Globals.SetValBoolean("StationState.StopTest", 1, true);
                 if (this.execution == null) return true;
 
-                bool res = this.execution.WaitForEndEx(2000, true, null, null);
+                //bool res = this.execution.WaitForEndEx(-1, true, null, null);
+                bool res = this.execution?.WaitForEndEx(-1, true, Type.Missing, null) == true;
+                Marshal.ReleaseComObject(this.execution);
+                this.execution = null;
                 return res;
             }
             catch (Exception ex)
@@ -1174,6 +1192,7 @@
 
         private void StartClick()
         {
+            canSwitchModel = true;
             ShowMask(() =>
             {
                 StartSequence();
@@ -1358,7 +1377,7 @@
                     this.tsSockets[index].ElapseTime = strData;
                     break;
                 case (int)UIMessageCodes.UIMsg_EndExecution://鎵ц缁撴潫
-                    IsTesting = false;
+                    //IsTesting = false;
                     //this.ReleaseSequenceFile();
                     break;
                 case 10030://鏄剧ず娴嬭瘯杩涘害
@@ -1405,11 +1424,75 @@
                 case 10034:
                     CurrentProductModel = strData;
                     break;
+                case 10035:
+                    string[] arr_10035 = strData.Split(';');
+
+                    int[][] points = new int[arr_10035.Length - 1][];
+
+                    for (int i = 1; i < arr_10035.Length; i++)
+                    {
+                        string[] strs = arr_10035[i].Split(',');
+                        points[i - 1] = new int[2] { int.Parse(strs[0]), int.Parse(strs[1]) };
+                    }
+                    this.tsSockets[index].DrawScreenPoints(int.Parse(arr_10035[0]), points);
+                    break;
+                case 10036:
+                    this.tsSockets[index].ClearScreenPoint(int.Parse(strData));
+                    break;
                 case 10099:
+                    string[] arr = strData.Split(',');
+                    if (canSwitchModel) SwitchSequenceByModel(index, arr[0], arr[1]);
                     break;
                 default:
                     break;
             }
+        }
+
+        private void SwitchSequenceByModel(int index, string model, string snr)
+        {
+            Dispatcher.Invoke(() =>
+            {
+                var target = Products.FirstOrDefault(e => e.Name == model);
+
+                ShowMask(() =>
+                {
+                    bool stoped = StopSequence();
+                    //if (stoped)
+                    //{
+                    //    IsTesting = false;
+                    //}
+                }, null, null, "鎹㈠瀷涓紝璇风◢鍚�...");
+
+                if (target == null)
+                {
+                    MsgBoxHelper2.Warn($"璇峰厛鍦ㄤ骇鍝佺鐞嗛〉闈㈤厤缃瀷鍙� [{model}] 鐨勪骇鍝佷俊鎭紒");
+                    return;
+                }
+
+                switchAction = () =>
+                {
+                    switchAction = null;
+                    log?.Info($"灏濊瘯鑷姩鎹㈠瀷: {switchAction}");
+                    if (canSwitchModel)
+                    {
+                        Dispatcher.Invoke(() =>
+                        {
+                            try
+                            {
+                                log?.Info("寮�濮嬭嚜鍔ㄦ崲鍨�");
+                                SelectedProduct = target;
+                                engine?.Globals.SetValString($"CacheSNR[{index}]", 1, snr);
+                                engine?.CommitGlobalsToDisk(false);
+                                StartClick();
+                            }
+                            catch (Exception ex)
+                            {
+                                log?.Error("鑷姩鎹㈠瀷澶辫触", ex);
+                            }
+                        });
+                    }
+                };
+            });
         }
 
         private void ShowAlarm(AlarmText alarm)
@@ -1433,7 +1516,7 @@
 
                 try
                 {
-                    log.Info($"Event: {eventCode}, NumericData: {index}, StringData: {strData}");
+                    log.Debug($"Event: {eventCode}, NumericData: {index}, StringData: {strData}");
                 }
                 catch
                 {
@@ -1441,6 +1524,8 @@
                 }
                 if (eventCode == 10001)
                 {
+                    sequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
+
                     tsSockets[index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
                     return;
                 }
@@ -1522,6 +1607,10 @@
             {
                 lock (this)
                 {
+                    if (this.testSeq == null)
+                    {
+                        return true;
+                    }
                     //execution.Abort();
                     int count = 10;
                     while (count > 0)
@@ -1531,15 +1620,18 @@
                             if (this.testSeq == null)
                                 return true;
 
-                            if (this.engine.ReleaseSequenceFileEx(this.testSeq, 4))
+                            if (this.engine?.ReleaseSequenceFileEx(this.testSeq, 4) == true)
                             {
+                                Marshal.ReleaseComObject(this.testSeq);
                                 this.testSeq = null;
+                                // GC.Collect();
                             }
-                            if (this.engine.ReleaseSequenceFileEx(this.modeSeq, 4))
+                            if (this.engine?.ReleaseSequenceFileEx(this.modeSeq, 4) == true)
                             {
+                                Marshal.ReleaseComObject(this.modeSeq);
                                 this.modeSeq = null;
                             }
-                            this.engine.UnloadAllModules();
+                            this.engine?.UnloadAllModules();
                             return this.testSeq == null && this.modeSeq == null;
                         }
                         catch (Exception ex)

--
Gitblit v1.9.1