| | |
| | | using System.ComponentModel; |
| | | using System.IO; |
| | | using System.Linq; |
| | | using System.Runtime.InteropServices; |
| | | using System.Timers; |
| | | using System.Windows; |
| | | using System.Windows.Controls; |
| | |
| | | private SequenceFile modeSeq = null; |
| | | public AxApplicationMgr AxApplicationMgr; |
| | | private Execution execution = null; |
| | | |
| | | private SequenceContext sequenceContext = null; |
| | | |
| | | private Chart chart; |
| | | #endregion |
| | |
| | | { |
| | | Set(ref selectedProduct, value); |
| | | CurrentProductModel = value?.Name; |
| | | if (tsSockets != null) |
| | | { |
| | | foreach (SingleControl socket in tsSockets) |
| | | { |
| | | socket.RefreshProduct(value); |
| | | } |
| | | } |
| | | SetTestSeqFile(value); |
| | | } |
| | | } |
| | |
| | | SelectedProduct = tempProduct; |
| | | } |
| | | RefershUI(); |
| | | if (tsSockets != null) |
| | | { |
| | | foreach (SingleControl socket in tsSockets) |
| | | { |
| | | socket.RefreshProduct(SelectedProduct); |
| | | } |
| | | } |
| | | SampleStatus = false; |
| | | } |
| | | |
| | |
| | | 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 |
| | | { |
| | |
| | | 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); |
| | | |
| | |
| | | /// </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 |
| | |
| | | |
| | | 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> |
| | |
| | | { |
| | | 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) |
| | |
| | | |
| | | private void StartClick() |
| | | { |
| | | canSwitchModel = true; |
| | | ShowMask(() => |
| | | { |
| | | StartSequence(); |
| | |
| | | this.tsSockets[index].ElapseTime = strData; |
| | | break; |
| | | case (int)UIMessageCodes.UIMsg_EndExecution://执行结束 |
| | | IsTesting = false; |
| | | //IsTesting = false; |
| | | //this.ReleaseSequenceFile(); |
| | | break; |
| | | case 10030://显示测试进度 |
| | |
| | | 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) |
| | |
| | | |
| | | try |
| | | { |
| | | log.Info($"Event: {eventCode}, NumericData: {index}, StringData: {strData}"); |
| | | log.Debug($"Event: {eventCode}, NumericData: {index}, StringData: {strData}"); |
| | | } |
| | | catch |
| | | { |
| | |
| | | } |
| | | if (eventCode == 10001) |
| | | { |
| | | sequenceContext = (SequenceContext)e.uiMsg.ActiveXData; |
| | | |
| | | tsSockets[index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData; |
| | | return; |
| | | } |
| | |
| | | { |
| | | lock (this) |
| | | { |
| | | if (this.testSeq == null) |
| | | { |
| | | return true; |
| | | } |
| | | //execution.Abort(); |
| | | int count = 10; |
| | | while (count > 0) |
| | |
| | | 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) |