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

152 lines
7.0 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 System;
using TBF.Rig.RegisterReaders.iPerlASICReader.communication.C4.diagnosticLed.utils;
namespace TBF.Rig.RegisterReaders.iPerlASICReader.communication.C4.diagnosticLed.parserer
{
/// <summary>
/// Diagnostic LED State #6 data frame.
/// <para>
/// Frame format: TAB-separated ASCII HEX fields, CRLF terminated.
/// </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, rolls over at 2^32)</description></item>
/// <item><term>7 ff</term><description>unsigned 8-bit Field drive time in microseconds</description></item>
/// <item><term>8 mmmmmmmm</term><description>signed 32-bit Mean flow rate (rolls over at 2^32)</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 ss</term><description>unsigned 8-bit Checksum</description></item>
/// </list>
/// </summary>
public sealed class DiagnosticLedState6Data : DiagnosticLedData
{
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; }
public DiagnosticLedState6Data(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 specific ----
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]);
}
/// <summary>
/// Pipe status interpreted as <see cref="PipeStatus"/>.
/// If the value is outside the defined range, returns null.
/// </summary>
public PipeStatus PipeStatusEnumValue
{
get
{
if (!Enum.IsDefined(typeof(PipeStatus), PipeStatus))
throw new InvalidOperationException(
"Unknown pipe status value: 0x" + PipeStatus.ToString("X2"));
return (PipeStatus)PipeStatus;
}
}
/// <summary>
/// Spike Detection interpreted as <see cref="SpikeDetectionStatus"/>.
/// If the value is outside the defined range, returns null.
/// </summary>
public SpikeDetectionStatus SpikeDetectionEnumValue
{
get
{
if (!Enum.IsDefined(typeof(SpikeDetectionStatus), SpikeDetection))
throw new InvalidOperationException(
"Unknown Spike Detection value: 0x" + SpikeDetection.ToString("X2"));
return (SpikeDetectionStatus)SpikeDetection;
}
}
public override string ToString()
{
return $"DiagnosticLedState6Data: Adc24={Adc24}, FieldStrength={FieldStrength}, RawFlow={RawFlow}, RawVolume={RawVolume}, CapacitorMv={CapacitorMv}, FieldCalibration={FieldCalibration}, AsicTimestamp={AsicTimestamp}, FieldDriveTimeUs={FieldDriveTimeUs}, MeanFlowRate={MeanFlowRate}, Field1Measurement={Field1Measurement}, Field2Measurement={Field2Measurement}, IntegratorCalibrationPositive={IntegratorCalibrationPositive}, IntegratorCalibrationNegative={IntegratorCalibrationNegative}, AsicState0={AsicState0}, WaterImpedance={WaterImpedance}, SpikeDetection={SpikeDetection}, PipeStatus={PipeStatus}, LcdVolume={LcdVolume}, AsicState1={AsicState1}";
}
/// <summary>
/// Format: xxxxxx aaaa yyyy vvvvvv cccc tttt bbbbbbbb mmmmmmmm ff iiii rrrr pp ll dddddddd oo ss
/// Chars total = 90
/// Tabs = 20
/// CRLF = 2
/// Total bytes = 112
/// </summary>
/// <returns> Total bytes</returns>
public override int GetByteCount()
{
return 112;
}
}
}