<Merge-fix> Solve merge conflicts

This commit is contained in:
2026-09-09 17:27:35 +02:00
64 changed files with 12689 additions and 741 deletions
@@ -12,6 +12,8 @@ using TBF.Rig;
using TBF.Rig.GenericDevices;
using TBF.Boxes;
using TBF.Resources;
using TBF.Rig.RegisterReaders.GenesisRegReader.implementations;
using TBF.Rig.Sequences;
using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common;
using TBF.UiBridge;
@@ -464,6 +466,11 @@ namespace TBF.Rig.TestMethods.FlyingStart
}
while (!e.Contains(Event.TestCompleted) && !e.Contains(Event.Next)); /// 'Next' button is enabled in Debug version only
//------------------------------------------------
Bridge.OnActivity(this, Strings.Test_in_calculation);
//------------------------------------------------
/// Measurement loop end
StopRecordingStatistics();
@@ -532,7 +539,7 @@ namespace TBF.Rig.TestMethods.FlyingStart
tstRslt.TimeBtwnMassMsrmnts = 0;
tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient
tstRslt.VolumeMaster = tstRslt.ConstMasterRaw * tstRslt.PulsesMaster; /// [l] volume from the master flow meter
double flowMID = 3.6 * tstRslt.VolumeMaster / tstRslt.TestTime; /// [m3/h]
double flowMID = tstRslt.TestTime == 0 ? 0 : 3.6 * tstRslt.VolumeMaster / tstRslt.TestTime; /// [m3/h]
/// Corrected data
tstRslt.MassStart = 0;
@@ -542,7 +549,7 @@ namespace TBF.Rig.TestMethods.FlyingStart
/// Main result calculation
tstRslt.VolumeCTV = tstRslt.ConstMasterCorr * tstRslt.PulsesMaster; /// [l] 1000.0f is because density is in [kg/m3]
tstRslt.Flow = 3.6 * tstRslt.VolumeCTV / tstRslt.TestTime;
tstRslt.Flow = tstRslt.TestTime==0 ? 0 : 3.6 * tstRslt.VolumeCTV / tstRslt.TestTime;
tstRslt.ErrorMaster = 0.0; /// Not available without a mass measurement
tstRslt.ConstMaster = tstRslt.ConstMasterCorr;
@@ -660,6 +667,7 @@ namespace TBF.Rig.TestMethods.FlyingStart
TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = regReader as TestMethods.iPerlCommunication.iPerlHead.IperlHead;
GenericDevices.IRegReaderLiveCamera cameraRoi = regReader as GenericDevices.IRegReaderLiveCamera;
//GenesisHead Genesis = regReader as GenesisHead;
TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader GenesisSmart = regReader as TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader;
if (meterRslt != null && regReader != null)
{
@@ -711,6 +719,24 @@ namespace TBF.Rig.TestMethods.FlyingStart
Genesis.Log(" MeterError = " + calError.ToString() + " %");
}
else*/
if (GenesisSmart != null)
{
log.Debug("GenesisSmart - store data on end!");
int CH1=0, CH2=1, CH3=2;
CalculateMeterResults(meterRslt, GenesisSmart, tstRslt,GenesisSmart.TimestampSecStart, GenesisSmart.TimestampSecEnd, GenesisSmart.VolumeLtrStart, GenesisSmart.VolumeLtrEnd);
//Init Calculate Calibration
GenesisSmart.RefVolume = meterRslt.VolumeRef;
GenesisSmart.RefTime = meterRslt.TestTime;
//Store Raw Calibration Data to database
WaterMeterParentCopy(i, CH1,testName,meterRslt,GenesisSmart,tstRslt);
WaterMeterParentCopy(i, CH2,testName,meterRslt,GenesisSmart,tstRslt);
WaterMeterParentCopy(i, CH3,testName,meterRslt,GenesisSmart,tstRslt);
}
else
{
if (dstrReader != null)
{
@@ -918,6 +944,217 @@ namespace TBF.Rig.TestMethods.FlyingStart
// }
// }
private const int CountCh = 3;
private static void WaterMeterParentCopy(int i, int iCH, string testName, MeterTestRslt meterRslt,
GenesisSmartReader genesisSmart,
TestRslt tstRslt)
{
try
{
WaterMeter waterMeterParent = BatchRslts.Batch.WaterMeters[i];
int wmNrChX = (i * CountCh) + BatchRslts.WMPositionsCount + iCH + 1;
String sSerialNr =
(string.IsNullOrEmpty(waterMeterParent.SerialNr) ? (i + 1).ToString() : waterMeterParent.SerialNr) +
"_CH" + (iCH + 1);
WaterMeter chXWaterMeter = null;
//------ add new water meter to batch ------
if (BatchRslts.Batch.WaterMeters.Count < wmNrChX || BatchRslts.Batch.WaterMeters[wmNrChX - 1] == null)
{
log.Debug("add new water meter to batch, CH = " + (iCH + 1) + " CH = " + wmNrChX);
chXWaterMeter = new WaterMeter()
{
MeterTestRslts = new List<MeterTestRslt>(),
};
//This will delete each setting before
chXWaterMeter.CopyContentFrom(waterMeterParent);
chXWaterMeter.Batch = BatchRslts.Batch;
chXWaterMeter.WaterMeterData = waterMeterParent.WaterMeterData;
chXWaterMeter.SerialNr = sSerialNr;
chXWaterMeter.WMPosition = wmNrChX;
chXWaterMeter.Q3Channel = iCH + 1;
chXWaterMeter.YearOfProduction = waterMeterParent.YearOfProduction;
chXWaterMeter.Disabled = false;
BatchRslts.Batch.WaterMeters.Add(chXWaterMeter);
}
else
{
chXWaterMeter = BatchRslts.Batch.WaterMeters[wmNrChX - 1];
chXWaterMeter.Batch = BatchRslts.Batch;
chXWaterMeter.WaterMeterData = waterMeterParent.WaterMeterData;
chXWaterMeter.SerialNr = sSerialNr;
chXWaterMeter.WMPosition = wmNrChX;
chXWaterMeter.Q3Channel = iCH + 1;
chXWaterMeter.YearOfProduction = waterMeterParent.YearOfProduction;
chXWaterMeter.Disabled = false;
}
//~------ add new water meter to batch ------~
//create copy of meterRslt and add to additionalResultsByChannel
MeterTestRslt meterTestRsltChX = new MeterTestRslt(chXWaterMeter, meterRslt.TestRslt,
(CompoundMeterId)meterRslt.CompoundMeterId);
meterTestRsltChX.Q3Channel = iCH + 1;
chXWaterMeter.MeterTestRslts.Add(meterTestRsltChX);
MeterTestRslt chanelXMeterRslt =
BatchRslts.GetMeterTestRslt(testName, wmNrChX - 1, Common.CompoundMeterId.Single);
if (chanelXMeterRslt != null)
{
chanelXMeterRslt?.CopyContentFrom(meterRslt);
if (iCH == 0)
{
chanelXMeterRslt.Q3Channel = 1;
CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt,
genesisSmart.TimestampSecStartRawCh1,
genesisSmart.TimestampSecEndRawCh1, genesisSmart.VolumeLtrStartRawCh1,
genesisSmart.VolumeLtrEndRawCh1);
try
{
TestRsltCalibFactor testRsltCalibFactor = null;
if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 0)
{
testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[0];
}
else
{
//store in table
testRsltCalibFactor = new TestRsltCalibFactor();
tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor);
testRsltCalibFactor.CalibFactorIndex = 1;
}
testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt;
testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh1;
testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh1;
testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh1;
testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh1;
testRsltCalibFactor.Error = chanelXMeterRslt.Error;
}
catch (Exception ex)
{
log.Error("Error in store to DB result set CH1", ex);
}
}
else if (iCH == 1)
{
chanelXMeterRslt.Q3Channel = 2;
CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt,
genesisSmart.TimestampSecStartRawCh2,
genesisSmart.TimestampSecEndRawCh2, genesisSmart.VolumeLtrStartRawCh2,
genesisSmart.VolumeLtrEndRawCh2);
try
{
TestRsltCalibFactor testRsltCalibFactor = null;
if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 1)
{
testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[1];
}
else
{
//store in table
testRsltCalibFactor = new TestRsltCalibFactor();
tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor);
testRsltCalibFactor.CalibFactorIndex = 2;
}
testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt;
testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh2;
testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh2;
testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh2;
testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh2;
testRsltCalibFactor.Error = chanelXMeterRslt.Error;
}
catch (Exception ex)
{
log.Error("Error in store to DB result set CH2", ex);
}
}
else if (iCH == 2)
{
chanelXMeterRslt.Q3Channel = 3;
CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt,
genesisSmart.TimestampSecStartRawCh3,
genesisSmart.TimestampSecEndRawCh3, genesisSmart.VolumeLtrStartRawCh3,
genesisSmart.VolumeLtrEndRawCh3);
try
{
TestRsltCalibFactor testRsltCalibFactor = null;
if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 2)
{
testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[2];
}
else
{
//store in table
testRsltCalibFactor = new TestRsltCalibFactor();
tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor);
testRsltCalibFactor.CalibFactorIndex = 3;
}
testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt;
testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh3;
testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh3;
testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh3;
testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh3;
testRsltCalibFactor.Error = chanelXMeterRslt.Error;
}
catch (Exception ex)
{
log.Error("Error in store to DB result set CH3", ex);
}
}
if (!genesisSmart.EnableShowChanels)
{
chXWaterMeter.Disabled = !genesisSmart.EnableShowChanels;
//meterTestRsltChX.TestDone = false;
}
else
{
chXWaterMeter.Disabled = false;
meterTestRsltChX.TestDone = true;
}
meterTestRsltChX.Passed = meterRslt.Passed;
}
}
catch (Exception ex)
{
log.Error("Error in WaterMeterParentCopy", ex);
}
}
private static void CalculateMeterResults(MeterTestRslt meterRslt, IRegReaderDatastream dstrReader, TestRslt tstRslt, double dstrReaderTimestampSecStart, double dstrReaderTimestampSecEnd, double dstrReaderVolumeLtrStart, double dstrReaderVolumeLtrEnd)
{
try
{
meterRslt.TimestampStart = dstrReaderTimestampSecStart;
meterRslt.TimestampEnd = !dstrReader.NoSamples
? dstrReaderTimestampSecEnd
: (dstrReaderTimestampSecStart + tstRslt.TestTime);
meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart;
meterRslt.VolumeStart = dstrReaderVolumeLtrStart; /// liter
meterRslt.VolumeEnd = dstrReaderVolumeLtrEnd; /// liter
meterRslt.VolumeMeter =
Math.Abs(dstrReaderVolumeLtrEnd - dstrReaderVolumeLtrStart);
meterRslt.VolumeRef = tstRslt.TestTime == 0
? tstRslt.VolumeCTV
: tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime;
meterRslt.PulsesMaster = tstRslt.TestTime == 0
? tstRslt.PulsesMaster
: tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime;
meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter,
meterRslt.VolumeRef); // Error based on volume difference
}catch(Exception ex)
{
log.Error($"Error in calculate meter results, meterRslt.Name:{meterRslt.Name()} Calculation Bug Detail:", ex);
}
}
IList<Event> Simulate(Config.Entities.Test test, int repetitionNr, bool isLastRepetition,
Compound.TestParams compoundTestParams,
@@ -943,6 +1180,14 @@ namespace TBF.Rig.TestMethods.FlyingStart
else if (test.Name.ToLower().Contains("q1")) MakeSimulated(test, 1, 0, -5.1f);
else MakeSimulated(test, 1, 0, 0.9f);
//TODO bumi do simulate foe Q3 Calibration
///
/// Single meters
///
SimulateQ3CalibrationData(test,1, 0, -5.1f);
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Completed));
Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0)));
allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file
@@ -958,5 +1203,46 @@ namespace TBF.Rig.TestMethods.FlyingStart
return new List<Event> { TestAndLogUiCmdStop(test, e) ? Event.UiCmdStop : Event.Done };
}
private void SimulateQ3CalibrationData(Test test,int repetitionNr, int part, float errorPctBase)
{
string testName = test.Name;
string fullTestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr);
Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(fullTestName, part);
Results.Utils.GetCounterStates(tstRslt, Program.LocalSettings.Counters);
for (int i = 0; i < BatchRslts.WMPositionsCount; i++)
{
if (!test.IsPartCompatible(Utils.PartNr(i + 1, BatchRslts.Batch.Compound))) continue;
Results.Entities.MeterTestRslt meterRslt =
BatchRslts.GetMeterTestRslt(testName, i, Common.CompoundMeterId.Single);
GenericDevices.IRegReader regReader = sensPath.RegisterReaders[i];
TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader GenesisSmart =
regReader as TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader;
if (GenesisSmart != null)
{
log.Debug("GenesisSmart - store data on end!");
int CH1 = 0, CH2 = 1, CH3 = 2;
CalculateMeterResults(meterRslt, GenesisSmart, tstRslt, GenesisSmart.TimestampSecStart,
GenesisSmart.TimestampSecEnd, GenesisSmart.VolumeLtrStart, GenesisSmart.VolumeLtrEnd);
//Init Calculate Calibration
GenesisSmart.RefVolume = meterRslt.VolumeRef;
GenesisSmart.RefTime = meterRslt.TestTime;
//Store Raw Calibration Data to database
WaterMeterParentCopy(i, CH1, testName, meterRslt, GenesisSmart, tstRslt);
WaterMeterParentCopy(i, CH2, testName, meterRslt, GenesisSmart, tstRslt);
WaterMeterParentCopy(i, CH3, testName, meterRslt, GenesisSmart, tstRslt);
}
}
}
}
}
@@ -18,6 +18,7 @@ using TBF.Rig.GenericDevices;
using TBF.Rig.RegisterReaders.GenesisRegReader.implementations;
using TBF.Rig.RegisterReaders.PoseidonReader;
using TBF.Rig.RegisterReaders.PoseidonReader.implementations;
using TBF.Rig.Sequences;
using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common;
using TBF.UiBridge;
@@ -1106,12 +1107,13 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection
bUpgradeCountOfMeters = true;
int CH1=0, CH2=1, CH3=2;
//BatchRslts.Batch.WaterMeters.Add(ch1WaterMeter); //[i + BatchRslts.WMPositionsCount + CH1 + 1]
//BatchRslts.Batch.WaterMeters.Add(ch1WaterMeter); //[i + BatchRslts.WMPositionsCount + CH2 + 1]
//BatchRslts.Batch.WaterMeters.Add(ch1WaterMeter); //[i + BatchRslts.WMPositionsCount + CH3 + 1]
CalculateMeterResults(meterRslt, GenesisSmart, tstRslt,GenesisSmart.TimestampSecStart, GenesisSmart.TimestampSecEnd, GenesisSmart.VolumeLtrStart, GenesisSmart.VolumeLtrEnd);
//Init Calculate Calibration
GenesisSmart.RefVolume = meterRslt.VolumeRef;
GenesisSmart.RefTime = meterRslt.TestTime;
//Store Raw Calibration Data to database
WaterMeterParentCopy(i, CH1,testName,meterRslt,GenesisSmart,tstRslt);
WaterMeterParentCopy(i, CH2,testName,meterRslt,GenesisSmart,tstRslt);
WaterMeterParentCopy(i, CH3,testName,meterRslt,GenesisSmart,tstRslt);
@@ -1179,6 +1181,7 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection
}
#if IPERL
meterRslt.WaterMeter.CalibFactor = iPerl.CalibFactor;
meterRslt.WaterMeter.CalibFactorNominal = iPerl.CalibFactorNominal;
meterRslt.FlipMode = iPerl.ConfigStruct != null && iPerl.ConfigStruct.FlipMode.HasValue
? (int?)iPerl.ConfigStruct.FlipMode.Value
: null;
@@ -1375,91 +1378,212 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection
GenesisSmartReader genesisSmart,
TestRslt tstRslt)
{
WaterMeter waterMeterParent = BatchRslts.Batch.WaterMeters[i];
int wmNrChX = (i*CountCh) + BatchRslts.WMPositionsCount + iCH + 1;
String sSerialNr = waterMeterParent.SerialNr + "_CH" + (iCH + 1);
WaterMeter chXWaterMeter = null;
//------ add new water meter to batch ------
if (BatchRslts.Batch.WaterMeters.Count < wmNrChX || BatchRslts.Batch.WaterMeters[wmNrChX-1] == null)
try
{
log.Debug("add new water meter to batch, CH = " + (iCH + 1) + " CH = " + wmNrChX);
chXWaterMeter = new WaterMeter()
WaterMeter waterMeterParent = BatchRslts.Batch.WaterMeters[i];
int wmNrChX = (i * CountCh) + BatchRslts.WMPositionsCount + iCH + 1;
String sSerialNr =
(string.IsNullOrEmpty(waterMeterParent.SerialNr) ? (i+1).ToString() : waterMeterParent.SerialNr) +
"_CH" + (iCH + 1);
WaterMeter chXWaterMeter = null;
//------ add new water meter to batch ------
if (BatchRslts.Batch.WaterMeters.Count < wmNrChX || BatchRslts.Batch.WaterMeters[wmNrChX - 1] == null)
{
Batch = BatchRslts.Batch,
WaterMeterData = waterMeterParent.WaterMeterData,
MeterTestRslts = new List<MeterTestRslt>(),
SerialNr = sSerialNr,
WMPosition = wmNrChX,
YearOfProduction = 0,
Disabled = false,
};
chXWaterMeter.CopyContentFrom(waterMeterParent);
log.Debug("add new water meter to batch, CH = " + (iCH + 1) + " CH = " + wmNrChX);
chXWaterMeter = new WaterMeter()
{
MeterTestRslts = new List<MeterTestRslt>(),
};
//This will delete each setting before
chXWaterMeter.CopyContentFrom(waterMeterParent);
chXWaterMeter.SerialNr = sSerialNr;
chXWaterMeter.WMPosition = wmNrChX;
chXWaterMeter.YearOfProduction = waterMeterParent.YearOfProduction;
chXWaterMeter.Disabled = false;
chXWaterMeter.Batch = BatchRslts.Batch;
chXWaterMeter.WaterMeterData = waterMeterParent.WaterMeterData;
BatchRslts.Batch.WaterMeters.Add(chXWaterMeter);
}
else
{
chXWaterMeter = BatchRslts.Batch.WaterMeters[wmNrChX-1];
}
//~------ add new water meter to batch ------~
//create copy of meterRslt and add to additionalResultsByChannel
MeterTestRslt meterTestRsltChX = new MeterTestRslt(chXWaterMeter, meterRslt.TestRslt, (CompoundMeterId)meterRslt.CompoundMeterId);
chXWaterMeter.MeterTestRslts.Add(meterTestRsltChX);
MeterTestRslt chanelXMeterRslt = BatchRslts.GetMeterTestRslt(testName, wmNrChX-1, Common.CompoundMeterId.Single);
if (chanelXMeterRslt != null)
{
chanelXMeterRslt?.CopyContentFrom(meterRslt);
if (iCH == 0)
{
CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, genesisSmart.TimestampSecStartRawCh1,
genesisSmart.TimestampSecEndRawCh1, genesisSmart.VolumeLtrStartRawCh1, genesisSmart.VolumeLtrEndRawCh1);
}
else if (iCH == 1)
{
CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, genesisSmart.TimestampSecStartRawCh2,
genesisSmart.TimestampSecEndRawCh2, genesisSmart.VolumeLtrStartRawCh2, genesisSmart.VolumeLtrEndRawCh2);
}
else if (iCH == 2)
{
CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, genesisSmart.TimestampSecStartRawCh3,
genesisSmart.TimestampSecEndRawCh3, genesisSmart.VolumeLtrStartRawCh3, genesisSmart.VolumeLtrEndRawCh3);
}
chXWaterMeter.SerialNr = sSerialNr;
chXWaterMeter.WMPosition = wmNrChX;
chXWaterMeter.Q3Channel = iCH+1;
chXWaterMeter.YearOfProduction = waterMeterParent.YearOfProduction;
chXWaterMeter.Disabled = false;
if (!genesisSmart.EnableShowChanels)
{
chXWaterMeter.Disabled = !genesisSmart.EnableShowChanels;
meterTestRsltChX.TestDone = false;
BatchRslts.Batch.WaterMeters.Add(chXWaterMeter);
}
else
{
meterTestRsltChX.TestDone = true;
}
chXWaterMeter = BatchRslts.Batch.WaterMeters[wmNrChX - 1];
meterTestRsltChX.Passed = meterRslt.Passed;
chXWaterMeter.Batch = BatchRslts.Batch;
chXWaterMeter.WaterMeterData = waterMeterParent.WaterMeterData;
chXWaterMeter.SerialNr = sSerialNr;
chXWaterMeter.WMPosition = wmNrChX;
chXWaterMeter.Q3Channel = iCH+1;
chXWaterMeter.YearOfProduction = waterMeterParent.YearOfProduction;
chXWaterMeter.Disabled = false;
}
//~------ add new water meter to batch ------~
//create copy of meterRslt and add to additionalResultsByChannel
MeterTestRslt meterTestRsltChX = new MeterTestRslt(chXWaterMeter, meterRslt.TestRslt,
(CompoundMeterId)meterRslt.CompoundMeterId);
meterTestRsltChX.Q3Channel = iCH + 1;
chXWaterMeter.MeterTestRslts.Add(meterTestRsltChX);
MeterTestRslt chanelXMeterRslt =
BatchRslts.GetMeterTestRslt(testName, wmNrChX - 1, Common.CompoundMeterId.Single);
if (chanelXMeterRslt != null)
{
chanelXMeterRslt?.CopyContentFrom(meterRslt);
if (iCH == 0)
{
chanelXMeterRslt.Q3Channel = 1;
CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt,
genesisSmart.TimestampSecStartRawCh1,
genesisSmart.TimestampSecEndRawCh1, genesisSmart.VolumeLtrStartRawCh1,
genesisSmart.VolumeLtrEndRawCh1);
try
{
TestRsltCalibFactor testRsltCalibFactor = null;
if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 0)
{
testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[0];
}
else
{
//store in table
testRsltCalibFactor = new TestRsltCalibFactor();
tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor);
testRsltCalibFactor.CalibFactorIndex = 1;
}
testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt;
testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh1;
testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh1;
testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh1;
testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh1;
testRsltCalibFactor.Error = chanelXMeterRslt.Error;
}
catch (Exception ex)
{
log.Error("Error in store to DB result set CH1", ex);
}
}
else if (iCH == 1)
{
chanelXMeterRslt.Q3Channel = 2;
CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt,
genesisSmart.TimestampSecStartRawCh2,
genesisSmart.TimestampSecEndRawCh2, genesisSmart.VolumeLtrStartRawCh2,
genesisSmart.VolumeLtrEndRawCh2);
try
{
TestRsltCalibFactor testRsltCalibFactor = null;
if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 1)
{
testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[1];
}
else
{
//store in table
testRsltCalibFactor = new TestRsltCalibFactor();
tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor);
testRsltCalibFactor.CalibFactorIndex = 2;
}
testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt;
testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh2;
testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh2;
testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh2;
testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh2;
testRsltCalibFactor.Error = chanelXMeterRslt.Error;
}
catch (Exception ex)
{
log.Error("Error in store to DB result set CH2", ex);
}
}
else if (iCH == 2)
{
chanelXMeterRslt.Q3Channel = 3;
CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt,
genesisSmart.TimestampSecStartRawCh3,
genesisSmart.TimestampSecEndRawCh3, genesisSmart.VolumeLtrStartRawCh3,
genesisSmart.VolumeLtrEndRawCh3);
try
{
TestRsltCalibFactor testRsltCalibFactor = null;
if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 2)
{
testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[2];
}
else
{
//store in table
testRsltCalibFactor = new TestRsltCalibFactor();
tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor);
testRsltCalibFactor.CalibFactorIndex = 3;
}
testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt;
testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh3;
testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh3;
testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh3;
testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh3;
testRsltCalibFactor.Error = chanelXMeterRslt.Error;
}
catch (Exception ex)
{
log.Error("Error in store to DB result set CH3", ex);
}
}
if (!genesisSmart.EnableShowChanels)
{
chXWaterMeter.Disabled = !genesisSmart.EnableShowChanels;
//meterTestRsltChX.TestDone = false;
}
else
{
chXWaterMeter.Disabled = false;
meterTestRsltChX.TestDone = true;
}
meterTestRsltChX.Passed = meterRslt.Passed;
}
}catch(Exception ex)
{
log.Error("Error in WaterMeterParentCopy", ex);
}
}
private static void CalculateMeterResults(MeterTestRslt meterRslt, IRegReaderDatastream dstrReader, TestRslt tstRslt, double dstrReaderTimestampSecStart, double dstrReaderTimestampSecEnd, double dstrReaderVolumeLtrStart, double dstrReaderVolumeLtrEnd)
{
meterRslt.TimestampStart = dstrReaderTimestampSecStart;
meterRslt.TimestampEnd = !dstrReader.NoSamples
? dstrReaderTimestampSecEnd
: (dstrReaderTimestampSecStart + tstRslt.TestTime);
meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart;
meterRslt.VolumeStart = dstrReaderVolumeLtrStart; /// liter
meterRslt.VolumeEnd = dstrReaderVolumeLtrEnd; /// liter
meterRslt.VolumeMeter =
Math.Abs(dstrReaderVolumeLtrEnd - dstrReaderVolumeLtrStart);
meterRslt.VolumeRef = tstRslt.TestTime==0? tstRslt.VolumeCTV : tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime;
meterRslt.PulsesMaster = tstRslt.TestTime == 0? tstRslt.PulsesMaster :
tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime;
try
{
meterRslt.TimestampStart = dstrReaderTimestampSecStart;
meterRslt.TimestampEnd = !dstrReader.NoSamples
? dstrReaderTimestampSecEnd
: (dstrReaderTimestampSecStart + tstRslt.TestTime);
meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart;
meterRslt.VolumeStart = dstrReaderVolumeLtrStart; /// liter
meterRslt.VolumeEnd = dstrReaderVolumeLtrEnd; /// liter
meterRslt.VolumeMeter = Math.Abs(dstrReaderVolumeLtrEnd - dstrReaderVolumeLtrStart);
meterRslt.VolumeRef = tstRslt.TestTime == 0
? tstRslt.VolumeCTV
: tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime;
meterRslt.PulsesMaster = tstRslt.TestTime == 0
? tstRslt.PulsesMaster
: tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime;
meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter,
meterRslt.VolumeRef); // Error based on volume difference
}catch(Exception ex)
{
log.Error($"Error in calculate meter results, meterRslt.Name:{meterRslt.Name()} Calculation Bug Detail:", ex);
}
}
@@ -1503,6 +1627,12 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection
MakeSimulated(test, repetitionNr, test.Part, errorPctBase + repetitionNr * 0.1f);
}
//TODO bumi do simulate foe Q3 Calibration
///
/// Single meters
///
SimulateQ3CalibrationData(test,1, 0, -5.1f);
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Completed));
Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0)));
allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file
@@ -1519,6 +1649,64 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection
return new List<Event> { TestAndLogUiCmdStop(test, e) ? Event.UiCmdStop : Event.Done };
}
private void SimulateQ3CalibrationData(Test test,int repetitionNr, int part, float errorPctBase)
{
string testName = test.Name;
string fullTestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr);
Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(fullTestName, part);
Results.Utils.GetCounterStates(tstRslt, Program.LocalSettings.Counters);
for (int i = 0; i < BatchRslts.WMPositionsCount; i++)
{
if (WaterMeters.Count > i && WaterMeters[i] != null)
WaterMeters[i].SerialNr = "Simul_" + (i + 1).ToString();
}
for (int i = 0; i < BatchRslts.WMPositionsCount; i++)
{
if (!test.IsPartCompatible(Utils.PartNr(i + 1, BatchRslts.Batch.Compound))) continue;
Results.Entities.MeterTestRslt meterRslt =
BatchRslts.GetEachMeterTestRslt(testName, i, Common.CompoundMeterId.Single);
if (meterRslt == null) continue;
if (meterRslt?.WaterMeter == null) continue;
if (string.IsNullOrEmpty(meterRslt.WaterMeter.SerialNr))
{
meterRslt.WaterMeter.SerialNr = "Simul_" + (i + 1).ToString();
meterRslt.WaterMeter.SerialNrAux = "Simul_" + (i + 1).ToString();
log.Debug("Simul_SerialNr: " + meterRslt.WaterMeter.SerialNr);
}
GenericDevices.IRegReader regReader = sensPath.RegisterReaders[i];
TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader GenesisSmart =
regReader as TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader;
if (GenesisSmart != null)
{
log.Debug("GenesisSmart - store data on end!");
int CH1 = 0, CH2 = 1, CH3 = 2;
CalculateMeterResults(meterRslt, GenesisSmart, tstRslt, GenesisSmart.TimestampSecStart,
GenesisSmart.TimestampSecEnd, GenesisSmart.VolumeLtrStart, GenesisSmart.VolumeLtrEnd);
//Init Calculate Calibration
GenesisSmart.RefVolume = meterRslt.VolumeRef;
GenesisSmart.RefTime = meterRslt.TestTime;
//Store Raw Calibration Data to database
WaterMeterParentCopy(i, CH1, testName, meterRslt, GenesisSmart, tstRslt);
log.Debug($"GenesisSmart - i:{i}, CH1:{CH1}, testName:{testName}, meterRslt:{meterRslt.Id}, GenesisSmart:{GenesisSmart.Name}, tstRslt:{tstRslt.Id}");
WaterMeterParentCopy(i, CH2, testName, meterRslt, GenesisSmart, tstRslt);
log.Debug($"GenesisSmart - i:{i}, CH2:{CH2}, testName:{testName}, meterRslt:{meterRslt.Id}, GenesisSmart:{GenesisSmart.Name}, tstRslt:{tstRslt.Id}");
WaterMeterParentCopy(i, CH3, testName, meterRslt, GenesisSmart, tstRslt);
log.Debug($"GenesisSmart - i:{i}, CH3:{CH3}, testName:{testName}, meterRslt:{meterRslt.Id}, GenesisSmart:{GenesisSmart.Name}, tstRslt:{tstRslt.Id}");
}
}
}
IList<Event> Simulate2(Config.Entities.Test test, int repetitionNr, bool isLastRepetition,
Compound.CombinedTestParams compoundTestParams,
@@ -0,0 +1,40 @@
///
/// Copyright (c) 2015-2019 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;
using TBF.Rig.RegisterReaders.GenesisRegReader.implementations;
namespace TBF.Rig.TestMethods.GenesisCommunication
{
public class CommCompletedEventArgs : EventArgs
{
public int ThreadId;
public int WMNr0; /// 0-based water meter position
public GenesisSmartReader Ihead;
public Results.Entities.WaterMeter Wm;
public string CommMessage;
public CommErr CommErr;
public CommCompletedEventArgs(int threadId, int wmNr0, GenesisSmartReader ihead, Results.Entities.WaterMeter wm, string commMessage, CommErr commErr)
{
this.ThreadId = threadId;
this.WMNr0 = wmNr0;
this.Ihead = ihead;
this.Wm = wm;
this.CommMessage = commMessage;
this.CommErr = commErr;
}
public override string ToString()
{
return string.Format("Thread={0} WMNr0={1} IHead={2} WM={3} CommMsg={4} CommErr={5}",
ThreadId,
WMNr0,
(Ihead != null) ? Ihead.Name : "null",
(Wm != null) ? Wm.WMPosition : -1,
(CommMessage != null) ? CommMessage : "null",
CommErr);
}
}
}
@@ -0,0 +1,39 @@
using System;
using System.Globalization;
namespace TBF.Rig.TestMethods.GenesisCommunication
{
public static class GenesisCalibrationFactors
{
// Preserve the special branch default only when no channel has been configured.
public const ushort DefaultFactor = 15625;
public static bool TryParse(string text1, string text2, string text3,
out double[] factors, out string error)
{
factors = null;
error = null;
var text = new[] { text1, text2, text3 };
if (Array.TrueForAll(text, string.IsNullOrWhiteSpace))
{
factors = new double[] { DefaultFactor, DefaultFactor, DefaultFactor };
return true;
}
var parsed = new double[3];
for (int channel = 0; channel < parsed.Length; channel++)
{
ushort value;
if (!ushort.TryParse(text[channel]?.Trim(), NumberStyles.None,
CultureInfo.InvariantCulture, out value) || value == 0)
{
error = "Genesis calibration Text" + (channel + 1) + " must be an integer from 1 to 65535. Set all three channels.";
return false;
}
parsed[channel] = value;
}
factors = parsed;
return true;
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -32,15 +32,15 @@ namespace TBF.Rig.TestMethods.GenesisCommunication
System.Windows.Forms.Form modelessDlg;
///
delegate void iPerlCommFormDlgt(GenesisCommunicationSeq myRef, iPerlCommunication.TestMethod method, Test test, iPerlCommunicationParams testParams);
delegate void iPerlCommFormDlgt(GenesisCommunicationSeq myRef, TestMethod method, Test test, iPerlCommunicationParams testParams);
///
void OpenIPerlCommForm(GenesisCommunicationSeq myRef, iPerlCommunication.TestMethod method, Test test, iPerlCommunicationParams testParams)
void OpenIPerlCommForm(GenesisCommunicationSeq myRef, TestMethod method, Test test, iPerlCommunicationParams testParams)
{
//TODO solve this wia SmartCommunicationForm
throw new NotImplementedException();
//myRef.modelessDlg = new iPerlCommunicationForm(method, test, testParams);
//myRef.modelessDlg.Show();
myRef.modelessDlg = new GenesisCommunicationForm(method, test, testParams);
myRef.modelessDlg.Show();
}
@@ -72,7 +72,7 @@ namespace TBF.Rig.TestMethods.GenesisCommunication
processDataLoggingOp = new TBF.Rig.Operations.ProcessDataLoggingOp(processDataLogger, this, false);
string cmd;
if (testParams.Activity.ToLower().Equals(cmd = iPerlCommunicationForm.GetDefaultQ2CorrectionsStr.ToLower()))
if (testParams.Activity.ToLower().Equals(cmd = GenesisCommunicationForm.GetDefaultQ2CorrectionsStr.ToLower()))
{
TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 });
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted));
@@ -33,13 +33,13 @@ namespace TBF.Rig.TestMethods.GenesisCommunication
/// Private parameterless constructor invoked by all other (public) constructors
TestMethodCfg()
{
Name = "SmartCommunication";
Name = "SmartCommunicationGenesis";
ParentName = string.Empty;
CommTimeout = 1800; /// ms
MaxCommRetries = 4;
WaitTimeAfterFailure = 2200;
PassThroughWaitTime = 1500;
NrThreads = 2; /// 1, 2 or 4 threads
NrThreads = 10; /// 1, 2 or 4 threads
IperlCheckErrorsToStop = 10;
MciTimeoutMs = 4000; // ms, NFC interface
BaudRate = 57600; // NFC Interface
@@ -28,6 +28,14 @@ namespace TBF.Rig.TestMethods.GenesisCommunication
public TestMethodCfgCtrl()
{
InitializeComponent();
dfltQ2corrFactorsGroupBox.Visible = false;
useWebServiceGroupBox.Visible = false;
var factorHint = new System.Windows.Forms.Label
{
AutoSize = true, Location = dfltQ2corrFactorsGroupBox.Location,
Text = "Q3 factors: Water meters / Text1, Text2, Text3 (CH1, CH2, CH3)."
};
Controls.Add(factorHint);
}
private void EntryFormCfgCtrl_Load(object sender, EventArgs e)
@@ -116,10 +124,10 @@ namespace TBF.Rig.TestMethods.GenesisCommunication
flags |= CfgUpdateFlags.Error;
message += Environment.NewLine + "'Comm. timeout' should be in range 0 .. 5000";
}
if (!int.TryParse(nrThreadsTextBox.Text, out dummy) || (dummy != 1 && dummy != 2 && dummy != 4))
if (!int.TryParse(nrThreadsTextBox.Text, out dummy) || (dummy < 1 || dummy > 10))
{
flags |= CfgUpdateFlags.Error;
message += Environment.NewLine + "'Nr. threads' should be 1, 2 or 4";
message += Environment.NewLine + "'Nr. threads' should be in range 1 .. 10";
}
if (!int.TryParse(iperlCheckErrorsToStopTextBox.Text, out dummy) || ((dummy < 1) && (dummy > 40)))
{
@@ -10,7 +10,6 @@ using Config.Entities;
using TBF.Resources;
using TBF.Rig.Generic;
using TBF.Rig.TestMethods.iPerlCommunication;
using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication;
namespace TBF.Rig.TestMethods.GenesisCommunication
{
@@ -31,7 +30,7 @@ namespace TBF.Rig.TestMethods.GenesisCommunication
public override void InitializeAll()
{
Activity = iPerlCommunicationForm.ReadConfigurationStr;
Activity = GenesisCommunicationForm.SlotInitializeStr;
SimultWithPrevious = false;
SimultWithNext = false;
}
@@ -51,62 +50,79 @@ namespace TBF.Rig.TestMethods.GenesisCommunication
if (i == 0)
{
var retVal = new List<string>();
retVal.Add(iPerlCommunicationForm.ReadConfigurationStr);
retVal.Add(iPerlCommunicationConstants.ReadAdditionalCommonParametersStr);
retVal.Add(iPerlCommunicationForm.ReadSerialNrStr);
retVal.Add(string.Format("{0} A0", iPerlCommunicationForm.SetTestModeStr));
retVal.Add(string.Format("{0} A4", iPerlCommunicationForm.SetTestModeStr));
retVal.Add(iPerlCommunicationForm.ReadCalibrationStr);
retVal.Add(iPerlCommunicationForm.ReadCalibrationV4Str);
retVal.Add(iPerlCommunicationForm.NormalizeCalibrationFactorStr);
retVal.Add(iPerlCommunicationForm.NormalizeCalibrationV4FactorsStr);
retVal.Add(iPerlCommunicationForm.GetDefaultQ2CorrectionsStr);
retVal.Add(iPerlCommunicationForm.ReadQ2CorrectionStr);
retVal.Add(iPerlCommunicationForm.ResetQ2CorrectionStr);
retVal.Add(iPerlCommunicationForm.WriteDefaultQ2CorrectionsStr);
retVal.Add(iPerlCommunicationForm.InitOrReadQ2CorrectionsStr);
retVal.Add(iPerlCommunicationForm.WriteCalibrationFactorStr);
retVal.Add(iPerlCommunicationForm.WriteCalibrationV4FactorsStr);
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionStr);
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionAltStr);
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionGreeceStr);
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionRLStr);
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);
retVal.Add(iPerlCommunicationSeq.Q2correctedFromCmd + "Qx");
retVal.Add(iPerlCommunicationSeq.StrictQ2ErrorCheckStr + "Qx");
retVal.Add(iPerlCommunicationSeq.Q2correctionCheckCmd);
retVal.Add(iPerlCommunicationSeq.IperlCheckCmd);
retVal.Add(iPerlCommunicationForm.UpdateBothQ2FactorsTestRLOnlyStr);
retVal.Add(iPerlCommunicationForm.UpdateBothQ2FactorsTestLROnlyStr);
retVal.Add(iPerlCommunicationForm.UpdateQ2CorrectionsStr);
retVal.Add(iPerlCommunicationForm.ConditnlUpdateQ2CorrectionsStr);
retVal.Add(iPerlCommunicationForm.ConditnlUpdateQ2CorrRLStr);
retVal.Add(iPerlCommunicationForm.ConditnlUpdateQ2CorrLRStr);
retVal.Add("Q2 corrected from Q2adj");
retVal.Add("Q2 correction check Q2bc Q2ac");
retVal.Add(iPerlCommunicationForm.SetActiveModeStr);
retVal.Add(iPerlCommunicationForm.SetIdleModeStr);
retVal.Add("---");
retVal.Add(iPerlCommunicationForm.Reset2HzCorrectionStr);
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 (iPerlCommunication.ConditionID id = iPerlCommunication.ConditionID.A; id < iPerlCommunication.ConditionID.Count; id++)
{
retVal.Add(string.Format(iPerlCommunication.SequenceConditionOp.ConditionNameFmt, id));
}
retVal.Add(GenesisCommunicationForm.SlotInitializeStr);
retVal.Add(GenesisCommunicationForm.SlotUpdateStr);
retVal.Add(GenesisCommunicationForm.SlotConnectStr);
retVal.Add(GenesisCommunicationForm.SlotPCBSlotStr);
retVal.Add(GenesisCommunicationForm.SlotSetPasswordStr);
retVal.Add(GenesisCommunicationForm.SlotLoginStr);
retVal.Add(GenesisCommunicationForm.SlotGroupedLoginStr);
retVal.Add(GenesisCommunicationForm.SlotSetTestModeStr);
retVal.Add(GenesisCommunicationForm.SlotSetActiveModeStr);
retVal.Add(GenesisCommunicationForm.SlotDisconnectStr);
retVal.Add(GenesisCommunicationForm.PrepareSlotQ3CalibrationStr);
retVal.Add(GenesisCommunicationForm.WriteSlotQ3CalibrationStr);
retVal.Add(GenesisCommunicationForm.CheckMeterPrepareStr);
retVal.Add(GenesisCommunicationForm.HoldSlotStr);
// retVal.Add(GenesisCommunicationForm.ReadConfigurationStr);
// retVal.Add(GenesisCommunicationForm.ReadSerialNrStr);
// retVal.Add(string.Format("{0} A0", GenesisCommunicationForm.SetTestModeStr));
// retVal.Add(string.Format("{0} A4", GenesisCommunicationForm.SetTestModeStr));
// retVal.Add(GenesisCommunicationForm.ReadCalibrationStr);
// retVal.Add(GenesisCommunicationForm.ReadCalibrationV4Str);
// retVal.Add(GenesisCommunicationForm.NormalizeCalibrationFactorStr);
// retVal.Add(GenesisCommunicationForm.NormalizeCalibrationV4FactorsStr);
// retVal.Add(GenesisCommunicationForm.GetDefaultQ2CorrectionsStr);
// retVal.Add(GenesisCommunicationForm.ReadQ2CorrectionStr);
// retVal.Add(GenesisCommunicationForm.ResetQ2CorrectionStr);
// retVal.Add(GenesisCommunicationForm.WriteDefaultQ2CorrectionsStr);
// retVal.Add(GenesisCommunicationForm.InitOrReadQ2CorrectionsStr);
// retVal.Add(GenesisCommunicationForm.WriteCalibrationFactorStr);
// retVal.Add(GenesisCommunicationForm.WriteCalibrationV4FactorsStr);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionStr);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionAltStr);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionGreeceStr);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionRLStr);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionLRStr);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionIncl05Str);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionAltIncl05Str);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionPlusIncl05Str);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionPlusAltIncl05Str);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionGreeceIncl05Str);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionRLIncl05Str);
// retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionLRIncl05Str);
// retVal.Add(iPerlCommunicationSeq.Q2correctedFromCmd + "Qx");
// retVal.Add(iPerlCommunicationSeq.StrictQ2ErrorCheckStr + "Qx");
// retVal.Add(iPerlCommunicationSeq.Q2correctionCheckCmd);
// retVal.Add(iPerlCommunicationSeq.IperlCheckCmd);
// retVal.Add(GenesisCommunicationForm.UpdateBothQ2FactorsTestRLOnlyStr);
// retVal.Add(GenesisCommunicationForm.UpdateBothQ2FactorsTestLROnlyStr);
// retVal.Add(GenesisCommunicationForm.UpdateQ2CorrectionsStr);
// retVal.Add(GenesisCommunicationForm.ConditnlUpdateQ2CorrectionsStr);
// retVal.Add(GenesisCommunicationForm.ConditnlUpdateQ2CorrRLStr);
// retVal.Add(GenesisCommunicationForm.ConditnlUpdateQ2CorrLRStr);
// retVal.Add("Q2 corrected from Q2adj");
// retVal.Add("Q2 correction check Q2bc Q2ac");
// retVal.Add(GenesisCommunicationForm.SetActiveModeStr);
// retVal.Add(GenesisCommunicationForm.SetIdleModeStr);
// retVal.Add("---");
// retVal.Add(GenesisCommunicationForm.Reset2HzCorrectionStr);
// retVal.Add(GenesisCommunicationForm.Write2HzCorrectionStr);
// retVal.Add(GenesisCommunicationForm.DewaReworkRLStr);
// retVal.Add(GenesisCommunicationForm.DewaReworkLRStr);
// retVal.Add(GenesisCommunicationForm.StartTestingSealedMetersStr);
// retVal.Add(GenesisCommunicationForm.EndTestingSealedMetersStr);
// retVal.Add(string.Format("{0} if enabled", GenesisCommunicationForm.ReadConfigurationStr));
// retVal.Add(string.Format("{0} 80", GenesisCommunicationForm.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;
}
@@ -48,6 +48,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public const int EndOptoDataCount = OptoDataBufferSize - StartOptoDataCount;
public const int StartEndFilterSamplesCount2 = 1; //20 /// StartEndFilterSamplesCount = 2 * StartEndFilterSamplesCount2 + 1
public const int FeatureVectorSize = 9;
/// <summary>Default raw ViewCalibration value which represents 100 % according to the iPerl ASIC protocol.</summary>
public const double DefaultCalibFactorNominal = 4096.0;
private const int StartSampleDelaySec = 5;
private const int EndSampleDelayCount = 2;
@@ -94,6 +96,15 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public string QuantityUnits { get; set; }
public double CalibTarget { get { return iperlHeadCfg.ProcParams.CalibTarget; } }
public double CalibFactorNominal
{
get
{
return iperlHeadCfg != null && iperlHeadCfg.CalibFactorNominal > 0.0
? iperlHeadCfg.CalibFactorNominal
: DefaultCalibFactorNominal;
}
}
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; } }
@@ -157,6 +168,27 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
}
}
/// <summary>Converts the raw two-byte ViewCalibration factor to its percentage representation.</summary>
public static double CalculateCalibFactorPercentage(ushort rawCalibFactor)
{
return CalculateCalibFactorPercentage(rawCalibFactor, DefaultCalibFactorNominal);
}
public static double CalculateCalibFactorPercentage(ushort rawCalibFactor, double nominalCalibFactor)
{
return nominalCalibFactor > 0.0 ? rawCalibFactor * 100.0 / nominalCalibFactor : 0.0;
}
public double CalibFactorPercentage
{
get { return CalculateCalibFactorPercentage(CalibFactor, CalibFactorNominal); }
}
public double CalibFactorCorrectionPercentage
{
get { return CalibFactorPercentage - 100.0; }
}
public ushort OrigCalibFactorLNA;
public ushort CalibFactorLNA { get { return (CalibrationStructV4 != null) ? CalibrationStructV4.CalibrationLNA : (ushort)0; } }
@@ -27,6 +27,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
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
public double CalibFactorNominal; /// Raw calibration factor representing 100 % in the results calculation
/// <summary> Procedure parameters </summary>
[XmlIgnore]
@@ -49,6 +50,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
ProcParams = CreateProcParamsProvider() as ProcParams;
CommunicationInterface = CommunicationInterface.RFID;
HeadCommunicationComPortNr = 0;
CalibFactorNominal = IperlHead.DefaultCalibFactorNominal;
}
public IperlHeadCfg(IComponentFactory factory)
@@ -2,6 +2,7 @@
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System;
using System.Globalization;
using System.Net;
using System.Windows.Forms;
using Common;
@@ -33,6 +34,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
private void WaterMeterCfgCtrl_Load(object sender, EventArgs e)
{
nameLabel.Text = Strings.Name;
calibFactorNominalLabel.Text = GetLocalizedString("IperlCalibFactorNominal", "Default calibration factor:");
string calibFactorNominalTooltip = GetLocalizedString("IperlCalibFactorNominalTooltip", "Raw calibration factor representing 100 %. This value is used to calculate 'iPerl CalibFactor (%)' in the results configuration.");
calibFactorNominalToolTip.SetToolTip(calibFactorNominalLabel, calibFactorNominalTooltip);
calibFactorNominalToolTip.SetToolTip(calibFactorNominalTextBox, calibFactorNominalTooltip);
classNameLabel.Text = config.Factory.ClassName;
Redraw();
}
@@ -55,6 +60,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
muxBoardNrTextBox.Text = config.MuxBoardNr.ToString();
groupTextBox.Text = config.Group.ToString();
comboBoxCommunicationInterface.SelectedItem = config.CommunicationInterface.ToString();
double nominalCalibFactor = config.CalibFactorNominal > 0.0
? config.CalibFactorNominal
: IperlHead.DefaultCalibFactorNominal;
calibFactorNominalTextBox.Text = nominalCalibFactor.ToString(CultureInfo.CurrentCulture);
tabPage2.Controls.Add(new IperlHeadTestCtrl(config));
}
@@ -71,6 +80,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
muxBoardNrTextBox.Enabled = true;
groupTextBox.Enabled = true;
comboBoxCommunicationInterface.Enabled = true;
calibFactorNominalTextBox.Enabled = true;
}
public CfgUpdateFlags VerifyCfg(ref string message)
@@ -127,6 +137,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
message += Environment.NewLine + string.Format(Strings.Invalid_0, groupLabel.Text);
}
double nominalCalibFactor;
if (!TryParseDouble(calibFactorNominalTextBox.Text, out nominalCalibFactor) || nominalCalibFactor <= 0.0)
{
flags |= CfgUpdateFlags.Error;
message += Environment.NewLine + string.Format(Strings.Invalid_0, calibFactorNominalLabel.Text);
}
return flags;
}
@@ -155,8 +172,22 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
config.Group = int.Parse(groupTextBox.Text);
config.CommunicationInterface = (CommunicationInterface)comboBoxCommunicationInterface.SelectedIndex;
config.HeadCommunicationComPortNr = int.Parse(headPortNrTextBox.Text);
double nominalCalibFactor;
if (TryParseDouble(calibFactorNominalTextBox.Text, out nominalCalibFactor))
config.CalibFactorNominal = nominalCalibFactor;
return flags;
}
private static bool TryParseDouble(string value, out double result)
{
return double.TryParse(value, NumberStyles.Float, CultureInfo.CurrentCulture, out result) ||
double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out result);
}
private static string GetLocalizedString(string resourceName, string fallback)
{
return Strings.ResourceManager.GetString(resourceName, Strings.Culture) ?? fallback;
}
}
}
@@ -31,6 +31,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.label4 = new System.Windows.Forms.Label();
@@ -60,6 +61,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.label2 = new System.Windows.Forms.Label();
this.headPortNrTextBox = new System.Windows.Forms.TextBox();
this.calibFactorNominalLabel = new System.Windows.Forms.Label();
this.calibFactorNominalTextBox = new System.Windows.Forms.TextBox();
this.calibFactorNominalToolTip = new System.Windows.Forms.ToolTip(this.components);
this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.groupBox1.SuspendLayout();
@@ -80,6 +84,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
// tabPage1
//
this.tabPage1.Controls.Add(this.groupBox2);
this.tabPage1.Controls.Add(this.calibFactorNominalTextBox);
this.tabPage1.Controls.Add(this.calibFactorNominalLabel);
this.tabPage1.Controls.Add(this.label4);
this.tabPage1.Controls.Add(this.label3);
this.tabPage1.Controls.Add(this.groupBox1);
@@ -364,6 +370,23 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
this.groupBox2.TabIndex = 26;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Head Communication";
//
// calibFactorNominalLabel
//
this.calibFactorNominalLabel.AutoSize = true;
this.calibFactorNominalLabel.Location = new System.Drawing.Point(290, 76);
this.calibFactorNominalLabel.Name = "calibFactorNominalLabel";
this.calibFactorNominalLabel.Size = new System.Drawing.Size(142, 16);
this.calibFactorNominalLabel.TabIndex = 27;
this.calibFactorNominalLabel.Text = "Default calibration factor:";
//
// calibFactorNominalTextBox
//
this.calibFactorNominalTextBox.Enabled = false;
this.calibFactorNominalTextBox.Location = new System.Drawing.Point(290, 96);
this.calibFactorNominalTextBox.Name = "calibFactorNominalTextBox";
this.calibFactorNominalTextBox.Size = new System.Drawing.Size(92, 22);
this.calibFactorNominalTextBox.TabIndex = 28;
//
// label2
//
@@ -437,5 +460,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.TextBox headPortNrTextBox;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label calibFactorNominalLabel;
private System.Windows.Forms.TextBox calibFactorNominalTextBox;
private System.Windows.Forms.ToolTip calibFactorNominalToolTip;
}
}