using HMI.Core.Util; using HMI.Util; using Plugin.TestResult_WPF.Model; using SuperSocket.SocketBase.Protocol; using System; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Controls; namespace Plugin.TestResult_WPF { /// /// DataTable.xaml 的交互逻辑 /// public partial class DataTable : 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 string _title; public string title { get { return _title; } set => RaiseAndSetIfchanged(ref _title, value); } private string _statusText; public string statusText { get { return _statusText; } set => RaiseAndSetIfchanged(ref _statusText, value); } private string tcpServerStatus; public string TcpServerStatus { get { return tcpServerStatus; } set { RaiseAndSetIfchanged(ref tcpServerStatus, value); } } private string tcpServerInfo = LangUtil.Get("App.NotStarted"); public string TcpServerInfo { get { return tcpServerInfo; } set { RaiseAndSetIfchanged(ref tcpServerInfo, value); } } private readonly int index; private readonly int cellCount; private readonly string chartTitle; private readonly TestResultView parent; private BaseConfig config; private Chart chart; private Chart multiChart; private SingleCell[] cells; private TcpServer tcpServer; private string CountIniPath; public DataTable(TestResultView parent, int index, string title, string countIniPath, BaseConfig config) { this.CountIniPath = countIniPath; this.config = config; this.index = index; this.parent = parent; this.title = title; this.cellCount = config.PositionCount; this.cells = new SingleCell[cellCount]; this.chartTitle = config.MainChartTitle; DataContext = this; InitializeComponent(); this.chart = new Chart(this.chartTitle, false, config.MaxSize, config.RefreshInterval); this.multiChart = new Chart(config.DetailChartTitle, true, config.MaxSize, config.RefreshInterval) { BorderThickness = new Thickness(0) }; this.grid.Children.Add(this.chart); Grid.SetRow(this.chart, 2); this.chart.MouseDoubleClick += chart_MouseDoubleClick; for (int i = 0; i < this.cellCount; i++) { var cell = new SingleCell(title, i, config.CellListMaxSize); mainGrid.Children.Add(cell); cells[i] = cell; } ReadCount(); } public int GetSize() { return this.cellCount; } public SingleCell GetSingleCell(int index) { return cells[index]; } public void SetStatusText(string statusText) { this.statusText = statusText; } public void SetTemperature(double t) { infoTable.temperature = t; chart.AddData(t); } public void SetTemperature(string name, double t) { multiChart.AddData(name, t); } public void SetStatus(string status) { infoTable.status = status; } public void SetOkCount(int count) { infoTable.okCount = count; } public void SetNgCount(int count) { infoTable.ngCount = count; } public void SetStartTime(string startTime) { infoTable.startTimeStr = startTime; } public void SetEndTime(string endTime) { infoTable.endTimeStr = endTime; } public void SetConsumeTime(double consumeTime) { infoTable.consumeTime = consumeTime; } private ChartWindow window; private void chart_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) { /// 打开多个温度曲线 if (window == null) { window = new ChartWindow(title); window.Owner = Window.GetWindow(this); window.Closed += Window_Closed; window.mainGrid.Children.Add(multiChart); window.Show(); } else { window.Activate(); } } private void Window_Closed(object sender, EventArgs e) { window = null; } private void SetStationGlobal_Click(object sender, RoutedEventArgs e) { ClearChartData(); parent.SetStartFlag(this.index, true); } /// /// 清空两个图表数据 /// public void ClearChartData() { chart.Clear(); multiChart.Clear(); } /// /// 启动Tcp服务器 /// private void StartTcpServer() { try { if (tcpServer == null) { tcpServer = new TcpServer(); tcpServer.NewRequestReceived += TcpServer_NewRequestReceived; if (!tcpServer.Setup(config.PortStart + index)) { ChangeTcpServerStatus("ERROR", this.lang("Tr.TcpServer.SettingFailed")); return; } if (!tcpServer.Start()) { ChangeTcpServerStatus("ERROR", this.lang("Tr.TcpServer.StartFailed")); return; } ChangeTcpServerStatus("RUNNING", this.lang("Tr.TcpServer.Running")); } else if (tcpServer.State != SuperSocket.SocketBase.ServerState.Running) { if (!tcpServer.Setup(config.PortStart + index)) { ChangeTcpServerStatus("ERROR", this.lang("Tr.TcpServer.SettingFailed")); return; } if (!tcpServer.Start()) { ChangeTcpServerStatus("ERROR", this.lang("Tr.TcpServer.StartFailed")); return; } ChangeTcpServerStatus("RUNNING", this.lang("Tr.TcpServer.Running")); } } catch (Exception ex) { ChangeTcpServerStatus("ERROR", $"{ex.Message}"); tcpServer?.Stop(); tcpServer = null; } } /// /// 更新Tcp服务器状态 /// /// /// private void ChangeTcpServerStatus(string status, string info) { Dispatcher.Invoke(() => { TcpServerStatus = status; TcpServerInfo = info; }); } /// /// 停止Tcp服务器 /// private void StopTcpServer() { try { tcpServer?.Stop(); tcpServer = null; } catch (Exception ex) { } } /// /// 释放资源 /// public void RelaseResource() { StopTcpServer(); } /// /// Tcp消息处理 /// /// /// private void TcpServer_NewRequestReceived(TcpSession session, StringRequestInfo requestInfo) { string msg = requestInfo.Body; string[] datas_10015 = msg.Split(';'); int cellIndex = int.Parse(datas_10015[1]); string strs = datas_10015[2]; string[] values = strs.Split(','); //string step = datas_10015[2]; //string result = datas_10015[3]; GetSingleCell(cellIndex).SetInfos(new Info { step = values[0], value = values[1], result = values[2], range = values[3], condition = values[4], updateTime = values[5] }); //session.Send("1"); } public void RefreshCount(int ok, int ng) { infoTable.UpdateNumber(infoTable.okCount + ok, infoTable.ngCount + ng); IniFileHelper.WriteIniData($"Oven_{index}", "Pass", infoTable.okCount.ToString(), this.CountIniPath); IniFileHelper.WriteIniData($"Oven_{index}", "Fail", infoTable.ngCount.ToString(), this.CountIniPath); } /// /// 读取保存的数据 /// public void ReadCount() { try { int ok = Convert.ToInt32(IniFileHelper.ReadIniData($"Oven_{index}", "Pass", "", CountIniPath)); int ng = Convert.ToInt32(IniFileHelper.ReadIniData($"Oven_{index}", "Fail", "", CountIniPath)); infoTable.UpdateNumber(ok, ng); } catch (Exception ex) { //do nothing } } /// /// 计数清零 /// public void ClearNumber() { infoTable.UpdateNumber(0, 0); IniFileHelper.WriteIniData($"Oven_{index}", "Pass", infoTable.okCount.ToString(), this.CountIniPath); IniFileHelper.WriteIniData($"Oven_{index}", "Fail", infoTable.ngCount.ToString(), this.CountIniPath); } private void UserControl_Loaded(object sender, RoutedEventArgs e) { StartTcpServer(); Loaded -= UserControl_Loaded; } private void Button_Click(object sender, RoutedEventArgs e) { StartTcpServer(); } } }