diff --git a/SchematicDrawing/IDrawingItCmpntWithMeasuredVal.cs b/SchematicDrawing/IDrawingItCmpntWithMeasuredVal.cs index e2a921335..5a166b659 100644 --- a/SchematicDrawing/IDrawingItCmpntWithMeasuredVal.cs +++ b/SchematicDrawing/IDrawingItCmpntWithMeasuredVal.cs @@ -5,8 +5,8 @@ namespace SchematicDrawing { public interface IDrawingItCmpntWithMeasuredVal : IDrawingItCmpnt { - bool MsrmntAvailable { get; } - double MeasuredVal { get; } - string AltString { get; } + bool MsrmntAvailable { get; } /// true when there is a valid measurement + double MeasuredVal { get; } /// Measured value in default unit (not converted) + string AltString { get; } /// String to be displayed when MsrdFormat is an empty string or null } } diff --git a/TBF/LocalSettings.cs b/TBF/LocalSettings.cs index 0958220ce..8bc40952f 100644 --- a/TBF/LocalSettings.cs +++ b/TBF/LocalSettings.cs @@ -174,14 +174,10 @@ namespace TBF /// Process public int ProcessSplitDist1; public int ProcessSplitDist2; - [XmlArrayAttribute("MetersColWidths")] + [XmlArrayAttribute("ProcMetersColWidths")] public int[] ProcMetersColWidths; - [XmlIgnore] - public int ProcMetersColCount { get { return (ProcMetersColWidths != null) ? ProcMetersColWidths.Length : 0; } } - [XmlArrayAttribute("TestDataColWidths")] + [XmlArrayAttribute("ProcTestDataColWidths")] public int[] ProcTestDataColWidths; - [XmlIgnore] - public int ProcTestDataColCount { get { return (ProcTestDataColWidths != null) ? ProcTestDataColWidths.Length : 0; } } /// Procedures public bool ProceduresDlgMaximized; diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index faec80ab7..04fdb60b0 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("3.1.1886.0")] -[assembly: AssemblyFileVersion("3.1.1886.0")] +[assembly: AssemblyVersion("3.1.1896.0")] +[assembly: AssemblyFileVersion("3.1.1896.0")] diff --git a/TBF/Rig/ControlBoard/IControlBoard.cs b/TBF/Rig/ControlBoard/IControlBoard.cs index 04ea229f6..91a5837bb 100644 --- a/TBF/Rig/ControlBoard/IControlBoard.cs +++ b/TBF/Rig/ControlBoard/IControlBoard.cs @@ -12,7 +12,7 @@ namespace TBF.Rig.ControlBoard void SpecifyInvertedValves(UInt128 valvesToInvert); /// - /// Called on beginning of a test + /// Called from ProcessData.ClearProcessValues() at the beginning of each test /// void ClearProcessValues(); diff --git a/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs b/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs index 81c9e231e..4d828c071 100644 --- a/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs +++ b/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs @@ -335,7 +335,9 @@ namespace TBF.Rig.ControlBoard.Papouch public int PulsesWM(int wmNr1) { return (wmNr1 > 0 && wmNr1 <= ProcessData.WMsCount) ? 0 : 0; } public double TestTimeWM(int wmNr1) { return (wmNr1 > 0 && wmNr1 <= ProcessData.WMsCount) ? 1.0 : 1.0; } - + /// + /// Called from ProcessData.ClearProcessValues() at the beginning of each test + /// public void ClearProcessValues() { } /// diff --git a/TBF/Rig/ControlBoard/Uni/UniCB.cs b/TBF/Rig/ControlBoard/Uni/UniCB.cs index 957180f7b..d49bca711 100644 --- a/TBF/Rig/ControlBoard/Uni/UniCB.cs +++ b/TBF/Rig/ControlBoard/Uni/UniCB.cs @@ -601,7 +601,7 @@ namespace TBF.Rig.ControlBoard.Uni /// /// Interface functions /// - public void ClearProcessValues() { } + public void ClearProcessValues() { } /// Called from ProcessData.ClearProcessValues() at the beginning of each test public double TestTimeWM(int wmNr1) { diff --git a/TBF/Rig/Sequences/MainSeq.cs b/TBF/Rig/Sequences/MainSeq.cs index 2361ffcc0..98582a9e6 100644 --- a/TBF/Rig/Sequences/MainSeq.cs +++ b/TBF/Rig/Sequences/MainSeq.cs @@ -1326,7 +1326,7 @@ namespace TBF.Rig.Sequences /// /// Clear a file with interim test results /// - ClearProcessData(); + ClearProcessDataFile(); Program.LocalSettings.BatchNr++; Program.LocalSettings.Save(); diff --git a/TBF/Rig/Sequences/ProcessData.cs b/TBF/Rig/Sequences/ProcessData.cs index 9c38df743..334a381bf 100644 --- a/TBF/Rig/Sequences/ProcessData.cs +++ b/TBF/Rig/Sequences/ProcessData.cs @@ -32,6 +32,13 @@ namespace TBF.Rig.Sequences public static int LinesCount { get { return BenchInfo != null ? BenchInfo.LinesCount : 2; } } public static int LineSize { get { return BenchInfo != null ? BenchInfo.WaterMetersCount / Math.Max(1, BenchInfo.LinesCount) : 10; } } public static int CompoundWMsCount { get { return BenchInfo != null ? BenchInfo.CompoundMetersCount : 1; } } + /// + public static Unit VolumeUnit { get { return BenchInfo != null ? BenchInfo.VolumeUnit : Unit.l; } } + public static Unit FlowUnit { get { return BenchInfo != null ? BenchInfo.FlowUnit : Unit.m3ph; } } + public static Unit MassUnit { get { return BenchInfo != null ? BenchInfo.MassUnit : Unit.kg; } } + public static Unit TempUnit { get { return BenchInfo != null ? BenchInfo.TempUnit : Unit.C; } } + public static Unit PressUnit { get { return BenchInfo != null ? BenchInfo.PressUnit : Unit.bar; } } + public static Unit LengthUnit { get { return BenchInfo != null ? BenchInfo.LengthUnit : Unit.mm; } } /// /// Procedure related state variables @@ -217,7 +224,7 @@ namespace TBF.Rig.Sequences } } - public static void ClearProcessData() + public static void ClearProcessDataFile() { File.Delete(PDataFileName); } @@ -239,13 +246,19 @@ namespace TBF.Rig.Sequences public static DoubleBox PressDelta = new DoubleBox() { Name = "Pressure Delta", Format = "F2" }; /// [bar] public static FloatBox Conductivity = new FloatBox(750) { Name = "Conductivity", Format = "F0" }; /// [uS/cm], default is 750 - public static double LtrPerRefPulse; /// to calculate the ref.volume - public static int RefPulses; - public static int RefPulsesDelta; + public static double LtrPerRefPulse; /// to calculate the ref.volume + //{ + // get { return (Devices != null && Devices.FlowMeter != null) ? Devices.FlowMeter.LtrPerPulseCorrected : 0; } + //} + public static int RefPulses { get { return StateMachine.ControlBoard.RefPulses; } } + public static int RefPulsesDelta; public static DoubleBox RefFrequency = new DoubleBox() { Name = "RefFreq", Format = "F2" }; public static DoubleBox RefFlow = new DoubleBox() { Name = "RefFlow", Format = "F2" }; /// [m3/h] - public static DoubleBox Mass = new DoubleBox() { Name = "Mass", Format = "F3" }; /// [kg] + public static double Mass + { + get { return (Devices != null && Devices.Scale is IScale) ? (Devices.Scale as IScale).Mass : 0; } /// [kg] + } public static DoubleBox StartMass = new DoubleBox() { Name = "Start Mass", Format = "F3" }; /// [kg] public static DoubleBox EndMass = new DoubleBox() { Name = "End Mass", Format = "F3" }; /// [kg] public static double FlowFromMassIncrease; @@ -263,16 +276,14 @@ namespace TBF.Rig.Sequences /// - /// To clear process values at the beginning of each test + /// To be called at the beginning of each test to clear process values /// - protected void ClearProcessValues() + public static void ClearProcessValues() { - StateMachine.ControlBoard.ClearProcessValues(); + if (StateMachine.ControlBoard != null) StateMachine.ControlBoard.ClearProcessValues(); - RefPulses = 0; RefFrequency.Clear(); RefFlow.Clear(); - Mass.Clear(); StartMass.Clear(); EndMass.Clear(); } diff --git a/TBF/UI/Process/ProcessTabPageCtrl.Designer.cs b/TBF/UI/Process/ProcessTabPageCtrl.Designer.cs index 51474d982..2c08bb6ca 100644 --- a/TBF/UI/Process/ProcessTabPageCtrl.Designer.cs +++ b/TBF/UI/Process/ProcessTabPageCtrl.Designer.cs @@ -30,7 +30,8 @@ { this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.splitContainer2 = new System.Windows.Forms.SplitContainer(); - this.processListViewEx = new Common.Forms.ListViewEx(); + this.metersListView = new System.Windows.Forms.ListView(); + this.testDataListView = new System.Windows.Forms.ListView(); this.processDrawingCtrl = new SchematicDrawing.SchematicDrawingCtrl(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); this.splitContainer1.Panel1.SuspendLayout(); @@ -38,6 +39,7 @@ this.splitContainer1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); this.splitContainer2.SuspendLayout(); this.SuspendLayout(); // @@ -61,35 +63,55 @@ // splitContainer2 // this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer2.IsSplitterFixed = true; this.splitContainer2.Location = new System.Drawing.Point(0, 0); this.splitContainer2.Name = "splitContainer2"; this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; // // splitContainer2.Panel1 // - this.splitContainer2.Panel1.Controls.Add(this.processListViewEx); + this.splitContainer2.Panel1.Controls.Add(this.testDataListView); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.metersListView); this.splitContainer2.Size = new System.Drawing.Size(250, 580); - this.splitContainer2.SplitterDistance = 300; + this.splitContainer2.SplitterDistance = 200; + this.splitContainer2.SplitterWidth = 15; this.splitContainer2.TabIndex = 0; // - // processListViewEx + // metersListView // - this.processListViewEx.AllowColumnReorder = true; - this.processListViewEx.Dock = System.Windows.Forms.DockStyle.Fill; - this.processListViewEx.DoubleClickActivation = false; - this.processListViewEx.FullRowSelect = true; - this.processListViewEx.GridLines = true; - this.processListViewEx.Location = new System.Drawing.Point(0, 0); - this.processListViewEx.Name = "processListViewEx"; - this.processListViewEx.Size = new System.Drawing.Size(250, 300); - this.processListViewEx.TabIndex = 0; - this.processListViewEx.UseCompatibleStateImageBehavior = false; - this.processListViewEx.View = System.Windows.Forms.View.Details; + this.metersListView.AllowColumnReorder = true; + this.metersListView.Dock = System.Windows.Forms.DockStyle.Fill; + this.metersListView.FullRowSelect = true; + this.metersListView.GridLines = true; + this.metersListView.Location = new System.Drawing.Point(0, 0); + this.metersListView.Name = "metersListView"; + this.metersListView.Size = new System.Drawing.Size(250, 365); + this.metersListView.TabIndex = 0; + this.metersListView.UseCompatibleStateImageBehavior = false; + this.metersListView.View = System.Windows.Forms.View.Details; + // + // testDataListView + // + this.testDataListView.AllowColumnReorder = true; + this.testDataListView.Dock = System.Windows.Forms.DockStyle.Fill; + this.testDataListView.FullRowSelect = true; + this.testDataListView.GridLines = true; + this.testDataListView.Location = new System.Drawing.Point(0, 0); + this.testDataListView.Name = "testDataListView"; + this.testDataListView.Size = new System.Drawing.Size(250, 200); + this.testDataListView.TabIndex = 0; + this.testDataListView.UseCompatibleStateImageBehavior = false; + this.testDataListView.View = System.Windows.Forms.View.Details; // // processDrawingCtrl // this.processDrawingCtrl.AltStrings = null; this.processDrawingCtrl.BenchControlMode = false; + this.processDrawingCtrl.CustomBitmaps = null; this.processDrawingCtrl.Dock = System.Windows.Forms.DockStyle.Fill; this.processDrawingCtrl.EditMode = false; this.processDrawingCtrl.Location = new System.Drawing.Point(0, 0); @@ -119,6 +141,7 @@ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); this.splitContainer1.ResumeLayout(false); this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); this.splitContainer2.ResumeLayout(false); this.ResumeLayout(false); @@ -128,8 +151,9 @@ #endregion private System.Windows.Forms.SplitContainer splitContainer1; - private Common.Forms.ListViewEx processListViewEx; + private System.Windows.Forms.ListView metersListView; private System.Windows.Forms.SplitContainer splitContainer2; private SchematicDrawing.SchematicDrawingCtrl processDrawingCtrl; + private System.Windows.Forms.ListView testDataListView; } } diff --git a/TBF/UI/Process/ProcessTabPageCtrl.cs b/TBF/UI/Process/ProcessTabPageCtrl.cs index ce7a32cf8..ed5ee5a98 100644 --- a/TBF/UI/Process/ProcessTabPageCtrl.cs +++ b/TBF/UI/Process/ProcessTabPageCtrl.cs @@ -37,12 +37,17 @@ namespace TBF.UI.Process Count } + int startMassIx; + int massIx; + int volumeIx; + int refErrorIx; + MetersKind currentMetersKind; public ProcessTabPageCtrl() { InitializeComponent(); - InitializeTableOfWatermeters(processListViewEx, ProcessData.WMsCount); + InitializeTableOfMeters(metersListView, ProcessData.WMsCount); InitializeDrawing(); Bridge.ProcedureSelectedHandler += delegate(object sender, ProcedureSelectedEventArgs args) @@ -94,16 +99,22 @@ namespace TBF.UI.Process TBF.LocalSettings ls = Program.LocalSettings; /// Splitter distances - splitContainer1.SplitterDistance = ls.ProcessSplitDist1; - splitContainer2.SplitterDistance = ls.ProcessSplitDist2; + splitContainer1.SplitterDistance = Math.Max(150, Math.Min(ls.ProcessSplitDist1, 500)); - /// ListViewEx columns - processListViewEx.Columns.Add(Strings.Nr, (ls.ProcessColumnCount > 0) ? ls.ProcessColumnWidths[0] : 30 * MainWnd.Dpi / Constants.Dpi100pct); - processListViewEx.Columns.Add(Strings.Error, (ls.ProcessColumnCount > 1) ? ls.ProcessColumnWidths[1] : 50 * MainWnd.Dpi / Constants.Dpi100pct); - processListViewEx.Columns.Add(Strings.Volume, (ls.ProcessColumnCount > 2) ? ls.ProcessColumnWidths[2] : 50 * MainWnd.Dpi / Constants.Dpi100pct); - processListViewEx.Columns.Add(Strings.Pulses, (ls.ProcessColumnCount > 3) ? ls.ProcessColumnWidths[3] : 60 * MainWnd.Dpi / Constants.Dpi100pct); - processListViewEx.Columns.Add(Strings.Ref_pulses, (ls.ProcessColumnCount > 4) ? ls.ProcessColumnWidths[4] : 75 * MainWnd.Dpi / Constants.Dpi100pct); - processListViewEx.Columns.Add(Strings.SerialNr, (ls.ProcessColumnCount > 5) ? ls.ProcessColumnWidths[5] : 100 * MainWnd.Dpi / Constants.Dpi100pct); + /// metersListViewEx columns + var cols = ls.ProcMetersColWidths; + metersListView.Columns.Add(Strings.Nr, (cols != null && cols.Length > 0) ? cols[0] : 30 * MainWnd.Dpi / Constants.Dpi100pct); + metersListView.Columns.Add(Strings.Error, (cols != null && cols.Length > 1) ? cols[1] : 50 * MainWnd.Dpi / Constants.Dpi100pct); + metersListView.Columns.Add(Strings.Volume, (cols != null && cols.Length > 2) ? cols[2] : 50 * MainWnd.Dpi / Constants.Dpi100pct); + metersListView.Columns.Add(Strings.Pulses, (cols != null && cols.Length > 3) ? cols[3] : 60 * MainWnd.Dpi / Constants.Dpi100pct); + metersListView.Columns.Add(Strings.Ref_pulses, (cols != null && cols.Length > 4) ? cols[4] : 75 * MainWnd.Dpi / Constants.Dpi100pct); + metersListView.Columns.Add(Strings.SerialNr, (cols != null && cols.Length > 5) ? cols[5] : 100 * MainWnd.Dpi / Constants.Dpi100pct); + + /// testDataListViewEx columns + cols = ls.ProcTestDataColWidths; + testDataListView.Columns.Add(Strings.Name, (cols != null && cols.Length > 0) ? cols[0] : 225 * MainWnd.Dpi / Constants.Dpi100pct); + testDataListView.Columns.Add(Strings.Value, (cols != null && cols.Length > 1) ? cols[1] : 80 * MainWnd.Dpi / Constants.Dpi100pct); + testDataListView.Columns.Add(Strings.Unit, (cols != null && cols.Length > 2) ? cols[2] : 60 * MainWnd.Dpi / Constants.Dpi100pct); } /// @@ -115,31 +126,53 @@ namespace TBF.UI.Process { LocalSettings ls = Program.LocalSettings; - bool anyChange = splitContainer1.SplitterDistance != ls.ProcessSplitDist1 - || splitContainer2.SplitterDistance != ls.ProcessSplitDist2; + bool anyChange = splitContainer1.SplitterDistance != ls.ProcessSplitDist1; if (anyChange) { ls.ProcessSplitDist1 = splitContainer1.SplitterDistance; - ls.ProcessSplitDist2 = splitContainer2.SplitterDistance; } /// Compare list view column widths with the saved ones - if (processListViewEx.Columns.Count != ls.ProcessColumnCount) + if (ls.ProcMetersColWidths == null || + ls.ProcMetersColWidths.Length != metersListView.Columns.Count) { - ls.ProcessColumnWidths = new int[processListViewEx.Columns.Count]; - for (int i = 0; i < ls.ProcessColumnCount; i++) + ls.ProcMetersColWidths = new int[metersListView.Columns.Count]; + for (int i = 0; i < metersListView.Columns.Count; i++) { - ls.ProcessColumnWidths[i] = processListViewEx.Columns[i].Width; + ls.ProcMetersColWidths[i] = metersListView.Columns[i].Width; } anyChange = true; } else { - for (int i = 0; i < ls.ProcessColumnCount; i++) + for (int i = 0; i < metersListView.Columns.Count; i++) { - if (processListViewEx.Columns[i].Width != ls.ProcessColumnWidths[i]) + if (metersListView.Columns[i].Width != ls.ProcMetersColWidths[i]) { - ls.ProcessColumnWidths[i] = processListViewEx.Columns[i].Width; + ls.ProcMetersColWidths[i] = metersListView.Columns[i].Width; + anyChange = true; + } + } + } + + /// Compare list view column widths with the saved ones + if (ls.ProcTestDataColWidths == null || + ls.ProcTestDataColWidths.Length != testDataListView.Columns.Count) + { + ls.ProcTestDataColWidths = new int[testDataListView.Columns.Count]; + for (int i = 0; i < testDataListView.Columns.Count; i++) + { + ls.ProcTestDataColWidths[i] = testDataListView.Columns[i].Width; + } + anyChange = true; + } + else + { + for (int i = 0; i < testDataListView.Columns.Count; i++) + { + if (testDataListView.Columns[i].Width != ls.ProcTestDataColWidths[i]) + { + ls.ProcTestDataColWidths[i] = testDataListView.Columns[i].Width; anyChange = true; } } @@ -149,6 +182,85 @@ namespace TBF.UI.Process } + /// + /// Initializes test data table - ListView control. + /// Table is filled with dots "." + /// + /// ListView control + void InitializeTestDataTable(ListView lv, TestSelectedEventArgs args) + { + lv.Items.Clear(); + ListViewItem lvi; + + lv.Items.Add(lvi = new ListViewItem(new string[] { + Strings.Test, + args.Test.Name, + string.Empty + })); + + lv.Items.Add(lvi = new ListViewItem(new string[] { + Strings.Repetition, + string.Format("{0} / {1}", args.RepetitionNr, args.Test.Repeats), + string.Empty + })); + + lv.Items.Add(new ListViewItem(new string[] { + Strings.Q_from, + Units.ConvertTo(ProcessData.FlowUnit, args.Test.Qfrom).ToString(), + ProcessData.FlowUnit.ToDescription() + })); + + lv.Items.Add(new ListViewItem(new string[] { + Strings.Q_to, + Units.ConvertTo(ProcessData.FlowUnit, args.Test.Qto).ToString(), + ProcessData.FlowUnit.ToDescription() + })); + + lv.Items.Add(new ListViewItem(new string[] { + Strings.Target_volume, + Units.ConvertTo(ProcessData.VolumeUnit, args.Test.Volume).ToString(), + ProcessData.VolumeUnit.ToDescription() + })); + + lv.Items.Add(new ListViewItem(new string[] { + Strings.Test_time, + args.Test.TestTime.ToString(), + Unit.s.ToDescription() + })); + + startMassIx = lv.Items.Count; + lv.Items.Add(new ListViewItem(new string[] { + Strings.Start_mass, + "---", + ProcessData.MassUnit.ToDescription() + })); + + massIx = lv.Items.Count; + lv.Items.Add(new ListViewItem(new string[] { + Strings.Mass, + "---", + ProcessData.MassUnit.ToDescription() + })); + + volumeIx = lv.Items.Count; + lv.Items.Add(new ListViewItem(new string[] { + Strings.Volume, + "---", + ProcessData.VolumeUnit.ToDescription() + })); + + refErrorIx = lv.Items.Count; + lv.Items.Add(new ListViewItem(new string[] { + Strings.Ref_flowmeter_error, + "---", + Unit.Pct.ToDescription() + })); + + log.DebugFormat("InitializeTestDataTable: startMassIx={0} massIx={1} volumeIx={2} refErrorIx={3} itemsCount={4}", + startMassIx, massIx, volumeIx, refErrorIx, lv.Items.Count); + } + + /// /// Initializes water meters table - ListView control. /// Table is filled with dots "." @@ -156,7 +268,7 @@ namespace TBF.UI.Process /// ListView control /// Water meters count /// Optional water meters to be used as list view item tags - void InitializeTableOfWatermeters(ListView listView, int wmsCount, IList waterMeters = null) + void InitializeTableOfMeters(ListView listView, int wmsCount, IList waterMeters = null) { if (listView.Items.Count != wmsCount) { @@ -239,6 +351,7 @@ namespace TBF.UI.Process int setpIx = 0; int bmpIx = 0; + /// Tank processDrawingCtrl.AddItem( tankCfg = new TBF.Rig.Various.Drawing.Tank.Configuration("Tank", new TBF.Rig.Various.Drawing.Tank.Factory()) { @@ -247,6 +360,7 @@ namespace TBF.UI.Process LblX = 33, LblY = 22, LblOrient = Orient.R, }); + /// Pump pumpSetpIx = setpIx++; processDrawingCtrl.AddItem( pumpCfg = new TBF.Rig.Modbus.PumpFM.DanfossVLT.PumpCfg(new TBF.Rig.Modbus.PumpFM.DanfossVLT.Factory()) @@ -259,6 +373,11 @@ namespace TBF.UI.Process Inverted = false, }); + /// Junctions + processDrawingCtrl.AddItem(new Configuration("J1", new Factory()) { Id=(j1=id++), Shape=Shape.Junction, X=50, Y=490, Sz=Sz.L, }); + processDrawingCtrl.AddItem(new Configuration("J2", new Factory()) { Id=(j2=id++), Shape=Shape.Junction, X=50, Y=370, Sz=Sz.L, }); + + /// T up tempMtrUpMsrdIx = msrdIx++; processDrawingCtrl.AddItem( tempInCfg = new TBF.Rig.Modbus.TempMeter.Groch.TempMeterCfg(new TBF.Rig.Modbus.TempMeter.Groch.Factory()) @@ -270,6 +389,7 @@ namespace TBF.UI.Process MsrdValLimLo = 5, MsrdValLimHi = 95, }); + /// Pr up pressMtrUpMsrdIx = msrdIx++; processDrawingCtrl.AddItem( pressUpCfg = new TBF.Rig.Modbus.PressureMeter.Meret.PressureMeterCfg(new TBF.Rig.Modbus.PressureMeter.Meret.Factory()) @@ -281,6 +401,7 @@ namespace TBF.UI.Process MsrdValLimLo = -0.1, MsrdValLimHi = 25, }); + /// WM 1 processDrawingCtrl.AddItem( wm1Cfg = new TBF.Rig.WaterMeters.WaterMeter.WaterMeterCfg(new TBF.Rig.WaterMeters.WaterMeter.WaterMeterFactory()) { @@ -289,6 +410,7 @@ namespace TBF.UI.Process LblX = 0, LblY = -24, LblOrient = Orient.R, }); + /// WM 2 processDrawingCtrl.AddItem( wm2Cfg = new TBF.Rig.WaterMeters.WaterMeter.WaterMeterCfg(new TBF.Rig.WaterMeters.WaterMeter.WaterMeterFactory()) { @@ -297,14 +419,16 @@ namespace TBF.UI.Process LblX = 0, LblY = -24, LblOrient = Orient.R, }); + /// WM last processDrawingCtrl.AddItem( wmLastCfg = new TBF.Rig.WaterMeters.WaterMeter.WaterMeterCfg(new TBF.Rig.WaterMeters.WaterMeter.WaterMeterFactory()) { - Id = (wmLastId = id++), Name = "WM3", + Id = (wmLastId = id++), Name = "WMn", X = 310, Y = 360, Shape = Shape.WaterM, Sz = Sz.L, Orient = Orient.R, Flip = false, LblX = 0, LblY = -24, LblOrient = Orient.R, }); + /// T down tempMtrDownMsrdIx = msrdIx++; processDrawingCtrl.AddItem( tempOutCfg = new TBF.Rig.Modbus.TempMeter.Groch.TempMeterCfg(new TBF.Rig.Modbus.TempMeter.Groch.Factory()) @@ -316,6 +440,7 @@ namespace TBF.UI.Process MsrdValLimLo = 5, MsrdValLimHi = 95, }); + /// Pr down pressMtrDownMsrdIx = msrdIx++; processDrawingCtrl.AddItem( pressDnCfg = new TBF.Rig.Modbus.PressureMeter.Meret.PressureMeterCfg(new TBF.Rig.Modbus.PressureMeter.Meret.Factory()) @@ -327,6 +452,10 @@ namespace TBF.UI.Process MsrdValLimLo = -0.1, MsrdValLimHi = 25, }); + /// Junction + processDrawingCtrl.AddItem(new Configuration("J3", new Factory()) { Id=(j3=id++), Shape=Shape.Junction, X=460, Y=370, Sz=Sz.L, }); + + /// Start valve processDrawingCtrl.AddItem( startValveCfg = new TBF.Rig.BuiltIn.Valve.ValveCfg(new TBF.Rig.BuiltIn.Valve.ValveFactory()) { @@ -337,6 +466,7 @@ namespace TBF.UI.Process Inverted = false, }); + /// Flow meter flowMeterMsrdIx = msrdIx++; processDrawingCtrl.AddItem( flowMeterCfg = new TBF.Rig.Uni.FlowMeter.FlowMeterCfg(new TBF.Rig.Uni.FlowMeter.Factory(), "I") @@ -347,6 +477,7 @@ namespace TBF.UI.Process MsrdX = 46, MsrdY = 22, MsrdOrient = Orient.R, MsrdFormat = "{0:F3} m2/h", MsrdUnit = Common.Unit.m3ph, }); + /// Regulation valve regValveSetpIx = setpIx++; processDrawingCtrl.AddItem( regValveCfg = new TBF.Rig.Uni.RegValve.RegValveCfg("VR", new TBF.Rig.Uni.RegValve.Factory()) @@ -357,6 +488,11 @@ namespace TBF.UI.Process SetpX = 46, SetpY = 22, SetpOrient = Orient.R, }); + /// Junctions + processDrawingCtrl.AddItem(new Configuration("J4", new Factory()) { Id=(j4=id++), Shape=Shape.Junction, X=460, Y=80, Sz=Sz.L, }); + processDrawingCtrl.AddItem(new Configuration("J5", new Factory()) { Id=(j5=id++), Shape=Shape.Junction, X=630, Y=40, Sz=Sz.L, }); + + /// T div tempMtrDivMsrdIx = msrdIx++; processDrawingCtrl.AddItem( tempDivCfg = new TBF.Rig.Modbus.TempMeter.Groch.TempMeterCfg(new TBF.Rig.Modbus.TempMeter.Groch.Factory()) @@ -368,6 +504,7 @@ namespace TBF.UI.Process MsrdValLimLo = 5, MsrdValLimHi = 95, }); + /// Diverter processDrawingCtrl.AddItem( diverterCfg = new TBF.Rig.Uni.Diverter.DiverterCfg(new TBF.Rig.Uni.Diverter.Factory()) { @@ -379,6 +516,7 @@ namespace TBF.UI.Process Inverted = false, }); + /// Scale scaleMsrdIx = msrdIx++; processDrawingCtrl.AddItem( scaleCfg = new TBF.Rig.Scales.MettlerToledo.ScaleCfg("WT", new TBF.Rig.Scales.MettlerToledo.Factory()) @@ -389,6 +527,7 @@ namespace TBF.UI.Process MsrdX = 16, MsrdY = 64, MsrdOrient = Orient.R, MsrdFormat = "{0:F3}", MsrdUnit = Common.Unit.kg, }); + /// Drain valve processDrawingCtrl.AddItem( drainValveCfg = new TBF.Rig.BuiltIn.Valve.ValveCfg(new TBF.Rig.BuiltIn.Valve.ValveFactory()) { @@ -400,13 +539,8 @@ namespace TBF.UI.Process }); /// Junctions - processDrawingCtrl.AddItem(new Configuration("J1", new Factory()) { Id = (j1 = id++), Shape = Shape.Junction, X = 50, Y = 490, Sz = Sz.L, }); - processDrawingCtrl.AddItem(new Configuration("J2", new Factory()) { Id = (j2 = id++), Shape = Shape.Junction, X = 50, Y = 370, Sz = Sz.L, }); - processDrawingCtrl.AddItem(new Configuration("J3", new Factory()) { Id = (j3 = id++), Shape = Shape.Junction, X = 460, Y = 370, Sz = Sz.L, }); - processDrawingCtrl.AddItem(new Configuration("J4", new Factory()) { Id = (j4 = id++), Shape = Shape.Junction, X = 460, Y = 80, Sz = Sz.L, }); - processDrawingCtrl.AddItem(new Configuration("J5", new Factory()) { Id = (j5 = id++), Shape = Shape.Junction, X = 630, Y = 40, Sz = Sz.L, }); - processDrawingCtrl.AddItem(new Configuration("J6", new Factory()) { Id = (j6 = id++), Shape = Shape.Junction, X = 680, Y = 390, Sz = Sz.None, }); - processDrawingCtrl.AddItem(new Configuration("J7", new Factory()) { Id = (j7 = id++), Shape = Shape.Junction, X = 620, Y = 390, Sz = Sz.None, }); + processDrawingCtrl.AddItem(new Configuration("J6", new Factory()) { Id=(j6=id++), Shape=Shape.Junction, X=680, Y=390, Sz=Sz.None, }); + processDrawingCtrl.AddItem(new Configuration("J7", new Factory()) { Id=(j7=id++), Shape=Shape.Junction, X=620, Y=390, Sz=Sz.None, }); processDrawingCtrl.MsrmntAvailableFlags = new bool[msrdIx]; processDrawingCtrl.MeasuredValues = new double[msrdIx]; @@ -455,7 +589,8 @@ namespace TBF.UI.Process void OnTestSelected(object sender, TestSelectedEventArgs args) { - InitializeTableOfWatermeters(processListViewEx, ProcessData.WMsCount, ProcessData.BatchRslts.Batch.WaterMeters); + InitializeTestDataTable(testDataListView, args); + InitializeTableOfMeters(metersListView, ProcessData.WMsCount, ProcessData.BatchRslts.Batch.WaterMeters); processDrawingCtrl.SupressRedraws = true; @@ -463,24 +598,76 @@ namespace TBF.UI.Process pumpCfg.Name = (args.FeedingPath != null && args.FeedingPath.Pump != null) ? args.FeedingPath.Pump.Name : "n/a"; /// Bench path - tempInCfg.Name = (args.BenchPath != null && args.BenchPath.TempMtrUp != null) ? args.BenchPath.TempMtrUp.Name : "n/a"; - tempOutCfg.Name = (args.BenchPath != null && args.BenchPath.TempMtrDown != null) ? args.BenchPath.TempMtrDown.Name : "n/a"; - pressUpCfg.Name = (args.BenchPath != null && args.BenchPath.PressMtrUp != null) ? args.BenchPath.PressMtrUp.Name : "n/a"; - pressDnCfg.Name = (args.BenchPath != null && args.BenchPath.PressMtrDown != null) ? args.BenchPath.PressMtrDown.Name : "n/a"; + tempInCfg.Name = (args.BenchPath != null && args.BenchPath.TempMtrUp != null) ? args.BenchPath.TempMtrUp.Name : "n/a"; + tempInCfg.MsrdFormat = (args.BenchPath != null && args.BenchPath.TempMtrUp != null) ? args.BenchPath.TempMtrUp.MsrdFormat : "{0:F1} °C"; + tempInCfg.MsrdUnit = (args.BenchPath != null && args.BenchPath.TempMtrUp != null) ? args.BenchPath.TempMtrUp.MsrdUnit : Unit.C; + tempInCfg.MsrdValLimLo = (args.BenchPath != null && args.BenchPath.TempMtrUp != null) ? args.BenchPath.TempMtrUp.MsrdValLimLo : 5; + tempInCfg.MsrdValLimHi = (args.BenchPath != null && args.BenchPath.TempMtrUp != null) ? args.BenchPath.TempMtrUp.MsrdValLimHi : 95; + + pressUpCfg.Name = (args.BenchPath != null && args.BenchPath.PressMtrUp != null) ? args.BenchPath.PressMtrUp.Name : "n/a"; + pressUpCfg.MsrdFormat = (args.BenchPath != null && args.BenchPath.PressMtrUp != null) ? args.BenchPath.PressMtrUp.MsrdFormat : "{0:F2} bar"; + pressUpCfg.MsrdUnit = (args.BenchPath != null && args.BenchPath.PressMtrUp != null) ? args.BenchPath.PressMtrUp.MsrdUnit : Unit.bar; + pressUpCfg.MsrdValLimLo = (args.BenchPath != null && args.BenchPath.PressMtrUp != null) ? args.BenchPath.PressMtrUp.MsrdValLimLo : 0; + pressUpCfg.MsrdValLimHi = (args.BenchPath != null && args.BenchPath.PressMtrUp != null) ? args.BenchPath.PressMtrUp.MsrdValLimHi : 15; + + tempOutCfg.Name = (args.BenchPath != null && args.BenchPath.TempMtrDown != null) ? args.BenchPath.TempMtrDown.Name : "n/a"; + tempOutCfg.MsrdFormat = (args.BenchPath != null && args.BenchPath.TempMtrDown != null) ? args.BenchPath.TempMtrDown.MsrdFormat : "{0:F1} °C"; + tempOutCfg.MsrdUnit = (args.BenchPath != null && args.BenchPath.TempMtrDown != null) ? args.BenchPath.TempMtrDown.MsrdUnit : Unit.C; + tempOutCfg.MsrdValLimLo = (args.BenchPath != null && args.BenchPath.TempMtrDown != null) ? args.BenchPath.TempMtrDown.MsrdValLimLo : 5; + tempOutCfg.MsrdValLimHi = (args.BenchPath != null && args.BenchPath.TempMtrDown != null) ? args.BenchPath.TempMtrDown.MsrdValLimHi : 95; + + pressDnCfg.Name = (args.BenchPath != null && args.BenchPath.PressMtrDown != null) ? args.BenchPath.PressMtrDown.Name : "n/a"; + pressDnCfg.MsrdFormat = (args.BenchPath != null && args.BenchPath.PressMtrDown != null) ? args.BenchPath.PressMtrDown.MsrdFormat : "{0:F2} bar"; + pressDnCfg.MsrdUnit = (args.BenchPath != null && args.BenchPath.PressMtrDown != null) ? args.BenchPath.PressMtrDown.MsrdUnit : Unit.bar; + pressDnCfg.MsrdValLimLo = (args.BenchPath != null && args.BenchPath.PressMtrDown != null) ? args.BenchPath.PressMtrDown.MsrdValLimLo : 0; + pressDnCfg.MsrdValLimHi = (args.BenchPath != null && args.BenchPath.PressMtrDown != null) ? args.BenchPath.PressMtrDown.MsrdValLimHi : 15; /// Output path - scaleCfg.Name = (args.OutputPath != null && args.OutputPath.Scale != null) ? args.OutputPath.Scale.Name : "n/a"; - drainValveCfg.Name = (args.OutputPath != null && args.OutputPath.Scale != null && args.OutputPath.Scale.DrainValve != null) ? args.OutputPath.Scale.DrainValve.Name : "n/a"; - diverterCfg.Name = (args.OutputPath != null && args.OutputPath.Diverter != null) ? args.OutputPath.Diverter.Name : "n/a"; - regValveCfg.Name = (args.OutputPath != null && args.OutputPath.RegValve != null) ? args.OutputPath.RegValve.Name : "n/a"; - flowMeterCfg.Name = (args.OutputPath != null && args.OutputPath.FlowMeter != null) ? args.OutputPath.FlowMeter.Name : "n/a"; startValveCfg.Name = (args.OutputPath != null && args.OutputPath.StartValve1 != null) ? args.OutputPath.StartValve1.Name : "n/a"; - tempDivCfg.Name = (args.OutputPath != null && args.OutputPath.TempMtrDiv != null) ? args.OutputPath.TempMtrDiv.Name : "n/a"; + + flowMeterCfg.Name = (args.OutputPath != null && args.OutputPath.FlowMeter != null) ? args.OutputPath.FlowMeter.Name : "n/a"; + flowMeterCfg.MsrdFormat = (args.OutputPath != null && args.OutputPath.FlowMeter != null) ? args.OutputPath.FlowMeter.MsrdFormat : "{0:F3} m3/h"; + flowMeterCfg.MsrdUnit = (args.OutputPath != null && args.OutputPath.FlowMeter != null) ? args.OutputPath.FlowMeter.MsrdUnit : Unit.m3ph; + flowMeterCfg.MsrdValLimLo = (args.OutputPath != null && args.OutputPath.FlowMeter != null) ? args.OutputPath.FlowMeter.MsrdValLimLo : 0; + flowMeterCfg.MsrdValLimHi = (args.OutputPath != null && args.OutputPath.FlowMeter != null) ? args.OutputPath.FlowMeter.MsrdValLimHi : 1600; + + regValveCfg.Name = (args.OutputPath != null && args.OutputPath.RegValve != null) ? args.OutputPath.RegValve.Name : "n/a"; + + tempDivCfg.Name = (args.OutputPath != null && args.OutputPath.TempMtrDiv != null) ? args.OutputPath.TempMtrDiv.Name : "n/a"; + tempDivCfg.MsrdFormat = (args.OutputPath != null && args.OutputPath.TempMtrDiv != null) ? args.OutputPath.TempMtrDiv.MsrdFormat : "{0:F1} °C"; + tempDivCfg.MsrdUnit = (args.OutputPath != null && args.OutputPath.TempMtrDiv != null) ? args.OutputPath.TempMtrDiv.MsrdUnit : Unit.C; + tempDivCfg.MsrdValLimLo = (args.OutputPath != null && args.OutputPath.TempMtrDiv != null) ? args.OutputPath.TempMtrDiv.MsrdValLimLo : 5; + tempDivCfg.MsrdValLimHi = (args.OutputPath != null && args.OutputPath.TempMtrDiv != null) ? args.OutputPath.TempMtrDiv.MsrdValLimHi : 95; + + diverterCfg.Name = (args.OutputPath != null && args.OutputPath.Diverter != null) ? args.OutputPath.Diverter.Name : "n/a"; + + scaleCfg.Name = (args.OutputPath != null && args.OutputPath.Scale != null) ? args.OutputPath.Scale.Name : "n/a"; + scaleCfg.Capacity = (args.OutputPath != null && args.OutputPath.Scale != null) ? args.OutputPath.Scale.Capacity : 100.0; + + drainValveCfg.Name = (args.OutputPath != null && args.OutputPath.Scale != null && args.OutputPath.Scale.DrainValve != null) + ? args.OutputPath.Scale.DrainValve.Name : "n/a"; /// Meters path - //wm1.Name = args.BenchPath; - //wm2.Name = args.BenchPath; - //wmLast.Name = args.BenchPath; + if (args.MetersPath != null && args.MetersPath.RegisterReaders != null) + { + var rrs = args.MetersPath.RegisterReaders; + int first = 0; + int last = ProcessData.WMsCount; + for (int i = 0; i < rrs.Length; i++) + { + if (first == 0 && rrs[i] != null) first = i + 1; + if (first != 0 && rrs[i] == null) { last = i; break; } + } + wm1Cfg.Name = string.Format("WM{0}", first); + wm2Cfg.Name = string.Format("WM{0}", first + 1); + wmLastCfg.Name = string.Format("WM{0}", last); + } + else + { + wm1Cfg.Name = "WM1"; + wm2Cfg.Name = "WM2"; + wmLastCfg.Name = "WMn"; + } /// Route based - pump if (args.FeedingPath != null && args.FeedingPath.Pump != null && @@ -570,28 +757,52 @@ namespace TBF.UI.Process /// void OnStateMachineTick(object sender, StateMachineTickEventArgs args) { + log.DebugFormat("OnStateMachineTick: startMassIx={0} massIx={1} volumeIx={2} refErrorIx={3} itemsCount={4}", + startMassIx, massIx, volumeIx, refErrorIx, testDataListView.Items.Count); try { - /// Redraw schematic drawing - UpdateRouteMsrdValuesAndSetpoints(args.Route); + /// + /// Update test data + /// + double density = Formulas.WaterDensityFromTempPress((ProcessData.TempUp.Val + ProcessData.TempDown.Val) / 2, + (ProcessData.PressUp.Val + ProcessData.PressDown.Val) / 2); + double volumeCtv = 1000 * Formulas.Buoyancy() * (ProcessData.Mass - ProcessData.StartMass.Val) / density; + //double refVolume = cBrd.RefPulses * cBrd.Devices.FlowMeter.LtrPerPulse; + double refVolume = ProcessData.LtrPerRefPulse * ProcessData.RefPulses; + double refError = Formulas.ErrorFromVolumes(refVolume, volumeCtv); - //if (ProcessData.RegisterReaders == null || ProcessData.BatchRslts == null || - // ProcessData.BatchRslts.Batch == null || ProcessData.BatchRslts.Batch.WaterMeters == null) - //{ - // return; - //} + if (refErrorIx != 0 && testDataListView.Items.Count > refErrorIx) + { + if (ProcessData.StartMass.Valid) + { + double converted = Units.ConvertTo(ProcessData.MassUnit, ProcessData.StartMass.Val); + testDataListView.Items[startMassIx].SubItems[1].Text = converted.ToString(Common.Utils.SignificantDigitsToFmt(converted, 6)); + + converted = Units.ConvertTo(ProcessData.MassUnit, ProcessData.Mass - ProcessData.StartMass.Val); + testDataListView.Items[massIx].SubItems[1].Text = converted.ToString(Common.Utils.SignificantDigitsToFmt(converted, 6)); + + converted = Units.ConvertTo(ProcessData.VolumeUnit, volumeCtv); + testDataListView.Items[volumeIx].SubItems[1].Text = converted.ToString(Common.Utils.SignificantDigitsToFmt(converted, 5)); + + testDataListView.Items[refErrorIx].SubItems[1].Text = refError.ToString(Common.Utils.SignificantDigitsToFmt(refError, 3)); + } + else + { + testDataListView.Items[startMassIx].SubItems[1].Text = "---"; + testDataListView.Items[massIx].SubItems[1].Text = "---"; + testDataListView.Items[volumeIx].SubItems[1].Text = "---"; + testDataListView.Items[refErrorIx].SubItems[1].Text = "---"; + } + } /// /// Update water meter states /// - TBF.Rig.ControlBoard.IControlBoard cBrd = TBF.Rig.StateMachine.ControlBoard; - if (cBrd != null && cBrd.Devices != null && cBrd.Devices.FlowMeter != null && ProcessData.RegisterReaders != null) + if (ProcessData.Devices != null && ProcessData.Devices.FlowMeter != null && ProcessData.RegisterReaders != null) { - double refVolume = cBrd.RefPulses * cBrd.Devices.FlowMeter.LtrPerPulse; - - for (int i = 0; i < Math.Min(processListViewEx.Items.Count, ProcessData.RegisterReaders.Length); i++) + for (int i = 0; i < Math.Min(metersListView.Items.Count, ProcessData.RegisterReaders.Length); i++) { - var lvi = processListViewEx.Items[i]; + var lvi = metersListView.Items[i]; var rr = ProcessData.RegisterReaders[i]; if (rr != null && Math.Abs(rr.WMVolume) > float.Epsilon && refVolume > float.Epsilon) @@ -616,6 +827,11 @@ namespace TBF.UI.Process } } } + + /// + /// Redraw schematic drawing + /// + UpdateRouteMsrdValuesAndSetpoints(args.Route); } catch (Exception e) { @@ -627,6 +843,10 @@ namespace TBF.UI.Process void UpdateRouteMsrdValuesAndSetpoints(UInt128 route) { + //if (route != processDrawingCtrl.Route) + //{ + // int a = 5; + //} processDrawingCtrl.Route = route; for (int i = 0; i < cmpntWithMeasuredVal.Length; i++) @@ -647,7 +867,7 @@ namespace TBF.UI.Process for (int i = 0; i < cmpntWithSetpoint.Length; i++) { - processDrawingCtrl.Setpoints[0] = (cmpntWithSetpoint[i] != null) ? cmpntWithSetpoint[i].SetpointVal : 0; + processDrawingCtrl.Setpoints[i] = (cmpntWithSetpoint[i] != null) ? cmpntWithSetpoint[i].SetpointVal : 0; } } @@ -662,10 +882,10 @@ namespace TBF.UI.Process int wmsCount = Math.Min(ProcessData.RegisterReaders.Length, ProcessData.BatchRslts.Batch.WaterMeters.Count); - if (processListViewEx.Items.Count != wmsCount) + if (metersListView.Items.Count != wmsCount) { /// Invoked only when the number of water meters or register readers changes - processListViewEx.Items.Clear(); + metersListView.Items.Clear(); for (int i = 0; i < wmsCount; i++) { var lvi = new ListViewItem((i + 1).ToString()); /// Column 0 @@ -674,7 +894,7 @@ namespace TBF.UI.Process lvi.SubItems.Add("."); } lvi.Tag = ProcessData.BatchRslts.Batch.WaterMeters[i]; - processListViewEx.Items.Add(lvi); + metersListView.Items.Add(lvi); } } @@ -682,13 +902,13 @@ namespace TBF.UI.Process { for (int i = 0; i < wmsCount; i++) { - var wm = processListViewEx.Items[i].Tag as Results.Entities.WaterMeter; + var wm = metersListView.Items[i].Tag as Results.Entities.WaterMeter; if (wm != null && !wm.Disabled) { Results.Entities.MeterTestRslt mtr = wm.MeterTestRslts.FirstOrDefault(x => x.TestRslt == args.TestRslt); if (mtr != null) { - var lvi = processListViewEx.Items[i]; + var lvi = metersListView.Items[i]; /// Update a list view item lvi.SubItems[(int)Column.Error].Text = mtr.Error.ToString("F1"); diff --git a/TBF/UiBridge/Bridge.cs b/TBF/UiBridge/Bridge.cs index 010cba4ce..5eba8db11 100644 --- a/TBF/UiBridge/Bridge.cs +++ b/TBF/UiBridge/Bridge.cs @@ -68,6 +68,8 @@ namespace TBF.UiBridge /// public static void OnTestSelected(object sender, TestSelectedEventArgs data) { + TBF.Rig.Sequences.ProcessData.ClearProcessValues(); + if (TestSelectedHandler == null) return; try { TestSelectedHandler(sender, data); } catch (Exception e) { log.Error("TestSelectedHandler(...) failed", e); }