Poseidon - Flying - Opto communication

Enhance `FlyingStartMassCollectionSeq` with Poseidon reader support, detailed error handling, and improved test data processing.
This commit is contained in:
Michal Buzik 2025-12-07 11:27:00 +01:00
parent 3f28051d79
commit 42ee9eaee3

View File

@ -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)
{