tbf/TBF/Rig/RegisterReaders/iPerlASICReader/communication/C4/diagnosticLed/parserer/DiagnosticLedState7Data.cs

137 lines
6.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using TBF.Rig.RegisterReaders.iPerlASICReader.communication.C4.diagnosticLed.utils;
namespace TBF.Rig.RegisterReaders.iPerlASICReader.communication.C4.diagnosticLed.parserer
{
/// <summary>
/// Diagnostic LED State #7 data frame.
/// <para>
/// Frame format: TAB-separated ASCII HEX fields, CRLF terminated.
/// This state extends State #6 with additional ADC and learning diagnostics.
/// </para>
/// <list type="table">
/// <listheader>
/// <term># / Field</term>
/// <description>Description</description>
/// </listheader>
/// <item><term>0 xxxxxx</term><description>signed 24-bit ADC value</description></item>
/// <item><term>1 aaaa</term><description>unsigned 16-bit Field strength (internal units)</description></item>
/// <item><term>2 yyyy</term><description>signed 16-bit Raw flow rate (1/4 ml per bit)</description></item>
/// <item><term>3 vvvvvv</term><description>unsigned 24-bit Raw volume accumulation (1/4 ml per bit)</description></item>
/// <item><term>4 cccc</term><description>unsigned 16-bit Millivolts delta on field drive capacitor</description></item>
/// <item><term>5 tttt</term><description>unsigned 16-bit Field calibration value</description></item>
/// <item><term>6 bbbbbbbb</term><description>unsigned 32-bit ASIC timestamp (8192 ticks/sec)</description></item>
/// <item><term>7 ff</term><description>unsigned 8-bit Field drive time (µs)</description></item>
/// <item><term>8 mmmmmmmm</term><description>signed 32-bit Mean flow rate</description></item>
/// <item><term>9 gggg</term><description>unsigned 16-bit Field 1 measurement</description></item>
/// <item><term>10 hhhh</term><description>unsigned 16-bit Field 2 measurement</description></item>
/// <item><term>11 cccc</term><description>unsigned 16-bit Integrator calibration positive</description></item>
/// <item><term>12 nnnn</term><description>unsigned 16-bit Integrator calibration negative</description></item>
/// <item><term>13 qq</term><description>unsigned 8-bit ASIC state 0</description></item>
/// <item><term>14 iiii</term><description>signed 16-bit Water impedance measurement</description></item>
/// <item><term>15 rrrr</term><description>signed 16-bit Electrode delta (mV)</description></item>
/// <item><term>16 pp</term><description>unsigned 8-bit Spike detection diagnostic</description></item>
/// <item><term>17 ll</term><description>unsigned 8-bit Pipe status</description></item>
/// <item><term>18 dddddddd</term><description>unsigned 32-bit LCD volume</description></item>
/// <item><term>19 oo</term><description>unsigned 8-bit ASIC state 1</description></item>
/// <item><term>20 xxxxxx</term><description>signed 24-bit Raw ADC value (before offset correction)</description></item>
/// <item><term>21 yyyyyy</term><description>signed 24-bit Detrended ADC value</description></item>
/// <item><term>22 iiii</term><description>signed 16-bit Imaginary water impedance</description></item>
/// <item><term>23 nnnn</term><description>unsigned 16-bit Electrode voltage noise level</description></item>
/// <item><term>24 aa</term><description>unsigned 8-bit ADC offset learning status</description></item>
/// <item><term>25 ss</term><description>unsigned 8-bit Checksum</description></item>
/// </list>
/// </summary>
public sealed class DiagnosticLedState7Data : DiagnosticLedData
{
// ----- State #6 fields -----
public ushort FieldCalibration { get; }
public uint AsicTimestamp { get; }
public byte FieldDriveTimeUs { get; }
public int MeanFlowRate { get; }
public ushort Field1Measurement { get; }
public ushort Field2Measurement { get; }
public ushort IntegratorCalibrationPositive { get; }
public ushort IntegratorCalibrationNegative { get; }
public byte AsicState0 { get; }
public short WaterImpedance { get; }
public short ElectrodeDeltaMv { get; }
public byte SpikeDetection { get; }
public byte PipeStatus { get; }
public uint LcdVolume { get; }
public byte AsicState1 { get; }
// ----- State #7 extensions -----
/// <summary>Raw ADC value before offset correction (signed 24-bit).</summary>
public int RawAdcBeforeOffset { get; }
/// <summary>Detrended ADC value (signed 24-bit).</summary>
public int DetrendedAdc { get; }
/// <summary>Imaginary water impedance (signed 16-bit).</summary>
public short ImaginaryWaterImpedance { get; }
/// <summary>Electrode voltage noise level (unsigned 16-bit).</summary>
public ushort ElectrodeVoltageNoise { get; }
/// <summary>
/// ADC offset learning status bitfield.
/// Bit 0: currently learning
/// Bit 1: completed first learning cycle
/// Other bits reserved.
/// </summary>
public byte AdcOffsetLearningStatus { get; }
public DiagnosticLedState7Data(string rawLine, string[] fields)
: base(rawLine)
{
// ---- Common fields (04) ----
Adc24 = DiagnosticHex.ParseInt24(fields[0]);
FieldStrength = DiagnosticHex.ParseUInt16(fields[1]);
RawFlow = DiagnosticHex.ParseInt16(fields[2]);
RawVolume = DiagnosticHex.ParseUInt24(fields[3]);
CapacitorMv = DiagnosticHex.ParseUInt16(fields[4]);
// ---- State #6 fields ----
FieldCalibration = DiagnosticHex.ParseUInt16(fields[5]);
AsicTimestamp = DiagnosticHex.ParseUInt32(fields[6]);
FieldDriveTimeUs = DiagnosticHex.ParseByte(fields[7]);
MeanFlowRate = unchecked((int)DiagnosticHex.ParseUInt32(fields[8]));
Field1Measurement = DiagnosticHex.ParseUInt16(fields[9]);
Field2Measurement = DiagnosticHex.ParseUInt16(fields[10]);
IntegratorCalibrationPositive = DiagnosticHex.ParseUInt16(fields[11]);
IntegratorCalibrationNegative = DiagnosticHex.ParseUInt16(fields[12]);
AsicState0 = DiagnosticHex.ParseByte(fields[13]);
WaterImpedance = DiagnosticHex.ParseInt16(fields[14]);
ElectrodeDeltaMv = DiagnosticHex.ParseInt16(fields[15]);
SpikeDetection = DiagnosticHex.ParseByte(fields[16]);
PipeStatus = DiagnosticHex.ParseByte(fields[17]);
LcdVolume = DiagnosticHex.ParseUInt32(fields[18]);
AsicState1 = DiagnosticHex.ParseByte(fields[19]);
// ---- State #7 extensions ----
RawAdcBeforeOffset = DiagnosticHex.ParseInt24(fields[20]);
DetrendedAdc = DiagnosticHex.ParseInt24(fields[21]);
ImaginaryWaterImpedance = DiagnosticHex.ParseInt16(fields[22]);
ElectrodeVoltageNoise = DiagnosticHex.ParseUInt16(fields[23]);
AdcOffsetLearningStatus = DiagnosticHex.ParseByte(fields[24]);
}
}
}