laatzen/GenesisDisplayTool/DecodeTelegram.cs
2021-10-01 11:10:17 +02:00

2696 lines
150 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Globalization;
using System.Windows.Forms;
namespace GenesisDisplayTool
{
public static partial class DecodeTelegram
{
private static CultureInfo culture = GENESIS_DISPLAY_TOOL._GENESIS_DISPLAY_TOOL.GetGlobalCulture();
public static DecodedData[] DecodedDataDecodeTelegram(String rxString, Boolean cB_StdDevEnable_Checked, Boolean cB_MeanValuesEnable_Checked, DecodedData[] decodedData, Double crystalFrequency)
{
#region Definitions and initializations
DecodedData[] DecodingResult = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
DecodingResult[Constants.PATH0] = ((DecodedData)(decodedData[Constants.PATH0].Clone()));
DecodingResult[Constants.PATH1] = ((DecodedData)(decodedData[Constants.PATH1].Clone()));
DecodingResult[Constants.PATH2] = ((DecodedData)(decodedData[Constants.PATH2].Clone()));
#endregion
#region Prepare RX data
String[] HexValues = rxString.Split(' ');
#endregion
#region Call decoder
#region Decode protocol A and B
//DecodingResult = DecodeTelegram.DecodeProtocolAandB(HexValues, decodedData, crystalFrequency);
#endregion
#region Decode protocol D
//DecodingResult = DecodeTelegram.DecodeProtocolD(HexValues, DecodingResult, crystalFrequency);
#endregion
#region Decode protocol E
//DecodingResult = DecodeTelegram.DecodeProtocolE(HexValues, DecodingResult, crystalFrequency);
#endregion
#region Decode protocol G
DecodingResult = DecodeTelegram.DecodeProtocolG(HexValues, DecodingResult);
#endregion
#region Decode protocol F
DecodingResult = DecodeTelegram.DecodeProtocolF(HexValues, DecodingResult);
#endregion
#region Decode protocol H
DecodingResult = DecodeTelegram.DecodeProtocolH(HexValues, DecodingResult);
#endregion
#region Decode protocol I
DecodingResult = DecodeTelegram.DecodeProtocolI(HexValues, DecodingResult, crystalFrequency);
#endregion
#endregion
#region Return data
return DecodingResult;
#endregion
}
public static DecodedData[] DecodeProtocolAandB(String[] HexValues, DecodedData[] inputDecodedData, Double crystalFrequency)
{
#region Definitions and initializations
DecodedData[] ReturnData = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
ReturnData = inputDecodedData;
String ProtocolVersion = String.Empty;
String MessageType = String.Empty;
Double temp = 0;
UInt16 Path = 0;
UInt16 DatIndex = 0;
#endregion
try
{
#region Decode TDC data ("DATA CHANNEL")
if (HexValues[0].Contains("a") ||
(HexValues[0].Contains("b") && (!(HexValues[1].Contains(Message.Temperature)))))
{
#region Reset parameters
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
ReturnData[Constants.PATH0].MessageType = String.Empty;
ReturnData[Constants.PATH1].MessageType = String.Empty;
ReturnData[Constants.PATH2].MessageType = String.Empty;
#endregion
#region Decode and display
foreach (String HexValue in HexValues)
{
switch (DatIndex)
{
#region Decode and display telegram
#region Protocol version
case 0:
ProtocolVersion = HexValue;
break;
#endregion
#region Decode PATH
case 1:
Path = UInt16.Parse(HexValue, NumberStyles.AllowHexSpecifier);
break;
#endregion
#region Decode HCC-Value
case 2:
#region Calculate Value
UInt32 HccValTemp = UInt32.Parse(HexValue, NumberStyles.HexNumber);
ReturnData[Path].HccVal = (Double)HccValTemp;
ReturnData[Path].HccCorrectionFactor = (4 * Constants.NominalFrequency * 1000000) / ((HccValTemp >> 16) * 32768);
#endregion
break;
#endregion
#region TOF sum of all up
case 3:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofSumOfAllUp = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region Pulse width up
case 4:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].PulsewidthUp = (Double)Math.Round((((Double)temp / 128)), 2);
#endregion
break;
#endregion
#region Amplitude up
case 5:
#region Calculate value and assign
ReturnData[Path].AmpUpRaw = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
#endregion
break;
#endregion
#region Amplitude calibrate value high
case 6:
#region Calculate value and assign
ReturnData[Path].AmpCalHigh = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
#endregion
break;
#endregion
#region TOF sum of all down
case 7:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofSumOfAllDown = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8); // From Acam datasheet vol.2, 5-1
#endregion
break;
#endregion
#region Pulse width down
case 8:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].PulsewidthDown = (Double)Math.Round((((Double)temp / 128)), 2);
#endregion
break;
#endregion
#region Amplitude down
case 9:
#region Calculate value and assign
ReturnData[Path].AmpDownRaw = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
#endregion
break;
#endregion
#region Amplitude calibrate value low
case 10:
#region Calculate value and assign
ReturnData[Path].AmpCalLow = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].AmpGradient = Constants.Vcal / (ReturnData[Path].AmpCalHigh - ReturnData[Path].AmpCalLow);
ReturnData[Path].AmpOffset = ((2 * ReturnData[Path].AmpCalLow) - ReturnData[Path].AmpCalHigh) * ReturnData[Path].AmpGradient;
ReturnData[Path].AmpUpCalculated = ReturnData[Path].AmpGradient * ReturnData[Path].AmpUpRaw - ReturnData[Path].AmpOffset;
ReturnData[Path].AmpDownCalculated = ReturnData[Path].AmpGradient * ReturnData[Path].AmpDownRaw - ReturnData[Path].AmpOffset;
#endregion
break;
#endregion
#region TOF0 up
case 11:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofUp[Constants.HIT0] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF1 up
case 12:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofUp[Constants.HIT1] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF2 up
case 13:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofUp[Constants.HIT2] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF3 up
case 14:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofUp[Constants.HIT3] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF4 up
case 15:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofUp[Constants.HIT4] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF5 up
case 16:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofUp[Constants.HIT5] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF6 up
case 17:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofUp[Constants.HIT6] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF7 up
case 18:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofUp[Constants.HIT7] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF0 down/ DIF-TOF0
case 19:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofDown[Constants.HIT0] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT0] = (ReturnData[Path].TofDown[Constants.HIT0] - ReturnData[Path].TofUp[Constants.HIT0]) * 1000;
#endregion
break;
#endregion
#region TOF1 down/ DIF-TOF1
case 20:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofDown[Constants.HIT1] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT1] = (ReturnData[Path].TofDown[Constants.HIT1] - ReturnData[Path].TofUp[Constants.HIT1]) * 1000;
#endregion
break;
#endregion
#region TOF2 down/ DIF-TOF2
case 21:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofDown[Constants.HIT2] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT2] = (ReturnData[Path].TofDown[Constants.HIT2] - ReturnData[Path].TofUp[Constants.HIT2]) * 1000;
#endregion
break;
#endregion
#region TOF3 down/ DIF-TOF3
case 22:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofDown[Constants.HIT3] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT3] = (ReturnData[Path].TofDown[Constants.HIT3] - ReturnData[Path].TofUp[Constants.HIT3]) * 1000;
#endregion
break;
#endregion
#region TOF4 down/ DIF-TOF4
case 23:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofDown[Constants.HIT4] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT4] = (ReturnData[Path].TofDown[Constants.HIT4] - ReturnData[Path].TofUp[Constants.HIT4]) * 1000;
#endregion
break;
#endregion
#region TOF5 down/ DIF-TOF5
case 24:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofDown[Constants.HIT5] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT5] = (ReturnData[Path].TofDown[Constants.HIT5] - ReturnData[Path].TofUp[Constants.HIT5]) * 1000;
#endregion
break;
#endregion
#region TOF6 down/ DIF-TOF6
case 25:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofDown[Constants.HIT6] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT6] = (ReturnData[Path].TofDown[Constants.HIT6] - ReturnData[Path].TofUp[Constants.HIT6]) * 1000;
#endregion
break;
#endregion
#region TOF7 down/ DIF-TOF7
case 26:
#region Calculate value and assign
temp = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].TofDown[Constants.HIT7] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT7] = (ReturnData[Path].TofDown[Constants.HIT7] - ReturnData[Path].TofUp[Constants.HIT7]) * 1000;
#endregion
break;
#endregion
default: break;
#endregion
}
if (DatIndex == 26) // last position of telegram
{
#region Decoding finished
ReturnData[Path].ProtocolVersion = ProtocolVersion;
ReturnData[Path].MessageType = Message.Data;
DatIndex = 0;
#endregion
}
else
DatIndex++;
}
#endregion
return ReturnData;
}
#endregion
#region Decode temperature data ("DATA CHANNEL")
if (HexValues[0].Contains("b") && (HexValues[1].Contains(Message.Temperature)))
{
#region Decode
foreach (String HexValue in HexValues)
{
switch (DatIndex)
{
#region Decode telegram (DATA CHANNEL)
#region Protocol version
case 0:
ProtocolVersion = HexValue;
break;
#endregion
#region Not used
case 1:
MessageType = HexValue;
break;
#endregion
#region Decode PATH
case 2:
Path = UInt16.Parse(HexValue, NumberStyles.AllowHexSpecifier);
break;
#endregion
#region Schmitt trigger delay compensation value (not used)
case 3:
#region Calculate value and assign
// [tbd]
#endregion
break;
#endregion
#region PT reference impedance value (not used)
case 4:
#region Calculate value and assign
// [tbd]
#endregion
break;
#endregion
#region PT cold impedance value (not used)
case 5:
#region Calculate Value
// [tbd]
#endregion
break;
#endregion
#region Pt hot impedance value (not used)
case 6:
#region Calculate value
// [tbd]
#endregion
break;
#endregion
#region PT reference 1st (on) correction value (not used)
case 7:
#region Calculate Value
// [tbd]
#endregion
break;
#endregion
#region Schmitt trigger delay compensation value (not used)
case 8:
#region Calculate Value
// [tbd]
#endregion
break;
#endregion
#region PT reference impedance value (not used)
case 9:
#region Calculate Value
// [tbd]
#endregion
break;
#endregion
#region PT cold impedance value (not used)
case 10:
#region Calculate Value
// [tbd]
#endregion
break;
#endregion
#region PT hot impedance value (not used)
case 11:
#region Calculate value
// [tbd]
#endregion
break;
#endregion
#region PT reference 1st (on) correction value (not used)
case 12:
#region Calculate Value
// [tbd]
#endregion
break;
#endregion
#region Temperature (cold)
case 13:
#region Calculate Value
ReturnData[Path].TemperatureCold = Double.Parse(HexValue);
ReturnData[Path].TemperatureHot = 0; // Dummy data
#endregion
break;
#endregion
default: break;
#endregion
}
if (DatIndex == 13)
{
#region Decoding finished
DatIndex = 0;
ReturnData[Path].ProtocolVersion = ProtocolVersion;
ReturnData[Path].MessageType = MessageType;
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
}
#endregion
return ReturnData;
}
#endregion
}
catch (Exception ex)
{
ErrorLog.Log(LogErrReason.Exception(), "DecodeProtocolAandB() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty);
}
#region Return data
return ReturnData;
#endregion
}
public static DecodedData[] DecodeProtocolD(String[] hexValues, DecodedData[] inputDecodedData, Double crystalFrequency)
{
#region Definitions and initializations
DecodedData[] ReturnData = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
ReturnData[Constants.PATH0] = ((DecodedData)(inputDecodedData[Constants.PATH0].Clone()));
ReturnData[Constants.PATH1] = ((DecodedData)(inputDecodedData[Constants.PATH1].Clone()));
ReturnData[Constants.PATH2] = ((DecodedData)(inputDecodedData[Constants.PATH2].Clone()));
UInt32 temp = 0;
UInt16 DatIndex = 0;
String DecodedMessageType = String.Empty;
#endregion
try
{
#region Decode TDC-data ("DATA CHANNEL")
if ((hexValues[0] == "d") && (hexValues[1] == Message.Data) && (hexValues.Count()== 29))
{
DecodedMessageType = Message.Data;
#region Definitions
UInt16 Path = Constants.PATH0;
String ProtocolVersion = String.Empty;
String MessageType = String.Empty;
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
#endregion
#region Decode and display
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode and display telegram
#region Protocol version
case 0:
ProtocolVersion = HexValue;
break;
#endregion
#region Message type
case 1:
MessageType = HexValue;
break;
#endregion
#region Decode PATH
case 2:
if (UInt16.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out Path))
{
Path--;
ReturnData[Constants.PATH0].Path = Path;
ReturnData[Constants.PATH1].Path = Path;
ReturnData[Constants.PATH2].Path = Path;
}
break;
#endregion
#region Data valid
case 3:
ReturnData[Path].DataValid = HexValue;
break;
#endregion
#region TOF sum of all up
case 4:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].TofSumOfAllUp = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region Pulse width up
case 5:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].PulsewidthUp = (Double)Math.Round((((Double)temp / 128)), 2);
#endregion
break;
#endregion
#region Amplitude up
case 6:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].AmpUpRaw = temp;
#endregion
break;
#endregion
#region Amplitude calibrate value high
case 7:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].AmpCalHigh = temp;
#endregion
break;
#endregion
#region TOF sum of all down
case 8:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].TofSumOfAllDown = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8); // From Acam datasheet vol.2, 5-1
#endregion
break;
#endregion
#region Pulse width down
case 9:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].PulsewidthDown = (Double)Math.Round((((Double)temp / 128)), 2);
#endregion
break;
#endregion
#region Amplitude down
case 10:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].AmpDownRaw = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
#endregion
break;
#endregion
#region Amplitude calibrate value low
case 11:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].AmpCalLow = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].AmpGradient = Constants.Vcal / (ReturnData[Path].AmpCalHigh - ReturnData[Path].AmpCalLow);
ReturnData[Path].AmpOffset = ((2 * ReturnData[Path].AmpCalLow) - ReturnData[Path].AmpCalHigh) * ReturnData[Path].AmpGradient;
ReturnData[Path].AmpUpCalculated = ReturnData[Path].AmpGradient * ReturnData[Path].AmpUpRaw - ReturnData[Path].AmpOffset;
ReturnData[Path].AmpDownCalculated = ReturnData[Path].AmpGradient * ReturnData[Path].AmpDownRaw - ReturnData[Path].AmpOffset;
}
#endregion
break;
#endregion
#region TOF0 up
case 12:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].TofUp[Constants.HIT0] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF1 up
case 13:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].TofUp[Constants.HIT1] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF2 up
case 14:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].TofUp[Constants.HIT2] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF3 up
case 15:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].TofUp[Constants.HIT3] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF4 up
case 16:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].TofUp[Constants.HIT4] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF5 up
case 17:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].TofUp[Constants.HIT5] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF6 up
case 18:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].TofUp[Constants.HIT6] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF7 up
case 19:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].TofUp[Constants.HIT7] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF0 down/ DIF-TOF0
case 20:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].TofDown[Constants.HIT0] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT0] = (ReturnData[Path].TofDown[Constants.HIT0] - ReturnData[Path].TofUp[Constants.HIT0]) * 1000;
}
#endregion
break;
#endregion
#region TOF1 down/ DIF-TOF1
case 21:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].TofDown[Constants.HIT1] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT1] = (ReturnData[Path].TofDown[Constants.HIT1] - ReturnData[Path].TofUp[Constants.HIT1]) * 1000;
}
#endregion
break;
#endregion
#region TOF2 down/ DIF-TOF2
case 22:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].TofDown[Constants.HIT2] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT2] = (ReturnData[Path].TofDown[Constants.HIT2] - ReturnData[Path].TofUp[Constants.HIT2]) * 1000;
}
#endregion
break;
#endregion
#region TOF3 down/ DIF-TOF3
case 23:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].TofDown[Constants.HIT3] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT3] = (ReturnData[Path].TofDown[Constants.HIT3] - ReturnData[Path].TofUp[Constants.HIT3]) * 1000;
}
#endregion
break;
#endregion
#region TOF4 down/ DIF-TOF4
case 24:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].TofDown[Constants.HIT4] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT4] = (ReturnData[Path].TofDown[Constants.HIT4] - ReturnData[Path].TofUp[Constants.HIT4]) * 1000;
}
#endregion
break;
#endregion
#region TOF5 down/ DIF-TOF5
case 25:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].TofDown[Constants.HIT5] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT5] = (ReturnData[Path].TofDown[Constants.HIT5] - ReturnData[Path].TofUp[Constants.HIT5]) * 1000;
}
#endregion
break;
#endregion
#region TOF6 down/ DIF-TOF6
case 26:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].TofDown[Constants.HIT6] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT6] = (ReturnData[Path].TofDown[Constants.HIT6] - ReturnData[Path].TofUp[Constants.HIT6]) * 1000;
}
#endregion
break;
#endregion
#region TOF7 down/ DIF-TOF7
case 27:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].TofDown[Constants.HIT7] = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].DifTof[Constants.HIT7] = (ReturnData[Path].TofDown[Constants.HIT7] - ReturnData[Path].TofUp[Constants.HIT7]) * 1000;
}
#endregion
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
if (DatIndex == 27) // last position of telegram
{
#region Decoding finished
#region Reset index
DatIndex = 0;
#endregion
#region Set data
ReturnData[Path].ProtocolVersion = ProtocolVersion;
ReturnData[Path].MessageType = MessageType;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
#endregion
#region Return data
return ReturnData;
#endregion
#endregion
}
else
DatIndex++;
}
#endregion
return ReturnData;
}
#endregion
#region Decode Temperature data ("DATA CHANNEL")
if ((hexValues[0] == "d") && (hexValues[1] == Message.Temperature)&&(hexValues.Count() == 15))
{
DecodedMessageType = Message.Temperature;
#region Reset data
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
#endregion
#region Decode
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode telegram ("DATA CHANNEL")
#region Protocol version
case 0:
ReturnData[Constants.PATH0].ProtocolVersion = HexValue;
ReturnData[Constants.PATH1].ProtocolVersion = HexValue;
ReturnData[Constants.PATH2].ProtocolVersion = HexValue;
break;
#endregion
#region Message type
case 1:
ReturnData[Constants.PATH0].MessageType = HexValue;
ReturnData[Constants.PATH1].MessageType = HexValue;
ReturnData[Constants.PATH2].MessageType = HexValue;
break;
#endregion
#region Data valid
case 2:
ReturnData[Constants.PATH0].DataValid = HexValue;
ReturnData[Constants.PATH1].DataValid = HexValue;
ReturnData[Constants.PATH2].DataValid = HexValue;
break;
#endregion
#region Not used
case 3:
#region Schmitt trigger delay compensation values
// [tbd]
#endregion
break;
#endregion
#region Not used
case 4:
#region PT reference impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 5:
#region PT cold impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 6:
#region PT hot impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 7:
#region PT reference 1st correction value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 8:
#region Schmitt trigger delay compensation value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 9:
#region PT reference impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 10:
#region PT cold impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 11:
#region PT hot impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 12:
#region PT reference 1st rds(on) correction value
// [tbd]
#endregion
break;
#endregion
#region Get temperature value
case 13:
#region Temperature value
Double Temperature;
if (Double.TryParse(HexValue, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out Temperature))
{
ReturnData[Constants.PATH0].TemperatureCold = Temperature;
ReturnData[Constants.PATH0].TemperatureHot = 0; // Dummy data
ReturnData[Constants.PATH1].TemperatureCold = Temperature;
ReturnData[Constants.PATH1].TemperatureHot = 0; // Dummy data
ReturnData[Constants.PATH2].TemperatureCold = Temperature;
ReturnData[Constants.PATH2].TemperatureHot = 0; // Dummy data
}
#endregion
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
#region Decoding finished
if (DatIndex == 13)
{
#region Reset index
DatIndex = 0;
ReturnData[Constants.PATH0].Path = Constants.PATH0;
ReturnData[Constants.PATH1].Path = Constants.PATH0;
ReturnData[Constants.PATH2].Path = Constants.PATH0;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
#endregion
}
#endregion
return ReturnData;
}
#endregion
#region Decode HCC-value ("DATA CHANNEL")
if ((hexValues[0] == "d") && (hexValues[1] == Message.Hcc) && (hexValues.Count() == 5))
{
DecodedMessageType = Message.Hcc;
#region Definitions
UInt16 Path = Constants.PATH0;
String ProtocolVersion = String.Empty;
String MessageType = String.Empty;
#endregion
#region Reset data
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
ReturnData[Constants.PATH0].MessageType = String.Empty;
ReturnData[Constants.PATH1].MessageType = String.Empty;
ReturnData[Constants.PATH2].MessageType = String.Empty;
#endregion
#region Decode
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode telegram ("DATA CHANNEL")
#region Protocol version
case 0:
ProtocolVersion = HexValue;
break;
#endregion
#region Message type
case 1:
MessageType = HexValue;
break;
#endregion
#region Get PATH
case 2:
UInt16 PathTemp = 0;
if (UInt16.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out PathTemp))
Path = (UInt16)(PathTemp - 1);
break;
#endregion
#region HCC-value
case 3:
#region Calculate value
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].HccVal = (Double)temp;
ReturnData[Path].HccCorrectionFactor = (Double)(4 * Constants.NominalFrequency * 1000000) / ((temp >> 16) * 32768);
}
#endregion
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
#region Decoding finished
if (DatIndex == 3)
{
#region Reset index
DatIndex = 0;
#endregion
#region Set data
ReturnData[Path].ProtocolVersion = ProtocolVersion;
ReturnData[Path].MessageType = MessageType;
ReturnData[Constants.PATH0].Path = Path;
ReturnData[Constants.PATH1].Path = Path;
ReturnData[Constants.PATH2].Path = Path;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
#endregion
}
#endregion
return ReturnData;
}
#endregion
#region Decode comment ("DATA CHANNEL")
if ((hexValues[0] == "d") && (hexValues[1] == Message.Comment))
{
DecodedMessageType = Message.Comment;
#region Reset data
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
ReturnData[Constants.PATH0].MessageType = String.Empty;
ReturnData[Constants.PATH1].MessageType = String.Empty;
ReturnData[Constants.PATH2].MessageType = String.Empty;
#endregion
#region Decode
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode telegram ("DATA CHANNEL")
#region Protocol version
case 0:
ReturnData[Constants.PATH0].ProtocolVersion = HexValue;
ReturnData[Constants.PATH1].ProtocolVersion = HexValue;
ReturnData[Constants.PATH2].ProtocolVersion = HexValue;
break;
#endregion
#region Message type
case 1:
ReturnData[Constants.PATH0].MessageType = HexValue;
ReturnData[Constants.PATH1].MessageType = HexValue;
ReturnData[Constants.PATH2].MessageType = HexValue;
break;
#endregion
#region Comment0
case 2:
#region Comment0
if (HexValue != String.Empty)
{
ReturnData[Constants.PATH0].Comment = HexValue;
ReturnData[Constants.PATH1].Comment = HexValue;
ReturnData[Constants.PATH2].Comment = HexValue;
}
#endregion
break;
#endregion
#region Comment1
case 3:
#region Comment1
if (HexValue != String.Empty)
{
ReturnData[Constants.PATH0].Comment = ReturnData[Constants.PATH0].Comment + HexValue;
ReturnData[Constants.PATH1].Comment = ReturnData[Constants.PATH1].Comment + HexValue;
ReturnData[Constants.PATH2].Comment = ReturnData[Constants.PATH2].Comment + HexValue;
}
#endregion
break;
#endregion
#region Comment2
case 4:
#region Comment2
if (HexValue != String.Empty)
{
ReturnData[Constants.PATH0].Comment = ReturnData[Constants.PATH0].Comment + " " + HexValue;
ReturnData[Constants.PATH1].Comment = ReturnData[Constants.PATH1].Comment + " " + HexValue;
ReturnData[Constants.PATH2].Comment = ReturnData[Constants.PATH2].Comment + " " + HexValue;
}
#endregion
break;
#endregion
#region Comment3
case 5:
#region Comment3
if (HexValue != String.Empty)
{
ReturnData[Constants.PATH0].Comment = ReturnData[Constants.PATH0].Comment + " " + HexValue;
ReturnData[Constants.PATH1].Comment = ReturnData[Constants.PATH1].Comment + " " + HexValue;
ReturnData[Constants.PATH2].Comment = ReturnData[Constants.PATH2].Comment + " " + HexValue;
}
#endregion
break;
#endregion
#region Comment4
case 6:
#region Comment4
if (HexValue != String.Empty)
{
ReturnData[Constants.PATH0].Comment = ReturnData[Constants.PATH0].Comment + " " + HexValue;
ReturnData[Constants.PATH1].Comment = ReturnData[Constants.PATH1].Comment + " " + HexValue;
ReturnData[Constants.PATH2].Comment = ReturnData[Constants.PATH2].Comment + " " + HexValue;
}
#endregion
break;
#endregion
#region Comment5
case 7:
#region Comment5
if (HexValue != String.Empty)
{
ReturnData[Constants.PATH0].Comment = ReturnData[Constants.PATH0].Comment + " " + HexValue;
ReturnData[Constants.PATH1].Comment = ReturnData[Constants.PATH1].Comment + " " + HexValue;
ReturnData[Constants.PATH2].Comment = ReturnData[Constants.PATH2].Comment + " " + HexValue;
}
#endregion
break;
#endregion
#region Comment6
case 8:
#region Comment6
if (HexValue != String.Empty)
{
ReturnData[Constants.PATH0].Comment = ReturnData[Constants.PATH0].Comment + " " + HexValue;
ReturnData[Constants.PATH1].Comment = ReturnData[Constants.PATH1].Comment + " " + HexValue;
ReturnData[Constants.PATH2].Comment = ReturnData[Constants.PATH2].Comment + " " + HexValue;
}
#endregion
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
#region Decoding finished
if (DatIndex == hexValues.Count()-1)
{
#region Reset index
DatIndex = 0;
#endregion
#region Set data
ReturnData[Constants.PATH0].Path = Constants.PATH0;
ReturnData[Constants.PATH1].Path = Constants.PATH0;
ReturnData[Constants.PATH2].Path = Constants.PATH0;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
#endregion
}
#endregion
return ReturnData;
}
#endregion
}
catch (Exception ex)
{
#region Error
ErrorLog.Log(LogErrReason.Exception(), "DecodeTelegram.DecodeProtocolD() failed", "0x" + ex.HResult.ToString("X", culture), DecodedMessageType+DatIndex.ToString());
#endregion
}
#region Return data
return ReturnData;
#endregion
}
public static DecodedData[] DecodeProtocolE(String[] hexValues, DecodedData[] inputDecodedData, Double crystalFrequency)
{
#region Definitions and initializations
DecodedData[] ReturnData = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
ReturnData = inputDecodedData;
UInt16 DatIndex = 0;
UInt16 DecodedPath = Constants.PATH0;
Int32 temp = 0;
String ProtocolVersion = String.Empty;
#endregion
try
{
#region Decode comment ("DATA CHANNEL")
if ((hexValues[0] == "e")&&(hexValues.Count() == 8))
{
#region Reset data
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
ReturnData[Constants.PATH0].MessageType = String.Empty;
ReturnData[Constants.PATH1].MessageType = String.Empty;
ReturnData[Constants.PATH2].MessageType = String.Empty;
#endregion
#region Decode
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode telegram ("DATA CHANNEL")
#region Protocol version
case 0:
ProtocolVersion = HexValue;
break;
#endregion
#region Decode PATH
case 1:
if (UInt16.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out DecodedPath))
{
DecodedPath--;
ReturnData[Constants.PATH0].Path = DecodedPath;
ReturnData[Constants.PATH1].Path = DecodedPath;
ReturnData[Constants.PATH2].Path = DecodedPath;
}
ReturnData[DecodedPath].ProtocolVersion = ProtocolVersion;
break;
#endregion
#region Data valid
case 2:
ReturnData[DecodedPath].DataValid = HexValue;
break;
#endregion
#region Delta time of flight
case 3:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].DeltaTimeOfFlight = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[DecodedPath].HccCorrectionFactor, 8);
/*
Double temp = (Double)Int32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[DecodedPath].DeltaTimeOfFlight = (Double)Math.Round((((Double)temp / 65536) * (1000 / (crystalFrequency))) * ReturnData[DecodedPath].HccCorrectionFactor, 8);
*/
break;
#endregion
#region Raw delta volume
case 4:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].RawDeltaVolume = (Double)temp;
/*
Int32 temp2 = Int32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[DecodedPath].RawDeltaVolume = (Double)temp2*/;
break;
#endregion
#region Raw delta volume scaling
case 5:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].RawDeltaVolumeScaling = (Double)temp;
//ReturnData[DecodedPath].RawDeltaVolumeScaling = (Double)Int32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
break;
#endregion
#region Sample interval
case 6:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].SampleInterval = (Double)temp;
//ReturnData[DecodedPath].SampleInterval = (Double)Int32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
#region Decoding finished
if (DatIndex == 6)
{
#region Reset index
DatIndex = 0;
#endregion
#region Set data
ReturnData[DecodedPath].MessageType = Message.Data;
ReturnData[DecodedPath].Flow = ((ReturnData[DecodedPath].RawDeltaVolume / ReturnData[DecodedPath].RawDeltaVolumeScaling) / (ReturnData[DecodedPath].SampleInterval/65536))*Constants.FlowFactor;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
#endregion
}
#endregion
return ReturnData;
}
#endregion
}
catch (Exception ex)
{
ErrorLog.Log(LogErrReason.Exception(), "DecodeTelegram.DecodeProtocolE() failed", "0x" + ex.HResult.ToString("X", culture), String.Empty);
}
return ReturnData;
}
public static DecodedData[] DecodeProtocolF(String[] hexValues, DecodedData[] inputDecodedData)
{
#region Definitions and initializations
DecodedData[] ReturnData = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
ReturnData[Constants.PATH0] = ((DecodedData)(inputDecodedData[Constants.PATH0].Clone()));
ReturnData[Constants.PATH1] = ((DecodedData)(inputDecodedData[Constants.PATH1].Clone()));
ReturnData[Constants.PATH2] = ((DecodedData)(inputDecodedData[Constants.PATH2].Clone()));
UInt16 DatIndex = 0;
String ProtocolVersion = String.Empty;
#endregion
try
{
if (!String.Equals(hexValues[0], "@f"))
{
ReturnData[Constants.PATH0].ProtocolVersion = hexValues[0];
ReturnData[Constants.PATH1].ProtocolVersion = hexValues[0];
ReturnData[Constants.PATH2].ProtocolVersion = hexValues[0];
return ReturnData;
}
#region Decode comment ("DATA CHANNEL")
if ((String.Equals(hexValues[0], "@f")) && (UInt16.Equals((UInt16)hexValues.Count(), (UInt16)4)))
{
#region Reset data
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
ReturnData[Constants.PATH0].MessageType = String.Empty;
ReturnData[Constants.PATH1].MessageType = String.Empty;
ReturnData[Constants.PATH2].MessageType = String.Empty;
#endregion
#region Decode
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode telegram ("DATA CHANNEL")
#region Protocol version
case 0:
ReturnData[Constants.PATH0].ProtocolVersion = HexValue;
ReturnData[Constants.PATH1].ProtocolVersion = HexValue;
ReturnData[Constants.PATH2].ProtocolVersion = HexValue;
break;
#endregion
#region Decode "Display Volume"
case 1:
Int32 temp = 0;
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Constants.PATH0].FProt_DisplayVol = temp;
ReturnData[Constants.PATH1].FProt_DisplayVol = temp;
ReturnData[Constants.PATH2].FProt_DisplayVol = temp;
}
else
{
ReturnData[Constants.PATH0].FProt_DisplayVol = 0;
ReturnData[Constants.PATH1].FProt_DisplayVol = 0;
ReturnData[Constants.PATH2].FProt_DisplayVol = 0;
}
break;
#endregion
#region Time
case 2:
Int32 itemp = 0;
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out itemp))
{
ReturnData[Constants.PATH0].FProt_Time = itemp;
ReturnData[Constants.PATH1].FProt_Time = itemp;
ReturnData[Constants.PATH2].FProt_Time = itemp;
}
else
{
ReturnData[Constants.PATH0].FProt_Time = 0;
ReturnData[Constants.PATH1].FProt_Time = 0;
ReturnData[Constants.PATH2].FProt_Time = 0;
}
break;
#endregion
#region CRC
case 3:
ReturnData[Constants.PATH0].CRC = HexValue;
ReturnData[Constants.PATH1].CRC = HexValue;
ReturnData[Constants.PATH2].CRC = HexValue;
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
#region Decoding finished
if (UInt16.Equals(DatIndex, 3))
{
#region Reset index
DatIndex = 0;
#endregion
#region Set data
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
ReturnData[Constants.PATH0].DataForGraph = true;
ReturnData[Constants.PATH1].DataForGraph = true;
ReturnData[Constants.PATH2].DataForGraph = true;
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
#endregion
}
#endregion
return ReturnData;
}
#endregion
}
catch (Exception ex)
{
ErrorLog.Log(LogErrReason.Exception(), "DecodeTelegram.DecodeProtocolF() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty);
}
return ReturnData;
}
public static DecodedData[] DecodeProtocolG(String[] hexValues, DecodedData[] inputDecodedData)
{
#region Definitions and initializations
DecodedData[] ReturnData = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
ReturnData[Constants.PATH0] = ((DecodedData)(inputDecodedData[Constants.PATH0].Clone()));
ReturnData[Constants.PATH1] = ((DecodedData)(inputDecodedData[Constants.PATH1].Clone()));
ReturnData[Constants.PATH2] = ((DecodedData)(inputDecodedData[Constants.PATH2].Clone()));
Int32 temp = 0;
UInt16 DatIndex = 0;
UInt16 DecodedPath = Constants.PATH0;
String DecodedMessageType = String.Empty;
String ProtocolVersion = String.Empty;
#endregion
try
{
#region Decode comment ("DATA CHANNEL")
if (!String.Equals(hexValues[0], "@g"))
{
ProtocolVersion = hexValues[0];
return ReturnData;
}
if ((String.Equals(hexValues[0], "@g")) && (UInt16.Equals(hexValues.Count(), 17)))
{
#region Reset data
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
ReturnData[Constants.PATH0].MessageType = String.Empty;
ReturnData[Constants.PATH1].MessageType = String.Empty;
ReturnData[Constants.PATH2].MessageType = String.Empty;
#endregion
#region Decode
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode telegram ("DATA CHANNEL")
#region Protocol version
case 0:
ProtocolVersion = HexValue;
break;
#endregion
#region Decode PATH
case 1:
if (UInt16.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out DecodedPath))
{
DecodedPath--;
ReturnData[Constants.PATH0].Path = DecodedPath;
ReturnData[Constants.PATH1].Path = DecodedPath;
ReturnData[Constants.PATH2].Path = DecodedPath;
}
ReturnData[DecodedPath].ProtocolVersion = ProtocolVersion;
break;
#endregion
#region Data valid
case 2:
ReturnData[DecodedPath].DataValid = HexValue;
break;
#endregion
#region Delta time of flight
case 3:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].DeltaTimeOfFlight = temp * 3.637978;
break;
#endregion
#region Raw delta volume
case 4:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].RawDeltaVolume = (Double)temp;
break;
#endregion
#region Raw accumulated volume
case 5:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].RawDeltaVolumeAccu = (Double)temp;
break;
#endregion
#region Raw delta volume scaling
case 6:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].RawDeltaVolumeScaling = (Double)temp;
break;
#endregion
#region Sample interval
case 7:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].SampleInterval = (Double)temp;
break;
#endregion
#region Amplitude up
case 8:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[DecodedPath].GProt_AmplitudeUp = (Double)(temp >> 22);
}
break;
#endregion
#region Amplitude down
case 9:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].GProt_AmplitudeDown = (Double)(temp >> 22);
break;
#endregion
#region Pulsewidth ratio up
case 10:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].GProt_PulsewidthRatioUp = (Double)temp;
//ReturnData[DecodedPath].SampleInterval = (Double)Int32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
break;
#endregion
#region Pulsewidth ratio down
case 11:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].GProt_PulsewidthRatioDown = (Double)temp;
break;
#endregion
#region Temperature
case 12:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].HProt_RawTemperature = temp;
break;
#endregion
#region Temperatur scale
case 13:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[DecodedPath].HProt_TemperatureScale = temp;
}
break;
#endregion
#region Time
case 14:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[DecodedPath].GProt_Time = temp;
break;
#endregion
#region CRC
case 15:
ReturnData[Constants.PATH0].CRC = HexValue;
ReturnData[Constants.PATH1].CRC = HexValue;
ReturnData[Constants.PATH2].CRC = HexValue;
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
#region Decoding finished
if (DatIndex == 15)
{
#region Reset index
DatIndex = 0;
#endregion
#region Set data
ReturnData[DecodedPath].MessageType = Message.Data;
ReturnData[DecodedPath].Flow = ((ReturnData[DecodedPath].RawDeltaVolume / ReturnData[DecodedPath].RawDeltaVolumeScaling) / (ReturnData[DecodedPath].SampleInterval / 65536)) * Constants.FlowFactor;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
#endregion
}
#endregion
return ReturnData;
}
#endregion
}
catch (Exception ex)
{
ErrorLog.Log(LogErrReason.Exception(), "DecodeTelegram.DecodeProtocolG() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty);
}
return ReturnData;
}
public static DecodedData[] DecodeProtocolH(String[] hexValues, DecodedData[] inputDecodedData)
{
#region Definitions and initializations
DecodedData[] ReturnData = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
ReturnData[Constants.PATH0] = ((DecodedData)(inputDecodedData[Constants.PATH0].Clone()));
ReturnData[Constants.PATH1] = ((DecodedData)(inputDecodedData[Constants.PATH1].Clone()));
ReturnData[Constants.PATH2] = ((DecodedData)(inputDecodedData[Constants.PATH2].Clone()));
Int32 temp = 0;
UInt16 DatIndex = 0;
UInt16 Path = Constants.PATH0;
String DecodedMessageType = String.Empty;
String ProtocolVersion = String.Empty;
#endregion
try
{
if (!String.Equals(hexValues[0], "@h"))
{
ReturnData[Constants.PATH0].ProtocolVersion = hexValues[0];
ReturnData[Constants.PATH1].ProtocolVersion = hexValues[0];
ReturnData[Constants.PATH2].ProtocolVersion = hexValues[0];
return ReturnData;
}
#region Decode comment ("DATA CHANNEL")
if ((String.Equals(hexValues[0], "@h")) && (UInt16.Equals((UInt16)hexValues.Count(), (UInt16)15)))
{
#region Reset data
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
ReturnData[Constants.PATH0].MessageType = String.Empty;
ReturnData[Constants.PATH1].MessageType = String.Empty;
ReturnData[Constants.PATH2].MessageType = String.Empty;
#endregion
#region Decode
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode telegram ("DATA CHANNEL")
#region Protocol version
case 0:
ProtocolVersion = HexValue;
break;
#endregion
#region Decode PATH
case 1:
if (UInt16.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out Path))
{
Path--;
ReturnData[Constants.PATH0].Path = Path;
ReturnData[Constants.PATH1].Path = Path;
ReturnData[Constants.PATH2].Path = Path;
}
ReturnData[Path].ProtocolVersion = ProtocolVersion;
break;
#endregion
#region ERROR
case 2:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].HProt_Error = temp;
else
ReturnData[Path].HProt_Error = DataError.Unknown;
break;
#endregion
#region Total time of flight
case 3:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].HProt_TotalTimeOfFlightAvg = temp * ZeroOffsetTestConstants.DeltaTofAverageFactor / 1000000; // value in µs
break;
#endregion
#region Delta time of flight
case 4:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].HProt_DeltaTimeOfFlight = temp * ZeroOffsetTestConstants.DeltaTofAverageFactor;
break;
#endregion
#region Raw delta volume
case 5:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].HProt_RawDeltaVolume = (Double)temp;
break;
#endregion
#region Raw accumulated volume
case 6:
Int32 AccuVolumeRaw = 0;
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out AccuVolumeRaw))
ReturnData[Path].HProt_RawDeltaVolumeAccu = (Double)AccuVolumeRaw;
break;
#endregion
#region Raw delta volume scaling
case 7:
Int32 RawDeltaVolumeScaling = 0;
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out RawDeltaVolumeScaling))
ReturnData[Path].HProt_RawDeltaVolumeScaling = (Double)RawDeltaVolumeScaling;
const Double MilliliterToQmFactor = 1.0E-6;
Double VolumeScaleRawMl = 1024;
if (ReturnData[Path].HProt_RawDeltaVolumeScaling != 0)
VolumeScaleRawMl = ReturnData[Path].HProt_RawDeltaVolumeScaling;
Double VolumeFactorRawToQm = MilliliterToQmFactor / VolumeScaleRawMl;
ReturnData[Path].HProt_DeltaVolumeQm = ReturnData[Path].HProt_RawDeltaVolume * VolumeFactorRawToQm;
ReturnData[Path].HProt_AccuVolumeQm = ReturnData[Path].HProt_RawDeltaVolumeAccu * VolumeFactorRawToQm;
break;
#endregion
#region Sample interval
case 8:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].HProt_SampleInterval = (Double)temp;
break;
#endregion
#region Amplitude up
case 9:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].HProt_AmplitudeUp = (Double)(temp / Math.Pow(2, 22));
break;
#endregion
#region Amplitude down
case 10:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].HProt_AmplitudeDown = (Double)(temp / Math.Pow(2, 22));
break;
#endregion
#region Temperature
case 11:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].HProt_RawTemperature = temp;
break;
#endregion
#region Temperature scale/ calculate temperature
case 12:
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].HProt_TemperatureScale = temp;
ReturnData[Path].HProt_CalculatedTemperature = ((Double)ReturnData[Path].HProt_RawTemperature / Math.Pow(2, ((Double)temp)));
}
break;
#endregion
#region Time
case 13:
UInt32 time = 0;
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out time))
ReturnData[Path].HProt_Time = (UInt32)time / (UInt32)0x10000;
break;
#endregion
#region CRC
case 14:
ReturnData[Constants.PATH0].CRC = HexValue;
ReturnData[Constants.PATH1].CRC = HexValue;
ReturnData[Constants.PATH2].CRC = HexValue;
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
#region Decoding finished
if (UInt16.Equals(DatIndex, (UInt16)14))
{
#region Reset index
DatIndex = 0;
#endregion
#region Set data
ReturnData[Path].MessageType = Message.Data;
SetIProtocolToZero(ref ReturnData[Constants.PATH0]);
SetIProtocolToZero(ref ReturnData[Constants.PATH1]);
SetIProtocolToZero(ref ReturnData[Constants.PATH2]);
ReturnData[Path].Flow = ((ReturnData[Path].RawDeltaVolume / ReturnData[Path].RawDeltaVolumeScaling) / (ReturnData[Path].SampleInterval / 65536)) * Constants.FlowFactor;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
ReturnData[Constants.PATH0].DataForGraph = true;
ReturnData[Constants.PATH1].DataForGraph = true;
ReturnData[Constants.PATH2].DataForGraph = true;
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
#endregion
}
#endregion
return ReturnData;
}
#endregion
}
catch (Exception ex)
{
ErrorLog.Log(LogErrReason.Exception(), "DecodeTelegram.DecodeProtocolH() failed", $"0x{ex.HResult.ToString("X", culture)}", $"Index = {DatIndex.ToString(culture)}");
}
return ReturnData;
}
public static DecodedData[] DecodeProtocolI(String[] hexValues, DecodedData[] inputDecodedData, Double crystalFrequency)
{
#region Definitions and initializations
DecodedData[] ReturnData = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
String Where = "Beginning";
String ProtocolVersion = String.Empty;
ReturnData[Constants.PATH0] = ((DecodedData)(inputDecodedData[Constants.PATH0].Clone()));
ReturnData[Constants.PATH1] = ((DecodedData)(inputDecodedData[Constants.PATH1].Clone()));
ReturnData[Constants.PATH2] = ((DecodedData)(inputDecodedData[Constants.PATH2].Clone()));
UInt32 temp = 0;
UInt16 DatIndex = 0;
String DecodedMessageType = String.Empty;
#endregion
try
{
Where = "Data values";
#region Decode TDC-data ("DATA CHANNEL")
if (!String.Equals(hexValues[0], "@i"))
{
ReturnData[Constants.PATH0].ProtocolVersion = hexValues[0];
ReturnData[Constants.PATH1].ProtocolVersion = hexValues[0];
ReturnData[Constants.PATH2].ProtocolVersion = hexValues[0];
return ReturnData;
}
if ((String.Equals(hexValues[0], "@i") && (String.Equals(hexValues[1], Message.Data)) && (UInt16.Equals((UInt16)hexValues.Count(), (UInt16)29))))
{
#region Definitions and initializations
DecodedMessageType = Message.Data;
UInt16 Path = Constants.PATH0;
String MessageType = String.Empty;
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
#endregion
#region Decode and display
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode and display telegram
#region Protocol version
case 0:
ProtocolVersion = HexValue;
break;
#endregion
#region Message type
case 1:
MessageType = HexValue;
break;
#endregion
#region Decode PATH
case 2:
if (UInt16.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out Path))
{
Path--;
ReturnData[Constants.PATH0].Path = Path;
ReturnData[Constants.PATH1].Path = Path;
ReturnData[Constants.PATH2].Path = Path;
}
break;
#endregion
#region Data valid
case 3:
Int32 valid = 0;
if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out valid))
{
ReturnData[Path].IProt_Valid = valid;
}
break;
#endregion
#region TOF sum of all up
case 4:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_SumOfAllUp = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region Pulse width up
case 5:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_PwUp = (Double)Math.Round((((Double)temp / 128)), 2);
#endregion
break;
#endregion
#region Amplitude up
case 6:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_AmpUp = temp;
#endregion
break;
#endregion
#region Amplitude calibrate value high
case 7:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_AmpCalHigh = temp;
#endregion
break;
#endregion
#region TOF sum of all down
case 8:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_SumOfAllDown = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8); // From Acam datasheet vol.2, 5-1
#endregion
break;
#endregion
#region Pulse width down
case 9:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_PwDown = (Double)Math.Round((((Double)temp / 128)), 2);
#endregion
break;
#endregion
#region Amplitude down
case 10:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_AmpDown = temp;
#endregion
break;
#endregion
#region Amplitude calibrate value low
case 11:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].IProt_AmpCalLow = (Double)UInt32.Parse(HexValue, NumberStyles.AllowHexSpecifier);
ReturnData[Path].IProt_AmpGradient = Constants.Vcal / (ReturnData[Path].IProt_AmpCalHigh - ReturnData[Path].IProt_AmpCalLow);
ReturnData[Path].IProt_AmpOffset = ((2 * ReturnData[Path].IProt_AmpCalLow) - ReturnData[Path].IProt_AmpCalHigh) * ReturnData[Path].IProt_AmpGradient;
ReturnData[Path].IProt_AmpUpCalculated = ReturnData[Path].IProt_AmpGradient * ReturnData[Path].IProt_AmpUp - ReturnData[Path].IProt_AmpOffset;
ReturnData[Path].IProt_AmpDownCalculated = ReturnData[Path].IProt_AmpGradient * ReturnData[Path].IProt_AmpDown - ReturnData[Path].IProt_AmpOffset;
}
#endregion
break;
#endregion
#region TOF0 up
case 12:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_TofUp[Constants.HIT0] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF1 up
case 13:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_TofUp[Constants.HIT1] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF2 up
case 14:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_TofUp[Constants.HIT2] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF3 up
case 15:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_TofUp[Constants.HIT3] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF4 up
case 16:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_TofUp[Constants.HIT4] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF5 up
case 17:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_TofUp[Constants.HIT5] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF6 up
case 18:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_TofUp[Constants.HIT6] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF7 up
case 19:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
ReturnData[Path].IProt_TofUp[Constants.HIT7] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
#endregion
break;
#endregion
#region TOF0 down/ DIF-TOF0
case 20:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].IProt_TofDown[Constants.HIT0] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].IProt_DifTof[Constants.HIT0] = (ReturnData[Path].IProt_TofDown[Constants.HIT0] - ReturnData[Path].IProt_TofUp[Constants.HIT0]) * 1000;
}
#endregion
break;
#endregion
#region TOF1 down/ DIF-TOF1
case 21:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].IProt_TofDown[Constants.HIT1] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].IProt_DifTof[Constants.HIT1] = (ReturnData[Path].IProt_TofDown[Constants.HIT1] - ReturnData[Path].IProt_TofUp[Constants.HIT1]) * 1000;
}
#endregion
break;
#endregion
#region TOF2 down/ DIF-TOF2
case 22:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].IProt_TofDown[Constants.HIT2] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].IProt_DifTof[Constants.HIT2] = (ReturnData[Path].IProt_TofDown[Constants.HIT2] - ReturnData[Path].IProt_TofUp[Constants.HIT2]) * 1000;
}
#endregion
break;
#endregion
#region TOF3 down/ DIF-TOF3
case 23:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].IProt_TofDown[Constants.HIT3] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].IProt_DifTof[Constants.HIT3] = (ReturnData[Path].IProt_TofDown[Constants.HIT3] - ReturnData[Path].IProt_TofUp[Constants.HIT3]) * 1000;
}
#endregion
break;
#endregion
#region TOF4 down/ DIF-TOF4
case 24:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].IProt_TofDown[Constants.HIT4] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].IProt_DifTof[Constants.HIT4] = (ReturnData[Path].IProt_TofDown[Constants.HIT4] - ReturnData[Path].IProt_TofUp[Constants.HIT4]) * 1000;
}
#endregion
break;
#endregion
#region TOF5 down/ DIF-TOF5
case 25:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].IProt_TofDown[Constants.HIT5] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].IProt_DifTof[Constants.HIT5] = (ReturnData[Path].IProt_TofDown[Constants.HIT5] - ReturnData[Path].IProt_TofUp[Constants.HIT5]) * 1000;
}
#endregion
break;
#endregion
#region TOF6 down/ DIF-TOF6
case 26:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].IProt_TofDown[Constants.HIT6] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].IProt_DifTof[Constants.HIT6] = (ReturnData[Path].IProt_TofDown[Constants.HIT6] - ReturnData[Path].IProt_TofUp[Constants.HIT6]) * 1000;
}
#endregion
break;
#endregion
#region TOF7 down/ DIF-TOF7
case 27:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].IProt_TofDown[Constants.HIT7] = (Double)Math.Round((((Double)temp / 65536) * ((crystalFrequency))) * ReturnData[Path].HccCorrectionFactor, 8);
ReturnData[Path].IProt_DifTof[Constants.HIT7] = (ReturnData[Path].IProt_TofDown[Constants.HIT7] - ReturnData[Path].IProt_TofUp[Constants.HIT7]) * 1000;
}
#endregion
break;
#endregion
#region CRC
case 28:
#region Calculate value and assign
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].IProt_Crc = HexValue;
}
#endregion
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
if (UInt16.Equals(DatIndex, (UInt16)28)) // last position of telegram
{
#region Decoding finished
#region Reset index
DatIndex = 0;
#endregion
#region Set data
SetHProtocolToZero(ref ReturnData[Constants.PATH0]);
SetHProtocolToZero(ref ReturnData[Constants.PATH1]);
SetHProtocolToZero(ref ReturnData[Constants.PATH2]);
ReturnData[Path].ProtocolVersion = ProtocolVersion;
ReturnData[Path].MessageType = MessageType;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
ReturnData[Constants.PATH0].DataForGraph = true;
ReturnData[Constants.PATH1].DataForGraph = true;
ReturnData[Constants.PATH2].DataForGraph = true;
#endregion
#region Return data
return ReturnData;
#endregion
#endregion
}
else
DatIndex++;
}
#endregion
return ReturnData;
}
#endregion
#region Decode Temperature data ("DATA CHANNEL")
Where = "Temperature";
if ((String.Equals(hexValues[0], "@i") && (String.Equals(hexValues[1], Message.Temperature)) && (UInt16.Equals((UInt16)hexValues.Count(), (UInt16)15))))
{
DecodedMessageType = Message.Temperature;
#region Reset data
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
#endregion
#region Decode
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode telegram ("DATA CHANNEL")
#region Protocol version
case 0:
ReturnData[Constants.PATH0].ProtocolVersion = HexValue;
ReturnData[Constants.PATH1].ProtocolVersion = HexValue;
ReturnData[Constants.PATH2].ProtocolVersion = HexValue;
break;
#endregion
#region Message type
case 1:
ReturnData[Constants.PATH0].MessageType = HexValue;
ReturnData[Constants.PATH1].MessageType = HexValue;
ReturnData[Constants.PATH2].MessageType = HexValue;
break;
#endregion
#region Data valid
case 2:
ReturnData[Constants.PATH0].DataValid = HexValue;
ReturnData[Constants.PATH1].DataValid = HexValue;
ReturnData[Constants.PATH2].DataValid = HexValue;
break;
#endregion
#region Not used
case 3:
#region Schmitt trigger delay compensation values
// [tbd]
#endregion
break;
#endregion
#region Not used
case 4:
#region PT reference impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 5:
#region PT cold impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 6:
#region PT hot impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 7:
#region PT reference 1st correction value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 8:
#region Schmitt trigger delay compensation value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 9:
#region PT reference impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 10:
#region PT cold impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 11:
#region PT hot impedance value
// [tbd]
#endregion
break;
#endregion
#region Not used
case 12:
#region PT reference 1st rds(on) correction value
// [tbd]
#endregion
break;
#endregion
#region Get temperature value
case 13:
#region Temperature value
Double Temperature;
if (Double.TryParse(HexValue, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out Temperature))
{
ReturnData[Constants.PATH0].IProt_Temperature = Temperature;
ReturnData[Constants.PATH1].IProt_Temperature = Temperature;
ReturnData[Constants.PATH2].IProt_Temperature = Temperature;
}
#endregion
break;
#endregion
#region Message type
case 14:
ReturnData[Constants.PATH0].CRC = HexValue;
ReturnData[Constants.PATH1].CRC = HexValue;
ReturnData[Constants.PATH2].CRC = HexValue;
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
#region Decoding finished
if (UInt16.Equals(DatIndex, (UInt16)14))
{
#region Reset index
DatIndex = 0;
ReturnData[Constants.PATH0].Path = Constants.PATH0;
ReturnData[Constants.PATH1].Path = Constants.PATH0;
ReturnData[Constants.PATH2].Path = Constants.PATH0;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
ReturnData[Constants.PATH0].DataForGraph = false;
ReturnData[Constants.PATH1].DataForGraph = false;
ReturnData[Constants.PATH2].DataForGraph = false;
SetHProtocolToZero(ref ReturnData[Constants.PATH0]);
SetHProtocolToZero(ref ReturnData[Constants.PATH1]);
SetHProtocolToZero(ref ReturnData[Constants.PATH2]);
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
#endregion
}
#endregion
return ReturnData;
}
#endregion
#region Decode HCC-value ("DATA CHANNEL")
Where = "HCC-Value";
if ((String.Equals(hexValues[0], "@i") && (String.Equals(hexValues[1], Message.Hcc)) && (UInt16.Equals((UInt16)hexValues.Count(), (UInt16)5))))
{
DecodedMessageType = Message.Hcc;
#region Definitions
UInt16 Path = Constants.PATH0;
String MessageType = String.Empty;
#endregion
#region Reset data
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
ReturnData[Constants.PATH0].MessageType = String.Empty;
ReturnData[Constants.PATH1].MessageType = String.Empty;
ReturnData[Constants.PATH2].MessageType = String.Empty;
#endregion
#region Decode
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode telegram ("DATA CHANNEL")
#region Protocol version
case 0:
ProtocolVersion = HexValue;
break;
#endregion
#region Message type
case 1:
MessageType = HexValue;
break;
#endregion
#region Get PATH
case 2:
UInt16 PathTemp = 0;
if (UInt16.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out PathTemp))
Path = (UInt16)(PathTemp - 1);
break;
#endregion
#region HCC-value
case 3:
#region Calculate value
/*
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].HccVal = (Double)temp;
ReturnData[Path].HccCorrectionFactor = (Double)(4 * Constants.NominalFrequency * 1000000) / ((temp >> 16) * 32768);
}*/
#endregion
if (UInt32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp))
{
ReturnData[Path].HccVal = (Double)temp;
ReturnData[Path].HccCorrectionFactor = (Double)(4 * Constants.NominalFrequency * 1000000) / ((temp >> 16) * 32768);
}
break;
#endregion
#region CRC
case 4:
#region Calculate value
ReturnData[Path].CRC = HexValue;
#endregion
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
#region Decoding finished
if (UInt16.Equals(DatIndex, (UInt16)4))
{
#region Reset index
DatIndex = 0;
#endregion
#region Set data
ReturnData[Path].ProtocolVersion = ProtocolVersion;
ReturnData[Path].MessageType = MessageType;
ReturnData[Constants.PATH0].Path = Path;
ReturnData[Constants.PATH1].Path = Path;
ReturnData[Constants.PATH2].Path = Path;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
SetHProtocolToZero(ref ReturnData[Constants.PATH0]);
SetHProtocolToZero(ref ReturnData[Constants.PATH1]);
SetHProtocolToZero(ref ReturnData[Constants.PATH2]);
ReturnData[Path].DataForGraph = false;
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
#endregion
}
#endregion
return ReturnData;
}
#endregion
#region Decode comment ("DATA CHANNEL")
Where = "Comment";
if ((String.Equals(hexValues[0], "@i") && (String.Equals(hexValues[1], Message.Comment))))
{
DecodedMessageType = Message.Comment;
#region Reset data
ReturnData[Constants.PATH0].DecodingSuceeded = false;
ReturnData[Constants.PATH1].DecodingSuceeded = false;
ReturnData[Constants.PATH2].DecodingSuceeded = false;
ReturnData[Constants.PATH0].MessageType = String.Empty;
ReturnData[Constants.PATH1].MessageType = String.Empty;
ReturnData[Constants.PATH2].MessageType = String.Empty;
#endregion
#region Decode
foreach (String HexValue in hexValues)
{
switch (DatIndex)
{
#region Decode telegram ("DATA CHANNEL")
#region Protocol version
case 0:
ReturnData[Constants.PATH0].ProtocolVersion = HexValue;
ReturnData[Constants.PATH1].ProtocolVersion = HexValue;
ReturnData[Constants.PATH2].ProtocolVersion = HexValue;
break;
#endregion
#region Message type
case 1:
ReturnData[Constants.PATH0].MessageType = HexValue;
ReturnData[Constants.PATH1].MessageType = HexValue;
ReturnData[Constants.PATH2].MessageType = HexValue;
break;
#endregion
#region Comment0
case 2:
#region Comment0
if (!String.IsNullOrEmpty(HexValue))
{
ReturnData[Constants.PATH0].Comment = HexValue;
ReturnData[Constants.PATH1].Comment = HexValue;
ReturnData[Constants.PATH2].Comment = HexValue;
}
#endregion
break;
#endregion
#region Comment1
case 3:
#region Comment1
if (!String.IsNullOrEmpty(HexValue))
{
ReturnData[Constants.PATH0].Comment = $"{ReturnData[Constants.PATH0].Comment}{HexValue}";
ReturnData[Constants.PATH1].Comment = $"{ReturnData[Constants.PATH1].Comment}{HexValue}";
ReturnData[Constants.PATH2].Comment = $"{ReturnData[Constants.PATH2].Comment}{HexValue}";
}
#endregion
break;
#endregion
#region Comment2
case 4:
#region Comment2
if (!String.IsNullOrEmpty(HexValue))
{
ReturnData[Constants.PATH0].Comment = $"{ReturnData[Constants.PATH0].Comment} {HexValue}";
ReturnData[Constants.PATH1].Comment = $"{ReturnData[Constants.PATH1].Comment} {HexValue}";
ReturnData[Constants.PATH2].Comment = $"{ReturnData[Constants.PATH2].Comment} {HexValue}";
}
#endregion
break;
#endregion
#region Comment3
case 5:
#region Comment3
if (!String.IsNullOrEmpty(HexValue))
{
ReturnData[Constants.PATH0].Comment = $"{ReturnData[Constants.PATH0].Comment} {HexValue}";
ReturnData[Constants.PATH1].Comment = $"{ReturnData[Constants.PATH1].Comment} {HexValue}";
ReturnData[Constants.PATH2].Comment = $"{ReturnData[Constants.PATH2].Comment} {HexValue}";
}
#endregion
break;
#endregion
#region Comment4
case 6:
#region Comment4
if (!String.IsNullOrEmpty(HexValue))
{
ReturnData[Constants.PATH0].Comment = $"{ReturnData[Constants.PATH0].Comment} {HexValue}";
ReturnData[Constants.PATH1].Comment = $"{ReturnData[Constants.PATH1].Comment} {HexValue}";
ReturnData[Constants.PATH2].Comment = $"{ReturnData[Constants.PATH2].Comment} {HexValue}";
}
#endregion
break;
#endregion
#region Comment5
case 7:
#region Comment5
if (!String.IsNullOrEmpty(HexValue))
{
ReturnData[Constants.PATH0].Comment = $"{ReturnData[Constants.PATH0].Comment} {HexValue}";
ReturnData[Constants.PATH1].Comment = $"{ReturnData[Constants.PATH1].Comment} {HexValue}";
ReturnData[Constants.PATH2].Comment = $"{ReturnData[Constants.PATH2].Comment} {HexValue}";
}
#endregion
break;
#endregion
#region Comment6
case 8:
#region Comment6
if (!String.IsNullOrEmpty(HexValue))
{
ReturnData[Constants.PATH0].Comment = $"{ReturnData[Constants.PATH0].Comment} {HexValue}";
ReturnData[Constants.PATH1].Comment = $"{ReturnData[Constants.PATH1].Comment} {HexValue}";
ReturnData[Constants.PATH2].Comment = $"{ReturnData[Constants.PATH2].Comment} {HexValue}";
}
#endregion
break;
#endregion
#region Default
default: break;
#endregion
#endregion
}
#region Decoding finished
if (UInt16.Equals(DatIndex, (UInt16)(hexValues.Count() - 1)))
{
#region Reset index
DatIndex = 0;
#endregion
#region Set data
ReturnData[Constants.PATH0].Path = Constants.PATH0;
ReturnData[Constants.PATH1].Path = Constants.PATH0;
ReturnData[Constants.PATH2].Path = Constants.PATH0;
ReturnData[Constants.PATH0].DecodingSuceeded = true;
ReturnData[Constants.PATH1].DecodingSuceeded = true;
ReturnData[Constants.PATH2].DecodingSuceeded = true;
ReturnData[Constants.PATH0].DataForGraph = false;
ReturnData[Constants.PATH1].DataForGraph = false;
ReturnData[Constants.PATH2].DataForGraph = false;
SetHProtocolToZero(ref ReturnData[Constants.PATH0]);
SetHProtocolToZero(ref ReturnData[Constants.PATH1]);
SetHProtocolToZero(ref ReturnData[Constants.PATH2]);
#endregion
#region Return data
return ReturnData;
#endregion
}
else
DatIndex++; // switch to next position of data
#endregion
}
#endregion
return ReturnData;
}
#endregion
}
catch (Exception ex)
{
#region Error
ErrorLog.Log(LogErrReason.Exception(), "DecodeTelegram.DecodeProtocolI() failed", $"0x{ex.HResult.ToString("X", culture)}", Where);
#endregion
}
#region Return data
return ReturnData;
#endregion
}
public static void SetIProtocolToZero(ref DecodedData input)
{
input.IProt_SumOfAllUp = 0;
input.IProt_PwUp = 0;
input.IProt_AmpUp = 0;
input.IProt_AmpCalHigh = 0;
input.IProt_SumOfAllDown = 0;
input.IProt_PwDown = 0;
input.IProt_AmpDown = 0;
input.IProt_AmpCalLow = 0;
input.IProt_AmpGradient = 0;
input.IProt_AmpOffset = 0;
input.IProt_AmpUpCalculated = 0;
input.IProt_AmpDownCalculated = 0;
for (UInt16 k = 0; k < 8; k++)
{
input.IProt_TofUp[k] = 0;
input.IProt_TofDown[k] = 0;
input.IProt_DifTof[k] = 0;
}
input.IProt_Temperature = 0;
}
public static void SetHProtocolToZero(ref DecodedData input)
{
input.HProt_AmplitudeUp = 0;
input.HProt_AmplitudeDown = 0;
input.HProt_CalculatedTemperature = 0;
input.HProt_DeltaTimeOfFlight = 0;
input.HProt_TotalTimeOfFlightAvg = 0;
input.HProt_AccuVolumeQm = 0;
input.HProt_DeltaVolumeQm = 0;
input.HProt_Error = DataError.NoError;
}
public static DecodedData[] Reset()
{
DecodedData[] data = DecodedDataHelper.getDefaultDecodedDataArray(3);
for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++)
data[Path] = DecodedDataHelper.getDefaultDecodedData();
return data;
}
}
}