using HMI.Core.Util;
using HMI.Util;
using NationalInstruments.TestStand.Interop.API;
using System;
using System.ComponentModel;
using System.Data;
using System.Runtime.CompilerServices;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
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 int totalNum;
public int 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 elapseTime = "00:00:00";
public string ElapseTime
{
get { return elapseTime; }
set
{
if (value == "Start Timing")
{
this.refreshTimer.Enabled = true;
TimeNow = DateTime.Now;
}
else
{
this.refreshTimer.Enabled = false;
if (value != "Stop Timing")
{
Set(ref elapseTime, value + "s");
Set("TestInfo");
}
}
}
}
private DateTime TimeNow = new DateTime();
private TimeSpan TimeCount = new TimeSpan();
private Timer refreshTimer;
private DataTable dt;
private string currentStep = "等待扫码";
public string CurrentStep
{
get => currentStep;
set
{
Set(ref currentStep, value);
}
}
public SingleControl(int Index, string CountIniPath)
{
this.CountIniPath = CountIniPath;
DataContext = this;
this.index = Index;
PassNum = passNum;
FailNum = failNum;
dt = new DataTable();
dt.Columns.Add(new DataColumn("Name", typeof(string)));
dt.Columns.Add(new DataColumn("Unit", typeof(string)));
dt.Columns.Add(new DataColumn("Value", typeof(string)));
dt.Columns.Add(new DataColumn("LimitDown", typeof(string)));
dt.Columns.Add(new DataColumn("LimitUp", typeof(string)));
dt.Columns.Add(new DataColumn("Result", typeof(string)));
refreshTimer = new Timer()
{
Interval = 1000
};
refreshTimer.Elapsed += RefreshTimer_Elapsed;
InitializeComponent();
}
private void RefreshTimer_Elapsed(object sender, ElapsedEventArgs e)
{
TimeCount = DateTime.Now - TimeNow;
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 step_name, string unit, string TestValue, string LowLimit, string HightLimit, string Status)
{
try
{
var dr = dt.NewRow();
dr[0] = step_name;
dr[1] = unit;
dr[2] = TestValue;
dr[3] = LowLimit;
dr[4] = HightLimit;
dr[5] = Status;
dt.Rows.Add(dr);
table.ItemsSource = dt.DefaultView;
}
catch
{
//屏蔽错误
}
}
public void UpdateStatus(string status)
{
Status = status;
if (status == "Passed")
{
UpdateTestCounter(true);
}
else if (status == "Error" || status == "Failed")
{
UpdateTestCounter(false);
}
}
public void IniTestData()
{
dt.Clear();
table.ItemsSource = dt.DefaultView;
}
///
/// 设置测试进度条
///
///
public void SetTestProcess(int ProcessVal)
{
this.testProcess.Value = ProcessVal;
this.testProcessLabel.Content = ProcessVal.ToString() + "%";
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
ReadCounter();
this.UpdateTestCounter(null);
}
private void UpdateTestCounter(bool? result)
{
if (result == true)
{
PassNum += 1;
}
else if (result == false)
{
FailNum += 1;
}
TotalNum = PassNum + FailNum;
if (TotalNum != 0)
{
PassRate = (PassNum / TotalNum);
}
else
{
PassRate = 0.0;
}
Set("NumInfo");
this.WriteCounter();
}
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);
}
}
}