using HMI.Util;
using Plugin.TestResult_WPF.Constant;
using Plugin.TestResult_WPF.Model;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace Plugin.TestResult_WPF
{
///
/// SingleCell.xaml 的交互逻辑
///
public partial class SingleCell : UserControl, INotifyPropertyChanged
{
#region ...
public event PropertyChangedEventHandler PropertyChanged;
public virtual void RaisePropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
public void RaiseAndSetIfchanged(ref T old, T @new, [CallerMemberName] string propertyName = null)
{
old = @new;
if (propertyName != null) RaisePropertyChanged(propertyName);
}
#endregion
private InfoWindow window;
private int maxSize;
public SingleCell()
{
DataContext = this;
InitializeComponent();
}
public SingleCell(string parentName, int index, int maxSize, string iniFile)
{
this.parentName = parentName;
this.index = index;
this.maxSize = maxSize;
this.countIniPath = iniFile;
DataContext = this;
InitializeComponent();
LoadProbeCount();
}
private string _parentName;
public string parentName
{
get { return _parentName; }
set
{
RaiseAndSetIfchanged(ref _parentName, value);
RaisePropertyChanged("title");
}
}
private int _index;
public int index
{
get { return _index; }
set
{
RaiseAndSetIfchanged(ref _index, value);
RaisePropertyChanged("title");
}
}
public string title => $"{parentName}{index + 1}";
private string _status = CommonStatus.WAITING;
public string tooltipContent
{
get
{
string dataStr = "";
if (infos != null && infos.Count > 0)
{
foreach (var info in infos)
{
dataStr += $"\r\nStep:{info.step},Result:{info.result}";
}
}
return $"{title}\r\n状态:{CommonStatus.GetStatusDescription(status)}{dataStr}";
}
}
public string status
{
get { return _status; }
set => RaiseAndSetIfchanged(ref _status, value);
}
private ConcurrentQueue queue = new ConcurrentQueue();
private ObservableCollection _infos = new ObservableCollection();
public ObservableCollection infos
{
get => _infos;
set
{
RaiseAndSetIfchanged(ref _infos, value);
RaisePropertyChanged("tooltipContent");
}
}
private string countIniPath;
///
/// 探针寿命
///
private int probeCount;
public int ProbeCount
{
get => probeCount;
set
{
RaiseAndSetIfchanged(ref probeCount, value);
}
}
public void LoadProbeCount()
{
string temp = IniFileHelper.ReadIniData($"{title}", "ProbeCount", "", countIniPath);
if (!string.IsNullOrEmpty(temp))
{
int count = Convert.ToInt32(temp);
ProbeCount = count;
}
}
private void UpdateProbeCount(int count)
{
ProbeCount = count;
IniFileHelper.WriteIniData($"{title}", "ProbeCount", ProbeCount.ToString(), countIniPath);
if (window != null) window.UpdateProbeCount(ProbeCount);
}
private void UserControl_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (window == null)
{
window = new InfoWindow(title, infos, electricChart, ProbeCount);
window.Closed += Window_Closed;
window.ClearProbeCountEvent += Window_ClearProbeCountEvent;
window.Owner = Window.GetWindow(this);
window.Show();
}
else
{
window.Activate();
}
}
private void Window_ClearProbeCountEvent(object sender, EventArgs e)
{
UpdateProbeCount(0);
}
private void Window_Closed(object sender, EventArgs e)
{
this.window = null;
}
public void SetStatus(string status)
{
this.status = status;
if (status == "testing")
{
UpdateProbeCount(ProbeCount + 1);
}
}
public void SetInfos(Info info)
{
if (queue.Count >= maxSize)
{
queue.TryDequeue(out var first);
queue.Enqueue(info);
this.infos = new ObservableCollection(queue);
if (window != null) window.UpdateSource(this.infos);
}
else
{
queue.Enqueue(info);
if (window != null)
{
window.Dispatcher.Invoke(() =>
{
this.infos.Add(info);
});
}
else
{
Dispatcher.Invoke(() =>
{
this.infos.Add(info);
});
}
return;
}
}
public void ClearInfo()
{
queue = new ConcurrentQueue();
var list = new ObservableCollection(queue);
this.infos = list;
if (window != null) window.UpdateSource(this.infos);
}
private Chart electricChart = new Chart("电流曲线(A)", false, 20);
public void AddElectricData(double data)
{
electricChart.AddData(data);
}
public void ClearElectricData()
{
electricChart.Clear();
}
public void SaveElectricDataToCSV(string filePath)
{
try
{
List datas = electricChart?.GetSingleData();
FileInfo fi = new FileInfo(filePath);
if (!fi.Directory.Exists)
{
fi.Directory.Create(); //文件不存在,创建文件
}
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8))
{
string title = "电流数据(A)";
sw.WriteLine(title);
if (datas != null)
{
for (int i = 0; i < datas.Count; i++)
{
sw.WriteLine(datas[i].ToString());
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}