From 42ee9eaee3d4101e15db6aaec583ded1cd7f2e8d Mon Sep 17 00:00:00 2001 From: Michal Buzik Date: Sun, 7 Dec 2025 11:27:00 +0100 Subject: [PATCH] Poseidon - Flying - Opto communication Enhance `FlyingStartMassCollectionSeq` with Poseidon reader support, detailed error handling, and improved test data processing. --- .../FlyingStartMassCollectionSeq.cs | 124 ++++++++++++++---- 1 file changed, 100 insertions(+), 24 deletions(-) diff --git a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs index 4667286e4..c1206bd20 100644 --- a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs +++ b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs @@ -12,6 +12,9 @@ using TBF.Boxes; using TBF.Resources; using TBF.UiBridge; using TBF.Rig.GenericDevices; +using TBF.Rig.RegisterReaders.PoseidonReader; +using TBF.Rig.RegisterReaders.PoseidonReader.implementations; +using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common; namespace TBF.Rig.TestMethods.FlyingStartMassCollection { @@ -751,25 +754,56 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection if (oneMTR != null && regReader != null) { oneMTR.RegReaderType = (int)regReader.RegisterReaderType; - oneMTR.PulsesPerLiter = regReader.PulsesPerLtr; - - /// Optionally supress pulses from the large water meter - oneMTR.PulsesMeter = (isAux == 0 && compoundTestParams.SupressTrills) ? 0 : Convert.ToDouble(regReader.WMPulses); - oneMTR.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); - oneMTR.TestTime = cBrd.TestTime; - oneMTR.VolumeStart = 0; - oneMTR.VolumeEnd = 0; - oneMTR.VolumeRef = tstRslt.VolumeCTV; - - if (oneMTR.PulsesMaster != 0) + if (regReader is PoseidonReader poseidon) //is Poseidon reader family { - oneMTR.PulsesMeter *= (tstRslt.PulsesMaster / oneMTR.PulsesMaster); - oneMTR.PulsesMaster = tstRslt.PulsesMaster; + oneMTR.PulsesPerLiter = 0; + + /// Optionally supress pulses from the large water meter + oneMTR.PulsesMeter = 0; + oneMTR.PulsesMaster = 0; + oneMTR.TestTime = cBrd.TestTime; + oneMTR.VolumeStart = 0; + oneMTR.VolumeEnd = 0; + oneMTR.VolumeRef = tstRslt.VolumeCTV; + + if (oneMTR.PulsesMaster != 0) + { + oneMTR.PulsesMeter *= (tstRslt.PulsesMaster / oneMTR.PulsesMaster); + oneMTR.PulsesMaster = tstRslt.PulsesMaster; + } + + oneMTR.VolumeMeter = poseidon.WMVolume; + + oneMTR.Error = + Formulas.ErrorFromVolumes(oneMTR.VolumeMeter, + tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation } + else + { + oneMTR.PulsesPerLiter = regReader.PulsesPerLtr; - oneMTR.VolumeMeter = oneMTR.PulsesMeter * regReader.LtrsPerPulse; /// liter + /// Optionally supress pulses from the large water meter + oneMTR.PulsesMeter = (isAux == 0 && compoundTestParams.SupressTrills) + ? 0 + : Convert.ToDouble(regReader.WMPulses); + oneMTR.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + oneMTR.TestTime = cBrd.TestTime; + oneMTR.VolumeStart = 0; + oneMTR.VolumeEnd = 0; + oneMTR.VolumeRef = tstRslt.VolumeCTV; - oneMTR.Error = Formulas.ErrorFromVolumes(oneMTR.VolumeMeter, tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation + if (oneMTR.PulsesMaster != 0) + { + oneMTR.PulsesMeter *= (tstRslt.PulsesMaster / oneMTR.PulsesMaster); + oneMTR.PulsesMaster = tstRslt.PulsesMaster; + } + + oneMTR.VolumeMeter = oneMTR.PulsesMeter * regReader.LtrsPerPulse; /// liter + + oneMTR.Error = + Formulas.ErrorFromVolumes(oneMTR.VolumeMeter, + tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation + } } } @@ -887,16 +921,58 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection if (dstrReader != null) { - meterRslt.TimestampStart = dstrReader.TimestampSecStart; - meterRslt.TimestampEnd = !dstrReader.NoSamples ? dstrReader.TimestampSecEnd : (dstrReader.TimestampSecStart + tstRslt.TestTime); - meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; - meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter - meterRslt.VolumeEnd = dstrReader.VolumeLtrEnd; /// liter - meterRslt.VolumeMeter = Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart); - meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; - meterRslt.PulsesMaster = tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; + if (dstrReader is SmartReader poseidon) //is Poseidon reader family + { + log.Info("Poseidon reader detected - Results"); + meterRslt.TimestampStart = poseidon.TimestampSecStart; + meterRslt.TimestampEnd = !poseidon.NoSamples + ? poseidon.TimestampSecEnd + : (poseidon.TimestampSecStart + tstRslt.TestTime); + meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; + meterRslt.VolumeStart = poseidon.VolumeLtrStart; /// liter + meterRslt.VolumeEnd = poseidon.VolumeLtrStart + poseidon.WMVolume; //dstrReader.VolumeLtrEnd; /// liter + meterRslt.VolumeMeter = poseidon.WMVolume; - if (iPerl != null) + if (!(meterRslt.TestTime == 0 || tstRslt.TestTime == 0)) + { + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + meterRslt.PulsesMaster = + tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; + } + else + { + meterRslt.VolumeRef = tstRslt.VolumeCTV; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + } + + log.Info($"meterRslt.TimestampStart = {meterRslt.TimestampStart} \n" + + $"meterRslt.TimestampEnd = {meterRslt.TimestampEnd }\n" + + $"meterRslt.TestTime = {meterRslt.TestTime}\n" + + $"meterRslt.VolumeStart = {meterRslt.VolumeStart}\n" + + $"meterRslt.VolumeEnd = {meterRslt.VolumeEnd}\n" + + $"meterRslt.VolumeMeter = {meterRslt.VolumeMeter}\n" + + $"meterRslt.VolumeRef = {meterRslt.VolumeRef}\n" + + $"meterRslt.PulsesMaster = {meterRslt.PulsesMaster}\n"); + + + } + else + { + meterRslt.TimestampStart = dstrReader.TimestampSecStart; + meterRslt.TimestampEnd = !dstrReader.NoSamples + ? dstrReader.TimestampSecEnd + : (dstrReader.TimestampSecStart + tstRslt.TestTime); + meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; + meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter + meterRslt.VolumeEnd = dstrReader.VolumeLtrEnd; /// liter + meterRslt.VolumeMeter = + Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart); + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + meterRslt.PulsesMaster = + tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; + } + + if (iPerl != null) { if (iPerl.ResultCode != 0 && (meterRslt.WaterMeter.ResultCode & (int)Results.Entities.ResultCode.OptoErrorCodeMask) == 0) {