diff --git a/Results/Entities/MeterTestRslt.cs b/Results/Entities/MeterTestRslt.cs index 42e462415..c6a7f650d 100644 --- a/Results/Entities/MeterTestRslt.cs +++ b/Results/Entities/MeterTestRslt.cs @@ -31,7 +31,16 @@ namespace Results.Entities public virtual bool TestDone { get; set; } /// true = test was completed public virtual bool Passed { get; set; } /// true = test passed, water meter is OK #if IPERL - public virtual string ExtraDataPath { get; set; } /// Relative path to a file with opto-data/raw-data + 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; } + public virtual float X3 { get; set; } + public virtual float X4 { get; set; } + public virtual float X5 { get; set; } + public virtual float X6 { get; set; } + public virtual float X7 { get; set; } + public virtual float X8 { get; set; } + public virtual float X9 { get; set; } #endif #if ORACLE_DB public virtual double LastError { get; set; } /// [%] Previous test error at this Q in case Pruefindex > 1 @@ -43,9 +52,9 @@ namespace Results.Entities /// /// Wrappers /// - public virtual string Name() { return TestRslt.Name(); } + public virtual string Name() { return TestRslt.Name(); } public virtual DateTime StartTime() { return TestRslt.StartTime; } - public virtual DateTime EndTime() { return TestRslt.EndTime; } + public virtual DateTime EndTime() { return TestRslt.EndTime; } public virtual double FlowSetTime() { return TestRslt.FlowSetTime; } /// [s] public virtual double FlowMass() { return TestRslt.FlowMass; } /// [kg/h] public virtual double FlowVolume() { return TestRslt.FlowVolume; } /// [m3/h] @@ -145,6 +154,15 @@ namespace Results.Entities Passed = oriMTR.Passed; #if IPERL ExtraDataPath = oriMTR.ExtraDataPath; + X1 = oriMTR.X1; + X2 = oriMTR.X2; + X3 = oriMTR.X3; + X4 = oriMTR.X4; + X5 = oriMTR.X5; + X6 = oriMTR.X6; + X7 = oriMTR.X7; + X8 = oriMTR.X8; + X9 = oriMTR.X9; #endif #if ORACLE_DB LastError = oriMTR.LastError; @@ -175,6 +193,15 @@ namespace Results.Entities Passed = src.Passed; #if IPERL ExtraDataPath = src.ExtraDataPath; + X1 = src.X1; + X2 = src.X2; + X3 = src.X3; + X4 = src.X4; + X5 = src.X5; + X6 = src.X6; + X7 = src.X7; + X8 = src.X8; + X9 = src.X9; #endif #if ORACLE_DB LastError = src.LastError; @@ -209,6 +236,15 @@ namespace Results.Entities writer.Write(Passed); #if IPERL writer.Write((ExtraDataPath != null) ? ExtraDataPath : string.Empty); + writer.Write(X1); + writer.Write(X2); + writer.Write(X3); + writer.Write(X4); + writer.Write(X5); + writer.Write(X6); + writer.Write(X7); + writer.Write(X8); + writer.Write(X9); #endif #if ORACLE_DB writer.Write(LastError); @@ -240,6 +276,15 @@ namespace Results.Entities Passed = reader.ReadBoolean(); #if IPERL ExtraDataPath = reader.ReadString(); + X1 = reader.ReadSingle(); + X2 = reader.ReadSingle(); + X3 = reader.ReadSingle(); + X4 = reader.ReadSingle(); + X5 = reader.ReadSingle(); + X6 = reader.ReadSingle(); + X7 = reader.ReadSingle(); + X8 = reader.ReadSingle(); + X9 = reader.ReadSingle(); #endif #if ORACLE_DB LastError = reader.ReadDouble(); diff --git a/Results/Mappings/MeterTestRsltMap.cs b/Results/Mappings/MeterTestRsltMap.cs index 987123217..4225181d7 100644 --- a/Results/Mappings/MeterTestRsltMap.cs +++ b/Results/Mappings/MeterTestRsltMap.cs @@ -28,6 +28,15 @@ namespace Results.Mappings Map(x => x.Passed); #if IPERL Map(x => x.ExtraDataPath); + Map(x => x.X1); + Map(x => x.X2); + Map(x => x.X3); + Map(x => x.X4); + Map(x => x.X5); + Map(x => x.X6); + Map(x => x.X7); + Map(x => x.X8); + Map(x => x.X9); #endif #if ORACLE_DB Map(x => x.LastError); diff --git a/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs b/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs index 4c3f8fd9f..b5c6c073d 100644 --- a/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs +++ b/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// Copyright (c) 2013-2021 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; @@ -620,6 +620,15 @@ namespace TBF.BenchControl.TestMethods.FlyingStart #if IPERL meterRslt.WaterMeter.CalibFactor = iPerl.CalibFactor; meterRslt.ExtraDataPath = iPerl.ExtraDataPath; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 1) meterRslt.X1 = iPerl.X[0]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 2) meterRslt.X2 = iPerl.X[1]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 3) meterRslt.X3 = iPerl.X[2]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 4) meterRslt.X4 = iPerl.X[3]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 5) meterRslt.X5 = iPerl.X[4]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 6) meterRslt.X6 = iPerl.X[5]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 7) meterRslt.X7 = iPerl.X[6]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 8) meterRslt.X8 = iPerl.X[7]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 9) meterRslt.X9 = iPerl.X[8]; #endif iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result iPerl.LastTestResult = meterRslt; /// Save this test result @@ -737,9 +746,12 @@ namespace TBF.BenchControl.TestMethods.FlyingStart /// /// Quit this sequence /// - if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError - || retVal == Event.RecoverableError || retVal == Event.ErrorFlagsStop - || retVal == Event.Error || retVal == Event.ConfigurationError) + if (isLastRepetition || retVal == Event.UiCmdStop + || retVal == Event.OpArgumentError + || retVal == Event.RecoverableError + || retVal == Event.ErrorFlagsStop + || retVal == Event.Error + || retVal == Event.ConfigurationError) { State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) .AddOperation(checkUiOp) diff --git a/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs b/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs index 5c27d8e0b..7407cac94 100644 --- a/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs +++ b/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2018-2020 Sensus Slovensko a.s. +/// Copyright (c) 2018-2021 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; @@ -1029,6 +1029,15 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged #if IPERL meterRslt.WaterMeter.CalibFactor = iPerl.CalibFactor; meterRslt.ExtraDataPath = iPerl.ExtraDataPath; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 1) meterRslt.X1 = iPerl.X[0]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 2) meterRslt.X2 = iPerl.X[1]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 3) meterRslt.X3 = iPerl.X[2]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 4) meterRslt.X4 = iPerl.X[3]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 5) meterRslt.X5 = iPerl.X[4]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 6) meterRslt.X6 = iPerl.X[5]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 7) meterRslt.X7 = iPerl.X[6]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 8) meterRslt.X8 = iPerl.X[7]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 9) meterRslt.X9 = iPerl.X[8]; #endif iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result iPerl.LastTestResult = meterRslt; /// Save this test result @@ -1139,9 +1148,12 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged /// /// Quit this sequence /// - if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError - || retVal == Event.RecoverableError || retVal == Event.ErrorFlagsStop - || retVal == Event.Error || retVal == Event.ConfigurationError) + if (isLastRepetition || retVal == Event.UiCmdStop + || retVal == Event.OpArgumentError + || retVal == Event.RecoverableError + || retVal == Event.ErrorFlagsStop + || retVal == Event.Error + || retVal == Event.ConfigurationError) { State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) .AddOperation(checkUiOp) diff --git a/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs index 6793a73ba..490654c66 100644 --- a/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs +++ b/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// Copyright (c) 2013-2021 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; @@ -955,6 +955,15 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection #if IPERL meterRslt.WaterMeter.CalibFactor = iPerl.CalibFactor; meterRslt.ExtraDataPath = iPerl.ExtraDataPath; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 1) meterRslt.X1 = iPerl.X[0]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 2) meterRslt.X2 = iPerl.X[1]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 3) meterRslt.X3 = iPerl.X[2]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 4) meterRslt.X4 = iPerl.X[3]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 5) meterRslt.X5 = iPerl.X[4]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 6) meterRslt.X6 = iPerl.X[5]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 7) meterRslt.X7 = iPerl.X[6]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 8) meterRslt.X8 = iPerl.X[7]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 9) meterRslt.X9 = iPerl.X[8]; #endif iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result iPerl.LastTestResult = meterRslt; /// Save this test result @@ -1086,9 +1095,12 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection /// /// Quit this sequence /// - if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError - || retVal == Event.RecoverableError || retVal == Event.ErrorFlagsStop - || retVal == Event.Error || retVal == Event.ConfigurationError) + if (isLastRepetition || retVal == Event.UiCmdStop + || retVal == Event.OpArgumentError + || retVal == Event.RecoverableError + || retVal == Event.ErrorFlagsStop + || retVal == Event.Error + || retVal == Event.ConfigurationError) { State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) .AddOperation(checkUiOp) diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs index ac0a65bf2..11a89bd77 100644 --- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs +++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs @@ -29,6 +29,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead public const int StartOptoDataCount = MaxOptoDataCount / 2; public const int EndOptoDataCount = MaxOptoDataCount - StartOptoDataCount; public const int StartEndFilterSamplesCount2 = 20; /// StartEndFilterSamplesCount = 2 * StartEndFilterSamplesCount2 + 1 + public const int FeatureVectorSize = 9; readonly IperlHeadCfg iperlHeadCfg; @@ -79,6 +80,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead string extraDataPath; public string ExtraDataPath { get { return extraDataPath; } } + float[] x; + public float[] X { get { return x; } } + /// /// Passed to OptoTelegramRaw.UpdateFromString(...) @@ -353,6 +357,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead : base(cfg) { iperlHeadCfg = cfg as IperlHeadCfg; + x = new float[FeatureVectorSize]; } public override void Initialize() @@ -413,6 +418,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead Q2CorrRL = 0; Q2CorrLR = 0; + /// Clear the data buffer optoDataCount = 0; currentFlowDir = InitFlowDir; @@ -513,6 +519,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead timestampSec = 0; timestampSec0 = 0; + /// Clear the feature vector + for (int i = 0; i < FeatureVectorSize; i++) x[i] = 0; + ReadPulses(); } @@ -624,6 +633,8 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead optoData[endIx].Flags = OptoTelegramFlags.OK_TestEnd; } + log.DebugFormat("Flow filtering start: {0:HH:mm:ss.fff}", DateTime.Now); + StopParsingOptoSerialPort(); if (optoDataCount <= MaxOptoDataCount) { @@ -635,8 +646,16 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead OptoTelegramRaw.FIRFilterFlow(optoData, (optoDataCount - EndOptoDataCount), optoDataCount - 1); } + log.DebugFormat("Flow filtering end, feature vector calculation start: {0:HH:mm:ss.fff}", DateTime.Now); + + CalculateFeatureVector(optoData, optoDataCount, startIx, endIx, ref x); + + log.DebugFormat("Feature vector calculation end, save opto-file start: {0:HH:mm:ss.fff}", DateTime.Now); + extraDataPath = SaveOptoData(); + log.DebugFormat("Save opto-file end: {0:HH:mm:ss.fff}", DateTime.Now); + if (TestStartTelegramIx == 0 || optoDataCount < 100) { ResultCode |= (int)Results.Entities.ResultCode.MissingOptoData; @@ -647,10 +666,51 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead } } + void CalculateFeatureVector(OptoTelegramRaw[] optoData, int optoDataCount, int startIx, int endIx, ref float[] x) + { + if (startIx < 0 || endIx >= optoDataCount || startIx >= endIx) return; + + int n = 0; + Int64 sumFlow = 0; + Int64 sumFlow2 = 0; + Int64 sumEmf = 0; + Int64 sumEmf2 = 0; + Int64 sumMagF = 0; + Int64 sumMagF2 = 0; + Int64 sumImp = 0; + Int64 sumImp2 = 0; + + for (int ix = startIx; ix <= endIx; ix++) + { + if (optoData[ix].Flags == OptoTelegramFlags.OK || + optoData[ix].Flags == OptoTelegramFlags.OK_TestStart || + optoData[ix].Flags == OptoTelegramFlags.OK_TestEnd) + { + n++; + sumFlow += optoData[ix].FlowRaw; + sumFlow2 += ((int)optoData[ix].FlowRaw * (int)optoData[ix].FlowRaw); + sumEmf += (int)optoData[ix].EmfRaw; + sumEmf2 += ((Int64)optoData[ix].EmfRaw * (Int64)optoData[ix].EmfRaw); + sumMagF += optoData[ix].MagneticFieldRaw; + sumMagF2 += ((int)optoData[ix].MagneticFieldRaw * (int)optoData[ix].MagneticFieldRaw); + sumImp += optoData[ix].Impedance; + sumImp2 += ((int)optoData[ix].Impedance * (int)optoData[ix].Impedance); + } + } + + if (n >= 2) + { + if (x.Length > 0) x[0] = ((float)sumFlow2 - (float)sumFlow * (float)sumFlow / n) / (n - 1); + if (x.Length > 1) x[1] = ((float)sumEmf2 - (float)sumEmf * (float)sumEmf / n) / (n - 1); + if (x.Length > 2) x[2] = ((float)sumMagF2 - (float)sumMagF * (float)sumMagF / n) / (n - 1); + if (x.Length > 3) x[3] = ((float)sumImp2 - (float)sumImp * (float)sumImp / n) / (n - 1); + } + } + /// /// Save opto data to a file. /// - string SaveOptoData() + string SaveOptoData() { if (!string.IsNullOrEmpty(optoDataLogFileName)) { diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index e37104c94..92ddd23d6 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.26.1688.0")] -[assembly: AssemblyFileVersion("2.26.1688.0")] +[assembly: AssemblyVersion("2.26.1691.0")] +[assembly: AssemblyFileVersion("2.26.1691.0")]