From 19d54d499043a744ad35cecbf07c302cd9c500f9 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Fri, 6 May 2022 14:14:11 +0200 Subject: [PATCH] ProcessTabPageCtrl : uses CB Activity, displays S/Ns, supports Flying start and compound meters, ver. 3.1.1907 --- TBF/Properties/AssemblyInfo.cs | 4 +- TBF/UI/Process/ProcessTabPageCtrl.cs | 368 ++++++++++++++++++--------- 2 files changed, 253 insertions(+), 119 deletions(-) diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index 786d2bd37..2dfb381b8 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.1903.0")] -[assembly: AssemblyFileVersion("3.1.1903.0")] +[assembly: AssemblyVersion("3.1.1907.0")] +[assembly: AssemblyFileVersion("3.1.1907.0")] diff --git a/TBF/UI/Process/ProcessTabPageCtrl.cs b/TBF/UI/Process/ProcessTabPageCtrl.cs index e4c449324..bcc5fbf24 100644 --- a/TBF/UI/Process/ProcessTabPageCtrl.cs +++ b/TBF/UI/Process/ProcessTabPageCtrl.cs @@ -7,7 +7,6 @@ using System.Linq; using System.Windows.Forms; using log4net; using Common; -using Config.Entities; using SchematicDrawing; using TBF.Resources; using TBF.Rig.Sequences; @@ -43,14 +42,14 @@ namespace TBF.UI.Process int volumeIx; int refErrorIx; - MetersKind currentMetersKind; + MetersKind metersKind; public ProcessTabPageCtrl() { InitializeComponent(); InitializeTestDataTable(testDataListView, null); - InitializeTableOfMeters(metersListView, TBF.Data.WMsCount); - InitializeDrawing(); + InitializeTableOfMeters(metersListView, MetersKind.Single, TBF.Data.WMsCount); + InitializeDrawing(MetersKind.Single); Bridge.ProcedureSelectedHandler += delegate(object sender, ProcedureSelectedEventArgs args) { @@ -96,7 +95,7 @@ namespace TBF.UI.Process /// 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.Nr, (cols != null && cols.Length > 0) ? cols[0] : 40 * 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); @@ -261,40 +260,74 @@ namespace TBF.UI.Process /// ListView control /// Water meters count /// Optional water meters to be used as list view item tags - void InitializeTableOfMeters(ListView listView, int wmsCount, IList waterMeters = null) + void InitializeTableOfMeters(ListView listView, MetersKind metersKind, int wmsCount, + IList waterMeters = null) { - splitContainer3.SplitterDistance = 45 + 17 * wmsCount; + int rowsCount = (metersKind == MetersKind.Combined) ? (2 * wmsCount) : wmsCount; + splitContainer3.SplitterDistance = 45 + 17 * rowsCount; - if (listView.Items.Count != wmsCount) + if (listView.Items.Count != rowsCount) { - /// Executed when the number of water meters or register readers changes + /// Nr. of water meters has changed => All table rows are re-initialized listView.Items.Clear(); + for (int i = 0; i < wmsCount; i++) { - listView.Items.Add(new ListViewItem((i + 1).ToString())); + if (metersKind == MetersKind.Combined) + { + listView.Items.Add(new ListViewItem(string.Format("{0} main", i + 1))); /// Compound - Main + listView.Items.Add(new ListViewItem(string.Format("{0} aux", i + 1))); /// Compound - Aux + } + else + { + listView.Items.Add(new ListViewItem(string.Format("{0}", i + 1))); /// Single + } } } - for (int i = 0; i < wmsCount; i++) + /// Add or Update subitems 1 .. (int)Column.Count + for (int i = 0; i < rowsCount; i++) { if (listView.Items[i].SubItems.Count == (int)Column.Count) { - for (int j = 1; j < (int)Column.Count; j++) /// Column 1 .. Column.Count-1 - { - listView.Items[i].SubItems[j].Text = "."; - } + for (int j = 1; j < (int)Column.Count; j++) listView.Items[i].SubItems[j].Text = "."; } else { - for (int j = 1; j < (int)Column.Count; j++) /// Column 1 .. Column.Count-1 - { - listView.Items[i].SubItems.Add("."); - } + for (int j = 1; j < (int)Column.Count; j++) listView.Items[i].SubItems.Add("."); } + } - if (waterMeters != null && i < waterMeters.Count) + /// Update Tag-s of ListView items with references to water meters, display serial numbers + for (int i = 0; i < wmsCount; i++) + { + if (waterMeters != null && waterMeters[i] != null) { - listView.Items[i].Tag = waterMeters[i]; + if (metersKind == MetersKind.Combined) + { + /// Compound - Main + listView.Items[2 * i].Tag = waterMeters[i]; + if (!string.IsNullOrEmpty(waterMeters[i].SerialNr)) + { + listView.Items[2 * i].SubItems[(int)Column.SerialNr].Text = waterMeters[i].SerialNr; + } + + /// Compound - Aux + listView.Items[2 * i + 1].Tag = waterMeters[i]; + if (!string.IsNullOrEmpty(waterMeters[i].SerialNrAux)) + { + listView.Items[2 * i + 1].SubItems[(int)Column.SerialNr].Text = waterMeters[i].SerialNrAux; + } + } + else + { + /// Single + listView.Items[i].Tag = waterMeters[i]; + if (!string.IsNullOrEmpty(waterMeters[i].SerialNr)) + { + listView.Items[i].SubItems[(int)Column.SerialNr].Text = waterMeters[i].SerialNr; + } + } } } } @@ -321,7 +354,7 @@ namespace TBF.UI.Process /// int scaleId, tankId, drainValveId, diverterId, regValveId, flowMeterId, startValveId; int pumpId, tempInId, tempOutId, tempDivId, pressUpId, pressDownId; - int wm1Id, wm2Id, wmLastId, j1, j2, j3, j4, j5, j6, j7; + int wm1Id, wm2Id, wmLastId, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11; /// int scaleMsrdIx, flowMeterMsrdIx, tempMtrUpMsrdIx, tempMtrDownMsrdIx, tempMtrDivMsrdIx; int pressMtrUpMsrdIx, pressMtrDownMsrdIx; @@ -337,7 +370,7 @@ namespace TBF.UI.Process /// Initialize hydraulical schematic drawing. /// This should be called before initialization of handlers. /// - void InitializeDrawing() + void InitializeDrawing(MetersKind mtrKind) { processDrawingCtrl.SupressRedraws = true; @@ -397,32 +430,61 @@ 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()) - { - Id = (wm1Id = id++), Name = "WM1", - X = 120, Y = 360, Shape = Shape.WaterM, Sz = Sz.L, Orient = Orient.R, Flip = false, - LblX = 0, LblY = -24, LblOrient = Orient.R, - }); + if (mtrKind == MetersKind.Combined) + { + /// WM 1 main + processDrawingCtrl.AddItem( + wm1Cfg = new TBF.Rig.WaterMeters.WaterMeter.WaterMeterCfg(new TBF.Rig.WaterMeters.WaterMeter.WaterMeterFactory()) + { + Id = (wm1Id = id++), Name = "WM1 main", + X = 230, Y = 360, Shape = Shape.WaterM, Sz = Sz.L, Orient = Orient.R, Flip = false, + LblX = 0, LblY = -24, LblOrient = Orient.R, + }); - /// WM 2 - processDrawingCtrl.AddItem( - wm2Cfg = new TBF.Rig.WaterMeters.WaterMeter.WaterMeterCfg(new TBF.Rig.WaterMeters.WaterMeter.WaterMeterFactory()) - { - Id = (wm2Id = id++), Name = "WM2", - X = 180, Y = 360, Shape = Shape.WaterM, Sz = Sz.L, Orient = Orient.R, Flip = false, - LblX = 0, LblY = -24, LblOrient = Orient.R, - }); + /// WM 1 aux + processDrawingCtrl.AddItem( + wm2Cfg = new TBF.Rig.WaterMeters.WaterMeter.WaterMeterCfg(new TBF.Rig.WaterMeters.WaterMeter.WaterMeterFactory()) + { + Id = (wm2Id = id++), Name = "WM1 aux", + X = 230, Y = 240, Shape = Shape.WaterM, Sz = Sz.L, Orient = Orient.R, Flip = false, + 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 = "WMn", - X = 310, Y = 360, Shape = Shape.WaterM, Sz = Sz.L, Orient = Orient.R, Flip = false, - LblX = 0, LblY = -24, LblOrient = Orient.R, - }); + /// Junctions to connect Aux meter + processDrawingCtrl.AddItem(new Configuration("J3", new Factory()) { Id = (j3 = id++), Shape = Shape.Junction, X = 170, Y = 370, Sz = Sz.L, }); + processDrawingCtrl.AddItem(new Configuration("J4", new Factory()) { Id = (j4 = id++), Shape = Shape.Junction, X = 170, Y = 250, Sz = Sz.L, }); + processDrawingCtrl.AddItem(new Configuration("J5", new Factory()) { Id = (j5 = id++), Shape = Shape.Junction, X = 310, Y = 250, Sz = Sz.L, }); + processDrawingCtrl.AddItem(new Configuration("J6", new Factory()) { Id = (j6 = id++), Shape = Shape.Junction, X = 310, Y = 370, Sz = Sz.L, }); + } + else + { + /// WM 1 + processDrawingCtrl.AddItem( + wm1Cfg = new TBF.Rig.WaterMeters.WaterMeter.WaterMeterCfg(new TBF.Rig.WaterMeters.WaterMeter.WaterMeterFactory()) + { + Id = (wm1Id = id++), Name = "WM1", + X = 120, Y = 360, Shape = Shape.WaterM, Sz = Sz.L, Orient = Orient.R, Flip = false, + LblX = 0, LblY = -24, LblOrient = Orient.R, + }); + + /// WM 2 + processDrawingCtrl.AddItem( + wm2Cfg = new TBF.Rig.WaterMeters.WaterMeter.WaterMeterCfg(new TBF.Rig.WaterMeters.WaterMeter.WaterMeterFactory()) + { + Id = (wm2Id = id++), Name = "WM2", + X = 180, Y = 360, Shape = Shape.WaterM, Sz = Sz.L, Orient = Orient.R, Flip = false, + 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 = "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++; @@ -449,7 +511,7 @@ namespace TBF.UI.Process }); /// Junction - processDrawingCtrl.AddItem(new Configuration("J3", new Factory()) { Id=(j3=id++), Shape=Shape.Junction, X=460, Y=370, Sz=Sz.L, }); + processDrawingCtrl.AddItem(new Configuration("J7", new Factory()) { Id=(j7=id++), Shape=Shape.Junction, X=460, Y=370, Sz=Sz.L, }); /// Start valve processDrawingCtrl.AddItem( @@ -485,8 +547,8 @@ namespace TBF.UI.Process }); /// 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, }); + processDrawingCtrl.AddItem(new Configuration("J8", new Factory()) { Id=(j8=id++), Shape=Shape.Junction, X=460, Y=80, Sz=Sz.L, }); + processDrawingCtrl.AddItem(new Configuration("J9", new Factory()) { Id=(j9=id++), Shape=Shape.Junction, X=630, Y=40, Sz=Sz.L, }); /// T div tempMtrDivMsrdIx = msrdIx++; @@ -535,8 +597,8 @@ namespace TBF.UI.Process }); /// Junctions - 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("J10", new Factory()) { Id=(j10=id++), Shape=Shape.Junction, X=680, Y=390, Sz=Sz.None, }); + processDrawingCtrl.AddItem(new Configuration("J11", new Factory()) { Id=(j11=id++), Shape=Shape.Junction, X=620, Y=390, Sz=Sz.None, }); processDrawingCtrl.MsrmntAvailableFlags = new bool[msrdIx]; processDrawingCtrl.MeasuredValues = new double[msrdIx]; @@ -550,25 +612,54 @@ namespace TBF.UI.Process processDrawingCtrl.PipesS = new string[0]; processDrawingCtrl.PipesM = new string[0]; - processDrawingCtrl.PipesL = new string[] + if (mtrKind == MetersKind.Combined) { - string.Format("{0}~0~{1}~0", tankId, pumpId), - string.Format("{0}~1~{1}~0", pumpId, j1), - string.Format("{0}~0~{1}~0", j1, j2), - string.Format("{0}~0~{1}~0", j2, wm1Id), - string.Format("{0}~1~{1}~0", wm1Id, wm2Id), - string.Format("{0}~1~{1}~0", wm2Id, wmLastId), - string.Format("{0}~1~{1}~0", wmLastId, j3), - string.Format("{0}~0~{1}~0", j3, startValveId), - string.Format("{0}~1~{1}~0", startValveId, flowMeterId), - string.Format("{0}~1~{1}~0", flowMeterId, regValveId), - string.Format("{0}~1~{1}~0", regValveId, j4), - string.Format("{0}~0~{1}~0", j4, j5), - string.Format("{0}~0~{1}~0", j5, diverterId), - string.Format("{0}~0~{1}~0", scaleId, drainValveId), - string.Format("{0}~1~{1}~0", drainValveId, j6), - string.Format("{0}~1~{1}~0", diverterId, j7) - }; + processDrawingCtrl.PipesL = new string[] + { + string.Format("{0}~0~{1}~0", tankId, pumpId), + string.Format("{0}~1~{1}~0", pumpId, j1), + string.Format("{0}~0~{1}~0", j1, j2), + string.Format("{0}~0~{1}~0", j2, j3), + string.Format("{0}~0~{1}~0", j3, j4), + string.Format("{0}~0~{1}~0", j3, wm1Id), + string.Format("{0}~0~{1}~0", j4, wm2Id), + string.Format("{0}~1~{1}~0", wm2Id, j5), + string.Format("{0}~1~{1}~0", wm1Id, j6), + string.Format("{0}~0~{1}~0", j5, j6), + string.Format("{0}~0~{1}~0", j6, j7), + string.Format("{0}~0~{1}~0", j7, startValveId), + string.Format("{0}~1~{1}~0", startValveId, flowMeterId), + string.Format("{0}~1~{1}~0", flowMeterId, regValveId), + string.Format("{0}~1~{1}~0", regValveId, j8), + string.Format("{0}~0~{1}~0", j8, j9), + string.Format("{0}~0~{1}~0", j9, diverterId), + string.Format("{0}~0~{1}~0", scaleId, drainValveId), + string.Format("{0}~1~{1}~0", drainValveId, j10), + string.Format("{0}~1~{1}~0", diverterId, j11) + }; + } + else + { + processDrawingCtrl.PipesL = new string[] + { + string.Format("{0}~0~{1}~0", tankId, pumpId), + string.Format("{0}~1~{1}~0", pumpId, j1), + string.Format("{0}~0~{1}~0", j1, j2), + string.Format("{0}~0~{1}~0", j2, wm1Id), + string.Format("{0}~1~{1}~0", wm1Id, wm2Id), + string.Format("{0}~1~{1}~0", wm2Id, wmLastId), + string.Format("{0}~1~{1}~0", wmLastId, j7), + string.Format("{0}~0~{1}~0", j7, startValveId), + string.Format("{0}~1~{1}~0", startValveId, flowMeterId), + string.Format("{0}~1~{1}~0", flowMeterId, regValveId), + string.Format("{0}~1~{1}~0", regValveId, j8), + string.Format("{0}~0~{1}~0", j8, j9), + string.Format("{0}~0~{1}~0", j9, diverterId), + string.Format("{0}~0~{1}~0", scaleId, drainValveId), + string.Format("{0}~1~{1}~0", drainValveId, j10), + string.Format("{0}~1~{1}~0", diverterId, j11) + }; + } processDrawingCtrl.PipesXL = new string[0]; processDrawingCtrl.Route = 0; @@ -579,16 +670,19 @@ namespace TBF.UI.Process void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) { - currentMetersKind = args.Procedure.MetersKind; - InitializeDrawing(); + metersKind = args.Procedure.MetersKind; + InitializeDrawing(metersKind); InitializeTestDataTable(testDataListView, null); - InitializeTableOfMeters(metersListView, TBF.Data.WMsCount); + InitializeTableOfMeters(metersListView, metersKind, + (metersKind == MetersKind.Combined) ? TBF.Data.CompoundWMsCount : TBF.Data.WMsCount); } void OnTestSelected(object sender, TestSelectedEventArgs args) { InitializeTestDataTable(testDataListView, args); - InitializeTableOfMeters(metersListView, ProcessData.WMsCount, ProcessData.BatchRslts.Batch.WaterMeters); + InitializeTableOfMeters(metersListView, metersKind, + (metersKind == MetersKind.Combined) ? TBF.Data.CompoundWMsCount : TBF.Data.WMsCount, + ProcessData.BatchRslts.Batch.WaterMeters); processDrawingCtrl.SupressRedraws = true; @@ -646,7 +740,12 @@ namespace TBF.UI.Process ? args.OutputPath.Scale.DrainValve.Name : "n/a"; /// Meters path - if (args.MetersPath != null && args.MetersPath.RegisterReaders != null) + if (metersKind == MetersKind.Combined) + { + wm1Cfg.Name = "WM1 main"; + wm2Cfg.Name = "WM1 aux"; + } + else if (args.MetersPath != null && args.MetersPath.RegisterReaders != null) { var rrs = args.MetersPath.RegisterReaders; int first = 0; @@ -762,33 +861,52 @@ namespace TBF.UI.Process /// /// 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.Devices != null && ProcessData.Devices.FlowMeter != null) - ? ProcessData.Devices.FlowMeter.LtrPerPulse * ProcessData.RefPulses : 0; - double refError = Formulas.ErrorFromVolumes(refVolume, volumeCtv); - 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 = "---"; + } + + if (TBF.Rig.StateMachine.ControlBoard.Activity == TBF.Rig.ControlBoard.Activity.FlyingStartStopTestWithDiverter) + { + 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.Devices != null && ProcessData.Devices.FlowMeter != null) + ? ProcessData.Devices.FlowMeter.LtrPerPulse * ProcessData.RefPulses : 0; + double refError = Formulas.ErrorFromVolumes(refVolume, volumeCtv); + + double 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 if (TBF.Rig.StateMachine.ControlBoard.Activity == TBF.Rig.ControlBoard.Activity.FlyingStartStopTest) + { + double refVolume = (ProcessData.Devices != null && ProcessData.Devices.FlowMeter != null) + ? ProcessData.Devices.FlowMeter.LtrPerPulse * ProcessData.RefPulses : 0; + double converted = Units.ConvertTo(ProcessData.VolumeUnit, refVolume); + testDataListView.Items[volumeIx].SubItems[1].Text = converted.ToString(Common.Utils.SignificantDigitsToFmt(converted, 5)); + testDataListView.Items[refErrorIx].SubItems[1].Text = "---"; + } + else if (TBF.Rig.StateMachine.ControlBoard.Activity == TBF.Rig.ControlBoard.Activity.StandingStartStopTest) + { + /// TODO: ??? + //var 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 = "---"; + } + else + { testDataListView.Items[volumeIx].SubItems[1].Text = "---"; testDataListView.Items[refErrorIx].SubItems[1].Text = "---"; } @@ -797,18 +915,27 @@ namespace TBF.UI.Process /// /// Update water meter states /// - if (ProcessData.Devices != null && ProcessData.Devices.FlowMeter != null && ProcessData.RegisterReaders != null) + if (ProcessData.Devices != null && + ProcessData.Devices.FlowMeter != null && + ProcessData.RegisterReaders != null && + (TBF.Rig.StateMachine.ControlBoard.Activity == TBF.Rig.ControlBoard.Activity.FlyingStartStopTest || + TBF.Rig.StateMachine.ControlBoard.Activity == TBF.Rig.ControlBoard.Activity.FlyingStartStopTestWithDiverter || + TBF.Rig.StateMachine.ControlBoard.Activity == TBF.Rig.ControlBoard.Activity.StandingStartStopTest)) { for (int i = 0; i < Math.Min(metersListView.Items.Count, ProcessData.RegisterReaders.Length); i++) { var lvi = metersListView.Items[i]; var rr = ProcessData.RegisterReaders[i]; - if (rr != null && Math.Abs(rr.WMVolume) > float.Epsilon && refVolume > float.Epsilon) + if (rr != null && rr.WMPulses != 0 && rr.WMRefPulses != 0) { /// Update a list view item - lvi.SubItems[(int)Column.Error].Text = Formulas.ErrorFromVolumes(rr.WMVolume, refVolume).ToString("F1"); - lvi.SubItems[(int)Column.Volume].Text = rr.WMVolume.ToString("F1"); + double wmVolume = rr.WMPulses * rr.LtrsPerPulse; + double wmRefVolume = rr.WMRefPulses * ProcessData.Devices.FlowMeter.LtrPerPulse; + double error = Formulas.ErrorFromVolumes(wmVolume, wmRefVolume); + lvi.SubItems[(int)Column.Error].Text = error.ToString(Common.Utils.SignificantDigitsToFmt(error, 2)); + double converted = Units.ConvertTo(ProcessData.VolumeUnit, wmVolume); + lvi.SubItems[(int)Column.Volume].Text = rr.WMVolume.ToString(Common.Utils.SignificantDigitsToFmt(converted, 5)); lvi.SubItems[(int)Column.Pulses].Text = rr.WMPulses.ToString(); lvi.SubItems[(int)Column.RefPulses].Text = rr.WMRefPulses.ToString(); lvi.SubItems[(int)Column.PulsesPerLtr].Text = rr.PulsesPerLtr.ToString(); @@ -877,42 +1004,49 @@ namespace TBF.UI.Process return; } - int wmsCount = Math.Min(ProcessData.RegisterReaders.Length, ProcessData.BatchRslts.Batch.WaterMeters.Count); + /// TODO: ??? update mass + //double converted = Units.ConvertTo(ProcessData.VolumeUnit, args.TestRslt.MassEnd - args.TestRslt.MassStart); + //testDataListView.Items[volumeIx].SubItems[1].Text = converted.ToString(Common.Utils.SignificantDigitsToFmt(converted, 5)); - if (metersListView.Items.Count != wmsCount) + double converted = Units.ConvertTo(ProcessData.VolumeUnit, args.TestRslt.VolumeCTV); + testDataListView.Items[volumeIx].SubItems[1].Text = converted.ToString(Common.Utils.SignificantDigitsToFmt(converted, 5)); + + testDataListView.Items[refErrorIx].SubItems[1].Text = args.TestRslt.ErrorMaster.ToString(Common.Utils.SignificantDigitsToFmt(args.TestRslt.ErrorMaster, 3)); + + int wmsCount = (metersKind == MetersKind.Combined) ? TBF.Data.CompoundWMsCount : TBF.Data.WMsCount; + int rowsCount = (metersKind == MetersKind.Combined) ? 2 * TBF.Data.CompoundWMsCount : TBF.Data.WMsCount; + + if (metersListView.Items.Count != rowsCount) { - /// Invoked only when the number of water meters or register readers changes - metersListView.Items.Clear(); - for (int i = 0; i < wmsCount; i++) - { - var lvi = new ListViewItem((i + 1).ToString()); /// Column 0 - for (Column c = (Column)1; c < Column.Count; c++) /// Column 1 .. Column.Count-1 - { - lvi.SubItems.Add("."); - } - lvi.Tag = ProcessData.BatchRslts.Batch.WaterMeters[i]; - metersListView.Items.Add(lvi); - } + InitializeTableOfMeters(metersListView, metersKind, wmsCount); } if (args.TestRslt != null) { for (int i = 0; i < wmsCount; i++) { - var wm = metersListView.Items[i].Tag as Results.Entities.WaterMeter; + var wm = ProcessData.BatchRslts.Batch.WaterMeters[i]; if (wm != null && !wm.Disabled) { - Results.Entities.MeterTestRslt mtr = wm.MeterTestRslts.FirstOrDefault(x => x.TestRslt == args.TestRslt); - if (mtr != null) + if (metersKind == MetersKind.Combined) { - var lvi = metersListView.Items[i]; + /// TODO: ??? + } + else + { + Results.Entities.MeterTestRslt mtr = wm.MeterTestRslts.FirstOrDefault(x => x.TestRslt == args.TestRslt); + if (mtr != null) + { + var lvi = metersListView.Items[i]; - /// Update a list view item - lvi.SubItems[(int)Column.Error].Text = mtr.Error.ToString("F1"); - lvi.SubItems[(int)Column.Volume].Text = mtr.VolumeMeter.ToString("F1"); - lvi.SubItems[(int)Column.Pulses].Text = mtr.PulsesMeter.ToString(); - lvi.SubItems[(int)Column.RefPulses].Text = mtr.PulsesMaster.ToString(); - lvi.SubItems[(int)Column.SerialNr].Text = mtr.SerialNr(); + /// Update a list view item + lvi.SubItems[(int)Column.Error].Text = mtr.Error.ToString(Common.Utils.SignificantDigitsToFmt(mtr.Error, 3)); + converted = Units.ConvertTo(ProcessData.VolumeUnit, mtr.VolumeMeter); + lvi.SubItems[(int)Column.Volume].Text = converted.ToString(Common.Utils.SignificantDigitsToFmt(converted, 5)); + lvi.SubItems[(int)Column.Pulses].Text = mtr.PulsesMeter.ToString(); + lvi.SubItems[(int)Column.RefPulses].Text = mtr.PulsesMaster.ToString(); + if (!string.IsNullOrEmpty(mtr.SerialNr())) lvi.SubItems[(int)Column.SerialNr].Text = mtr.SerialNr(); + } } } }