From efd0515295993318d6fd11d7e6c12172e3f2c101 Mon Sep 17 00:00:00 2001 From: Michal Buzik Date: Sun, 7 Sep 2025 17:42:26 +0200 Subject: [PATCH 1/4] Patch applied - Added new calibration-related properties for IPERL mode, integrated AppDiagnostic functionality into UI, and updated project configuration. --- Config/Config.csproj | 2 + Config/Entities/OutputPath.cs | 13 +- Config/Mappings/OutputPathMap.cs | 3 +- Results/Entities/MeterTestRslt.cs | 18 +- Results/Results.csproj | 6 +- SchematicDrawing/DrawingShape.cs | 42 +- SchematicDrawing/Enums.cs | 2 + .../Properties/Resources.Designer.cs | 202 +- SchematicDrawing/Properties/Resources.resx | 73 +- SchematicDrawing/SchematicDrawing.csproj | 4 + SchematicDrawing/SchematicDrawingCtrl.cs | 4 +- SharedDatabase/SharedDatabase.csproj | 2 +- TBF.sln | 95 +- TBF/Properties/AssemblyInfo.cs | 4 +- TBF/Resources/Strings.Designer.cs | 27 + TBF/Resources/Strings.resx | 9 + TBF/Rig/BuiltIn/SetValvesOp.cs | 116 +- TBF/Rig/ControlBoard/IControlBoard.cs | 2 +- TBF/Rig/ControlBoard/Papouch/PapouchCB.cs | 2 +- TBF/Rig/ControlBoard/Uni/Action.cs | 29 +- TBF/Rig/ControlBoard/Uni/OutputMessage.cs | 30 +- .../Uni/StandingStartStopTestOp.cs | 115 +- TBF/Rig/ControlBoard/Uni/UniCB.cs | 47 +- .../iPerl/CycleBeginningForm.Designer.cs | 44 +- TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs | 166 +- .../DataEntry/iPerl/CycleBeginningForm.resx | 131 +- TBF/Rig/DataEntry/iPerl/EntryForm.cs | 56 +- TBF/Rig/DataEntry/iPerl/EntryFormCfg.cs | 43 +- TBF/Rig/DataEntry/iPerl/Factory.cs | 2 +- TBF/Rig/Dummy/RegValve/RegValve.cs | 3 +- TBF/Rig/OutputPath.cs | 8 +- TBF/Rig/Sequences/MainSeq.cs | 55 +- TBF/Rig/Sequences/ProcessData.cs | 47 +- TBF/Rig/TbfComponents.cs | 1 + TBF/Rig/TestMethods/Endurance/CycleDlg.cs | 25 +- .../Endurance/TestMethodCfgCtrl.cs | 123 +- .../Endurance/TestMethodCfgCtrl.designer.cs | 138 +- .../FlyingStartMassCollectionSeq.cs | 2 +- TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs | 16 +- .../iPerlCommunication/TestMethod.cs | 85 +- .../iPerlCommunication/TestMethodCfg.cs | 24 +- .../iPerlCommunication/TestMethodFactory.cs | 1 - .../iPerlCommunicationForm.cs | 1785 ++--- .../iPerlCommunicationForm.designer.cs | 288 +- .../iPerlCommunicationForm.resx | 6940 ++++++++--------- .../iPerlCommunicationParams.cs | 9 + .../iPerlCommunicationSeq.cs | 175 +- .../iPerlCommunication/iPerlDataWrite.cs | 5 +- .../iPerlCommunication/iPerlEnums.cs | 2 + .../iPerlCommunication/iPerlHead/Enums.cs | 6 + .../iPerlCommunication/iPerlHead/Factory.cs | 1 - .../iPerlCommunication/iPerlHead/IperlHead.cs | 304 +- .../iPerlHead/IperlHeadCfg.cs | 11 +- .../iPerlHead/IperlHeadCfgCtrl.cs | 21 +- .../iPerlHead/IperlHeadCfgCtrl.designer.cs | 481 +- .../iPerlHead/ProcParams.cs | 37 +- TBF/Rig/Uni/FlowMeter/FlowMeter.cs | 1 + TBF/Rig/Uni/FlowMeter/FlowMeterCfg.cs | 15 +- .../Uni/FlowMetersInParallel/FlowMeterCfg.cs | 15 +- .../Uni/RegValve/ChangeRegValvePositionOp.cs | 32 +- TBF/Rig/Uni/RegValve/Factory.cs | 2 +- TBF/Rig/Uni/RegValve/Handlers.cs | 2 +- TBF/Rig/Uni/RegValve/RegValve.cs | 38 +- TBF/Rig/Uni/RegValve/SetFlowOp.cs | 65 +- TBF/Rig/Uni/RegValve/SetRegValvePositionOp.cs | 41 +- TBF/Rig/Uni/RegValveAnalog/RegValve.cs | 2 + TBF/Rig/Uni/RegValveTandem/RegValveTandem.cs | 4 +- TBF/SampleConfig/log4netConfig.xml | 10 +- TBF/TBF.csproj | 157 +- TBF/TBF.csproj.user | 3 + TBF/UI/Bench/Paths/PathsOutputCtrl.cs | 413 +- .../Bench/Uncertainties/UncertaintiesDlg.cs | 8 +- TBF/UI/MainWnd.Designer.cs | 12 +- TBF/UI/MainWnd.cs | 51 +- TBF/UI/MainWnd.de.resx | 3 + TBF/UI/MainWnd.resx | 332 +- TBF/UI/Procedures/ProcedureDlg.cs | 8 +- Workplace/Workplace.csproj | 42 +- 78 files changed, 6917 insertions(+), 6221 deletions(-) diff --git a/Config/Config.csproj b/Config/Config.csproj index 630970d13..de72f1995 100644 --- a/Config/Config.csproj +++ b/Config/Config.csproj @@ -68,6 +68,7 @@ + @@ -95,6 +96,7 @@ + diff --git a/Config/Entities/OutputPath.cs b/Config/Entities/OutputPath.cs index 08280dbf0..c7a34bd31 100644 --- a/Config/Entities/OutputPath.cs +++ b/Config/Entities/OutputPath.cs @@ -18,8 +18,9 @@ namespace Config.Entities public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI public virtual string Selector { get; set; } public virtual string RegValve { get; set; } - public virtual string FlowMeter { get; set; } - public virtual float PidCoef { get; set; } /// PID coefficient for the regulation path + public virtual int RegulMinStep { get; set; } + public virtual string FlowMeter { get; set; } + public virtual float PidCoef { get; set; } /// PID coefficient for the regulation path public virtual string StartValve { get; set; } public virtual string Diverter { get; set; } public virtual string TempMtrDiv { get; set; } @@ -39,6 +40,7 @@ namespace Config.Entities { ValvesOpen = string.Empty; ValvesClose = string.Empty; + RegulMinStep = 0; } public OutputPath(string name, int itemNr) @@ -46,7 +48,9 @@ namespace Config.Entities { Name = name; ItemNr = itemNr; - } + RegulMinStep = 0; + + } public virtual OutputPath Clone(string name, int itemNr) { @@ -58,7 +62,8 @@ namespace Config.Entities result.FlowUnit = FlowUnit; result.Selector = Selector; result.RegValve = RegValve; - result.FlowMeter = FlowMeter; + result.RegulMinStep = RegulMinStep; + result.FlowMeter = FlowMeter; result.PidCoef = PidCoef; result.StartValve = StartValve; result.Diverter = Diverter; diff --git a/Config/Mappings/OutputPathMap.cs b/Config/Mappings/OutputPathMap.cs index 4f15ea422..7ec08d439 100644 --- a/Config/Mappings/OutputPathMap.cs +++ b/Config/Mappings/OutputPathMap.cs @@ -17,7 +17,8 @@ namespace Config.Mappings Map(x => x.Qto); Map(x => x.Selector); Map(x => x.RegValve); - Map(x => x.FlowMeter); + Map(x => x.RegulMinStep); + Map(x => x.FlowMeter); Map(x => x.PidCoef); Map(x => x.StartValve); Map(x => x.Diverter); diff --git a/Results/Entities/MeterTestRslt.cs b/Results/Entities/MeterTestRslt.cs index 1834e000e..92a463fbb 100644 --- a/Results/Entities/MeterTestRslt.cs +++ b/Results/Entities/MeterTestRslt.cs @@ -29,8 +29,12 @@ namespace Results.Entities public virtual long ErrorIndicators { get; set; } /// Not mapped to DB !!!, bit24=E25, bit25=E26, bit26=E27, bit27=E28 (error flags) public virtual long InfoIndicators { get; set; } /// Not mapped to DB !!!, bit24=E25, bit25=E26, bit26=E27, bit27=E28 (info flags) public virtual bool TestDone { get; set; } /// true = test was completed - public virtual bool Passed { get; set; } /// true = test passed, water meter is OK + public virtual bool Passed { get; set; } /// true = test passed, water meter is OK #if IPERL + public virtual int CalibFactor { get; set; } + public virtual int CalibFactorLNA { get; set; } + public virtual int Q2CorrRL { get; set; } + public virtual int Q2CorrLR { get; set; } public virtual string ExtraDataPath { get; set; } /// Relative path to a file with opto-data/raw-data public virtual float X1 { get; set; } public virtual float X2 { get; set; } @@ -166,6 +170,10 @@ namespace Results.Entities TestDone = src.TestDone; Passed = src.Passed; #if IPERL + CalibFactor = src.CalibFactor; + CalibFactorLNA = src.CalibFactorLNA; + Q2CorrRL = src.Q2CorrRL; + Q2CorrLR = src.Q2CorrLR; ExtraDataPath = src.ExtraDataPath; X1 = src.X1; X2 = src.X2; @@ -209,6 +217,10 @@ namespace Results.Entities writer.Write(TestDone); writer.Write(Passed); #if IPERL + writer.Write(CalibFactor); + writer.Write(CalibFactorLNA); + writer.Write(Q2CorrRL); + writer.Write(Q2CorrLR); writer.Write((ExtraDataPath != null) ? ExtraDataPath : string.Empty); writer.Write(X1); writer.Write(X2); @@ -249,6 +261,10 @@ namespace Results.Entities TestDone = reader.ReadBoolean(); Passed = reader.ReadBoolean(); #if IPERL + CalibFactor = reader.ReadInt32(); + CalibFactorLNA = reader.ReadInt32(); + Q2CorrRL = reader.ReadInt32(); + Q2CorrLR = reader.ReadInt32(); ExtraDataPath = reader.ReadString(); X1 = reader.ReadSingle(); X2 = reader.ReadSingle(); diff --git a/Results/Results.csproj b/Results/Results.csproj index 3baa75d44..65fbd6be1 100644 --- a/Results/Results.csproj +++ b/Results/Results.csproj @@ -29,7 +29,7 @@ pdbonly true bin\Release\ - TRACE + TRACE;IPERL prompt 4 false @@ -241,7 +241,9 @@ - + + Designer + ResXFileCodeGenerator Strings.Designer.cs diff --git a/SchematicDrawing/DrawingShape.cs b/SchematicDrawing/DrawingShape.cs index 959993d30..fb4945a47 100644 --- a/SchematicDrawing/DrawingShape.cs +++ b/SchematicDrawing/DrawingShape.cs @@ -378,6 +378,40 @@ namespace SchematicDrawing Properties.Resources.Valve_XL_closed, Properties.Resources.Valve_XL_vacuum, Properties.Resources.Valve_XL_open_dry); + /// ValveSw + Shapes[DrShIx(Shape.ValveSw, Sz.S)] = new DrawingShape(Shape.ValveSw, Sz.S, 2, 2, + new Node[] { new Node(0, 1, Orient.L), new Node(2, 1, Orient.R) }, + new Edge[] { new Edge(0, 1, 20, RouteCouple.OpenWhen1), new Edge(1, 0, 20, RouteCouple.OpenWhen1) }, + 0, 0, 20, 20, + Properties.Resources.ValveSw_S_open, + Properties.Resources.ValveSw_S_closed, + Properties.Resources.ValveSw_S_vacuum, + Properties.Resources.ValveSw_S_open_dry); + Shapes[DrShIx(Shape.ValveSw, Sz.M)] = new DrawingShape(Shape.ValveSw, Sz.M, 3, 4, + new Node[] { new Node(0, 2, Orient.L), new Node(3, 2, Orient.R) }, + new Edge[] { new Edge(0, 1, 30, RouteCouple.OpenWhen1), new Edge(1, 0, 30, RouteCouple.OpenWhen1) }, + 0, 5, 30, 30, + Properties.Resources.ValveSw_M_open, + Properties.Resources.ValveSw_M_closed, + Properties.Resources.ValveSw_M_vacuum, + Properties.Resources.ValveSw_M_open_dry); + Shapes[DrShIx(Shape.ValveSw, Sz.L)] = new DrawingShape(Shape.ValveSw, Sz.L, 4, 4, + new Node[] { new Node(0, 2, Orient.L), new Node(4, 2, Orient.R) }, + new Edge[] { new Edge(0, 1, 40, RouteCouple.OpenWhen1), new Edge(1, 0, 40, RouteCouple.OpenWhen1) }, + 0, 0, 40, 40, + Properties.Resources.ValveSw_L_open, + Properties.Resources.ValveSw_L_closed, + Properties.Resources.ValveSw_L_vacuum, + Properties.Resources.ValveSw_L_open_dry); + Shapes[DrShIx(Shape.ValveSw, Sz.XL)] = new DrawingShape(Shape.ValveSw, Sz.XL, 5, 6, + new Node[] { new Node(0, 3, Orient.L), new Node(5, 3, Orient.R) }, + new Edge[] { new Edge(0, 1, 50, RouteCouple.OpenWhen1), new Edge(1, 0, 50, RouteCouple.OpenWhen1) }, + 0, 5, 50, 50, + Properties.Resources.ValveSw_XL_open, + Properties.Resources.ValveSw_XL_closed, + Properties.Resources.ValveSw_XL_vacuum, + Properties.Resources.ValveSw_XL_open_dry); + /// Diverter Shapes[DrShIx(Shape.Div, Sz.S)] = new DrawingShape(Shape.Div, Sz.S, 2, 2, new Node[] { new Node(2, 0, Orient.Up), new Node(1, 2, Orient.Dn), new Node(3, 2, Orient.Dn) }, @@ -523,12 +557,18 @@ namespace SchematicDrawing Shapes[DrShIx(Shape.Scale, Sz.L)] = new DrawingShape(Shape.Scale, Sz.L, 12, 11, new Node[] { new Node(6, 11, Orient.Dn) }, null, 0, 0, 120, 110, Properties.Resources.Scale_L); Shapes[DrShIx(Shape.Scale, Sz.XL)] = new DrawingShape(Shape.Scale, Sz.XL, 16, 13, new Node[] { new Node(8, 13, Orient.Dn) }, null, 0, 0, 160, 130, Properties.Resources.Scale_XL); - /// Tank + /// Tank uni Shapes[DrShIx(Shape.Tank, Sz.S)] = new DrawingShape(Shape.Tank, Sz.S, 10, 8, new Node[] { new Node(0, 6, Orient.L) }, null, 0, 0, 100, 80, Properties.Resources.Tank_S); Shapes[DrShIx(Shape.Tank, Sz.M)] = new DrawingShape(Shape.Tank, Sz.M, 12, 9, new Node[] { new Node(0, 7, Orient.L) }, null, 0, 0, 120, 90, Properties.Resources.Tank_M); Shapes[DrShIx(Shape.Tank, Sz.L)] = new DrawingShape(Shape.Tank, Sz.L, 15, 11, new Node[] { new Node(0, 9, Orient.L) }, null, 0, 0, 150, 110, Properties.Resources.Tank_L); Shapes[DrShIx(Shape.Tank, Sz.XL)] = new DrawingShape(Shape.Tank, Sz.XL, 20, 13, new Node[] { new Node(0, 11, Orient.L) }, null, 0, 0, 200, 130, Properties.Resources.Tank_XL); + /// Tank hot + Shapes[DrShIx(Shape.TankHot, Sz.S)] = new DrawingShape(Shape.TankHot, Sz.S, 10, 8, new Node[] { new Node(0, 6, Orient.L) }, null, 0, 0, 100, 80, Properties.Resources.Tank_S_hot); + Shapes[DrShIx(Shape.TankHot, Sz.M)] = new DrawingShape(Shape.TankHot, Sz.M, 12, 9, new Node[] { new Node(0, 7, Orient.L) }, null, 0, 0, 120, 90, Properties.Resources.Tank_M_hot); + Shapes[DrShIx(Shape.TankHot, Sz.L)] = new DrawingShape(Shape.TankHot, Sz.L, 15, 11, new Node[] { new Node(0, 9, Orient.L) }, null, 0, 0, 150, 110, Properties.Resources.Tank_L_hot); + Shapes[DrShIx(Shape.TankHot, Sz.XL)] = new DrawingShape(Shape.TankHot, Sz.XL, 20, 13, new Node[] { new Node(0, 11, Orient.L) }, null, 0, 0, 200, 130, Properties.Resources.Tank_XL_hot); + /// Junction Shapes[DrShIx(Shape.Junction, Sz.None)] = new DrawingShape(Shape.Junction, Sz.None, 0, 0, new Node[] { new Node(0, 0, Orient.R) }); Shapes[DrShIx(Shape.Junction, Sz.S)] = new DrawingShape(Shape.Junction, Sz.S, 2, 2, diff --git a/SchematicDrawing/Enums.cs b/SchematicDrawing/Enums.cs index 6bf0d6771..6ed27eeb8 100644 --- a/SchematicDrawing/Enums.cs +++ b/SchematicDrawing/Enums.cs @@ -45,11 +45,13 @@ namespace SchematicDrawing Scale, Sink, Tank, + TankHot, Tee, TempM, UniCB, Vacuum, Valve, + ValveSw, WaterM, ElectricM, diff --git a/SchematicDrawing/Properties/Resources.Designer.cs b/SchematicDrawing/Properties/Resources.Designer.cs index fad9b2f68..dd8d82bef 100644 --- a/SchematicDrawing/Properties/Resources.Designer.cs +++ b/SchematicDrawing/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace SchematicDrawing.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -730,6 +730,16 @@ namespace SchematicDrawing.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Tank_L_hot { + get { + object obj = ResourceManager.GetObject("Tank_L_hot", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -740,6 +750,16 @@ namespace SchematicDrawing.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Tank_M_hot { + get { + object obj = ResourceManager.GetObject("Tank_M_hot", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -750,6 +770,16 @@ namespace SchematicDrawing.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Tank_S_hot { + get { + object obj = ResourceManager.GetObject("Tank_S_hot", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -760,6 +790,16 @@ namespace SchematicDrawing.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Tank_XL_hot { + get { + object obj = ResourceManager.GetObject("Tank_XL_hot", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -970,6 +1010,166 @@ namespace SchematicDrawing.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_L_closed { + get { + object obj = ResourceManager.GetObject("ValveSw_L_closed", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_L_open { + get { + object obj = ResourceManager.GetObject("ValveSw_L_open", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_L_open_dry { + get { + object obj = ResourceManager.GetObject("ValveSw_L_open_dry", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_L_vacuum { + get { + object obj = ResourceManager.GetObject("ValveSw_L_vacuum", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_M_closed { + get { + object obj = ResourceManager.GetObject("ValveSw_M_closed", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_M_open { + get { + object obj = ResourceManager.GetObject("ValveSw_M_open", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_M_open_dry { + get { + object obj = ResourceManager.GetObject("ValveSw_M_open_dry", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_M_vacuum { + get { + object obj = ResourceManager.GetObject("ValveSw_M_vacuum", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_S_closed { + get { + object obj = ResourceManager.GetObject("ValveSw_S_closed", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_S_open { + get { + object obj = ResourceManager.GetObject("ValveSw_S_open", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_S_open_dry { + get { + object obj = ResourceManager.GetObject("ValveSw_S_open_dry", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_S_vacuum { + get { + object obj = ResourceManager.GetObject("ValveSw_S_vacuum", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_XL_closed { + get { + object obj = ResourceManager.GetObject("ValveSw_XL_closed", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_XL_open { + get { + object obj = ResourceManager.GetObject("ValveSw_XL_open", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_XL_open_dry { + get { + object obj = ResourceManager.GetObject("ValveSw_XL_open_dry", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ValveSw_XL_vacuum { + get { + object obj = ResourceManager.GetObject("ValveSw_XL_vacuum", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/SchematicDrawing/Properties/Resources.resx b/SchematicDrawing/Properties/Resources.resx index 2546e19f8..2c0c89b9c 100644 --- a/SchematicDrawing/Properties/Resources.resx +++ b/SchematicDrawing/Properties/Resources.resx @@ -319,6 +319,18 @@ ..\Pictures\Tank-XL.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Pictures\Tank-L-hot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\Tank-M-hot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\Tank-S-hot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\Tank-XL-hot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Pictures\Vacuum-L-dry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -373,7 +385,66 @@ ..\Pictures\Valve-XL-vacuum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - + + + + + + + ..\Pictures\ValveSw-L-closed.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-L-open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-L-open-dry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-L-vacuum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-M-closed.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-M-open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-M-open-dry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-M-vacuum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-S-closed.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-S-open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-S-open-dry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-S-vacuum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-XL-closed.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-XL-open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-XL-open-dry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Pictures\ValveSw-XL-vacuum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + + + + + + ..\Pictures\WaterM-L.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/SchematicDrawing/SchematicDrawing.csproj b/SchematicDrawing/SchematicDrawing.csproj index 1fe79deb8..09adf733c 100644 --- a/SchematicDrawing/SchematicDrawing.csproj +++ b/SchematicDrawing/SchematicDrawing.csproj @@ -118,6 +118,10 @@ + + + + diff --git a/SchematicDrawing/SchematicDrawingCtrl.cs b/SchematicDrawing/SchematicDrawingCtrl.cs index f21cf4f59..5c6c4eb66 100644 --- a/SchematicDrawing/SchematicDrawingCtrl.cs +++ b/SchematicDrawing/SchematicDrawingCtrl.cs @@ -365,7 +365,7 @@ namespace SchematicDrawing { GNode gnode = new GNode(item, nid); item.GNodes.Add(gnode); - graph.AddNode(gnode, dshape.Shape == Shape.Tank, dshape.Shape == Shape.Scale); + graph.AddNode(gnode, dshape.Shape == Shape.Tank || dshape.Shape == Shape.TankHot, dshape.Shape == Shape.Scale); } foreach (var edge in dshape.Edges) @@ -864,7 +864,7 @@ namespace SchematicDrawing /// Draw the component image Rectangle rect = dsh.GetRotatedFlippedImageRectangle(item); - if (item is IRouteBasedDrawingItem && routeBit == false /// closed + if (item is IRouteBasedDrawingItem && routeBit == false /// closed && item.GNodes.Count > 0 && item.GNodes[0].Dist < Const.Vacuum /// wet && dsh.HasClosedWet) /// has appropriate image { diff --git a/SharedDatabase/SharedDatabase.csproj b/SharedDatabase/SharedDatabase.csproj index c7006dbab..185aa5146 100644 --- a/SharedDatabase/SharedDatabase.csproj +++ b/SharedDatabase/SharedDatabase.csproj @@ -25,7 +25,7 @@ pdbonly true bin\Release\ - TRACE;LANG_PL + TRACE prompt 4 diff --git a/TBF.sln b/TBF.sln index 38d2129d3..2dc522326 100644 --- a/TBF.sln +++ b/TBF.sln @@ -5,16 +5,18 @@ VisualStudioVersion = 17.8.34330.188 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TBF", "TBF\TBF.csproj", "{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}" ProjectSection(ProjectDependencies) = postProject - {7EBEEA14-91C4-48D7-AF0A-7A4BC3FF9A28} = {7EBEEA14-91C4-48D7-AF0A-7A4BC3FF9A28} - {C8939821-BA5C-4988-A3D0-BF53B74865C7} = {C8939821-BA5C-4988-A3D0-BF53B74865C7} - {211B5E3F-9996-48A7-ABDE-C878DD2D71C2} = {211B5E3F-9996-48A7-ABDE-C878DD2D71C2} {0C0A1F4D-1363-4544-A7C5-196C76D26CCA} = {0C0A1F4D-1363-4544-A7C5-196C76D26CCA} {0F79CA69-9DBC-41F3-A6FC-5A2937365343} = {0F79CA69-9DBC-41F3-A6FC-5A2937365343} - {439D0878-C76E-452B-B17D-209A89E91D36} = {439D0878-C76E-452B-B17D-209A89E91D36} - {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} = {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} - {743DF7DB-C7B6-42EB-986D-0F485E5588E4} = {743DF7DB-C7B6-42EB-986D-0F485E5588E4} - {46E3B0E1-209F-4550-B0DD-D7E2C039B3CE} = {46E3B0E1-209F-4550-B0DD-D7E2C039B3CE} + {211B5E3F-9996-48A7-ABDE-C878DD2D71C2} = {211B5E3F-9996-48A7-ABDE-C878DD2D71C2} {32817BF9-E380-4467-9C7F-936F4B122BC7} = {32817BF9-E380-4467-9C7F-936F4B122BC7} + {439D0878-C76E-452B-B17D-209A89E91D36} = {439D0878-C76E-452B-B17D-209A89E91D36} + {46E3B0E1-209F-4550-B0DD-D7E2C039B3CE} = {46E3B0E1-209F-4550-B0DD-D7E2C039B3CE} + {743DF7DB-C7B6-42EB-986D-0F485E5588E4} = {743DF7DB-C7B6-42EB-986D-0F485E5588E4} + {7EBEEA14-91C4-48D7-AF0A-7A4BC3FF9A28} = {7EBEEA14-91C4-48D7-AF0A-7A4BC3FF9A28} + {8F942729-F454-4C99-BA6C-746962065AE3} = {8F942729-F454-4C99-BA6C-746962065AE3} + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} = {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} + {C8939821-BA5C-4988-A3D0-BF53B74865C7} = {C8939821-BA5C-4988-A3D0-BF53B74865C7} + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2} = {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Results", "Results\Results.csproj", "{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}" @@ -26,8 +28,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Config", "Config\Config.csp EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResultsBrowser", "ResultsBrowser\ResultsBrowser.csproj", "{07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}" ProjectSection(ProjectDependencies) = postProject - {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} = {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48} = {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48} + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} = {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceTest", "DeviceTest\DeviceTest.csproj", "{6D3384DC-4638-4A92-91A8-F39D900377C6}" @@ -104,6 +106,19 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LabelPrinting", "LabelPrint EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TBFTests", "TBFTests\TBFTests.csproj", "{77EB589F-C670-4489-AAD6-2A3C02061FD1}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppDiagnostic", "AppDiagnostic\AppDiagnostic.csproj", "{FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}" + ProjectSection(ProjectDependencies) = postProject + {8F942729-F454-4C99-BA6C-746962065AE3} = {8F942729-F454-4C99-BA6C-746962065AE3} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedComponents", "SharedComponents\SharedComponents.csproj", "{8F942729-F454-4C99-BA6C-746962065AE3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sensus.iPerl.RfidCom", "..\iPerlHead\Sensus.iPerl.RfidCom\Sensus.iPerl.RfidCom.csproj", "{A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sensus.iPerl.TestConsole", "..\iPerlHead\Sensus.iPerl.TestConsole\Sensus.iPerl.TestConsole.csproj", "{5025ED8B-A94F-4E58-8BE0-68481B061609}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NfcS5_DLL", "..\NfcS5_DLL\NfcS5_DLL.csproj", "{5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -127,15 +142,15 @@ Global {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Release|x86.ActiveCfg = Release|x86 {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Release|x86.Build.0 = Release|x86 {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Any CPU.Build.0 = Debug|Any CPU {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|x86.ActiveCfg = Debug|Any CPU {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Any CPU.Build.0 = Release|Any CPU {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Mixed Platforms.Build.0 = Release|Any CPU {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|x86.ActiveCfg = Release|Any CPU - {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Any CPU.Build.0 = Release|Any CPU {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|Any CPU.Build.0 = Debug|Any CPU {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -464,6 +479,66 @@ Global {77EB589F-C670-4489-AAD6-2A3C02061FD1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {77EB589F-C670-4489-AAD6-2A3C02061FD1}.Release|x86.ActiveCfg = Release|Any CPU {77EB589F-C670-4489-AAD6-2A3C02061FD1}.Release|x86.Build.0 = Release|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|x86.ActiveCfg = Debug|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|x86.Build.0 = Debug|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|Any CPU.Build.0 = Release|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|x86.ActiveCfg = Release|Any CPU + {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|x86.Build.0 = Release|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|x86.ActiveCfg = Debug|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|x86.Build.0 = Debug|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Release|Any CPU.Build.0 = Release|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Release|x86.ActiveCfg = Release|Any CPU + {8F942729-F454-4C99-BA6C-746962065AE3}.Release|x86.Build.0 = Release|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|x86.ActiveCfg = Debug|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|x86.Build.0 = Debug|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|Any CPU.Build.0 = Release|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|x86.ActiveCfg = Release|Any CPU + {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|x86.Build.0 = Release|Any CPU + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|x86.ActiveCfg = Debug|x86 + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|x86.Build.0 = Debug|x86 + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|Any CPU.Build.0 = Release|Any CPU + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|Mixed Platforms.Build.0 = Release|x86 + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|x86.ActiveCfg = Release|x86 + {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|x86.Build.0 = Release|x86 + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|x86.ActiveCfg = Debug|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|x86.Build.0 = Debug|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|Any CPU.Build.0 = Release|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|x86.ActiveCfg = Release|Any CPU + {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index 96405e871..82b21bf67 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.9.2143.2")] -[assembly: AssemblyFileVersion("3.9.2143.2")] +[assembly: AssemblyVersion("3.9.2144.1")] +[assembly: AssemblyFileVersion("3.9.2144.1")] diff --git a/TBF/Resources/Strings.Designer.cs b/TBF/Resources/Strings.Designer.cs index 2fb34f8b2..fdeb20e2d 100644 --- a/TBF/Resources/Strings.Designer.cs +++ b/TBF/Resources/Strings.Designer.cs @@ -401,6 +401,24 @@ namespace TBF.Resources { } } + /// + /// Looks up a localized string similar to Application diagnostic. + /// + internal static string AppDiagnostic { + get { + return ResourceManager.GetString("AppDiagnostic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Application diagnostic. + /// + internal static string Application_Diagnostic { + get { + return ResourceManager.GetString("Application_Diagnostic", resourceCulture); + } + } + /// /// Looks up a localized string similar to Approval. /// @@ -4775,6 +4793,15 @@ namespace TBF.Resources { } } + /// + /// Looks up a localized string similar to Reg. min step. + /// + internal static string RegulMinStep { + get { + return ResourceManager.GetString("RegulMinStep", resourceCulture); + } + } + /// /// Looks up a localized string similar to Relative Q from. /// diff --git a/TBF/Resources/Strings.resx b/TBF/Resources/Strings.resx index ecbc4fb1f..07bd257ef 100644 --- a/TBF/Resources/Strings.resx +++ b/TBF/Resources/Strings.resx @@ -197,6 +197,12 @@ Reg. valve + + + Reg. min step + + + Application diagnostic Scale @@ -2442,6 +2448,9 @@ Upgrade database + + + Application diagnostic About diff --git a/TBF/Rig/BuiltIn/SetValvesOp.cs b/TBF/Rig/BuiltIn/SetValvesOp.cs index 4ded37d00..5745b2d69 100644 --- a/TBF/Rig/BuiltIn/SetValvesOp.cs +++ b/TBF/Rig/BuiltIn/SetValvesOp.cs @@ -8,6 +8,7 @@ using Dirichlet.Numerics; using TBF.Boxes; using TBF.Rig.ControlBoard; using TBF.Rig.GenericDevices; +using System.Windows.Forms; namespace TBF.Rig.BuiltIn { @@ -194,66 +195,79 @@ namespace TBF.Rig.BuiltIn /// Only Elde.Valve valves are used, other valves on the lists are ignored public SetValvesOp(IControlBoard cb, bool open, OutputPath outPath, DateTimeBox timeStamp, FloatBox switchTime) { - this.cb = cb; - if (this.cb == null) throw new ArgumentNullException("ctrlBoard"); - - this.timeStamp = timeStamp; - this.switchTime = switchTime; - this.startStopValveBitNr = outPath.StartValve1 is Valve.Valve ? (outPath.StartValve1 as Valve.Valve).BitPosition : 0; - - IList none = new List(); /// An empty list of valves - switchPointsRaw = new List(); - - if (open) + try { - if (outPath.InvertSV1) - AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve1), 0); /// close SV1 + this.cb = cb; + if (this.cb == null) throw new ArgumentNullException("ctrlBoard"); + + this.timeStamp = timeStamp; + this.switchTime = switchTime; + this.startStopValveBitNr = outPath.StartValve1 is Valve.Valve ? (outPath.StartValve1 as Valve.Valve).BitPosition : 0; + + IList none = new List(); /// An empty list of valves + switchPointsRaw = new List(); + + if (open) + { + if (outPath.InvertSV1) + AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve1), 0); /// close SV1 + else + AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve1), none, 0); /// open SV1 + + if (outPath.StartValve2 != null) + { + if (outPath.InvertSV2) + AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve2), -outPath.LagSV2); /// close SV2 after lag + else + AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve2), none, -outPath.LagSV2); /// open SV2 after lag + } + + if (outPath.StartValve3 != null) + { + if (outPath.InvertSV3) + AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve3), -outPath.LagSV3); /// close SV3 after lag + else + AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve3), none, -outPath.LagSV3); /// open SV3 after lag + } + } else - AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve1), none, 0); /// open SV1 - - if (outPath.StartValve2 != null) { - if (outPath.InvertSV2) - AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve2), -outPath.LagSV2); /// close SV2 after lag + if (outPath.InvertSV1) + AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve1), none, 0); /// open SV1 else - AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve2), none, -outPath.LagSV2); /// open SV2 after lag + AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve1), 0); /// close SV1 + + if (outPath.StartValve2 != null) + { + if (outPath.InvertSV2) + AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve2), none, outPath.LagSV2); /// open SV2 after lag + else + AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve2), outPath.LagSV2); /// close SV2 after lag + } + + if (outPath.StartValve3 != null) + { + if (outPath.InvertSV3) + AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve3), none, outPath.LagSV3); /// open SV3 after lag + else + AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve3), outPath.LagSV3); /// close SV3 after lag + } } - if (outPath.StartValve3 != null) - { - if (outPath.InvertSV3) - AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve3), -outPath.LagSV3); /// close SV3 after lag - else - AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve3), none, -outPath.LagSV3); /// open SV3 after lag - } + switchPoints = SortAndMergeSwitchPoints(switchPointsRaw); + timeShift = -switchPoints[0].TimeSec; + MakeMasks(switchPoints, timeShift); } - else + catch (Exception ex) { - if (outPath.InvertSV1) - AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve1), none, 0); /// open SV1 - else - AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve1), 0); /// close SV1 - - if (outPath.StartValve2 != null) - { - if (outPath.InvertSV2) - AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve2), none, outPath.LagSV2); /// open SV2 after lag - else - AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve2), outPath.LagSV2); /// close SV2 after lag - } - - if (outPath.StartValve3 != null) - { - if (outPath.InvertSV3) - AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve3), none, outPath.LagSV3); /// open SV3 after lag - else - AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve3), outPath.LagSV3); /// close SV3 after lag - } + MessageBox.Show( + $"Chyba počas zastavenia regulácie prietoku, v ramci SetValvesOp():\n{ex.Message}\n\nStack trace:\n{ex.StackTrace}", + "Chyba", + MessageBoxButtons.OK, + MessageBoxIcon.Error + ); + throw; } - - switchPoints = SortAndMergeSwitchPoints(switchPointsRaw); - timeShift = -switchPoints[0].TimeSec; - MakeMasks(switchPoints, timeShift); } /// Start this operation diff --git a/TBF/Rig/ControlBoard/IControlBoard.cs b/TBF/Rig/ControlBoard/IControlBoard.cs index e427fcd7e..4fab38728 100644 --- a/TBF/Rig/ControlBoard/IControlBoard.cs +++ b/TBF/Rig/ControlBoard/IControlBoard.cs @@ -93,7 +93,7 @@ namespace TBF.Rig.ControlBoard /// Operation IOperation QueryMeasurementEndOp(); - void StopFlowControl(bool isFromUI, int regVId); + void StopFlowControl(bool isFromUI, int regVId, int regulationMinStep = 0); void StopAll(bool isFromUI); } diff --git a/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs b/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs index d54dc06c4..262f4d32e 100644 --- a/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs +++ b/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs @@ -492,7 +492,7 @@ namespace TBF.Rig.ControlBoard.Papouch return null; } - public void StopFlowControl(bool isFromUI, int rvId) + public void StopFlowControl(bool isFromUI, int rvId, int regulationMinStep = 0) { } diff --git a/TBF/Rig/ControlBoard/Uni/Action.cs b/TBF/Rig/ControlBoard/Uni/Action.cs index 549fef046..b271aed6e 100644 --- a/TBF/Rig/ControlBoard/Uni/Action.cs +++ b/TBF/Rig/ControlBoard/Uni/Action.cs @@ -55,6 +55,9 @@ namespace TBF.Rig.ControlBoard.Uni public int StabTime { get; set; } /// SetFlow public int InitDacVal { get; set; } /// SetFlow public int DivThreshold { get; set; } /// StartTest argument + public int RegulationMinStep { get; + set; + } public Action() @@ -78,6 +81,7 @@ namespace TBF.Rig.ControlBoard.Uni RVMovePar1 = 0; RVMovePar2 = 0; InitDacVal = 0; + RegulationMinStep = 0; } @@ -123,7 +127,7 @@ namespace TBF.Rig.ControlBoard.Uni } ///---------------------------------------------------------------------------------------------- - public static Action MeasureFlow(bool isFromUI, int flowMeterId) + public static Action MeasureFlow(bool isFromUI, int flowMeterId, int regulationMinStep = 0) { return new Action { @@ -163,7 +167,7 @@ namespace TBF.Rig.ControlBoard.Uni ///---------------------------------------------------------------------------------------------- public static Action SetFlow(bool isFromUI, int regValveId, double freqLo, double freqHi, - int pid, int stabTime_ms) + int pid, int stabTime_ms, int regulationMinStep = 0) { int rvMovePar1 = Convert.ToInt32(Math.Round(13.1072 * freqLo)); int rvMovePar2 = Convert.ToInt32(Math.Round(13.1072 * freqHi)); @@ -178,6 +182,7 @@ namespace TBF.Rig.ControlBoard.Uni RegVMode = RegValveMode.TargetFrequency, RVMovePar1 = rvMovePar1, RVMovePar2 = rvMovePar2, + //RegulationMinStep = regulationMinStep, PID = pid, TolerRV = (regValveId == TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx) ? Convert.ToInt32(Math.Round(13.1072 * 0.015 * freqLo)) : 0, @@ -207,7 +212,7 @@ namespace TBF.Rig.ControlBoard.Uni ///---------------------------------------------------------------------------------------------- public static Action StartTest(bool isFromUI, int flowMId, int divId, int divThreshold, bool isSyncMethod, bool isDivUsed, bool isDelayedStart, bool isStartStop, - bool isProlonged, int totalPulsesCount, int massPulsesCount = 0) + bool isProlonged, int totalPulsesCount, int massPulsesCount = 0, int regulationMinStep = 0) { return new Action { @@ -225,6 +230,7 @@ namespace TBF.Rig.ControlBoard.Uni TotalPulsesCount = totalPulsesCount, MassPulsesCount = (massPulsesCount <= 0) ? totalPulsesCount : massPulsesCount, StartStop = Command.Start, + //RegulationMinStep = regulationMinStep, }; } void SetStartTestArgs(Action action) @@ -272,7 +278,7 @@ namespace TBF.Rig.ControlBoard.Uni } ///---------------------------------------------------------------------------------------------- - public static Action RegVlvIncrMove(bool isFromUI, int regValveId, double timeSec) + public static Action RegVlvIncrMove(bool isFromUI, int regValveId, double timeSec, int regulationMinStep = 0) { int rvMovePar = Math.Abs(Convert.ToInt32(Math.Round(timeSec / 0.050))); /// Step is 50 ms @@ -285,6 +291,7 @@ namespace TBF.Rig.ControlBoard.Uni RegVMode = (timeSec >= 0) ? RegValveMode.PulseWidth : (RegValveMode.PulseWidth | RegValveMode.NegPulseWidth), RVMovePar1 = rvMovePar, RVMovePar2 = rvMovePar, + //RegulationMinStep = regulationMinStep, }; } void SetRegVlvIncrMoveArgs(Action action) @@ -293,6 +300,7 @@ namespace TBF.Rig.ControlBoard.Uni RegVMode = action.RegVMode; RVMovePar1 = action.RVMovePar1; RVMovePar2 = action.RVMovePar2; + //RegulationMinStep = action.RegulationMinStep; } /// Check whether new action arguments are compatible with alredy collected arguments (true = yes) bool CheckSharedRegVlvIncrMoveArgs(Action newAction) @@ -302,7 +310,7 @@ namespace TBF.Rig.ControlBoard.Uni } ///---------------------------------------------------------------------------------------------- - public static Action RegVlvMoveToPos(bool isFromUI, int regValveId, int adcValLo, int adcValHi = -1) + public static Action RegVlvMoveToPos(bool isFromUI, int regValveId, int adcValLo, int adcValHi = -1, int regulationMinStep = 0) { int rvMovePar1, rvMovePar2; @@ -318,7 +326,7 @@ namespace TBF.Rig.ControlBoard.Uni rvMovePar1 = Math.Max(adcValLo - 5, 0); rvMovePar2 = Math.Min(adcValLo + 5, 1023); } - + return new Action { ActionId = ActionID.RegVlvMoveToPos, @@ -328,6 +336,7 @@ namespace TBF.Rig.ControlBoard.Uni RegVMode = RegValveMode.TargetPosition, RVMovePar1 = rvMovePar1, RVMovePar2 = rvMovePar2, + //RegulationMinStep = regulationMinStep, }; } void SetRegVlvMoveToPosArgs(Action action) @@ -336,6 +345,7 @@ namespace TBF.Rig.ControlBoard.Uni RegVMode = action.RegVMode; RVMovePar1 = action.RVMovePar1; RVMovePar2 = action.RVMovePar2; + //RegulationMinStep = action.RegulationMinStep; } /// Check whether new action arguments are compatible with alredy collected arguments (true = yes) bool CheckSharedRegVlvMoveToPosArgs(Action newAction) @@ -345,7 +355,7 @@ namespace TBF.Rig.ControlBoard.Uni } ///---------------------------------------------------------------------------------------------- - public static Action RegVlvStop(bool isFromUI, int regValveId) + public static Action RegVlvStop(bool isFromUI, int regValveId, int RegulationMinStep = 0) { return new Action { @@ -356,6 +366,7 @@ namespace TBF.Rig.ControlBoard.Uni RegVMode = RegValveMode.Stop, RVMovePar1 = 0, RVMovePar2 = 0, + //RegulationMinStep = RegulationMinStep }; } void SetRegVlvStopArgs(Action action) @@ -364,6 +375,7 @@ namespace TBF.Rig.ControlBoard.Uni RegVMode = action.RegVMode; RVMovePar1 = action.RVMovePar1; RVMovePar2 = action.RVMovePar2; + //RegulationMinStep = action.RegulationMinStep; } /// Check whether new action arguments are compatible with alredy collected arguments (true = yes) bool CheckSharedRegVlvStopArgs(Action newAction) @@ -604,7 +616,8 @@ namespace TBF.Rig.ControlBoard.Uni combinedAction.TolerRV, combinedAction.StabTime, combinedAction.InitDacVal, - combinedAction.DivThreshold); + combinedAction.DivThreshold, + combinedAction.RegulationMinStep); return combinedAction; } diff --git a/TBF/Rig/ControlBoard/Uni/OutputMessage.cs b/TBF/Rig/ControlBoard/Uni/OutputMessage.cs index 2d1aeee75..1d51fff33 100644 --- a/TBF/Rig/ControlBoard/Uni/OutputMessage.cs +++ b/TBF/Rig/ControlBoard/Uni/OutputMessage.cs @@ -5,6 +5,8 @@ using System; using System.Diagnostics; using log4net; using Dirichlet.Numerics; +using Common; +using System.Web.Routing; namespace TBF.Rig.ControlBoard.Uni { @@ -88,7 +90,7 @@ namespace TBF.Rig.ControlBoard.Uni message[30] = (byte)(action.RVMovePar2 & 0xFF); message[31] = (byte)((action.RVMovePar2 >> 8) & 0xFF); message[32] = GetRVStopParam(action); - + /// DA1 message[33] = (byte)(arguments.InitDacVal & 0xFF); message[34] = (byte)((arguments.InitDacVal >> 8) & 0xFF); @@ -98,8 +100,21 @@ namespace TBF.Rig.ControlBoard.Uni message[37] = (byte)Math.Max(0, Math.Min(255, arguments.StabTime)); /// StabRV message[38] = (byte)((arguments.DivThreshold >> 2) & 0xFF); - message[39] = 0; - message[40] = 0; + //--- + message[39] = (byte)((action.RegulationMinStep << 4) & 0xFF); // ak 0 = koli kompatibilite, 1-6 = hodnoty prislusne pre spodnu saturaciu vypinacej periody casu + message[40] = (byte)((action.RegulationMinStep << 4) & 0xFF); + //--- + /*int x = 0; + if (action.RegVId == 1 || action.RegVId == 2) x = 3; + else if (action.RegVId == 3 || action.RegVId == 4) x = 5; + else if (action.RegVId == 5 || action.RegVId == 5) x = 3; + message[39] = (byte)((x << 4) & 0xFF); + message[40] = (byte)((x << 4) & 0xFF);*/ + /*//--- + message[39] = 0x50; // ak 0 = koli kompatibilite, 1-6 = hodnoty prislusne pre spodnu saturaciu vypinacej periody casu + message[40] = 0x50; + //---*/ + Debug.Assert(40 == PayloadLen + 2); /// Checksum (2 bytes) @@ -108,6 +123,8 @@ namespace TBF.Rig.ControlBoard.Uni message[PayloadLen + 3] = (byte)(checksum & 0xFF); message[PayloadLen + 4] = (byte)((checksum >> 8) & 0xFF); + log.Info(""); + return message; } @@ -151,11 +168,16 @@ namespace TBF.Rig.ControlBoard.Uni return (byte)0x20; } - if ((a.ActionId & ActionID.SetFlow) != 0 && a.RegVId == TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx) + else if ((a.ActionId & ActionID.SetFlow) != 0 && a.RegVId == TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx) { return (byte)0x42; } + /*else + { + return (a.RegulationMinStep >= 0 || a.RegulationMinStep <= 6)?(byte)(a.RegulationMinStep << 4):(byte)(7<<4); + }*/ + return 0; } } diff --git a/TBF/Rig/ControlBoard/Uni/StandingStartStopTestOp.cs b/TBF/Rig/ControlBoard/Uni/StandingStartStopTestOp.cs index aac89e6e3..f2732345c 100644 --- a/TBF/Rig/ControlBoard/Uni/StandingStartStopTestOp.cs +++ b/TBF/Rig/ControlBoard/Uni/StandingStartStopTestOp.cs @@ -2,6 +2,9 @@ /// Copyright (c) 2021 Sensus Slovensko a.s. /// using System; +using System.Reflection; +using System.Text; +using System.Windows.Forms; using log4net; using TBF.Rig.GenericDevices; @@ -16,7 +19,8 @@ namespace TBF.Rig.ControlBoard.Uni /// Set by the constructor /// readonly UniCB uniCB; - readonly TBF.Rig.Uni.FlowMeter.FlowMeter flowMeter; + readonly object flowMeter; + readonly TBF.Rig.Uni.FlowMetersInParallel.FlowMeter flowMeterInParallel; readonly TBF.Rig.Uni.Diverter.Diverter diverter; readonly int pulsesCount; /// Number of reference pulses for a complete test readonly bool withDiverter; /// Test with diverter (and scale) @@ -50,36 +54,119 @@ namespace TBF.Rig.ControlBoard.Uni public StandingStartStopTestOp(UniCB cb, OutputPath devices, int pulsesCount, bool withDiverter) { this.uniCB = cb; + try + { + flowMeter = devices.FlowMeter as TBF.Rig.Uni.FlowMeter.FlowMeter; + if(flowMeter == null) flowMeter = devices.FlowMeter as TBF.Rig.Uni.FlowMetersInParallel.FlowMeter; - flowMeter = devices.FlowMeter as TBF.Rig.Uni.FlowMeter.FlowMeter; - if (flowMeter == null) throw new ArgumentNullException("Invalid flow meter"); + if (flowMeter == null) throw new ArgumentNullException("Invalid flow meter"); + } + catch (Exception ex) + { + string deviceInfo = GetAllDevicesInfo(devices); + string flowMeterStatus = devices.FlowMeter == null + ? "devices.FlowMeter je NULL" + : $"devices.FlowMeter je typu: {devices.FlowMeter.GetType().FullName}"; + + MessageBox.Show( + $"Chyba počas zastavenia regulácie prietoku, v ramci StandingStartStopTestOp() pre flowMeter:\n" + + $"{ex.Message}\n\n" + + $"Diagnostika:\n{flowMeterStatus}\n\n" + + $"{deviceInfo}\n\n" + + $"Stack trace:\n{ex.StackTrace}", + "Chyba", + MessageBoxButtons.OK, + MessageBoxIcon.Error + ); + + throw; + } this.pulsesCount = pulsesCount; this.withDiverter = withDiverter; if (withDiverter) { - diverter = devices.Diverter as TBF.Rig.Uni.Diverter.Diverter; - if (diverter == null) throw new ArgumentNullException("Invalid diverter"); + try + { + diverter = devices.Diverter as TBF.Rig.Uni.Diverter.Diverter; + if (diverter == null) throw new ArgumentNullException("Invalid diverter"); + } + catch (Exception ex) + { + string deviceInfo = GetAllDevicesInfo(devices); + + MessageBox.Show( + $"Chyba počas zastavenia regulácie prietoku, v ramci StandingStartStopTestOp() pre diverter:\n" + + $"{ex.Message}\n\n{deviceInfo}\n\nStack trace:\n{ex.StackTrace}", + "Chyba", + MessageBoxButtons.OK, + MessageBoxIcon.Error + ); + + throw; + } } log.Debug(this.ToString()); } - /// + string GetAllDevicesInfo(object obj) + { + if (obj == null) return "devices objekt je null."; + + StringBuilder sb = new StringBuilder(); + sb.AppendLine("Zoznam zariadení v devices:"); + + var props = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); + foreach (var prop in props) + { + try + { + object value = prop.GetValue(obj); + string valueStr = value != null ? value.ToString() : "null"; + sb.AppendLine($"{prop.Name}: {valueStr}"); + } + catch (Exception ex) + { + sb.AppendLine($"{prop.Name}: [Chyba pri načítaní - {ex.Message}]"); + } + } + + return sb.ToString(); + } + + /// /// Start this operation /// - public void Start() + public void Start() { - log.InfoFormat("Start() Et#={0} pulses={1} withDiverter={2}", flowMeter.Idx1, pulsesCount, withDiverter); + if (flowMeter is TBF.Rig.Uni.FlowMeter.FlowMeter) + { + log.InfoFormat("Start() Et#={0} pulses={1} withDiverter={2}", ((TBF.Rig.Uni.FlowMeter.FlowMeter)flowMeter).Idx1, pulsesCount, withDiverter); - /// Start the test (and the flow measurement) - if (withDiverter) { uniCB.DivResolution = diverter.Resolution; } - uniCB.SetActivity(Activity.StandingStartStopTest); - uniCB.StartTest(false, flowMeter.Idx1, (withDiverter ? diverter.DiverterNr : 0), 0, - false, withDiverter, false, true, false, pulsesCount); + /// Start the test (and the flow measurement) + if (withDiverter) { uniCB.DivResolution = diverter.Resolution; } + uniCB.SetActivity(Activity.StandingStartStopTest); + uniCB.StartTest(false, ((TBF.Rig.Uni.FlowMeter.FlowMeter)flowMeter).Idx1, (withDiverter ? diverter.DiverterNr : 0), 0, + false, withDiverter, false, true, false, pulsesCount); - opState = OpState.StartingTest; + opState = OpState.StartingTest; + } + else if (flowMeter is TBF.Rig.Uni.FlowMetersInParallel.FlowMeter) + { + log.InfoFormat("Start() Et#={0} pulses={1} withDiverter={2}", ((TBF.Rig.Uni.FlowMetersInParallel.FlowMeter)flowMeter).Idx1, pulsesCount, withDiverter); + + /// Start the test (and the flow measurement) + if (withDiverter) { uniCB.DivResolution = diverter.Resolution; } + uniCB.SetActivity(Activity.StandingStartStopTest); + uniCB.StartTest(false, ((TBF.Rig.Uni.FlowMetersInParallel.FlowMeter)flowMeter).Idx1, (withDiverter ? diverter.DiverterNr : 0), 0, + false, withDiverter, false, true, false, pulsesCount); + + opState = OpState.StartingTest; + } + + } /// diff --git a/TBF/Rig/ControlBoard/Uni/UniCB.cs b/TBF/Rig/ControlBoard/Uni/UniCB.cs index cedcc4353..ef5dd1d33 100644 --- a/TBF/Rig/ControlBoard/Uni/UniCB.cs +++ b/TBF/Rig/ControlBoard/Uni/UniCB.cs @@ -17,6 +17,8 @@ using TBF.Boxes; using TBF.Rig.GenericDevices; using TBF.Rig.Sequences; using TBF.UiBridge; +using AppDiagnostic; +using SharedComponents; namespace TBF.Rig.ControlBoard.Uni { @@ -547,7 +549,7 @@ namespace TBF.Rig.ControlBoard.Uni if (!outputsInitialized || (outputLatch & routeMask) != (route & routeMask)) /// || (StateMachine.Time - lastStateMachineTime) >= 15) { - var actionsToModify = actionQueue.Where(x => (x.ActionId == ActionID.ChangeRoute)); + var actionsToModify = actionQueue.Where(x => (x.ActionId == ActionID.ChangeRoute)); bool oneModified = false; foreach (var a in actionsToModify) { @@ -573,7 +575,11 @@ namespace TBF.Rig.ControlBoard.Uni var combinedAction = Action.FetchNonConflictingActions(actionQueue); /// Default action is RequestDataOnly + + combinedAction.RegulationMinStep = devices.RegulMinStep; + byte[] outData = OutputMessage.GetMessage(combinedAction, config, (ulong)valvesToInvert); + if (outData != null && outData.Length > 0) { if ((combinedAction.ActionId & ActionID.ChangeRoute) != 0) @@ -595,7 +601,7 @@ namespace TBF.Rig.ControlBoard.Uni { serialPort.Write(outData, 0, outData.Length); lastSentTime = DateTime.Now; - } + } log.Debug(" " + OutputMessage.Caption()); log.Debug(Telegram.LogTelegram(string.Format("Sent {0}: ", lastSentTime.ToString("HH:mm:ss")), outData)); @@ -615,7 +621,7 @@ namespace TBF.Rig.ControlBoard.Uni { } - #endregion +#endregion #region IControlBoard interface @@ -781,12 +787,13 @@ namespace TBF.Rig.ControlBoard.Uni #endregion - public void MeasureFlow(bool isFromUI, int flowMeterId) + public void MeasureFlow(bool isFromUI, int flowMeterId, int regulationMinStep = 0) { if (IsUIBlocked && isFromUI) return; - actionQueue.Enqueue(Action.MeasureFlow(isFromUI, flowMeterId)); + actionQueue.Enqueue(Action.MeasureFlow(isFromUI, flowMeterId, regulationMinStep)); log.InfoFormat("Enqueue( MeasureFlow(fm={0}) )", flowMeterId); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } @@ -794,12 +801,13 @@ namespace TBF.Rig.ControlBoard.Uni /// To be used with a regulation valve controlled by incremental pulses. /// Stability time is fixed: 200 ms /// - public void SetFlow(bool isFromUI, int regVId, double freqLo, double freqHi) + public void SetFlow(bool isFromUI, int regVId, double freqLo, double freqHi, int regulationMinStep = 0) { if (IsUIBlocked && isFromUI) return; - actionQueue.Enqueue(Action.SetFlow(isFromUI, regVId, freqLo, freqHi, Convert.ToInt32(Math.Round(Devices.PidCoef)), 200)); + actionQueue.Enqueue(Action.SetFlow(isFromUI, regVId, freqLo, freqHi, Convert.ToInt32(Math.Round(Devices.PidCoef)), 200, regulationMinStep)); log.InfoFormat("Enqueue( SetFlow(rv={0}, fLo={1}, fHi={2}, pid={3}) )", regVId, freqLo, freqHi, Convert.ToInt32(Math.Round(Devices.PidCoef))); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } @@ -814,22 +822,23 @@ namespace TBF.Rig.ControlBoard.Uni totalPulsesCount, massPulsesCount)); log.InfoFormat("Enqueue( StartTest(fm={0}, div={1}, Sync={2}, withDiv={3}, s/s={4}, prolonged={5} pulsesCount={6} massPulsesCount={7}) )", flowMId, divId, isSyncMethod, isDivUsed, isStartStop, isProlonged, totalPulsesCount, massPulsesCount); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } - public void StopFlowControl(bool isFromUI, int regVId) + public void StopFlowControl(bool isFromUI, int regVId, int regulationMinStep = 0) { if (IsUIBlocked && isFromUI) return; if (regVId < TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx) { - actionQueue.Enqueue(Action.RegVlvStop(isFromUI, regVId)); + actionQueue.Enqueue(Action.RegVlvStop(isFromUI, regVId, regulationMinStep)); log.InfoFormat("Enqueue( RegVlvStop(rv={0}) )", regVId); } else if (regVId == TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx) { int dacVal = Data.StavDA[0]; - actionQueue.Enqueue(Action.RegVlvMoveToPos(isFromUI, regVId, dacVal)); + actionQueue.Enqueue(Action.RegVlvMoveToPos(isFromUI, regVId, dacVal, regulationMinStep)); log.InfoFormat("Enqueue( RegVlvMoveToPos(rv={0}, positionLo={1}) )", regVId, dacVal); } foreach (var a in actionQueue) log.DebugFormat(" {0}", a); @@ -841,6 +850,7 @@ namespace TBF.Rig.ControlBoard.Uni actionQueue.Enqueue(Action.Stop(isFromUI)); log.InfoFormat("Enqueue( Stop() )"); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } @@ -849,11 +859,11 @@ namespace TBF.Rig.ControlBoard.Uni /// /// Reg. valve ID /// Time in seconds, positive value opens the reg. valve - public void RegVlvIncrMove(bool isFromUI, int regVId, double time) + public void RegVlvIncrMove(bool isFromUI, int regVId, double time, int regulationMinStep = 0) { if (IsUIBlocked && isFromUI || regVId >= TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx) return; - var newAction = Action.RegVlvIncrMove(isFromUI, regVId, time); + var newAction = Action.RegVlvIncrMove(isFromUI, regVId, time, regulationMinStep); var actionsToModify = actionQueue.Where(x => (x.ActionId == ActionID.RegVlvIncrMove && x.RegVId == newAction.RegVId)); bool oneModified = false; @@ -870,7 +880,7 @@ namespace TBF.Rig.ControlBoard.Uni oneModified = true; log.InfoFormat("RegVlvIncrMove(UI={0}, RV={1}, time={2}) ... an action in the queue modified", isFromUI, regVId, time); } - + if (!oneModified) { actionQueue.Enqueue(newAction); @@ -885,12 +895,13 @@ namespace TBF.Rig.ControlBoard.Uni /// /// Reg. valve ID /// Reg. valve position (0 .. 1.0) - public void RegVlvMoveToPos(bool isFromUI, int regVId, int adcValLo, int adcValHi = -1) + public void RegVlvMoveToPos(bool isFromUI, int regVId, int adcValLo, int adcValHi = -1, int regulationMinStep = 0) { if (IsUIBlocked && isFromUI || regVId > TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx) return; - actionQueue.Enqueue(Action.RegVlvMoveToPos(isFromUI, regVId, adcValLo, adcValHi)); + actionQueue.Enqueue(Action.RegVlvMoveToPos(isFromUI, regVId, adcValLo, adcValHi, regulationMinStep)); log.InfoFormat("Enqueue( RegVlvMoveToPos(rv={0}, positionLo={1}, positionHi={2}) )", regVId, adcValLo, adcValHi); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } @@ -907,6 +918,7 @@ namespace TBF.Rig.ControlBoard.Uni actionQueue.Enqueue(Action.Stop(isFromUI)); } log.InfoFormat("Enqueue( SwitchDiverter(div#={0}, toTank={1}) )", divNr1, toTank); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } @@ -916,6 +928,7 @@ namespace TBF.Rig.ControlBoard.Uni actionQueue.Enqueue(Action.DelayStartOrStop(isFromUI)); log.InfoFormat("Enqueue( DelayStartOrStop() )"); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } @@ -930,6 +943,7 @@ namespace TBF.Rig.ControlBoard.Uni DivTransitionData.DiverterAssociationValidUntil = StateMachine.Time + 5; actionQueue.Enqueue(Action.GetDiverterTransitionData(isFromUI)); log.InfoFormat("Enqueue( GetDiverterTransitionData(div#={0}, toTank={1}) )", diverter.DiverterNr, toTank); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } @@ -939,6 +953,7 @@ namespace TBF.Rig.ControlBoard.Uni actionQueue.Enqueue(Action.GetScopeAnalyzerData(isFromUI)); log.InfoFormat("Enqueue( GetScopeAnalyzerData() )"); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } @@ -948,6 +963,7 @@ namespace TBF.Rig.ControlBoard.Uni actionQueue.Enqueue(Action.ResetScopeAnalyzer(isFromUI)); log.InfoFormat("Enqueue( ResetScopeAnalyzer() )"); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } @@ -957,6 +973,7 @@ namespace TBF.Rig.ControlBoard.Uni actionQueue.Enqueue(Action.GetSwitchCounterData(isFromUI)); log.InfoFormat("Enqueue( GetSwitchCounterData() )"); + foreach (var a in actionQueue) log.DebugFormat(" {0}", a); } diff --git a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.Designer.cs b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.Designer.cs index 49f2f7776..b55c4afc0 100644 --- a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.Designer.cs +++ b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.Designer.cs @@ -33,10 +33,9 @@ namespace TBF.Rig.DataEntry.iPerl { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CycleBeginningForm)); this.okButton = new System.Windows.Forms.Button(); - this.orderGroupBox = new System.Windows.Forms.GroupBox(); - this.orderComboBox = new System.Windows.Forms.ComboBox(); this.pictureBox = new System.Windows.Forms.PictureBox(); - this.orderGroupBox.SuspendLayout(); + this.orderComboBox = new TBF.UI.Shared.SuggestComboBox(); + this.labelOrder = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); this.SuspendLayout(); // @@ -48,50 +47,53 @@ namespace TBF.Rig.DataEntry.iPerl this.okButton.UseVisualStyleBackColor = true; this.okButton.Click += new System.EventHandler(this.okButton_Click); // - // orderGroupBox - // - this.orderGroupBox.Controls.Add(this.orderComboBox); - resources.ApplyResources(this.orderGroupBox, "orderGroupBox"); - this.orderGroupBox.ForeColor = System.Drawing.Color.Black; - this.orderGroupBox.Name = "orderGroupBox"; - this.orderGroupBox.TabStop = false; - // - // orderComboBox - // - this.orderComboBox.FormattingEnabled = true; - resources.ApplyResources(this.orderComboBox, "orderComboBox"); - this.orderComboBox.Name = "orderComboBox"; - // // pictureBox // resources.ApplyResources(this.pictureBox, "pictureBox"); this.pictureBox.Name = "pictureBox"; this.pictureBox.TabStop = false; // + // orderComboBox + // + this.orderComboBox.DropDownHeight = 530; + this.orderComboBox.FilterRule = null; + resources.ApplyResources(this.orderComboBox, "orderComboBox"); + this.orderComboBox.FormattingEnabled = true; + this.orderComboBox.Name = "orderComboBox"; + this.orderComboBox.PropertySelector = null; + this.orderComboBox.SuggestBoxHeight = 192; + this.orderComboBox.SuggestListOrderRule = null; + // + // labelOrder + // + resources.ApplyResources(this.labelOrder, "labelOrder"); + this.labelOrder.Name = "labelOrder"; + // // CycleBeginningForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.DarkGray; + this.Controls.Add(this.labelOrder); + this.Controls.Add(this.orderComboBox); this.Controls.Add(this.pictureBox); - this.Controls.Add(this.orderGroupBox); this.Controls.Add(this.okButton); this.ForeColor = System.Drawing.Color.Black; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.Name = "CycleBeginningForm"; this.TopMost = true; this.Load += new System.EventHandler(this.CycleBeginningForm_Load); - this.orderGroupBox.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); this.ResumeLayout(false); + this.PerformLayout(); } #endregion private System.Windows.Forms.Button okButton; - private System.Windows.Forms.GroupBox orderGroupBox; - private System.Windows.Forms.ComboBox orderComboBox; private System.Windows.Forms.PictureBox pictureBox; + private UI.Shared.SuggestComboBox orderComboBox; + private System.Windows.Forms.Label labelOrder; } } \ No newline at end of file diff --git a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs index c93de56d2..2c9e579b7 100644 --- a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs +++ b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs @@ -11,7 +11,6 @@ using TBF.Rig.Sequences; using TBF.Rig.Output.DB.SensusOracle; using TBF.Resources; using System.Drawing; -using NHibernate; namespace TBF.Rig.DataEntry.iPerl { @@ -24,8 +23,7 @@ namespace TBF.Rig.DataEntry.iPerl readonly EntryFormCfg cfg; /// Loaded from database beforethe form is open - IList listOfOrders; - string preselectedOrder; + IList listOfOrders; /// To be retrieved after the form is closed public string PurchaseOrder; @@ -42,7 +40,6 @@ namespace TBF.Rig.DataEntry.iPerl { InitializeComponent(); ControlBox = false; - preselectedOrder = null; completed = false; StartForceCloseHandler(); @@ -53,12 +50,11 @@ namespace TBF.Rig.DataEntry.iPerl /// Constructor /// /// Number of text boxes for serial numbers - public CycleBeginningForm(int waterMetersCount, EntryFormCfg cfg, string preselectedOrder = null) + public CycleBeginningForm(int waterMetersCount, EntryFormCfg cfg) : this() { this.WaterMetersCount = waterMetersCount; this.cfg = cfg; - this.preselectedOrder = preselectedOrder; SNText = null; Disabled = null; } @@ -67,49 +63,12 @@ namespace TBF.Rig.DataEntry.iPerl private void CycleBeginningForm_Load(object sender, EventArgs e) { Text = Strings.Data; - orderGroupBox.Text = Strings.Purchase_order; + labelOrder.Text = Strings.Purchase_order; okButton.Text = Strings.OkBtnText; - listOfOrders = new List(); - - if ((cfg.Orders == Orders.FromOracle || cfg.Orders == Orders.CombinedAndFromOracle) - && ProcessData.OracleDB != null) - { - foreach (var o in ProcessData.OracleDB.ReadOrders()) - { - listOfOrders.Add(o); - } - } - - if ((cfg.Orders == Orders.FromTracingDB || cfg.Orders == Orders.CombinedAndFromTracingDB) - && ProcessData.TracingDB != null - && ProcessData.TracingDB.DebugLevel == DebugMode.Normal) - { - foreach (var o in ProcessData.TracingDB.ReadOrders()) - { - listOfOrders.Add(o); - } - } - - string insertFirst = null; - if (!string.IsNullOrEmpty(preselectedOrder)) - { - insertFirst = preselectedOrder; - } - else - { - if (Program.LocalSettings.PurchaseOrderHistoryCount > 0) - { - foreach (var o in listOfOrders) - { - if (o.POName == Program.LocalSettings.PurchaseOrderHistory[0]) - { - insertFirst = o.POName; - break; - } - } - } - } + listOfOrders = ((cfg.Orders == Orders.FromOracle || cfg.Orders == Orders.CombinedAndFromOracle) && ProcessData.OracleDB != null) + ? ProcessData.OracleDB.ReadOrders() + : new List(); switch (cfg.Orders) { @@ -117,71 +76,25 @@ namespace TBF.Rig.DataEntry.iPerl PrepareOrderCombo(orderComboBox); break; - case Orders.FromOracle: - case Orders.FromTracingDB: - if (insertFirst != null) - { - orderComboBox.Items.Add(insertFirst); - orderComboBox.Text = insertFirst; - } - - foreach (var o in listOfOrders) - if (o.POName != insertFirst) - orderComboBox.Items.Add(o.POName); - break; - case Orders.CombinedAndFromOracle: - case Orders.CombinedAndFromTracingDB: - if (insertFirst != null) - { - orderComboBox.Items.Add(insertFirst); - orderComboBox.Text = insertFirst; - } - orderComboBox.Items.Add("BBAAMMXX"); - orderComboBox.Items.Add("BBAAOMXX"); - orderComboBox.Items.Add("BBAAQMXX"); - orderComboBox.Items.Add("BBAATMFR"); - orderComboBox.Items.Add("BBAATMXX"); - orderComboBox.Items.Add("CCAAMMXX"); - orderComboBox.Items.Add("CCAAOMXX"); - orderComboBox.Items.Add("CCAAQMXX"); - orderComboBox.Items.Add("CCAATMFR"); - orderComboBox.Items.Add("CCAATMXX"); - orderComboBox.Items.Add("DDAAMMXX"); - orderComboBox.Items.Add("DDAAOMXX"); - orderComboBox.Items.Add("DDAAQMXX"); - orderComboBox.Items.Add("DDAATMXX"); - orderComboBox.Items.Add("DEAAMMXX"); - orderComboBox.Items.Add("DEAAOMXX"); - orderComboBox.Items.Add("DEAAQMXX"); - orderComboBox.Items.Add("DEAATMXX"); - orderComboBox.Items.Add("EEAAMMXX"); - orderComboBox.Items.Add("EEAAOMXX"); - orderComboBox.Items.Add("EEAAQMXX"); - orderComboBox.Items.Add("EEAATMFR"); - orderComboBox.Items.Add("EEAATMXX"); - orderComboBox.Items.Add("FFAAMMXX"); - orderComboBox.Items.Add("FFAAOMXX"); - orderComboBox.Items.Add("FFAAQMXX"); - orderComboBox.Items.Add("FFAATMFR"); - orderComboBox.Items.Add("FFAATMXX"); - orderComboBox.Items.Add("GFAAMMXX"); - orderComboBox.Items.Add("GFAAOMXX"); - orderComboBox.Items.Add("GFAAQMXX"); - orderComboBox.Items.Add("GFAATMXX"); + case Orders.FromOracle: foreach (var o in listOfOrders) - if (o.POName != insertFirst) - orderComboBox.Items.Add(o.POName); + { + orderComboBox.Items.Add(o.POName + " - " + o.SNPrefix); + } + if (Program.LocalSettings.PurchaseOrderHistoryCount > 0) + orderComboBox.SelectedIndex = orderComboBox.FindString(Program.LocalSettings.PurchaseOrderHistory[0]); + break; } /// /// Draw an appropriate test bench picture /// - Side side = (TBF.Rig.Sequences.ProcessData.BenchInfo is DataContainer.iPerlBenchInfo.Component) - ? (TBF.Rig.Sequences.ProcessData.BenchInfo as DataContainer.iPerlBenchInfo.Component).Side - : Side.Left; + Side side = (ProcessData.BenchInfo is DataContainer.iPerlBenchInfo.Component) + ? (ProcessData.BenchInfo as DataContainer.iPerlBenchInfo.Component).Side + : Side.Left; if ((cfg.Direction == Direction.Reversed_LR) && (side == Side.Left)) { /// direction L->R (reversed), left side @@ -202,7 +115,9 @@ namespace TBF.Rig.DataEntry.iPerl /// direction R->L (forward), left side pictureBox.Image = Image.FromFile(string.Format("{0}\\Pictures\\forward_dir_left.jpg", Program.ExecutableDir, true)); } - } + pictureBox.SendToBack(); + + } /// /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array @@ -223,45 +138,20 @@ namespace TBF.Rig.DataEntry.iPerl private void okButton_Click(object sender, EventArgs e) { - if (orderComboBox.Text.Length > 8 || - (cfg.Orders != Orders.Arbitrary && !orderComboBox.Items.Contains(orderComboBox.Text))) + PurchaseOrder = orderComboBox.Text.Split(' ')[0].Trim(); + + if (PurchaseOrder.Length > 10 || + (cfg.Orders != Orders.Arbitrary && orderComboBox.FindString(PurchaseOrder) < 0)) { MessageBox.Show(Strings.Invalid_order_number, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } - IOrderInfo oInfo = (listOfOrders == null) ? null : listOfOrders.FirstOrDefault(x => x.POName == orderComboBox.Text); - /// - if (oInfo is Output.DB.SensusOracle.OrderDetails) - { - ProcessData.OrderInfo = oInfo; - } - else if (oInfo is SharedDatabase.Entities.OrderInfo && ProcessData.TracingDB != null) - { - try - { - using (var session = ProcessData.TracingDB.SessionFactory.OpenSession()) - { - var list = session.QueryOver() - .Where(x => (x.POName == Program.MainWnd.SelectedProcedure.OrderInfo.POName)) - .List(); - ProcessData.OrderInfo = (list.Count == 1) ? list[0] : null; - string workflow = (list.Count == 1) ? list[0].Workflow : null; - ProcessData.WorkflowSummary = SharedDatabase.WorkflowSummary.ReadFromDB(workflow, "test", session); - session.Close(); - } - } - catch (Exception ex) - { - log.ErrorFormat("Unable to load an order, workflow or workstep: {0}", ex); - ProcessData.OrderInfo = null; - ProcessData.WorkflowSummary = null; - } - } + ProcessData.OrderDetails = (listOfOrders == null) ? null : listOfOrders.FirstOrDefault(x => x.POName == orderComboBox.Text); - PurchaseOrder = orderComboBox.Text; - Program.LocalSettings.UpdateHistory(orderComboBox.Text, ref Program.LocalSettings.PurchaseOrderHistory); + + Program.LocalSettings.UpdateHistory(PurchaseOrder, ref Program.LocalSettings.PurchaseOrderHistory); completed = true; Close(); @@ -285,6 +175,6 @@ namespace TBF.Rig.DataEntry.iPerl Close(); } - #endregion - } + #endregion + } } diff --git a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.resx b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.resx index 5e7e06de5..99acf52f6 100644 --- a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.resx +++ b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.resx @@ -122,10 +122,14 @@ Verdana, 14.25pt - 627, 26 + 836, 32 + + + + 4, 4, 4, 4 - 112, 63 + 149, 78 @@ -144,61 +148,16 @@ $this - 2 - - - 90, 32 - - - 432, 31 - - - 0 - - - orderComboBox - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - orderGroupBox - - - 0 - - - Verdana, 14.25pt - - - 28, 12 - - - 565, 82 - - - 0 - - - Order - - - orderGroupBox - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 + 4 - 28, 118 + 37, 145 + + + 4, 4, 4, 4 - 711, 497 + 948, 612 8 @@ -213,19 +172,79 @@ $this - 0 + 3 + + + Verdana, 14.25pt + + + False + + + 37, 73 + + + 777, 37 + + + 10 + + + orderComboBox + + + TBF.UI.Shared.SuggestComboBox, TBF, Version=2.33.2152.0, Culture=neutral, PublicKeyToken=null + + + $this + + + 2 + + + True + + + Verdana, 14.25pt + + + 32, 32 + + + 83, 29 + + + 11 + + + label1 + + + labelOrder + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 True - 6, 13 + 8, 16 True - 769, 639 + 1025, 786 + + + 4, 4, 4, 4 Batch data diff --git a/TBF/Rig/DataEntry/iPerl/EntryForm.cs b/TBF/Rig/DataEntry/iPerl/EntryForm.cs index 51f3dbd92..3a175b684 100644 --- a/TBF/Rig/DataEntry/iPerl/EntryForm.cs +++ b/TBF/Rig/DataEntry/iPerl/EntryForm.cs @@ -7,7 +7,6 @@ using log4net; using Config.Entities; using TBF.Rig; using TBF.Rig.GenericDevices; -using TBF.Rig.Sequences; namespace TBF.Rig.DataEntry.iPerl { @@ -85,7 +84,7 @@ namespace TBF.Rig.DataEntry.iPerl { if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); currentOp = CurrentOp.ShowFormAtCycleBeginning; - this.waterMeters = ProcessData.BatchRslts.Batch.WaterMeters; + this.waterMeters = TBF.Rig.Sequences.ProcessData.BatchRslts.Batch.WaterMeters; return this; } @@ -98,10 +97,6 @@ namespace TBF.Rig.DataEntry.iPerl return this; } - /// null (not implemented) - public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } - public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } - /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) { @@ -118,8 +113,7 @@ namespace TBF.Rig.DataEntry.iPerl /// void OpenBeginningDlg(EntryForm myRef) { - myRef.modelessDlg = new CycleBeginningForm(TBF.Data.WMsCount, myRef.entryFormCfg, - ProcessData.SelectedProcedure.OrderInfo != null ? ProcessData.SelectedProcedure.OrderInfo.POName : string.Empty); + myRef.modelessDlg = new CycleBeginningForm(TBF.Data.WMsCount, myRef.entryFormCfg); modelessDlg.Show(); } /// @@ -142,16 +136,7 @@ namespace TBF.Rig.DataEntry.iPerl switch (currentOp) { case CurrentOp.ShowFormAtCycleBeginning: - if (ProcessData.SelectedProcedure.OrderInfo == null || entryFormCfg.Direction != Direction.S640) - { - Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); - } - else - { - /// Only in case of 640 meters and an order information entered during the procedure selection - /// this DataEntry form at the beginning of the cycle is skipped - modelessDlg = null; - } + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); break; case CurrentOp.EnterTestStartStates: Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); @@ -166,17 +151,7 @@ namespace TBF.Rig.DataEntry.iPerl /// Event.ResultsPrinted public Event Run() { - if (ProcessData.SelectedProcedure.OrderInfo != null && entryFormCfg.Direction == Direction.S640) - { - for (int i = 0; i < waterMeters.Count; i++) - { - if (waterMeters[i] != null) - waterMeters[i].PurchaseOrder = ProcessData.SelectedProcedure.OrderInfo.POName; - } - return Event.ModelessFormClosed; - } - - if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) { return Event.ModelessFormIsOpen; } @@ -239,5 +214,26 @@ namespace TBF.Rig.DataEntry.iPerl } currentOp = CurrentOp.None; } - } + + public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp = false) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + this.waterMeters = waterMeters; + // Handle isCondOp if necessary + return this; + } + + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = volumeRef; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + } } diff --git a/TBF/Rig/DataEntry/iPerl/EntryFormCfg.cs b/TBF/Rig/DataEntry/iPerl/EntryFormCfg.cs index 69b9faa07..607318220 100644 --- a/TBF/Rig/DataEntry/iPerl/EntryFormCfg.cs +++ b/TBF/Rig/DataEntry/iPerl/EntryFormCfg.cs @@ -32,23 +32,17 @@ namespace TBF.Rig.DataEntry.iPerl public enum Orders { #if LANG_SK - [Description("Ľubovolné")] Arbitrary, - [Description("Z Oracle databázy")] FromOracle, - [Description("Zo sledovacej databázy")] FromTracingDB, - [Description("Združené a z Oracle")] CombinedAndFromOracle, - [Description("Združené a zo sledovacej databázy")] CombinedAndFromTracingDB, -#elif LANG_CZ - [Description("Libovolné")] Arbitrary, - [Description("Z Oracle databáze")] FromOracle, - [Description("Ze sledovací databáze")] FromTracingDB, - [Description("Sdružené a z Oracle")] CombinedAndFromOracle, - [Description("Sdružené a ze sledovací databáze")] CombinedAndFromTracingDB, + [Description("Ľubovolné")] Arbitrary, + [Description("Aktívne z Oracle")] FromOracle, + [Description("Združené a aktívne z Oracle")] CombinedAndFromOracle, +#elif LANG_DE + [Description("Arbitrary")] Arbitrary, + [Description("Active from Oracle")] FromOracle, + [Description("Combined and active from Oracle")] CombinedAndFromOracle, #else - [Description("Arbitrary")] Arbitrary, - [Description("From Oracle")] FromOracle, - [Description("From Tracing DB")] FromTracingDB, - [Description("Combined and from Oracle")] CombinedAndFromOracle, - [Description("Combined and from Tracing DB")] CombinedAndFromTracingDB, + [Description("Arbitrary")] Arbitrary, + [Description("Active from Oracle")] FromOracle, + [Description("Combined and active from Oracle")] CombinedAndFromOracle, #endif Count, } @@ -99,15 +93,22 @@ namespace TBF.Rig.DataEntry.iPerl public ICollection ParamValues(int i) { - var list = new List(); switch (i) { case 0: - for (Direction d = 0; d < Direction.Count; d++) list.Add(d.ToDescription()); - return list; + return new string[] + { + Direction.Forward_RL.ToDescription(), + Direction.Reversed_LR.ToDescription(), + Direction.S640.ToDescription(), + }; case 1: - for (Orders o = 0; o < Orders.Count; o++) list.Add(o.ToDescription()); - return list; + return new string[] + { + Orders.Arbitrary.ToDescription(), + Orders.FromOracle.ToDescription(), + Orders.CombinedAndFromOracle.ToDescription(), + }; default: return null; } diff --git a/TBF/Rig/DataEntry/iPerl/Factory.cs b/TBF/Rig/DataEntry/iPerl/Factory.cs index a6a03df6d..9a757e788 100644 --- a/TBF/Rig/DataEntry/iPerl/Factory.cs +++ b/TBF/Rig/DataEntry/iPerl/Factory.cs @@ -8,7 +8,7 @@ namespace TBF.Rig.DataEntry.iPerl { public class Factory : IComponentFactory { - public string ClassName { get { return GetType().Namespace.Substring(8); } } + public string ClassName { get { return "DataEntry-iPerl"; } } public override string ToString() { return ClassName; } public IComponent DummyComponent() { return new EntryForm(); } diff --git a/TBF/Rig/Dummy/RegValve/RegValve.cs b/TBF/Rig/Dummy/RegValve/RegValve.cs index 76a6cad31..d2139793b 100644 --- a/TBF/Rig/Dummy/RegValve/RegValve.cs +++ b/TBF/Rig/Dummy/RegValve/RegValve.cs @@ -22,7 +22,8 @@ namespace TBF.Rig.Dummy.RegValve public bool IsCoax { get { return false; } } public double Position { get { return 50.0; } } - + /// + public int RegulationMinStep { get { return 0; } } IDictionary dict; public IDictionary Dict { get { return dict; } } diff --git a/TBF/Rig/OutputPath.cs b/TBF/Rig/OutputPath.cs index ea3365fd7..4c932ed1a 100644 --- a/TBF/Rig/OutputPath.cs +++ b/TBF/Rig/OutputPath.cs @@ -15,7 +15,8 @@ namespace TBF.Rig public string Selector; public IFlowMeter FlowMeter; public IRegValve RegValve; - public float PidCoef; + public int RegulMinStep; + public float PidCoef; public IDiverter Diverter; public ITempMeter TempMtrDiv; public IScaleOrTank Scale; @@ -39,7 +40,7 @@ namespace TBF.Rig RegVPositions = new List(); ValvesOpen = new List(); ValvesClose = new List(); - } + } /// Constructor from data entity public OutputPath(Config.Entities.OutputPath entity, IList components) @@ -50,7 +51,8 @@ namespace TBF.Rig Selector = entity.Selector; FlowMeter = TbfComponents.FindComponent(entity.FlowMeter, components) as IFlowMeter; RegValve = TbfComponents.FindComponent(entity.RegValve, components) as IRegValve; - PidCoef = entity.PidCoef; + RegulMinStep = entity.RegulMinStep; + PidCoef = entity.PidCoef; Diverter = TbfComponents.FindComponent(entity.Diverter, components) as IDiverter; TempMtrDiv = TbfComponents.FindComponent(entity.TempMtrDiv, components) as ITempMeter; Scale = TbfComponents.FindComponent(entity.Scale, components) as IScaleOrTank; diff --git a/TBF/Rig/Sequences/MainSeq.cs b/TBF/Rig/Sequences/MainSeq.cs index de6b93b18..664120b5a 100644 --- a/TBF/Rig/Sequences/MainSeq.cs +++ b/TBF/Rig/Sequences/MainSeq.cs @@ -18,6 +18,8 @@ using TBF.Rig.Network.RestAPI; using TBF.Rig.Network.RestAPI.facade; using TBF.Rig.Output.Printers.GroupPrinting.Single; using TBF.UiBridge; +using SharedComponents; +using System.Text; namespace TBF.Rig.Sequences { @@ -33,6 +35,7 @@ namespace TBF.Rig.Sequences int simultWithPurgingCount; Generic.IComponentCfg simultWithPurgingCfg; + Generic.IComponent simultWithPurging; Generic.IProcedureParams simultWithPurgingProcParams; IList simultWithPurgingTests; IList simultWithPurgingTestParams; @@ -44,10 +47,10 @@ namespace TBF.Rig.Sequences IList simultWithEvacuationTestParams; System.Windows.Forms.Form modelessDlg; - /// - delegate void CommunicationFormDlgt(MainSeq myRef, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams); /// - void OpenIPerlCommForm(MainSeq myRef, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams) + delegate void CommunicationFormDlgt(MainSeq myRef, Generic.IComponent testMethod, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams); + /// + void OpenIPerlCommForm(MainSeq myRef, Generic.IComponent testMethod, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams) { try { @@ -60,9 +63,13 @@ namespace TBF.Rig.Sequences IList iPerlCommParams = new List(); foreach (var tp in multiTestParams) iPerlCommParams.Add(tp as TestMethods.iPerlCommunication.iPerlCommunicationParams); - myRef.modelessDlg = new TestMethods.iPerlCommunication.iPerlCommunicationForm(iPerlCfg, tests, iPerlCommParams); - myRef.modelessDlg.Show(); - } + /*myRef.modelessDlg = new TestMethods.iPerlCommunication.iPerlCommunicationForm(iPerlCfg, tests, iPerlCommParams); + myRef.modelessDlg.Show();*/ + + myRef.modelessDlg = new TestMethods.iPerlCommunication.iPerlCommunicationForm( + testMethod as TBF.Rig.TestMethods.iPerlCommunication.TestMethod, tests, iPerlCommParams); + myRef.modelessDlg.Show(); + } catch (Exception e) { log.FatalFormat("---------------( MainSeq : OpenIperlCommForm crashed !!! )---------------"); @@ -76,7 +83,7 @@ namespace TBF.Rig.Sequences } } /// - void OpenS640CommForm(MainSeq myRef, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams) + void OpenS640CommForm(MainSeq myRef, Generic.IComponent testMethod, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams) { try { @@ -1494,13 +1501,45 @@ namespace TBF.Rig.Sequences goto error; } } - catch (Exception exc) + /*catch (Exception exc) { string msg = string.Format("Unable to update Batch.RsltsSent in local MySQL DB, BatchNr = {0}", ProcessData.BatchRslts.Batch.BatchNr); Bridge.OnError(this, msg); log.FatalFormat("{0}: {1}", msg, exc.Message); goto error; + }*/ + catch (Exception exc) + { + var batch = ProcessData.BatchRslts.Batch; + + // ⚠️ Skladanie detailného logu do jedného reťazca + var logBuilder = new StringBuilder(); + logBuilder.AppendLine("----------------- Unable to update Batch.RsltsSent in local MySQL DB, BatchNr = {0} ------------------"); + logBuilder.AppendLine("❌ Chyba pri UPDATE `batch` SET `RsltsSent` = '1'"); + logBuilder.AppendLine($"BatchNr = {batch.BatchNr}"); + logBuilder.AppendLine($"SQL príkaz: UPDATE `batch` SET `RsltsSent` = '1' WHERE `batch`.`BatchNr` = {batch.BatchNr};"); + logBuilder.AppendLine(); + logBuilder.AppendLine("💥 Výnimka:"); + logBuilder.AppendLine($" - Message: {exc.Message}"); + logBuilder.AppendLine($" - StackTrace: {exc.StackTrace}"); + logBuilder.AppendLine($" - InnerException: {(exc.InnerException != null ? exc.InnerException.Message : "null")}"); + logBuilder.AppendLine(); + logBuilder.AppendLine("📦 Batch obsah:"); + + // 💡 Dynamický výpis vlastností objektu Batch + var props = batch.GetType().GetProperties(); + foreach (var prop in props) + { + object value = prop.GetValue(batch, null); + logBuilder.AppendLine($" - {prop.Name}: {value}"); + } + + // ✍️ Uloženie do vlastného logu + LiveLogCache.Instance.AddLog(logBuilder.ToString()); + + Bridge.OnError(this, "Chyba pri aktualizácii výsledkov v MySQL."); + goto error; } } diff --git a/TBF/Rig/Sequences/ProcessData.cs b/TBF/Rig/Sequences/ProcessData.cs index cd2e86105..869ae5333 100644 --- a/TBF/Rig/Sequences/ProcessData.cs +++ b/TBF/Rig/Sequences/ProcessData.cs @@ -26,6 +26,7 @@ namespace TBF.Rig.Sequences public static IErrorFlags ErrorFlagsComp; public static IStatisticsMonitoring StatisticsMonitoringComp; public static Output.DB.SensusOracle.Database OracleDB; + public static Output.DB.SensusOracle.OrderDetails OrderDetails; public static Output.DB.ProductionTracing.Tracing TracingDB; /// @@ -528,17 +529,21 @@ namespace TBF.Rig.Sequences StateMachine.ControlBoardMain.TestTime.ToString("F3"),/// test time in s StateMachine.ControlBoardMain.RefPulses, /// reference flow meter pulses count outPath.FlowMeter != null ? Formulas.VolumeFromPulses(StateMachine.ControlBoardMain.RefPulses, 1 / outPath.FlowMeter.LtrPerPulse).ToString("F3") : "0.000", /// volume in l - benchPath.TempMtrUp != null ? benchPath.TempMtrUp.ReadTemperature() : 0, /// temp. at the beginning of line in degree C + benchPath.TempMtrUp != null ? benchPath.TempMtrUp.ReadTemperature() : 0, /// temp. at the beginning of line in degree C benchPath.TempMtrDown != null ? benchPath.TempMtrDown.ReadTemperature() : 0, /// temp. at the end of line in degree C - outPath.TempMtrDiv != null ? outPath.TempMtrDiv.ReadTemperature() : 0, /// temp. at the diverter in degree C - PressUp, /// water pressure at the beginning of test line in bar (= 100 kPa) - PressDown, /// water pressure at the end of test line in bar (= 100 kPa) - PressDelta, + outPath.TempMtrDiv != null ? outPath.TempMtrDiv.ReadTemperature() : 0, /// temp. at the diverter in degree C + //---new2 + PressUp.ToString(), /// water pressure at the beginning of test line in bar (= 100 kPa) + PressDown.ToString(), /// water pressure at the end of test line in bar (= 100 kPa) + PressDelta.ToString(), + //---endnew2 (outPath.Scale is IScale) ? (outPath.Scale as IScale).Mass : 0, /// collected water mass in kg "VolMM", - AmbTemp, /// ambient temperature in degree C - AmbHumi, /// ambient humidity in R% - AmbPress, /// ambient pressure in mbar (= 1 hPa) + //---new2 + AmbTemp.ToString(), /// ambient temperature in degree C + AmbHumi.ToString(), /// ambient humidity in R% + AmbPress.ToString(), /// ambient pressure in mbar (= 1 hPa) + //---endnew2 outPath.RegValve.Position.ToString("F1")); /// regulation valve position in % (0=closed / 100=open) } @@ -561,19 +566,25 @@ namespace TBF.Rig.Sequences benchPath.TempMtrUp != null ? benchPath.TempMtrUp.ReadTemperature() : 0, /// temp. at the beginning of line in degree C benchPath.TempMtrDown != null ? benchPath.TempMtrDown.ReadTemperature() : 0, /// temp. at the end of test in degree C outPath.TempMtrDiv != null ? outPath.TempMtrDiv.ReadTemperature() : 0, /// temp. at the diverter in degree C - PressUp, - PressDown, - PressDelta, + //---new2 + PressUp.ToString(), + PressDown.ToString(), + PressDelta.ToString(), + //---endnew2 (outPath.Scale is IScale) ? (outPath.Scale as IScale).Mass : 0, /// collected water mass in kg "VolMM", - AmbTemp, - AmbHumi, - AmbPress, + //---new2 + AmbTemp.ToString(), + AmbHumi.ToString(), + AmbPress.ToString(), + //---endnew2 outPath.RegValve.Position.ToString("F1"), - TempRefHi1, - TempRefHi2, - TempRefLo1, - TempRefLo2); + //---new2 + TempRefHi1.ToString(), + TempRefHi2.ToString(), + TempRefLo1.ToString(), + TempRefLo2.ToString()); + //---endnew2 } /// diff --git a/TBF/Rig/TbfComponents.cs b/TBF/Rig/TbfComponents.cs index 4ef66b2d9..42a9545a1 100644 --- a/TBF/Rig/TbfComponents.cs +++ b/TBF/Rig/TbfComponents.cs @@ -133,6 +133,7 @@ namespace TBF.Rig new RegisterReaders.KPackE.Radio.Factory(), /// Radio for KPackE register readers new Uni.RegValve.Factory(), new Uni.RegValveAnalog.Factory(), + new Uni.RegValveLowRegulTimeSaturation.Factory(), new Scales.MettlerToledo.Factory(), new TestMethods.Adjustment.Factory(), new TestMethods.ChangeFlowDirection.Factory(), diff --git a/TBF/Rig/TestMethods/Endurance/CycleDlg.cs b/TBF/Rig/TestMethods/Endurance/CycleDlg.cs index 08b15c2e1..880b9c1db 100644 --- a/TBF/Rig/TestMethods/Endurance/CycleDlg.cs +++ b/TBF/Rig/TestMethods/Endurance/CycleDlg.cs @@ -28,7 +28,7 @@ namespace TBF.Rig.TestMethods.Endurance /// Auxiliary public lists used also by user controls in tab pages public IList TbfComponents; - public IList Valves; + public IList Valves = new List(); ITabWithListViewEx seqStepsCtrl; @@ -39,8 +39,9 @@ namespace TBF.Rig.TestMethods.Endurance EnduranceCycle = new List(); } - public CycleDlg(IList cycle) + public CycleDlg(IList cycle, IList valves) { + this.Valves = valves; /// Detect display setting: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi. Dpi = (int)this.CreateGraphics().DpiX; @@ -64,25 +65,9 @@ namespace TBF.Rig.TestMethods.Endurance seqStepsCtrl = new CycleStepsCtrl() as ITabWithListViewEx; /// Prepare a list of valves for the endurance test + /// ... list is set by user - /// Load the list of components from the database - NHibernate.ISession session = TBF.DB.CreateSession(DBKind.Config); - var cmptnEntities = session.QueryOver().OrderBy(x => x.ItemNr).Asc .List(); - TbfComponents = TBF.Rig.TbfComponents.LoadComponentsFromDB(cmptnEntities); - Valves = new List(); - for (int bitNr = 0; bitNr < 8; bitNr++) - { - foreach (var vlv in TbfComponents) - { - if (vlv is TBF.Rig.BuiltIn.Valve.Valve && (vlv as TBF.Rig.BuiltIn.Valve.Valve).BitPosition == bitNr) - { - Valves.Add(vlv as IValve); - break; - } - } - } - - EnduranceCycle = (cycle != null) ? cycle : new List(); /// TODO: Load from component parameters + EnduranceCycle = (cycle != null) ? cycle : new List(); /// TODO: Load from component parameters /// Create a tab with sequence steps for each sequence ordered by ItemNr. AddCycleStepsTab(EnduranceCycle); diff --git a/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.cs b/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.cs index 181483b2c..cf5e15523 100644 --- a/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.cs +++ b/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.cs @@ -2,17 +2,28 @@ /// Copyright (c) 2016 Sensus Metering Systems /// using System; +using System.Collections.Generic; using System.Windows.Forms; +using System.Windows.Forms.VisualStyles; +using TBF.Resources; +using TBF.Rig.Generic; +using TBF.Rig.GenericDevices; using Common; using Config.Entities; -using TBF.Rig.Generic; -using TBF.Resources; + +using System.Linq; +using TBF.Rig.Sequences; + +using NHibernate; +using log4net; namespace TBF.Rig.TestMethods.Endurance { public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl { - public bool ShowMore { get { return false; } } + IList valvesFromDB = new List(); + + public bool ShowMore { get { return false; } } string cycle; @@ -30,7 +41,9 @@ namespace TBF.Rig.TestMethods.Endurance public TestMethodCfgCtrl() { InitializeComponent(); - } + valvesFromDB = LoadValvesFromDB(); + CreateValveRows(valvesFromDB.Count, valvesFromDB); // toľko riadkov, koľko ventilov + } private void EntryFormCfgCtrl_Load(object sender, EventArgs e) { @@ -76,11 +89,109 @@ namespace TBF.Rig.TestMethods.Endurance private void enduranceCycleButton_Click(object sender, EventArgs e) { - CycleDlg dlg = new CycleDlg(CycleStep.StringToCycle(cycle)); + CycleDlg dlg = new CycleDlg(CycleStep.StringToCycle(cycle), GetSelectedValves()); if (dlg.ShowDialog() == DialogResult.OK) { cycle = CycleStep.CycleToString(dlg.EnduranceCycle); } } - } + private void CreateValveRows(int numberOfRows, IList valves) + { + tableLayoutPanel1.RowCount = numberOfRows; + tableLayoutPanel1.ColumnCount = 2; + + tableLayoutPanel1.Controls.Clear(); + tableLayoutPanel1.ColumnStyles.Clear(); + tableLayoutPanel1.RowStyles.Clear(); + + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + + for (int i = 0; i < numberOfRows; i++) + { + tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize)); + + var label = new Label + { + Text = $"Valve {i + 1}", + Anchor = AnchorStyles.Left, + AutoSize = true, + Margin = new Padding(5) + }; + + var comboBox = new ComboBox + { + DropDownStyle = ComboBoxStyle.DropDownList, + Anchor = AnchorStyles.Left | AnchorStyles.Right, + Dock = DockStyle.Fill, + Margin = new Padding(5), + Name = $"comboValve{i + 1}", + DisplayMember = "Name" // zobrazenie názvu ventilu + }; + + comboBox.Items.Add("None"); + + foreach (var valve in valves) + { + comboBox.Items.Add(valve.Name/* + " (bit nr = " + valve.BitPosition + ")"*/); + } + + comboBox.SelectedIndex = 0; + + tableLayoutPanel1.Controls.Add(label, 0, i); + tableLayoutPanel1.Controls.Add(comboBox, 1, i); + } + } + + + private IList LoadValvesFromDB() + { + /// Load the list of components from the database + IList valves = new List(); + + using (NHibernate.ISession session = TBF.DB.CreateSession(DBKind.Config)) + { + IList TbfComponents = Rig.TbfComponents.LoadComponentsFromDB(session); + valves = getAllValves(TbfComponents); + + } + /// Find all master valvesFromDB + return valves; + } + + /// + /// Process the list of components and return all valvesFromDB (masters and coupled) + /// + public static IList getAllValves(IList cmpnts) + { + IList result = new List(); + foreach (var cmpnt in cmpnts) if (cmpnt is Rig.BuiltIn.Valve.Valve) result.Add(cmpnt as Rig.BuiltIn.Valve.Valve); + return result; + } + + private List GetSelectedValves() + { + var selectedValves = new List(); + + foreach (Control control in tableLayoutPanel1.Controls) + { + if (control is ComboBox comboBox) + { + var selectedName = comboBox.SelectedItem?.ToString(); + + if (!string.IsNullOrEmpty(selectedName) && selectedName != "None") + { + // Nájdeme ventil podľa mena v zozname všetkých + var valve = valvesFromDB.FirstOrDefault(v => v.Name == selectedName); + if (valve != null) + { + selectedValves.Add(valve); + } + } + } + } + + return selectedValves; + } + } } diff --git a/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs b/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs index 16d855bae..90107e515 100644 --- a/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs +++ b/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs @@ -31,62 +31,85 @@ namespace TBF.Rig.TestMethods.Endurance /// private void InitializeComponent() { - this.nameTextBox = new System.Windows.Forms.TextBox(); - this.nameLabel = new System.Windows.Forms.Label(); - this.classNameLabel = new System.Windows.Forms.Label(); - this.enduranceCycleButton = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // nameTextBox - // - this.nameTextBox.Enabled = false; - this.nameTextBox.Location = new System.Drawing.Point(137, 57); - this.nameTextBox.Name = "nameTextBox"; - this.nameTextBox.Size = new System.Drawing.Size(130, 20); - this.nameTextBox.TabIndex = 5; - // - // nameLabel - // - this.nameLabel.AutoSize = true; - this.nameLabel.Location = new System.Drawing.Point(27, 60); - this.nameLabel.Name = "nameLabel"; - this.nameLabel.Size = new System.Drawing.Size(35, 13); - this.nameLabel.TabIndex = 4; - this.nameLabel.Text = "Name"; - // - // classNameLabel - // - this.classNameLabel.AutoSize = true; - this.classNameLabel.Location = new System.Drawing.Point(134, 33); - this.classNameLabel.Name = "classNameLabel"; - this.classNameLabel.Size = new System.Drawing.Size(83, 13); - this.classNameLabel.TabIndex = 3; - this.classNameLabel.Text = "ComonentName"; - // - // enduranceCycleButton - // - this.enduranceCycleButton.Enabled = false; - this.enduranceCycleButton.Location = new System.Drawing.Point(137, 83); - this.enduranceCycleButton.Name = "enduranceCycleButton"; - this.enduranceCycleButton.Size = new System.Drawing.Size(130, 31); - this.enduranceCycleButton.TabIndex = 6; - this.enduranceCycleButton.Text = "Endurance cycle"; - this.enduranceCycleButton.UseVisualStyleBackColor = true; - this.enduranceCycleButton.Click += new System.EventHandler(this.enduranceCycleButton_Click); - // - // TestMethodCfgCtrl - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.enduranceCycleButton); - this.Controls.Add(this.nameTextBox); - this.Controls.Add(this.nameLabel); - this.Controls.Add(this.classNameLabel); - this.Name = "TestMethodCfgCtrl"; - this.Size = new System.Drawing.Size(300, 200); - this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); - this.ResumeLayout(false); - this.PerformLayout(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.enduranceCycleButton = new System.Windows.Forms.Button(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // enduranceCycleButton + // + this.enduranceCycleButton.Enabled = false; + this.enduranceCycleButton.Location = new System.Drawing.Point(137, 83); + this.enduranceCycleButton.Name = "enduranceCycleButton"; + this.enduranceCycleButton.Size = new System.Drawing.Size(130, 31); + this.enduranceCycleButton.TabIndex = 6; + this.enduranceCycleButton.Text = "Endurance cycle"; + this.enduranceCycleButton.UseVisualStyleBackColor = true; + this.enduranceCycleButton.Click += new System.EventHandler(this.enduranceCycleButton_Click); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.AutoSize = true; + this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 37.5F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 62.5F)); + this.tableLayoutPanel1.Location = new System.Drawing.Point(30, 120); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 8; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(0, 120); + this.tableLayoutPanel1.TabIndex = 8; + // + // TestMethodCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.enduranceCycleButton); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "TestMethodCfgCtrl"; + this.Size = new System.Drawing.Size(300, 502); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); } @@ -96,5 +119,6 @@ namespace TBF.Rig.TestMethods.Endurance private System.Windows.Forms.Label nameLabel; private System.Windows.Forms.Label classNameLabel; private System.Windows.Forms.Button enduranceCycleButton; - } + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + } } diff --git a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs index 283c63d8c..4667286e4 100644 --- a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs +++ b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs @@ -224,7 +224,7 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection /// State.Create(string.Format("{0}({1}) : Starting pump {2}", test.Method, test.Name, (inPath.Pump != null) ? inPath.Pump.Name : "?")) .AddOperation(checkUiOp) -// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) .AddOperations(readTempPressOps) .AddOperation(heatMetersPromptOp) .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) diff --git a/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs b/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs index 95f2bf1e6..a69cd7ffb 100644 --- a/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs +++ b/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs @@ -11,6 +11,7 @@ using TBF.Rig; using TBF.Boxes; using TBF.Resources; using TBF.UiBridge; +//using AppDiagnostic; namespace TBF.Rig.TestMethods.PMaxTest { @@ -179,11 +180,24 @@ namespace TBF.Rig.TestMethods.PMaxTest Bridge.OnActivity(this, Strings.Test_in_progress); Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test)); //------------------------------------------------ + + /*//---new1 + LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Start mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Start mass"); + //---endNew1*/ + + //DiagApi.addLog(); + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) .AddOperation(checkUiOp) .AddOperations(readTempPressOps) .AddOperation(new Operations.TimerOp(testParams.DurationPMax)) - .EnterState(); + //---new1 + .AddOperation(processDataLoggingOp) + //---endNew1 + .EnterState(); do { e = StateMachine.WaitRunDevsRunOps(); diff --git a/TBF/Rig/TestMethods/iPerlCommunication/TestMethod.cs b/TBF/Rig/TestMethods/iPerlCommunication/TestMethod.cs index db1790ef9..9e8168dc5 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/TestMethod.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/TestMethod.cs @@ -1,19 +1,18 @@ /// -/// Copyright (c) 2015-2021 Sensus Slovensko a.s. +/// Copyright (c) 2015-2022 Sensus Slovensko a.s. /// using System; -using System.IO.Ports; using System.Collections.Generic; using log4net; using Common; using Config.Entities; -using TBF.Rig; +using TBF.Rig.GenericDevices; using TBF.Rig.Sequences; using TBF.UiBridge; namespace TBF.Rig.TestMethods.iPerlCommunication { - public class TestMethod : ComponentBase, GenericDevices.ISimultTestMethod + public class TestMethod : ComponentBase, ISimultTestMethod, ISequenceCondition, ISessionDataMngmnt { private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod)); protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); @@ -22,12 +21,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } public bool DoTransitions() { return false; } - public bool CheckDeviceCaps(Test test, OutputPath devices, out string message) - { - message = string.Format("{0}: CheckDeviceCaps() is not implemented yet", Name); - return false; - } - public bool SimultWithPrevious { get { return testMethodCfg.TestParams.SimultWithPrevious; } } public bool SimultWithNext { get { return testMethodCfg.TestParams.SimultWithNext; } } @@ -68,14 +61,32 @@ namespace TBF.Rig.TestMethods.iPerlCommunication readonly TestMethodCfg testMethodCfg; + + public bool[] IperlCommMilestone; + IList sequenceConditionOps; - public TestMethod() { } + public TestMethod() + { + CreateMilestonesAndConditions(); + } public TestMethod(Generic.IComponentCfg cfg) : base(cfg) { testMethodCfg = cfg as TestMethodCfg; - } + CreateMilestonesAndConditions(); + } + + void CreateMilestonesAndConditions() + { + IperlCommMilestone = new bool[(int)ConditionID.Count]; + + sequenceConditionOps = new List(); + for (ConditionID id = ConditionID.A; id < ConditionID.Count; id++) + { + sequenceConditionOps.Add(new SequenceConditionOp(this, id)); + } + } /// IDevice interface - only Initialize() is used public override void Initialize() @@ -97,16 +108,60 @@ namespace TBF.Rig.TestMethods.iPerlCommunication { if (DebugLevel == DebugMode.Normal) { - return (new iPerlCommunicationSeq()).Execute(test, repetNr, testMethodCfg, testMethodCfg.TestParams); + return (new iPerlCommunicationSeq()).Execute(test, repetNr, this, testMethodCfg.TestParams); } else { /// DebugLevel == DebugMode.Simulate (new iPerlCommunicationSeq()).MakeSimulatedTrivial(test, repetNr, test.Part); Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 1, Progress.Completed)); - Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0))); + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(Common.Utils.GetTestName(test.Name, 1, 1), 0))); return new List { Event.Done }; } } - } + + + public int ConditionsCount { get { return (int)ConditionID.Count; } } + + public string ConditionName(int i) + { + return (i >= 0 && i < (int)ConditionID.Count) ? ConditionOp(i).ToString() : string.Empty; + } + + public IOperation ConditionOp(int i) + { + return (i >= 0 && i < (int)ConditionID.Count) ? sequenceConditionOps[i] : null; + } + + + public void StartSession() + { + /// Clear milestones + if (IperlCommMilestone != null) + { + for (int i = 0; i < IperlCommMilestone.Length; i++) + { + IperlCommMilestone[i] = false; + } + } + } + + public void SaveMark(object o) + { + /// No marks + } + + public void EndSession() + { + /// Nothing at the end of session + } + + public bool CheckDeviceCaps(Test test, OutputPath devices, out string message) + { + // Implement the method to satisfy the ITestMethod interface. + // For now, provide a basic implementation. + message = "Device capabilities check not implemented."; + return true; + } + } } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/TestMethodCfg.cs b/TBF/Rig/TestMethods/iPerlCommunication/TestMethodCfg.cs index 971cea8b5..0ba33468d 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/TestMethodCfg.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/TestMethodCfg.cs @@ -2,6 +2,8 @@ /// Copyright (c) 2015-2021 Sensus Slovensko a.s. /// using System.Collections.Generic; +using System.IO.Ports; +using System.Threading; using System.Xml.Serialization; using Common; using Config.Entities; @@ -22,9 +24,20 @@ namespace TBF.Rig.TestMethods.iPerlCommunication public int CommTimeout; /// Communication timeout in ms (500 .. 5000) public int DelayBetweenRetries; /// Delay between communication retries in ms (0 .. 5000) public int MaxCommRetries; /// Max. number of retries (1 .. 10) + public int WaitTimeAfterFailure; /// Wait time after communication failure in ms + public int PassThroughWaitTime; /// Pass Through wait time for radio parameters in ms public int NrThreads; /// Numbwr of parallel threads (1, 2 or 4) public int IperlCheckErrorsToStop; + /// + /// NFC S4.5 Combihead params + /// + public int MciTimeoutMs; + public int BaudRate; + public int DataBits; + public Parity ParityBit; + public StopBits StopBits; + public int DfltQ2c_15_rl; public int DfltQ2c_15_lr; public int DfltQ2c_20_rl; @@ -59,10 +72,17 @@ namespace TBF.Rig.TestMethods.iPerlCommunication ParentName = string.Empty; CommTimeout = 1800; /// ms MaxCommRetries = 4; - NrThreads = 2; /// 1, 2 or 4 threads + WaitTimeAfterFailure = 2200; + PassThroughWaitTime = 1500; + NrThreads = 2; /// 1, 2 or 4 threads IperlCheckErrorsToStop = 10; + MciTimeoutMs = 4000; // ms, NFC interface + BaudRate = 57600; // NFC Interface + DataBits = 8; // NFC Interface + ParityBit = Parity.None; // NFC Interface + StopBits = StopBits.Two; // NFC Interface - TestParams = CreateTestParamsProvider() as iPerlCommunicationParams; + TestParams = CreateTestParamsProvider() as iPerlCommunicationParams; } public TestMethodCfg(IComponentFactory factory) diff --git a/TBF/Rig/TestMethods/iPerlCommunication/TestMethodFactory.cs b/TBF/Rig/TestMethods/iPerlCommunication/TestMethodFactory.cs index 4b49c83a5..d72ececac 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/TestMethodFactory.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/TestMethodFactory.cs @@ -9,7 +9,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication public class TestMethodFactory : IComponentFactory { public string ClassName { get { return GetType().Namespace.Substring(8); } } - public override string ToString() { return ClassName; } public IComponent DummyComponent() { return new TestMethod(); } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs index 5f824ea82..d258eb99e 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2015-2021 Sensus Slovensko a.s. +/// Copyright (c) 2015-2023 Sensus Slovensko a.s. /// //#define VERIFY_ACTIVE_MODE //#define VERIFY_Q2_CORR_RESET @@ -8,8 +8,7 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Globalization; -using System.Runtime.InteropServices; -using System.Text; +using System.Linq; using System.Threading; using System.Windows.Forms; using log4net; @@ -18,6 +17,9 @@ using Config.Entities; using TBF.Resources; using TBF.Rig.Sequences; using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead; +using Results.Entities; +using static Sensus.iPerl.NfcHandler.MCI_Protocol; +using System.Threading.Tasks; namespace TBF.Rig.TestMethods.iPerlCommunication { @@ -70,26 +72,31 @@ namespace TBF.Rig.TestMethods.iPerlCommunication public const string ResetQ2CorrectionStr = "Reset Q2 correction"; public const string WriteDefaultQ2CorrectionsStr = "Write default Q2 corrections"; public const string InitOrReadQ2CorrectionsStr = "Init or read Q2 corrections"; - public const string WriteQ2CorrectionStr = "Write Q2 correction"; /// No arguments - public const string WriteQ2CorrectionAltStr = "Write Q2 correction Alt"; /// No arguments - public const string WriteQ2CorrectionGreeceStr = "Write Q2 correction Greece"; /// Arguments: test_name - public const string WriteQ2CorrectionRLStr = "Write Q2 correction R-L"; /// Arguments: test_name - public const string WriteQ2CorrectionLRStr = "Write Q2 correction L-R"; /// Arguments: test_name - public const string WriteQ2CorrectionIncl05Str = "Write_Q2_correction_incl.-0,5..0,5%"; /// No arguments - public const string WriteQ2CorrectionAltIncl05Str = "Write_Q2_correction_Alt_incl.-0,5..0,5%"; /// No arguments - public const string WriteQ2CorrectionGreeceIncl05Str = "Write_Q2_correction_Greece_incl.-0,5..0,5%"; /// Arguments: test_name - public const string WriteQ2CorrectionRLIncl05Str = "Write_Q2_correction_R-L_incl.-0,5..0,5%"; /// Arguments: test_name - public const string WriteQ2CorrectionLRIncl05Str = "Write_Q2_correction_L-R_incl.-0,5..0,5%"; /// Arguments: test_name - public const string UpdateBothQ2FactorsTestRLOnlyStr = "Update_both_Q2_factors_Test_RL_only"; /// No arguments - public const string UpdateBothQ2FactorsTestLROnlyStr = "Update_both_Q2_factors_Test_LR_only"; /// No arguments - public const string UpdateQ2CorrectionsStr = "Update Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name - public const string ConditnlUpdateQ2CorrectionsStr = "Conditional update of Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name - public const string ConditnlUpdateQ2CorrRLStr = "Conditional update of Q2 correction R-L"; /// Arguments: R-L_test_name - public const string ConditnlUpdateQ2CorrLRStr = "Conditional update of Q2 correction L-R"; /// Arguments: L-R_test_name + public const string WriteQ2CorrectionStr = "Write Q2 correction"; /// No arguments + public const string WriteQ2CorrectionAltStr = "Write Q2 correction Alt"; /// No arguments + public const string WriteQ2CorrectionGreeceStr = "Write Q2 correction Greece"; /// Arguments: test_name + public const string WriteQ2CorrectionRLStr = "Write Q2 correction R-L"; /// Arguments: test_name + public const string WriteQ2CorrectionLRStr = "Write Q2 correction L-R"; /// Arguments: test_name + public const string WriteQ2CorrectionIncl05Str = "Write_Q2_correction_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionAltIncl05Str = "Write_Q2_correction_Alt_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionPlusIncl05Str = "Write_Q2_correction_plus_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionPlusAltIncl05Str = "Write_Q2_correction_plus_Alt_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionGreeceIncl05Str = "Write_Q2_correction_Greece_incl.-0,5..0,5%"; /// Arguments: test_name + public const string WriteQ2CorrectionRLIncl05Str = "Write_Q2_correction_R-L_incl.-0,5..0,5%"; /// Arguments: test_name + public const string WriteQ2CorrectionLRIncl05Str = "Write_Q2_correction_L-R_incl.-0,5..0,5%"; /// Arguments: test_name + public const string UpdateBothQ2FactorsTestRLOnlyStr = "Update_both_Q2_factors_Test_RL_only"; /// No arguments + public const string UpdateBothQ2FactorsTestLROnlyStr = "Update_both_Q2_factors_Test_LR_only"; /// No arguments + public const string UpdateQ2CorrectionsStr = "Update Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name + public const string ConditnlUpdateQ2CorrectionsStr = "Conditional update of Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name + public const string ConditnlUpdateQ2CorrRLStr = "Conditional update of Q2 correction R-L"; /// Arguments: R-L_test_name + public const string ConditnlUpdateQ2CorrLRStr = "Conditional update of Q2 correction L-R"; /// Arguments: L-R_test_name public const string Reset2HzCorrectionStr = "Reset 2Hz correction"; public const string Write2HzCorrectionStr = "Write 2Hz correction"; public const string DewaReworkRLStr = "DEWA rework R-L"; public const string DewaReworkLRStr = "DEWA rework L-R"; + public const string StartTestingSealedMetersStr = "Start testing sealed meters"; + public const string EndTestingSealedMetersStr = "End testing sealed meters"; + public const string SimulateCmd = "simulate "; public static Color DisabledColor = Color.DarkGray; public static Color OptoAndDirOKColor = Color.Green; @@ -97,574 +104,60 @@ namespace TBF.Rig.TestMethods.iPerlCommunication public static Color DirNokColor = Color.Red; - #region DLL_Interface - - [DllImport("libRfid1.dll", EntryPoint = "getDllVersion")] static extern unsafe int getDllVersion1(); - [DllImport("libRfid1.dll", EntryPoint = "openPort")] static extern unsafe int openPort1(int comPort); - [DllImport("libRfid1.dll", EntryPoint = "closePort")] static extern unsafe int closePort1(); - [DllImport("libRfid1.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort1(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid1.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort1(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid2.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion2(); - [DllImport("libRfid2.dll", EntryPoint = "openPort")] static extern unsafe int openPort2(int comPort); - [DllImport("libRfid2.dll", EntryPoint = "closePort")] static extern unsafe int closePort2(); - [DllImport("libRfid2.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort2(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid2.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort2(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid3.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion3(); - [DllImport("libRfid3.dll", EntryPoint = "openPort")] static extern unsafe int openPort3(int comPort); - [DllImport("libRfid3.dll", EntryPoint = "closePort")] static extern unsafe int closePort3(); - [DllImport("libRfid3.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort3(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid3.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort3(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid4.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion4(); - [DllImport("libRfid4.dll", EntryPoint = "openPort")] static extern unsafe int openPort4(int comPort); - [DllImport("libRfid4.dll", EntryPoint = "closePort")] static extern unsafe int closePort4(); - [DllImport("libRfid4.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort4(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid4.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort4(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid5.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion5(); - [DllImport("libRfid5.dll", EntryPoint = "openPort")] static extern unsafe int openPort5(int comPort); - [DllImport("libRfid5.dll", EntryPoint = "closePort")] static extern unsafe int closePort5(); - [DllImport("libRfid5.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort5(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid5.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort5(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid6.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion6(); - [DllImport("libRfid6.dll", EntryPoint = "openPort")] static extern unsafe int openPort6(int comPort); - [DllImport("libRfid6.dll", EntryPoint = "closePort")] static extern unsafe int closePort6(); - [DllImport("libRfid6.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort6(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid6.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort6(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid7.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion7(); - [DllImport("libRfid7.dll", EntryPoint = "openPort")] static extern unsafe int openPort7(int comPort); - [DllImport("libRfid7.dll", EntryPoint = "closePort")] static extern unsafe int closePort7(); - [DllImport("libRfid7.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort7(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid7.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort7(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid8.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion8(); - [DllImport("libRfid8.dll", EntryPoint = "openPort")] static extern unsafe int openPort8(int comPort); - [DllImport("libRfid8.dll", EntryPoint = "closePort")] static extern unsafe int closePort8(); - [DllImport("libRfid8.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort8(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid8.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort8(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid9.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion9(); - [DllImport("libRfid9.dll", EntryPoint = "openPort")] static extern unsafe int openPort9(int comPort); - [DllImport("libRfid9.dll", EntryPoint = "closePort")] static extern unsafe int closePort9(); - [DllImport("libRfid9.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort9(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid9.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort9(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid10.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion10(); - [DllImport("libRfid10.dll", EntryPoint = "openPort")] static extern unsafe int openPort10(int comPort); - [DllImport("libRfid10.dll", EntryPoint = "closePort")] static extern unsafe int closePort10(); - [DllImport("libRfid10.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort10(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid10.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort10(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid11.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion11(); - [DllImport("libRfid11.dll", EntryPoint = "openPort")] static extern unsafe int openPort11(int comPort); - [DllImport("libRfid11.dll", EntryPoint = "closePort")] static extern unsafe int closePort11(); - [DllImport("libRfid11.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort11(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid11.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort11(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid12.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion12(); - [DllImport("libRfid12.dll", EntryPoint = "openPort")] static extern unsafe int openPort12(int comPort); - [DllImport("libRfid12.dll", EntryPoint = "closePort")] static extern unsafe int closePort12(); - [DllImport("libRfid12.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort12(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid12.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort12(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid13.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion13(); - [DllImport("libRfid13.dll", EntryPoint = "openPort")] static extern unsafe int openPort13(int comPort); - [DllImport("libRfid13.dll", EntryPoint = "closePort")] static extern unsafe int closePort13(); - [DllImport("libRfid13.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort13(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid13.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort13(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid14.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion14(); - [DllImport("libRfid14.dll", EntryPoint = "openPort")] static extern unsafe int openPort14(int comPort); - [DllImport("libRfid14.dll", EntryPoint = "closePort")] static extern unsafe int closePort14(); - [DllImport("libRfid14.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort14(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid14.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort14(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid15.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion15(); - [DllImport("libRfid15.dll", EntryPoint = "openPort")] static extern unsafe int openPort15(int comPort); - [DllImport("libRfid15.dll", EntryPoint = "closePort")] static extern unsafe int closePort15(); - [DllImport("libRfid15.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort15(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid15.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort15(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid16.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion16(); - [DllImport("libRfid16.dll", EntryPoint = "openPort")] static extern unsafe int openPort16(int comPort); - [DllImport("libRfid16.dll", EntryPoint = "closePort")] static extern unsafe int closePort16(); - [DllImport("libRfid16.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort16(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid16.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort16(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid17.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion17(); - [DllImport("libRfid17.dll", EntryPoint = "openPort")] static extern unsafe int openPort17(int comPort); - [DllImport("libRfid17.dll", EntryPoint = "closePort")] static extern unsafe int closePort17(); - [DllImport("libRfid17.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort17(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid17.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort17(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid18.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion18(); - [DllImport("libRfid18.dll", EntryPoint = "openPort")] static extern unsafe int openPort18(int comPort); - [DllImport("libRfid18.dll", EntryPoint = "closePort")] static extern unsafe int closePort18(); - [DllImport("libRfid18.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort18(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid18.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort18(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid19.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion19(); - [DllImport("libRfid19.dll", EntryPoint = "openPort")] static extern unsafe int openPort19(int comPort); - [DllImport("libRfid19.dll", EntryPoint = "closePort")] static extern unsafe int closePort19(); - [DllImport("libRfid19.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort19(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid19.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort19(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid20.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion20(); - [DllImport("libRfid20.dll", EntryPoint = "openPort")] static extern unsafe int openPort20(int comPort); - [DllImport("libRfid20.dll", EntryPoint = "closePort")] static extern unsafe int closePort20(); - [DllImport("libRfid20.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort20(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid20.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort20(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid21.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion21(); - [DllImport("libRfid21.dll", EntryPoint = "openPort")] static extern unsafe int openPort21(int comPort); - [DllImport("libRfid21.dll", EntryPoint = "closePort")] static extern unsafe int closePort21(); - [DllImport("libRfid21.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort21(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid21.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort21(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid22.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion22(); - [DllImport("libRfid22.dll", EntryPoint = "openPort")] static extern unsafe int openPort22(int comPort); - [DllImport("libRfid22.dll", EntryPoint = "closePort")] static extern unsafe int closePort22(); - [DllImport("libRfid22.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort22(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid22.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort22(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid23.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion23(); - [DllImport("libRfid23.dll", EntryPoint = "openPort")] static extern unsafe int openPort23(int comPort); - [DllImport("libRfid23.dll", EntryPoint = "closePort")] static extern unsafe int closePort23(); - [DllImport("libRfid23.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort23(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid23.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort23(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid24.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion24(); - [DllImport("libRfid24.dll", EntryPoint = "openPort")] static extern unsafe int openPort24(int comPort); - [DllImport("libRfid24.dll", EntryPoint = "closePort")] static extern unsafe int closePort24(); - [DllImport("libRfid24.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort24(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid24.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort24(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid25.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion25(); - [DllImport("libRfid25.dll", EntryPoint = "openPort")] static extern unsafe int openPort25(int comPort); - [DllImport("libRfid25.dll", EntryPoint = "closePort")] static extern unsafe int closePort25(); - [DllImport("libRfid25.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort25(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid25.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort25(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid26.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion26(); - [DllImport("libRfid26.dll", EntryPoint = "openPort")] static extern unsafe int openPort26(int comPort); - [DllImport("libRfid26.dll", EntryPoint = "closePort")] static extern unsafe int closePort26(); - [DllImport("libRfid26.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort26(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid26.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort26(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid27.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion27(); - [DllImport("libRfid27.dll", EntryPoint = "openPort")] static extern unsafe int openPort27(int comPort); - [DllImport("libRfid27.dll", EntryPoint = "closePort")] static extern unsafe int closePort27(); - [DllImport("libRfid27.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort27(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid27.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort27(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid28.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion28(); - [DllImport("libRfid28.dll", EntryPoint = "openPort")] static extern unsafe int openPort28(int comPort); - [DllImport("libRfid28.dll", EntryPoint = "closePort")] static extern unsafe int closePort28(); - [DllImport("libRfid28.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort28(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid28.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort28(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid29.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion29(); - [DllImport("libRfid29.dll", EntryPoint = "openPort")] static extern unsafe int openPort29(int comPort); - [DllImport("libRfid29.dll", EntryPoint = "closePort")] static extern unsafe int closePort29(); - [DllImport("libRfid29.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort29(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid29.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort29(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid30.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion30(); - [DllImport("libRfid30.dll", EntryPoint = "openPort")] static extern unsafe int openPort30(int comPort); - [DllImport("libRfid30.dll", EntryPoint = "closePort")] static extern unsafe int closePort30(); - [DllImport("libRfid30.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort30(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid30.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort30(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid31.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion31(); - [DllImport("libRfid31.dll", EntryPoint = "openPort")] static extern unsafe int openPort31(int comPort); - [DllImport("libRfid31.dll", EntryPoint = "closePort")] static extern unsafe int closePort31(); - [DllImport("libRfid31.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort31(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid31.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort31(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid32.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion32(); - [DllImport("libRfid32.dll", EntryPoint = "openPort")] static extern unsafe int openPort32(int comPort); - [DllImport("libRfid32.dll", EntryPoint = "closePort")] static extern unsafe int closePort32(); - [DllImport("libRfid32.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort32(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid32.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort32(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid33.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion33(); - [DllImport("libRfid33.dll", EntryPoint = "openPort")] static extern unsafe int openPort33(int comPort); - [DllImport("libRfid33.dll", EntryPoint = "closePort")] static extern unsafe int closePort33(); - [DllImport("libRfid33.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort33(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid33.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort33(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid34.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion34(); - [DllImport("libRfid34.dll", EntryPoint = "openPort")] static extern unsafe int openPort34(int comPort); - [DllImport("libRfid34.dll", EntryPoint = "closePort")] static extern unsafe int closePort34(); - [DllImport("libRfid34.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort34(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid34.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort34(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid35.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion35(); - [DllImport("libRfid35.dll", EntryPoint = "openPort")] static extern unsafe int openPort35(int comPort); - [DllImport("libRfid35.dll", EntryPoint = "closePort")] static extern unsafe int closePort35(); - [DllImport("libRfid35.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort35(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid35.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort35(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid36.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion36(); - [DllImport("libRfid36.dll", EntryPoint = "openPort")] static extern unsafe int openPort36(int comPort); - [DllImport("libRfid36.dll", EntryPoint = "closePort")] static extern unsafe int closePort36(); - [DllImport("libRfid36.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort36(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid36.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort36(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid37.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion37(); - [DllImport("libRfid37.dll", EntryPoint = "openPort")] static extern unsafe int openPort37(int comPort); - [DllImport("libRfid37.dll", EntryPoint = "closePort")] static extern unsafe int closePort37(); - [DllImport("libRfid37.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort37(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid37.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort37(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid38.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion38(); - [DllImport("libRfid38.dll", EntryPoint = "openPort")] static extern unsafe int openPort38(int comPort); - [DllImport("libRfid38.dll", EntryPoint = "closePort")] static extern unsafe int closePort38(); - [DllImport("libRfid38.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort38(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid38.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort38(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid39.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion39(); - [DllImport("libRfid39.dll", EntryPoint = "openPort")] static extern unsafe int openPort39(int comPort); - [DllImport("libRfid39.dll", EntryPoint = "closePort")] static extern unsafe int closePort39(); - [DllImport("libRfid39.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort39(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid39.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort39(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - [DllImport("libRfid40.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion40(); - [DllImport("libRfid40.dll", EntryPoint = "openPort")] static extern unsafe int openPort40(int comPort); - [DllImport("libRfid40.dll", EntryPoint = "closePort")] static extern unsafe int closePort40(); - [DllImport("libRfid40.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort40(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - [DllImport("libRfid40.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort40(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms); - - - /// - /// Wrapper function with safe interface and unsafe body - /// - /// Water meter (iPerlHead) object - /// Value returned by openPort(...) - public static unsafe int OpenPort(IperlHead iperlHead) - { - if (iperlHead.DebugLevel != DebugMode.Normal) return 0; /// No function in debug mode - - switch (iperlHead.Position) - { - default: - case 1: return openPort1(iperlHead.RfidComPortNr); - case 2: return openPort2(iperlHead.RfidComPortNr); - case 3: return openPort3(iperlHead.RfidComPortNr); - case 4: return openPort4(iperlHead.RfidComPortNr); - case 5: return openPort5(iperlHead.RfidComPortNr); - case 6: return openPort6(iperlHead.RfidComPortNr); - case 7: return openPort7(iperlHead.RfidComPortNr); - case 8: return openPort8(iperlHead.RfidComPortNr); - case 9: return openPort9(iperlHead.RfidComPortNr); - case 10: return openPort10(iperlHead.RfidComPortNr); - case 11: return openPort11(iperlHead.RfidComPortNr); - case 12: return openPort12(iperlHead.RfidComPortNr); - case 13: return openPort13(iperlHead.RfidComPortNr); - case 14: return openPort14(iperlHead.RfidComPortNr); - case 15: return openPort15(iperlHead.RfidComPortNr); - case 16: return openPort16(iperlHead.RfidComPortNr); - case 17: return openPort17(iperlHead.RfidComPortNr); - case 18: return openPort18(iperlHead.RfidComPortNr); - case 19: return openPort19(iperlHead.RfidComPortNr); - case 20: return openPort20(iperlHead.RfidComPortNr); - case 21: return openPort21(iperlHead.RfidComPortNr); - case 22: return openPort22(iperlHead.RfidComPortNr); - case 23: return openPort23(iperlHead.RfidComPortNr); - case 24: return openPort24(iperlHead.RfidComPortNr); - case 25: return openPort25(iperlHead.RfidComPortNr); - case 26: return openPort26(iperlHead.RfidComPortNr); - case 27: return openPort27(iperlHead.RfidComPortNr); - case 28: return openPort28(iperlHead.RfidComPortNr); - case 29: return openPort29(iperlHead.RfidComPortNr); - case 30: return openPort30(iperlHead.RfidComPortNr); - case 31: return openPort31(iperlHead.RfidComPortNr); - case 32: return openPort32(iperlHead.RfidComPortNr); - case 33: return openPort33(iperlHead.RfidComPortNr); - case 34: return openPort34(iperlHead.RfidComPortNr); - case 35: return openPort35(iperlHead.RfidComPortNr); - case 36: return openPort36(iperlHead.RfidComPortNr); - case 37: return openPort37(iperlHead.RfidComPortNr); - case 38: return openPort38(iperlHead.RfidComPortNr); - case 39: return openPort39(iperlHead.RfidComPortNr); - case 40: return openPort40(iperlHead.RfidComPortNr); - } - } - - /// - /// Wrapper function with safe interface and unsafe body - /// - /// Water meter (iPerlHead) object - /// Value returned by openPort(...) - public static unsafe int ClosePort(IperlHead iperlHead) - { - if (iperlHead.DebugLevel != DebugMode.Normal) return 0; /// No function in debug mode - - switch (iperlHead.Position) - { - default: - case 1: return closePort1(); - case 2: return closePort2(); - case 3: return closePort3(); - case 4: return closePort4(); - case 5: return closePort5(); - case 6: return closePort6(); - case 7: return closePort7(); - case 8: return closePort8(); - case 9: return closePort9(); - case 10: return closePort10(); - case 11: return closePort11(); - case 12: return closePort12(); - case 13: return closePort13(); - case 14: return closePort14(); - case 15: return closePort15(); - case 16: return closePort16(); - case 17: return closePort17(); - case 18: return closePort18(); - case 19: return closePort19(); - case 20: return closePort20(); - case 21: return closePort21(); - case 22: return closePort22(); - case 23: return closePort23(); - case 24: return closePort24(); - case 25: return closePort25(); - case 26: return closePort26(); - case 27: return closePort27(); - case 28: return closePort28(); - case 29: return closePort29(); - case 30: return closePort30(); - case 31: return closePort31(); - case 32: return closePort32(); - case 33: return closePort33(); - case 34: return closePort34(); - case 35: return closePort35(); - case 36: return closePort36(); - case 37: return closePort37(); - case 38: return closePort38(); - case 39: return closePort39(); - case 40: return closePort40(); - } - } - + #region Simulation / RFID / NFC Interface: ReadRequestPort, WriteRequestPort /// /// Wrapper function with safe interface and unsafe body /// /// Water meter (iPerlHead) object /// Value returned by readRequestPort(...) - public static unsafe int ReadRequestPort(IperlHead iperlHead, MessageID messageID, int offset, int length, out byte[] buffer, int timeout) - { + public static int ReadRequestPort(IperlHead iperlHead, MessageID messageID, StructName structName, int offset, int length, out byte[] buffer) + { Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries)); + if (iperlHead.DebugLevel == DebugMode.FailureDuringOperation) iperlHead.DebugLevel = DebugMode.Normal; - if (iperlHead.DebugLevel != DebugMode.Normal) + if (iperlHead.DebugLevel != DebugMode.Normal) // Simulation { - /// - /// Simulation - /// - if ((messageID == MessageID.Configuration) && (offset == 0) && (length == ConfigStruct.Length)) - { - buffer = new byte[ConfigStruct.Length] { 3, 3, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0, 1,2,3,4,5, 160, 0,0,0,0, 0,0, 0,0, 0,0 }; - } - else if ((messageID == MessageID.Calibration) && (offset == 0) && (length == CalibrationStruct.Length)) - { - buffer = new byte[CalibrationStruct.Length] { 3, 0, 150,10, 0, 0, 0,0, 0,0,0,0,0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0,0,0, 1,2,3,4,5, 0, 0 }; - } - else if ((messageID == MessageID.Calibration) && (offset == 0) && (length == CalibrationStructV4.Length)) - { - buffer = new byte[CalibrationStructV4.Length] { 3, 0, 150,10, 0, 0, 0,0, 0,0,0,0,0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0,0,0, 1,2,3,4,5, 0, 0, 150,10 }; - } - else if ((messageID == MessageID.Calibration) && (offset == 2) && (length == 2)) - { - buffer = new byte[2] { 150,10 }; - } - else if ((messageID == MessageID.Calibration) && (offset == 34) && (length == 2)) - { - buffer = new byte[2] { 150,10 }; - } - else if ((messageID == MessageID.MetrologyMemory) && (offset == Q2CorrFactorsAddr) && (length == 2)) - { - buffer = new byte[2] { 0, 0 }; - } - else - { - buffer = new byte[length]; - } - - return iperlHead.Name.Equals("iPerl13") ? 2 : 0; /// Simulates an error on position 13 + return SimulationServices.ReadRequest(cfg, iperlHead, messageID, offset, length, out buffer); } - buffer = new byte[length]; - byte[] buf = new byte[200]; - /// - fixed (byte* pBuf = buf) - { - int retv; - - switch (iperlHead.Position) - { - default: - case 1: retv = readRequestPort1(messageID, offset, length, pBuf, timeout); break; - case 2: retv = readRequestPort2(messageID, offset, length, pBuf, timeout); break; - case 3: retv = readRequestPort3(messageID, offset, length, pBuf, timeout); break; - case 4: retv = readRequestPort4(messageID, offset, length, pBuf, timeout); break; - case 5: retv = readRequestPort5(messageID, offset, length, pBuf, timeout); break; - case 6: retv = readRequestPort6(messageID, offset, length, pBuf, timeout); break; - case 7: retv = readRequestPort7(messageID, offset, length, pBuf, timeout); break; - case 8: retv = readRequestPort8(messageID, offset, length, pBuf, timeout); break; - case 9: retv = readRequestPort9(messageID, offset, length, pBuf, timeout); break; - case 10: retv = readRequestPort10(messageID, offset, length, pBuf, timeout); break; - case 11: retv = readRequestPort11(messageID, offset, length, pBuf, timeout); break; - case 12: retv = readRequestPort12(messageID, offset, length, pBuf, timeout); break; - case 13: retv = readRequestPort13(messageID, offset, length, pBuf, timeout); break; - case 14: retv = readRequestPort14(messageID, offset, length, pBuf, timeout); break; - case 15: retv = readRequestPort15(messageID, offset, length, pBuf, timeout); break; - case 16: retv = readRequestPort16(messageID, offset, length, pBuf, timeout); break; - case 17: retv = readRequestPort17(messageID, offset, length, pBuf, timeout); break; - case 18: retv = readRequestPort18(messageID, offset, length, pBuf, timeout); break; - case 19: retv = readRequestPort19(messageID, offset, length, pBuf, timeout); break; - case 20: retv = readRequestPort20(messageID, offset, length, pBuf, timeout); break; - case 21: retv = readRequestPort21(messageID, offset, length, pBuf, timeout); break; - case 22: retv = readRequestPort22(messageID, offset, length, pBuf, timeout); break; - case 23: retv = readRequestPort23(messageID, offset, length, pBuf, timeout); break; - case 24: retv = readRequestPort24(messageID, offset, length, pBuf, timeout); break; - case 25: retv = readRequestPort25(messageID, offset, length, pBuf, timeout); break; - case 26: retv = readRequestPort26(messageID, offset, length, pBuf, timeout); break; - case 27: retv = readRequestPort27(messageID, offset, length, pBuf, timeout); break; - case 28: retv = readRequestPort28(messageID, offset, length, pBuf, timeout); break; - case 29: retv = readRequestPort29(messageID, offset, length, pBuf, timeout); break; - case 30: retv = readRequestPort30(messageID, offset, length, pBuf, timeout); break; - case 31: retv = readRequestPort31(messageID, offset, length, pBuf, timeout); break; - case 32: retv = readRequestPort32(messageID, offset, length, pBuf, timeout); break; - case 33: retv = readRequestPort33(messageID, offset, length, pBuf, timeout); break; - case 34: retv = readRequestPort34(messageID, offset, length, pBuf, timeout); break; - case 35: retv = readRequestPort35(messageID, offset, length, pBuf, timeout); break; - case 36: retv = readRequestPort36(messageID, offset, length, pBuf, timeout); break; - case 37: retv = readRequestPort37(messageID, offset, length, pBuf, timeout); break; - case 38: retv = readRequestPort38(messageID, offset, length, pBuf, timeout); break; - case 39: retv = readRequestPort39(messageID, offset, length, pBuf, timeout); break; - case 40: retv = readRequestPort40(messageID, offset, length, pBuf, timeout); break; - } - - for (int i = 0; i < length; i++) buffer[i] = buf[i]; - - /// - /// Logging - /// - string name = string.Format("{0}({1})", iperlHead.Name, iperlHead.SerialNr); - if ((messageID == MessageID.Configuration) && (offset == 0) && (length == ConfigStruct.Length)) - rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : ConfigStruct.FromByteArray(buffer).ToString()); - else if ((messageID == MessageID.Calibration) && (offset == 0) && (length == CalibrationStruct.Length)) - rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : CalibrationStruct.FromByteArray(buffer).ToString()); - else if ((messageID == MessageID.Calibration) && (offset == 0) && (length == CalibrationStructV4.Length)) - rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : CalibrationStructV4.FromByteArray(buffer).ToString()); - else if ((messageID == MessageID.Calibration) && (offset == 2) && (length == 2)) - rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},2,2,...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : string.Format("Cal={0}", buf[0] + 256 * buf[1])); - else if ((messageID == MessageID.Calibration) && (offset == 34) && (length == 2)) - rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},34,2,...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : string.Format("CalLNA={0}", buf[0] + 256 * buf[1])); - else if ((messageID == MessageID.MetrologyMemory) && (offset == Q2CorrFactorsAddr) && (length == 2)) - rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},6264,2,...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : string.Format("LR={0} RL={1}", (int)buf[0], (int)buf[1])); - else - rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1}, {2}, {3}, ...) returned {4} {5}", name, messageID, offset, length, retv, (retv != 0) ? "!" : ""); - - return retv; + if (iperlHead.CommInterface == CommunicationInterface.NFC) // NFC Interface + { + return NfcServices.ReadRequest(cfg, iperlHead, structName, offset, length, out buffer); } - } + else // RFID Interface + { + return RfidServices.ReadRequest(cfg, iperlHead, messageID, offset, length, out buffer); + } + } - /// - /// Wrapper function with safe interface and unsafe body - /// + /// + /// Wrapper function with safe interface and unsafe body + /// /// Water meter (iPerlHead) object - /// Value returned by writeRequestPort(...) - public static unsafe int WriteRequestPort(IperlHead iperlHead, MessageID messageID, int offset, int length, byte[] buffer, int timeout) - { + /// Value returned by writeRequestPort(...) + public static int WriteRequestPort(IperlHead iperlHead, MessageID messageID, StructName structName, int offset, int length, byte[] buffer) + { Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries)); + if (iperlHead.DebugLevel == DebugMode.FailureDuringOperation) iperlHead.DebugLevel = DebugMode.Normal; - if (iperlHead.DebugLevel != DebugMode.Normal) return 0; - - fixed (byte* pBuf = buffer) - { - int retv; - - switch (iperlHead.Position) - { - default: - case 1: retv = writeRequestPort1(messageID, offset, length, pBuf, timeout); break; - case 2: retv = writeRequestPort2(messageID, offset, length, pBuf, timeout); break; - case 3: retv = writeRequestPort3(messageID, offset, length, pBuf, timeout); break; - case 4: retv = writeRequestPort4(messageID, offset, length, pBuf, timeout); break; - case 5: retv = writeRequestPort5(messageID, offset, length, pBuf, timeout); break; - case 6: retv = writeRequestPort6(messageID, offset, length, pBuf, timeout); break; - case 7: retv = writeRequestPort7(messageID, offset, length, pBuf, timeout); break; - case 8: retv = writeRequestPort8(messageID, offset, length, pBuf, timeout); break; - case 9: retv = writeRequestPort9(messageID, offset, length, pBuf, timeout); break; - case 10: retv = writeRequestPort10(messageID, offset, length, pBuf, timeout); break; - case 11: retv = writeRequestPort11(messageID, offset, length, pBuf, timeout); break; - case 12: retv = writeRequestPort12(messageID, offset, length, pBuf, timeout); break; - case 13: retv = writeRequestPort13(messageID, offset, length, pBuf, timeout); break; - case 14: retv = writeRequestPort14(messageID, offset, length, pBuf, timeout); break; - case 15: retv = writeRequestPort15(messageID, offset, length, pBuf, timeout); break; - case 16: retv = writeRequestPort16(messageID, offset, length, pBuf, timeout); break; - case 17: retv = writeRequestPort17(messageID, offset, length, pBuf, timeout); break; - case 18: retv = writeRequestPort18(messageID, offset, length, pBuf, timeout); break; - case 19: retv = writeRequestPort19(messageID, offset, length, pBuf, timeout); break; - case 20: retv = writeRequestPort20(messageID, offset, length, pBuf, timeout); break; - case 21: retv = writeRequestPort21(messageID, offset, length, pBuf, timeout); break; - case 22: retv = writeRequestPort22(messageID, offset, length, pBuf, timeout); break; - case 23: retv = writeRequestPort23(messageID, offset, length, pBuf, timeout); break; - case 24: retv = writeRequestPort24(messageID, offset, length, pBuf, timeout); break; - case 25: retv = writeRequestPort25(messageID, offset, length, pBuf, timeout); break; - case 26: retv = writeRequestPort26(messageID, offset, length, pBuf, timeout); break; - case 27: retv = writeRequestPort27(messageID, offset, length, pBuf, timeout); break; - case 28: retv = writeRequestPort28(messageID, offset, length, pBuf, timeout); break; - case 29: retv = writeRequestPort29(messageID, offset, length, pBuf, timeout); break; - case 30: retv = writeRequestPort30(messageID, offset, length, pBuf, timeout); break; - case 31: retv = writeRequestPort31(messageID, offset, length, pBuf, timeout); break; - case 32: retv = writeRequestPort32(messageID, offset, length, pBuf, timeout); break; - case 33: retv = writeRequestPort33(messageID, offset, length, pBuf, timeout); break; - case 34: retv = writeRequestPort34(messageID, offset, length, pBuf, timeout); break; - case 35: retv = writeRequestPort35(messageID, offset, length, pBuf, timeout); break; - case 36: retv = writeRequestPort36(messageID, offset, length, pBuf, timeout); break; - case 37: retv = writeRequestPort37(messageID, offset, length, pBuf, timeout); break; - case 38: retv = writeRequestPort38(messageID, offset, length, pBuf, timeout); break; - case 39: retv = writeRequestPort39(messageID, offset, length, pBuf, timeout); break; - case 40: retv = writeRequestPort40(messageID, offset, length, pBuf, timeout); break; - } - - /// - /// Logging - /// - string name = string.Format("{0}({1})", iperlHead.Name, iperlHead.SerialNr); - if (length == 1) - rfidDataLogger.InfoFormat("{0}: WriteRequestPort({2}, {3}, {4}, {5}) returned {1} {6}", name, retv, messageID, offset, length, pBuf[0].ToString("X2"), (retv != 0) ? "!" : ""); - else if (length == 2) - { - if (messageID == MessageID.Calibration && offset == 2) - { - UInt16 calibFactor = (UInt16)(pBuf[0] + 256 * pBuf[1]); - rfidDataLogger.InfoFormat("{0}: WriteRequestPort(Cal={1}) returned {2} {3}", name, calibFactor, retv, (retv != 0) ? "!" : ""); - } - else if (messageID == MessageID.Calibration && offset == 34) - { - UInt16 calibFactor = (UInt16)(pBuf[0] + 256 * pBuf[1]); - rfidDataLogger.InfoFormat("{0}: WriteRequestPort(CalLNA={1}) returned {2} {3}", name, calibFactor, retv, (retv != 0) ? "!" : ""); - } - else - rfidDataLogger.InfoFormat("{0}: WriteRequestPort({2}, {3}, {4}, {5} {6}) returned {1} {7}", name, retv, messageID, offset, length, pBuf[0].ToString("X2"), pBuf[1].ToString("X2"), (retv != 0) ? "!" : ""); - } - else - rfidDataLogger.InfoFormat("{0}: WriteRequestPort({2}, {3}, {4}, {5} {6} ...) returned {1} {7}", name, retv, messageID, offset, length, pBuf[0].ToString("X2"), pBuf[1].ToString("X2"), (retv != 0) ? "!" : ""); - - return retv; + if (iperlHead.DebugLevel != DebugMode.Normal) // Simulation + { + return SimulationServices.WriteRequest(cfg, iperlHead, messageID, offset, length, buffer); } - } -#endregion DLL_Interface + if (iperlHead.CommInterface == CommunicationInterface.NFC) // NFC Interface + { + return NfcServices.WriteRequest(cfg, iperlHead, structName, offset, length, buffer); + } + else // RFID Interface + { + return RfidServices.WriteRequest(cfg, iperlHead, messageID, offset, length, buffer); + } + } + #endregion iPerl_Head_RFID_Interface: ReadRequestPort, WriteRequestPort - readonly bool checkBoxesEditMode; + readonly bool checkBoxesEditMode; DateTime startTime; int startTimeSec; @@ -698,7 +191,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// /// RFID multiplexer PCB / RFID serial port and worker thread related variables /// - static TestMethodCfg cfg; + static TestMethod testMethod; + public static TestMethodCfg cfg; static IList tests; static IList multiTestParams; @@ -726,21 +220,40 @@ namespace TBF.Rig.TestMethods.iPerlCommunication public iPerlCommunicationForm(bool isCheckBoxesEditMode) : this() { + iPerlCommunicationForm.cfg = new TestMethodCfg(null); // default iPerl Head communication params if (isCheckBoxesEditMode) { checkBoxesEditMode = true; saveButton.Visible = true; activityLabel.Text = Strings.Optical_heads; ShuffleTextBoxes(ProcessData.WMsCount, ProcessData.LineSize); + +#if IPERL + ContextMenu cm = new ContextMenu(); + cm.MenuItems.Add(NewMenuItem("Read PCB Number" , "ReadPCB")); + cm.MenuItems.Add(NewMenuItem("Enter Test Mode" , "StartTestMode")); + cm.MenuItems.Add(NewMenuItem("Turn Off Test Mode (Enter Active Mode)", "TurnOffTestMode")); + cm.MenuItems.Add(NewMenuItem("Set Production Mode (Radio not start with flow)" , "SetProductionMode")); + cm.MenuItems.Add(NewMenuItem("Turn Off Radio" , "TurnOffRadio")); + cm.MenuItems.Add(NewMenuItem($"Set RFID mode ({Strings.Program_restart_is_required_to_apply_some_settings})" , "SetRFID")); + cm.MenuItems.Add(NewMenuItem($"Set NFC mode ({Strings.Program_restart_is_required_to_apply_some_settings})" , "SetNFC")); + /*if (Users.CurrentUser.AuthorizedAs == AuthorizedAs.PowerUser) + { + //cm.MenuItems.Add(NewMenuItem("Test WriteRequestPort (u8_Customer_Text)", "WriteRequestPort_u8_Customer_Text")); + cm.MenuItems.Add(NewMenuItem("Open sealing", "OpenSealing")); + }*/ + this.ContextMenu = cm; +#endif } } + - /// + /// /// Constructor for one iPerlCommunication 'test' /// /// Number of text boxes for serial numbers - public iPerlCommunicationForm(TestMethodCfg cfg, Test test, iPerlCommunicationParams testParams) - : this(cfg, new List { test }, new List { testParams }) + public iPerlCommunicationForm(TestMethod testMethod, Test test, iPerlCommunicationParams testParams) + : this(testMethod, new List { test }, new List { testParams }) { } @@ -748,12 +261,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Constructor for multiple iPerlCommunication 'tests' /// /// Number of text boxes for serial numbers - public iPerlCommunicationForm(TestMethodCfg cfg, IList tests, IList multiTestParams) + public iPerlCommunicationForm(TestMethod testMethod, IList tests, IList multiTestParams) : this() { checkBoxesEditMode = false; - iPerlCommunicationForm.cfg = cfg; + iPerlCommunicationForm.testMethod = testMethod; + iPerlCommunicationForm.cfg = testMethod.Cfg as TestMethodCfg; iPerlCommunicationForm.tests = tests; iPerlCommunicationForm.multiTestParams = multiTestParams; @@ -939,7 +453,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication ResizeDlgToFitEnabledControls(); } - void ResizeDlgToFitEnabledControls() { int xMax = 0; @@ -1067,7 +580,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } - #region Forced close handling + #region Forced close handling public void StartForceCloseHandler() { @@ -1090,7 +603,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication Close(); } - #endregion + #endregion /// @@ -1122,7 +635,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication int count = 0; for (int wmNr0 = 0; wmNr0 < iperlHeads.Count; wmNr0++) { - Results.Entities.WaterMeter wm = (ProcessData.BatchRslts.Batch.WaterMeters != null && ProcessData.BatchRslts.Batch.WaterMeters.Count > wmNr0) + WaterMeter wm = (ProcessData.BatchRslts.Batch.WaterMeters != null && ProcessData.BatchRslts.Batch.WaterMeters.Count > wmNr0) ? ProcessData.BatchRslts.Batch.WaterMeters[wmNr0] : null; IperlHead ihead = iperlHeads[wmNr0]; @@ -1170,7 +683,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication { wmFound = true; - Results.Entities.WaterMeter wm = null; + WaterMeter wm = null; if (ProcessData.BatchRslts.Batch.WaterMeters != null) { foreach (var w in ProcessData.BatchRslts.Batch.WaterMeters) @@ -1214,8 +727,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication else if (currentActivity.ToLower().Contains(WriteQ2CorrectionRLStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL, currentActivity.Substring(WriteQ2CorrectionRLStr.Length).Trim()); else if (currentActivity.ToLower().Contains(WriteQ2CorrectionLRStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR, currentActivity.Substring(WriteQ2CorrectionLRStr.Length).Trim()); else if (currentActivity.ToLower() == WriteQ2CorrectionIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard_incl_05, null); + else if (currentActivity.ToLower() == WriteQ2CorrectionPlusIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard_plus_incl_05, null); else if (currentActivity.ToLower() == WriteQ2CorrectionAltIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa_incl_05, null); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionGreeceIncl05Str.ToLower()))error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece_incl_05, currentActivity.Substring(WriteQ2CorrectionGreeceIncl05Str.Length).Trim()); + else if (currentActivity.ToLower() == WriteQ2CorrectionPlusAltIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa_plus_incl_05, null); + else if (currentActivity.ToLower().Contains(WriteQ2CorrectionGreeceIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece_incl_05, currentActivity.Substring(WriteQ2CorrectionGreeceIncl05Str.Length).Trim()); else if (currentActivity.ToLower().Contains(WriteQ2CorrectionRLIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL_incl_05, currentActivity.Substring(WriteQ2CorrectionRLIncl05Str.Length).Trim()); else if (currentActivity.ToLower().Contains(WriteQ2CorrectionLRIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR_incl_05, currentActivity.Substring(WriteQ2CorrectionLRIncl05Str.Length).Trim()); else if (currentActivity.ToLower().Contains(UpdateBothQ2FactorsTestRLOnlyStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.UpdateBothQ2FactorsTestRLDir, null); @@ -1229,12 +744,29 @@ namespace TBF.Rig.TestMethods.iPerlCommunication else if (currentActivity.ToLower() == GetDefaultQ2CorrectionsStr.ToLower()) error = GetQ2PreCorrectionsFormRest(threadID, ihead, wm, ref resultStr); else if (currentActivity.ToLower() == DewaReworkRLStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.R_L, ref resultStr); else if (currentActivity.ToLower() == DewaReworkLRStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.L_R, ref resultStr); - + else if (currentActivity.ToLower().Contains(StartTestingSealedMetersStr.ToLower())) error = StartTestingSealedMeter(ihead, wm, ref resultStr); + else if (currentActivity.ToLower().Contains(EndTestingSealedMetersStr.ToLower())) error = EndTestingSealedMeter(ihead, wm, ref resultStr); + else if (currentActivity.ToLower().Contains(SimulateCmd.ToLower())) error = Simulate(ihead, wm, ref resultStr); #endif else { error = CommErr.None; - resultStr = "Invalid activity"; + + ConditionID id = ConditionID.Count; +#if IPERL + for (id = ConditionID.A; id < ConditionID.Count; id++) + { + if (currentActivity.ToLower() == string.Format(SequenceConditionOp.ConditionNameFmt, id).ToLower()) + { + error = SetIperlCommMilestoneReached(testMethod, id, ref resultStr); + break; + } + } +#endif + if (id == ConditionID.Count) + { + resultStr = "Invalid activity"; /// No activity or milestone + } } /// @@ -1313,7 +845,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ReadConfiguration(IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr ReadConfiguration(IperlHead ihead, WaterMeter wm, ref string resultStr) { /// /// The activity is "Read configuration" (this enables the watermeter, resets error flag) @@ -1328,30 +860,19 @@ namespace TBF.Rig.TestMethods.iPerlCommunication ihead.ConfigStruct = null; /// Clear previous ConfigStruct, avoid reuse of (not anymore valid) PCB Number - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.Read; int readRetVal = 0; /// Read configuration byte[] config = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) + readRetVal = ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 0, ConfigStruct.Length, out config); + if (readRetVal == 0) { - readRetVal = ReadRequestPort(ihead, MessageID.Configuration, 0, ConfigStruct.Length, out config, cfg.CommTimeout); - if (readRetVal == 0) - { - error = CommErr.None; - ihead.ConfigStruct = ConfigStruct.FromByteArray(config); - resultStr = ihead.ConfigStruct.ToString(1); - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + error = CommErr.None; + ihead.ConfigStruct = ConfigStruct.FromByteArray(config); + resultStr = ihead.ConfigStruct.ToString(1); } - ClosePort(ihead); /// Close RFID port - return error + Math.Max(0, Math.Min(readRetVal, 4)); } @@ -1390,8 +911,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } /// Communication necessary - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.None; if (error==CommErr.None && (ihead.ConfigStruct.TestModeConfig != testModeConfig) && (ihead.ConfigStruct.MeterState != MeterState.Active)) @@ -1399,16 +918,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Switch to Active mode in order to change TestModeConfig error = CommErr.CmdActive; byte[] cmd = new byte[1] { (byte)Command.SetActiveMode }; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd)) { - if (0 == WriteRequestPort(ihead, MessageID.Command, 0, 1, cmd, cfg.CommTimeout)) - { - error = CommErr.None; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + error = CommErr.None; } /// Delay min. 250 ms @@ -1420,17 +932,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Change the TestModeConfig if necessary error = CommErr.Write; byte[] tstMdCfg = new byte[1] { testModeConfig }; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == WriteRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 21, 1, tstMdCfg)) { - if (0 == WriteRequestPort(ihead, MessageID.Configuration, 21, 1, tstMdCfg, cfg.CommTimeout)) - { - ihead.ConfigStruct.Update(21, tstMdCfg); - error = CommErr.None; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + ihead.ConfigStruct.Update(21, tstMdCfg); + error = CommErr.None; } /// Delay min. 250 ms @@ -1442,16 +947,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Switch to test mode error = CommErr.CmdTest; byte[] cmd = new byte[1] { (byte)Command.SetTestMode }; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd)) { - if (0 == WriteRequestPort(ihead, MessageID.Command, 0, 1, cmd, cfg.CommTimeout)) - { - error = CommErr.None; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + error = CommErr.None; } /// Delay min. 250 ms @@ -1462,28 +960,21 @@ namespace TBF.Rig.TestMethods.iPerlCommunication if (error == CommErr.None) { /// Verify the configuration + Thread.Sleep(2000); // RFID: 1000 ms is enough, NFC needs min 2000 ms error = CommErr.Verify; byte[] config = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) + int retVal = ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 0, ConfigStruct.Length, out config); + if (0 == retVal) { - if (0 == ReadRequestPort(ihead, MessageID.Configuration, 0, ConfigStruct.Length, out config, cfg.CommTimeout)) + ihead.ConfigStruct = ConfigStruct.FromByteArray(config); + if ((ihead.ConfigStruct.MeterState == MeterState.Test) && (ihead.ConfigStruct.TestModeConfig == testModeConfig)) { - ihead.ConfigStruct = ConfigStruct.FromByteArray(config); - if ((ihead.ConfigStruct.MeterState == MeterState.Test) && (ihead.ConfigStruct.TestModeConfig == testModeConfig)) - { - error = CommErr.None; - resultStr = ihead.ConfigStruct.ToString(1); - break; - } + error = CommErr.None; + resultStr = ihead.ConfigStruct.ToString(1); } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); } } - ClosePort(ihead); /// Close RFID port - return error; } @@ -1497,22 +988,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// true on success static CommErr SetActiveMode(int threadId, IperlHead ihead, ref string resultStr) { - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.CmdActive; /// Switch to active mode byte[] cmd = new byte[1] { (byte)Command.SetActiveMode }; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd)) { - if (0 == WriteRequestPort(ihead, MessageID.Command, 0, 1, cmd, cfg.CommTimeout)) - { - error = CommErr.None; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + error = CommErr.None; } #if VERIFY_ACTIVE_MODE @@ -1522,25 +1004,18 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Read configuration byte[] cfg_0_3 = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) - { if (ihead.ConfigStruct == null) { - if (0 == ReadRequestPort(threadId, ihead, MessageID.Configuration, 0, 4, out cfg_0_3, cfg.CommTimeout)) + if (0 == ReadRequestPort(threadId, ihead, MessageID.Configuration, 0, 4, out cfg_0_3)) { ihead.ConfigStruct.Update(0, cfg_0_3); if (ihead.ConfigStruct.MeterState == MeterState.Active) { error = CommErr.None; resultStr = ihead.ConfigStruct.ToString(1); - break; } } } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); - } } #else if (error == CommErr.None) @@ -1552,8 +1027,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } #endif - ClosePort(ihead); /// Close RFID port - return error; } @@ -1564,41 +1037,30 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ReadCalibration(IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr ReadCalibration(IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.Read; int readRetVal = 0; /// Read calibration byte[] calib = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) + readRetVal = ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 0, CalibrationStruct.Length, out calib); + if (readRetVal == 0) { - readRetVal = ReadRequestPort(ihead, MessageID.Calibration, 0, CalibrationStruct.Length, out calib, cfg.CommTimeout); - if (readRetVal == 0) - { - ihead.CalibrationStruct = CalibrationStruct.FromByteArray(calib); + ihead.CalibrationStruct = CalibrationStruct.FromByteArray(calib); - if (wm.OrigCalibFactor == 0) - { - wm.OrigCalibFactor = ihead.CalibrationStruct.Calibration; - wm.FWVersion = ihead.CalibrationStruct.FWVersionStr(); - } + if (wm.OrigCalibFactor == 0) + { + wm.OrigCalibFactor = ihead.CalibrationStruct.Calibration; + wm.FWVersion = ihead.CalibrationStruct.FWVersionStr(); + } - resultStr = ihead.CalibrationStruct.ToString(); - error = ihead.VerifyIPerlType() ? CommErr.None : CommErr.WrongIPerlType; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + resultStr = ihead.CalibrationStruct.ToString(); + error = ihead.VerifyIPerlType() ? CommErr.None : CommErr.WrongIPerlType; } - ClosePort(ihead); /// Close RFID port - return error + Math.Max(0, Math.Min(readRetVal, 4)); } @@ -1609,42 +1071,31 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ReadCalibrationV4(IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr ReadCalibrationV4(IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.Read; int readRetVal = 0; /// Read calibration byte[] calib = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) + readRetVal = ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 0, CalibrationStructV4.Length, out calib); + if (readRetVal == 0) { - readRetVal = ReadRequestPort(ihead, MessageID.Calibration, 0, CalibrationStructV4.Length, out calib, cfg.CommTimeout); - if (readRetVal == 0) + ihead.CalibrationStructV4 = CalibrationStructV4.FromByteArray(calib); + + if ((wm.OrigCalibFactor == 0) && (wm.OrigCalibFactorLNA == 0)) { - ihead.CalibrationStructV4 = CalibrationStructV4.FromByteArray(calib); - - if ((wm.OrigCalibFactor == 0) && (wm.OrigCalibFactorLNA == 0)) - { - wm.OrigCalibFactor = ihead.CalibrationStructV4.Calibration; - wm.OrigCalibFactorLNA = ihead.CalibrationStructV4.CalibrationLNA; - wm.FWVersion = ihead.CalibrationStructV4.FWVersionStr(); - } - - resultStr = ihead.CalibrationStructV4.ToString(); - error = ihead.VerifyIPerlType() ? CommErr.None : CommErr.WrongIPerlType; - break; + wm.OrigCalibFactor = ihead.CalibrationStructV4.Calibration; + wm.OrigCalibFactorLNA = ihead.CalibrationStructV4.CalibrationLNA; + wm.FWVersion = ihead.CalibrationStructV4.FWVersionStr(); } - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + resultStr = ihead.CalibrationStructV4.ToString(); + error = ihead.VerifyIPerlType() ? CommErr.None : CommErr.WrongIPerlType; } - ClosePort(ihead); /// Close RFID port - return error + Math.Max(0, Math.Min(readRetVal, 4)); } @@ -1658,7 +1109,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr WriteCalibrationFactor(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr WriteCalibrationFactor(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed || (ihead.CalibrationStruct == null)) return CommErr.CommFailed; @@ -1752,43 +1203,33 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// /// Start communication with iPerl /// - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error; byte[] data = new byte[2] { (byte)(newCalibFactor & 0x00FF), (byte)((newCalibFactor >> 8) & 0x00FF) }; - int writeAndVerifyRetries = 0; - do + /// + /// Write the new calibration factor (up to cfg.MaxCommRetries tims) + /// + error = CommErr.Write; + if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data)) { /// - /// Write the new calibration factor (up to cfg.MaxCommRetries tims) - /// - error = CommErr.Write; - if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data, cfg.CommTimeout)) - { - /// - /// Read and verify the calibration factor - /// - error = CommErr.ReadAfterWrite; - byte[] calib_2_3 = null; - if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3, cfg.CommTimeout)) - { - error = CommErr.Verify; - if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1]) - { - error = CommErr.None; - ihead.CalibrationStruct.Update(data, 2); - wm.CalibFactor = newCalibFactor; - resultStr = ihead.CalibrationStruct.ToString(); - break; - } - } + /// Read and verify the calibration factor + /// + error = CommErr.ReadAfterWrite; + byte[] calib_2_3 = null; + if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3)) + { + error = CommErr.Verify; + if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1]) + { + error = CommErr.None; + ihead.CalibrationStruct.Update(data, 2); + wm.CalibFactor = newCalibFactor; + resultStr = ihead.CalibrationStruct.ToString(); + } } - - ihead.CalibrationStruct.Update(data, 2); } - while (++writeAndVerifyRetries <= cfg.MaxCommRetries); - ClosePort(ihead); /// Close RFID port + ihead.CalibrationStruct.Update(data, 2); return error; } @@ -1803,7 +1244,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr WriteCalibrationV4Factors(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr WriteCalibrationV4Factors(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed || (ihead.CalibrationStructV4 == null)) return CommErr.CommFailed; @@ -1918,59 +1359,41 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// /// Start communication with iPerl /// - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error; byte[] data = new byte[2] { (byte)(newCalibFactor & 0x00FF), (byte)((newCalibFactor >> 8) & 0x00FF) }; byte[] dataLNA = new byte[2] { (byte)(newCalibFactorLNA & 0x00FF), (byte)((newCalibFactorLNA >> 8) & 0x00FF) }; - int writeAndVerifyRetries = 0; - do + /// + /// Write the new calibration factor (up to cfg.MaxCommRetries tims) + /// + error = CommErr.Write; + if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data) && + 0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 34, 2, dataLNA)) { /// - /// Write the new calibration factor (up to cfg.MaxCommRetries tims) - /// - error = CommErr.Write; - if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data, cfg.CommTimeout) && - 0 == WriteRequestPort(ihead, MessageID.Calibration, 34, 2, dataLNA, cfg.CommTimeout)) + /// Read and verify the calibration factor + /// + error = CommErr.ReadAfterWrite; + byte[] calib_2_3 = null; + byte[] calib_34_35 = null; + if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3) && + 0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 34, 2, out calib_34_35)) { - /// - /// Read and verify the calibration factor - /// - error = CommErr.ReadAfterWrite; - byte[] calib_2_3 = null; - byte[] calib_34_35 = null; - if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3, cfg.CommTimeout) && - 0 == ReadRequestPort(ihead, MessageID.Calibration, 34, 2, out calib_34_35, cfg.CommTimeout)) + error = CommErr.Verify; + if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1] && + calib_34_35 != null && calib_34_35.Length == 2 && dataLNA[0] == calib_34_35[0] && dataLNA[1] == calib_34_35[1]) { - error = CommErr.Verify; - if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1] && - calib_34_35 != null && calib_34_35.Length == 2 && dataLNA[0] == calib_34_35[0] && dataLNA[1] == calib_34_35[1]) - { - error = CommErr.None; - ihead.CalibrationStructV4.Update(data, 2); - ihead.CalibrationStructV4.Update(dataLNA, 34); - wm.CalibFactor = newCalibFactor; - wm.CalibFactorLNA = newCalibFactorLNA; - resultStr = ihead.CalibrationStructV4.ToString(); - break; - } + error = CommErr.None; + ihead.CalibrationStructV4.Update(data, 2); + ihead.CalibrationStructV4.Update(dataLNA, 34); + wm.CalibFactor = newCalibFactor; + wm.CalibFactorLNA = newCalibFactorLNA; + resultStr = ihead.CalibrationStructV4.ToString(); } } - - ihead.CalibrationStructV4.Update(data, 2); - ihead.CalibrationStructV4.Update(dataLNA, 34); - - writeAndVerifyRetries++; - - if ((writeAndVerifyRetries <= cfg.MaxCommRetries) && (cfg.DelayBetweenRetries > 0)) - { - /// Delay between retries - Thread.Sleep(cfg.DelayBetweenRetries); - } } - while (writeAndVerifyRetries <= cfg.MaxCommRetries); - ClosePort(ihead); /// Close RFID port + ihead.CalibrationStructV4.Update(data, 2); + ihead.CalibrationStructV4.Update(dataLNA, 34); return error; } @@ -1982,7 +1405,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter /// TestData (name and repetitions) /// (1) selected MeterTestRslt or (2) average of repeated MTR-s or (3) null when at least one MTR is missing - static Results.Entities.MeterTestRslt GetAverageTestRslt(Results.Entities.WaterMeter wm, Results.Entities.TestData testData) + static Results.Entities.MeterTestRslt GetAverageTestRslt(WaterMeter wm, Results.Entities.TestData testData) { Results.Entities.MeterTestRslt avgTestRslt; @@ -2014,18 +1437,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr NormalizeCalibrationFactor(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr NormalizeCalibrationFactor(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed || (ihead.CalibrationStruct == null)) return CommErr.CommFailed; if (ihead.FactorLimitLo <= ihead.CalibFactor && ihead.CalibFactor <= ihead.FactorLimitHi) { - resultStr = "Calibratin factor is OK"; + resultStr = "Calibration factor is OK"; return CommErr.None; /// No need to update the calibration factor } - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.Write; /// Determine the new calibration factor @@ -2055,17 +1476,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } byte[] data = new byte[2] { (byte)(defaultCalibFactor & 0x00FF), (byte)((defaultCalibFactor >> 8) & 0x00FF) }; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data)) { - if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data, cfg.CommTimeout)) - { - error = CommErr.None; - ihead.CalibrationStruct.Update(data, 2); - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + error = CommErr.None; + ihead.CalibrationStruct.Update(data, 2); } if (error == CommErr.None) @@ -2074,23 +1488,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Read calibration byte[] calib_2_3 = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3)) { - if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3, cfg.CommTimeout)) - { - error = CommErr.None; - ihead.CalibrationStruct.Update(calib_2_3, 2); - resultStr = ihead.CalibrationStruct.ToString(); - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + error = CommErr.None; + ihead.CalibrationStruct.Update(calib_2_3, 2); + resultStr = ihead.CalibrationStruct.ToString(); } } - ClosePort(ihead); /// Close RFID port - return error; } @@ -2101,7 +1506,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr NormalizeCalibrationV4Factors(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr NormalizeCalibrationV4Factors(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed || (ihead.CalibrationStructV4 == null)) return CommErr.CommFailed; @@ -2111,8 +1516,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication return CommErr.None; /// No need to update the calibration factor } - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.Write; /// Determine the new calibration factor @@ -2142,17 +1545,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } byte[] data = new byte[2] { (byte)(defaultCalibFactor & 0x00FF), (byte)((defaultCalibFactor >> 8) & 0x00FF) }; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data)) { - if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data, cfg.CommTimeout)) - { - error = CommErr.None; - ihead.CalibrationStructV4.Update(data, 2); - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + error = CommErr.None; + ihead.CalibrationStructV4.Update(data, 2); } if (error == CommErr.None) @@ -2161,23 +1557,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Read calibration byte[] calib_2_3 = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3)) { - if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3, cfg.CommTimeout)) - { - error = CommErr.None; - ihead.CalibrationStructV4.Update(calib_2_3, 2); - resultStr = ihead.CalibrationStructV4.ToString(); - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + error = CommErr.None; + ihead.CalibrationStructV4.Update(calib_2_3, 2); + resultStr = ihead.CalibrationStructV4.ToString(); } } - ClosePort(ihead); /// Close RFID port - return error; } @@ -2189,27 +1576,18 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ReadQ2Correction(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr ReadQ2Correction(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.Read; /// Write zero Q2 correction byte[] rdData = null; /// - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == ReadRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, 2, out rdData)) { - if (0 == ReadRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, cfg.CommTimeout)) - { - error = CommErr.None; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + error = CommErr.None; } if ((error == CommErr.None) && (rdData != null) && (rdData.Length == 2)) @@ -2219,8 +1597,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication wm.Q2CorrRL = ihead.Q2CorrRL = (int)((SByte)rdData[1]); } - ClosePort(ihead); /// Close RFID port - return error; } @@ -2231,7 +1607,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ResetQ2Correction(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr ResetQ2Correction(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, 0, 0); } @@ -2243,7 +1619,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr WriteDefaultQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr WriteDefaultQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -2299,29 +1675,20 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr WriteQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr, int factorLR, int factorRL) + static CommErr WriteQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr, int factorLR, int factorRL) { if (ihead.CommFailed) return CommErr.CommFailed; - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.Write; /// Write zero Q2 correction byte[] wrData = new byte[2] { (byte)factorLR, (byte)factorRL }; /// - for (int j = 0; j < cfg.MaxCommRetries; j++) - { - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout)) - { - wm.Q2CorrRL = ihead.Q2CorrRL = factorRL; - wm.Q2CorrLR = ihead.Q2CorrLR = factorLR; - error = CommErr.None; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, wrData.Length, wrData)) + { + wm.Q2CorrRL = ihead.Q2CorrRL = factorRL; + wm.Q2CorrLR = ihead.Q2CorrLR = factorLR; + error = CommErr.None; } /// @@ -2335,19 +1702,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Read calibration byte[] rdData = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) - { - if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, cfg.CommTimeout)) && + if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData)) && (rdData != null) && (rdData.Length == 2) && (rdData[0] == 0) && (rdData[1] == 0)) { error = CommErr.None; resultStr = string.Format("Q2 correction set to LR={0}, RL={1}", factorLR, factorRL); - break; } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); - } } #else if (error == CommErr.None) @@ -2356,13 +1716,11 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } #endif - ClosePort(ihead); /// Close RFID port - return error; } - static CommErr InitOrReadQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr InitOrReadQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; if (wm.Pruefindex == 0) return CommErr.CommFailed; /// Unknown pruefindex @@ -2426,27 +1784,18 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr Reset2HzCorrection(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr Reset2HzCorrection(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.Write; /// Write zero Q2 correction byte[] wrData = new byte[1] { 0 }; - /// - for (int j = 0; j < cfg.MaxCommRetries; j++) - { - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout)) - { - error = CommErr.None; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + /// + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Hz2CorrFactorsAddr, wrData.Length, wrData)) + { + error = CommErr.None; } /// @@ -2460,20 +1809,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Read calibration byte[] rdData = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) - { - if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData, cfg.CommTimeout)) && + if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData)) && (rdData != null) && (rdData.Length == 2) && (rdData[0] == 0) && (rdData[1] == 0)) { error = CommErr.None; resultStr = "2Hz correction reset to 0"; ihead.Q2CorrectionFactor = 0; - break; } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); - } } #else if (error == CommErr.None) @@ -2483,8 +1825,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } #endif - ClosePort(ihead); /// Close RFID port - return error; } @@ -2502,13 +1842,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr CalculateAndWriteQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, + static CommErr CalculateAndWriteQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, Test test, ref string resultStr, Q2CorrType q2CorrType, string restOfLine) { var args = string.IsNullOrEmpty(restOfLine) ? new string[0] : restOfLine.Split(new char[] { ' ' }); Results.Entities.MeterTestRslt q2adjResult; /// The only test or the 1st test (the test in R-L direction) - Results.Entities.TestData q2adjTestData; + Results.Entities.TestData q2adjTestData; /// The 2nd test in L-R direction in case tests in both directions are done /// if (args.Length == 0) { @@ -2550,10 +1890,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } } - q2adjResult.Error = Formulas.ErrorFromVolumes(q2adjResult.VolumeMeter, q2adjResult.VolumeRef); + q2adjResult.Error = Config.Formulas.ErrorFromVolumes(q2adjResult.VolumeMeter, q2adjResult.VolumeRef); } } + var q3mtr = wm.MeterTestRslts.FirstOrDefault(x => x.Name() == "Q3"); + double q3error = (q3mtr != null) ? q3mtr.Error : 0; Results.Entities.MeterTestRslt q2adjResult2 = null; /// 2nd test name for a test in L-R direction Results.Entities.TestData q2adjTestData2 = null; @@ -2591,7 +1933,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } } - q2adjResult2.Error = Formulas.ErrorFromVolumes(q2adjResult2.VolumeMeter, q2adjResult2.VolumeRef); + q2adjResult2.Error = Config.Formulas.ErrorFromVolumes(q2adjResult2.VolumeMeter, q2adjResult2.VolumeRef); } } @@ -2612,125 +1954,105 @@ namespace TBF.Rig.TestMethods.iPerlCommunication return CommErr.None; /// No Q2 correction when doing conditional update and WM passed } - - double errLimitLo = test.ErrLimLo + test.Uncertainty; + double errLimitLo = test.ErrLimLo + test.Uncertainty; double errLimitHi = test.ErrLimHi - test.Uncertainty; - /// - if (q2adjResult.Error < errLimitLo || errLimitHi < q2adjResult.Error || - (q2adjResult2 != null && (q2adjResult2.Error < errLimitLo || errLimitHi < q2adjResult2.Error))) - { - /// At least one of Q2 errors is out of range for Q2 correction - log.WarnFormat("OoR => no Q2 correction: Pos={0}, PCB#={1}, ***Q2_RL err={2}%***, ***Q2_LR err={3}%***, CalTarget={4}%, [Lo={5}%, Hi={6}%]", - ihead.Name, - ihead.SerialNr, - q2adjResult.Error.ToString("F2"), - q2adjResult2 != null ? q2adjResult2.Error.ToString("F2") : string.Empty, - ihead.CalibTargetQ2.ToString("F1"), - errLimitLo.ToString("F2"), - errLimitHi.ToString("F2")); - - resultStr = string.Format("Q2 error is out of range => no Q2 correction"); - rfidDataLogger.InfoFormat("{0}({1}): Q2 error ({2},{3}) is out of range ({4}..{5}) => Failed", - ihead.Name, - ihead.SerialNr, - q2adjResult.Error.ToString("F2"), - q2adjResult2 != null ? q2adjResult2.Error.ToString("F2") : string.Empty, - errLimitLo.ToString("F2"), - errLimitHi.ToString("F2")); - return CommErr.Q2OutOfRange; - } - /// - /// Calculate Q2 correction factor(s) from an error measured at Q2 + /// Calculate Q2 correction factor(s) /// - double q2Correction = 0; - double q2Correction2 = 0; /// L-R direction in case of Q2CorrType.Update and Q2CorrType.ConditionalUpdate - - if (q2CorrType == Q2CorrType.Update || q2CorrType == Q2CorrType.ConditionalUpdate) - { - /// Calculate two Q2 correction factors from two tests done in both directions - q2Correction = ihead.CalculateQ2CorrectionFactor(q2adjResult, ihead.CalibTargetQ2, q2adjTestData.Qfrom, q2adjResult.Q2CorrRL); - q2Correction2 = ihead.CalculateQ2CorrectionFactor(q2adjResult2, ihead.CalibTargetQ2, q2adjTestData2.Qfrom, q2adjResult2.Q2CorrLR); - } - else - { - /// Calculate Q2 correction factors from a single test - q2Correction = ihead.CalculateQ2CorrectionFactor(q2adjResult, ihead.CalibTargetQ2, q2adjTestData.Qfrom, q2adjResult.Q2CorrRL); - q2Correction2 = ihead.CalculateQ2CorrectionFactor(q2adjResult, ihead.CalibTargetQ2, q2adjTestData.Qfrom, q2adjResult.Q2CorrLR); - } - - int q2CorrRL = 0; int q2CorrLR = 0; /// - if (q2CorrType == Q2CorrType.Standard || q2CorrType == Q2CorrType.Standard_incl_05 || q2CorrType == Q2CorrType.UpdateBothQ2FactorsTestRLDir) + if (q2CorrType == Q2CorrType.Standard || + q2CorrType == Q2CorrType.Standard_incl_05 || + q2CorrType == Q2CorrType.Standard_plus_incl_05) { /// - /// Standard process + /// Standard process (RL) + /// No 2nd Q2 test, MakeQ2CorrectedFrom(...) is used to calculate Q2 error + /// Do not forget to modify iPerlCommunicationSeq.MakeQ2CorrectedFrom(...) /// - if (q2CorrType == Q2CorrType.Standard && Math.Abs(q2adjResult.Error - ihead.CalibTargetQ2) <= 0.5) - { - resultStr = string.Format("Q2 correction = 0 (writing bypassed)"); - return CommErr.None; - } - - q2CorrRL = (int)Math.Round(1.1 * q2Correction); - q2CorrLR = (int)Math.Round(0.5 * q2Correction); + double errorTarget = (q3error * q2adjResult.Error < 0) ? (0.1 * q2adjResult.Error) : (-0.1 * q2adjResult.Error); + q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom, errorTarget)))); } - else if (q2CorrType == Q2CorrType.Dewa || q2CorrType == Q2CorrType.Dewa_incl_05) + else if (q2CorrType == Q2CorrType.Dewa || + q2CorrType == Q2CorrType.Dewa_incl_05 || + q2CorrType == Q2CorrType.Dewa_plus_incl_05) { /// - /// Process for DEWA + /// Standard process for the oposite flow direction (LR) + /// No 2nd Q2 test, MakeQ2CorrectedFrom(...) is used to calculate Q2 error + /// Do not forget to modify iPerlCommunicationSeq.MakeQ2CorrectedFrom(...) /// - if (q2CorrType == Q2CorrType.Dewa && Math.Abs(q2adjResult.Error - ihead.CalibTargetQ2) <= 0.5) + double errorTarget = (q3error * q2adjResult.Error < 0) ? (0.1 * q2adjResult.Error) : (-0.1 * q2adjResult.Error); + q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrLR, q2adjTestData.Qfrom, errorTarget)))); + } + else if (q2CorrType == Q2CorrType.RL || + q2CorrType == Q2CorrType.RL_incl_05 || + q2CorrType == Q2CorrType.ConditionalUpdateRL) + { + /// + /// RL only + /// Assuming the 2nd Q2 test is done afterwards + /// MakeQ2CorrectedFrom(...) is not used + /// + if (q2CorrType == Q2CorrType.RL && Math.Abs(q2adjResult.Error) <= 0.5) { resultStr = string.Format("Q2 correction = 0 (writing bypassed)"); return CommErr.None; } - /// Use the same correction factor in both directions - q2CorrRL = (int)Math.Round(1.0 * q2Correction2); - q2CorrLR = (int)Math.Round(1.0 * q2Correction2); + q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom)))); + } + else if (q2CorrType == Q2CorrType.LR || + q2CorrType == Q2CorrType.LR_incl_05 || + q2CorrType == Q2CorrType.ConditionalUpdateLR) + { + /// + /// LR only + /// Assuming the 2nd Q2 test is done afterwards + /// MakeQ2CorrectedFrom(...) is not used + /// + if (q2CorrType == Q2CorrType.LR && Math.Abs(q2adjResult.Error) <= 0.5) + { + resultStr = string.Format("Q2 correction = 0 (writing bypassed)"); + return CommErr.None; + } + + q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrLR, q2adjTestData.Qfrom)))); + } + else if (q2CorrType == Q2CorrType.Update || q2CorrType == Q2CorrType.ConditionalUpdate) + { + /// + /// After tests in both directions + /// Assuming the 2nd Q2 tests are done afterwards + /// MakeQ2CorrectedFrom(...) is not used + /// + q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom)))); + q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult2, q2adjResult2.Q2CorrLR, q2adjTestData2.Qfrom)))); } else if (q2CorrType == Q2CorrType.Greece || q2CorrType == Q2CorrType.Greece_incl_05 || q2CorrType == Q2CorrType.UpdateBothQ2FactorsTestLRDir) { /// /// Process for Greece /// - if (q2CorrType == Q2CorrType.Greece && Math.Abs(q2adjResult.Error - ihead.CalibTargetQ2) <= 0.5) + if (q2CorrType == Q2CorrType.Greece && Math.Abs(q2adjResult.Error) <= 0.5) { resultStr = string.Format("Q2 correction = 0 (writing bypassed)"); return CommErr.None; } - q2CorrRL = (int)Math.Round(2.0 * q2Correction2); - q2CorrLR = (int)Math.Round(1.0 * q2Correction2); - } - else if (q2CorrType == Q2CorrType.RL || q2CorrType == Q2CorrType.RL_incl_05 || q2CorrType == Q2CorrType.ConditionalUpdateRL) /// RL only - { - if (q2CorrType == Q2CorrType.RL && Math.Abs(q2adjResult.Error - ihead.CalibTargetQ2) <= 0.5) - { - resultStr = string.Format("Q2 correction = 0 (writing bypassed)"); - return CommErr.None; - } - - q2CorrRL = (int)Math.Round(q2Correction); + q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrLR, q2adjTestData.Qfrom)))); + q2CorrRL = q2CorrLR; } - else if (q2CorrType == Q2CorrType.LR || q2CorrType == Q2CorrType.LR_incl_05 || q2CorrType == Q2CorrType.ConditionalUpdateLR) /// LR only + else if (q2CorrType == Q2CorrType.UpdateBothQ2FactorsTestRLDir) { - if (q2CorrType == Q2CorrType.LR && Math.Abs(q2adjResult.Error - ihead.CalibTargetQ2) <= 0.5) - { - resultStr = string.Format("Q2 correction = 0 (writing bypassed)"); - return CommErr.None; - } - - q2CorrLR = (int)Math.Round(q2Correction2); - } - else if ((q2CorrType == Q2CorrType.Update) || (q2CorrType == Q2CorrType.ConditionalUpdate)) - { - q2CorrRL = (int)Math.Round(q2Correction); - q2CorrLR = (int)Math.Round(q2Correction2); + /// + /// Another strange process + /// + double errorTarget = (q3error * q2adjResult.Error < 0) ? (0.1 * q2adjResult.Error) : (-0.1 * q2adjResult.Error); + q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom, errorTarget)))); + q2CorrLR = q2CorrRL; } @@ -2739,44 +2061,42 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// if (ihead.CommFailed) return CommErr.CommFailed; - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port CommErr error = CommErr.Write; - if (q2CorrType == Q2CorrType.RL || q2CorrType == Q2CorrType.RL_incl_05 || q2CorrType == Q2CorrType.ConditionalUpdateRL) + + if (q2CorrType == Q2CorrType.Standard || + q2CorrType == Q2CorrType.Standard_incl_05 || + q2CorrType == Q2CorrType.Standard_plus_incl_05 || + q2CorrType == Q2CorrType.RL || + q2CorrType == Q2CorrType.RL_incl_05 || + q2CorrType == Q2CorrType.ConditionalUpdateRL) { /// /// Write R-L Q2 correction factor only /// byte[] wrData = new byte[1] { (byte)q2CorrRL }; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddrRL, wrData.Length, wrData)) { - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddrRL, wrData.Length, wrData, cfg.CommTimeout)) - { - error = CommErr.None; - wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL; + resultStr = string.Format("Q2 correction: RL={0}", q2CorrRL); + error = CommErr.None; } } - else if (q2CorrType == Q2CorrType.LR || q2CorrType == Q2CorrType.LR_incl_05 || q2CorrType == Q2CorrType.ConditionalUpdateLR) + else if (q2CorrType == Q2CorrType.Dewa || + q2CorrType == Q2CorrType.Dewa_incl_05 || + q2CorrType == Q2CorrType.Dewa_plus_incl_05 || + q2CorrType == Q2CorrType.LR || + q2CorrType == Q2CorrType.LR_incl_05 || + q2CorrType == Q2CorrType.ConditionalUpdateLR) { /// /// Write L-R Q2 correction factor only /// byte[] wrData = new byte[1] { (byte)q2CorrLR }; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddrLR, wrData.Length, wrData)) { - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddrLR, wrData.Length, wrData, cfg.CommTimeout)) - { - error = CommErr.None; - wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR; + resultStr = string.Format("Q2 correction: LR={0}", q2CorrLR); + error = CommErr.None; } } else @@ -2785,24 +2105,49 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Write both Q2 correction factors /// byte[] wrData = new byte[2] { (byte)q2CorrLR, (byte)q2CorrRL }; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, wrData.Length, wrData)) { - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout)) - { - error = CommErr.None; - wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL; - wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL; + wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR; + resultStr = string.Format("Q2 correction: RL={0}, LR={1}", q2CorrRL, q2CorrLR); + error = CommErr.None; } } - /// - /// Verification disabled on 16.02.2016 - /// + + /// + /// Q2 correction factor was successfully written to the water meter. + /// Check whether the original error at Q2 was within limits. + /// + if (error == CommErr.None && + (q2adjResult.Error < errLimitLo || errLimitHi < q2adjResult.Error || + (q2adjResult2 != null && (q2adjResult2.Error < errLimitLo || errLimitHi < q2adjResult2.Error)))) + { + resultStr += " (OoR)"; + + /// At least one of Q2 errors is out of range for Q2 correction + log.WarnFormat("OoR => anyhow Q2 correction was done: Pos={0}, PCB#={1}, ***Q2_RL err={2}%***, ***Q2_LR err={3}%***, [Lo={4}%, Hi={5}%]", + ihead.Name, + ihead.SerialNr, + q2adjResult.Error.ToString("F2"), + q2adjResult2 != null ? q2adjResult2.Error.ToString("F2") : string.Empty, + errLimitLo.ToString("F2"), + errLimitHi.ToString("F2")); + + rfidDataLogger.InfoFormat("{0}({1}): Q2 error ({2},{3}) is out of range ({4}..{5}) => Failed", + ihead.Name, + ihead.SerialNr, + q2adjResult.Error.ToString("F2"), + q2adjResult2 != null ? q2adjResult2.Error.ToString("F2") : string.Empty, + errLimitLo.ToString("F2"), + errLimitHi.ToString("F2")); + + error = CommErr.Q2OutOfRange; + } + + /// + /// Verification disabled on 16.02.2016 + /// #if false if (error == CommErr.None) { @@ -2810,9 +2155,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Read calibration byte[] rdData = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) - { - if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, cfg.CommTimeout)) && + if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData)) && (rdData != null) && (rdData.Length == 2) && (rdData[0] == q2CorrRFlow) && (rdData[1] == q2CorrLFlow)) { error = CommErr.None; @@ -2822,43 +2165,24 @@ namespace TBF.Rig.TestMethods.iPerlCommunication wm.Q2ErrWOCorrection = ihead.Q2ErrorWOCorrection; if (q2CorrType != Q2CorrType.LR) wm.Q2CorrRFlow = ihead.Q2CorrRFlow = (int)(sbyte)q2CorrRFlow; if (q2CorrType != Q2CorrType.RL) wm.Q2CorrLFlow = ihead.Q2CorrLFlow = (int)(sbyte)q2CorrLFlow; - break; } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); - } } #else + + if ((q2CorrType != Q2CorrType.Update) && (q2CorrType != Q2CorrType.ConditionalUpdate)) + { + wm.Q2ErrWOCorrection = ihead.Q2ErrWOCorrection = q2adjResult.Error; + } + /// /// Update WaterMeter entity and IperlHead /// if (error == CommErr.None) { - if (q2CorrType == Q2CorrType.RL) - { - resultStr = string.Format("Q2 correction: RL={0}", q2CorrRL); - } - else if (q2CorrType == Q2CorrType.LR) - { - resultStr = string.Format("Q2 correction: LR={0}", q2CorrLR); - } - else - { - resultStr = string.Format("Q2 correction: RL={0}, LR={1}", q2CorrRL, q2CorrLR); - } - - rfidDataLogger.WarnFormat("{0}: {1}", ihead.Name, resultStr); - - if ((q2CorrType != Q2CorrType.Update) && (q2CorrType != Q2CorrType.ConditionalUpdate)) - { - wm.Q2ErrWOCorrection = ihead.Q2ErrWOCorrection = q2adjResult.Error; - } + rfidDataLogger.WarnFormat("{0}({1}): {2}", ihead.Name, ihead.SerialNr, resultStr); } #endif - ClosePort(ihead); /// Close RFID port - return error; } @@ -2869,7 +2193,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr Write2HzCorrection(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + static CommErr Write2HzCorrection(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -2884,25 +2208,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication return CommErr.None; } - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - CommErr error = CommErr.Write; Byte hz2CorrectionByte = (byte)(hz2CorrectionFactor & 0x000000FF); byte[] wrData = new byte[1] { hz2CorrectionByte }; - /// - for (int j = 0; j < cfg.MaxCommRetries; j++) - { - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout)) - { - error = CommErr.None; - wm.Hz2Correction = ihead.Hz2Correction = hz2CorrectionFactor; - wm.Hz2CorrectionDone = ihead.Hz2CorrectionDone = true; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + /// + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Hz2CorrFactorsAddr, wrData.Length, wrData)) + { + error = CommErr.None; + wm.Hz2Correction = ihead.Hz2Correction = hz2CorrectionFactor; + wm.Hz2CorrectionDone = ihead.Hz2CorrectionDone = true; } /// @@ -2915,9 +2230,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Read calibration byte[] rdData = null; - for (int j = 0; j < cfg.MaxCommRetries; j++) - { - if ((0 == ReadRequestPort(wm, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData, cfg.CommTimeout)) && + if ((0 == ReadRequestPort(wm, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData)) && (rdData != null) && (rdData.Length == 2) && (rdData[0] == hz2CorrectionByte)) { error = CommErr.None; @@ -2926,12 +2239,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication wm.Hz2Correction = ihead.Hz2CorrectionFactor = hz2CorrectionFactor; wm.Diff2Hz8Hz = ihead.Diff2Hz8Hz; wm.Hz2CorrectionDone = ihead.Hz2CorrectionDone; - break; } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); - } } #else if (error == CommErr.None) @@ -2944,57 +2252,63 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } #endif - ClosePort(ihead); /// Close RFID port - return error; } - /// /// DEWA rework. /// /// iPERL head object /// Water meter object + /// Arrow direction /// String passed to caller /// true on success - static CommErr DewaRework(IperlHead ihead, Results.Entities.WaterMeter wm, FlowDir flowDir, ref string resultStr) + static CommErr DewaRework(IperlHead ihead, WaterMeter wm, FlowDir flowDir, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; - if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port - byte arrow = (flowDir == FlowDir.L_R) ? (byte)1 : (byte)2; /// L-R is reverse flow (=1), R-L is forward flow (=2)(default) - iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[] + List dataToBeWritten = new List { - new iPerlDataWrite(MessageID.MetrologyMemory, 0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), - new iPerlDataWrite(MessageID.RadioPassthrough, 0x1804, new byte[] { (byte)1 }, "System Status"), - new iPerlDataWrite(MessageID.MetrologyMemory, 0x1985, new byte[] { arrow }, "Arrow"), - new iPerlDataWrite(MessageID.MetrologyMemory, 0x199C, new byte[5], "Clear S/N"), - new iPerlDataWrite(MessageID.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"), - new iPerlDataWrite(MessageID.Configuration, 0x0015, new byte[] { (byte)0xA0 }, "Test mode config = A0"), - new iPerlDataWrite(MessageID.MetrologyMemory, 0x198E, new byte[] { (byte)(2510 & 0xFF), (byte)((2510 >> 8) & 0xFF) }, "Receipt mean current"), - new iPerlDataWrite(MessageID.RadioPassthrough, 0x18A2, new byte[] { (byte)0x4A, (byte)0x53, (byte)0x3B, (byte)0x8F, - (byte)0x70, (byte)0x31, (byte)0xC2, (byte)0x5D, - (byte)0x6F, (byte)0x2D, (byte)0xE8, (byte)0x07, - (byte)0x6E, (byte)0x0F, (byte)0x97, (byte)0xC3, }, "AES Key Crypted"), + new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), // ????? + new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 5:0x1985, new byte[] { arrow }, "Arrow"), + new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 28:0x199C, new byte[5], "Clear S/N"), + new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { (byte)0xA0 }, "Test mode config = A0"), + new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 14:0x198E, new byte[] { (byte)(2510 & 0xFF), (byte)((2510 >> 8) & 0xFF) }, "Receipt mean current") }; + // check meter status: 1-Idle, 2-Active, 3-Test, 4-End Of Life + if (0 == ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 1, 1, out byte[] rdData)) + { + int eMeterState = (int)((SByte)rdData[0]); + switch (eMeterState) + { + case 1: // Idle -> Test -> Active + dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetTestMode }, "Set test mode")); + dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode")); + break; + case 3: // Test Mode -> Active + dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode")); + break; + } + } + + dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)1 }, "System Status")); + dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioParams, 0x1898, new byte[] { (byte)3 }, "WakeUpInterval")); + dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioParams, 0x18A2, new byte[] { (byte)0x4A, (byte)0x53, (byte)0x3B, (byte)0x8F, + (byte)0x70, (byte)0x31, (byte)0xC2, (byte)0x5D, + (byte)0x6F, (byte)0x2D, (byte)0xE8, (byte)0x07, + (byte)0x6E, (byte)0x0F, (byte)0x97, (byte)0xC3, }, "AES Key Crypted")); + int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step int mask = 1; foreach (var wData in dataToBeWritten) { bool isSuccessfullyWritten = false; - for (int j = 0; j < cfg.MaxCommRetries; j++) + if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data)) { - if (0 == WriteRequestPort(ihead, wData.MessageID, wData.Offset, wData.Data.Length, wData.Data, cfg.CommTimeout)) - { - isSuccessfullyWritten = true; - break; - } - - /// Delay between retries - if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries); + isSuccessfullyWritten = true; } if (!isSuccessfullyWritten) @@ -3006,8 +2320,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication mask = (mask << 1); /// Adjust the mask for the next step } - ClosePort(ihead); /// Close RFID port - if (successfyllyWrittenFlags == 0) { /// Success @@ -3026,27 +2338,182 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } } + /// + /// Start testing a sealed meter + /// + /// iPERL head object + /// Water meter object + /// String passed to caller + /// true on success + static CommErr StartTestingSealedMeter(IperlHead ihead, WaterMeter wm, ref string resultStr) + { + if (ihead.CommFailed) return CommErr.CommFailed; - static CommErr GetQ2PreCorrectionsFormRest(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr) + Byte testModeConfig = 0xA0; /// Default value + /// + if (multiTestParams[currentActivityStep].Activity.Length > StartTestingSealedMetersStr.Length) + { + string testModeConfigStr = multiTestParams[currentActivityStep].Activity.Substring(StartTestingSealedMetersStr.Length + 1); + UInt16 byteVal; + if (UInt16.TryParse(testModeConfigStr, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out byteVal) && byteVal <= 255) + { + testModeConfig = (Byte)byteVal; /// Update with specified value + } + } + + iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[] + { + new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), /// 0x5A=sealed, 0xA5=unsealed ?????? + new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)1 }, "System Status"), + new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"), + new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)), + }; + + if (ihead.ConfigStruct != null) ihead.OrigTestModeConfig = ihead.ConfigStruct.TestModeConfig; + + int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step + int mask = 1; + foreach (var wData in dataToBeWritten) + { + bool isSuccessfullyWritten = false; + if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data)) + { + isSuccessfullyWritten = true; + } + + if (!isSuccessfullyWritten) + { + /// Communication failed in this step + successfyllyWrittenFlags = (successfyllyWrittenFlags | mask); + } + + mask = (mask << 1); /// Adjust the mask for the next step + } + + if (successfyllyWrittenFlags == 0) + { + /// Success + if (ihead.ConfigStruct != null) + { + ihead.ConfigStruct.MeterState = MeterState.Active; + ihead.ConfigStruct.TestModeConfig = (byte)0xA0; + } + + resultStr = "OK"; + return CommErr.None; + } + else + { + return CommErr.Write; + } + } + + /// + /// End testing a sealed meter + /// + /// iPERL head object + /// Water meter object + /// String passed to caller + /// true on success + static CommErr EndTestingSealedMeter(IperlHead ihead, WaterMeter wm, ref string resultStr) + { + if (ihead.CommFailed) return CommErr.CommFailed; + + Byte testModeConfig = (ihead.OrigTestModeConfig != 0) ? ihead.OrigTestModeConfig : (byte)0x80; /// Restore original value (default is 0x80) + + iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[] + { + new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"), + new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)), + new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)0 }, "System Status"), + new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0x5A }, "Close Sealing") /// 0x5A=sealed, 0xA5=unsealed ?????? + }; + + int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step + int mask = 1; + foreach (var wData in dataToBeWritten) + { + bool isSuccessfullyWritten = false; + if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data)) + { + isSuccessfullyWritten = true; + } + + if (!isSuccessfullyWritten) + { + /// Communication failed in this step + successfyllyWrittenFlags = (successfyllyWrittenFlags | mask); + } + + mask = (mask << 1); /// Adjust the mask for the next step + } + + if (successfyllyWrittenFlags == 0) + { + /// Success + if (ihead.ConfigStruct != null) + { + ihead.ConfigStruct.MeterState = MeterState.Active; + ihead.ConfigStruct.TestModeConfig = (byte)0xA0; + } + + resultStr = "OK"; + return CommErr.None; + } + else + { + return CommErr.Write; + } + } + + static CommErr GetQ2PreCorrectionsFormRest(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) { if (!ProcessData.IsQ2PreCorrectionCalculated) { ProcessData.IsQ2PreCorrectionCalculated = true; - commonWMType = ihead.WMType_ID; - bool success = iPerlCommunicationSeq.GetQ2PreCorrectionsOrBackups(cfg, commonWMType, + /*bool success = iPerlCommunicationSeq.GetQ2PreCorrectionsOrBackups(cfg, wm.WMTypeId(), out ProcessData.CalculatedQ2PreCorrectionLR, - out ProcessData.CalculatedQ2PreCorrectionRL); - } - else if (ihead.WMType_ID != commonWMType) - { - resultStr = string.Format("Different WZ_Typ: {0} ({1} expected)", ihead.WMType_ID, commonWMType); - return CommErr.WrongIPerlType; + out ProcessData.CalculatedQ2PreCorrectionRL);*/ } resultStr = string.Format("Q2 pre-corrections: LR={0} RL={1}", ProcessData.CalculatedQ2PreCorrectionLR, ProcessData.CalculatedQ2PreCorrectionRL); return CommErr.None; } + static CommErr SetIperlCommMilestoneReached(TestMethod testMethod, ConditionID id, ref string resultStr) + { + if (id < ConditionID.A || id >= ConditionID.Count) + { + resultStr = Strings.Error; + return CommErr.WrongArguments; + } + + testMethod.IperlCommMilestone[(int)id] = true; + resultStr = string.Format(SequenceConditionOp.ConditionNameFmt, id); + return CommErr.None; + } + + static CommErr Simulate(IperlHead ihead, WaterMeter wm, ref string resultStr) + { + string[] arguments = multiTestParams[currentActivityStep].Activity.Split(new char[] { ' ' }); + + if (arguments.Length < 2 || arguments[1].ToLower() != "iperls") return CommErr.None; + + if (ihead.CommFailed) return CommErr.CommFailed; + + string[] pcbNrs = new string[] { "831232435539", "831232435562", + "831232435587", "831232432141", + "831232432497", "831232763641" }; + + if (wm.WMPosition > 0 && wm.WMPosition <= pcbNrs.Length) + { + ihead.SerialNr = wm.SerialNr = pcbNrs[wm.WMPosition - 1]; + } + + resultStr = string.Format("PCB Nr. = {0}", wm.SerialNr ?? ""); + return CommErr.None; + } + #endif /// IPERL #endregion @@ -3214,9 +2681,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication if (meterRslt != null && iperlHeads[i] != null) { -#if ORACLE_DB - meterRslt.WaterMeter.WaterMeterData.WMTypeId = iperlHeads[i].WMType_ID; -#endif meterRslt.WaterMeter.SerialNr = iperlHeads[i].SerialNr; meterRslt.Passed = (!iperlHeads[i].CommFailed && !iperlHeads[i].Disabled); meterRslt.TestDone = true; @@ -3228,6 +2692,79 @@ namespace TBF.Rig.TestMethods.iPerlCommunication UiBridge.Bridge.OnTestCompleted(this, new UiBridge.TestCompletedEventArgs(string.Empty, null)); } +#if IPERL + private MenuItem NewMenuItem(string text, string tag) + { + MenuItem menuItem = new MenuItem { Text = text, Tag = tag }; + menuItem.Click += OnClick_Optical_Heads_Settings_Menu; + return menuItem; + } + private async void OnClick_Optical_Heads_Settings_Menu(object sender, EventArgs e) + { + MenuItem menuItem = (MenuItem)sender; + activityLabel.Text = menuItem.Text; + List tasks = new List(); + foreach (var iHead in ProcessData.IperlHeads) + { + if (!checkBoxes[iHead.Position - 1].Checked) + { + if (iHead.Position - 1 < messages.Length) messages[iHead.Position - 1].Text = ""; + continue; + } + messages[iHead.Position - 1].Text = $"COM{iHead.RfidComPortNr}"; + Application.DoEvents(); // Refresh UI + tasks.Add(Task.Run(async () => + { + string result = await ProcessTask(iHead, menuItem.Tag); + this.Invoke((Action)(() => + { + messages[iHead.Position - 1].Text = result; + Application.DoEvents(); // Refresh UI + })); + + })); + + } + await Task.WhenAll(tasks); + } + + private async Task ProcessTask(IperlHead iHead, object tag) + { + string txt = ""; + switch (tag) + { + case "ReadPCB": + txt = OpticalHeadTest.ReadRequest_PCB(iHead); + break; + case "WriteRequestPort_u8_Customer_Text": + txt = OpticalHeadTest.WriteRequestPort_u8_Customer_Text(iHead); + break; + case "OpenSealing": + txt = OpticalHeadTest.OpenSealing(iHead); + break; + case "StartTestMode": + txt = OpticalHeadTest.SetTestMode(iHead); + break; + case "TurnOffTestMode": + txt = OpticalHeadTest.SetActiveMode(iHead); + break; + case "TurnOffRadio": + txt = OpticalHeadTest.TurnOffRadio(iHead); + break; + case "SetProductionMode": + txt = OpticalHeadTest.SetProductionMode(iHead); + break; + case "SetRFID": + txt = OpticalHeadTest.SetRfidMode(iHead); + break; + case "SetNFC": + txt = OpticalHeadTest.SetNfcMode(iHead); + break; + } + return txt; + } +#endif /// IPERL + #region Check boxes edit mode support private void checkBoxImage1_Click(object sender, EventArgs e) { ckbState[ckbIndex[0]] = checkBoxImage1.Checked; } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.designer.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.designer.cs index eeb828447..e87740ce6 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.designer.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.designer.cs @@ -178,54 +178,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication this.pictureBox3 = new System.Windows.Forms.PictureBox(); this.pictureBox2 = new System.Windows.Forms.PictureBox(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.checkBoxImage1 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage2 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage3 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage4 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage5 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage6 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage7 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage8 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage9 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage10 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage11 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage12 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage13 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage14 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage15 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage16 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage17 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage18 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage19 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage20 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage21 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage22 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage23 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage24 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage25 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage26 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage27 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage28 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage29 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage30 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage31 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage32 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage33 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage34 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage35 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage36 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage37 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage38 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage39 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage40 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage41 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage42 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage43 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage44 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage45 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage46 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage47 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage48 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); this.saveButton = new System.Windows.Forms.Button(); this.samplePictureBox1 = new System.Windows.Forms.PictureBox(); this.samplePictureBox2 = new System.Windows.Forms.PictureBox(); @@ -233,6 +185,54 @@ namespace TBF.Rig.TestMethods.iPerlCommunication this.sampleLabel1 = new System.Windows.Forms.Label(); this.sampleLabel2 = new System.Windows.Forms.Label(); this.sampleLabel3 = new System.Windows.Forms.Label(); + this.checkBoxImage48 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage47 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage46 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage45 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage44 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage43 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage42 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage41 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage40 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage39 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage38 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage37 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage36 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage35 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage34 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage33 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage32 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage31 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage30 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage29 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage28 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage27 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage26 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage25 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage24 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage23 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage22 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage21 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage20 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage19 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage18 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage17 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage16 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage15 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage14 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage13 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage12 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage11 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage10 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage9 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage8 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage7 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage6 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage5 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage4 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage3 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage2 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage1 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox48)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox47)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox46)).BeginInit(); @@ -281,57 +281,57 @@ namespace TBF.Rig.TestMethods.iPerlCommunication ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).BeginInit(); this.SuspendLayout(); // // wmTextBox2 @@ -2639,57 +2639,57 @@ namespace TBF.Rig.TestMethods.iPerlCommunication ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.resx b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.resx index 5ee43624a..20987c220 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.resx +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.resx @@ -118,3508 +118,3460 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAADAAAAAeCAYAAABqpJ3BAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADr4AAA6+AepCscAAAA+KSURBVFhHdVh3lFz1ed04DSODAHVtU9ldrcqqCySKgTjH - Nn/4nJycJM7JMSfEWNjGAVMMOAScABamGhxABRkJISFpVxISQkjbe2+zu1N2eu+97czO7Oze3O/JS0LT - OVe/N++9mf3uV+73/X5FtbW1+DqEw2FEYlEFsVjsM0TjXBNxJFJJJNMpJJNciXQyhQwxlUgiN5VBNpNG - NptFejqLVC6L+EwWsZkcIoUcEphFHAWkZguYnpvDHPhP/ivwv+kZYCoHZPKYS+WQjya/0j7B1xIQ4/1B - H7xeL+x2Oxw2O3w+H++TUCSGUChCMglEo1Hl3VgkinQ8gSxJTZPMdCyOGL+PmTzyND4UCiCZTSGRz8Kf - iiGFGQVpYmpuhrbmkMlkkM9kgXwBc7lZkCMK2VkUSESuv8rOryTgdrthc1hhd9pgNpsVTIyNo7e7B62t - 7Qra2jrQ1dUDg8GAQCCAeDiCBElE/X4F2VgEc2kSiUcQctmRigbp3jxi0QBSmRjSuRTCqbCCxDSJF6b5 - nFbOFZDLTiOVSCNPIjMzs5hlUJKpKYTolC/a+iUCTqdTMVirVUOjmcBAXz862ztw8cLH+PD4Cbx/5BiO - /PEojh07jlOnanHw4EHs378fFz86B82YCklGYyaTwuxUEjPJCDIhRiEVQSHiRy7oAhJBFJIB5LliNo25 - OaZZLoqp6ZiCaRJj2BQybq8H2dkZxJiCU7wjKRecnv6cvZ8j4PF4rnp7YgIjI0NoaWnChY/O4+h7R3Do - wEEafxS1p+pw8uRpnDhxEocOHSaJUzh79iyOvHcYhw/sR92JE+htbYZLr8Fs2APEQkD0T5jUAB474LIB - Xq5OExAmqXSYz0k07CZBvpeO0uUx5g9rgCmXJ6EAoxblGpzNwZqIfJmApIHD4YBarUZvby9TpAXHjx/D - 8WMf4PChd5X14/MX0NTUgsbGZnzyyafo7RtAfWOD8v1zZ+tw6ZOPcfniedS9fwTHXnsZP/mbu/DjnTvx - q9278V87d+PZdRvw+83b8d7Nt+Idru9s3Yk3tm3HS1u34L+JfXv24PzeB2A7ehRzQ4NAiFESB+TTTCGm - 6NwUGFeE5qaVaHxGQIpQvC/53N/fj/r6enq1jumxnx4/jcuXPlXSqK2tDc3NrWhhDbR3dOFk3Rl88ukl - DPCPDQ0NoLmpgUROo/7cGfSdOY33Hn0Ev9yxAz9bXozXKzfhzJY9eH9xOU5cvxIXlq5B3Q0lOH1TKY4v - LcPhJSXYv6wMbywqxtMLbsRPv3Uj6h95HDM9PSTC6GTjyOWTsAWdSvEn51hPTK0iRW1YdFarFSqVigY2 - o66uDu8xJc6cqUVDQ4MSkeHhUaVoJQJCoKWjE30jI2jt7MCl+itobG5Ad3cnens60H7lItpPfQDT+bO4 - 9Njj2H/rnfho++1Q7f4e1BW7YCrZDE/ZNsQrdyPIz/byrbCsuxmWTbdDXb0b7RXb8GH5BrxWWoFXt98M - eg4IeDHLNJudnUKcZKQ28nOzKAoGg595f2BgAJcuXWKBHsOBAwfQ19eHHnqgp6ubEehSCLS1d6Kzuwud - vG5sbUFbRzu6+nrR1d+Ntm5Gpr0V/V1t0PW0YvLyeRiPv4/mB36O0xt2oWPVVhq7E6Flm5Er3o70TdVI - 3FSJ1IoNCBOupevgWF4Ny+qt0NbciuYNO/FU0Z/jdxs3YaatlTUSxGwyrhR4LJ5EgaJVFKX8+TxeTGp1 - 6O7sUgr2j+8eVq7F8L6eXgz29inoJyQavb3dyrU8l/tCvK2nCy29XejuF9Jd6O1qxnh3M7SXP4aPhV57 - y524TCO9FbcD6+6E56/LEL9+DbBqO/IlGxG6sRzRpWuRXV2DcFk1rOVVUFdtQMu69Xhj2Qr8fg+/52SR - ByOK2rJtIE+xKvK43EqTUo9PoKmhUSnWc2fOYmRoFEMDwxjuH8AQpXS4l+D1wIAYTELEMI0dHRxi/g+h - hzXQOdSPvv5BJXK9fUyxzmbo+9pgPVcL7WNPobXmdgwt2QjD9RXA9u8it34PhooWIFS8Hv6VVUQF3EtK - MbVhK6wrS2BcUwHN5q04VVKOZ1cUQ/PWAaoVZZbNjTV8NQIWkxlWs0VpVKIypz48iY62dkqpBmOj4xgb - HlGMHBschmpoWJHXoZFB1gTJERKh7m5GZHQUw/yN0QEVxvqGMT4yCqtOjb76j2Gr/wT5kyfx6sJl0N36 - fTi2fweN1yzH4PIq5O75J7QtXAnD+h3QsNBVJWswXrIa7o1Mo1WVUFWtR/eOm/Hswhvw3C27GYEQZkKU - XRrPKQRFhkk97FabkkJnqSp1p2sxTIPHx9UYG5sgCRUmCO2wCmrVGEbHRjA8TrBpDQ4PsXibcKW+Ef0k - qlHroRkYh7ZHBdOoFuM9fRjraoGrswlgbzi+5zY07bwN+M0rwFMvoHZhMbL/+u/Ao88g+A/3Ag89Bvz0 - Fyj8kNf/+CNMlFcqpEx3/S1evvEm/HzJIkCvZUcjgVyebYJFrFVrFAImgxHnz32kREF6wSgNVI2PKZHR - EJOMhqxjE+MYUV/F4OgIGlpacaWpldfj0KmNmBzUwNg7AdeIEbZBNTz8raiKmt7RDNWvHgfefAd/+OYi - 9NzxPeC3b6Lw6304t3EX3l1WDux7BbVla3FuaTFG1m6CoXIrVCvXQrNlF+oqKvH44hvgOH+avSHAgS+D - AgfDIjFQ0sioNyh633ClXlEkMXRcPQHNhBo6AaOhZZ1MaBgZnQYqjhpjGi0GRsbofaYNva/TmmAY0sPa - Nwn3gBHuwUloOjuRM+sx1XgZB+68A4lnnsfZ9dvQtOsu4MW3gFf3I/3kc+i/5+8VcnjhZSTvvR/40V74 - ttwG9ZLVUK+twflVa/D0TQvR++aLHE2EAMcQdmklAmK8jsY0NzahjR41mUzQTuqg009Cr5uEkTBpJ2Fg - msk9jQJ+Z9IAg94CvcECzaTMTxaYx22wj5rhGbHAM6pH2GDCrNWEmdYmtP9kL/D6/+Dw9cug+c7fIX3/ - I8BLb+PT9TtxkaTwzAuoW7EKDSWV0FdshWP1ZhgXr2Uxb8bF0tV48rprYfrgEEcNEuBokc9NoUiMl/QR - FRLjpYClLiQKAnlmNZpgoyGyGo1GGExGrmaSM8BqsDGCVDGdibDApHfBprXDNmJAwupmPbCTejnvMIpH - 9tyBvjvvAZ54njXwW9RdswR44BHK6xp0rtsC7H0I3RWbMbymBubVm+Au2wgnC91etQOfllfj0W9ei9Dl - C8x/duVkGJlsEkVSvEJC0ki0v4sdVqIxXxcKSMhCb1t4rdfrYbPZ4HO44Le54TG5YNFboTVaobM6YLR5 - YDE7ScwCB3/XY9QhZ5wEqx6qe/fixLdWwLntbrRfsxjq5WuhK63E2PJVUBVXYKSEWFGBydJqeFfV0PgK - OFesh6Z8M07x+X1/9pcAx3zk0lSgLHIzmasyqnicGBoYVMZnISD9QUi4HE4FTl47LNwjyD32DY+ZJEw2 - eA122E1iuBN6Fzu62wsTV7vTAbNBg5ibfzBC1bjUiKP0qunm70K3bB3i1bsQY6H6S9fCT7UJVW1hk6uB - vWw93IxAlLJqZW/wVO3CwNpteP4vFuLsv9wH7q4QZUQjMe4jMoyA1+1R8lxSSAp2nFIpa4Dd2UcSQkTe - 8ThoNOHzuuG22+A3WxFk6oTMDkbDA6vPC73fp8Dk88DBcTnscyi5islJeF/+Az4s3YjhUs5BnH1CxdWI - 0vOR5ezIJBFbVQ0PvW9dvAaWFeugZ1MzVG5GV0kVDi5YjAe/sQCJC5fZyBLKhic7O6vs5JRRQrwvei+p - JMar2IQ89HrQ61O8L51ajPa5nAj4vfDSuxGmUMzuQtzhRdjrh4PbRwMHLr2fZAIeeMV4mesjnCQppc3/ - fB/ad94N+7a7oOHYEKayRFdXIcTi9K0sh6+sCgHmv3f1dhhXbYZu4w5MfvtuvFj0DbywZDm6n3galD3M - hWLITOXh5ywUzUyjKMFtmnRiiYDku8iqpJJRb0IoEIb/TyTEeL+bee9zkRgN524pzq1nnCkTovddNNoa - 5P457IcvEsBMikMXw4ygHy5294Nbb0HLzm+ji1OmnWO1qXoTbIRpbSW07LwGpo+jZg/MG2/DQMV2XKys - wb6FC/FLKs8HP6TEqscoBm4UZIjjDOTkTBRMUoUkApImZiqMREJSaIQjg3pcQ+MDkOeCBPM4EvDDH3Aj - zPk8EfApJGIet0LAw3ueeBDBFDf33Atzx8/dVRxRDnY/q1qHt2u2oXH3XXj/ukXo4IB2uawUV8pLUF9S - SpSjqWwdLpdUo27RGhy6sRTPL1qBR4qXo+7Bf0O8u4GTKCOaSyLkdCkE0hzmksTVDQ3nC/G0KJLSeZlG - MkbodHplUk0luDlPy3FJHBFuyqOxIHd8BD0tiHPXFJ+K8QeTyEynUBACkRjcVLW9e3bjB9ctwMPXL8Qb - xSV4a+liPFtUhNeWXIeXFl2LfQuuwe8WXIdXSOz5v7oBvxEsLsPTG2pgOHoYBT27eI6Oc3C/HWdNUoX8 - vjBLYRrRKY4SQkAQj8YU9ZFUEq0XAt3dvay/SeXIJJ+ZQo7tO5VKcBYPYSodJ6mEghy7Yh45DojcZOSn - kUvEkHN5ceyFfXj7oYfR+eYbuPjgL9D3+KNoe+DHsL30HBofvJ95/TAG/+NJ4tcYZI73PfGfsL7+NlDP - 2Z9qB68DUz4jUnEHAkEzonEPZvIZ2hNHiiH4bEs5D9nYWCwWel7HYY6jBCEbfI3mareWnZuc3cxwBpmb - KyjnPTM0WEbDAhVhKpuGbJBsbHRW1QSSNgcKftaDy4VZSjB//KphNl6zl4B1BT6j5vIzU8TOeZ+KBqcP - GdZX1O1EyEsEmap0WiIZQTx+9ZBt3ubPERDIsYpsLyUKWq1WITBPRojJqYWQlMMuOdSKRCJKY5MGJ+/L - KqoVFBWzU2JpuJ9Gy3VADsf4WVZBiO+EmdOCCOswzjROBYJIc1yWtA6F/g+y9ZW/9/+NF3yJgEA8LdEQ - EjKZivFjY2PKKtEQQyW15iHE5L6sMkfZaKTDYmbDs7IBsiPzWmRY5FdWgfQUUbUARUAgQiCQ6yDFIcjI - STTFcHGSGC/4oq1fSUAgX3QxvOJtITJvqHh4HnIIIBGSdyRy8r4czcj7cihmNhsZKSsjJBEjKYeN77Gn - MDUEXsriPAJUNR8boMvloPNILHCVgHhfCHzR8/P4WgICISE/IGeikjLiXTFcvC2REcMlfeS+XM+TldVM - z5voeaOZQyA9LqOFhRERyImbfHYyAjZGQuCRXkLvy315Pu/9eXyVfbW1tfhfX0YT2Lth7dgAAAAASUVO - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAADAAAAAeCAYAAABqpJ3BAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADr4AAA6+AepCscAAAA+KSURBVFhHdVh3lFz1ed04DSODAHVtU9ldrcqqCySKgTjH - Nn/4nJycJM7JMSfEWNjGAVMMOAScABamGhxABRkJISFpVxISQkjbe2+zu1N2eu+97czO7Oze3O/JS0LT - OVe/N++9mf3uV+73/X5FtbW1+DqEw2FEYlEFsVjsM0TjXBNxJFJJJNMpJJNciXQyhQwxlUgiN5VBNpNG - NptFejqLVC6L+EwWsZkcIoUcEphFHAWkZguYnpvDHPhP/ivwv+kZYCoHZPKYS+WQjya/0j7B1xIQ4/1B - H7xeL+x2Oxw2O3w+H++TUCSGUChCMglEo1Hl3VgkinQ8gSxJTZPMdCyOGL+PmTzyND4UCiCZTSGRz8Kf - iiGFGQVpYmpuhrbmkMlkkM9kgXwBc7lZkCMK2VkUSESuv8rOryTgdrthc1hhd9pgNpsVTIyNo7e7B62t - 7Qra2jrQ1dUDg8GAQCCAeDiCBElE/X4F2VgEc2kSiUcQctmRigbp3jxi0QBSmRjSuRTCqbCCxDSJF6b5 - nFbOFZDLTiOVSCNPIjMzs5hlUJKpKYTolC/a+iUCTqdTMVirVUOjmcBAXz862ztw8cLH+PD4Cbx/5BiO - /PEojh07jlOnanHw4EHs378fFz86B82YCklGYyaTwuxUEjPJCDIhRiEVQSHiRy7oAhJBFJIB5LliNo25 - OaZZLoqp6ZiCaRJj2BQybq8H2dkZxJiCU7wjKRecnv6cvZ8j4PF4rnp7YgIjI0NoaWnChY/O4+h7R3Do - wEEafxS1p+pw8uRpnDhxEocOHSaJUzh79iyOvHcYhw/sR92JE+htbYZLr8Fs2APEQkD0T5jUAB474LIB - Xq5OExAmqXSYz0k07CZBvpeO0uUx5g9rgCmXJ6EAoxblGpzNwZqIfJmApIHD4YBarUZvby9TpAXHjx/D - 8WMf4PChd5X14/MX0NTUgsbGZnzyyafo7RtAfWOD8v1zZ+tw6ZOPcfniedS9fwTHXnsZP/mbu/DjnTvx - q9278V87d+PZdRvw+83b8d7Nt+Idru9s3Yk3tm3HS1u34L+JfXv24PzeB2A7ehRzQ4NAiFESB+TTTCGm - 6NwUGFeE5qaVaHxGQIpQvC/53N/fj/r6enq1jumxnx4/jcuXPlXSqK2tDc3NrWhhDbR3dOFk3Rl88ukl - DPCPDQ0NoLmpgUROo/7cGfSdOY33Hn0Ev9yxAz9bXozXKzfhzJY9eH9xOU5cvxIXlq5B3Q0lOH1TKY4v - LcPhJSXYv6wMbywqxtMLbsRPv3Uj6h95HDM9PSTC6GTjyOWTsAWdSvEn51hPTK0iRW1YdFarFSqVigY2 - o66uDu8xJc6cqUVDQ4MSkeHhUaVoJQJCoKWjE30jI2jt7MCl+itobG5Ad3cnens60H7lItpPfQDT+bO4 - 9Njj2H/rnfho++1Q7f4e1BW7YCrZDE/ZNsQrdyPIz/byrbCsuxmWTbdDXb0b7RXb8GH5BrxWWoFXt98M - eg4IeDHLNJudnUKcZKQ28nOzKAoGg595f2BgAJcuXWKBHsOBAwfQ19eHHnqgp6ubEehSCLS1d6Kzuwud - vG5sbUFbRzu6+nrR1d+Ntm5Gpr0V/V1t0PW0YvLyeRiPv4/mB36O0xt2oWPVVhq7E6Flm5Er3o70TdVI - 3FSJ1IoNCBOupevgWF4Ny+qt0NbciuYNO/FU0Z/jdxs3YaatlTUSxGwyrhR4LJ5EgaJVFKX8+TxeTGp1 - 6O7sUgr2j+8eVq7F8L6eXgz29inoJyQavb3dyrU8l/tCvK2nCy29XejuF9Jd6O1qxnh3M7SXP4aPhV57 - y524TCO9FbcD6+6E56/LEL9+DbBqO/IlGxG6sRzRpWuRXV2DcFk1rOVVUFdtQMu69Xhj2Qr8fg+/52SR - ByOK2rJtIE+xKvK43EqTUo9PoKmhUSnWc2fOYmRoFEMDwxjuH8AQpXS4l+D1wIAYTELEMI0dHRxi/g+h - hzXQOdSPvv5BJXK9fUyxzmbo+9pgPVcL7WNPobXmdgwt2QjD9RXA9u8it34PhooWIFS8Hv6VVUQF3EtK - MbVhK6wrS2BcUwHN5q04VVKOZ1cUQ/PWAaoVZZbNjTV8NQIWkxlWs0VpVKIypz48iY62dkqpBmOj4xgb - HlGMHBschmpoWJHXoZFB1gTJERKh7m5GZHQUw/yN0QEVxvqGMT4yCqtOjb76j2Gr/wT5kyfx6sJl0N36 - fTi2fweN1yzH4PIq5O75J7QtXAnD+h3QsNBVJWswXrIa7o1Mo1WVUFWtR/eOm/Hswhvw3C27GYEQZkKU - XRrPKQRFhkk97FabkkJnqSp1p2sxTIPHx9UYG5sgCRUmCO2wCmrVGEbHRjA8TrBpDQ4PsXibcKW+Ef0k - qlHroRkYh7ZHBdOoFuM9fRjraoGrswlgbzi+5zY07bwN+M0rwFMvoHZhMbL/+u/Ao88g+A/3Ag89Bvz0 - Fyj8kNf/+CNMlFcqpEx3/S1evvEm/HzJIkCvZUcjgVyebYJFrFVrFAImgxHnz32kREF6wSgNVI2PKZHR - EJOMhqxjE+MYUV/F4OgIGlpacaWpldfj0KmNmBzUwNg7AdeIEbZBNTz8raiKmt7RDNWvHgfefAd/+OYi - 9NzxPeC3b6Lw6304t3EX3l1WDux7BbVla3FuaTFG1m6CoXIrVCvXQrNlF+oqKvH44hvgOH+avSHAgS+D - AgfDIjFQ0sioNyh633ClXlEkMXRcPQHNhBo6AaOhZZ1MaBgZnQYqjhpjGi0GRsbofaYNva/TmmAY0sPa - Nwn3gBHuwUloOjuRM+sx1XgZB+68A4lnnsfZ9dvQtOsu4MW3gFf3I/3kc+i/5+8VcnjhZSTvvR/40V74 - ttwG9ZLVUK+twflVa/D0TQvR++aLHE2EAMcQdmklAmK8jsY0NzahjR41mUzQTuqg009Cr5uEkTBpJ2Fg - msk9jQJ+Z9IAg94CvcECzaTMTxaYx22wj5rhGbHAM6pH2GDCrNWEmdYmtP9kL/D6/+Dw9cug+c7fIX3/ - I8BLb+PT9TtxkaTwzAuoW7EKDSWV0FdshWP1ZhgXr2Uxb8bF0tV48rprYfrgEEcNEuBokc9NoUiMl/QR - FRLjpYClLiQKAnlmNZpgoyGyGo1GGExGrmaSM8BqsDGCVDGdibDApHfBprXDNmJAwupmPbCTejnvMIpH - 9tyBvjvvAZ54njXwW9RdswR44BHK6xp0rtsC7H0I3RWbMbymBubVm+Au2wgnC91etQOfllfj0W9ei9Dl - C8x/duVkGJlsEkVSvEJC0ki0v4sdVqIxXxcKSMhCb1t4rdfrYbPZ4HO44Le54TG5YNFboTVaobM6YLR5 - YDE7ScwCB3/XY9QhZ5wEqx6qe/fixLdWwLntbrRfsxjq5WuhK63E2PJVUBVXYKSEWFGBydJqeFfV0PgK - OFesh6Z8M07x+X1/9pcAx3zk0lSgLHIzmasyqnicGBoYVMZnISD9QUi4HE4FTl47LNwjyD32DY+ZJEw2 - eA122E1iuBN6Fzu62wsTV7vTAbNBg5ibfzBC1bjUiKP0qunm70K3bB3i1bsQY6H6S9fCT7UJVW1hk6uB - vWw93IxAlLJqZW/wVO3CwNpteP4vFuLsv9wH7q4QZUQjMe4jMoyA1+1R8lxSSAp2nFIpa4Dd2UcSQkTe - 8ThoNOHzuuG22+A3WxFk6oTMDkbDA6vPC73fp8Dk88DBcTnscyi5islJeF/+Az4s3YjhUs5BnH1CxdWI - 0vOR5ezIJBFbVQ0PvW9dvAaWFeugZ1MzVG5GV0kVDi5YjAe/sQCJC5fZyBLKhic7O6vs5JRRQrwvei+p - JMar2IQ89HrQ61O8L51ajPa5nAj4vfDSuxGmUMzuQtzhRdjrh4PbRwMHLr2fZAIeeMV4mesjnCQppc3/ - fB/ad94N+7a7oOHYEKayRFdXIcTi9K0sh6+sCgHmv3f1dhhXbYZu4w5MfvtuvFj0DbywZDm6n3galD3M - hWLITOXh5ywUzUyjKMFtmnRiiYDku8iqpJJRb0IoEIb/TyTEeL+bee9zkRgN524pzq1nnCkTovddNNoa - 5P457IcvEsBMikMXw4ygHy5294Nbb0HLzm+ji1OmnWO1qXoTbIRpbSW07LwGpo+jZg/MG2/DQMV2XKys - wb6FC/FLKs8HP6TEqscoBm4UZIjjDOTkTBRMUoUkApImZiqMREJSaIQjg3pcQ+MDkOeCBPM4EvDDH3Aj - zPk8EfApJGIet0LAw3ueeBDBFDf33Atzx8/dVRxRDnY/q1qHt2u2oXH3XXj/ukXo4IB2uawUV8pLUF9S - SpSjqWwdLpdUo27RGhy6sRTPL1qBR4qXo+7Bf0O8u4GTKCOaSyLkdCkE0hzmksTVDQ3nC/G0KJLSeZlG - MkbodHplUk0luDlPy3FJHBFuyqOxIHd8BD0tiHPXFJ+K8QeTyEynUBACkRjcVLW9e3bjB9ctwMPXL8Qb - xSV4a+liPFtUhNeWXIeXFl2LfQuuwe8WXIdXSOz5v7oBvxEsLsPTG2pgOHoYBT27eI6Oc3C/HWdNUoX8 - vjBLYRrRKY4SQkAQj8YU9ZFUEq0XAt3dvay/SeXIJJ+ZQo7tO5VKcBYPYSodJ6mEghy7Yh45DojcZOSn - kUvEkHN5ceyFfXj7oYfR+eYbuPjgL9D3+KNoe+DHsL30HBofvJ95/TAG/+NJ4tcYZI73PfGfsL7+NlDP - 2Z9qB68DUz4jUnEHAkEzonEPZvIZ2hNHiiH4bEs5D9nYWCwWel7HYY6jBCEbfI3mareWnZuc3cxwBpmb - KyjnPTM0WEbDAhVhKpuGbJBsbHRW1QSSNgcKftaDy4VZSjB//KphNl6zl4B1BT6j5vIzU8TOeZ+KBqcP - GdZX1O1EyEsEmap0WiIZQTx+9ZBt3ubPERDIsYpsLyUKWq1WITBPRojJqYWQlMMuOdSKRCJKY5MGJ+/L - KqoVFBWzU2JpuJ9Gy3VADsf4WVZBiO+EmdOCCOswzjROBYJIc1yWtA6F/g+y9ZW/9/+NF3yJgEA8LdEQ - EjKZivFjY2PKKtEQQyW15iHE5L6sMkfZaKTDYmbDs7IBsiPzWmRY5FdWgfQUUbUARUAgQiCQ6yDFIcjI - STTFcHGSGC/4oq1fSUAgX3QxvOJtITJvqHh4HnIIIBGSdyRy8r4czcj7cihmNhsZKSsjJBEjKYeN77Gn - MDUEXsriPAJUNR8boMvloPNILHCVgHhfCHzR8/P4WgICISE/IGeikjLiXTFcvC2REcMlfeS+XM+TldVM - z5voeaOZQyA9LqOFhRERyImbfHYyAjZGQuCRXkLvy315Pu/9eXyVfbW1tfhfX0YT2Lth7dgAAAAASUVO - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= - - - - - 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 - RK5CYII= + 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 - RK5CYII= + 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 - RK5CYII= + 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 \ No newline at end of file diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs index 2817a65df..ddf2df0f1 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs @@ -65,6 +65,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionLRStr); retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionIncl05Str); retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionAltIncl05Str); + retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionPlusIncl05Str); + retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionPlusAltIncl05Str); retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionGreeceIncl05Str); retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionRLIncl05Str); retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionLRIncl05Str); @@ -86,9 +88,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication retVal.Add(iPerlCommunicationForm.Write2HzCorrectionStr); retVal.Add(iPerlCommunicationForm.DewaReworkRLStr); retVal.Add(iPerlCommunicationForm.DewaReworkLRStr); + retVal.Add(iPerlCommunicationForm.StartTestingSealedMetersStr); + retVal.Add(iPerlCommunicationForm.EndTestingSealedMetersStr); retVal.Add(string.Format("{0} if enabled", iPerlCommunicationForm.ReadConfigurationStr)); retVal.Add(string.Format("{0} 80", iPerlCommunicationForm.SetTestModeStr)); retVal.Add("iPerl_check prevWorkStep direction q2factors"); + for (ConditionID id = ConditionID.A; id < ConditionID.Count; id++) + { + retVal.Add(string.Format(SequenceConditionOp.ConditionNameFmt, id)); + } + return retVal; } else diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs index 2c37b6795..9259dc19c 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2015-2022 Sensus Slovensko a.s. +/// Copyright (c) 2015-2023 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; @@ -11,6 +11,9 @@ using RestClient; using TBF.Rig.Sequences; using TBF.Resources; using TBF.UiBridge; +using Results; +using Results.Entities; +using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead; namespace TBF.Rig.TestMethods.iPerlCommunication { @@ -22,15 +25,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication public const string StrictQ2ErrorCheckStr = "Strict Q2 error check "; public const string Q2correctionCheckCmd = "Q2 correction check "; public const string IperlCheckCmd = "iPERL_check "; + public const string SimulateCmd = "simulate "; - System.Windows.Forms.Form modelessDlg; + System.Windows.Forms.Form modelessDlg; /// - delegate void iPerlCommFormDlgt(iPerlCommunicationSeq myRef, TestMethodCfg cfg, Test test, iPerlCommunicationParams testParams); + delegate void iPerlCommFormDlgt(iPerlCommunicationSeq myRef, TestMethod method, Test test, iPerlCommunicationParams testParams); /// - void OpenIPerlCommForm(iPerlCommunicationSeq myRef, TestMethodCfg cfg, Test test, iPerlCommunicationParams testParams) + void OpenIPerlCommForm(iPerlCommunicationSeq myRef, TestMethod method, Test test, iPerlCommunicationParams testParams) { - myRef.modelessDlg = new iPerlCommunicationForm(cfg, test, testParams); + myRef.modelessDlg = new iPerlCommunicationForm(method, test, testParams); myRef.modelessDlg.Show(); } @@ -52,8 +56,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Event.OpArgumentError . Target flow is out of range /// Event.Error . . . . . . Unspecified error /// - public IList Execute(Test test, int repetitionNr, TestMethodCfg cfg, iPerlCommunicationParams testParams) + public IList Execute(Test test, int repetitionNr, TestMethod method, iPerlCommunicationParams testParams) { + TestMethodCfg cfg = method.Cfg as TestMethodCfg; + IList e; /// Events from currently running operations checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state modelessDlg = null; @@ -69,17 +75,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Get 'wmType' from IperlHead procedure parameters int wmType = 0; - if (IperlHeads != null) +#if IPERL + /*foreach (var wm in ProcessData.BatchRslts.Batch.WaterMeters) { - foreach (var ih in IperlHeads) + if (wm != null && !wm.Disabled && wm.WMTypeId() > 0) { - if (ih.WMType_ID > 0) - { - wmType = ih.WMType_ID; - break; - } + wmType = wm.WMTypeId(); + break; } - } + }*/ +#endif if (cfg.UseWebService) { @@ -121,9 +126,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted)); Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.FlowSetting)); - string fromTestName = testParams.Activity.Substring(cmd.Length); - - MakeQ2CorrectedFrom(test.Name, fromTestName); + string[] args = testParams.Activity.Substring(cmd.Length).Split(new char[] { ' ' }); + string fromTestName = (args.Length >= 1) ? args[0] : string.Empty; + bool isPlus = (args.Length >= 2) ? args[1].ToLower().Contains("plus") : false; + MakeQ2CorrectedFrom(test.Name, fromTestName, isPlus); Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.Completed)); Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(test.Name, 0))); @@ -174,9 +180,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication string[] args = testParams.Activity.Substring(cmd.Length).Split(new char[] { ' ' }); - int maxTestIndex = (ProcessData.BenchInfo is DataContainer.iPerlBenchInfo.Component) - ? (ProcessData.BenchInfo as DataContainer.iPerlBenchInfo.Component).MaxTestIndex - : int.MaxValue; + //int maxTestIndex = (ProcessData.BenchInfo is TBF.Rig.DataContainer.BenchInfo.Component) + // ? (ProcessData.BenchInfo as TBF.Rig.DataContainer.BenchInfo.Component).MaxTestIndex + // : int.MaxValue; Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(test.Name, 0); @@ -285,7 +291,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication return new List { Event.Done }; } - else if (testParams.Activity.ToLower().Contains(cmd = "simulate ")) + else if (testParams.Activity.ToLower().Contains(cmd = SimulateCmd)) { TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 }); Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted)); @@ -298,9 +304,49 @@ namespace TBF.Rig.TestMethods.iPerlCommunication else if (testParams.Activity.Substring(cmd.Length).ToLower() == "compound nok") MakeSimulatedCompound(test, 1, 0, 4.7f, 0.9f); else if (testParams.Activity.Substring(cmd.Length).ToLower() == "compound rise") MakeSimulatedCompound(test, 1, 0, 0.7f, 0.0f); else if (testParams.Activity.Substring(cmd.Length).ToLower() == "compound fall") MakeSimulatedCompound(test, 1, 0, 0.7f, 0.9f); + else if (testParams.Activity.Substring(cmd.Length).ToLower() == "iperls") + { + string[] pcbNrs = new string[] { "831232435539", "831232435562", "831232435587", + "831232432141", "831232432497", "831232763641" }; + + TestRslt tstRslt = BatchRslts.GetTestRslt(test.Name, test.Part); + if (tstRslt != null) + { + Results.Utils.GetCounterStates(tstRslt, Program.LocalSettings.Counters); + + /// Auxiliary results ... not required + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.TestDone = true; + tstRslt.StartTime = tstRslt.Batch.StartTime; + tstRslt.EndTime = DateTime.Now; + tstRslt.FlowSetTime = 0; + tstRslt.MassOfEvapWater = 0; + tstRslt.TestTime = 1; + + for (int i = 0; i < BatchRslts.Batch.WaterMeters.Count; i++) + { + MeterTestRslt meterRslt = + BatchRslts.GetMeterTestRslt(test.Name, i, CompoundMeterId.Single); + + if (meterRslt != null) + { + meterRslt.WaterMeter.SerialNr = pcbNrs[i % pcbNrs.Length]; + meterRslt.Passed = true; + meterRslt.TestDone = true; + } + //if (iperlHeads[i] != null) + //{ + // iperlHeads[i].CommFailed = iperlHeads[i].Disabled = false; + // iperlHeads[i].SerialNr = pcbNrs[i % pcbNrs.Length]; + //} + } + } + } Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.Completed)); - Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0))); + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(Common.Utils.GetTestName(test.Name, 1, 1), 0))); allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file //------------------------------------------------ @@ -308,8 +354,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication //------------------------------------------------ State.Create(string.Format("iPerlCommunicationSeq : {0}", testParams.Activity)) - .AddOperation(checkUiOp) - .EnterState(); + .AddOperation(checkUiOp) + .EnterState(); e = StateMachine.WaitRunDevsRunOps(); if (TestAndLogUiCmdStop(test, e)) @@ -322,7 +368,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// /// Show the modeless dialog with error indication /// - Program.MainWnd.Invoke(new iPerlCommFormDlgt(OpenIPerlCommForm), new object[] { this, cfg, test, testParams }); + Program.MainWnd.Invoke(new iPerlCommFormDlgt(OpenIPerlCommForm), new object[] { this, method, test, testParams }); //------------------------------------------------ Bridge.OnActivity(this, Strings.iPerl_Communication_in_progress); @@ -332,10 +378,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication bool completed = false; State.Create("iPerlCommunicationSeq : Wait until the entry form is closed") - .AddOperation(checkUiOp) - .EnterState(); - do - { + .AddOperation(checkUiOp) + .EnterState(); + do { e = StateMachine.WaitRunDevsRunOps(); stopPressed = TestAndLogUiCmdStop(test, e); completed = (modelessDlg is GenericDevices.IHasCompleted) @@ -475,7 +520,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// This test name /// Name of Q2 test done before Q2 correction (Q2adj) /// Assuming this test does not have multiple parts (part = 0) - void MakeQ2CorrectedFrom(string testName, string oriTestName) + void MakeQ2CorrectedFrom(string testName, string oriTestName, bool isPlus = false) { Results.Entities.TestRslt oriTestRslt = ProcessData.BatchRslts.GetTestRslt(oriTestName, 0); Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(testName, 0); @@ -551,8 +596,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication tstRslt.MassEndRaw = oriTestRslt.MassEndRaw; tstRslt.MassEnd = oriTestRslt.MassEnd; tstRslt.MassOfEvapWater = oriTestRslt.MassOfEvapWater; - tstRslt.Qdetected = oriTestRslt.Qdetected; - tstRslt.Flow = oriTestRslt.Flow; + //tstRslt.FlowMass = oriTestRslt.FlowMass; + //tstRslt.FlowVolume = oriTestRslt.FlowVolume; tstRslt.VolumeCTV = oriTestRslt.VolumeCTV; tstRslt.VolumeMaster = oriTestRslt.VolumeMaster; tstRslt.ErrorMaster = oriTestRslt.ErrorMaster; @@ -572,15 +617,19 @@ namespace TBF.Rig.TestMethods.iPerlCommunication for (int i = 0; i < ProcessData.BatchRslts.WMPositionsCount; i++) { - Results.Entities.MeterTestRslt oriMeterRslt = ProcessData.BatchRslts.GetMeterTestRslt(oriTestName, i, CompoundMeterId.Single); - Results.Entities.MeterTestRslt meterRslt = ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + // Fix for CS7036: Added the missing 'meterId' argument to the GetMeterTestRslt method call. + var q3mtr = ProcessData.BatchRslts.GetMeterTestRslt("Q3", i, CompoundMeterId.SingleOrCompound); + double q3error = (q3mtr != null) ? q3mtr.Error : 0; + + Results.Entities.MeterTestRslt oriMeterRslt = ProcessData.BatchRslts.GetMeterTestRslt(oriTestName, i, CompoundMeterId.SingleOrCompound); + Results.Entities.MeterTestRslt meterRslt = ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.SingleOrCompound); /// Reference to iPerl water meter or null: TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = ((sensPath != null) && (sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length)) ? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead) : null; - if (meterRslt != null && oriMeterRslt != null) + if (iPerl != null && meterRslt != null && oriMeterRslt != null) { #if ORACLE_DB meterRslt.ErrorBC = oriMeterRslt.Error; @@ -591,33 +640,27 @@ namespace TBF.Rig.TestMethods.iPerlCommunication meterRslt.VolumeRef = oriMeterRslt.VolumeRef; meterRslt.TestTime = oriMeterRslt.TestTime; - if (iPerl == null || ((iPerl.Q2CorrRL == 0) && (iPerl.Q2CorrLR == 0))) + if (q3error * oriMeterRslt.Error < 0) { - /// Either no iPerl head or no Q2 correction - meterRslt.Error = oriMeterRslt.Error; - meterRslt.VolumeMeter = oriMeterRslt.VolumeMeter; - meterRslt.VolumeStart = oriMeterRslt.VolumeStart; - meterRslt.VolumeEnd = oriMeterRslt.VolumeEnd; - meterRslt.Passed = (meterRslt.Error >= tstRslt.ErrLimLo() + tstRslt.ErrLimMargin() - && meterRslt.Error <= tstRslt.ErrLimHi() - tstRslt.ErrLimMargin()); - meterRslt.TestDone = true; - tstRslt.TestDone = true; + /// iPerl with Q2 correction => generate an artificial error equal to +1/10 of the original one (relative to Q2 target error) + meterRslt.Error = 0.1 * oriMeterRslt.Error; } else { /// iPerl with Q2 correction => generate an artificial error equal to -1/10 of the original one (relative to Q2 target error) - double targetError = iPerl.CalibTargetQ2; - meterRslt.Error = targetError - 0.1 * (oriMeterRslt.Error - targetError); - meterRslt.VolumeMeter = oriMeterRslt.VolumeRef * (100.0 + meterRslt.Error) / 100.0; - meterRslt.VolumeStart = oriMeterRslt.VolumeStart; - double signature = (oriMeterRslt.VolumeEnd > oriMeterRslt.VolumeStart) ? (+1) : (-1); - meterRslt.VolumeEnd = meterRslt.VolumeStart + signature * meterRslt.VolumeMeter; - meterRslt.Passed = (meterRslt.Error >= tstRslt.ErrLimLo() + tstRslt.ErrLimMargin() - && meterRslt.Error <= tstRslt.ErrLimHi() - tstRslt.ErrLimMargin()); - meterRslt.TestDone = true; - tstRslt.TestDone = true; + meterRslt.Error = - 0.1 * oriMeterRslt.Error; } - } + + meterRslt.VolumeMeter = meterRslt.VolumeRef * (100.0 + meterRslt.Error) / 100.0; + double signature = (oriMeterRslt.VolumeEnd > oriMeterRslt.VolumeStart) ? (+1) : (-1); + meterRslt.VolumeStart = oriMeterRslt.VolumeStart; + meterRslt.VolumeEnd = meterRslt.VolumeStart + signature * meterRslt.VolumeMeter; + + meterRslt.Passed = (meterRslt.Error >= tstRslt.ErrLimLo() + tstRslt.ErrLimMargin() + && meterRslt.Error <= tstRslt.ErrLimHi() - tstRslt.ErrLimMargin()); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } } } @@ -703,8 +746,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication tstRslt.MassEndRaw = oriTestRslt.MassEndRaw; tstRslt.MassEnd = oriTestRslt.MassEnd; tstRslt.MassOfEvapWater = oriTestRslt.MassOfEvapWater; - tstRslt.Qdetected = oriTestRslt.Qdetected; - tstRslt.Flow = oriTestRslt.Flow; + //tstRslt.FlowMass = oriTestRslt.FlowMass; + //tstRslt.FlowVolume = oriTestRslt.FlowVolume; tstRslt.VolumeCTV = oriTestRslt.VolumeCTV; tstRslt.VolumeMaster = oriTestRslt.VolumeMaster; tstRslt.ErrorMaster = oriTestRslt.ErrorMaster; @@ -752,7 +795,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication meterRslt.VolumeStart = oriMeterRslt.VolumeStart; meterRslt.VolumeEnd = oriMeterRslt.VolumeEnd; #if ORACLE_DB - if (ProcessData.BatchRslts.Batch.WaterMeters[i].Pruefindex == 1) + if ((ProcessData.BatchRslts.Batch.WaterMeters[i].Pruefindex % 100) == 1) { meterRslt.Passed = (oriMeterRslt.Error >= tstRslt.ErrLimLo() + tstRslt.ErrLimMargin() && oriMeterRslt.Error <= tstRslt.ErrLimHi() - tstRslt.ErrLimMargin()); @@ -855,8 +898,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication tstRslt.MassEndRaw = testRsltQ2ac.MassEndRaw; tstRslt.MassEnd = testRsltQ2ac.MassEnd; tstRslt.MassOfEvapWater = testRsltQ2ac.MassOfEvapWater; - tstRslt.Qdetected = testRsltQ2ac.Qdetected; - tstRslt.Flow = testRsltQ2ac.Flow; + //tstRslt.FlowMass = testRsltQ2ac.FlowMass; + //tstRslt.FlowVolume = testRsltQ2ac.FlowVolume; tstRslt.VolumeCTV = testRsltQ2ac.VolumeCTV; tstRslt.VolumeMaster = testRsltQ2ac.VolumeMaster; tstRslt.ErrorMaster = testRsltQ2ac.ErrorMaster; @@ -894,14 +937,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication meterRslt.TestDone = meterRsltQ2ac.TestDone; tstRslt.TestDone = true; - double targetError = 0; - if ((sensPath != null) && (sensPath.RegisterReaders != null) && (sensPath.RegisterReaders.Length > i) && (sensPath.RegisterReaders[i] is iPerlHead.IperlHead)) - { - targetError = (sensPath.RegisterReaders[i] as iPerlHead.IperlHead).CalibTargetQ2; - } - - if ((((meterRsltQ2bc.Error - targetError) < -0.51) && (meterRsltQ2ac.Error < meterRsltQ2bc.Error)) || - (((meterRsltQ2bc.Error - targetError) > +0.51) && (meterRsltQ2ac.Error > meterRsltQ2bc.Error))) + if (((meterRsltQ2bc.Error < -0.51) && (meterRsltQ2ac.Error < meterRsltQ2bc.Error)) || + ((meterRsltQ2bc.Error > +0.51) && (meterRsltQ2ac.Error > meterRsltQ2bc.Error))) { meterRslt.Passed = false; /// Q2 correction check failed } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlDataWrite.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlDataWrite.cs index d47e86266..3997be4ae 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlDataWrite.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlDataWrite.cs @@ -2,19 +2,22 @@ /// Copyright (c) 2021 Sensus Slovensko a.s. /// using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead; +using static Sensus.iPerl.NfcHandler.MCI_Protocol; namespace TBF.Rig.TestMethods.iPerlCommunication { public class iPerlDataWrite { public MessageID MessageID; + public StructName StructName; public int Offset; public byte[] Data; public string Description; - public iPerlDataWrite(MessageID mesageID, int offset, byte[] data, string description) + public iPerlDataWrite(MessageID mesageID, StructName structName, int offset, byte[] data, string description) { MessageID = mesageID; + StructName = structName; Offset = offset; Data = data; Description = description; diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlEnums.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlEnums.cs index e13313ce2..12ac3a0c1 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlEnums.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlEnums.cs @@ -17,7 +17,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication RL, LR, Standard_incl_05, + Standard_plus_incl_05, Dewa_incl_05, + Dewa_plus_incl_05, Greece_incl_05, RL_incl_05, LR_incl_05, diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Enums.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Enums.cs index 0069eb96a..2c8b65102 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Enums.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Enums.cs @@ -104,4 +104,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead Flush = 0, ProcessAndSave, } + + public enum CommunicationInterface + { + RFID, + NFC + } } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Factory.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Factory.cs index c69ad1f4f..eb2bff000 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Factory.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Factory.cs @@ -9,7 +9,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead public class Factory : IComponentFactory { public string ClassName { get { return "RegisterReader for iPerl"; } } - public override string ToString() { return ClassName; } public IComponent DummyComponent() { return new IperlHead(); } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs index 63253822b..94cc8ea41 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs @@ -2,25 +2,28 @@ /// Copyright (c) 2015-2022 Sensus Slovensko a.s. /// using System; -using System.Collections.Generic; using System.IO; using System.IO.Ports; -using System.Linq; using log4net; using Common; using Common.Iperl; using Config.Entities; using TBF.Rig.Generic; using TBF.Rig.GenericDevices; -using TBF.Rig.Output; -using TBF.Rig.Sequences; +using Sensus.iPerl.NfcHandler; +using NHibernate; +using Renci.SshNet; +using System.Linq; +using System.Xml; +using System.Xml.Linq; // This line is correct and does not need to be changed. +using System.Windows; namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead { /// /// This component = instance of this class is a placeholder for a combined main watermeter /// - public class IperlHead : ComponentBase, IDevice, IRegReaderDatastream, ISessionDataMngmnt, IOperation + public class IperlHead : ComponentBase, IDevice,IRegReaderDatastream, ISessionDataMngmnt, IOperation { private static readonly ILog log = LogManager.GetLogger(typeof(IperlHead)); public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); } @@ -40,9 +43,11 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead readonly IperlHeadCfg iperlHeadCfg; public int RfidComPortNr { get { return iperlHeadCfg.RfidComPortNr; } } + public int OptoComPortNr { get { return iperlHeadCfg.OptoComPortNr; } } public int MuxBoardNrOrGroup14 { get { return iperlHeadCfg.MuxBoardNr; } } public int Group { get { return iperlHeadCfg.Group; } } public iPerlHead.MeterType MeterType { get { return iperlHeadCfg.MeterType; } } + public CommunicationInterface CommInterface { get { return iperlHeadCfg.CommunicationInterface; } } public int Position { @@ -58,11 +63,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } public double CalibTarget { get { return iperlHeadCfg.ProcParams.CalibTarget; } } - public double CalibTargetQ2 { get { return iperlHeadCfg.ProcParams.CalibTargetQ2; } } public ushort FactorLimitLo { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitLo; } } public ushort FactorLimitHi { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitHi; } } public Counting InitFlowDir { get { return (iperlHeadCfg != null && iperlHeadCfg.ProcParams != null) ? iperlHeadCfg.ProcParams.Counting : Counting.Arbitrary; } } - public int WMType_ID { get { return iperlHeadCfg.ProcParams.WMType_ID; } } /// Required by Oracle DB /// Properties set by the Begin and the End form @@ -70,10 +73,17 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead { get { - if (ConfigStruct != null) return ConfigStruct.GetPcbNrString(); - else return string.Empty; + if (ConfigStruct != null) + return ConfigStruct.GetPcbNrString(); + else if (simulatedPcbNr != null) + return simulatedPcbNr; + else + return string.Empty; + } + set + { + simulatedPcbNr = value; } - set { } } public bool Disabled; @@ -103,6 +113,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead public CalibrationStruct CalibrationStruct; /// CalibrationStruct of WM obtained or updated by iPerlCommunication public CalibrationStructV4 CalibrationStructV4; /// CalibrationStruct of WM obtained or updated by iPerlCommunication + public Byte OrigTestModeConfig; /// Written to by StartTestingSealedMeter(), read from by EndTestingSealedMeter() + public ushort OrigCalibFactor; public ushort CalibFactor { @@ -152,6 +164,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead public double WMVolume { get { return wmVolume; } } public double WMTestTime { get { return wmTestTime; } } + string simulatedPcbNr = null; + int wmPulses; int wmRefPulses; double beginWMState; @@ -213,11 +227,11 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead /// Nominal flow in m3/h /// 0 or the current Q2 correction factor when updating the factor /// Calculated Q2 correction factor - public double CalculateQ2CorrectionFactor(Results.Entities.MeterTestRslt q2adjResult, double calibTarget, double nominalFlow, int currentFactor = 0) + public double CalculateQ2CorrectionFactor(Results.Entities.MeterTestRslt currentQ2Result, int currentFactor, double nominalFlow, double errorTarget = 0) { - double nominalTestFlowLph = Units.ConvertTo(Common.Unit.lph, nominalFlow); - double volumeRefShiftedToTarget = q2adjResult.VolumeRef * (1.0 + calibTarget / 100.0); - double q2adjErrorShiftedToTarget = Formulas.ErrorFromVolumes(q2adjResult.VolumeMeter, volumeRefShiftedToTarget); + double nominalTestFlowLph = Units.ConvertTo(Unit.lph, nominalFlow); + double volumeRefShiftedToTarget = currentQ2Result.VolumeRef * (1.0 + errorTarget / 100.0); + double q2adjErrorShiftedToTarget = Config.Formulas.ErrorFromVolumes(currentQ2Result.VolumeMeter, volumeRefShiftedToTarget); double A = 16.0 / ScalingFactor(); /// Raw units per ml: DN15=16, DN20=8, DN25=4, DN32=2, DN40=1 const double B = 8.0; /// Raw units per minute, 8 @@ -226,14 +240,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead double F = D / (nominalTestFlowLph * 10.0); /// Error corrected with 8 Raw Units per minute [%] double G = F / B; /// Error corrected with 1 Raw Unit per minute [%] - double q2CorrectionFactor = Convert.ToDouble(currentFactor) - - (q2adjErrorShiftedToTarget / G) * (volumeRefShiftedToTarget / q2adjResult.VolumeMeter); + /// Do not change the factor for an invalid measurement (q2adjResult.VolumeMeter == 0) + double q2CorrectionFactor = (Math.Abs(currentQ2Result.VolumeMeter) <= float.Epsilon) ? Convert.ToDouble(currentFactor) : + Convert.ToDouble(currentFactor) - (q2adjErrorShiftedToTarget / G) * (volumeRefShiftedToTarget / currentQ2Result.VolumeMeter); - log.WarnFormat("CalculateQ2CorrectionFactor() : Pos={0}, PCB#={1}, Error={2}%, CalTarget={3}%, Q2CorrFactor={4}", + log.WarnFormat("CalculateQ2CorrectionFactor() : Pos={0}, PCB#={1}, Error={2}%, Target={3}%, Current factor={4} New factor={5}", Name, SerialNr, - q2adjResult.Error.ToString("F2"), - calibTarget.ToString("F1"), + currentQ2Result.Error.ToString("F2"), + errorTarget.ToString("F3"), + currentFactor.ToString("F1"), q2CorrectionFactor.ToString("F1")); return q2CorrectionFactor; @@ -283,12 +299,11 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead /// /// Currently executed test /// Currently executed repetition number - public void TestIsGoingToStartSoon(Test test, int repetitionNr) + public void TestIsGoingToStartSoon(Test _test, int _repetitionNr) { /// Store/update values to be used as a part of the opto-data log file name - testName = test.Name; - testRepeats = test.Repeats; - this.repetitionNr = repetitionNr; + this.test = _test; + this.repetitionNr = _repetitionNr; if (IsDataStreamProcessing()) { @@ -324,8 +339,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead } } /// - string testName; - int testRepeats; + Test test; int repetitionNr; @@ -420,20 +434,26 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead synchronized = false; synchronized2 = false; partOfTelegram = string.Empty; + optoSerialPort = null; if (DebugLevel == DebugMode.Normal) { /// Open serial port: 9600 Bd, 8 data bits, 1 stop bit, no parity - string portName = string.Format("COM{0}", iperlHeadCfg.OptoComPortNr); - optoSerialPort = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One); - optoSerialPort.Handshake = Handshake.None; - optoSerialPort.Open(); - log.FatalFormat("{0} initialized: {1}", Name, this); + /// Check whether head is connected, working + try + { + OpenOptoSerialPort($"COM{iperlHeadCfg.OptoComPortNr}", 9600, Parity.None, 8, StopBits.One, Handshake.None); + CloseOptoSerialPort(); + log.FatalFormat($"{Name} initialized: {this}"); + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } } else { - optoSerialPort = null; - log.FatalFormat("{0} simulated: {1}", Name, this); + log.FatalFormat($"{Name} simulated: {this}"); } } @@ -451,6 +471,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead CalibrationStruct = null; CalibrationStructV4 = null; + OrigTestModeConfig = 0; + LastTestResult = null; LastTestResult2 = null; @@ -460,6 +482,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead Q2CorrRL = 0; Q2CorrLR = 0; + simulatedPcbNr = null; + dataStreamState = DataStreamState.Flush; currentFlowDir = InitFlowDir; @@ -535,10 +559,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead { try { - if (DebugLevel == DebugMode.Normal && optoSerialPort != null) + if (optoSerialPort != null) { - optoSerialPort.Close(); - optoSerialPort = null; + CloseOptoSerialPort(); } } catch @@ -552,7 +575,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead /// Events: Event.ReadRegisterDone, Event.Error /// /// ReadWaterMeter instance reference casted to IOperaton - public IOperation ReadDatastreamOp() + public IOperation ReadRegisterOp() { return this; } @@ -656,20 +679,26 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead // // log.DebugFormat("Feature vector calculation end, save opto-file start: {0:HH:mm:ss.fff}", DateTime.Now); - string relativeDirectory = Path.Combine(StateMachine.CycleStartTimeStamp.ToString("yy"), - StateMachine.CycleStartTimeStamp.ToString("MM"), - StateMachine.CycleStartTimeStamp.ToString("dd")); - string directory = Path.Combine(OptoDataDirectory, relativeDirectory); - string fileName = DetermineExtraDataFileName(); - if (!string.IsNullOrEmpty(fileName)) +#if ORACLE_DB + if (test.RawDataId + (test.Repeats - repetitionNr) * test.RawDataIdRepetMulti != 0) { - if (SaveOptoDataToFile(directory, fileName)) + string relativeDirectory = Path.Combine(StateMachine.CycleStartTimeStamp.ToString("yy"), + StateMachine.CycleStartTimeStamp.ToString("MM"), + StateMachine.CycleStartTimeStamp.ToString("dd")); + string fileName = DetermineExtraDataFileName(); + if (SaveOptoDataToFile(Path.Combine(OptoDataDirectory, relativeDirectory), fileName)) { extraDataPath = Path.Combine(relativeDirectory, fileName); } - } - log.WarnFormat("IperlHeadd.Stop() startIx={0} endIx={1} optoData.Len={2} filename={3}", startIx, endIx, optoData.Length, !string.IsNullOrEmpty(fileName) ? fileName : ""); + log.WarnFormat("IperlHead.Stop() startIx={0} endIx={1} len={2} raw data file = {3}", + startIx, endIx, optoData.Length, fileName); + } + else +#endif + { + log.WarnFormat("IperlHead.Stop() startIx={0} endIx={1} len={2} no raw data file", startIx, endIx, optoData.Length); + } if (TestStartTelegramIx == 0 || optoDataCount < 100) { @@ -736,36 +765,27 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead string DetermineExtraDataFileName() { /// - /// Select or create appropriate test infos - /// - Results.Output.SensusTestInfo[] testInfos = Sequences.ProcessData.CompleteTestInfos; - /// - if ((ProcessData.OracleDB != null && ProcessData.OracleDB.DesigMode == Output.DB.SensusOracle.DesigMode.Based_on_procedure) || - (testInfos == null && StateMachine.Procedure != null)) - { - testInfos = Results.Output.SensusTestInfo.CreateFromProcedure(StateMachine.Procedure); - } - - /// - /// Select or create appropriate 'qBezeichnung' - /// - string fullTestName = Results.Utils.GetTestName(testName, testRepeats, repetitionNr); - var ti = testInfos.FirstOrDefault(x => x.PruefungsNrOpto != 0 && x.TestName == fullTestName); - string qBezeichnung = (ti == null) ? fullTestName /// No appropriate TestInfo found => set default opto data file name - : string.IsNullOrEmpty(ti.QBezeichnungOpto) ? ti.PruefungsNrOpto.ToString("D2") - : ti.QBezeichnungOpto; - /// - /// Get other required pieces of information + /// Get required pieces of information /// string pcbNr = (ConfigStruct != null) ? ConfigStruct.GetPcbNrString() : "UnknownPcbNr"; string wmPosition = Name.Substring(5); /// WMPosition is extracted from a component name in form 'iPerl#' if (wmPosition.Length == 1) wmPosition = "0" + wmPosition; string cycleStartTime = StateMachine.CycleStartTimeStamp.ToString("HH_mm_ss"); - +#if ORACLE_DB + string[] designations = string.IsNullOrEmpty(test.RawDataDesignation) ? new string[0] : test.RawDataDesignation.Split(new char[] { '~' }); + int testId = test.RawDataId + (test.Repeats - repetitionNr) * test.RawDataIdRepetMulti; + string designation = string.IsNullOrEmpty(test.RawDataDesignation) + ? testId.ToString(testId > 0 ? "D2" : "D1") /// Name is generated from Id + : (designations.Length > repetitionNr - 1) ? designations[repetitionNr - 1] /// Name is from 'RawDataDesignation' parameter + : string.Format("{0}-{1}", designations[0], repetitionNr); /// Name is form test name and repetition nr. +#else + int testId = 0; + string designation = (test.Repeats == 1) ? test.Name : string.Format("{0}-{1}", test.Name, repetitionNr); +#endif /// /// Return the file name - /// - return string.Format("{0}_{1}_{2}_{3}.txt", pcbNr, wmPosition, qBezeichnung, cycleStartTime); + /// + return string.Format("{0}_{1}_{2}_{3}.txt", pcbNr, wmPosition, designation, cycleStartTime); } @@ -775,7 +795,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead bool SaveOptoDataToFile(string directory, string fileName) { string fullFileName = Path.Combine(directory, fileName); - log.WarnFormat("Saving {0} opto data to {1}", Name, fullFileName); + log.WarnFormat("Saving {0} raw data to {1}", Name, fullFileName); try { @@ -840,6 +860,42 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead wmTestTime = timestampSec - timestampSec0; } + private void OpenOptoSerialPort(string comPort, int baudRate, Parity parity, int dataBits, StopBits stopBit, Handshake handshake) + { + if (DebugLevel == DebugMode.FailureDuringOperation) DebugLevel = DebugMode.Normal; + if (DebugLevel == DebugMode.Normal) + { + /// Open serial port: 9600 Bd, 8 data bits, 1 stop bit, no parity + try + { + CloseOptoSerialPort(); + optoSerialPort = new SerialPort(comPort, baudRate, parity, dataBits, stopBit); + optoSerialPort.Handshake = handshake; + optoSerialPort.Open(); + log.FatalFormat($"{Name} OptoPort opened: {this}"); + } + catch (Exception ex) + { + log.FatalFormat($"{Name} OptoPort - error opening port: {this}" + Environment.NewLine + ex.Message); + throw ex; + } + } + else + { + optoSerialPort = null; + log.FatalFormat($"{Name} OproPort simulated: {this}"); + } + } + + private void CloseOptoSerialPort() + { + if (optoSerialPort != null) + { + optoSerialPort.Close(); + optoSerialPort = null; + log.FatalFormat($"{Name} OptoPort closed: {this}"); + } + } DataStreamState dataStreamState; @@ -848,6 +904,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead /// public void StartDataStreamProcessing() { + try + { + OpenOptoSerialPort($"COM{iperlHeadCfg.OptoComPortNr}", 9600, Parity.None, 8, StopBits.One, Handshake.None); + } + catch (Exception) + { + } /// Reset opto-data, etc. optoDataCount = 0; timeFromStart = 0; @@ -878,20 +941,21 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead /// /// Stop processing and saving datastream data /// - void StopDataStreamProcessing() + public void StopDataStreamProcessing() { dataStreamState = DataStreamState.Flush; + CloseOptoSerialPort(); } - /// - /// Variables storing the context of serial port data parsing (ReadOptoSerialPort(...)) - /// - bool synchronized; + /// + /// Variables storing the context of serial port data parsing (ReadOptoSerialPort(...)) + /// + bool synchronized; bool synchronized2; string partOfTelegram; /// - /// Reads opto-datastream via serual port. Invoked from RunDeviceBefore() + /// Reads opto-datastream via serial port. Invoked from RunDeviceBefore() /// /// Telegram description: /// AAAAAA[tab]BBBB[tab]CCCC[tab]DDDDDD[tab]EEEE[tab]FFFFFFFF[tab]GG[cr][lf] (42 bytes) @@ -903,6 +967,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead /// OptoState.Read or OptoState.Flush void ReadOptoData(DataStreamState optoState) { + if (optoSerialPort is null) return; lock (this) { int nrBytes = optoSerialPort.BytesToRead; @@ -949,7 +1014,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead { /// CR+LF was found && (pos >= OptoTelegramRaw.Length - 2) && the telegram is OK flowDirectionDetection.WriteToFifo(volumeRawExtLast, timestampExtLast); - OptoTelegramRreceived(optoDataCount, synchronized2, volumeRawExtLast, timestampExtLast); + OptoTelegramReceived(optoDataCount, synchronized2, volumeRawExtLast, timestampExtLast); synchronized2 = synchronized; allRcvd = allRcvd.Substring(pos + 2); } @@ -998,8 +1063,25 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead } } + public string ReadOptoData() + { + if (optoSerialPort is null) return ""; + string received = "."; + lock (this) + { + int nrBytes = optoSerialPort.BytesToRead; + if (nrBytes > 0) + { + char[] buffer = new char[nrBytes]; + optoSerialPort.Read(buffer, 0, nrBytes); + received = new string(buffer); + } + } + return received; + } - void OptoTelegramRreceived(int currentIx, bool async, Int64 volumeRawExt, Int64 timestampRawExt) + + void OptoTelegramReceived(int currentIx, bool async, Int64 volumeRawExt, Int64 timestampRawExt) { currentTelegramIx = currentIx; @@ -1029,6 +1111,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead /// + /// /// Called from the state machine when a test is selected and UI needs to be updated. /// public void OnOptoReceived(object sender, OptoReceivedEventArgs args) @@ -1326,5 +1409,72 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead if (reader.ReadBoolean()) (LastTestResult = new Results.Entities.MeterTestRslt()).ReadBinary(reader, null); if (reader.ReadBoolean()) (LastTestResult2 = new Results.Entities.MeterTestRslt()).ReadBinary(reader, null); } + + internal void ResetNfcInterface(bool? nfc_on = null) + { + if (iperlHeadCfg.HeadCommunicationComPortNr == 0) return; + + SERIAL_Driver _SERIAL_Driver_Head_Config = new SERIAL_Driver(); + _SERIAL_Driver_Head_Config.OpenConnection($"COM{iperlHeadCfg.HeadCommunicationComPortNr}", 9600, 8, Parity.None, StopBits.One); + + NFCHeadConfig _NFCHead_Config = new NFCHeadConfig(_SERIAL_Driver_Head_Config); + if (nfc_on == null || nfc_on == false) _NFCHead_Config.NFCHeadConfig_SetInterface(false); // set RFID interface + if (nfc_on == null || nfc_on == true ) _NFCHead_Config.NFCHeadConfig_SetInterface(true); // set NFC interface + _SERIAL_Driver_Head_Config.Close(); + _SERIAL_Driver_Head_Config.Dispose(); + } + + internal void SetNfcInterface() + { + ResetNfcInterface(true); + } + + internal void SetRfidInterface() + { + ResetNfcInterface(false); + } + + internal void SetCommunicationInterface(CommunicationInterface commInterface) + { + //using (ISession session = TBF.DB.ConfigDBSessionFactory.OpenSession()) + // Replace the problematic line with the following code to fix the error: + using (ISession session = TBF.DB.SessionFactories[(int)DBKind.Config].OpenSession()) + using (ITransaction tx = session.BeginTransaction()) + { + try + { + var cmpntEntities = session.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .List(); + var cmpnt = cmpntEntities.Where(x => x.Name == Name).First(); + if (cmpnt != null) + { + XDocument doc = XDocument.Parse(cmpnt.Parameters); + if (doc != null) + { + XElement element = doc.Root.Element("CommunicationInterface"); + if (element != null) + { + element.Value = commInterface.ToString(); + cmpnt.Parameters = doc.ToString(); + session.SaveOrUpdate(cmpnt); + tx.Commit(); + log.FatalFormat($"Set CommunicationInterface {Name} to {commInterface.ToString()}"); + } + } + } + } + catch (Exception ex) + { + if (tx != null) tx.Rollback(); + log.FatalFormat($"Set CommunicationInterface {Name} error: {ex.Message}"); + } + } + } + + public IOperation ReadDatastreamOp() + { + return this; + } } } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs index eff628942..1cea9fee0 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs @@ -21,10 +21,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead public bool UseTcpIP; public string OptoIPAddress; public ushort OptoTcpipPortNr; + public int HeadCommunicationComPortNr; public int OptoComPortNr; public int RfidComPortNr; /// 0 = use MuxBoardNr public int MuxBoardNr; /// 0 = use RfidComPort(Nr), otherwise mux. board nr. 1 .. 4 public int Group; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10 + public CommunicationInterface CommunicationInterface; /// Communication Interface: RFID or NFC /// Procedure parameters [XmlIgnore] @@ -45,6 +47,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead RfidComPortNr = 0; /// = use mux. board MuxBoardNr = 1; ProcParams = CreateProcParamsProvider() as ProcParams; + CommunicationInterface = CommunicationInterface.RFID; + HeadCommunicationComPortNr = 0; } public IperlHeadCfg(IComponentFactory factory) @@ -55,12 +59,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead public string ToString(int i) { - return string.Format("{0} Group1 (mux#)={1}, Group2={2}, Opto=Com{3}, RFID=Com{4}", - Name, - MuxBoardNr, - Group, - OptoComPortNr, - RfidComPortNr); + return $"{Name} Group1 (mux#)={MuxBoardNr}, Group2={Group}, Opto=Com{OptoComPortNr}, {CommunicationInterface}=Com{RfidComPortNr}"; } } } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs index 6616b5b18..20992b2a6 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs @@ -3,16 +3,14 @@ /// using System; using System.Net; -using System.Net.Sockets; using System.Windows.Forms; using Common; -using Config.Entities; using TBF.Rig.Generic; using TBF.Resources; namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead { - public partial class IperlHeadCfgCtrl : UserControl, IComponentCfgCtrl + public partial class IperlHeadCfgCtrl : UserControl, IComponentCfgCtrl { public bool ShowMore { get { return false; } } @@ -51,11 +49,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead radioButton2.Checked = !config.UseTcpIP; ipAddressTextBox.Text = (config.OptoIPAddress != null) ? config.OptoIPAddress : "0.0.0.0"; tcpipPortTextBox.Text = config.OptoTcpipPortNr.ToString(); + headPortNrTextBox.Text = config.HeadCommunicationComPortNr.ToString(); optoSerialPortTextBox.Text = config.OptoComPortNr.ToString(); rfidPortNrTextBox.Text = config.RfidComPortNr.ToString(); muxBoardNrTextBox.Text = config.MuxBoardNr.ToString(); groupTextBox.Text = config.Group.ToString(); - } + comboBoxCommunicationInterface.SelectedItem = config.CommunicationInterface.ToString(); + tabPage2.Controls.Add(new IperlHeadTestCtrl(config)); + } public void Unlock() { @@ -66,8 +67,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead tcpipPortTextBox.Enabled = true; optoSerialPortTextBox.Enabled = true; rfidPortNrTextBox.Enabled = true; + headPortNrTextBox.Enabled = true; muxBoardNrTextBox.Enabled = true; groupTextBox.Enabled = true; + comboBoxCommunicationInterface.Enabled = true; } public CfgUpdateFlags VerifyCfg(ref string message) @@ -106,6 +109,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead message += Environment.NewLine + "'RFID serial port nr.' is not valid"; } + if (!int.TryParse(headPortNrTextBox.Text, out dummy) || dummy < 0 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Head communication serial port nr.' is not valid"; + } + if (!int.TryParse(muxBoardNrTextBox.Text, out dummy) || dummy < 1 || dummy > 4) { flags |= CfgUpdateFlags.Error; @@ -144,8 +153,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead config.RfidComPortNr = int.Parse(rfidPortNrTextBox.Text); config.MuxBoardNr = int.Parse(muxBoardNrTextBox.Text); config.Group = int.Parse(groupTextBox.Text); + config.CommunicationInterface = (CommunicationInterface)comboBoxCommunicationInterface.SelectedIndex; + config.HeadCommunicationComPortNr = int.Parse(headPortNrTextBox.Text); return flags; } - } + } } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs index bc657169d..7c8ab0de8 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs @@ -31,149 +31,150 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead /// private void InitializeComponent() { - this.nameTextBox = new System.Windows.Forms.TextBox(); - this.nameLabel = new System.Windows.Forms.Label(); - this.classNameLabel = new System.Windows.Forms.Label(); - this.optoSerialPortTextBox = new System.Windows.Forms.TextBox(); - this.optoSerialPortLabel = new System.Windows.Forms.Label(); - this.muxBoardNrTextBox = new System.Windows.Forms.TextBox(); - this.muxBoardNrLabel = new System.Windows.Forms.Label(); - this.groupTextBox = new System.Windows.Forms.TextBox(); - this.groupLabel = new System.Windows.Forms.Label(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.comboBoxCommunicationInterface = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); this.rfidPortNrTextBox = new System.Windows.Forms.TextBox(); this.rfidSerialPortNrLabel = new System.Windows.Forms.Label(); - this.radioButton1 = new System.Windows.Forms.RadioButton(); - this.radioButton2 = new System.Windows.Forms.RadioButton(); this.optoDataGroupBox = new System.Windows.Forms.GroupBox(); this.tcpipPortLabel = new System.Windows.Forms.Label(); this.tcpipPortTextBox = new System.Windows.Forms.TextBox(); this.ipAddressLabel = new System.Windows.Forms.Label(); this.ipAddressTextBox = new System.Windows.Forms.TextBox(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.label3 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.optoDataGroupBox.SuspendLayout(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.optoSerialPortLabel = new System.Windows.Forms.Label(); + this.optoSerialPortTextBox = new System.Windows.Forms.TextBox(); + this.groupTextBox = new System.Windows.Forms.TextBox(); + this.groupLabel = new System.Windows.Forms.Label(); + this.muxBoardNrTextBox = new System.Windows.Forms.TextBox(); + this.muxBoardNrLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label2 = new System.Windows.Forms.Label(); + this.headPortNrTextBox = new System.Windows.Forms.TextBox(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); this.groupBox1.SuspendLayout(); + this.optoDataGroupBox.SuspendLayout(); + this.groupBox2.SuspendLayout(); this.SuspendLayout(); // - // nameTextBox + // tabControl1 // - this.nameTextBox.Enabled = false; - this.nameTextBox.Location = new System.Drawing.Point(135, 40); - this.nameTextBox.Name = "nameTextBox"; - this.nameTextBox.Size = new System.Drawing.Size(121, 20); - this.nameTextBox.TabIndex = 2; + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Location = new System.Drawing.Point(3, 3); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(611, 432); + this.tabControl1.TabIndex = 0; // - // nameLabel + // tabPage1 // - this.nameLabel.AutoSize = true; - this.nameLabel.Location = new System.Drawing.Point(25, 43); - this.nameLabel.Name = "nameLabel"; - this.nameLabel.Size = new System.Drawing.Size(35, 13); - this.nameLabel.TabIndex = 1; - this.nameLabel.Text = "Name"; + this.tabPage1.Controls.Add(this.groupBox2); + this.tabPage1.Controls.Add(this.label4); + this.tabPage1.Controls.Add(this.label3); + this.tabPage1.Controls.Add(this.groupBox1); + this.tabPage1.Controls.Add(this.optoDataGroupBox); + this.tabPage1.Controls.Add(this.groupTextBox); + this.tabPage1.Controls.Add(this.groupLabel); + this.tabPage1.Controls.Add(this.muxBoardNrTextBox); + this.tabPage1.Controls.Add(this.muxBoardNrLabel); + this.tabPage1.Controls.Add(this.nameTextBox); + this.tabPage1.Controls.Add(this.nameLabel); + this.tabPage1.Controls.Add(this.classNameLabel); + this.tabPage1.Location = new System.Drawing.Point(4, 25); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(603, 403); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "Config"; + this.tabPage1.UseVisualStyleBackColor = true; // - // classNameLabel + // label4 // - this.classNameLabel.AutoSize = true; - this.classNameLabel.Location = new System.Drawing.Point(132, 16); - this.classNameLabel.Name = "classNameLabel"; - this.classNameLabel.Size = new System.Drawing.Size(60, 13); - this.classNameLabel.TabIndex = 0; - this.classNameLabel.Text = "ClassName"; + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(208, 101); + this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(40, 16); + this.label4.TabIndex = 25; + this.label4.Text = "1 .. 10"; // - // optoSerialPortTextBox + // label3 // - this.optoSerialPortTextBox.Enabled = false; - this.optoSerialPortTextBox.Location = new System.Drawing.Point(329, 42); - this.optoSerialPortTextBox.Name = "optoSerialPortTextBox"; - this.optoSerialPortTextBox.Size = new System.Drawing.Size(34, 20); - this.optoSerialPortTextBox.TabIndex = 7; + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(208, 72); + this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(33, 16); + this.label3.TabIndex = 24; + this.label3.Text = "1 .. 4"; // - // optoSerialPortLabel + // groupBox1 // - this.optoSerialPortLabel.AutoSize = true; - this.optoSerialPortLabel.Location = new System.Drawing.Point(241, 45); - this.optoSerialPortLabel.Name = "optoSerialPortLabel"; - this.optoSerialPortLabel.Size = new System.Drawing.Size(72, 13); - this.optoSerialPortLabel.TabIndex = 6; - this.optoSerialPortLabel.Text = "Serial port nr.:"; + this.groupBox1.Controls.Add(this.comboBoxCommunicationInterface); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.rfidPortNrTextBox); + this.groupBox1.Controls.Add(this.rfidSerialPortNrLabel); + this.groupBox1.Location = new System.Drawing.Point(10, 259); + this.groupBox1.Margin = new System.Windows.Forms.Padding(4); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Padding = new System.Windows.Forms.Padding(4); + this.groupBox1.Size = new System.Drawing.Size(552, 68); + this.groupBox1.TabIndex = 23; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "RFID / NFC communication (in case mux. board is not used)"; // - // muxBoardNrTextBox + // comboBoxCommunicationInterface // - this.muxBoardNrTextBox.Enabled = false; - this.muxBoardNrTextBox.Location = new System.Drawing.Point(135, 63); - this.muxBoardNrTextBox.Name = "muxBoardNrTextBox"; - this.muxBoardNrTextBox.Size = new System.Drawing.Size(34, 20); - this.muxBoardNrTextBox.TabIndex = 9; + this.comboBoxCommunicationInterface.Enabled = false; + this.comboBoxCommunicationInterface.FormattingEnabled = true; + this.comboBoxCommunicationInterface.Items.AddRange(new object[] { + "RFID", + "NFC"}); + this.comboBoxCommunicationInterface.Location = new System.Drawing.Point(201, 27); + this.comboBoxCommunicationInterface.Name = "comboBoxCommunicationInterface"; + this.comboBoxCommunicationInterface.Size = new System.Drawing.Size(71, 24); + this.comboBoxCommunicationInterface.TabIndex = 9; // - // muxBoardNrLabel + // label1 // - this.muxBoardNrLabel.AutoSize = true; - this.muxBoardNrLabel.Location = new System.Drawing.Point(25, 66); - this.muxBoardNrLabel.Name = "muxBoardNrLabel"; - this.muxBoardNrLabel.Size = new System.Drawing.Size(106, 13); - this.muxBoardNrLabel.TabIndex = 8; - this.muxBoardNrLabel.Text = "Group 1 (mux. board)"; - // - // groupTextBox - // - this.groupTextBox.Enabled = false; - this.groupTextBox.Location = new System.Drawing.Point(135, 86); - this.groupTextBox.Name = "groupTextBox"; - this.groupTextBox.Size = new System.Drawing.Size(34, 20); - this.groupTextBox.TabIndex = 11; - // - // groupLabel - // - this.groupLabel.AutoSize = true; - this.groupLabel.Location = new System.Drawing.Point(25, 89); - this.groupLabel.Name = "groupLabel"; - this.groupLabel.Size = new System.Drawing.Size(45, 13); - this.groupLabel.TabIndex = 10; - this.groupLabel.Text = "Group 2"; + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(41, 30); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(153, 16); + this.label1.TabIndex = 8; + this.label1.Text = "Communication Interface"; // // rfidPortNrTextBox // this.rfidPortNrTextBox.Enabled = false; - this.rfidPortNrTextBox.Location = new System.Drawing.Point(329, 21); + this.rfidPortNrTextBox.Location = new System.Drawing.Point(439, 26); + this.rfidPortNrTextBox.Margin = new System.Windows.Forms.Padding(4); this.rfidPortNrTextBox.Name = "rfidPortNrTextBox"; - this.rfidPortNrTextBox.Size = new System.Drawing.Size(34, 20); + this.rfidPortNrTextBox.Size = new System.Drawing.Size(44, 22); this.rfidPortNrTextBox.TabIndex = 7; // // rfidSerialPortNrLabel // this.rfidSerialPortNrLabel.AutoSize = true; - this.rfidSerialPortNrLabel.Location = new System.Drawing.Point(241, 24); + this.rfidSerialPortNrLabel.Location = new System.Drawing.Point(321, 30); + this.rfidSerialPortNrLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.rfidSerialPortNrLabel.Name = "rfidSerialPortNrLabel"; - this.rfidSerialPortNrLabel.Size = new System.Drawing.Size(72, 13); + this.rfidSerialPortNrLabel.Size = new System.Drawing.Size(88, 16); this.rfidSerialPortNrLabel.TabIndex = 6; this.rfidSerialPortNrLabel.Text = "Serial port nr.:"; // - // radioButton1 - // - this.radioButton1.AutoSize = true; - this.radioButton1.Enabled = false; - this.radioButton1.Location = new System.Drawing.Point(22, 19); - this.radioButton1.Name = "radioButton1"; - this.radioButton1.Size = new System.Drawing.Size(83, 17); - this.radioButton1.TabIndex = 0; - this.radioButton1.TabStop = true; - this.radioButton1.Text = "Use TCP/IP"; - this.radioButton1.UseVisualStyleBackColor = true; - // - // radioButton2 - // - this.radioButton2.AutoSize = true; - this.radioButton2.Enabled = false; - this.radioButton2.Location = new System.Drawing.Point(234, 19); - this.radioButton2.Name = "radioButton2"; - this.radioButton2.Size = new System.Drawing.Size(92, 17); - this.radioButton2.TabIndex = 1; - this.radioButton2.TabStop = true; - this.radioButton2.Text = "Use serial port"; - this.radioButton2.UseVisualStyleBackColor = true; - // // optoDataGroupBox // this.optoDataGroupBox.Controls.Add(this.tcpipPortLabel); @@ -184,125 +185,257 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead this.optoDataGroupBox.Controls.Add(this.radioButton2); this.optoDataGroupBox.Controls.Add(this.optoSerialPortLabel); this.optoDataGroupBox.Controls.Add(this.optoSerialPortTextBox); - this.optoDataGroupBox.Location = new System.Drawing.Point(28, 114); + this.optoDataGroupBox.Location = new System.Drawing.Point(10, 131); + this.optoDataGroupBox.Margin = new System.Windows.Forms.Padding(4); this.optoDataGroupBox.Name = "optoDataGroupBox"; - this.optoDataGroupBox.Size = new System.Drawing.Size(414, 97); - this.optoDataGroupBox.TabIndex = 5; + this.optoDataGroupBox.Padding = new System.Windows.Forms.Padding(4); + this.optoDataGroupBox.Size = new System.Drawing.Size(552, 119); + this.optoDataGroupBox.TabIndex = 18; this.optoDataGroupBox.TabStop = false; this.optoDataGroupBox.Text = "Opto-data"; // // tcpipPortLabel // this.tcpipPortLabel.AutoSize = true; - this.tcpipPortLabel.Location = new System.Drawing.Point(31, 71); + this.tcpipPortLabel.Location = new System.Drawing.Point(41, 87); + this.tcpipPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.tcpipPortLabel.Name = "tcpipPortLabel"; - this.tcpipPortLabel.Size = new System.Drawing.Size(47, 13); + this.tcpipPortLabel.Size = new System.Drawing.Size(54, 16); this.tcpipPortLabel.TabIndex = 4; this.tcpipPortLabel.Text = "Port nr..:"; // // tcpipPortTextBox // this.tcpipPortTextBox.Enabled = false; - this.tcpipPortTextBox.Location = new System.Drawing.Point(107, 68); + this.tcpipPortTextBox.Location = new System.Drawing.Point(143, 84); + this.tcpipPortTextBox.Margin = new System.Windows.Forms.Padding(4); this.tcpipPortTextBox.Name = "tcpipPortTextBox"; - this.tcpipPortTextBox.Size = new System.Drawing.Size(39, 20); + this.tcpipPortTextBox.Size = new System.Drawing.Size(51, 22); this.tcpipPortTextBox.TabIndex = 5; // // ipAddressLabel // this.ipAddressLabel.AutoSize = true; - this.ipAddressLabel.Location = new System.Drawing.Point(31, 48); + this.ipAddressLabel.Location = new System.Drawing.Point(41, 59); + this.ipAddressLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.ipAddressLabel.Name = "ipAddressLabel"; - this.ipAddressLabel.Size = new System.Drawing.Size(63, 13); + this.ipAddressLabel.Size = new System.Drawing.Size(78, 16); this.ipAddressLabel.TabIndex = 2; this.ipAddressLabel.Text = "IP address.:"; // // ipAddressTextBox // this.ipAddressTextBox.Enabled = false; - this.ipAddressTextBox.Location = new System.Drawing.Point(107, 45); + this.ipAddressTextBox.Location = new System.Drawing.Point(143, 55); + this.ipAddressTextBox.Margin = new System.Windows.Forms.Padding(4); this.ipAddressTextBox.Name = "ipAddressTextBox"; - this.ipAddressTextBox.Size = new System.Drawing.Size(98, 20); + this.ipAddressTextBox.Size = new System.Drawing.Size(129, 22); this.ipAddressTextBox.TabIndex = 3; // - // groupBox1 + // radioButton1 // - this.groupBox1.Controls.Add(this.rfidPortNrTextBox); - this.groupBox1.Controls.Add(this.rfidSerialPortNrLabel); - this.groupBox1.Location = new System.Drawing.Point(28, 218); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(414, 55); - this.groupBox1.TabIndex = 12; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "RFID communication (in case mux. board is not used)"; + this.radioButton1.AutoSize = true; + this.radioButton1.Checked = true; + this.radioButton1.Enabled = false; + this.radioButton1.Location = new System.Drawing.Point(29, 23); + this.radioButton1.Margin = new System.Windows.Forms.Padding(4); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(99, 20); + this.radioButton1.TabIndex = 0; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "Use TCP/IP"; + this.radioButton1.UseVisualStyleBackColor = true; // - // label3 + // radioButton2 // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(176, 66); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(31, 13); - this.label3.TabIndex = 13; - this.label3.Text = "1 .. 4"; + this.radioButton2.AutoSize = true; + this.radioButton2.Enabled = false; + this.radioButton2.Location = new System.Drawing.Point(312, 23); + this.radioButton2.Margin = new System.Windows.Forms.Padding(4); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(115, 20); + this.radioButton2.TabIndex = 1; + this.radioButton2.Text = "Use serial port"; + this.radioButton2.UseVisualStyleBackColor = true; // - // label4 + // optoSerialPortLabel // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(176, 89); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(37, 13); - this.label4.TabIndex = 14; - this.label4.Text = "1 .. 10"; + this.optoSerialPortLabel.AutoSize = true; + this.optoSerialPortLabel.Location = new System.Drawing.Point(321, 55); + this.optoSerialPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.optoSerialPortLabel.Name = "optoSerialPortLabel"; + this.optoSerialPortLabel.Size = new System.Drawing.Size(88, 16); + this.optoSerialPortLabel.TabIndex = 6; + this.optoSerialPortLabel.Text = "Serial port nr.:"; // - // WaterMeterCfgCtrl + // optoSerialPortTextBox // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.optoSerialPortTextBox.Enabled = false; + this.optoSerialPortTextBox.Location = new System.Drawing.Point(439, 52); + this.optoSerialPortTextBox.Margin = new System.Windows.Forms.Padding(4); + this.optoSerialPortTextBox.Name = "optoSerialPortTextBox"; + this.optoSerialPortTextBox.Size = new System.Drawing.Size(44, 22); + this.optoSerialPortTextBox.TabIndex = 7; + // + // groupTextBox + // + this.groupTextBox.Enabled = false; + this.groupTextBox.Location = new System.Drawing.Point(153, 97); + this.groupTextBox.Margin = new System.Windows.Forms.Padding(4); + this.groupTextBox.Name = "groupTextBox"; + this.groupTextBox.Size = new System.Drawing.Size(44, 22); + this.groupTextBox.TabIndex = 22; + // + // groupLabel + // + this.groupLabel.AutoSize = true; + this.groupLabel.Location = new System.Drawing.Point(6, 101); + this.groupLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.groupLabel.Name = "groupLabel"; + this.groupLabel.Size = new System.Drawing.Size(54, 16); + this.groupLabel.TabIndex = 21; + this.groupLabel.Text = "Group 2"; + // + // muxBoardNrTextBox + // + this.muxBoardNrTextBox.Enabled = false; + this.muxBoardNrTextBox.Location = new System.Drawing.Point(153, 69); + this.muxBoardNrTextBox.Margin = new System.Windows.Forms.Padding(4); + this.muxBoardNrTextBox.Name = "muxBoardNrTextBox"; + this.muxBoardNrTextBox.Size = new System.Drawing.Size(44, 22); + this.muxBoardNrTextBox.TabIndex = 20; + // + // muxBoardNrLabel + // + this.muxBoardNrLabel.AutoSize = true; + this.muxBoardNrLabel.Location = new System.Drawing.Point(6, 72); + this.muxBoardNrLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.muxBoardNrLabel.Name = "muxBoardNrLabel"; + this.muxBoardNrLabel.Size = new System.Drawing.Size(131, 16); + this.muxBoardNrLabel.TabIndex = 19; + this.muxBoardNrLabel.Text = "Group 1 (mux. board)"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(153, 40); + this.nameTextBox.Margin = new System.Windows.Forms.Padding(4); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(160, 22); + this.nameTextBox.TabIndex = 17; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(6, 44); + this.nameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(44, 16); + this.nameLabel.TabIndex = 16; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(149, 11); + this.classNameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(78, 16); + this.classNameLabel.TabIndex = 15; + this.classNameLabel.Text = "ClassName"; + // + // tabPage2 + // + this.tabPage2.Location = new System.Drawing.Point(4, 25); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(603, 403); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "Test"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.headPortNrTextBox); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Location = new System.Drawing.Point(10, 335); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(552, 50); + this.groupBox2.TabIndex = 26; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Head Communication"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(321, 18); + this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(88, 16); + this.label2.TabIndex = 7; + this.label2.Text = "Serial port nr.:"; + // + // headPortNrTextBox + // + this.headPortNrTextBox.Enabled = false; + this.headPortNrTextBox.Location = new System.Drawing.Point(439, 15); + this.headPortNrTextBox.Margin = new System.Windows.Forms.Padding(4); + this.headPortNrTextBox.Name = "headPortNrTextBox"; + this.headPortNrTextBox.Size = new System.Drawing.Size(44, 22); + this.headPortNrTextBox.TabIndex = 8; + // + // IperlHeadCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.label4); - this.Controls.Add(this.label3); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.optoDataGroupBox); - this.Controls.Add(this.groupTextBox); - this.Controls.Add(this.groupLabel); - this.Controls.Add(this.muxBoardNrTextBox); - this.Controls.Add(this.muxBoardNrLabel); - this.Controls.Add(this.nameTextBox); - this.Controls.Add(this.nameLabel); - this.Controls.Add(this.classNameLabel); - this.Name = "WaterMeterCfgCtrl"; - this.Size = new System.Drawing.Size(500, 300); + this.Controls.Add(this.tabControl1); + this.Margin = new System.Windows.Forms.Padding(4); + this.Name = "IperlHeadCfgCtrl"; + this.Size = new System.Drawing.Size(617, 438); this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load); - this.optoDataGroupBox.ResumeLayout(false); - this.optoDataGroupBox.PerformLayout(); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage1.PerformLayout(); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); + this.optoDataGroupBox.ResumeLayout(false); + this.optoDataGroupBox.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); this.ResumeLayout(false); - this.PerformLayout(); } - #endregion + #endregion - private System.Windows.Forms.TextBox nameTextBox; - private System.Windows.Forms.Label nameLabel; - private System.Windows.Forms.Label classNameLabel; - private System.Windows.Forms.TextBox optoSerialPortTextBox; - private System.Windows.Forms.Label optoSerialPortLabel; - private System.Windows.Forms.TextBox muxBoardNrTextBox; - private System.Windows.Forms.Label muxBoardNrLabel; - private System.Windows.Forms.TextBox groupTextBox; - private System.Windows.Forms.Label groupLabel; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.ComboBox comboBoxCommunicationInterface; + private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox rfidPortNrTextBox; private System.Windows.Forms.Label rfidSerialPortNrLabel; - private System.Windows.Forms.RadioButton radioButton1; - private System.Windows.Forms.RadioButton radioButton2; private System.Windows.Forms.GroupBox optoDataGroupBox; private System.Windows.Forms.Label tcpipPortLabel; private System.Windows.Forms.TextBox tcpipPortTextBox; private System.Windows.Forms.Label ipAddressLabel; private System.Windows.Forms.TextBox ipAddressTextBox; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label4; - } + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.Label optoSerialPortLabel; + private System.Windows.Forms.TextBox optoSerialPortTextBox; + private System.Windows.Forms.TextBox groupTextBox; + private System.Windows.Forms.Label groupLabel; + private System.Windows.Forms.TextBox muxBoardNrTextBox; + private System.Windows.Forms.Label muxBoardNrLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox headPortNrTextBox; + private System.Windows.Forms.Label label2; + } } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs index 291b8b7ec..56300811f 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2015-2019 Sensus Slovensko a.s. +/// Copyright (c) 2015-2023 Sensus Slovensko a.s. /// using System; using System.IO; @@ -16,35 +16,30 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } - public MeterType MeterType; + public int WMType_ID; + public MeterType MeterType; public float CalibTarget; /// Target error after calibration in [%] - public float CalibTargetQ2; /// Target error at Q2 after Q2 correction in [%] public int FactorLimitLo; /// Lower limit for the calibration factor public int FactorLimitHi; /// Upper limit for the calibration factor public Counting Counting; /// Initial iPerl counting (Artbitrary, Positive or Negative) - public int WMType_ID; /// Required for Oracle DB: ID_WZTyp in table VT_PRUEFPUNKT_SOLL_SD public override void InitializeAll() { MeterType = MeterType.AutoDetect; CalibTarget = 0; - CalibTargetQ2 = 0; FactorLimitLo = 1000; FactorLimitHi = 8000; Counting = Counting.Arbitrary; - WMType_ID = 2; /// Value for iPerl DN15 } string[] paramNames = new string[] { "iPerl type", "Calib. target [%]", - "Calib. target at Q2 [%]", "Calib. factor Lo", "Calib. factor Hi", "Counting", - "WM type ID", }; public override string ParamName(int i) { return paramNames[i]; } public override int ParamsCount() { return paramNames.Length; } @@ -72,11 +67,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead { case 0: return MeterType.ToString(); case 1: return CalibTarget.ToString(); - case 2: return CalibTargetQ2.ToString(); - case 3: return FactorLimitLo.ToString(); - case 4: return FactorLimitHi.ToString(); - case 5: return Counting.ToString(); - case 6: return WMType_ID.ToString(); + case 2: return FactorLimitLo.ToString(); + case 3: return FactorLimitHi.ToString(); + case 4: return Counting.ToString(); default: return string.Empty; } } @@ -92,16 +85,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead } break; case 1: CalibTarget = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; - case 2: CalibTargetQ2 = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; - case 3: FactorLimitLo = int.Parse(strValue); return CfgUpdateFlags.None; - case 4: FactorLimitHi = int.Parse(strValue); return CfgUpdateFlags.None; - case 5: + case 2: FactorLimitLo = int.Parse(strValue); return CfgUpdateFlags.None; + case 3: FactorLimitHi = int.Parse(strValue); return CfgUpdateFlags.None; + case 4: for (Counting c = 0; c < Counting.Count; c++) { if (c.ToString().Equals(strValue)) { Counting = c; return CfgUpdateFlags.None; } } break; - case 6: WMType_ID = int.Parse(strValue); return CfgUpdateFlags.None; default: return CfgUpdateFlags.None; } @@ -121,18 +112,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead for (MeterType mt = 0; mt < MeterType.Count; mt++) if (mt.ToString().Equals(strValue)) return true; break; case 1: - case 2: if (Utils.TryParseSFloat(strValue, out fDummy) && fDummy >= -10.0f && fDummy <= 10.0f) return true; break; + case 2: case 3: - case 4: if (int.TryParse(strValue, out iDummy) && iDummy >= 1000 && iDummy <= 8000) return true; break; - case 5: + case 4: for (Counting c = 0; c < Counting.Count; c++) if (c.ToString().Equals(strValue)) return true; - break; - case 6: /// WMType_ID - if (int.TryParse(strValue, out iDummy)) return true; break; default: message = "Invalid index"; @@ -147,11 +134,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead { prms.MeterType = this.MeterType; prms.CalibTarget = this.CalibTarget; - prms.CalibTargetQ2 = this.CalibTargetQ2; prms.FactorLimitLo = this.FactorLimitLo; prms.FactorLimitHi = this.FactorLimitHi; prms.Counting = this.Counting; - prms.WMType_ID = this.WMType_ID; } public IParamsProvider Clone() diff --git a/TBF/Rig/Uni/FlowMeter/FlowMeter.cs b/TBF/Rig/Uni/FlowMeter/FlowMeter.cs index e24d75ac2..3700344e4 100644 --- a/TBF/Rig/Uni/FlowMeter/FlowMeter.cs +++ b/TBF/Rig/Uni/FlowMeter/FlowMeter.cs @@ -10,6 +10,7 @@ using SchematicDrawing; using TBF.Rig.ControlBoard.Uni; using TBF.Boxes; using TBF.Resources; +using AppDiagnostic; namespace TBF.Rig.Uni.FlowMeter { diff --git a/TBF/Rig/Uni/FlowMeter/FlowMeterCfg.cs b/TBF/Rig/Uni/FlowMeter/FlowMeterCfg.cs index 0f13af28c..b18becda3 100644 --- a/TBF/Rig/Uni/FlowMeter/FlowMeterCfg.cs +++ b/TBF/Rig/Uni/FlowMeter/FlowMeterCfg.cs @@ -415,7 +415,7 @@ namespace TBF.Rig.Uni.FlowMeter case 0: return new string[] { "1", "2", "3", "4", "5", "6", "7" }; case 4: - return new string[] { "m3/h", "l/h" }; + return new string[] { "m3/h", "l/h", "gal/m" }; case 5: return new string[] { "°C", "°F", "K" }; case 6: @@ -488,7 +488,8 @@ namespace TBF.Rig.Uni.FlowMeter case 1: NominalFlow = TBF.Utils.ParseUDouble(str); return CfgUpdateFlags.RestartRqrd; case 2: NominalFreq = TBF.Utils.ParseUDouble(str); return CfgUpdateFlags.RestartRqrd; case 3: MsrdFormat = str; return CfgUpdateFlags.RestartRqrd; - case 4: MsrdUnit = (str == "l/h") ? Unit.lph : Unit.m3ph; return CfgUpdateFlags.RestartRqrd; + //case 4: MsrdUnit = (str == "l/h") ? Unit.lph : Unit.m3ph; return CfgUpdateFlags.RestartRqrd; + case 4: MsrdUnit = ParseFlowUnit(str); return CfgUpdateFlags.RestartRqrd; case 5: TempUnit.ToDescription(); return CfgUpdateFlags.RestartRqrd; case 6: PressureUnit.ToDescription(); return CfgUpdateFlags.RestartRqrd; @@ -638,5 +639,15 @@ namespace TBF.Rig.Uni.FlowMeter { return true; /// =OK, do nothing } + public static Unit ParseFlowUnit(string str) + { + switch (str) + { + case "l/h": return Unit.lph; + case "gal/m": return Unit.USgalpm; + case "m3/h": + default: return Unit.m3ph; + } + } } } diff --git a/TBF/Rig/Uni/FlowMetersInParallel/FlowMeterCfg.cs b/TBF/Rig/Uni/FlowMetersInParallel/FlowMeterCfg.cs index c5555b5bc..e59a94de6 100644 --- a/TBF/Rig/Uni/FlowMetersInParallel/FlowMeterCfg.cs +++ b/TBF/Rig/Uni/FlowMetersInParallel/FlowMeterCfg.cs @@ -115,7 +115,7 @@ namespace TBF.Rig.Uni.FlowMetersInParallel fmtrs.Add("---"); return fmtrs; case 5: - return new string[] { "m3/h", "l/h" }; + return new string[] { "m3/h", "l/h", "gal/m" }; default: return null; } @@ -148,7 +148,8 @@ namespace TBF.Rig.Uni.FlowMetersInParallel case 2: Flowmeter3 = (str != "---") ? str : string.Empty; return CfgUpdateFlags.RestartRqrd; case 3: InactiveFlowmtr = (str != "---") ? str : string.Empty; return CfgUpdateFlags.RestartRqrd; case 4: MsrdFormat = str; return CfgUpdateFlags.RestartRqrd; - case 5: MsrdUnit = (str == "l/h") ? Unit.lph : Unit.m3ph; return CfgUpdateFlags.RestartRqrd; + //case 5: MsrdUnit = (str == "l/h") ? Unit.lph : Unit.m3ph; return CfgUpdateFlags.RestartRqrd; + case 5: MsrdUnit = ParseFlowUnit(str); return CfgUpdateFlags.RestartRqrd; default: return CfgUpdateFlags.None; } @@ -199,5 +200,15 @@ namespace TBF.Rig.Uni.FlowMetersInParallel { return true; /// =OK, do nothing } + public static Unit ParseFlowUnit(string str) + { + switch (str) + { + case "l/h": return Unit.lph; + case "gal/m": return Unit.USgalpm; + case "m3/h": + default: return Unit.m3ph; + } + } } } diff --git a/TBF/Rig/Uni/RegValve/ChangeRegValvePositionOp.cs b/TBF/Rig/Uni/RegValve/ChangeRegValvePositionOp.cs index 07efc054d..e4ff3520d 100644 --- a/TBF/Rig/Uni/RegValve/ChangeRegValvePositionOp.cs +++ b/TBF/Rig/Uni/RegValve/ChangeRegValvePositionOp.cs @@ -1,10 +1,9 @@ /// -/// Copyright (c) 2021-2023 Sensus Slovensko a.s. +/// Copyright (c) 2021 Sensus Metering Systems /// using System; using System.Collections.Generic; using log4net; -using TBF.Rig.ControlBoard.Uni; using TBF.Rig.GenericDevices; namespace TBF.Rig.Uni.RegValve @@ -14,12 +13,12 @@ namespace TBF.Rig.Uni.RegValve private static readonly ILog log = LogManager.GetLogger(typeof(ChangeRegValvePositionOp)); public override string ToString() { - return string.Format("ChangeRegValvePositionOp({0},{1}s)", regV.Name, timePulseSec.ToString("F2")); + return string.Format("ChangeRegValvePositionOp({0},{1}s)", regulValve.Name, timePulseSec.ToString("F2")); } /// Set by the constructor - readonly UniCB uniCB; - readonly RegValve regV; + readonly TBF.Rig.ControlBoard.Uni.UniCB controlBoard; + readonly RegValve regulValve; readonly int regulValveNr; readonly double timePulseSec; @@ -33,14 +32,14 @@ namespace TBF.Rig.Uni.RegValve /// Upper limit of the position to be achieved /// Timeout in sec. for setting the flow /// Only Elde.Valve flow are used, other flow on the lists are ignored - public ChangeRegValvePositionOp(UniCB uniCB, RegValve regV, double timePulseSec) + public ChangeRegValvePositionOp(TBF.Rig.ControlBoard.IControlBoard cb, RegValve rv, double timePulseSec) { - this.uniCB = uniCB; - if (this.uniCB == null) throw new ArgumentNullException("ctrlBoard"); + controlBoard = cb as TBF.Rig.ControlBoard.Uni.UniCB; + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); - this.regV = regV as RegValve; - if (this.regV == null) throw new ArgumentNullException("regValve is null or not Uni"); - regulValveNr = this.regV.Idx1; + regulValve = rv as RegValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = this.regulValve.Idx1; this.timePulseSec = timePulseSec; @@ -50,7 +49,13 @@ namespace TBF.Rig.Uni.RegValve /// Start this operation public void Start() { - uniCB.RegVlvIncrMove(false, regulValveNr, timePulseSec); + //double positionPct = controlBoard.RValvePosition(regulValveNr); + //log.WarnFormat("RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + + //controlBoard.ValveMove(regulValveNr, + // TBF.Rig.ControlBoard.Legacy.RegulValveMode.PulseWidth, + // new double[2] { timePulseSec, timePulseSec }, + // regulValve.StableTime); } /// Run this operation @@ -59,6 +64,9 @@ namespace TBF.Rig.Uni.RegValve /// public Event Run() { + //float positionPct = controlBoard.RValvePosition(regulValveNr); + //log.WarnFormat("RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + return Event.PositionReached; } diff --git a/TBF/Rig/Uni/RegValve/Factory.cs b/TBF/Rig/Uni/RegValve/Factory.cs index 4c0c96e9c..0c0dafb98 100644 --- a/TBF/Rig/Uni/RegValve/Factory.cs +++ b/TBF/Rig/Uni/RegValve/Factory.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2021 Sensus Slovensko a.s. +/// Copyright (c) 2021 Sensus Metering Systems /// using System.Collections.Generic; using TBF.Rig.Generic; diff --git a/TBF/Rig/Uni/RegValve/Handlers.cs b/TBF/Rig/Uni/RegValve/Handlers.cs index b16a486f6..2ba144a37 100644 --- a/TBF/Rig/Uni/RegValve/Handlers.cs +++ b/TBF/Rig/Uni/RegValve/Handlers.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2021 Sensus Slovensko a.s. +/// Copyright (c) 2021 Sensus Metering Systems /// using System; using log4net; diff --git a/TBF/Rig/Uni/RegValve/RegValve.cs b/TBF/Rig/Uni/RegValve/RegValve.cs index d8282b0a4..33483d05f 100644 --- a/TBF/Rig/Uni/RegValve/RegValve.cs +++ b/TBF/Rig/Uni/RegValve/RegValve.cs @@ -32,30 +32,15 @@ namespace TBF.Rig.Uni.RegValve public bool StoredPositionReuse { get { return regValveCfg.StoredPositionReuse; } } /// public bool IsCoax { get { return false; } } - - public RegValveState RegValveState - { - get - { - switch (UniCB.Data.RegVStatus[Idx1 - 1]) - { - default: - case 0: return ControlBoard.Uni.RegValveState.Idle; - case 2: return ControlBoard.Uni.RegValveState.PwOrFreqRegul; - case 3: return ControlBoard.Uni.RegValveState.DacValueRegul; - } - } - } - - /// Position 0.0 .. 100.0 in % + + /// 0.0 .. 100.0 public double Position { get { int denominator = DacValueOpen - DacValueClosed; if (denominator == 0) denominator = 1; - return 100.0 * Convert.ToDouble(Math.Max(0, Math.Min(denominator, (int)UniCB.AnalogInput(adcChannel) - DacValueClosed))) - / Convert.ToDouble(denominator); + return 100.0 * Convert.ToDouble(UniCB.AnalogInput(adcChannel) - DacValueClosed) / Convert.ToDouble(denominator); } } /// @@ -76,6 +61,7 @@ namespace TBF.Rig.Uni.RegValve } int adcChannel; + public RegValveState RegValveState; public double TargetRegValvePosition; @@ -93,15 +79,11 @@ namespace TBF.Rig.Uni.RegValve /// /// Reg. valve ID /// Reg. valve position (0 .. 1.0) - public void MoveToPosition(bool isFromUI, double posPctLo, double posPctHi = -1) + public void MoveToPosition(bool isFromUI, double positionLo, double positionHi = -1) { - int adcDiff = Math.Abs(regValveCfg.AdcValueOpen - regValveCfg.AdcValueClosed); - int adcLower = Math.Min(regValveCfg.AdcValueOpen, regValveCfg.AdcValueClosed); - - int targetAdcValLo = Math.Max(0, Convert.ToInt32(Math.Round((posPctLo * adcDiff / 100.0) + adcLower))); - int targetAdcValHi = (posPctHi < 0) ? -1 : Math.Min(1023, Convert.ToInt32(Math.Round((posPctHi * adcDiff / 100.0) + adcLower))); - - UniCB.RegVlvMoveToPos(isFromUI, Idx1, targetAdcValLo, targetAdcValHi); + int positionLoInt = Convert.ToInt32(positionLo); + int positionHiInt = Convert.ToInt32(positionHi); + UniCB.RegVlvMoveToPos(isFromUI, Idx1, positionLoInt, positionHiInt); } @@ -157,6 +139,8 @@ namespace TBF.Rig.Uni.RegValve this.UniCB = TbfComponents.FindComponent(cfg.ParentName, components) as UniCB; if (this.UniCB == null) throw new Exception(string.Format("Cannot find {0} (a parent of {1})", cfg.ParentName, Name)); + + log.Warn(this.ToString()); } public override void Initialize() @@ -171,8 +155,6 @@ namespace TBF.Rig.Uni.RegValve if (args.Increase) IncreaseSetpoint(); else DecreaseSetpoint(); } }; - - log.FatalFormat("{0} initialized: {1}", Name, this); } /// diff --git a/TBF/Rig/Uni/RegValve/SetFlowOp.cs b/TBF/Rig/Uni/RegValve/SetFlowOp.cs index f69caab35..02f301cdb 100644 --- a/TBF/Rig/Uni/RegValve/SetFlowOp.cs +++ b/TBF/Rig/Uni/RegValve/SetFlowOp.cs @@ -3,7 +3,6 @@ /// using System; using System.Collections.Generic; -using Common; using log4net; using Config.Entities; using TBF.Rig.ControlBoard.Uni; @@ -20,10 +19,11 @@ namespace TBF.Rig.Uni.RegValve return string.Format("SetFlowOp({0}, Qfrom={1}, Qto={2})", regV.Name, shrinkedTgtFlowLo, shrinkedTgtFlowHi); } + public const double RqrdFlowRangeRatio = 0.5; /// - /// Set by the constructor + /// Set by the constructor /// readonly UniCB uniCB; readonly RegValve regV; @@ -36,8 +36,8 @@ namespace TBF.Rig.Uni.RegValve readonly bool leaveFlowControlRunning; readonly double maximalFlow; - - /// + + /// /// Internal state of this operation /// enum OpState @@ -56,12 +56,13 @@ namespace TBF.Rig.Uni.RegValve double currentReqFlowLo; double currentReqFlowHi; - double targetPositionLo; - double targetPositionHi; + double targetPositionLo; + double targetPositionHi; + int startTime; int setFlowTime; int expireTime; - DoubleBox msrdFlow; + DoubleBox flowBox; int isFlowOkDuration; @@ -70,23 +71,23 @@ namespace TBF.Rig.Uni.RegValve /// Events: FlowSet, FlowTimeOut /// /// Control board device - /// Regulation valve component + /// Regulation valve component /// Flowmeter component /// Lower limit of the flow to be achieved in [m3/h] /// Upper limit of the flow to be achieved in [m3/h] - /// DoubleBox for measured flow + /// PID coefficient (float) /// Timeout for the flow setting in [s] - /// Flow setting starts after this delay in [s] + /// Flow setting starts after this delay [s] /// true = Leave the measurement running after op. stop /// Only Elde.Valve flow are used, other flow on the lists are ignored - public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox msrdFlow, + public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox flowBox, int timeout, int delay, bool leaveFlowControlRunning) { - this.uniCB = uniCB; - if (this.uniCB == null) throw new ArgumentNullException("Control board is null or not Uni"); + this.uniCB = uniCB; + if (this.uniCB == null) throw new ArgumentNullException("cBoard is null or not Uni"); this.regV = regValve as RegValve; - if (this.regV == null) throw new ArgumentNullException(string.Format("{0} is not Uni.RegValve", regValve.Name)); + if (this.regV == null) throw new ArgumentNullException("regValve is null or not Uni"); this.flowMeter = flowMeter; if (this.flowMeter == null) throw new ArgumentNullException("flowMeter"); @@ -96,14 +97,15 @@ namespace TBF.Rig.Uni.RegValve double rqrdFlowLoBeforeCorr = qFrom - MeasurementCorrection.GetCorrection(qFrom, flowMeter.Corrections); double rqrdFlowHiBeforeCorr = qTo - MeasurementCorrection.GetCorrection(qTo, flowMeter.Corrections); targetFlowAve = (rqrdFlowLoBeforeCorr + rqrdFlowHiBeforeCorr) / 2; - shrinkedTgtFlowLo = (RqrdFlowRangeRatio * rqrdFlowLoBeforeCorr) - + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the lower limit 15% of the range up - shrinkedTgtFlowHi = (RqrdFlowRangeRatio * rqrdFlowHiBeforeCorr) - + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the upper limit 15% of the range down + shrinkedTgtFlowLo = (RqrdFlowRangeRatio * rqrdFlowLoBeforeCorr) + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the lower limit 15% of the range up + shrinkedTgtFlowHi = (RqrdFlowRangeRatio * rqrdFlowHiBeforeCorr) + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the upper limit 15% of the range down + + this.flowBox = flowBox; + if (this.flowBox == null) throw new ArgumentNullException("flowBox"); - this.msrdFlow = msrdFlow; this.timeout = timeout; this.delay = delay; + this.leaveFlowControlRunning = leaveFlowControlRunning; log.Debug(this.ToString()); @@ -169,13 +171,16 @@ namespace TBF.Rig.Uni.RegValve return; } - /// Start this operation + /// + /// Start this operation + /// public void Start() { log.InfoFormat("SetFlowOp:Start() rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", regV.Idx1, flowMeter.Idx1, currentReqFlowLo, currentReqFlowHi); /// Store the current time, etc. + startTime = StateMachine.Time; setFlowTime = StateMachine.Time + delay; expireTime = StateMachine.Time + timeout; if (expireTime < 0) expireTime = int.MaxValue; @@ -206,8 +211,6 @@ namespace TBF.Rig.Uni.RegValve if (opState == OpState.Wait4FlowMsrmntAndSendRVMove) { - if (flowMeter.DebugLevel == DebugMode.Simulate) return Event.FlowReached; - if (!flowMeter.MsrmntAvailable) return Event.Starting; double flow1 = flowMeter.ReadFlow(); @@ -225,8 +228,8 @@ namespace TBF.Rig.Uni.RegValve if (StateMachine.Time > setFlowTime) { - uniCB.SetFlow(false, regV.Idx1, flowMeter.NominalFreq * currentReqFlowLo / flowMeter.NominalFlow, - flowMeter.NominalFreq * currentReqFlowHi / flowMeter.NominalFlow); + uniCB.SetFlow(false, regV.Idx1, 2000.0 * currentReqFlowLo / flowMeter.NominalFlow, + 2000.0 * currentReqFlowHi / flowMeter.NominalFlow); log.InfoFormat("Run(): rv#={0} TARGET: flowLo={1} flowHi={2}", regV.Idx1, currentReqFlowLo, currentReqFlowHi); @@ -270,16 +273,17 @@ namespace TBF.Rig.Uni.RegValve /// double frequency = flowMeter.ReadFrequency(); double flow = flowMeter.ReadFlow(); - if (msrdFlow != null && flow != 0) msrdFlow.Val = flow; + if (flow != 0) flowBox.Val = flow; - if (currentReqFlowLo <= flow && flow <= currentReqFlowHi) + if ((currentReqFlowLo <= flow) && (flow <= currentReqFlowHi)) { - isFlowOkDuration++; /// Increment the flow within range duration + /// Flow is within range + isFlowOkDuration++; if (isFlowOkDuration >= regV.FlowStableSec) { /// Flow is within range for sufficiently long time - if (regV.StoredPositionReuse) + if (regV.regValveCfg.StoredPositionReuse) { double rvPosition = regV.Position; /// Read the current position double storedPosition; @@ -326,12 +330,13 @@ namespace TBF.Rig.Uni.RegValve } } - /// Stop this operation + /// Start this operation public void Stop() { if (!leaveFlowControlRunning) { - uniCB.StopFlowControl(false, regV.Idx1); /// Stop the flow measurement + /// Stop flow measurement + uniCB.StopFlowControl(false, regV.Idx1); } opState = OpState.Idle; diff --git a/TBF/Rig/Uni/RegValve/SetRegValvePositionOp.cs b/TBF/Rig/Uni/RegValve/SetRegValvePositionOp.cs index c81e97844..4ce9539d4 100644 --- a/TBF/Rig/Uni/RegValve/SetRegValvePositionOp.cs +++ b/TBF/Rig/Uni/RegValve/SetRegValvePositionOp.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2021-2022 Sensus Slovensko a.s. +/// Copyright (c) 2021 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; @@ -17,6 +17,8 @@ namespace TBF.Rig.Uni.RegValve return string.Format("SetRegValvePositionOp({0},{1},{2})", regV.Name, posLoPct, posHiPct); } + const int CoaxValveNr = 7; /// Coax. valve has number 7 + /// /// Internal states of this operation /// @@ -30,7 +32,7 @@ namespace TBF.Rig.Uni.RegValve OpState opState; /// Set by the constructor - readonly UniCB uniCB; + readonly UniCB cBoard; readonly RegValve regV; readonly int regValveNr; readonly double posLoPct; @@ -45,23 +47,24 @@ namespace TBF.Rig.Uni.RegValve /// Set required water flow. /// Events: FlowSet, FlowTimeOut /// - /// Control board device + /// Control board device /// Regulation valve component /// Lower limit of the position to be achieved /// Upper limit of the position to be achieved /// Timeout in sec. for setting the flow /// Only Elde.Valve flow are used, other flow on the lists are ignored - public SetRegValvePositionOp(UniCB uniCB, RegValve regV, double posLoPct, double posHiPct, int timeout) + public SetRegValvePositionOp(UniCB cBoard, RegValve regValve, double posLoPct, double posHiPct, int timeout) { - this.uniCB = uniCB; - if (this.uniCB == null) throw new ArgumentNullException("ctrlBoard"); + this.cBoard = cBoard; + if (this.cBoard == null) throw new ArgumentNullException("ctrlBoard"); - this.regV = regV as RegValve; - if (this.regV == null) throw new ArgumentNullException("regValve is null or not Uni"); + this.regV = regValve as RegValve; + if (this.regV == null) throw new ArgumentNullException("regValve is null or not Elde"); this.regValveNr = this.regV.Idx1; this.posLoPct = posLoPct; this.posHiPct = posHiPct; + this.timeout = timeout; log.Debug(this.ToString()); @@ -85,9 +88,7 @@ namespace TBF.Rig.Uni.RegValve opState = OpState.MoveToPosition; } - /// - /// Run this operation - /// + /// Run this operation /// /// Event.None . . . . . . . busy adjusting position /// Event.PositionReached . . position reached @@ -97,25 +98,29 @@ namespace TBF.Rig.Uni.RegValve { if (opState == OpState.MoveToPosition) { - if (posLoPct >= posHiPct || posLoPct > 100.0 || posHiPct < 0) + if (posLoPct >= posHiPct || posLoPct > 100.0f || posHiPct < 0) { return Event.OpArgumentError; } regV.MoveToPosition(false, posLoPct, posHiPct); - opState = OpState.CheckState; - log.WarnFormat("Run(): RV#={0}, state={1}, MoveToPosition(false, {2:D1}, {3:D1}) issued", regValveNr, opState, posLoPct, posHiPct); + opState = OpState.CheckState; return Event.None; } if (positionReached) return Event.PositionReached; double positionPct = regV.Position; - log.WarnFormat("Run(): RV#={0}, state={1}, pos={2}%", regValveNr, opState, positionPct.ToString("F1")); + log.WarnFormat("Run(): RV#={0}, actPos={1}%", regValveNr, positionPct.ToString("F1")); if (opState == OpState.CheckState) { - if (posLoPct <= positionPct && positionPct <= posHiPct) + if (regValveNr == CoaxValveNr && (cBoard.State & (ulong)StatusP.CoaxRegValveBusy) == 0) + { + opState = OpState.MoveToPosition; + return Event.None; + } + else if (posLoPct <= positionPct && positionPct <= posHiPct) { positionReached = true; return Event.PositionReached; @@ -148,8 +153,6 @@ namespace TBF.Rig.Uni.RegValve } /// Stop this operation - public void Stop() - { - } + public void Stop() { } } } diff --git a/TBF/Rig/Uni/RegValveAnalog/RegValve.cs b/TBF/Rig/Uni/RegValveAnalog/RegValve.cs index 634324dbb..f82f5e3cd 100644 --- a/TBF/Rig/Uni/RegValveAnalog/RegValve.cs +++ b/TBF/Rig/Uni/RegValveAnalog/RegValve.cs @@ -43,6 +43,8 @@ namespace TBF.Rig.Uni.RegValveAnalog return (1 / CalibDA) * uniCB.Data.StavDA[0]; } } + /// + public int RegulationMinStep { get { return 0; } } /// Analog RegValve not operates with this variable /// public double SetpointVal { diff --git a/TBF/Rig/Uni/RegValveTandem/RegValveTandem.cs b/TBF/Rig/Uni/RegValveTandem/RegValveTandem.cs index c763ea87d..9183d9c66 100644 --- a/TBF/Rig/Uni/RegValveTandem/RegValveTandem.cs +++ b/TBF/Rig/Uni/RegValveTandem/RegValveTandem.cs @@ -39,8 +39,10 @@ namespace TBF.Rig.Uni.RegValveTandem get { return regValve.Position; } } + /// + public int RegulationMinStep { get { return 0; } } /// Analog RegValve not operates with this variable - public RegValveTandem() { } + public RegValveTandem() { } public RegValveTandem(Generic.IComponentCfg cfg, IList components) : base(cfg) diff --git a/TBF/SampleConfig/log4netConfig.xml b/TBF/SampleConfig/log4netConfig.xml index 338d53558..44205cd62 100644 --- a/TBF/SampleConfig/log4netConfig.xml +++ b/TBF/SampleConfig/log4netConfig.xml @@ -38,12 +38,20 @@ + + + + + - + + + + diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index 42eb13944..46aaa5544 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -28,7 +28,7 @@ false true 1 - 2.12.497.%2a + 2.12.497.1 false true true @@ -39,7 +39,7 @@ full false bin\Debug\ - TRACE;DEBUG;CAMERA;LANG_PL + TRACE;DEBUG;CAMERA prompt 4 true @@ -60,7 +60,7 @@ true bin\Debug\ - TRACE;DEBUG;CAMERA;LANG_PL + TRACE;DEBUG;CAMERA full AnyCPU prompt @@ -70,7 +70,7 @@ bin\x86\Release\ - TRACE;CAMERA;LANG_PL + TRACE;IPERL;CAMERA true pdbonly AnyCPU @@ -152,6 +152,7 @@ + @@ -1345,6 +1346,50 @@ TestMethodCfgCtrl.cs + + + Component + + + + Form + + + + + + + + + + + + + + + + UserControl + + + + UserControl + + + + + + + + + + + + + + UserControl + + + Component @@ -1604,46 +1649,6 @@ - - - Component - - - - - - Form - - - iPerlCommunicationForm.cs - - - - - - - - - - - UserControl - - - IperlHeadCfgCtrl.cs - - - - - - - - - UserControl - - - TestMethodCfgCtrl.cs - - @@ -1787,6 +1792,19 @@ + + + + + + + UserControl + + + RegValveCfgCtrl.cs + + + @@ -2067,6 +2085,10 @@ Strings.resx + + + + @@ -2625,6 +2647,9 @@ SharedButtons.cs + + Component + Form @@ -3080,9 +3105,10 @@ GrabImageCfgCtrl.cs - - IperlHeadCfgCtrl.cs - + + + + CfgCtrl.cs @@ -3146,12 +3172,6 @@ TestMethodCfgCtrl.cs - - iPerlCommunicationForm.cs - - - TestMethodCfgCtrl.cs - TestMethodCfgCtrl.cs @@ -3164,6 +3184,9 @@ RegValveCfgCtrl.cs + + RegValveCfgCtrl.cs + RegValveTandemCfgCtrl.cs @@ -3339,9 +3362,11 @@ MainWnd.cs + Designer MainWnd.cs + Designer MainWnd.cs @@ -3351,6 +3376,7 @@ MainWnd.cs + Designer MainWnd.cs @@ -3447,6 +3473,7 @@ BenchControlPanel.cs + Designer ClosingTbfForm.cs @@ -3620,6 +3647,22 @@ + + {a3e14180-7f00-42e5-94a9-8db62ead6ee8} + Sensus.iPerl.RfidCom + + + {5025ed8b-a94f-4e58-8be0-68481b061609} + Sensus.iPerl.TestConsole + + + {5954d496-caab-4f7a-bde2-bdc8f47dab19} + NfcS5_DLL + + + {fa9abad1-7184-4295-ade8-d44f2e3de6b2} + AppDiagnostic + {c8939821-ba5c-4988-a3d0-bf53b74865c7} Common @@ -3656,6 +3699,10 @@ {0f79ca69-9dbc-41f3-a6fc-5a2937365343} SchematicDrawing + + {8f942729-f454-4c99-ba6c-746962065ae3} + SharedComponents + {211b5e3f-9996-48a7-abde-c878dd2d71c2} SharedDatabase @@ -3665,9 +3712,7 @@ Results - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/AppDiagnostic/Program.cs b/AppDiagnostic/Program.cs new file mode 100644 index 000000000..6aaa9c232 --- /dev/null +++ b/AppDiagnostic/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace AppDiagnostic +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } +} diff --git a/AppDiagnostic/Properties/AssemblyInfo.cs b/AppDiagnostic/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..482abc00e --- /dev/null +++ b/AppDiagnostic/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AppDiagnostic")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AppDiagnostic")] +[assembly: AssemblyCopyright("Copyright © 2024")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("fa9abad1-7184-4295-ade8-d44f2e3de6b2")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AppDiagnostic/Properties/Resources.Designer.cs b/AppDiagnostic/Properties/Resources.Designer.cs new file mode 100644 index 000000000..5f4bc8a07 --- /dev/null +++ b/AppDiagnostic/Properties/Resources.Designer.cs @@ -0,0 +1,62 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AppDiagnostic.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AppDiagnostic.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/AppDiagnostic/Properties/Resources.resx b/AppDiagnostic/Properties/Resources.resx new file mode 100644 index 000000000..13b775f1d --- /dev/null +++ b/AppDiagnostic/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/AppDiagnostic/Properties/Settings.settings b/AppDiagnostic/Properties/Settings.settings new file mode 100644 index 000000000..07e66beb1 --- /dev/null +++ b/AppDiagnostic/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/AppDiagnostic/packages.config b/AppDiagnostic/packages.config new file mode 100644 index 000000000..ffd035f93 --- /dev/null +++ b/AppDiagnostic/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Config/Data.cs b/Config/Data.cs new file mode 100644 index 000000000..88726d89d --- /dev/null +++ b/Config/Data.cs @@ -0,0 +1,103 @@ +using System; + +//formulas.cs has been added cause iPerl from master-2 ...MF + +namespace Config +{ + public class Data + { + public const string AdminUsername = "admin"; + public const string AdminPassword = "staratura"; + public const string SQLiteDbFName = "SQLite.db"; + +#if DN100 || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT || CEVAK_200 + public const int WMsCount = 3; + public const int LineSize = 3; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = 1; +#elif MUNICH + public const int WMsCount = 3; + public const int LineSize = 3; + public const int CompoundWMsCount = 3; + public const int HeatMetersCount = 0; + public const int MaxPartNr = 3; +#elif MALTA_WSD25 + public const int WMsCount = 6; + public const int LineSize = 6; + public const int CompoundWMsCount = 0; + public const int HeatMetersCount = 0; + public const int MaxPartNr = 1; +#elif BADGER_MALA_TRAT || BERLIN || FUZHOU_150 || FUZHOU_300 || GELSENWASSER || GENESIS || IZRAEL_200 || PETERSBURG_200 || SENTEC || SLM_150 || TORINO_50 + public const int WMsCount = 6; + public const int LineSize = 6; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = 1; +#elif PUCHONG_200 + public const int WMsCount = 6; + public const int LineSize = 6; + public const int CompoundWMsCount = 3; + public const int HeatMetersCount = 0; + public const int MaxPartNr = 3; +#elif RUM_MOB + public const int WMsCount = 8; + public const int LineSize = 8; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif TURA_SPECIAL + public const int WMsCount = 6; + public const int LineSize = 6; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif DEWA_300 || FUZHOU_100 || ROMA_200 || LUXEMBURG_40 + public const int WMsCount = 10; + public const int LineSize = 10; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif DUBAJ_50 + public const int WMsCount = 10; + public const int LineSize = 5; + public const int CompoundWMsCount = 0; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif SLM_END || WARSAW_END + public const int WMsCount = 10; + public const int LineSize = 5; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = 4; +#elif SLM_50 + public const int WMsCount = 12; + public const int LineSize = 12; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 6; + public const int MaxPartNr = WMsCount / LineSize; +#elif ALZIR_25 || BAHRAIN_50 || CEVAK_40 || FEWA_50 || FILIPINY_50 || FUZHOU_50 || HONGKONG_50 || IZRAEL_25 || JUZNA_AFRIKA_50 || KEMPNO_50 || KRAKOW_50 || MILWAUKEE || MURES_40 || PETERSBURG_50 || TORUN_50 || WARSAW_50 || ZAMBIA || ZODINO + public const int WMsCount = 20; + public const int LineSize = 10; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif TURA_IPERL || TURA_IPERL_NEW + public const int WMsCount = 40; + public const int LineSize = 20; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif IZRAEL_50 + public const int WMsCount = 40; + public const int LineSize = 10; + public const int CompoundWMsCount = 0; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#endif + + public static double RealDensity = 0; /// true water density [kg/m3] + public static double AtTemperature = 0; /// measured at temperature [°C] + public static double Buoyancy = 0; + } +} diff --git a/Config/Formulas.cs b/Config/Formulas.cs new file mode 100644 index 000000000..24b888476 --- /dev/null +++ b/Config/Formulas.cs @@ -0,0 +1,410 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Common; + +//formulas.cs has been added cause iPerl from master-2 ...MF + +namespace Config +{ + public static class Formulas + { + private static readonly ILog log = LogManager.GetLogger(typeof(Formulas)); + + + /// + /// Wrappers + /// + public static double RealDensity() { return Data.RealDensity; } + public static double AtTemperature() { return Data.AtTemperature; } + public static double Buoyancy() { return Data.Buoyancy; } + + + /// Private tables with coeficients to calculate specific enthalpy + static readonly int[] Ii; + static readonly int[] Ji; + static readonly double[] ni; + + /// Private table with coeficients to calculate temperature of a platinum thermometer + static readonly double[] Di; + + + /// + /// Constructor + /// + static Formulas() + { + /// + /// Initialize tables to calculate specific enthalpies + /// + Ii = new int[34] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 8, 8, 21, 23, 29, 30, 31, 32 }; + Ji = new int[34] { -2, -1, 0, 1, 2, 3, 4, 5, -9, -7, -1, 0, 1, 3, -3, 0, 1, 3, 17, -4, 0, 6, -5, -2, 10, -8, -11, -6, -29, -31, -38, -39, -40, -41 }; + ni = new double[34] { + 0.14632971213167, /// 1 + -0.84548187169114, /// 2 + -0.37563603672040E1, /// 3 + 0.33855169168385E1, /// 4 + -0.95791963387872, /// 5 + 0.15772038513228, /// 6 + -0.16616417199501E-1, /// 7 + 0.81214629983568E-3, /// 8 + 0.28319080123804E-3, /// 9 + -0.60706301565874E-3, /// 10 + -0.18990068218419E-1, /// 11 + -0.32529748770505E-1, /// 12 + -0.21841717175414E-1, /// 13 + -0.52838357969930E-4, /// 14 + -0.47184321073267E-3, /// 15 + -0.30001780793026E-3, /// 16 + 0.47661393906987E-4, /// 17 + -0.44141845330846E-5, /// 18 + -0.72694996297594E-15, /// 19 + -0.31679644845054E-4, /// 20 + -0.28270797985312E-5, /// 21 + -0.85205128120103E-9, /// 22 + -0.22425281908000E-5, /// 23 + -0.65171222895601E-6, /// 24 + -0.14341729937924E-12, /// 25 + -0.40516996860117E-6, /// 26 + -0.12734301741641E-8, /// 27 + -0.17424871230634E-9, /// 28 + -0.68762131295531E-18, /// 29 + 0.14478307828521E-19, /// 30 + 0.26335781662795E-22, /// 31 + -0.11947622640071E-22, /// 32 + 0.18228094581404E-23, /// 33 + -0.93537087292458E-25, /// 34 + }; + + /// + /// Initialize a table to calculate temperature of a platinum thermometer from resistance + /// + Di = new double[] + { + 439.932854, + 472.418020, + 37.684494, + 7.472018, + 2.920828, + 0.005184, + -0.963864, + -0.188732, + 0.191203, + 0.049025, + }; + } + + /// + /// Calculate density of distilled water from temperature + /// + /// ITS-90 temperature in [°C] + /// Density in [kg/m3] + public static double DistilledWaterDensityFromTemp(double t) + { + if (t <= 40) + { + const double c0 = 999.839564; + const double c1 = 0.067998613; + const double c2 = -0.0091101468; + const double c3 = 0.00010058299; + const double c4 = -0.0000011275659; + const double c5 = 6.5985371e-09; + + return ((((c5 * t + c4) * t + c3) * t + c2) * t + c1) * t + c0; + } + else + { + const double a0 = 9.9983952E2; + const double a1 = 1.6952577E1; + const double a2 = -7.9905127E-3; + const double a3 = -4.6241757E-5; + const double a4 = 1.0584601E-7; + const double a5 = -2.8103006E-10; + const double b = 1.6887236E-2; + + return (((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0) / (1.0 + b * t); + } + } + + /// + /// Calculate density of distilled water from temperature (obsolete) + /// + /// IPTS-68 temperature in [°C] + /// Density in [kg/m3] + public static double DistilledWaterDensityFromTempIPTS68(double t) + { + const double a0 = 999.842594; + const double a1 = 0.06793952; + const double a2 = -0.009095290; + const double a3 = 0.0001001685; + const double a4 = -0.000001120083; + const double a5 = 6.536332e-09; + + return ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0; + } + + /// + /// Calculate density by comparing calculated data and data from a certificate + /// + /// Density from a certificate in [kg/m3] + /// Temperature from a certificate in [°C] + /// Density correction in [kg/m3] + public static double DensityCorrection(double realDensity, double atTemperature) + { + /// Calculated data + double calculatedDensity = DistilledWaterDensityFromTemp(atTemperature); + + return realDensity - calculatedDensity; + } + + /// + /// Calculate corrected (real) water density from temperature + /// + /// Temperature in [°C] + /// Density in [kg/m3] + public static double WaterDensityFromTemp(double t) + { + return DistilledWaterDensityFromTemp(t) + DensityCorrection(RealDensity(), AtTemperature()); + } + + /// + /// Calculate corrected (real) water density from temperature + /// + /// Temperature in [°C] + /// Density in [kg/m3] + public static double WaterDensityFromTempPress(double temp, double pressure) + { + double x0 = 5.08821E-10; + double x1 = 1.2639418; + double x2 = 0.2660269; + double x3 = 0.3734838; + double x4 = 2.0205242; + double theta = temp / 100.0; + double B = x0 * (((x3 * theta + x2) * theta + x1) * theta + 1) / (1 + x4 * theta); + + return WaterDensityFromTemp(temp) * (1 + B * Units.ConvertTo(Unit.Pa, pressure)); + } + + + public static float AirDensityFromAmbientVales(float tempC, float pressureBar, float humiPct) + { + double pressurePa = 100000.0 * (double)pressureBar; /// [Pa] + double tempKelvin = 273.15 + (double)tempC; + double coef1 = 1.2811805 / 10000.0 * tempKelvin * tempKelvin + - 1.950987 / 100.0 * tempKelvin + + 34.04926034 + - 6.353631 * 1000.0 / tempKelvin; + double coef3 = humiPct / 100.0 * System.Math.Exp(coef1) / pressurePa; + double airDensityKgm3 = 0.00348353 * pressurePa * (1.0 - 0.378 * coef3) / tempKelvin; /// kg/m3 + return (float)airDensityKgm3; + } + + /// + /// Convert 'pulses' to 'volume', prevent division by zero + /// + public static double VolumeFromPulses(int pulses, double pulsesPerLiter) + { + if (pulsesPerLiter <= double.Epsilon) return 0; + return Convert.ToDouble(pulses) / pulsesPerLiter; + } + + /// + /// Calculate the error in % from 'measured' and 'true' volume, prevent division by zero + /// + public static double ErrorFromVolumes(double measuredVolume, double trueVolume) + { + if (-float.Epsilon <= trueVolume && trueVolume <= float.Epsilon) + { + if (-float.Epsilon <= measuredVolume && measuredVolume <= float.Epsilon) + { + log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0); + return -100.0; + } + + log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, 99.0); + return 99.0; + } + + double error = 100.0 * (measuredVolume - trueVolume) / trueVolume; + log.InfoFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, error); + return error; + } + + + /// + /// Calculates corrected value from a list of corrections by interpolation. + /// It is assumed that values in the list 'corrections' are sorted. + /// + /// Raw uncorrected value + /// Sorted (value, correction) pairs + /// Corrected value + public static double CorrectedValue(double rawValue, IList corrections) + { + return rawValue + GetCorrection(rawValue, corrections); + } + + /// + /// Get a correction from a list of corrections by interpolation. + /// It is assumed that values in the list 'corrections' are sorted. + /// + /// Raw uncorrected value + /// Sorted (value, correction) pairs + /// Corrected value + public static double GetCorrection(double rawValue, IList corrections) + { + if ((corrections == null) || (corrections.Count == 0)) return 0; /// No correction + + if (rawValue < corrections[0].Measurement) + { + /// rawValue is below the lowest value in the correction table + return corrections[0].Correction; + } + + int count = corrections.Count; + for (int i = 1; i < count; i++) + { + if (rawValue < corrections[i].Measurement) + { + double d1 = rawValue - corrections[i - 1].Measurement; + double d2 = corrections[i].Measurement - rawValue; + + if (d1 + d2 <= float.Epsilon) + { + /// Neigboring values in the corection table are close to each other -> calculate the average + return (corrections[i - 1].Correction + corrections[i].Correction) / 2.0; + } + else + { + /// Interpolate the correction from neigboring values in the corection table + return (corrections[i - 1].Correction * d2 + corrections[i].Correction * d1) / (d1 + d2); + } + } + } + + /// rawValue is above the highest value in the correction table + return corrections[count - 1].Correction; + } + + + /// + /// Converts a measurement error to a correction (used when preparing correction tables). + /// + /// Measured value (in arbitrary units) + /// Measurement error in % + /// Correction in the same units as the measured value + public static double CorrectionFromError(double measuredValue, double error) + { + double trueValue = measuredValue / (1 + error/100); + double correction = trueValue - measuredValue; + return correction; + } + + + /// + /// Calculates the heat coefficient for water + /// + /// Pressure [bar] + /// Inlet temperature [°C] + /// Outlet temperature [°C] + /// true = flow measured @inlet, false = flow measured @outlet + /// Heat coefficient for water [J/(m3 K)] + public static double HeatCoefficientWater(double pressure, double T_in, double T_out, bool flowMeasuredAtInlet) + { + if (T_in == T_out) return 0; + + const double R = 461.526; /// [J kg^-1 K^-1] + const double p_star_Pa = 16.53E6; /// [Pa] (=16.53 MPa) + const double T_star = 1386.0; /// [K] + + double T_in_K = Units.ConvertTo(Unit.K, T_in); + double T_out_K = Units.ConvertTo(Unit.K, T_out); + double tau_in = T_star / T_in_K; + double tau_out = T_star / T_out_K; + double pi = Units.ConvertTo(Unit.Pa, pressure) / p_star_Pa; + + double h_in = tau_in * GammaTau(pi, tau_in) * R * T_in_K; + double h_out = tau_out * GammaTau(pi, tau_out) * R * T_out_K; + + double ni = flowMeasuredAtInlet ? GammaPi(pi, tau_in) * R * T_in_K / p_star_Pa + : GammaPi(pi, tau_out) * R * T_out_K / p_star_Pa; + + return (h_in - h_out) / (ni * (T_in - T_out)); + } + + /// + /// gamma(pi) see also STN EN 1434-1 Annex A (A.4) + /// + /// pi = p / p* where p* = 16.53 MPa + /// tau = T* / T where T* = 1386 K + /// gamma(pi) + static double GammaPi(double pi, double tau) + { + double result = 0; + for (int i = 0; i < 34; i++) + { + result -= ni[i] * Ii[i] * Math.Pow(7.1 - pi, Ii[i] - 1) * Math.Pow(tau - 1.222, Ji[i]); + } + return result; + } + + /// + /// gamma(tau) see also STN EN 1434-1 Annex A (A.7) + /// + /// pi = p / p* where p* = 16.53 MPa + /// tau = T* / T where T* = 1386 K + /// gamma(tau) + static double GammaTau(double pi, double tau) + { + double result = 0; + for (int i = 0; i < 34; i++) + { + result += ni[i] * Math.Pow(7.1 - pi, Ii[i]) * Ji[i] * Math.Pow(tau - 1.222, Ji[i] - 1); + } + return result; + } + + /// + /// Conversion of measured resistance of a platinum thermometer to temperature according to ITS-90 + /// + /// Measured resistance in [°C] + /// Calibrated resistance in Ohm at 0.01°C + /// Calibrated ITS-90 coefficient a7 + /// Calibrated ITS-90 coefficient b7 + /// Calibrated ITS-90 coefficient c7 + /// Temperature in [°C] + public static double PlatinumResistanceTM_ITS90_R2T(double R, double R001C, double a7, double b7, double c7) + { + double w = R / R001C; /// ratio + double r1 = w - 1.0; + double dw = r1 * (a7 + r1 * (b7 + r1 * c7)); /// = a7*r1 + b7*r1^2 + c7*r1^3 + double wr = w - dw; + double x = (wr - 2.64) / 1.64; + + double sum = 0; + for (int i = Di.Length - 1; i >= 0; i--) + { + sum = sum * x + Di[i]; + } + + return sum; + } + + /// + /// Conversion of measured resistance of a platinum thermometer to temperature using Callendar-Van Dusen equations + /// + /// Measured resistance in [°C] + /// Calibrated resistance in Ohm at 0°C + /// Calibration coefficient a + /// Calibration coefficient b + /// Temperature in [°C] + public static double PlatinumResistanceTM_ITS27_R2T(double R, double R0, double A, double B) + { + if (R0 * R0 * A * A - 4 * R0 * B * (R0 - R) <= 0) return 0; /// Out of range + + return (-(R0 * A) + Math.Sqrt(R0 * R0 * A * A - 4 * R0 * B * (R0 - R))) / (2 * R0 * B); + } + } +} diff --git a/SchematicDrawing/Pictures/Tank-L-hot.png b/SchematicDrawing/Pictures/Tank-L-hot.png new file mode 100644 index 0000000000000000000000000000000000000000..fddf1604bc62c9c96d6568d8cda35b280bb2fdf8 GIT binary patch literal 842 zcmeAS@N?(olHy`uVBq!ia0vp^(||aSgAGU?J@5*|VJr@EcVbv~PUa<$!;&U>c zv7h@-A}f&3S>O>_%)r2R2!t6$HM|;t8rm~MB1$5BeXNr6bM+Ea@{>~aDsl^esu>t; z>?;Zqle1Gx6p~WYGxKcK-|yb9u8^5xs~&FZYv5bpoSKp8QB{;0T;&&%T$P<{nWAoQ z$IE3?VFffHH?<^Dp&~aYuh^=>Rtapd6_5=Q)>pE#DN0GR3UYCSssQqAl`=|73as?? z%gf94%8m8%i_-NCEiEne4UF`SjC6r2bc-wVN)jt{^NN+B2DqdaCl_TFlw{`TDS!-2 zOv*1Uu~jN9%}lXMOH4CON=Y%*O-eLQ(KR$oNz_eDF*ejqF*Z&yH#M{{N;6DSf?8ja znTD`GuNWE(zyQ$)$>>wgQzXDnC zkO2h~Jakj@fI(Ug3_G1EGq{0K;^XP!7*Y}U_R2y*CPx9+gONc8lup_!J&8=R5J{6g zYI|Kb{mttAY0qSK+{m>*AbPEQS)gMPQ` ZBWC_Nn{1`ISV`@iy0XB4uLSEsD@VqP(yoWNJL45ua8x7ey(0(N`6wRUPW#JP&EUC zjeSKyVsdtBi9%9pdS;%j`upAc)fF;RY}La}eGPmIoKrJ0J*tXQgRA^PlB=?lEmPF( z?RdFtDy)DefHbp6ERzWUqP!&L)tx`rwNr9EV zetCJhUb(Seeo?xG?WUP)qwZeFo6)Bu;%;^d;tf|AVqJOz+} ziAnjTCALbXrI{&KX^Cm3Nhv9&x=D$~DY}M+DT%s?DaMAnDaOVr=B9=gMrnpgN>J-d zGSd+D=M_VP0T>|qAQ^o_Jp+)FL2N7kqRdpFD?nD-8QOs5QN(QYK@LH3m>om}=vN>M z9x|X{f`@Ku9xzDDfnldJWd=7eN|-!d978JN-dm{sb+^*7 ac*iEOm~Fj!-cA-!GW2xyb6Mw<&;$UWMhZ0m literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/Tank-S-hot.png b/SchematicDrawing/Pictures/Tank-S-hot.png new file mode 100644 index 0000000000000000000000000000000000000000..4e052e67c0094d8de785ec57777cf0ee39944474 GIT binary patch literal 746 zcmeAS@N?(olHy`uVBq!ia0vp^DL@>+!3HGXb6$84q!^2X+?^QKos)S9a~60+7BevL9RguSQ4OyKpoaF$kcg59UmvUF{9L`nl>DSry^7odplSvN z8~cia#N_PM5{0DH^vpb4_4m8?t1D!t*s6z{`WpBaIHzW0dQ=sq23ProBv)l8Tc)Vn z+wpSQR9FE`$W1LtRH(?!$t$+1uvG#ZYz1V4g!Pr|Y>HCStb$zJpeleoTcwPWk^(Dz z{qpj1y>er{{GxPyLrY6beFGzXBO_g)3fd$_#E`xWDmqaSW-5dwX}GXtRR|>qY;l18$efPH7N4lN%m3&4r`Qu8@4d^n$+&B8EOtrRqesE8=?I6=;AZUKUy!+B b!VK;i3T(4ioqstOl;AvF{an^LB{Ts5e#G;; literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/Tank-XL-hot.png b/SchematicDrawing/Pictures/Tank-XL-hot.png new file mode 100644 index 0000000000000000000000000000000000000000..34cb418d34af0102da5d242edba2097c1d690c79 GIT binary patch literal 894 zcmeAS@N?(olHy`uVBq!ia0vp^CxEz#gAGVB&u*Urq!^2X+?^QKos)S9a~60+7BevL9RguSQ4OyKpoaF$kcg59UmvUF{9L`nl>DSry^7odplSvN z8~cia#N_PM5{0DH^vpb4_4m8?t1D!t*s6z{`WpBaIHzW0dQ=sq23ProBv)l8Tc)Vn z+wpSQR9FE`$W1LtRH(?!$t$+1uvG#ZYz1V4g!Pr|Y>HCStb$zJpeleoTcwPWk^(Dz z{qpj1y>er{{GxPyLrY6beFGzXBO_g)3fd$_#E`lr(s{IEGZjy}i1Tm&s9p<)CfQfukz_I}GltwjFoi zc-dmbxav&oZqw|vbBuMn-mpK&t`&Pyx%<8SkLc@<4U-)gaI!QxC~%Atq=mtnnU>#` eKcqP->|s!AXZs&`C$$We2|Qi>T-G@yGywpat^1My literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-L-closed.png b/SchematicDrawing/Pictures/ValveSw-L-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..052aed4ee3b09a376f636fa59e9685a3f06049d4 GIT binary patch literal 1116 zcmV-i1f%Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1Mx{jK~z{r&6zQ1 zT2T~+Pab5bi-DSgfz~Cobx0_fsh}=}n!!R`Tojr>4RkVvLc!3X#8PNM3!$JLQqT+? zG=qzUHV}mpXbdGorI1AmanL|qTr#xxKleQot43{&z8_vL?_Pa=@0@$iz4v77ityZ}Y<368{g25n7O-*rMFX{>K@bHjUR#wW4u@%RaZw#@FGX!zB*4kxa4?+5P4wd%k@coJ_#eVEQH zySq!tWRiSdkp{#yY=xf_+3pZ$4NNml4M0Sc>8hL;qY&m~;=Rn9tE;POuL_vSWZ1Q# zr(%f`kfRc!8}5cDkB*MGj{%YE02X-2eIu2YHNXTZAVt0dd6!jdD1sI5-;-8ER#CRL zws^qvfE!&1L5jJU&1Ol#wh8V<1nEUCVL=GFQNbU_5OZEHg2CWwOg#mrye)3@rW<1I zM`qzD9^^(~Py!P+yNyJxHyN(TR=dA`vud-cOSRe&w0ci6hH@Z+<-BjaLsm#vK@&P=l6F>xP z_KVoOcsz19gHDtqFe&u_8GbG2AebNqM5O@5o|kXr;HZQ+h<^|VHW3%_EX05)_Mi*_ zD@NaO|48)YnKV!&5>b23tt4Krm&rpf&Z20Tf??7b=~@)0G&KOBL?Xeic6o-Ic3=<~ z#%8mzC(o-15alpg`!kSJWS?O`0uBb5oU~9Xm1-$+HUUDIoHz?qjtw;DxLkK5YiMvg zJ3DRbg)M-P21#QkatKQfI=YeT{Ey^iu~<98L2UscK<@4BH3DbOIT)AY8P+*zJycrp z8y8htI|4%ZBB~CtSWLLw#BW}!)%di9wpW$QW!m1}<}Ey)F?r3(9$H^t?^;;zxrmNs z2PIsb_)&9)j7B3blZgDkYt?uGT&PRqUA literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-L-open-dry.png b/SchematicDrawing/Pictures/ValveSw-L-open-dry.png new file mode 100644 index 0000000000000000000000000000000000000000..86d355d00d217dff1d8ebed3fa6c4802039427c7 GIT binary patch literal 1196 zcmV;d1XKHoP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1VKqeK~z{r&6rV0 zTUQvz{|&f-P!SSe(w4LjqudU35X*EBUo13(<-xnb9*hrtvCutC-&%wYhr;kh3$~yI zeaQOYON7a027{3ZMOZ?Mg=B4gFe{W&V-Y(uhOoQy|IWQ>gNcn+6&gzu$gRJ2eYzXlTIn^fV?W zCXmnPWh`(8xO_?XKCcXw$Ug)Ad<>-S1BDGe77PY4Fff2fB%%jupeBKHb8{FP8bYB^ zfN>s(ehu`hMq#y(c?iUR0;XrRSi>+dK0c0)jt={cJ)pp9ZEbDMQd7hqU@2i%>@F;8 z>)>ts1+4KOV5w-!cSfU8YkPaU;{SG9)d+H(nWiaG8@&k(T;rOuAHFAy;^1}Q$2lF% z#l=N5H#gf)%c&@k;=|W^W>ytGXzgItT zgiA;z4>FmI>=tD(f^1V$Q<7OKAu48IJ(?NO*_}?O%d?o9a3By+>rPE=^6;{Czi@NE zaFJ6T!otFWjETV6*;xz@4$5gz&#A3M?uptvis}SXYq7PpRSRruYeW9k-+=d&{n|0} z{3*;YKF7?=3{EJe77ufLbpzjh{DJ+(@iP4LA3*vStgo-b!&?b)i#YPlr{|>SG<)Q_ zkZj%JS+_tHa@gRU4%OBc!BY-ZpEYD?NJw@ z1X7zv&S4c!H^ECY5rM4u$?$_s>D|EXR90LG)<$yO>hA7F=1~^#e`LRM%&e`TzrP=2 zV`Ew%Z?CLJ+;m~hX0zhuh(JE*?Ciw)%N%m)-9Agb$UW9q{%ACc$;n9>D+yd)UY0qh z?-IK!&*}=J#?mwQq*0>h)W@Zbnnn(lv)X5?H$&fRlWBBxw7hs{1f51B$1n^_C6JX$ zR4xsVqD|e><)&$xB`r=XJL*``)5xI>K|6vK|4~Crj{XeyyjUz|kG^5oSeHubMbg^)^G1tg2|) z##NEe^ru+I&OHbe#)$E|n5}eKS^HKKM@rkwUaYRJiu1rChPFt!8|c5HO`mt!B>X{% z-}KJ#tLh1Ni;`Ec&@GDKYB_0r5d9~c(zg) zXJkKa|Goq|a7sA+^Yimkd9ks;c^h6fY46hWV-oNX*lQ{)1N;wZjSqd@Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1UgAXK~z{r%~(N5 zTvrr54p@jFNE|oTGT8+AU1(tpQOmfokSWA~-#{0Ri*{k5o9Zq>=prZtH<};;6?8G} z!p#Vg#3>ZQj8F{BKu~aM;=*a0QsP)7jZ>(LpLg#2f8yXDGg_Vg1D8A8C*zs>-hJ=h zQ?<9ZXW@icTU$ds9>>bcidZSs)YKpp3Zbj33%$L)Xl!h>SIS4(1gop7F*7rR$;nA% zvssA+J_4?NroF#jLIq@h1Af^Al0O5vT^$PsgBThbLQhYR4wQki2reuvU}R(jxm*rL zGZ6U#=vPK!m<~3QvFfcJOf%f)x`!9|G36`?$?QKhK5r2TCh*{BDSk~*) z+y0-hCho#g*_Q8&L?YJy{=Vz~cC2IudCpAJl&pPN(IzC;~G`o1UJQ%2Ea4T7i`?vqx8VDwQg(VqU_5KtP>4wY7<}tJaf(m;1+8 zxYZ#nEiFk*2+q&XV|aL2UV}<*ts64W)!mU-FOWKmEiEmYU~6kDvVXk+>OZvq?0?1| zFJNB(9CLGXs8UQVKIXW28@Qn^B`@IqS3v49c6N5)V^<>hv`>34p!23UZnIC?rTQjq zUP1F!apa~6HkZ*=R1&qSS}(O|f)Z%FEY4H#HzAYB*aT}Yit`jy7W3-9DSGNWg%2)> z^DaRf-X-|&KjJjO-QUG|3V-jy@At#U(Gaq&m9{WALmxAKe3}8fyy2UlABN7 zVFtF>>{Sn7^Qkx?$cbN&dZfJ<@FXg#1ZN{@x4OH#kzU{M&WoaUb8v7F~S8y%KB9JqEf4oSlZ%9r%@>!JFrz-nbd@W)f)D@BfQB}kAYrz%ReF*W3~{7Kf4 zb58>jW5)PhtX8V5oPA4?BMR5daoF1066JwI44a>DH!%367Jc3)lkf+{f6_O@kIECg zEk;L2i>tK+$|C51+95^sSS)5ofZ!((-I_#s!Sih8Rj$5voV;z00000NkvXXu0mjf D0Qe@Y literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-L-vacuum.png b/SchematicDrawing/Pictures/ValveSw-L-vacuum.png new file mode 100644 index 0000000000000000000000000000000000000000..ffda1b1012dd4b459928ce088bf9fb3a80f866cd GIT binary patch literal 1211 zcmV;s1VsCZP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1W-vtK~z{r%~(-L zTUQwVOmR@5ASAxnmC%PVZW%fj3)&K~I9LYt!Mnm98XxxJU@y~$LP6NdP+IJR7Nk@Q z`jG9xhefDRvr(9dwD^#~uwd5Chops4YFcDlGN`4u=ljpSp{a?DR@3{z&x!xJT)+FD z^PltoU){#WhJ_tsWn~4iSPV-`OJbGK(9nQjFo@31PW1NnqPe-*o~a&H6RfYV$JEpm z#>dBz&1S{tKLUL5xgLF9aTSq$2>f*qNZbK(Pqi-)2w-4f06jfD+EE3nA~-uci=m+* zA zu&jS}Z~4ct#xB89(Uy0H!(l6*&zJq*j#Z2x_nB#$619;ZfPwG0r|ijh1fw{39{71y zM{{9e0ga7~_G~H25+u1$D5QQB5Q_rA6WYJmAi;0H2b!Avh{xk)Np2zNkZbZ55RX;A z&vuI?l|&)4GRYEx>Nncj+SKmIA(_~Jat=tcQ!N;?JdsFXb92+40X+67=&GtpiT8`e<7$s3Z(@CY9UfLCf|Gi11y0|Tfy;bA zjTau|U!v>UXX11NGA}Yf1X7;WslP3pID@X+IX&wVEFOJ^fVbX0sGC2M!By~mh;%w_ z6a3_&46ec(0@(_SK;~pGPrk%|9uLd&j$}%L;QZm z_PPk_x?=(3Vc&|of7o7kVDZ+X5F|H`+`}rI;&cmc>p=*z;}_UYSK!xEqDrtgl5(rN zyBn#ytM0i`GAros@5kuqs3yqjmHmjD3f9%tRb4EQASXIHI!?08WS&3Nr)^I;;@``RZP17uLajfL3V@FRRhcX1^2zLDY4N7vm|}F`DJUm>QtrbueK?l?hDWXTCQQHFqK85JkB+3Jx zd#j*oO>T(?${00*cPoi;MRub0?}(rSE(w=^Zf;IGFB%)1*TG_w@-8($CIK&j?Uu4U ZfLETt4sNjT1CIaz002ovPDHLkV1hqqL*D=Z literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-M-closed.png b/SchematicDrawing/Pictures/ValveSw-M-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..297d65bde0b0c2c94337da418064c32b2745d587 GIT binary patch literal 1033 zcmV+k1or!hP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1D;7lK~zXfy_aoF zTU8jxf4$*lU7}qe_=Sapj?S5oZI00S68ta}1$BaerZR9bM)9Lr1Oy}zgplYrbs=GX z0U<6dAu>c65C@Ffl%S0nhIK+n3_&1)`ZgxC)O${k)xm&e>+SE$?S1~e_n+t7=bZB# zlh5Z1vJ0!LtMv5rFgiMl)9GYpW=1KXX&Py1Y1r*{va_=(EG%SWV?(Liv!n6i;v!8= zO|-SOVX;`GK}t#r2?+_r#Kg$|`2BvCmX?^Co5Sn%vcA4fd3iaNm6gQD$IJiRj@ufW z&1PxX*w~19k00xSBjo4jD|LHBrrq7$c&}Z>yw^f=b2AQyL#el-scV=(ARveAT5CY;@Fh+!95o<0Sie)Jm^@4O|m7l~|Ui?J{@ZCv5|QF!Wv3f=`JFT)RG@T2Do z`Q100hmD1hlaoW@J`V$5!UIW4xCaiT!na?+^z~lK%F0wUMA*2ZqJpIbHy7H`hf4(` zfJmU{JoNUSr?azDMV0aN^fYJBe!}PHV4p?CBTAYTT0e%Gni|&D)?`c?*VWZgoFCw^ z<1%Iljv_c@TalG6(8OHr@9*QiN_lT6@1D^!Z*7&cMC<72AoEy|LkE>=AkRFh7xA7y z=<4c18ypvq_0CmLqlleg((Itj)xfSL%k)KLjJrcxr2F<-If(1$OdeF{fUKn>S@V zqAV=J={KROs*1$KL>UV&AT2E|to&}})pF4-s$c}Tq0ie_UIW{MSyWe7tLXoXMTa;r zFo4s&pRzaf2UeAE53Km$`Io@==P`L85C?;Q2^$NAkY&MdUlSxWS3cpMoVV0MdnVp?wYHEu4`FZm4@@QyiAT?F*Z@1x& z4sGJ4?d|RI(B^jQYu+Zryv)qZlzn+=X{kJ0?F{?_mccr$SHtfw00000NkvXXu0mjf DE<5*) literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-M-open-dry.png b/SchematicDrawing/Pictures/ValveSw-M-open-dry.png new file mode 100644 index 0000000000000000000000000000000000000000..532644076cb3fb463d7e7c83ff24e9d2302f7b94 GIT binary patch literal 1047 zcmV+y1nB#TP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1FT6zK~zXfy_a1` z3C9>avM~_MizaL&XZ~IObSZ+M+Y)mPBm2kv;@v5N=5M;*%DL_!5YL$ks!a zvQ#ThAE2xFl4d#Vu98AxI!Ynwnl`&7?u;L||Gjf})?IaTcO8Fl_`^AW?ztc5o^!6r z=kp2v2d~#lXJ;pagM)ZH9<9AiR8$n%+1V5p7E)ebPEt~mw(N~re|JSXDJm)=C&$h& zS3jcsjEBoVz|Fs4eI+Q@=b`_b041&;>FfEB6DOWf&Sz$3^eB5ESA4gutgMK#vNCbx zh)Gnvjrj97gt)Ok`Smj5^-@G+q(xL$R|~)2zhitUJGOdxc^RkEN&F*TIzELbAJ>Na zWOxKB-h#wO9rX0{V6j-VCCD9HEuH4)=kt`!%TV8gJC)?-z||o*7VDv)pn%QIO>GGh zTJhG_7Fk(Y7yKaZ)Vrbf8kZYnA&v^l)Aw6xIF z)P%(d^AA!|Qjl^O$Sb?Lx{6t*#pL8)5Yq7pA}%gYEG{mpvZ(epEiKJx1kO?ZCj9MF zlRHpmX5pRpP{koyb_NEa)+Z(=hP=Eyjz*90-B%DBtLzWWwIw+9BAm3nMq68()^5vO zvKQ*@?Zx-6osu$GyrvBg!L%1%I1R_GFVWuKuC+n#2xFPEWka?up2wC8mj<-q0l07x zY|qM-o~5g+E7atLkXwDX$R@nLzFrvTA)KcWgO?Cn*LM$^?Gjif`_b literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-M-open.png b/SchematicDrawing/Pictures/ValveSw-M-open.png new file mode 100644 index 0000000000000000000000000000000000000000..58c10ba4766907d7adc76d80b48af8322cbe183d GIT binary patch literal 1018 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1CL2WK~zXfy_a1` zlTjGQ|C>5oACLrAL>DegS{G`=sVO2!lRhLu6U{EV$nrwNk}kZ_K=4kGZdAO9G(`*T zgU}fkw6r$dB#9F9qYGE2IMlGUSLW%Q^BzB@Q_Hsf;Njh#=iPhWbM`#X`5(p1%nZR6 zjEsz+si_GjlL;1!MR-?GsZ@xIi-W;nKyGd>!o$NwWMh=#>J_uujP&$$BqZqY@k15z zGA-zP14z@rf5vpZh6i;tpy2WU#`zmCT%aF_{0PX*x{B)RYACE$ zE79p`CZyzuupeMehCQsHN20DI`(1VZbh()UpyOV0FeilXkQBy z3ogE4DA^_s`=Ia!fNw*HjEsbmDF+O`6W#zY+7G>64<*}sVKWM^pK&h$)=s`nDu#xJ zNYpVcNOCs)$AiQje&W|Gc7J+}iHQk$KV}-qVt#>(8R7;%ala8LEV_-dvNCyFwApN2 zBfahNzNPuXsEi_EVPS--9KJ2`a?)rtC@d`E8fj*hzno7Qrh@bOO>iL)5)#6F%hE@! zRwE@Pg=?het+I0P1rw9NsdGSdYz}H`YlU}J=VDrjsX@nVEY4>EKj;ts7dBHiXynlh zG&E5CvkH%v$vO%XWYS_XVw0&*ePFg){QP{BmXPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1F%U%K~zXf<(FMZ zq-7Mxe>3X%v6#4!UHAbmL&gg0IHs1a+TsVgt+cVLMdL-V8H5{B-gu=2BHjc-AhNZP zr7YDB&Q_qS>rI;Fu)De`BsPvvNV=uXZVm2?qfhVq&a<<+ezYI+cGC|I1Lq9Sc|Okj zod09+cszoC!R>a_*Vo7B=qOI7Q+n@VGMUKD&84iY44chHQc{wP?2S?W?uweEva*u= zd@Da*{{Y)5Cs)6PJAc6XYS3;i!tf!tbN5jR>V8J~`dwaX|DySo4DP zyh6@KCoX&mr%u04XJ;pdsi`TEot=%5%Ng+@dkRg4Ex5wl4dNHckVsdh_bn8!AS{mcy533Ii%lu+ zKRw#y!pi&ty!8%RbBI=zfkH_7#Ky)_TwKh7=n2050^;Jd_+xYPcR2PU9I?DgcXzk+ zZn;2IEi^bdi05xB)wQsEQwAObmm6L<4u{Mq=;`T^-XPn`*kCYdf^1zBVJU#iBQo#^ zT(}69LUpCDV7J>tA}@rx)%Tk!!dqKgg>oLE{1{^NGGg=A?nSfJ{40pBK1V#Che%9J z6kT0iJI20iI|Th!RGr<{)~3CiQj?WuN)6WKmGmv+KXUjW(JqbB_qM($;`~eVzFp9QcX>brmgk|{sG?r VglS7?sp9|u002ovPDHLkV1jow_x=C? literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-S-closed.png b/SchematicDrawing/Pictures/ValveSw-S-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..7278a215a96b2d1a51e0ae96ef1b947d5bb271fd GIT binary patch literal 667 zcmV;M0%ZM(P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0x(HLK~y+Tt(8wm zlW`cwKfUyBYiwwjY7|~7FH)CXJQPXZWD_)+mt988ycj`ss6#Aa*bX6T!J5P%M%ap# zscTshbRTq+9lCW;=StYf&39VA_vg=lA(5M(!wb*%`{Q|^=l$_K@1f=8<=^ZL z$&kzCFbqR#7K?@E=4QIPyYc(|Tl!9RC3H9(jE;^H4u@!JI!#+!8&0QFxf>LVMP_Gb zSzMeK=LTi+oopqvTCMneK3dLB;yM8zzj$!F-SW`iWV2b?FHA9)1A_o#V`G#`CFyDA z!>r7A^$NbuNd`k;vr6xu*pI-|VQ4uMCm0MWRV9o>BDl|`@%Kn=U)<^koj9pfO2%5b zTqgB8%)Q$(u8E;R7#Y5cuIp&ASd1Ije~Cc3HDI?xPuBv8L;@|Ho}jB!Idx!uF0*ZI z-S~>rq0~A!brKflvuMYUttqK~EQgmiZuy|lL^kcmPZb>iMzsOWSUXR-qLeyVDnP?g zH`?X)4yN8KwGLjq0&mGCv%_c48wdmfXpN1HT)cFXCo$#LzymQU zfooz32;?mf3=EK*XywBvsqKrzOPKrSrN3VcwLm7UR4PnQX9y3qG7{y#+BbKrSy^(T zgYog??)A0F%*O_WT71jc7C~ zUN9pz^P(7jG5vy-l@(kr7aos?-rinpHk;J9fj?={#>=!VoC*K{002ovPDHLkV1m_C BDV+cS literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-S-open-dry.png b/SchematicDrawing/Pictures/ValveSw-S-open-dry.png new file mode 100644 index 0000000000000000000000000000000000000000..d54ad96da6c17691d491b43742da2c44e7e67e8c GIT binary patch literal 667 zcmV;M0%ZM(P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0x(HLK~y+TrIb&I zQc)DfzxVWs2r`t3xo8uNn`TkYP=dG!fmY$ zOfAG{Q{b-6Yzh~`5Q-&c4LPHY>61CV_q-#c(-7(p4%~ac_df2u=iI}Q1jeXTD#&Cq z`0)NM1l1>;Ju_JU-cW%TF2m*WAQ%intJMyKTw0K2F@pzp2{XR9D&0!1;<%!*Hqm2Zp-#lqF9=%=A+6u^h)1_==#84hM95#CQ z`s9!Qi|3CeQ@4A#Q(iu{v~}Eaf5h?)(0@d(*$ z7P(vwd%w0JsP}Mq2=w~rU^>639M9+TDKBFb;4dORg)&=*!nyze002ovPDHLkV1h%- BE6M-> literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-S-open.png b/SchematicDrawing/Pictures/ValveSw-S-open.png new file mode 100644 index 0000000000000000000000000000000000000000..0f0dbd3711480f0690a3dccbe97f422046f9de98 GIT binary patch literal 661 zcmV;G0&4wPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0xC&FK~y+Tt(8w` z({L2WzeyG>g3L`J6Y(+`9vm|1It!%-Q79Bcr3hZ?p_d9?1fe!ED5Fvs6D_k8DuTs7 z7t!gVC|>mBVIV5j|J$QJv@z9nf|Z7o7mKky)VFTXGEm*0Eu$H=lw=s@!! zolfJ$^QYjs9EOJ){?)G>SbhRtuMeS62sWFo5%?2buxYBQQaBtY=M+y5?ts*9AX;y? z^%cHeCg0$oJ0A zGH`ir5c&K^Fp?zE>^m74*>8p|viuf_lMXP4><-GEdkFB`%!ozgRd}9U1e+_>`xn#M zDPZx#3RvveWqSIjR3Fd;|1&J7teKDfGtB)0J2Av-=dPHpKF|)uF}ep#EEc2a%TK`G z17^e`ORsR_%rP*L9g4dF@!lnvbnHR8>UxqQhQmGUw$~3fQx5U}=fYW^o ze!stQ%8^I}Z{B-x@4gZ5iK|)*R}nPC44Pv{pEy3BNYaJwbFkAkil9&s6buI2W@4)j z%jGf_79K;`m%x#ugSegszIUmp&tHJqYkS-iRnqke(8**n$Y!%B{df(2 vpoF^Cp_STh2qSi5dx1az)oRuJx(ToaIG}za*dOXH00000NkvXXu0mjfkeDQQ literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-S-vacuum.png b/SchematicDrawing/Pictures/ValveSw-S-vacuum.png new file mode 100644 index 0000000000000000000000000000000000000000..5dbc7edee5b56cffa3925c6c01351cb73559d243 GIT binary patch literal 661 zcmV;G0&4wPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0xC&FK~y+TrIb%- zl3^Ujzwc|Wh?h|&CfK3aytG5PQGy5y0znc%f;#BIi-DIQ5FG;>h7d-{5+isOt#B68kf9!)ET4{d(WWXR_B;pnl*7&-42}&zI-#PiQuqgaMQs3WWmR zuDph%dyivBd-<>5bP%Pp@Ou4-L?SR43_al>s^NaL+ii-)V&pt8(TgXb_ID6%Yh$|( zdRzd_oHJ57ou+QL+n=w7#?a+*(ozQ0ZT@XE7`vOG#d(nLvX?DHW2h$FZYRBYdHCf2 z#nXq1sn6G6si!0!@m)gH^`ggqu1*pTCG-gpyQ%?*zI-*sZ@%}GnYoA zR;wWzjY4QN8ZuT(~%a2L<5ACKnIz`3rF8KH&0L*fz7-ELyD=SCwj`y7IP$VzG!)sf4Yc vYmkm?VQ&xE?H-5a#0=YBFc@S%LksW+i4}oWgTq;H00000NkvXXu0mjfJiIW$ literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-XL-closed.png b/SchematicDrawing/Pictures/ValveSw-XL-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..bf00b396ec80d76552344acba8b798dec1a57624 GIT binary patch literal 1183 zcmV;Q1YrA#P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1T;xRK~!i%?V3GM z6G0TmmsE6yj!HrWjWf_OqfU~F8MO$tMMx($kV>rxm3B!QEfWg0ObW-AWYig`$fyM! zU`0pl=wg2F_T`Hs7ZQ`)IsRr~@Af|bZ{K@++1;6Xz1}c?f#c(2Q>|7_rBX3xXJ_)~ z#>&cy35UZb7K@o^G-_5?SM8C}7)i*%!GYP|-#6uQ+16ZVc6L_EtE($1dqGqpkucla z+h%cb(bnFcp@fu5C9}7;*Jbtj`FRtGM9k9ClDs_oZd_bknC3Ih`T4nA&%Qz{?e6Xl z)k?P#g8QUWsV)KQ>+5EDd08ww42U{9Ix>fchqlHMR45e8+}xb4@g`);zBC#Qv$L~f z;_4CzH*Au6I)tC^L1&EWoQ%x+W2IKf!iH_bTw;B1pfcn2>rHwsY^_;BKh zBLXp#f@dCobDoJIy~MZ*=@hZ~v~8V9LoBKRy~JD-!igIj8!ZuqclN-Pz<`}%$eM0k z6Qb#r3#TnYK}_jmJ7(OnS(gwxI!@FJ{RD2Nh9#R_US2vomX;7)iW7jW(b-q{1rmU! z=3WRoHBx?n+H9)%xX%S~L_yk@E-3I&@ z;up?-Ipx0VfY^QUQ6L?^c|VqQbY)7C2BPr_z^^CYcNKww1m(qnM_8u(=Ytl zNs^3mHa2?4e_KL;SfO*_g7iyU=@T$)>X}m#2E7xeT|#DNW<)9TdbpUM;swKEU<{qj zW^HYoE+N1qq@I{*3PI4cNo_grfq^kJ2JhvX5Fm)u2f2y*s~E0w6Q3-XBZ^+$aQ8jK)m-(PUCH&q4$-L7Mdv0eyu4Vz`lJGsMt3<0AgJ-THhw zF&ye80z8EPH$sf|GgwUNTuU-6CnqO%%lV?!pk}(mEwJ6V^`aW)?wDZVAqo#>J<7tu zg1CaN2)YSY3i0wRtfADEL)?d@BJ^j23Q&e#=7b>TCK%T5Tx0|NRtNQ-3%D&`v2=8| x6`+i?UQ6j*bf$yi{lN0N@QiYh80e2Ne*p1J`on+Kqq+b9002ovPDHLkV1mt_7t;U$ literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-XL-open-dry.png b/SchematicDrawing/Pictures/ValveSw-XL-open-dry.png new file mode 100644 index 0000000000000000000000000000000000000000..653a59064b4e21512dc751c7826f1dfa8d3f3554 GIT binary patch literal 1212 zcmV;t1Vj6YP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1W`#uK~!i%?V3Go zQc)DgPZ?cojf;ayM`Ja#F2;{QM~y=n)uD9M1=w@~CUrs)K?hg7zkA<>$2X-deXsGCyj*#{zVN^2PC^eGOxJ zdRiiph=jvoJN!30*=HgVvC??>HUART0l^f-i z4^K)2;I`F|W&-hs#l=PK;{E7p5w{2g@Uo+1<$-axL6+$ff@;(=3%F83WhE~Vy=Sr; zYYt*M6F{45kz%m~BCvv2L;#*avLSPld^%|p!aBi&Iy)(AcnRV&|H_Ok#%zn+G+m1o z+xlMl?ct}`abcZFtBbU3*EMKbglz}lQeG7Sb|GeeM^b8nMO1)e72jRTDh<9rm$nG8 z;YY9v84PrckkYuBN~QEoKd`Z}A!}=EdOt?+2Z(-so;ZEhdBh(qEG+1e^AH3$*=era zGNYe3H>U@T5wJ(o)YUV3^c5Gb=>cOjh4>LW`Diff$cYJVYYzcp+z2^;Q4fBlCFB_3 ze<4m-{I`f__-l${$IK$%KIy@)uvZLlp!Yjy2v7}&%+FJL^b?uSzx0TP0HuA+cOSZ! z6B1}>T139QGozo_{i@w+etup86dVW^o5uVC2P@!UrQw8_&1QR^iT!Y?vxq*kYaz8- zt)WcR^Fc3PDlFQI50oG26hY*sdg70FuiB4RG2LBbXs+zEy9gYbEEJ5r3I#g)CL}3> z+|pLWwpDl(Q_?@^j?{jkh)ppYD7Mec%$N^~w!IcTJF)DlSJ>Q?Iyj~Y9%j7+rc-MHxzLg3?K#0#-<)MEJZi?>Y+j`fa-?nRdnV3DL0=@!Ea zCk^i87SXH0W9cabI>p!*P6`5h{`zPlpsx_HVt5fRL=5TgFv0S)rpZn=CWeWCfkMEF z;ddgum?q2Y+`+Fky!-hJ^KM2UJ5it>CIWhPb^Ae$m5iZ_-U`+ke!{`;PsUwyuyj#P z3KL`Fkj0Lm?o6?R*pmacUa?1I zEFl(Lu2?KKOZ&Y*5HoFOyAzTLaljS{Hy)RL32}ocs^T;#v6S0dZb%#~xQv|a#+m(Y aME(H~I`EOeI@H<#0000 literal 0 HcmV?d00001 diff --git a/SchematicDrawing/Pictures/ValveSw-XL-open.png b/SchematicDrawing/Pictures/ValveSw-XL-open.png new file mode 100644 index 0000000000000000000000000000000000000000..937f352be60b8566e7872a459bf04c8d2e741060 GIT binary patch literal 1243 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 Hu0mjfXBR&; literal 0 HcmV?d00001 diff --git a/SchematicDrawing/SchematicDrawing.csproj b/SchematicDrawing/SchematicDrawing.csproj index 09adf733c..c438c5178 100644 --- a/SchematicDrawing/SchematicDrawing.csproj +++ b/SchematicDrawing/SchematicDrawing.csproj @@ -98,6 +98,16 @@ + + + + + + + + + + @@ -191,6 +201,12 @@ + + + + + + diff --git a/SharedComponents/LiveLogCache.cs b/SharedComponents/LiveLogCache.cs new file mode 100644 index 000000000..656974152 --- /dev/null +++ b/SharedComponents/LiveLogCache.cs @@ -0,0 +1,234 @@ +using System.IO.MemoryMappedFiles; +using System.Text; + +namespace SharedComponents +{ + public class LiveLogCache + { + /*// Staticka instancia pre singleton + private static readonly LiveLogCache _instance = new LiveLogCache(); + + // Uzamykaci objekt pre bezpecny pristup z viacerych vlakien + private static readonly object _lock = new object(); + + // Zoznam na ukladanie logov + private readonly List _logs = new List(); + + // Udalost pre notifikaciu pri zmene logov + public event Action LogAdded; + + // Sukromny konstruktor (singleton pattern) + private LiveLogCache() { } + + // Metoda na ziskanie poctu logov + public int GetCount() + { + return _logs.Count; + } + + // Staticka metoda na ziskanie instancie + public static LiveLogCache Instance + { + get + { + lock (_lock) + { + return _instance; + } + } + } + + // Verejna vlastnost na ziskanie logov + public IReadOnlyList Logs + { + get + { + lock (_lock) + { + return _logs.AsReadOnly(); + } + } + } + + // Metoda na pridanie logu + public void AddLog(string log) + { + // Ziskanie aktualneho casu v pozadovanom formate + string timeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:"); + + // Vytvorenie noveho logu s casovou peciatkou na zaciatku + string logWithTimeStamp = $"{timeStamp} {log}"; + + // Pridanie logu do zoznamu + lock (_lock) + { + _logs.Add(logWithTimeStamp); + } + + // Spustenie udalosti pre notifikaciu + LogAdded?.Invoke(logWithTimeStamp); + } + + // Metoda na vycistenie logov + public void ClearLogs() + { + lock (_lock) + { + _logs.Clear(); + } + + // Volitelne: Spusti udalost, ak by sme chceli notifikovat aj o vymazani logov + LogAdded?.Invoke("Logs were cleared."); + } + + // Ziskanie vsetkych logov + public List GetAllLogs() + { + return new List(_logs); // Vratime kopiu logov + } + + // Ziskanie logov medzi urcitou poziciou (s upravenym indexovanim) + public List GetLogs(int startIndex, int count) + { + // Zabezpeci, ze indexy nebudu mimo rozsahu + return _logs.Skip(startIndex).Take(count).ToList(); + }*/ + + // Zlepseny kod, ktory umoznuje pracu s MemoryMappedFile, namiesto len priestoru vo virtualnej pamati, navyse je tento subor velkostne obmedzeny na 1MB + + // Staticka instancia pre singleton + private static readonly LiveLogCache _instance = new LiveLogCache(true); + + // Uzamykaci objekt pre bezpecny pristup z viacerych vlakien + private static readonly object _lock = new object(); + + // Zoznam na ukladanie logov + private readonly List _logs = new List(); + + // Udalost pre notifikaciu pri zmene logov + public event Action LogAdded; + + // Memory-mapped file + private MemoryMappedFile _mmf; + private MemoryMappedViewAccessor _accessor; + private const int MaxLogSize = 1024 * 1024; // 1MB + + // Sukromny konstruktor (singleton pattern) + private LiveLogCache(bool itsLogsCreator) + { + if (itsLogsCreator == true) + { + _mmf = MemoryMappedFile.CreateOrOpen("LiveLogCacheMMF", MaxLogSize); + } + else + { + _mmf = MemoryMappedFile.OpenExisting("LiveLogCacheMMF"); + } + + _accessor = _mmf.CreateViewAccessor(); + } + + // Metoda na ziskanie poctu logov + public int GetCount() + { + return _logs.Count; + } + + // Staticka metoda na ziskanie instancie + public static LiveLogCache Instance + { + get + { + lock (_lock) + { + return _instance; + } + } + } + + // Verejna vlastnost na ziskanie logov + public IReadOnlyList Logs + { + get + { + lock (_lock) + { + return _logs.AsReadOnly(); + } + } + } + + // Metoda na pridanie logu + public void AddLog(string log) + { + // Ziskanie aktualneho casu v pozadovanom formate + string timeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:"); + + // Vytvorenie noveho logu s casovou peciatkou na zaciatku + string logWithTimeStamp = $"{timeStamp} {log}"; + + // Pridanie logu do zoznamu + lock (_lock) + { + _logs.Add(logWithTimeStamp); + WriteLogToMemoryMappedFile(logWithTimeStamp); + } + + // Spustenie udalosti pre notifikaciu + LogAdded?.Invoke(logWithTimeStamp); + } + + // Metoda na vycistenie logov + public void ClearLogs() + { + lock (_lock) + { + _logs.Clear(); + ClearMemoryMappedFile(); + } + + // Volitelne: Spusti udalost, ak by sme chceli notifikovat aj o vymazani logov + LogAdded?.Invoke("Logs were cleared."); + } + + // Ziskanie vsetkych logov + public List GetAllLogs() + { + return new List(_logs); // Vratime kopiu logov + } + + // Ziskanie logov medzi urcitou poziciou (s upravenym indexovanim) + public List GetLogs(int startIndex, int count) + { + // Zabezpeci, ze indexy nebudu mimo rozsahu + return _logs.Skip(startIndex).Take(count).ToList(); + } + + // Metoda na naplnenie ListView + /*public void PopulateListView(ListView listView) + { + listView.Items.Clear(); + lock (_lock) + { + foreach (var log in _logs) + { + listView.Items.Add(new ListView Item(log)); + } + } + }*/ + + // Write log to memory-mapped file + private void WriteLogToMemoryMappedFile(string log) + { + byte[] logBytes = Encoding.UTF8.GetBytes(log + Environment.NewLine); + _accessor.WriteArray(0, logBytes, 0, logBytes.Length); + } + + // Clear memory-mapped file + private void ClearMemoryMappedFile() + { + byte[] emptyBytes = new byte[MaxLogSize]; + _accessor.WriteArray(0, emptyBytes, 0, emptyBytes.Length); + } + } +} diff --git a/SharedComponents/SharedComponents.csproj b/SharedComponents/SharedComponents.csproj new file mode 100644 index 000000000..06e92ea43 --- /dev/null +++ b/SharedComponents/SharedComponents.csproj @@ -0,0 +1,10 @@ + + + + net472 + 10.0 + enable + enable + + + diff --git a/SharedComponents/obj/Debug/net472/SharedComponents.GeneratedMSBuildEditorConfig.editorconfig b/SharedComponents/obj/Debug/net472/SharedComponents.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 000000000..a02128ff9 --- /dev/null +++ b/SharedComponents/obj/Debug/net472/SharedComponents.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,5 @@ +is_global = true +build_property.RootNamespace = SharedComponents +build_property.ProjectDir = C:\Users\micha\git\tbf\SharedComponents\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/SharedComponents/obj/Debug/net472/SharedComponents.GlobalUsings.g.cs b/SharedComponents/obj/Debug/net472/SharedComponents.GlobalUsings.g.cs new file mode 100644 index 000000000..c11666bec --- /dev/null +++ b/SharedComponents/obj/Debug/net472/SharedComponents.GlobalUsings.g.cs @@ -0,0 +1,7 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/SharedComponents/obj/SharedComponents.csproj.nuget.g.props b/SharedComponents/obj/SharedComponents.csproj.nuget.g.props new file mode 100644 index 000000000..c2b287e0d --- /dev/null +++ b/SharedComponents/obj/SharedComponents.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\micha\.nuget\packages\ + PackageReference + 6.14.0 + + + + + \ No newline at end of file diff --git a/SharedComponents/obj/SharedComponents.csproj.nuget.g.targets b/SharedComponents/obj/SharedComponents.csproj.nuget.g.targets new file mode 100644 index 000000000..babc2c6b6 --- /dev/null +++ b/SharedComponents/obj/SharedComponents.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/TBF/Tools/ByteFormatter.cs b/TBF/Tools/ByteFormatter.cs new file mode 100644 index 000000000..0e1d3ff99 --- /dev/null +++ b/TBF/Tools/ByteFormatter.cs @@ -0,0 +1,62 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Globalization; + +namespace TBF.Tools +{ + public class ByteFormatter : IFormatProvider, ICustomFormatter + { + public ByteFormatter() + { + } + + public object GetFormat(Type formatType) + { + if (formatType == typeof(ICustomFormatter)) + return this; + else + return null; + } + + public string Format(string fmt, object arg, IFormatProvider formatProvider) + { + if (arg.GetType() != typeof(byte)) + { + try + { + return HandleOtherFormats(fmt, arg); + } + catch (FormatException e) + { + throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e); + } + } + + /// + /// Convert one byte to string + /// + byte b = (byte)arg; + if ((32 <= b) && (b <= 127)) return "'" + ((char)b).ToString() + "'"; + if ((char)b == '\r') return "'\\r'"; + if ((char)b == '\n') return "'\\n'"; + if ((char)b == '\t') return "'\\t'"; + if (b == 17) return "XON"; + if (b == 19) return "XOFF"; + if (b == 26) return "Ctrl-Z"; + return b.ToString(); + } + + + private string HandleOtherFormats(string format, object arg) + { + if (arg is IFormattable) + return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture); + else if (arg != null) + return arg.ToString(); + else + return String.Empty; + } + } +} diff --git a/TBF/Tools/IniUtil.cs b/TBF/Tools/IniUtil.cs new file mode 100644 index 000000000..a190050a9 --- /dev/null +++ b/TBF/Tools/IniUtil.cs @@ -0,0 +1,108 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Text; +using System.Runtime.InteropServices; +using System.Collections.Specialized; + +namespace TBF.Tools +{ + /// + /// The class use the WinApi GetPrivateProfileSectionNames, + /// GetPrivateProfileSection, GetPrivateProfileString, WritePrivateProfileString + /// and present easy methods to work from a NET point of view. + /// Usage: + /// IniUtil ini = new IniUtil(@"C:\program files (x86)\myapp\myapp.ini"); + /// string country = ini.GetValue("Carrier","Country","NoCountry"); + /// + public class IniUtil + { + [DllImport("kernel32.dll")] + private static extern int GetPrivateProfileSectionNames(byte[] lpszReturnBuffer, int nSize, string lpFileName); + [DllImport("kernel32.dll")] + private static extern int GetPrivateProfileSection(string lpAppName, byte[] lpReturnedString, int nSize, string lpFileName); + [DllImport("kernel32.dll")] + private static extern int GetPrivateProfileString(string lpApplicationName, string lpKeyName, string lpDefault, byte[] lpReturnedString, int nSize, string lpFileName); + [DllImport("kernel32.dll")] + private static extern bool WritePrivateProfileString(string lpApplicationName, string lpKeyName, string lpString, string lpFileName); + + private const int VALUE_BUFFER = 511; + private const int SECTION_BUFFER = (1024 * 16); + private string m_sIniFile; + + /// + /// .ctor with INI file name + /// + /// Fullpath to the INI file + public IniUtil(string fileName) + { + m_sIniFile = fileName; + } + + /// + /// Set the value for a specific key in a section + /// + /// Section containing the key to write to + /// Key to insert/update + /// Value for the key + /// True if OK + public bool SetValue(string section, string key, string keyvalue) + { + return WritePrivateProfileString(section, key, keyvalue, m_sIniFile); + } + + /// + /// Gets the value of the specidied key in the specified section, + /// If the key doesn't exists returns the default value + /// + /// Section containing the key to read from + /// Required key + /// Value to return in case the key is missing + /// string value of the key or missing value + public string GetValue(string section, string key, string ifMissing) + { + byte[] by = new byte[VALUE_BUFFER]; + int n = GetPrivateProfileString(section, key, ifMissing, by, VALUE_BUFFER, m_sIniFile); + string s = Encoding.ASCII.GetString(by); + return s.Substring(0, n); + } + + /// + /// Returns the NameValueCollection for every key in the section + /// + /// Section name + /// NameValueCollection with nake=Key and value=value + public NameValueCollection GetSectionKeysvalues(string section) + { + NameValueCollection n = new NameValueCollection(); + if(section.Length > 0) + { + byte[] by = new byte[SECTION_BUFFER]; + int x = GetPrivateProfileSection(section, by, SECTION_BUFFER, m_sIniFile); + if(x > 0) x--; + string keysvalues = Encoding.ASCII.GetString(by, 0, x); + string[] temp = keysvalues.Split('\0'); + foreach(string s in temp) + { + string[] t = s.Split('='); + n.Add(t[0], t[1]); + } + } + return n; + } + + /// + /// Get the names of all sections in .INI + /// + /// string array with all the key names + public string[] GetSectionNames() + { + byte[] by = new byte[SECTION_BUFFER]; + int x = GetPrivateProfileSectionNames(by, SECTION_BUFFER, m_sIniFile); + if(x > 0) x--; + string keys = Encoding.ASCII.GetString(by, 0, x); + return keys.Split('\0'); + } + } +} diff --git a/TBF/Tools/LogChecker.cs b/TBF/Tools/LogChecker.cs new file mode 100644 index 000000000..fa76f96e9 --- /dev/null +++ b/TBF/Tools/LogChecker.cs @@ -0,0 +1,50 @@ +using log4net.Appender; +using log4net.Core; +using log4net.Repository.Hierarchy; +using log4net; +using System; +using System.Collections.Generic; + +namespace TBF.Tools +{ + public class LogChecker : IDisposable + { + readonly Logger _logger; + readonly Level _previousLevel; + readonly MemoryAppender _appender = new MemoryAppender(); + + public LogChecker(string logName, Level levelToCheck) + { + _logger = (Logger)LogManager.GetLogger(logName).Logger; + _logger.AddAppender(_appender); + _previousLevel = _logger.Level; + _logger.Level = levelToCheck; + } + + public List Messages + { + get + { + return new List(_appender.GetEvents()) + .ConvertAll(x => x.RenderedMessage); + } + } + + public void Dispose() + { + _logger.Level = _previousLevel; + _logger.RemoveAppender(_appender); + } + } +} + +// Example of use +// +// using (Tools.LogChecker logChecker = new Tools.LogChecker("RfidData", log4net.Core.Level.Debug)) +// { +// Execute query using NHibernate +// .... +// +// MessageBox.Show(String.Join(Environment.NewLine,logChecker.Messages)); +// } +// diff --git a/TBF/Tools/XmlTools.cs b/TBF/Tools/XmlTools.cs new file mode 100644 index 000000000..5deff02a9 --- /dev/null +++ b/TBF/Tools/XmlTools.cs @@ -0,0 +1,30 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.IO; +using System.Xml.Serialization; + +namespace TBF.Tools +{ + public static class XmlTools + { + public static string ToXmlString(this T input) + { + using (var writer = new StringWriter()) + { + input.ToXml(writer); + return writer.ToString(); + } + } + + public static void ToXml(this T objectToSerialize, Stream stream) + { + new XmlSerializer(typeof(T)).Serialize(stream, objectToSerialize); + } + + public static void ToXml(this T objectToSerialize, StringWriter writer) + { + new XmlSerializer(typeof(T)).Serialize(writer, objectToSerialize); + } + } +} diff --git a/TBF/UI/Shared/SuggestComboBox.cs b/TBF/UI/Shared/SuggestComboBox.cs new file mode 100644 index 000000000..0ece9c518 --- /dev/null +++ b/TBF/UI/Shared/SuggestComboBox.cs @@ -0,0 +1,240 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Linq.Expressions; +using System.Windows.Forms; + +namespace TBF.UI.Shared +{ + public class SuggestComboBox : ComboBox + { + #region fields and properties + + private readonly ListBox _suggLb = new ListBox { Visible = false, TabStop = false }; + private readonly BindingList _suggBindingList = new BindingList(); + private Expression>> _propertySelector; + private Func> _propertySelectorCompiled; + private Expression> _filterRule; + private Func _filterRuleCompiled; + private Expression> _suggestListOrderRule; + private Func _suggestListOrderRuleCompiled; + + public int SuggestBoxHeight + { + get { return _suggLb.Height; } + set { if (value > 0) _suggLb.Height = value; } + } + + /// + /// If the item-type of the ComboBox is not string, + /// you can set here which property should be used + /// + public Expression>> PropertySelector + { + get { return _propertySelector; } + set + { + if (value == null) return; + _propertySelector = value; + _propertySelectorCompiled = value.Compile(); + } + } + + /// + /// Lambda-Expression to determine the suggested items + /// (as Expression here because simple lamda (func) is not serializable) + /// default: case-insensitive contains search + /// 1st string: list item + /// 2nd string: typed text + /// + public Expression> FilterRule + { + get { return _filterRule; } + set + { + if (value == null) return; + _filterRule = value; + _filterRuleCompiled = item => value.Compile()(item, Text); + } + } + + /// + /// Lambda-Expression to order the suggested items + /// (as Expression here because simple lamda (func) is not serializable) + /// default: alphabetic ordering + /// + public Expression> SuggestListOrderRule + { + get { return _suggestListOrderRule; } + set + { + if (value == null) return; + _suggestListOrderRule = value; + _suggestListOrderRuleCompiled = value.Compile(); + } + } + + #endregion + + /// + /// ctor + /// + public SuggestComboBox() + { + // set the standard rules: + _filterRuleCompiled = s => s.ToLower().Contains(Text.Trim().ToLower()); + _suggestListOrderRuleCompiled = s => s; + _propertySelectorCompiled = collection => collection.Cast(); + + _suggLb.DataSource = _suggBindingList; + _suggLb.Click += SuggLbOnClick; + + ParentChanged += OnParentChanged; + } + + /// + /// the magic happens here ;-) + /// + /// + protected override void OnTextChanged(EventArgs e) + { + base.OnTextChanged(e); + + if (!Focused) return; + + _suggBindingList.Clear(); + _suggBindingList.RaiseListChangedEvents = false; + _propertySelectorCompiled(Items) + .Where(_filterRuleCompiled) + .OrderBy(_suggestListOrderRuleCompiled) + .ToList() + .ForEach(_suggBindingList.Add); + _suggBindingList.RaiseListChangedEvents = true; + _suggBindingList.ResetBindings(); + + _suggLb.Visible = _suggBindingList.Any(); + + if (_suggBindingList.Count == 1 && + _suggBindingList.Single().Length == Text.Trim().Length) + { + Text = _suggBindingList.Single(); + Select(0, Text.Length); + _suggLb.Visible = false; + } + } + + #region size and position of suggest box + + /// + /// suggest-ListBox is added to parent control + /// (in ctor parent isn't already assigned) + /// + /// + /// + private void OnParentChanged(object sender, EventArgs e) + { + Parent.Controls.Add(_suggLb); + Parent.Controls.SetChildIndex(_suggLb, 0); + _suggLb.Top = Top + Height - 3; + _suggLb.Left = Left + 3; + _suggLb.Width = Width - 20; + _suggLb.Font = new Font("Segoe UI", 9); + } + + protected override void OnLocationChanged(EventArgs e) + { + base.OnLocationChanged(e); + _suggLb.Top = Top + Height + 0; + _suggLb.Left = Left + 3; + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + _suggLb.Width = Width; + } + + #endregion + + #region visibility of suggest box + + protected override void OnLostFocus(EventArgs e) + { + // _suggLb can only getting focused by clicking (because TabStop is off) + // --> click-eventhandler 'SuggLbOnClick' is called + if (!_suggLb.Focused) + HideSuggBox(); + base.OnLostFocus(e); + } + + private void SuggLbOnClick(object sender, EventArgs eventArgs) + { + Text = _suggLb.Text; + Focus(); + } + + private void HideSuggBox() + { + _suggLb.Visible = false; + } + + protected override void OnDropDown(EventArgs e) + { + HideSuggBox(); + base.OnDropDown(e); + } + + #endregion + + #region keystroke events + + /// + /// if the suggest-ListBox is visible some keystrokes + /// should behave in a custom way + /// + /// + protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e) + { + if (!_suggLb.Visible) + { + base.OnPreviewKeyDown(e); + return; + } + + switch (e.KeyCode) + { + case Keys.Down: + if (_suggLb.SelectedIndex < _suggBindingList.Count - 1) + _suggLb.SelectedIndex++; + return; + case Keys.Up: + if (_suggLb.SelectedIndex > 0) + _suggLb.SelectedIndex--; + return; + case Keys.Enter: + Text = _suggLb.Text; + Select(0, Text.Length); + _suggLb.Visible = false; + return; + case Keys.Escape: + HideSuggBox(); + return; + } + + base.OnPreviewKeyDown(e); + } + + private static readonly Keys[] KeysToHandle = new[] { Keys.Down, Keys.Up, Keys.Enter, Keys.Escape }; + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) + { + // the keysstrokes of our interest should not be processed be base class: + if (_suggLb.Visible && KeysToHandle.Contains(keyData)) + return true; + return base.ProcessCmdKey(ref msg, keyData); + } + + #endregion + } +} From 2aeaf42325eb0590f8d195d191db59d39de06dd1 Mon Sep 17 00:00:00 2001 From: Michal Buzik Date: Sun, 7 Sep 2025 22:18:35 +0200 Subject: [PATCH 3/4] Patch applied - Add initial implementation for RegValveLowRegulTimeSaturation module This commit introduces the `RegValveLowRegulTimeSaturation` module, including core components such as `RegValve`, `ChangeRegValvePositionOp`, `Factory`, `Handlers`, and configuration classes (`RegValveCfg`, `RegValveCfgCtrl`). It integrates `log4net` for logging and adheres to the established modular design architecture. --- .../ChangeRegValvePositionOp.cs | 70 ++++ .../RegValveLowRegulTimeSaturation/Factory.cs | 25 ++ .../Handlers.cs | 36 ++ .../RegValve.cs | 243 +++++++++++ .../RegValveCfg.cs | 108 +++++ .../RegValveCfgCtrl.cs | 394 ++++++++++++++++++ .../SetFlowOp.cs | 340 +++++++++++++++ .../SetRegValvePositionOp.cs | 155 +++++++ 8 files changed, 1371 insertions(+) create mode 100644 TBF/Rig/Uni/RegValveLowRegulTimeSaturation/ChangeRegValvePositionOp.cs create mode 100644 TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Factory.cs create mode 100644 TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Handlers.cs create mode 100644 TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValve.cs create mode 100644 TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfg.cs create mode 100644 TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.cs create mode 100644 TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetFlowOp.cs create mode 100644 TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetRegValvePositionOp.cs diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/ChangeRegValvePositionOp.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/ChangeRegValvePositionOp.cs new file mode 100644 index 000000000..0a398fcde --- /dev/null +++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/ChangeRegValvePositionOp.cs @@ -0,0 +1,70 @@ +/// +/// Copyright (c) 2021-2023 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.Rig.ControlBoard.Uni; +using TBF.Rig.GenericDevices; + +namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation +{ + public class ChangeRegValvePositionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ChangeRegValvePositionOp)); + public override string ToString() + { + return string.Format("ChangeRegValvePositionOp({0},{1}s)", regV.Name, timePulseSec.ToString("F2")); + } + + /// Set by the constructor + readonly UniCB uniCB; + readonly RegValve regV; + readonly int regulValveNr; + readonly double timePulseSec; + + /// + /// Set required water flow. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Lower limit of the position to be achieved + /// Upper limit of the position to be achieved + /// Timeout in sec. for setting the flow + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public ChangeRegValvePositionOp(UniCB uniCB, RegValve regV, double timePulseSec) + { + this.uniCB = uniCB; + if (this.uniCB == null) throw new ArgumentNullException("ctrlBoard"); + + this.regV = regV as RegValve; + if (this.regV == null) throw new ArgumentNullException("regValve is null or not Uni"); + regulValveNr = this.regV.Idx1; + + this.timePulseSec = timePulseSec; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + uniCB.RegVlvIncrMove(false, regulValveNr, timePulseSec, this.regV.RegulationMinStep); + } + + /// Run this operation + /// + /// Event.SetFlowDone + /// + public Event Run() + { + return Event.PositionReached; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Factory.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Factory.cs new file mode 100644 index 000000000..52d05f2f8 --- /dev/null +++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Factory.cs @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2021 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.Rig.Generic; + +namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return GetType().Namespace.Substring(12); } } + public override string ToString() { return ClassName; } + + public IComponent DummyComponent() { return new RegValve(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new RegValve(cfg, components); } + + public IComponentCfg DefaultConfig() { return new RegValveCfg("VR", this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RegValveCfg.Serializer, component, this); + } + } +} diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Handlers.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Handlers.cs new file mode 100644 index 000000000..1aa203913 --- /dev/null +++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Handlers.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2021 Sensus Slovensko a.s. +/// +using System; +using log4net; + +namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation +{ + static class Handlers + { + static readonly ILog log = LogManager.GetLogger(typeof(Handlers)); + + static Handlers() + { + } + + /// + /// Called from the state machine when a procedure is selected and UI needs to be updated. + /// + public static void OnAdcChanged(object sender, CmdResponseArgs data) + { + if (AdcChangedHandler == null) + return; + + try + { + AdcChangedHandler(sender, data); + } + catch (Exception e) + { + log.Error("AdcChangedHandler(...) failed", e); + } + } + public static event EventHandler AdcChangedHandler; + } +} diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValve.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValve.cs new file mode 100644 index 000000000..d43935b5e --- /dev/null +++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValve.cs @@ -0,0 +1,243 @@ +/// +/// Copyright (c) 2021 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using SchematicDrawing; +using TBF.Rig.ControlBoard.Uni; +using TBF.Boxes; +using SharedComponents; + +namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation +{ + public class RegValve : ComponentBase, Generic.IDevice, GenericDevices.IRegValve, IDrawingItCmpntWithSetpoint + { + private static readonly ILog log = LogManager.GetLogger(typeof(RegValve)); + public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); } + + public readonly RegValveCfg regValveCfg; + public IDrawingItem DrawingItem { get { return regValveCfg as IDrawingItem; } } + + IDictionary dict; + public IDictionary Dict { get { return dict; } } + + public readonly UniCB UniCB; + + public ValveCategory Category { get { return regValveCfg.Category; } } + public int Idx1 { get { return regValveCfg.Idx1; } } /// 1 .. 8 + public int DacValueClosed { get { return regValveCfg.AdcValueClosed; } } /// 0 .. 1023 + public int DacValueOpen { get { return regValveCfg.AdcValueOpen; } } /// 0 .. 1023 + public int StableTime { get { return regValveCfg.StableTime; } } /// 0=200ms, step=50ms, max. 1500ms (max.26) + public int FlowStableSec { get { return regValveCfg.FlowStableSec; } } /// 0 .. 60 sec + public bool StoredPositionReuse { get { return regValveCfg.StoredPositionReuse; } } + public int RegulationMinStep { get { return regValveCfg.RegulationMinStep; } } /// low regulation saturation time ...0=0, 1=50, 2=100, 3=150, 4=200, 5=250, 6=300 [ms] + /// + public bool IsCoax { get { return false; } } + + public RegValveState RegValveState + { + get + { + switch (UniCB.Data.RegVStatus[Idx1 - 1]) + { + default: + case 0: return ControlBoard.Uni.RegValveState.Idle; + case 2: return ControlBoard.Uni.RegValveState.PwOrFreqRegul; + case 3: return ControlBoard.Uni.RegValveState.DacValueRegul; + } + } + } + + /// Position 0.0 .. 100.0 in % + public double Position + { + get + { + int denominator = DacValueOpen - DacValueClosed; + if (denominator == 0) denominator = 1; + return 100.0 * Convert.ToDouble(Math.Max(0, Math.Min(denominator, (int)UniCB.AnalogInput(adcChannel) - DacValueClosed))) + / Convert.ToDouble(denominator); + } + } + /// + public double SetpointVal + { + get { return Position; } + set { TargetRegValvePosition = value; } + } + /// + public void IncreaseSetpoint() + { + IncrementalMovement(true, 0.5); + } + /// + public void DecreaseSetpoint() + { + IncrementalMovement(true, -0.5); + } + + int adcChannel; + public double TargetRegValvePosition; + + + /// + /// Incremental movement of the regulation valve. + /// + /// Time in seconds, positive value opens the reg. valve + public void IncrementalMovement(bool isFromUI, double time) + { + UniCB.RegVlvIncrMove(isFromUI, Idx1, time, RegulationMinStep); + } + + /// + /// Move a regulation valve to specfied position + /// + /// Reg. valve ID + /// Reg. valve position (0 .. 1.0) + public void MoveToPosition(bool isFromUI, double posPctLo, double posPctHi = -1) + { + int adcDiff = Math.Abs(regValveCfg.AdcValueOpen - regValveCfg.AdcValueClosed); + int adcLower = Math.Min(regValveCfg.AdcValueOpen, regValveCfg.AdcValueClosed); + + int targetAdcValLo = Math.Max(0, Convert.ToInt32(Math.Round((posPctLo * adcDiff / 100.0) + adcLower))); + int targetAdcValHi = (posPctHi < 0) ? -1 : Math.Min(1023, Convert.ToInt32(Math.Round((posPctHi * adcDiff / 100.0) + adcLower))); + + UniCB.RegVlvMoveToPos(isFromUI, Idx1, targetAdcValLo, targetAdcValHi, RegulationMinStep); + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + RegValveCfg tmpcfg = args.Cfg as RegValveCfg; + if (tmpcfg != null && tmpcfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + regValveCfg.StableTimeMs = tmpcfg.StableTimeMs; + regValveCfg.FlowStableSec = tmpcfg.FlowStableSec; + regValveCfg.RegulationMinStep = tmpcfg.RegulationMinStep; + } + else if (args.Command == CfgChangeCmd.RVOpenStep) + { + IncrementalMovement(true, 0.5); /// true = command is comming from the UI + } + else if (args.Command == CfgChangeCmd.RVCloseStep) + { + IncrementalMovement(true, -0.5); /// true = command is comming from the UI + } + else if (args.Command == CfgChangeCmd.GetAdc1 || args.Command == CfgChangeCmd.GetAdc2) + { + short adcValue = UniCB.AnalogInput(adcChannel); + RegValveCfgCtrl.OnCmdResponse(this, new CmdResponseArgs(args.Command, Idx1, adcValue)); + } + } + }; + } + + #endregion Configuration Change Handling + + + public RegValve() { } + + public RegValve(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + regValveCfg = cfg as RegValveCfg; + + this.UniCB = TbfComponents.FindComponent(cfg.ParentName, components) as UniCB; + if (this.UniCB == null) throw new Exception(string.Format("Cannot find {0} (a parent of {1})", cfg.ParentName, Name)); + } + + public override void Initialize() + { + adcChannel = regValveCfg.Idx1 - 1; + this.dict = new Dictionary(); + + TBF.UiBridge.Bridge.SetpointChangeHandler += delegate(object sndr, TBF.UiBridge.SetpointChangeArgs args) + { + if (args.Name == Name) + { + if (args.Increase) IncreaseSetpoint(); else DecreaseSetpoint(); + } + }; + + log.FatalFormat("{0} initialized: {1}", Name, this); + } + + /// + /// IDevice interface implementation + /// + public void RunDeviceBefore() + { + Int16 adcValue = UniCB.AnalogInput(adcChannel); + Handlers.OnAdcChanged(this, new CmdResponseArgs(CfgChangeCmd.GetAdc, Idx1, adcValue)); + } + public void RunDeviceAfter() { } + public void StopDevice() { } + public void StopDevice2() { } + + + /// + /// Operation to set the water flow within tolerances + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Flowmeter component + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// PID coefficient (float) + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + public IOperation SetFlowOp(GenericDevices.IFlowMeter flowMeter, double requiredFlowLo, double requiredFlowHi, DoubleBox measuredFlow, int timeout, int delay) + { + return new SetFlowOp(UniCB, this, flowMeter, requiredFlowLo, requiredFlowHi, measuredFlow, timeout, delay); + } + + /// + /// Operation to set the water flow within tolerances. Leave the measurement running. + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Flowmeter component + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + public IOperation SetFlowAndMeasureOp(GenericDevices.IFlowMeter flowMeter, double requiredFlowLo, double requiredFlowHi, + DoubleBox measuredFlow, int timeout, float filterConstant) + { + return new SetFlowOp(UniCB, this, flowMeter, requiredFlowLo, requiredFlowHi, measuredFlow, timeout, 0, true); + } + + /// + /// Operation to set the regulation valve to a required position + /// Events: Event.None + /// + /// Lower limit of the required valve position in [%] + /// Higher limit of the required valve position in [%] + /// SetPositionOp instance + public IOperation SetRegValvePositionOp(double pctLo, double pctHi, int timeoutMs) + { + return new SetRegValvePositionOp(UniCB, this, pctLo, pctHi, timeoutMs); + } + + public IOperation ChangeRegValvePositionOp(double timePulseSec) + { + return new ChangeRegValvePositionOp(UniCB, this, timePulseSec); + } + } +} diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfg.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfg.cs new file mode 100644 index 000000000..9b24c1b3f --- /dev/null +++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfg.cs @@ -0,0 +1,108 @@ +/// +/// Copyright (c) 2021 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using SchematicDrawing; +using TBF.Rig.Generic; + +namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation +{ + public class RegValveCfg : ComponentCfgBase, IChildComponentCfg, IDrawingItemWithSetpoint + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RegValveCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl(IList cmpntEntities) + { + return new RegValveCfgCtrl(); + } + + /// + /// Serialized parameters + /// + public int Idx1; /// 1..8 + public ValveCategory Category; /// Feeding, Output or All + public int AdcValueClosed; /// 0..1023 + public int AdcValueOpen; /// 0..1023 + public int StableTimeMs; /// 200..1500 ms, step is 50 ms + public int FlowStableSec; /// 0..60 sec + public bool StoredPositionReuse; /// true = store and re-use previous regulation valve positions + public int RegulationMinStep { get; set; } /// low regulation saturation time ...0=0, 1=50, 2=100, 3=150, 4=200, 5=250, 6=300 [ms] + public string SetpFormat { get; set; } + public Common.Unit SetpUnit { get; set; } + + /// Schematic drawing info + public Shape Shape { get; set; } + public int X { get; set; } + public int Y { get; set; } + public Sz Sz { get; set; } + public Orient Orient { get; set; } + public bool Flip { get; set; } + public int LblX { get; set; } + public int LblY { get; set; } + public Orient LblOrient { get; set; } + public int SetpX { get; set; } + public int SetpY { get; set; } + public Orient SetpOrient { get; set; } + + [XmlIgnore] + public IList GNodes { get; set; } + + /// + /// Stabilization time when setting the flow: 0=200ms, step 50ms, max. 1.5 sec. + /// + public int StableTime { get { return (StableTimeMs - 200) / 50; } } + + /// Private parameterless constructor invoked by all other (public) constructors + RegValveCfg() + { + GNodes = new List(); + } + + public RegValveCfg(string name, IComponentFactory factory) + : this() + { + Shape = Shape.RegV; + Sz = Sz.M; + SetpFormat = "{0:F0} %"; + SetpUnit = Common.Unit.Pct; + + Name = name; + Factory = factory; + ParentName = "UniCB"; + Category = ValveCategory.Output; + Idx1 = 1; + AdcValueClosed = 100; + AdcValueOpen = 500; + StableTimeMs = 500; + FlowStableSec = 5; + StoredPositionReuse = false; + RegulationMinStep = 0; + + LblX = 38; + SetpX = 38; + SetpY = 22; + } + + + + public string ToString(int i) + { + return string.Format("Name={0} ({1}), Idx1={2}, Cat.={3}, ADC-Closed={4}, ADC-Open={5}, StabTm={6}ms, FlowStable={7}s, PosReuse={8}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Idx1, + Category, + AdcValueClosed, + AdcValueOpen, + StableTimeMs, + FlowStableSec, + StoredPositionReuse, + RegulationMinStep); + } + } +} diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.cs new file mode 100644 index 000000000..98e37457a --- /dev/null +++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.cs @@ -0,0 +1,394 @@ +/// +/// Copyright (c) 2021 Sensus Slovensko a.s. +/// +using System; +using System.Linq; +using System.Windows.Forms; +using log4net; +using Common; +using Config.Entities; +using TBF.Rig.Generic; +using TBF.UI.Bench.Components; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation +{ + public partial class RegValveCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(RegValveCfgCtrl)); + + ComponentParametersDlg parent; + + public bool ShowMore { get { return true; } } + + RegValveCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RegValveCfg; + Redraw(); + } + } + + public RegValveCfgCtrl() + { + InitializeComponent(); + } + + private void RegulationValveCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.CmpntEntities != null) + { + foreach (var c in parent.CmpntEntities.Where(x => x.ClassName == "ControlBoard.Uni")) + { + parentNameComboBox.Items.Add(c.Name); + } + } + + categoryComboBox.Items.Add(ValveCategory.Feeding.ToString()); + categoryComboBox.Items.Add(ValveCategory.Output.ToString()); + + if (config != null) + { + adc1 = config.AdcValueClosed; + pct1 = 0; + adc2 = config.AdcValueOpen; + pct2 = 100; + } + + for (Common.Unit units = 0; units < global::Common.Unit.Count; units++) + { + if (global::Common.Units.IsQuantity(units, Quantity.Error)) + { + unitsComboBox.Items.Add(units.ToString()); + } + } + + regulMinStepsComboBox.Items.Add("0"); + regulMinStepsComboBox.Items.Add("50"); + regulMinStepsComboBox.Items.Add("100"); + regulMinStepsComboBox.Items.Add("150"); + regulMinStepsComboBox.Items.Add("200"); + regulMinStepsComboBox.Items.Add("250"); + regulMinStepsComboBox.Items.Add("300"); + + Redraw(); + StartResponseHandler(); + } + + public void Closing() + { + StopResponseHandler(); + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + categoryComboBox.Text = config.Category.ToString(); + positionTextBox.Text = config.Idx1.ToString(); + adcClosedTextBox.Text = config.AdcValueClosed.ToString(); + adcOpenTextBox.Text = config.AdcValueOpen.ToString(); + stableTimeTextBox.Text = config.StableTimeMs.ToString(); + flowStableSecTextBox.Text = config.FlowStableSec.ToString(); + storedPosReuseCheckBox.Checked = config.StoredPositionReuse; + formatTextBox.Text = config.SetpFormat; + unitsComboBox.Text = config.SetpUnit.ToString(); + regulMinStepsComboBox.Text = (config.RegulationMinStep * 50).ToString(); + + adcTextBox1.Text = adc1.ToString(); + adcTextBox2.Text = adc2.ToString(); + pctTextBox1.Text = pct1.ToString(); + pctTextBox2.Text = pct2.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + categoryComboBox.Enabled = true; + positionTextBox.Enabled = true; + adcClosedTextBox.Enabled = true; + adcOpenTextBox.Enabled = true; + stableTimeTextBox.Enabled = true; + flowStableSecTextBox.Enabled = true; + storedPosReuseCheckBox.Enabled = true; + formatTextBox.Enabled = true; + unitsComboBox.Enabled = true; + regulMinStepsComboBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + + if (!categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString()) && + !categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Category'"; + } + + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 1 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Position' should be between 1 and 8"; + } + + if (!int.TryParse(adcClosedTextBox.Text, out dummy) || dummy < 0 || dummy > 1023) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'ADC when Closed' should be between 0 and 1023"; + } + + if (!int.TryParse(adcOpenTextBox.Text, out dummy) || dummy < 0 || dummy > 1023) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'ADC when Open' should be between 0 and 1023"; + } + + if (!int.TryParse(stableTimeTextBox.Text, out dummy) || dummy < 200 || dummy > 1500 || (dummy % 50) != 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Stable time' should be between 200 and 1500 ms in 50 ms steps"; + } + + if (!int.TryParse(flowStableSecTextBox.Text, out dummy) || dummy < 0 || dummy > 60) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Flow stable' should be between 0 and 60 sec"; + } + + if (!unitsComboBox.Items.Contains(unitsComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Units'"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + /// + if (!config.Name.Equals(nameTextBox.Text)) + { + config.Name = nameTextBox.Text; + flags |= CfgUpdateFlags.RestartRqrd; + } + + string parentname = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + if (!config.ParentName.Equals(parentname)) + { + config.ParentName = parentname; + flags |= CfgUpdateFlags.RestartRqrd; + } + + ValveCategory newCategory; + if (categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString())) newCategory = ValveCategory.Feeding; + else if (categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) newCategory = ValveCategory.Output; + else newCategory = ValveCategory.None; + if (newCategory != config.Category) + { + config.Category = newCategory; + flags |= CfgUpdateFlags.RestartRqrd; + } + + int tmp = int.Parse(positionTextBox.Text); + if (config.Idx1 != tmp) + { + config.Idx1 = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(adcClosedTextBox.Text); + if (config.AdcValueClosed != tmp) + { + config.AdcValueClosed = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(adcOpenTextBox.Text); + if (config.AdcValueOpen != tmp) + { + config.AdcValueOpen = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(stableTimeTextBox.Text); + if (config.StableTimeMs != tmp) + { + config.StableTimeMs = tmp; + flags |= CfgUpdateFlags.AnyChange; + } + + tmp = int.Parse(flowStableSecTextBox.Text); + if (config.FlowStableSec != tmp) + { + config.FlowStableSec = tmp; + flags |= CfgUpdateFlags.AnyChange; + } + + tmp = regulMinStepsComboBox.SelectedIndex; + if (config.RegulationMinStep != tmp) + { + config.RegulationMinStep = tmp; + flags |= CfgUpdateFlags.AnyChange; + } + + bool btmp = storedPosReuseCheckBox.Checked; + if (config.StoredPositionReuse != btmp) + { + config.StoredPositionReuse = btmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + if ((flags & CfgUpdateFlags.AnyChange) != 0) + { + RegValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + config.SetpFormat = formatTextBox.Text; + config.SetpUnit = global::Common.Unit.None; + for (Common.Unit units = 0; units < global::Common.Unit.Count; units++) + { + if (unitsComboBox.Text == units.ToString()) + { + config.SetpUnit = units; + break; + } + } + + return flags; + } + + int adc1; + int pct1; + + int adc2; + int pct2; + + private void openButton_Click(object sender, EventArgs e) + { + RegValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.RVOpenStep, config)); + } + + private void closeButton_Click(object sender, EventArgs e) + { + RegValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.RVCloseStep, config)); + } + + // + private void getButton1_Click(object sender, EventArgs e) + { + RegValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.GetAdc1, config)); + } + + private void getButton2_Click(object sender, EventArgs e) + { + RegValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.GetAdc2, config)); + } + + private void setButton_Click(object sender, EventArgs e) + { + int tmpPct1; + int tmpPct2; + if ((int.TryParse(pctTextBox1.Text, out tmpPct1) && (tmpPct1 >= 0) && (tmpPct1 <= 100)) && + (int.TryParse(pctTextBox2.Text, out tmpPct2) && (tmpPct2 >= 0) && (tmpPct2 <= 100))) + { + pct1 = tmpPct1; + pct2 = tmpPct2; + UpdateValveOpenClose(); + } + } + + void UpdateValveOpenClose() + { + if ((adc1 == adc2) || (pct1 == pct2)) return; + + double factor = (float)(adc2 - adc1) / (float)(pct2 - pct1); + int adcClosed = (int)((float)(0 - pct1) * factor + (float)adc1 + 0.5f); + int adcOpen = (int)((float)(100 - pct1) * factor + (float)adc1 + 0.5f); + + if ((adcClosed >= 0) && (adcOpen >= 0)) + { + adcClosedTextBox.Text = adcClosed.ToString(); + adcOpenTextBox.Text = adcOpen.ToString(); + } + } + + private void regulMinStepsComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + if (regulMinStepsComboBox.SelectedItem != null) + { + //config.RegulationMinStep = regulMinStepsComboBox.SelectedIndex; + } + } + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() + { + Handlers.AdcChangedHandler += delegate(object sndr, CmdResponseArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnAdcChanged), sndr, args); } + else OnAdcChanged(sndr, args); + }; + + CmdResponseHandler += delegate(object sender, CmdResponseArgs args) + { + if (args.Command == CfgChangeCmd.GetAdc1) + { + adc1 = args.Response; + adcTextBox1.Text = adc1.ToString(); + } + else if (args.Command == CfgChangeCmd.GetAdc2) + { + adc2 = args.Response; + adcTextBox2.Text = adc2.ToString(); + } + }; + } + + public void StopResponseHandler() + { + CmdResponseHandler = null; + } + + void OnAdcChanged(object sender, CmdResponseArgs data) + { + if (data.Command == CfgChangeCmd.GetAdc && data.Id == config.Idx1) + { + adcTextBox.Text = data.Response.ToString(); + } + } + + #endregion Configuration Change Handling + } +} diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetFlowOp.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetFlowOp.cs new file mode 100644 index 000000000..8eb540601 --- /dev/null +++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetFlowOp.cs @@ -0,0 +1,340 @@ +/// +/// Copyright (c) 2021 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using Common; +using log4net; +using Config.Entities; +using TBF.Rig.ControlBoard.Uni; +using TBF.Rig.GenericDevices; +using TBF.Boxes; + +namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation +{ + public class SetFlowOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetFlowOp)); + public override string ToString() + { + return string.Format("SetFlowOp({0}, Qfrom={1}, Qto={2})", regV.Name, shrinkedTgtFlowLo, shrinkedTgtFlowHi); + } + + public const double RqrdFlowRangeRatio = 0.5; + + /// + /// Set by the constructor + /// + readonly UniCB uniCB; + readonly RegValve regV; + readonly IFlowMeter flowMeter; + readonly double shrinkedTgtFlowLo; + readonly double shrinkedTgtFlowHi; + readonly double targetFlowAve; + readonly int timeout; + readonly int delay; + readonly bool leaveFlowControlRunning; + + readonly double maximalFlow; + + /// + /// Internal state of this operation + /// + enum OpState + { + Idle = 0, + ValveMoveToPosition1, /// Wait 1 takt + ValveMoveToPosition2, /// This is actual move to position + ValveMoveToPosition3, /// Wait 1 takt + SettingPosition, + Wait4FlowMsrmntAndSendRVMove, /// Wait until the flow measurement starts, then issue reg. valve move command + SettingFlow, /// Measure the flow and verify whether it is within limits sufficiently long time + FlowReached, + SendCommandAgain, + } + OpState opState; + + double currentReqFlowLo; + double currentReqFlowHi; + double targetPositionLo; + double targetPositionHi; + + int setFlowTime; + int expireTime; + DoubleBox msrdFlow; + int isFlowOkDuration; + + + /// + /// Set required water flow. Conditionally leave the measurement running. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Flowmeter component + /// Lower limit of the flow to be achieved in [m3/h] + /// Upper limit of the flow to be achieved in [m3/h] + /// DoubleBox for measured flow + /// Timeout for the flow setting in [s] + /// Flow setting starts after this delay in [s] + /// true = Leave the measurement running after op. stop + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox msrdFlow, + int timeout, int delay, bool leaveFlowControlRunning) + { + this.uniCB = uniCB; + if (this.uniCB == null) throw new ArgumentNullException("Control board is null or not Uni"); + + this.regV = regValve as RegValve; + if (this.regV == null) throw new ArgumentNullException(string.Format("{0} is not Uni.RegValve", regValve.Name)); + + this.flowMeter = flowMeter; + if (this.flowMeter == null) throw new ArgumentNullException("flowMeter"); + + maximalFlow = flowMeter.NominalFlow * 1.25; + + double rqrdFlowLoBeforeCorr = qFrom - MeasurementCorrection.GetCorrection(qFrom, flowMeter.Corrections); + double rqrdFlowHiBeforeCorr = qTo - MeasurementCorrection.GetCorrection(qTo, flowMeter.Corrections); + targetFlowAve = (rqrdFlowLoBeforeCorr + rqrdFlowHiBeforeCorr) / 2; + shrinkedTgtFlowLo = (RqrdFlowRangeRatio * rqrdFlowLoBeforeCorr) + + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the lower limit 15% of the range up + shrinkedTgtFlowHi = (RqrdFlowRangeRatio * rqrdFlowHiBeforeCorr) + + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the upper limit 15% of the range down + + this.msrdFlow = msrdFlow; + this.timeout = timeout; + this.delay = delay; + this.leaveFlowControlRunning = leaveFlowControlRunning; + + log.Debug(this.ToString()); + } + + /// + /// Set required water flow - Do not leave the measurement running. + /// Events: FlowSet + /// + public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox flowbox, int timeout, int delay) + : this(uniCB, regValve, flowMeter, qFrom, qTo, flowbox, timeout, delay, false) + { + } + + /// + /// Set required water flow - Do not leave the measurement running. + /// Events: FlowSet + /// + public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox flowbox, int timeout) + : this(uniCB, regValve, flowMeter, qFrom, qTo, flowbox, timeout, 0, false) + { + } + + /// + /// Set required water flow - No timeout. + /// Events: FlowSet + /// + public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox flowbox) + : this(uniCB, regValve, flowMeter, qFrom, qTo, flowbox, int.MaxValue, 0, false) + { + } + + /// + /// Fetch target position limits from the dictionary or return false + /// + /// Average of the flow targer range (input) + /// Target valve position low limit (output) + /// Target valve position high limit (output) + /// true when positions for the target flow are stored in the memory, otherwise return false + bool FetchTargetPosition(double avgReqFlow, out double positionLo, out double positionHi) + { + double targetPosition; + if (regV.Dict.TryGetValue(avgReqFlow, out targetPosition)) + { + positionLo = Math.Max(targetPosition * 0.95, 0.0); + positionHi = Math.Min(targetPosition * 1.05, 100.0); + return true; + } + else + { + positionLo = 0; + positionHi = 0; + return false; + } + } + + void StoreTargetPosition(double avgReqFlow, double actPosition) + { + if (!regV.Dict.ContainsKey(targetFlowAve)) + { + regV.Dict.Add(new KeyValuePair(avgReqFlow, actPosition)); + } + return; + } + + /// Start this operation + public void Start() + { + log.InfoFormat("SetFlowOp:Start() rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", + regV.Idx1, flowMeter.Idx1, currentReqFlowLo, currentReqFlowHi); + + /// Store the current time, etc. + setFlowTime = StateMachine.Time + delay; + expireTime = StateMachine.Time + timeout; + if (expireTime < 0) expireTime = int.MaxValue; + + isFlowOkDuration = 0; + + /// Start the flow measurement + uniCB.MeasureFlow(false, flowMeter.Idx1); + + opState = OpState.Wait4FlowMsrmntAndSendRVMove; + } + + /// + /// Run this operation + /// + /// + /// Event.OpArgumentError + /// Event.Starting + /// Event.Busy + /// Event.FlowReached + /// Event.RegulValveTimeOut + /// + public Event Run() + { + log.DebugFormat("Op.Run() opState={0}", opState); + + if (StateMachine.Time > expireTime) return Event.RegulValveTimeOut; + + if (opState == OpState.Wait4FlowMsrmntAndSendRVMove) + { + if (flowMeter.DebugLevel == DebugMode.Simulate) return Event.FlowReached; + + if (!flowMeter.MsrmntAvailable) return Event.Starting; + + double flow1 = flowMeter.ReadFlow(); + + /// Set the targer flow/frequency range + currentReqFlowLo = shrinkedTgtFlowLo; /// Default lower limit + currentReqFlowHi = shrinkedTgtFlowHi; /// Default upper limit + //if (flow1 >= targetFlowAve) currentReqFlowHi = targetFlowAve; /// Decrease upper limit + //if (flow1 <= targetFlowAve) currentReqFlowLo = targetFlowAve; /// Increase lower limit + + if ((currentReqFlowLo >= currentReqFlowHi) || (currentReqFlowLo > maximalFlow) || (currentReqFlowHi <= 0)) + { + return Event.OpArgumentError; + } + + if (StateMachine.Time > setFlowTime) + { + uniCB.SetFlow(false, regV.Idx1, flowMeter.NominalFreq * currentReqFlowLo / flowMeter.NominalFlow, + flowMeter.NominalFreq * currentReqFlowHi / flowMeter.NominalFlow); + + log.InfoFormat("Run(): rv#={0} TARGET: flowLo={1} flowHi={2}", regV.Idx1, currentReqFlowLo, currentReqFlowHi); + + opState = OpState.SettingFlow; + } + + return Event.Starting; + } + + if (opState == OpState.ValveMoveToPosition1) + { + opState = OpState.ValveMoveToPosition2; + return Event.Starting; + } + else if (opState == OpState.ValveMoveToPosition2) /// Move to position + { + /// Issues the appropriate ValveMove(...) command + regV.MoveToPosition(false, targetPositionLo, targetPositionHi); + + opState = OpState.SettingPosition; + return Event.Starting; + } + else if (opState == OpState.ValveMoveToPosition3) + { + opState = OpState.SettingPosition; + return Event.Starting; + } + else if (opState == OpState.SettingPosition) + { + /// Repeated untill position is reached + double rvPosition = regV.Position; + if ((targetPositionLo <= rvPosition) && (rvPosition <= targetPositionHi)) + { + opState = OpState.Wait4FlowMsrmntAndSendRVMove; + } + return Event.Starting; + } + else if (opState == OpState.SettingFlow) + { + /// Regulation valve is setting flow to the required value + /// + double frequency = flowMeter.ReadFrequency(); + double flow = flowMeter.ReadFlow(); + if (msrdFlow != null && flow != 0) msrdFlow.Val = flow; + + if (currentReqFlowLo <= flow && flow <= currentReqFlowHi) + { + isFlowOkDuration++; /// Increment the flow within range duration + + if (isFlowOkDuration >= regV.FlowStableSec) + { + /// Flow is within range for sufficiently long time + if (regV.StoredPositionReuse) + { + double rvPosition = regV.Position; /// Read the current position + double storedPosition; + if (regV.Dict.TryGetValue(targetFlowAve, out storedPosition)) + { + /// update the stored valve position + StoreTargetPosition(targetFlowAve, (rvPosition + storedPosition) / 2.0); + log.InfoFormat("Run(): rv#={0} reqFlow={1} pos={2}% stored={3} <--- Updating a stored position", + regV.Idx1, targetFlowAve, rvPosition.ToString("F1"), storedPosition); + } + else + { + /// store the valve position + StoreTargetPosition(targetFlowAve, rvPosition); + log.InfoFormat("Run(): rv#={0} reqFlow={1} pos={2}% <--- Storing a new position", + regV.Idx1, targetFlowAve, rvPosition.ToString("F1")); + } + } + + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, REACHED)", flow, currentReqFlowLo, currentReqFlowHi); + + opState = OpState.FlowReached; + return Event.FlowReached; + } + else + { + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, FLOW_OK_TIMER={3}s)", flow, currentReqFlowLo, currentReqFlowHi, isFlowOkDuration); + return Event.Busy; + } + } + else + { + /// Flow is out of range + isFlowOkDuration = 0; + + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2})", flow, currentReqFlowLo, currentReqFlowHi); + return Event.Busy; + } + } + else /// opState == OpState.FlowReached + { + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, REACHED)", flowMeter.ReadFlow(), currentReqFlowLo, currentReqFlowHi); + return Event.FlowReached; + } + } + + /// Stop this operation + public void Stop() + { + if (!leaveFlowControlRunning) + { + uniCB.StopFlowControl(false, regV.Idx1); /// Stop the flow measurement + } + + opState = OpState.Idle; + } + } +} diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetRegValvePositionOp.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetRegValvePositionOp.cs new file mode 100644 index 000000000..071a9c163 --- /dev/null +++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetRegValvePositionOp.cs @@ -0,0 +1,155 @@ +/// +/// Copyright (c) 2021-2022 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.Rig.ControlBoard.Uni; +using TBF.Rig.GenericDevices; + +namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation +{ + public class SetRegValvePositionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetRegValvePositionOp)); + public override string ToString() + { + return string.Format("SetRegValvePositionOp({0},{1},{2})", regV.Name, posLoPct, posHiPct); + } + + /// + /// Internal states of this operation + /// + enum OpState + { + Idle = 0, + MoveToPosition, /// Send commend to move to position + CheckState, /// Check RV state by reading statos word + MovingToPosition, /// Command passed OK, RV is moving to a position + } + OpState opState; + + /// Set by the constructor + readonly UniCB uniCB; + readonly RegValve regV; + readonly int regValveNr; + readonly double posLoPct; + readonly double posHiPct; + readonly int timeout; + + /// Process values + int expireTime; + bool positionReached; + + /// + /// Set required water flow. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Lower limit of the position to be achieved + /// Upper limit of the position to be achieved + /// Timeout in sec. for setting the flow + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public SetRegValvePositionOp(UniCB uniCB, RegValve regV, double posLoPct, double posHiPct, int timeout) + { + this.uniCB = uniCB; + if (this.uniCB == null) throw new ArgumentNullException("ctrlBoard"); + + this.regV = regV as RegValve; + if (this.regV == null) throw new ArgumentNullException("regValve is null or not Uni"); + this.regValveNr = this.regV.Idx1; + + this.posLoPct = posLoPct; + this.posHiPct = posHiPct; + this.timeout = timeout; + + log.Debug(this.ToString()); + } + + /// + /// Set required water flow - no timeout. + /// Events: FlowSet + /// + public SetRegValvePositionOp(UniCB cBoard, RegValve regValve, float posLoPct, float posHiPct) + : this(cBoard, regValve, posLoPct, posHiPct, int.MaxValue) + { + } + + /// Start this operation + public void Start() + { + positionReached = false; + expireTime = StateMachine.Time + timeout; + log.InfoFormat("Start(): {0} reqPosLo={1}%, reqPosHi={2}%", regV.Name, posLoPct.ToString("F1"), posHiPct.ToString("F1")); + opState = OpState.MoveToPosition; + } + + /// + /// Run this operation + /// + /// + /// Event.None . . . . . . . busy adjusting position + /// Event.PositionReached . . position reached + /// Event.OpArgumentError . . invalid required position + /// + public Event Run() + { + if (opState == OpState.MoveToPosition) + { + if (posLoPct >= posHiPct || posLoPct > 100.0 || posHiPct < 0) + { + return Event.OpArgumentError; + } + + regV.MoveToPosition(false, posLoPct, posHiPct); + opState = OpState.CheckState; + log.WarnFormat("Run(): RV#={0}, state={1}, MoveToPosition(false, {2:D1}, {3:D1}) issued", regValveNr, opState, posLoPct, posHiPct); + return Event.None; + } + + if (positionReached) return Event.PositionReached; + + double positionPct = regV.Position; + log.WarnFormat("Run(): RV#={0}, state={1}, pos={2}%", regValveNr, opState, positionPct.ToString("F1")); + + if (opState == OpState.CheckState) + { + if (posLoPct <= positionPct && positionPct <= posHiPct) + { + positionReached = true; + return Event.PositionReached; + } + else if (regV.RegValveState != RegValveState.DacValueRegul) + { + opState = OpState.MoveToPosition; /// Resend move command again in the next run + return Event.None; + } + else + { + opState = OpState.MovingToPosition; + return Event.None; + } + } + else if (StateMachine.Time > expireTime) + { + return Event.RegulValveTimeOut; + } + else if (opState == OpState.MovingToPosition) + { + if (posLoPct <= positionPct && positionPct <= posHiPct) + { + positionReached = true; + return Event.PositionReached; + } + return Event.None; + } + return Event.None; + } + + /// Stop this operation + public void Stop() + { + } + } +} From 1525bb7c1abe5a13c4f0ca4ec916dcf7f6824bdc Mon Sep 17 00:00:00 2001 From: Michal Buzik Date: Sun, 7 Sep 2025 22:34:06 +0200 Subject: [PATCH 4/4] Patch applied - Add initial implementation for IperlHeadTestCtrl and NfcServices This commit introduces the `IperlHeadTestCtrl` component and `NfcServices` class, including core functionality for communication with iPerl heads via NFC/RFID. It integrates configuration options, multithreaded commands processing, and logging through `log4net`. --- AppDiagnostic/App.config | 29 +- .../Properties/Resources.Designer.cs | 43 +- AppDiagnostic/Properties/Settings.Designer.cs | 30 + .../iPerlCommunication/OpticalHeadTest.cs | 131 ++++ .../iPerlCommunication/SequenceConditionOp.cs | 44 ++ .../iPerlHead/IperlHeadTestCtrl.Designer.cs | 137 +++++ .../iPerlHead/IperlHeadTestCtrl.cs | 189 ++++++ .../iPerlHead/IperlHeadTestCtrl.resx | 120 ++++ .../iPerlHead/NfcServices.cs | 315 ++++++++++ .../iPerlHead/RfidServices.cs | 123 ++++ .../iPerlHead/SimulationServices.cs | 61 ++ .../RegValveCfgCtrl.designer.cs | 581 ++++++++++++++++++ .../RegValveCfgCtrl.resx | 120 ++++ .../bin/Debug/SampleConfig/log4netConfig.xml | 10 +- 14 files changed, 1901 insertions(+), 32 deletions(-) create mode 100644 AppDiagnostic/Properties/Settings.Designer.cs create mode 100644 TBF/Rig/TestMethods/iPerlCommunication/OpticalHeadTest.cs create mode 100644 TBF/Rig/TestMethods/iPerlCommunication/SequenceConditionOp.cs create mode 100644 TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.Designer.cs create mode 100644 TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.cs create mode 100644 TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.resx create mode 100644 TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/NfcServices.cs create mode 100644 TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/RfidServices.cs create mode 100644 TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/SimulationServices.cs create mode 100644 TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.designer.cs create mode 100644 TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.resx diff --git a/AppDiagnostic/App.config b/AppDiagnostic/App.config index 3bedfc101..7f5eaea7b 100644 --- a/AppDiagnostic/App.config +++ b/AppDiagnostic/App.config @@ -1,18 +1,19 @@ - + - + - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/AppDiagnostic/Properties/Resources.Designer.cs b/AppDiagnostic/Properties/Resources.Designer.cs index 5f4bc8a07..1b5dfe715 100644 --- a/AppDiagnostic/Properties/Resources.Designer.cs +++ b/AppDiagnostic/Properties/Resources.Designer.cs @@ -1,16 +1,17 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ -namespace AppDiagnostic.Properties { - using System; - - +namespace AppDiagnostic.Properties +{ + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -21,40 +22,48 @@ namespace AppDiagnostic.Properties { [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - + internal class Resources + { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { + internal Resources() + { } - + /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AppDiagnostic.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { + internal static global::System.Globalization.CultureInfo Culture + { + get + { return resourceCulture; } - set { + set + { resourceCulture = value; } } diff --git a/AppDiagnostic/Properties/Settings.Designer.cs b/AppDiagnostic/Properties/Settings.Designer.cs new file mode 100644 index 000000000..10069d35f --- /dev/null +++ b/AppDiagnostic/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AppDiagnostic.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/TBF/Rig/TestMethods/iPerlCommunication/OpticalHeadTest.cs b/TBF/Rig/TestMethods/iPerlCommunication/OpticalHeadTest.cs new file mode 100644 index 000000000..3edaced4e --- /dev/null +++ b/TBF/Rig/TestMethods/iPerlCommunication/OpticalHeadTest.cs @@ -0,0 +1,131 @@ +using Config.Resources; +using log4net; +using Sensus.iPerl.RfidCom.Helper; +using Sensus.iPerl.RfidCom.Services; +using Sensus.iPerl.RfidCom.Structures; +using System; +using System.Threading; +using TBF.Rig.Hart.Common; +using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead; +using static Sensus.iPerl.NfcHandler.MCI_Protocol; + +namespace TBF.Rig.TestMethods.iPerlCommunication +{ + internal class OpticalHeadTest + { + protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); + + internal static string OpenSealing(IperlHead iHead) + { + if (RfidCommands.OpenSealing($"COM{iHead.RfidComPortNr}")) return "OK"; + return "Error Open Sealing"; + } + + internal static string ReadRequest_PCB(IperlHead iHead) + { + try + { + byte[] pcb = null; + int readRetVal = iPerlCommunicationForm.ReadRequestPort(iHead, MessageID.Configuration, Sensus.iPerl.NfcHandler.MCI_Protocol.StructName.Configuration, 16, 5, out pcb); + if (readRetVal == 0) + { + return RfidHelper.HexLiteral2Unsigned(RfidHelper.SwapHexcode(BitConverter.ToString(pcb).Replace("-", string.Empty))).ToString(); + } + rfidDataLogger.Error($"COM{iHead.RfidComPortNr}: ReadRequest_PCB ({MessageID.Configuration},16,5...) <- Error: {readRetVal}"); + return "Error"; + } + catch (Exception ex) + { + return (ex.Message.ToString()); + } + } + + internal static string SetActiveMode(IperlHead iHead) + { + byte[] cmd = new byte[1] { (byte)Command.SetActiveMode }; + if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.Command, StructName.Command, 0, 1, cmd)) + { + return "OK"; + } + else + { + return "Error Set Active Mode"; + } + } + + internal static string SetTestMode(IperlHead iHead) + { + byte[] cmd = new byte[1] { (byte)Command.SetTestMode }; + if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.Command, StructName.Command, 0, 1, cmd)) + { + return "OK"; + } + else + { + return "Error Set Test Mode"; + } + } + +#if IPERL + internal static string TurnOffRadio(IperlHead iHead) + { + try + { + int retValue = iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.RadioPassthrough, StructName.RadioParams, 0x1898, 1, new byte[] { (byte)3 }); // WakeUpInterval + return 0 == retValue ? "OK" : "Error"; + } + catch (Exception ex) + { + return (ex.Message.ToString()); + } + } + + internal static string SetProductionMode(IperlHead iHead) + { + try + { + int retValue = iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, 1, new byte[] { (byte)1 }); // System Status + return 0 == retValue ? "OK" : "Error"; + } + catch (Exception ex) + { + return (ex.Message.ToString()); + } + } + + internal static string WriteRequestPort_u8_Customer_Text(IperlHead iHead) + { + string custText = "FF0123456789ABCDEF"; // Sample text to test write function + /*try + { + byte[] cmd = RfidHelper.HexStringToByteArray(custText); + if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.RadioPassthrough, Sensus.iPerl.NfcHandler.MCI_Protocol.StructName.RadioParams, 0x1899, 9, cmd)) + { + RfidCommunicationService rfidCommunicationService = new RfidCommunicationService { ComPort = $"COM{iHead.RfidComPortNr}", WaitTimeAfterFailure = 2200, PassThroughWaitTime = 1500, MaxRetries = 3, TimeOut = 5000 }; + //rfidCommunicationService.RfidWrite(Params.u8_Customer_Text, custText); + return rfidCommunicationService.RfidRead(Params.u8_Customer_Text).ToString(); + } + } + catch (Exception ex) + { + return (ex.Message.ToString()); + }*/ + return $"Error COM{iHead.RfidComPortNr}"; + } + + internal static string SetRfidMode(IperlHead iHead) + { + iHead.SetRfidInterface(); + iHead.SetCommunicationInterface(CommunicationInterface.RFID); + return ($"OK - {Strings.Program_restart_is_required_to_apply_some_settings}"); + } + + internal static string SetNfcMode(IperlHead iHead) + { + iHead.SetNfcInterface(); + iHead.SetCommunicationInterface(CommunicationInterface.NFC); + return ($"OK - {Strings.Program_restart_is_required_to_apply_some_settings}"); + } +#endif /// IPERL + } +} diff --git a/TBF/Rig/TestMethods/iPerlCommunication/SequenceConditionOp.cs b/TBF/Rig/TestMethods/iPerlCommunication/SequenceConditionOp.cs new file mode 100644 index 000000000..cc9319161 --- /dev/null +++ b/TBF/Rig/TestMethods/iPerlCommunication/SequenceConditionOp.cs @@ -0,0 +1,44 @@ +/// +/// Copyright (c) 2022 Sensus Slovensko a.s. +/// +using TBF.Resources; + +namespace TBF.Rig.TestMethods.iPerlCommunication +{ + public enum ConditionID + { + A, + B, + C, + Count, + } + + public class SequenceConditionOp : IOperation + { + public const string ConditionNameFmt = "iPERL communication milestone {0}"; + + ConditionID id; + TestMethod testMethodComponent; + + public SequenceConditionOp(TestMethod testMethodComponent, ConditionID id) + { + this.testMethodComponent = testMethodComponent; + this.id = id; + } + + public void Start() { } + + public Event Run() + { + bool conditionMet = testMethodComponent.IperlCommMilestone[(int)id]; + return conditionMet ? Event.ConditionMet : Event.ConditionNotMet; + } + + public void Stop() { } + + public override string ToString() + { + return string.Format(ConditionNameFmt, id); + } + } +} diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.Designer.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.Designer.cs new file mode 100644 index 000000000..9e0f9487c --- /dev/null +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.Designer.cs @@ -0,0 +1,137 @@ +namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead +{ + partial class IperlHeadTestCtrl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.optoTestGroupBox = new System.Windows.Forms.GroupBox(); + this.optoListBox = new System.Windows.Forms.ListBox(); + this.rfidOutputListBox = new System.Windows.Forms.ListBox(); + this.RfidTestGroupBox = new System.Windows.Forms.GroupBox(); + this.label2 = new System.Windows.Forms.Label(); + this.rfidCommandComboBox = new System.Windows.Forms.ComboBox(); + this.commandTestButton = new System.Windows.Forms.Button(); + this.optoTestGroupBox.SuspendLayout(); + this.RfidTestGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // optoTestGroupBox + // + this.optoTestGroupBox.Controls.Add(this.optoListBox); + this.optoTestGroupBox.Location = new System.Drawing.Point(5, 4); + this.optoTestGroupBox.Name = "optoTestGroupBox"; + this.optoTestGroupBox.Size = new System.Drawing.Size(591, 161); + this.optoTestGroupBox.TabIndex = 2; + this.optoTestGroupBox.TabStop = false; + this.optoTestGroupBox.Text = "Opto-data"; + // + // optoListBox + // + this.optoListBox.FormattingEnabled = true; + this.optoListBox.ItemHeight = 16; + this.optoListBox.Location = new System.Drawing.Point(7, 22); + this.optoListBox.Name = "optoListBox"; + this.optoListBox.Size = new System.Drawing.Size(573, 132); + this.optoListBox.TabIndex = 0; + // + // rfidOutputListBox + // + this.rfidOutputListBox.FormattingEnabled = true; + this.rfidOutputListBox.ItemHeight = 16; + this.rfidOutputListBox.Location = new System.Drawing.Point(5, 54); + this.rfidOutputListBox.Name = "rfidOutputListBox"; + this.rfidOutputListBox.SelectionMode = System.Windows.Forms.SelectionMode.None; + this.rfidOutputListBox.Size = new System.Drawing.Size(575, 164); + this.rfidOutputListBox.TabIndex = 3; + // + // RfidTestGroupBox + // + this.RfidTestGroupBox.Controls.Add(this.rfidOutputListBox); + this.RfidTestGroupBox.Controls.Add(this.label2); + this.RfidTestGroupBox.Controls.Add(this.rfidCommandComboBox); + this.RfidTestGroupBox.Controls.Add(this.commandTestButton); + this.RfidTestGroupBox.Location = new System.Drawing.Point(5, 171); + this.RfidTestGroupBox.Name = "RfidTestGroupBox"; + this.RfidTestGroupBox.Size = new System.Drawing.Size(591, 224); + this.RfidTestGroupBox.TabIndex = 3; + this.RfidTestGroupBox.TabStop = false; + this.RfidTestGroupBox.Text = "RFID / NFC data"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(2, 25); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(69, 16); + this.label2.TabIndex = 2; + this.label2.Text = "Command"; + // + // rfidCommandComboBox + // + this.rfidCommandComboBox.FormattingEnabled = true; + this.rfidCommandComboBox.Location = new System.Drawing.Point(86, 19); + this.rfidCommandComboBox.Name = "rfidCommandComboBox"; + this.rfidCommandComboBox.Size = new System.Drawing.Size(341, 24); + this.rfidCommandComboBox.TabIndex = 1; + // + // commandTestButton + // + this.commandTestButton.Location = new System.Drawing.Point(449, 19); + this.commandTestButton.Name = "commandTestButton"; + this.commandTestButton.Size = new System.Drawing.Size(126, 24); + this.commandTestButton.TabIndex = 0; + this.commandTestButton.Text = "Send command"; + this.commandTestButton.UseVisualStyleBackColor = true; + this.commandTestButton.MouseClick += new System.Windows.Forms.MouseEventHandler(this.CommandTestButtonClick); + // + // IperlHeadTestCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.optoTestGroupBox); + this.Controls.Add(this.RfidTestGroupBox); + this.Name = "IperlHeadTestCtrl"; + this.Size = new System.Drawing.Size(611, 432); + this.Load += new System.EventHandler(this.UserControl_Load); + this.optoTestGroupBox.ResumeLayout(false); + this.RfidTestGroupBox.ResumeLayout(false); + this.RfidTestGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox optoTestGroupBox; + private System.Windows.Forms.ListBox rfidOutputListBox; + private System.Windows.Forms.GroupBox RfidTestGroupBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox rfidCommandComboBox; + private System.Windows.Forms.Button commandTestButton; + private System.Windows.Forms.ListBox optoListBox; + } +} diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.cs new file mode 100644 index 000000000..69e82e0ca --- /dev/null +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.cs @@ -0,0 +1,189 @@ +using System; +using System.Threading; +using System.Web.UI.WebControls; +using System.Windows.Forms; +using TBF.Rig.Sequences; + +namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead +{ + public partial class IperlHeadTestCtrl : UserControl + { + IperlHeadCfg config; + IperlHead iPerlHead; + Thread optoThread; + + private bool stopWorkerThread; + public event EventHandler OptoReceivedHandler; + + public IperlHeadTestCtrl(IperlHeadCfg config) + { + this.config = config; + InitializeComponent(); + if (config == null) return; + + iPerlCommunicationForm.cfg = new TestMethodCfg(null); // default values for iPerlCommunication + + foreach(var head in ProcessData.IperlHeads) + { + if (head != null && head.Name == config.Name) { iPerlHead = head; } + } + + rfidCommandComboBox.DisplayMember = "Name"; + rfidCommandComboBox.ValueMember = "Value"; + var items = new[] + { + new {Name = "Read PCB", Value = "ReadPCB" }, + new {Name = "Set Test Mode", Value = "SetTestMode" }, + new {Name = "Set Active Mode", Value = "SetActiveMode" }, +#if DEBUG + new {Name = "Start Read Opto Data", Value = "ReadOptoData" }, + new {Name = "Stop Read Opto Data", Value = "StopReadOptoData" }, +#endif + new {Name = " ", Value = "" }, + new {Name = "Reset NFC Head", Value = "ResetNfcHead" }, + new {Name = "Set NFC Head Interface", Value = "SetNfcHead" }, + new {Name = "Set RFID Head interface", Value = "SetRfidHead" } + }; + /* + // CTRL+ALT+double click - hidden poweruser menu + if (((Keyboard.ModifierKeys & Keys.Control) == Keys.Control) && ((Keyboard.ModifierKeys & Keys.Alt) == Keys.Alt) && Users.CurrentUser.AuthorizedAs == AuthorizedAs.PowerUser) + { + Array.Resize(ref items, items.Length + 1); + items[items.Length - 1] = new { Name = "Kluc", Value = "Kluc" }; + } + */ + rfidCommandComboBox.DataSource = items; + + stopWorkerThread = false; + + OptoReceivedHandler += (EventHandler)((sndr, args) => + { + if (this.InvokeRequired) + this.Invoke((Delegate)new EventHandler(this.OnOptoReceived2), sndr, (object)args); + else + this.OnOptoReceived2(sndr, args); + }); + } + + public void OnOptoReceived2(object sender, OptoReceivedEventArgs args) + { + optoListBox.Items.Insert(0,args.Data); + } + + private void CommandTestButtonClick(object sender, MouseEventArgs e) + { + rfidOutputListBox.Items.Clear(); + + using (Tools.LogChecker logChecker = new Tools.LogChecker("RfidData", log4net.Core.Level.Debug)) + { + ListItem rfidListItem = new ListItem(); + rfidListItem.Attributes.Add("style", "font-weight:bold"); + switch (rfidCommandComboBox.SelectedValue) + { + case "ReadPCB": + rfidListItem.Text = $"PCB: {OpticalHeadTest.ReadRequest_PCB(iPerlHead)}"; + break; + case "SetTestMode": + rfidListItem.Text = OpticalHeadTest.SetTestMode(iPerlHead); + optoListBox.Items.Clear(); + stopWorkerThread = false; + optoThread = new Thread(OptoWorker); + if (!optoThread.IsAlive) + { + iPerlHead.StartDataStreamProcessing(); // open opto port + optoThread.Start(); + } + break; + case "SetActiveMode": + rfidListItem.Text = OpticalHeadTest.SetActiveMode(iPerlHead); + stopWorkerThread = true; + iPerlHead.StopDataStreamProcessing(); // close opto port + break; + case "ResetNfcHead": + iPerlHead.ResetNfcInterface(); + break; + case "SetNfcHead": + iPerlHead.SetNfcInterface(); + break; + case "SetRfidHead": + iPerlHead.SetRfidInterface(); + break; + case "ReadOptoData": + optoListBox.Items.Clear(); + stopWorkerThread = false; + optoThread = new Thread(OptoWorker); + if (optoThread.IsAlive) + { + stopWorkerThread = true; + iPerlHead.StopDataStreamProcessing(); // close opto port + } + if (!optoThread.IsAlive) + { + iPerlHead.StartDataStreamProcessing(); // open opto port + optoThread.Start(); + } + break; + case "StopReadOptoData": + stopWorkerThread = true; + iPerlHead.StopDataStreamProcessing(); // close opto port + break; + } + rfidOutputListBox.Items.Add(rfidListItem); + rfidOutputListBox.Items.AddRange(logChecker.Messages.ToArray()); + } + } + + private void OptoWorker() + { + while (!this.stopWorkerThread) + { + Thread.Sleep(250); + if (this.stopWorkerThread) + break; + + try + { + string buffer = iPerlHead.ReadOptoData(); + if (string.IsNullOrEmpty(buffer)) + { + this.OnOptoReceived((object)this, new OptoReceivedEventArgs(".")); + } + else + OnOptoReceived((object)this, new OptoReceivedEventArgs(buffer)); + } + catch (Exception ex) + { + this.OnOptoReceived((object)this, new OptoReceivedEventArgs(ex.Message)); + } + } + } + + public void OnOptoReceived(object sender, OptoReceivedEventArgs args) + { + if (this.OptoReceivedHandler == null) + return; + try + { + this.OptoReceivedHandler(sender, args); + } + catch (Exception ex) + { + } + } + + private void UserControl_Load(object sender, EventArgs e) + { + this.ParentForm.FormClosing += new FormClosingEventHandler(ParentForm_FormClosing); + } + + void ParentForm_FormClosing(object sender, FormClosingEventArgs e) + { + //OnHandleDestroyed(new EventArgs()); + stopWorkerThread = true; + if (optoThread != null) + { + optoThread.Abort(); + } + } + } +} diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.resx b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.resx new file mode 100644 index 000000000..d58980a38 --- /dev/null +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/NfcServices.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/NfcServices.cs new file mode 100644 index 000000000..41fd422c4 --- /dev/null +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/NfcServices.cs @@ -0,0 +1,315 @@ +using log4net; +using Sensus.iPerl.NfcHandler; +using Sensus.iPerl.RfidCom.Exceptions; +using System; +using System.Globalization; +using System.Text; +using System.Threading; +using static Sensus.iPerl.NfcHandler.MCI_Protocol; + +namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead +{ + internal class NfcServices + { + protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); + internal static int ReadRequest(TestMethodCfg cfg, IperlHead iperlHead, MCI_Protocol.StructName structName, int offset, int length, out byte[] buffer) + { + for (int i = 0; i < cfg.MaxCommRetries; i++) + { + + NfcDataHandler _nfcDataHandler = new NfcDataHandler(); + MessageEventHandlers(_nfcDataHandler); + CR95HF_MessageEventHandlers(_nfcDataHandler._CR95HF_Reader); + ST25DV_MessageEventHandlers(_nfcDataHandler._ST25DV_Device); + MCI_MessageEventHandlers(_nfcDataHandler._MCI_Protocol); + NFCHeadConfig_MessageEventHandlers(_nfcDataHandler._NFCHead_Config); + try + { + rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} ReadRequest : {structName}, {offset}, {length}"); + OpenConnection(_nfcDataHandler, cfg, iperlHead); + + buffer = MciRead(_nfcDataHandler, cfg, structName, (ushort)offset, length); + _nfcDataHandler.RFProtocolOFF(); // turn off rf antenna due to possible interference + + CloseComPort(_nfcDataHandler); + + rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} ReadRequest : {structName}, {offset}, {length} ; Response= {ByteArrayToHexString(buffer)} ; Error: {_nfcDataHandler.LastErrorMessage}"); + + if (_nfcDataHandler.LastErrorCode != 0) + { + throw new RfidValidationException(_nfcDataHandler.LastErrorMessage); + } + + return Convert.ToInt32(_nfcDataHandler.LastErrorCode); //return 0; + } + catch (RfidValidationException) + { + Thread.Sleep(cfg.WaitTimeAfterFailure); + } + catch (Exception ex) + { + rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} ReadRequest Error: {ex.Message}"); + buffer = new byte[length]; + return 3; + } + } + buffer = new byte[length]; + return 3; + } + + internal static int WriteRequest(TestMethodCfg cfg, IperlHead iperlHead, MCI_Protocol.StructName structName, int offset, int length, byte[] buffer) + { + NfcDataHandler _nfcDataHandler = new NfcDataHandler(); + MessageEventHandlers(_nfcDataHandler); + CR95HF_MessageEventHandlers(_nfcDataHandler._CR95HF_Reader); + ST25DV_MessageEventHandlers(_nfcDataHandler._ST25DV_Device); + MCI_MessageEventHandlers(_nfcDataHandler._MCI_Protocol); + NFCHeadConfig_MessageEventHandlers(_nfcDataHandler._NFCHead_Config); + try + { + rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} WriteRequest : {structName}, {offset}, {length}, {ByteArrayToHexString(buffer)}"); + OpenConnection(_nfcDataHandler, cfg, iperlHead); + + MciWrite(_nfcDataHandler, cfg, structName, (ushort)offset, length, buffer); + _nfcDataHandler.RFProtocolOFF(); // turn off rf antenna due to possible interference + + CloseComPort(_nfcDataHandler); + return 0; + } + catch (Exception ex) + { + rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} WriteRequest Error: {ex.Message}"); + return 3; + } + } + + private static void OpenConnection(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, IperlHead iperlHead) + { + string comPort = $"COM{iperlHead.RfidComPortNr}"; + int retryCount = 0 ; + Open: + nfcDataHandler.Close(); + Thread.Sleep(100); + if (nfcDataHandler.OpenConnection(comPort, cfg.BaudRate, cfg.DataBits, cfg.ParityBit, cfg.StopBits)) + { + rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} Port Open"); + + if (nfcDataHandler.ConnectReader()) + { + rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} Reader connected"); + if (!nfcDataHandler.ConnectDevice()) + { + rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} Error connect device."); + for (int i = 0; i < cfg.MaxCommRetries; i++) + { + if (nfcDataHandler.Echo()) break; + } + } + } + else + { + retryCount++; + rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} Error connect reader. Reconnect comport {retryCount}"); + if (retryCount < cfg.MaxCommRetries) + { + nfcDataHandler.Close(); + iperlHead.ResetNfcInterface(); // reset NFC head via optoport - switch to RFID and back to NFC interface + goto Open; + } + } + } + else + rfidDataLogger.Error($"Open NFC COM{iperlHead.RfidComPortNr} Port Failed"); + } + + private static void CloseComPort(NfcDataHandler nfcDataHandler) + { + nfcDataHandler.Close(); + } + + private static byte[] MciRead(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, StructName structName, ushort offset, int length) + { + bool isReadValues = false; + int retryCount = 0; + Read: + try + { + isReadValues = false; + long num1 = (long)length; + int timeoutMs = 4000; + byte payloadlength = Convert.ToByte(num1.ToString("X2"), 16); + if (nfcDataHandler.MCI_Read(structName, offset, payloadlength, timeoutMs)) + { + byte[] lastData = nfcDataHandler.LastData; + if ((long)lastData.Length >= num1) + { + rfidDataLogger.Info($"COM: MciRead ({structName},{offset},{length}) = {ByteArrayToHexString(lastData)}"); + return lastData; + } + else + rfidDataLogger.Info($"COM: MciRead ({structName},{offset},{length}) = {ByteArrayToHexString(lastData)}"); + } + else if (nfcDataHandler.LastErrorCode == (byte)0) + { + rfidDataLogger.Info($"MCI Error: Unidentified"); + retryCount++; + if (retryCount < cfg.MaxCommRetries) + goto Read; + } + else + { + rfidDataLogger.Info("Last error message: " + nfcDataHandler.LastErrorMessage); + retryCount++; + if (retryCount < cfg.MaxCommRetries) + goto Read; + } + } + catch (Exception ex) + { + rfidDataLogger.Error("MciRead Last error message: " + ex.Message); + retryCount++; + if (retryCount < cfg.MaxCommRetries) + goto Read; + } + return new byte[length]; + } + + private static void MciWrite(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, MCI_Protocol.StructName structName, ushort offset, int length, byte[] payload) + { + int retryCount = 0; + Write: + try + { + long num1 = (long)length; + int timeoutMs = 4000; + byte payloadlength = Convert.ToByte(num1); + if ((int)payloadlength != payload.Length) + rfidDataLogger.Error("Insufficient Payload -- Payload lenth : " + (object)payload.Length); + else if (nfcDataHandler.MCI_Write(structName, offset, payloadlength, payload, timeoutMs)) + { + // OK + } + else if (nfcDataHandler.LastErrorCode > (byte)0) + { + rfidDataLogger.Error("Last error message: " + nfcDataHandler.LastErrorMessage); + //int num2 = (int)MessageBox.Show(this._nfcDataHandler.LastErrorMessage); + } + } + catch (Exception ex) + { + rfidDataLogger.Error("MciWrite error message: " + ex.Message); + retryCount++; + if (retryCount < cfg.MaxCommRetries) + goto Write; + } + } + + private static void MciWriteCommand(NfcDataHandler nfcDataHandler, byte commandcode) + { + try + { + ushort offset = 0; + int timeoutMs = 4000; + byte payloadlength = 1; + byte[] payload = new byte[1] { commandcode }; + if (nfcDataHandler.MCI_Write(MCI_Protocol.StructName.Command, offset, payloadlength, payload, timeoutMs) || nfcDataHandler.LastErrorCode <= (byte)0) + return; + rfidDataLogger.Error("MciWriteCommand Last error message: " + nfcDataHandler.LastErrorMessage); + } + catch (Exception ex) + { + rfidDataLogger.Error("MciWriteCommand Last error message: " + ex.Message); + } + } + + public static string ByteArrayToHexString(byte[] data) + { + StringBuilder stringBuilder = new StringBuilder(); + foreach (byte num in data) + stringBuilder.Append(num.ToString("X2")); + return stringBuilder.ToString(); + } + + private static byte[] BuildPayLoad(string strPayLoad, int length) + { + byte[] collection; + + if (strPayLoad.Split(':').Length > 1) + { + uint timestamp = ConvertDateTimeToTimestamp(Convert.ToDateTime(DateTime.ParseExact(strPayLoad, "HH:mm:ss dd/MM/yyyy", (IFormatProvider)CultureInfo.InvariantCulture))); + byte[] bytes = BitConverter.GetBytes(timestamp); + return bytes; + } + else if (strPayLoad.Split(',').Length > 1) + { + string[] strArray = strPayLoad.Split(','); + collection = new byte[strArray.Length]; + for (int index3 = 0; index3 < strArray.Length; ++index3) + collection[index3] = Convert.ToByte(strArray[index3], 16); + return collection; + } + else + { + //int num = strPayLoad.Split(',').Length; + collection = HexStringToByteArray(strPayLoad.Substring(strPayLoad.Length - length * 2).ToUpper()); + Array.Reverse((Array)collection); + return collection; + } + } + + public static byte[] HexStringToByteArray(string hexString) + { + int length = hexString.Length; + byte[] byteArray = new byte[length / 2]; + for (int startIndex = 0; startIndex < length; startIndex += 2) + byteArray[startIndex / 2] = Convert.ToByte(hexString.Substring(startIndex, 2), 16); + return byteArray; + } + + private static uint ConvertDateTimeToTimestamp(DateTime datetime) + { + TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now); + return (uint)((datetime - new DateTime(2000, 1, 1, 0, 0, 0).ToLocalTime()).TotalSeconds + utcOffset.TotalSeconds); + } + + #region EventHandlers + public static void MCI_MessageEventHandlers(MCI_Protocol e) + { + DelNfc_MCI_MessageHandler mciMessageHandler = new DelNfc_MCI_MessageHandler(OnHandler); + e.MessageEvent += mciMessageHandler; + } + + public static void ST25DV_MessageEventHandlers(ST25DV_Device e) + { + DelNfc_ST25DV_MessageHandler dvMessageHandler = new DelNfc_ST25DV_MessageHandler(OnHandler); + e.MessageEvent += dvMessageHandler; + } + + public static void CR95HF_MessageEventHandlers(CR95HF_Reader e) + { + DelNfc_CR95HF_MessageHandler hfMessageHandler = new DelNfc_CR95HF_MessageHandler(OnHandler); + e.MessageEvent += hfMessageHandler; + } + + public static void NFCHeadConfig_MessageEventHandlers(NFCHeadConfig e) + { + DelNfc_NFCHeadConfig_MessageHandler configMessageHandler = new DelNfc_NFCHeadConfig_MessageHandler(OnHandler); + e.MessageEvent += configMessageHandler; + } + + public static void MessageEventHandlers(NfcDataHandler e) + { + DelNfcMessageHandler nfcMessageHandler = new DelNfcMessageHandler(OnHandler); + e.MessageEvent += nfcMessageHandler; + } + + public static void OnHandler(object sender, NfcMessageEventArgs e) + { + if (e.Message == null) + return; + string message = e.Message.Replace("\n", " ").Replace("\r", ""); + rfidDataLogger.Debug(message); + } + #endregion + } +} diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/RfidServices.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/RfidServices.cs new file mode 100644 index 000000000..714697af5 --- /dev/null +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/RfidServices.cs @@ -0,0 +1,123 @@ +using Sensus.iPerl.RfidCom.Exceptions; +using Sensus.iPerl.RfidCom.Helper; +using Sensus.iPerl.RfidCom; +using System; +using System.Text.RegularExpressions; +using System.Threading; +using log4net; + +namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead +{ + internal class RfidServices + { + protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); + private static readonly ILog log = LogManager.GetLogger(typeof(iPerlCommunicationForm)); + + internal static int ReadRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, out byte[] buffer) + { + for (int i = 0; i < cfg.MaxCommRetries; i++) + { + rfidDataLogger.Error($"{iperlHead.CommInterface} Start {i} reading: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},{offset}, {length}... timeout {cfg.CommTimeout})"); + using (RfidLogic writer = new RfidLogic($"COM{iperlHead.RfidComPortNr}")) + { + try + { + byte[] response = writer.ReadRequest((byte)messageID, offset, length, cfg.CommTimeout); + string hexString = RfidHelper.ConvertByteArrayToHexString(response); + string swapHexString = RfidHelper.SwapHexcode(hexString); + string decString = RfidHelper.HexLiteral2Unsigned(RfidHelper.SwapHexcode(hexString)).ToString(); + + if (length > 10) + { + //if the result only contains "00"s we are working on the wrong COM port + // or the module just isn't connected + if (Regex.IsMatch(hexString, @"^(00)\1+$")) + { + rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) <- Error: No RFID signal."); + throw new RfidValidationException("Error_Rfid_NoSignal"); + } + + //if the result only contains "03"s the meter did not answer. + // Might be due to the module being positioned incorrectly. + if (Regex.IsMatch(hexString, @"^(03)\1+$")) + { + rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) <- Error: No meter signal."); + throw new RfidValidationException("Error_Rfid_NoAnswerFromMeter"); + } + } + + writer.ClosePort(); + buffer = response; + rfidDataLogger.Info($"{iperlHead.Name} ({iperlHead.SerialNr}): ReadRequestPort(COM{iperlHead.RfidComPortNr},...) returned HEX: {hexString}; SwapHexCodeToDecimal: {decString}"); + return 0; + } + catch (RfidDataNotAvailableException) + { + if (/*RfidHelper.IsPassThrough(messageID)*/ messageID == MessageID.ASICRegisterReadTest || messageID == MessageID.RadioPassthrough) + { + rfidDataLogger.Info($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) {(i > 0 ? "<- Error: Invalid Pass-Through data." : "<- Info: Wait for Pass-Through data.")}"); + Thread.Sleep(cfg.PassThroughWaitTime); + } + else + { + Thread.Sleep(cfg.WaitTimeAfterFailure); + } + } + catch (RfidValidationException) + { + Thread.Sleep(cfg.WaitTimeAfterFailure); + } + catch (Exception ex) + { + rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) {ex.Message}"); + Thread.Sleep(cfg.WaitTimeAfterFailure); + } + } + } + rfidDataLogger.Error($"{iperlHead.CommInterface} reading failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...)"); + log.Error($"{iperlHead.CommInterface} reading failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...)"); + buffer = new byte[length]; + return 3; + } + + internal static int WriteRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, byte[] buffer) + { + RfidLogic writer = new RfidLogic($"COM{iperlHead.RfidComPortNr}"); + string payload = RfidHelper.ConvertByteArrayToHexString(buffer); + + for (var i = 0; i < cfg.MaxCommRetries; i++) + { + rfidDataLogger.Error($"{iperlHead.CommInterface} Start {i} writting: COM{iperlHead.RfidComPortNr}: WriteRequest ({messageID},{offset}, {length}, {payload}... timeout {cfg.CommTimeout})"); + try + { + if (writer.ClosePort()) writer.OpenPort(); + writer.WriteRequest((byte)messageID, offset, length, buffer, cfg.CommTimeout, false); + writer.ClosePort(); + rfidDataLogger.InfoFormat($"{iperlHead.Name}({iperlHead.SerialNr},COM{iperlHead.RfidComPortNr}): WriteRequestPort({messageID}, {offset}, {length}, {payload})"); + return 0; + } + catch (Exception ex) + { + if (messageID == MessageID.RadioPassthrough || messageID == MessageID.ASICRegisterReadTest) + { + Thread.Sleep(1500); + } + else + { + rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: Error: {ex.Message}"); + Thread.Sleep(cfg.WaitTimeAfterFailure); + if (i > 1) + { + rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: Reopen the com port."); + writer.ClosePort(); + } + } + } + } + writer.ClosePort(); + rfidDataLogger.Error($"RFID writing failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: WriteRequestPort ({messageID},...) {System.Text.Encoding.UTF8.GetString(buffer)}"); + log.Error($"RFID writing failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: WriteRequestPort ({messageID},...) {System.Text.Encoding.UTF8.GetString(buffer)}"); + return 2; + } + } +} diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/SimulationServices.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/SimulationServices.cs new file mode 100644 index 000000000..5f6b46b69 --- /dev/null +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/SimulationServices.cs @@ -0,0 +1,61 @@ +using System; +using System.Linq; + +namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead +{ + internal class SimulationServices + { + const int Q2CorrFactorsAddr = 0x1878; + + internal static int ReadRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, out byte[] buffer) + { + byte[] configurationBuffer = new byte[ConfigStruct.Length] { 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + byte[] calibrationBuffer = new byte[CalibrationStructV4.Length] { 3, 0, 150, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 150, 10 }; + buffer = new byte[length]; + + if (messageID == MessageID.Configuration) + { + Array.Copy(GetPCB(iperlHead), 0, configurationBuffer, 16, 5); // set PCB Number according to iPerlHead configuration + Array.Copy(configurationBuffer,offset,buffer,0,length); + } + else if (messageID == MessageID.Calibration) + { + Array.Copy(calibrationBuffer, offset, buffer, 0, length); + } + else if ((messageID == MessageID.MetrologyMemory) && (offset == Q2CorrFactorsAddr) && (length == 2)) + { + buffer = new byte[2] { 0, 0 }; + } + else + { + buffer = new byte[length]; + } + + return iperlHead.Name.Equals("iPerl13") ? 2 : 0; /// Simulates an error on position 13 + } + + internal static int WriteRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, byte[] buffer) + { + return 0; + } + + private static Array GetPCB(IperlHead iperlHead) + { + string pcbStr = iperlHead.RfidComPortNr.ToString().PadRight(10,'0') + iperlHead.Position.ToString("D2"); + long decVal = Convert.ToInt64(pcbStr); + string nHexStr = decVal.ToString("X4"); + + string hexStr = ""; + for (int a = nHexStr.Length; a >= 1; a = a - 2) + { + hexStr = hexStr + nHexStr.Substring(a - 2, 2); + } + + return Enumerable.Range(0, hexStr.Length) + .Where(x => x % 2 == 0) + .Select(x => Convert.ToByte(hexStr.Substring(x, 2), 16)) + .ToArray(); + + } + } +} diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.designer.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.designer.cs new file mode 100644 index 000000000..2b24c92ce --- /dev/null +++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.designer.cs @@ -0,0 +1,581 @@ +/// +/// Copyright (c) 2021 Sensus Metering Systems +/// +namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation +{ + partial class RegValveCfgCtrl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.adcClosedLabel = new System.Windows.Forms.Label(); + this.adcClosedTextBox = new System.Windows.Forms.TextBox(); + this.adcOpenTextBox = new System.Windows.Forms.TextBox(); + this.adcOpenLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.storedPosReuseCheckBox = new System.Windows.Forms.CheckBox(); + this.stableTimeTextBox = new System.Windows.Forms.TextBox(); + this.stableTimeLabel = new System.Windows.Forms.Label(); + this.flowStableSecTextBox = new System.Windows.Forms.TextBox(); + this.flowStableSecLabel = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.setButton1 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.ADC = new System.Windows.Forms.Label(); + this.getButton1 = new System.Windows.Forms.Button(); + this.pctTextBox1 = new System.Windows.Forms.TextBox(); + this.adcTextBox1 = new System.Windows.Forms.TextBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.setButton2 = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.getButton2 = new System.Windows.Forms.Button(); + this.pctTextBox2 = new System.Windows.Forms.TextBox(); + this.adcTextBox2 = new System.Windows.Forms.TextBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.closeButton = new System.Windows.Forms.Button(); + this.openButton = new System.Windows.Forms.Button(); + this.adcTextBox = new System.Windows.Forms.TextBox(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.categoryComboBox = new System.Windows.Forms.ComboBox(); + this.categoryLabel = new System.Windows.Forms.Label(); + this.unitsComboBox = new System.Windows.Forms.ComboBox(); + this.unitsLabel = new System.Windows.Forms.Label(); + this.formatTextBox = new System.Windows.Forms.TextBox(); + this.formatLabel = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.regulMinStepsComboBox = new System.Windows.Forms.ComboBox(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(138, 114); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 8; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(28, 117); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(18, 13); + this.positionLabel.TabIndex = 7; + this.positionLabel.Text = "ID"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(28, 68); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 41); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 44); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(135, 14); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(89, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentName"; + // + // adcClosedLabel + // + this.adcClosedLabel.AutoSize = true; + this.adcClosedLabel.Location = new System.Drawing.Point(28, 141); + this.adcClosedLabel.Name = "adcClosedLabel"; + this.adcClosedLabel.Size = new System.Drawing.Size(93, 13); + this.adcClosedLabel.TabIndex = 9; + this.adcClosedLabel.Text = "ADC when Closed"; + // + // adcClosedTextBox + // + this.adcClosedTextBox.Enabled = false; + this.adcClosedTextBox.Location = new System.Drawing.Point(138, 138); + this.adcClosedTextBox.Name = "adcClosedTextBox"; + this.adcClosedTextBox.Size = new System.Drawing.Size(46, 20); + this.adcClosedTextBox.TabIndex = 10; + // + // adcOpenTextBox + // + this.adcOpenTextBox.Enabled = false; + this.adcOpenTextBox.Location = new System.Drawing.Point(138, 162); + this.adcOpenTextBox.Name = "adcOpenTextBox"; + this.adcOpenTextBox.Size = new System.Drawing.Size(46, 20); + this.adcOpenTextBox.TabIndex = 12; + // + // adcOpenLabel + // + this.adcOpenLabel.AutoSize = true; + this.adcOpenLabel.Location = new System.Drawing.Point(28, 165); + this.adcOpenLabel.Name = "adcOpenLabel"; + this.adcOpenLabel.Size = new System.Drawing.Size(87, 13); + this.adcOpenLabel.TabIndex = 11; + this.adcOpenLabel.Text = "ADC when Open"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(138, 65); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // storedPosReuseCheckBox + // + this.storedPosReuseCheckBox.AutoSize = true; + this.storedPosReuseCheckBox.Enabled = false; + this.storedPosReuseCheckBox.Location = new System.Drawing.Point(31, 262); + this.storedPosReuseCheckBox.Name = "storedPosReuseCheckBox"; + this.storedPosReuseCheckBox.Size = new System.Drawing.Size(162, 17); + this.storedPosReuseCheckBox.TabIndex = 17; + this.storedPosReuseCheckBox.Text = "Enable stored position re-use"; + this.storedPosReuseCheckBox.UseVisualStyleBackColor = true; + // + // stableTimeTextBox + // + this.stableTimeTextBox.Enabled = false; + this.stableTimeTextBox.Location = new System.Drawing.Point(138, 186); + this.stableTimeTextBox.Name = "stableTimeTextBox"; + this.stableTimeTextBox.Size = new System.Drawing.Size(46, 20); + this.stableTimeTextBox.TabIndex = 14; + // + // stableTimeLabel + // + this.stableTimeLabel.AutoSize = true; + this.stableTimeLabel.Location = new System.Drawing.Point(28, 189); + this.stableTimeLabel.Name = "stableTimeLabel"; + this.stableTimeLabel.Size = new System.Drawing.Size(81, 13); + this.stableTimeLabel.TabIndex = 13; + this.stableTimeLabel.Text = "Stable time [ms]"; + // + // flowStableSecTextBox + // + this.flowStableSecTextBox.Enabled = false; + this.flowStableSecTextBox.Location = new System.Drawing.Point(138, 210); + this.flowStableSecTextBox.Name = "flowStableSecTextBox"; + this.flowStableSecTextBox.Size = new System.Drawing.Size(46, 20); + this.flowStableSecTextBox.TabIndex = 16; + // + // flowStableSecLabel + // + this.flowStableSecLabel.AutoSize = true; + this.flowStableSecLabel.Location = new System.Drawing.Point(28, 213); + this.flowStableSecLabel.Name = "flowStableSecLabel"; + this.flowStableSecLabel.Size = new System.Drawing.Size(74, 13); + this.flowStableSecLabel.TabIndex = 15; + this.flowStableSecLabel.Text = "Flow stable [s]"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.setButton1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.ADC); + this.groupBox1.Controls.Add(this.getButton1); + this.groupBox1.Controls.Add(this.pctTextBox1); + this.groupBox1.Controls.Add(this.adcTextBox1); + this.groupBox1.Location = new System.Drawing.Point(10, 398); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(280, 59); + this.groupBox1.TabIndex = 19; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Measured value 1"; + // + // setButton1 + // + this.setButton1.Location = new System.Drawing.Point(229, 17); + this.setButton1.Name = "setButton1"; + this.setButton1.Size = new System.Drawing.Size(38, 33); + this.setButton1.TabIndex = 5; + this.setButton1.Text = "Set"; + this.setButton1.UseVisualStyleBackColor = true; + this.setButton1.Click += new System.EventHandler(this.setButton_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(209, 28); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(15, 13); + this.label1.TabIndex = 4; + this.label1.Text = "%"; + // + // ADC + // + this.ADC.AutoSize = true; + this.ADC.Location = new System.Drawing.Point(11, 28); + this.ADC.Name = "ADC"; + this.ADC.Size = new System.Drawing.Size(32, 13); + this.ADC.TabIndex = 3; + this.ADC.Text = "ADC:"; + // + // getButton1 + // + this.getButton1.Location = new System.Drawing.Point(101, 18); + this.getButton1.Name = "getButton1"; + this.getButton1.Size = new System.Drawing.Size(38, 33); + this.getButton1.TabIndex = 2; + this.getButton1.Text = "Get"; + this.getButton1.UseVisualStyleBackColor = true; + this.getButton1.Click += new System.EventHandler(this.getButton1_Click); + // + // pctTextBox1 + // + this.pctTextBox1.Location = new System.Drawing.Point(160, 24); + this.pctTextBox1.Name = "pctTextBox1"; + this.pctTextBox1.Size = new System.Drawing.Size(46, 20); + this.pctTextBox1.TabIndex = 1; + // + // adcTextBox1 + // + this.adcTextBox1.Location = new System.Drawing.Point(47, 24); + this.adcTextBox1.Name = "adcTextBox1"; + this.adcTextBox1.Size = new System.Drawing.Size(44, 20); + this.adcTextBox1.TabIndex = 0; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.setButton2); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Controls.Add(this.label3); + this.groupBox2.Controls.Add(this.getButton2); + this.groupBox2.Controls.Add(this.pctTextBox2); + this.groupBox2.Controls.Add(this.adcTextBox2); + this.groupBox2.Location = new System.Drawing.Point(10, 462); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(280, 59); + this.groupBox2.TabIndex = 20; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Measured value 2"; + // + // setButton2 + // + this.setButton2.Location = new System.Drawing.Point(229, 17); + this.setButton2.Name = "setButton2"; + this.setButton2.Size = new System.Drawing.Size(38, 33); + this.setButton2.TabIndex = 5; + this.setButton2.Text = "Set"; + this.setButton2.UseVisualStyleBackColor = true; + this.setButton2.Click += new System.EventHandler(this.setButton_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(209, 28); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(15, 13); + this.label2.TabIndex = 4; + this.label2.Text = "%"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(11, 27); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(32, 13); + this.label3.TabIndex = 3; + this.label3.Text = "ADC:"; + // + // getButton2 + // + this.getButton2.Location = new System.Drawing.Point(101, 18); + this.getButton2.Name = "getButton2"; + this.getButton2.Size = new System.Drawing.Size(38, 33); + this.getButton2.TabIndex = 2; + this.getButton2.Text = "Get"; + this.getButton2.UseVisualStyleBackColor = true; + this.getButton2.Click += new System.EventHandler(this.getButton2_Click); + // + // pctTextBox2 + // + this.pctTextBox2.Location = new System.Drawing.Point(160, 24); + this.pctTextBox2.Name = "pctTextBox2"; + this.pctTextBox2.Size = new System.Drawing.Size(46, 20); + this.pctTextBox2.TabIndex = 1; + // + // adcTextBox2 + // + this.adcTextBox2.Location = new System.Drawing.Point(47, 24); + this.adcTextBox2.Name = "adcTextBox2"; + this.adcTextBox2.Size = new System.Drawing.Size(44, 20); + this.adcTextBox2.TabIndex = 0; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.closeButton); + this.groupBox3.Controls.Add(this.openButton); + this.groupBox3.Location = new System.Drawing.Point(10, 527); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(280, 60); + this.groupBox3.TabIndex = 21; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Regulation valve"; + // + // closeButton + // + this.closeButton.Location = new System.Drawing.Point(14, 19); + this.closeButton.Name = "closeButton"; + this.closeButton.Size = new System.Drawing.Size(107, 28); + this.closeButton.TabIndex = 1; + this.closeButton.Text = "Close"; + this.closeButton.UseVisualStyleBackColor = true; + this.closeButton.Click += new System.EventHandler(this.closeButton_Click); + // + // openButton + // + this.openButton.Location = new System.Drawing.Point(160, 19); + this.openButton.Name = "openButton"; + this.openButton.Size = new System.Drawing.Size(107, 28); + this.openButton.TabIndex = 0; + this.openButton.Text = "Open"; + this.openButton.UseVisualStyleBackColor = true; + this.openButton.Click += new System.EventHandler(this.openButton_Click); + // + // adcTextBox + // + this.adcTextBox.Location = new System.Drawing.Point(47, 14); + this.adcTextBox.Name = "adcTextBox"; + this.adcTextBox.Size = new System.Drawing.Size(44, 20); + this.adcTextBox.TabIndex = 21; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.label4); + this.groupBox4.Controls.Add(this.adcTextBox); + this.groupBox4.Location = new System.Drawing.Point(10, 352); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(279, 40); + this.groupBox4.TabIndex = 22; + this.groupBox4.TabStop = false; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(11, 17); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(32, 13); + this.label4.TabIndex = 22; + this.label4.Text = "ADC:"; + // + // categoryComboBox + // + this.categoryComboBox.Enabled = false; + this.categoryComboBox.FormattingEnabled = true; + this.categoryComboBox.Location = new System.Drawing.Point(138, 90); + this.categoryComboBox.Name = "categoryComboBox"; + this.categoryComboBox.Size = new System.Drawing.Size(130, 21); + this.categoryComboBox.TabIndex = 6; + // + // categoryLabel + // + this.categoryLabel.AutoSize = true; + this.categoryLabel.Location = new System.Drawing.Point(28, 93); + this.categoryLabel.Name = "categoryLabel"; + this.categoryLabel.Size = new System.Drawing.Size(49, 13); + this.categoryLabel.TabIndex = 5; + this.categoryLabel.Text = "Category"; + // + // unitsComboBox + // + this.unitsComboBox.Enabled = false; + this.unitsComboBox.FormattingEnabled = true; + this.unitsComboBox.Location = new System.Drawing.Point(138, 309); + this.unitsComboBox.Name = "unitsComboBox"; + this.unitsComboBox.Size = new System.Drawing.Size(80, 21); + this.unitsComboBox.TabIndex = 32; + // + // unitsLabel + // + this.unitsLabel.AutoSize = true; + this.unitsLabel.Location = new System.Drawing.Point(28, 312); + this.unitsLabel.Name = "unitsLabel"; + this.unitsLabel.Size = new System.Drawing.Size(78, 13); + this.unitsLabel.TabIndex = 31; + this.unitsLabel.Text = "Unit of setpoint"; + // + // formatTextBox + // + this.formatTextBox.Enabled = false; + this.formatTextBox.Location = new System.Drawing.Point(138, 285); + this.formatTextBox.Name = "formatTextBox"; + this.formatTextBox.Size = new System.Drawing.Size(130, 20); + this.formatTextBox.TabIndex = 30; + // + // formatLabel + // + this.formatLabel.AutoSize = true; + this.formatLabel.Location = new System.Drawing.Point(28, 288); + this.formatLabel.Name = "formatLabel"; + this.formatLabel.Size = new System.Drawing.Size(78, 13); + this.formatLabel.TabIndex = 29; + this.formatLabel.Text = "Setpoint format"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(28, 239); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(110, 13); + this.label5.TabIndex = 33; + this.label5.Text = "Regul. min. steps [ms]"; + // + // regulMinStepsComboBox + // + this.regulMinStepsComboBox.Enabled = false; + this.regulMinStepsComboBox.FormattingEnabled = true; + this.regulMinStepsComboBox.Location = new System.Drawing.Point(138, 236); + this.regulMinStepsComboBox.Name = "regulMinStepsComboBox"; + this.regulMinStepsComboBox.Size = new System.Drawing.Size(80, 21); + this.regulMinStepsComboBox.TabIndex = 34; + this.regulMinStepsComboBox.SelectedIndexChanged += new System.EventHandler(this.regulMinStepsComboBox_SelectedIndexChanged); + // + // RegValveCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.regulMinStepsComboBox); + this.Controls.Add(this.label5); + this.Controls.Add(this.unitsComboBox); + this.Controls.Add(this.unitsLabel); + this.Controls.Add(this.formatTextBox); + this.Controls.Add(this.formatLabel); + this.Controls.Add(this.categoryComboBox); + this.Controls.Add(this.categoryLabel); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.flowStableSecTextBox); + this.Controls.Add(this.flowStableSecLabel); + this.Controls.Add(this.stableTimeTextBox); + this.Controls.Add(this.stableTimeLabel); + this.Controls.Add(this.storedPosReuseCheckBox); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.adcOpenTextBox); + this.Controls.Add(this.adcOpenLabel); + this.Controls.Add(this.adcClosedTextBox); + this.Controls.Add(this.adcClosedLabel); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "RegValveCfgCtrl"; + this.Size = new System.Drawing.Size(300, 700); + this.Load += new System.EventHandler(this.RegulationValveCfgCtrl_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label adcClosedLabel; + private System.Windows.Forms.TextBox adcClosedTextBox; + private System.Windows.Forms.TextBox adcOpenTextBox; + private System.Windows.Forms.Label adcOpenLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.CheckBox storedPosReuseCheckBox; + private System.Windows.Forms.TextBox stableTimeTextBox; + private System.Windows.Forms.Label stableTimeLabel; + private System.Windows.Forms.TextBox flowStableSecTextBox; + private System.Windows.Forms.Label flowStableSecLabel; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button setButton1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label ADC; + private System.Windows.Forms.Button getButton1; + private System.Windows.Forms.TextBox pctTextBox1; + private System.Windows.Forms.TextBox adcTextBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Button setButton2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button getButton2; + private System.Windows.Forms.TextBox pctTextBox2; + private System.Windows.Forms.TextBox adcTextBox2; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Button closeButton; + private System.Windows.Forms.Button openButton; + private System.Windows.Forms.TextBox adcTextBox; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox categoryComboBox; + private System.Windows.Forms.Label categoryLabel; + private System.Windows.Forms.ComboBox unitsComboBox; + private System.Windows.Forms.Label unitsLabel; + private System.Windows.Forms.TextBox formatTextBox; + private System.Windows.Forms.Label formatLabel; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.ComboBox regulMinStepsComboBox; + } +} diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.resx b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBFTests/bin/Debug/SampleConfig/log4netConfig.xml b/TBFTests/bin/Debug/SampleConfig/log4netConfig.xml index 338d53558..44205cd62 100644 --- a/TBFTests/bin/Debug/SampleConfig/log4netConfig.xml +++ b/TBFTests/bin/Debug/SampleConfig/log4netConfig.xml @@ -38,12 +38,20 @@ + + + + + - + + + +