137 lines
6.6 KiB
C#
137 lines
6.6 KiB
C#
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 (0–4) ----
|
||
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]);
|
||
}
|
||
}
|
||
|
||
} |