using HMI.Core.Manager; using HMI.Core.Util; using HMI.Util; using NationalInstruments.TestStand.Interop.API; using Plugin.TsExecution.Entity; using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.IO; using System.Runtime.CompilerServices; using System.Timers; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace Plugin.TsExecution { /// /// SingleControl.xaml 的交互逻辑 /// public partial class SingleControl : UserControl, INotifyPropertyChanged { #region ... public event PropertyChangedEventHandler PropertyChanged; protected void Set([CallerMemberName] string name = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } protected void Set(ref T old, T @new, [CallerMemberName] string propertyName = null) { old = @new; if (propertyName != null) { Set(propertyName); } } #endregion private bool isLoadOK = false; private int index; private string CountIniPath; private string status = "Ready"; public string Status { get { return status; } set { Set(ref status, value); } } private double totalNum; public double TotalNum { get => totalNum; private set { Set(ref totalNum, value); } } private int passNum; public int PassNum { get => passNum; private set { Set(ref passNum, value); } } private int failNum; public int FailNum { get => failNum; private set { Set(ref failNum, value); } } private double passRate; public double PassRate { get => passRate; private set { Set(ref passRate, value); } } public string NumInfo { get => this.lang("Ts.NumInfo", TotalNum, PassNum, FailNum, string.Format("{0:0.00}", PassRate)); } public string TestInfo { get => this.lang("Ts.TestInfo", Barcode, ElapseTime); } private string barcode = string.Empty; public string Barcode { get { return barcode; } 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 { get { return elapseTime; } set { if (value == "Start Timing") { this.refreshTimer.Enabled = true; TestStartTime = DateTime.Now; StepStartTime = DateTime.Now; } else { this.refreshTimer.Enabled = false; if (value != "Stop Timing") { Set(ref elapseTime, value + "s"); Set("TestInfo"); } } } } private ObservableCollection _datasource = new ObservableCollection(); public ObservableCollection Datasource { get => _datasource; set { Set(ref _datasource, value); } } private DateTime TestStartTime = new DateTime(); private DateTime StepStartTime = new DateTime(); private TimeSpan TimeCount = new TimeSpan(); private System.Timers.Timer refreshTimer; private string currentStep = "等待扫码"; public string CurrentStep { get => currentStep; set { Set(ref currentStep, value); } } private int _probeCount; public int ProbeCount { get => _probeCount; set { Set(ref _probeCount, value); } } /// /// 进度值 /// private int _processValue; public int ProcessValue { get => _processValue; set { Set(ref _processValue, value); } } public string ProcessValueLabel { get { if (ProcessValue > 0) return $"{ProcessValue}%"; return ""; } set { } } public void SetSimpleUI(bool flag) { if (flag) { simplePanel.Visibility = Visibility.Visible; detailPanel.Visibility = Visibility.Collapsed; } else { simplePanel.Visibility = Visibility.Collapsed; detailPanel.Visibility = Visibility.Visible; } } 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) { DataContext = this; this.CountIniPath = CountIniPath; this.index = Index; ProbeWarn = probeWarn; refreshTimer = new System.Timers.Timer() { Interval = 100 }; refreshTimer.Elapsed += RefreshTimer_Elapsed; ReadProbeCount(); ReadCounter(); InitializeComponent(); try { var value = ParameterManager.GetCommonParameterByName("AutoTestMode"); IsAutoMode = bool.Parse(value.Value); } catch { IsAutoMode = true; } //if (ProbeWarn > 0) //{ // probeWarnPanel.Visibility = Visibility.Visible; //} //else //{ // probeWarnPanel.Visibility = Visibility.Collapsed; //} } private void RefreshTimer_Elapsed(object sender, ElapsedEventArgs e) { //Dispatcher.Invoke(() => //{ // var data = PluginLoader.Instance.Plugins.FirstOrDefault(p => p.Name == "TS"); // if (data?.Content is TsExecution ts) // { // if (Status == "Testing") // { // ts.UpdatePositionStatus(index, "Passed"); // } // else // { // ts.UpdatePositionStatus(index, "Testing"); // } // } //}); //AddTestData("1", "1", "1", "1", "1", "1", "1"); TimeCount = DateTime.Now - TestStartTime; elapseTime = string.Format("{0:00}:{1:00}:{2:00}", TimeCount.Hours, TimeCount.Minutes, TimeCount.Seconds); Set("ElapseTime"); Set("TestInfo"); } public SequenceContext SequenceFileContext { get; set; } /// /// 获取TS的每步测试的数据添加到表格 /// 项目名称,测试参数,测试值,上限,下限,单位,结果 /// /// public void AddTestData(string name, string step_name, string value, string HightLimit, string LowLimit, string unit, string Status) { try { var data = new TestStep { Name = name, Step = step_name, Value = value, LimitUp = HightLimit, LimitDown = LowLimit, Unit = unit, Result = Status }; 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); })); } catch (Exception ex) { //屏蔽错误 } } public void UpdateStatus(string status) { if (status == "Passed") { UpdateTestCounter(true); } else if (status == "Error" || status == "Failed") { UpdateTestCounter(false); } else if (Status != "Testing" && status == "Testing") { UpdateProbeCount(ProbeCount + 1); } Status = status; } public void IniTestData() { Datasource.Clear(); } /// /// 设置测试进度条 /// /// public void SetTestProcess(int ProcessVal) { ProcessValue = ProcessVal; Set("ProcessValueLabel"); } private void UserControl_Loaded(object sender, RoutedEventArgs e) { this.UpdateTestCounter(null); } private void UpdateTestCounter(bool? result) { 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 = ((double)PassNum / TotalNum); } else { PassRate = 0.0; } Set("NumInfo"); this.WriteCounter(); } /// /// 从ini读取探针使用次数 /// 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; } } /// /// 更新探针使用次数 /// /// 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() { IniFileHelper.WriteIniData("Socket" + this.index.ToString(), "Pass", this.passNum.ToString(), this.CountIniPath); IniFileHelper.WriteIniData("Socket" + this.index.ToString(), "Fail", this.failNum.ToString(), this.CountIniPath); } private void ReadCounter() { try { this.PassNum = Convert.ToInt32(IniFileHelper.ReadIniData("Socket" + this.index.ToString(), "Pass", "", CountIniPath)); this.FailNum = Convert.ToInt32(IniFileHelper.ReadIniData("Socket" + this.index.ToString(), "Fail", "", CountIniPath)); } catch (Exception ex) { //do nothing } } public void ResetCounter() { this.PassNum = 0; this.FailNum = 0; this.UpdateTestCounter(null); } public void WriteToCSV(string path) { Dispatcher.BeginInvoke(new Action(() => { try { FileInfo fi = new FileInfo(path); if (!fi.Directory.Exists) { fi.Directory.Create(); //文件不存在,创建文件 } using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write)) using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8)) { string title = "项目名称,测试参数,测试值,上限,下限,单位,结果"; sw.WriteLine(title); if (Datasource != null && Datasource.Count > 0) { foreach (var data in Datasource) { sw.WriteLine($"{data.Name},{data.Step},{data.Value},{data.LimitUp},{data.LimitDown},{data.Unit},{data.Result}"); } } } } catch (Exception ex) { TsExecution.logger.Error("Write CSV File Failed.", ex); } })); } public void ShowPausePanel() { pausePanel.Visibility = Visibility.Visible; } private void Button_Click(object sender, RoutedEventArgs e) { Button btn = sender as Button; switch (btn.Name) { case "clear": UpdateProbeCount(0); break; case "cancelPauseBtn": SequenceFileContext?.StationGlobals.SetValBoolean($"StationState.IsContinue_{index}", 1, false); pausePanel.Visibility = Visibility.Collapsed; break; case "continuePauseBtn": 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() { //try //{ // string snr = TbManualSnr.Text; // SequenceFileContext?.StationGlobals.SetValString($"StationState.SN[{index}]", 1, snr); // scannerPanel.Visibility = Visibility.Collapsed; // TbManualSnr.Text = string.Empty; //} //catch (Exception ex) //{ // ToastHelper.Error(ex.Message); //} } private void pausePanel_Loaded(object sender, RoutedEventArgs e) { 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); } } } }