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

702 lines
35 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Globalization;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Printing;
using ZedGraph;
using System.Text.RegularExpressions;
namespace GenesisDisplayTool
{
public static class DecodedDataHelper
{
public static DecodedData[] getDefaultDecodedDataArray(Int32 count)
{
var ret = new DecodedData[count];
for (Int32 i = 0; i < count; i++)
{
ret[i] = getDefaultDecodedData();
}
return ret;
}
public static DecodedData getDefaultDecodedData()
{
return new DecodedData()
{
test = 0,
DataValid = "0",
MessageType = String.Empty,
ProtocolVersion = String.Empty,
Comment = String.Empty,
HccVal = 0,
TofSumOfAllUp = 0,
TofSumOfAllDown = 0,
TofUp = new Double[8] { 0, 0, 0, 0, 0, 0, 0, 0 },
TofDown = new Double[8] { 0, 0, 0, 0, 0, 0, 0, 0 },
DifTof = new Double[8] { 0, 0, 0, 0, 0, 0, 0, 0 },
PulsewidthUp = 0,
PulsewidthDown = 0,
AmpUpRaw = 0,
AmpDownRaw = 0,
AmpUpCalculated = 0,
AmpDownCalculated = 0,
AmpCalHigh = 0,
AmpCalLow = 0,
AmpOffset = 0,
AmpGradient = 0,
TemperatureHot = 0,
TemperatureCold = 0,
HccCorrectionFactor = Constants.DefaultHccCorrectionFactor,
Path = 0,
DeltaTimeOfFlight = 0.0, // protocol version 'e'
RawDeltaVolume = 0.0, // protocol version 'e'
RawDeltaVolumeScaling = 0.0, // protocol version 'e'
SampleInterval = 0,
Flow = 0,
TofSumOfAllUpMean = 0,
TofSumOfAllDownMean = 0,
TofUpMean = new Double[8] { 0, 0, 0, 0, 0, 0, 0, 0 },
TofDownMean = new Double[8] { 0, 0, 0, 0, 0, 0, 0, 0 },
DifTofMean = new Double[8] { 0, 0, 0, 0, 0, 0, 0, 0 },
DifTof3HitsMean = 0,
DifTof8HitsMean = 0,
PulsewidthUpMean = 0,
PulsewidthDownMean = 0,
AmpUpMean = 0,
AmpDownMean = 0,
TemperatureHotMean = 0,
FlowMean = 0,
DifTof3HitsStdDeviation = 0,
DifTof8HitsStdDeviation = 0,
StdDeviation = new Double[8] { 0, 0, 0, 0, 0, 0, 0, 0 },
Mode = String.Empty,
RawTimestamp = String.Empty,
CsvTimestamp = String.Empty,
DecodingSuceeded = false,
FProt_DisplayVol = 0,
FProt_Time = 0,
CRC = String.Empty,
#region G-Protocol
GProt_AmplitudeUp = 0,
GProt_AmplitudeDown = 0,
GProt_PulsewidthRatioUp = 0,
GProt_PulsewidthRatioDown = 0,
#endregion
#region H-Protocol
HProt_Error = 0,
HProt_RawTemperature = 0,
HProt_CalculatedTemperature = 0,
HProt_TotalTimeOfFlightAvg = 0,
HProt_TimeOfFlightUp = 0,
HProt_TimeOfFlightDown = 0,
HProt_TemperatureScale = 0,
HProt_AmplitudeDown = 0,
HProt_AmplitudeUp = 0,
HProt_DeltaTimeOfFlight = 0,
HProt_RawDeltaVolume = 0,
HProt_RawDeltaVolumeScaling = 0,
HProt_RawDeltaVolumeAccu = 0,
HProt_DeltaVolumeQm = 0,
HProt_AccuVolumeQm = 0,
#endregion
#region I-Protocol
IProt_SumOfAllUp = 0,
IProt_PwUp = 0,
IProt_AmpUp = 0,
IProt_AmpCalHigh = 0,
IProt_SumOfAllDown = 0,
IProt_PwDown = 0,
IProt_AmpCalLow = 0,
IProt_AmpGradient = 0,
IProt_AmpOffset = 0,
IProt_AmpUpCalculated = 0,
IProt_AmpDownCalculated = 0,
IProt_TofUp = new Double[8] { 0, 0, 0, 0, 0, 0, 0, 0 },
IProt_TofDown = new Double[8] { 0, 0, 0, 0, 0, 0, 0, 0 },
IProt_DifTof = new Double[8] { 0, 0, 0, 0, 0, 0, 0, 0 },
IProt_Crc = String.Empty
#endregion
};
}
}
public class DecodedData : ICloneable
{
#region For all protocols
public Double test;
public String DataValid;
public String MessageType;
public String ProtocolVersion;
public UInt16 Path;
#endregion
#region D-protocol
public String Comment;
public Double HccVal;
public Double TofSumOfAllUp;
public Double TofSumOfAllDown;
public Double[] TofUp = new Double[8];
public Double[] TofDown = new Double[8];
public Double[] DifTof = new Double[8];
public Double PulsewidthUp;
public Double PulsewidthDown;
public Double AmpUpRaw;
public Double AmpDownRaw;
public Double AmpUpCalculated;
public Double AmpDownCalculated;
public Double AmpCalHigh;
private Double ampCalLow;
public Double AmpCalLow { get { return ampCalLow; } set { ampCalLow = value; } }
public Double AmpOffset;
public Double AmpGradient;
public Double TemperatureHot;
public Double TemperatureCold;
public Double HccCorrectionFactor;
#endregion
#region E-protocol/ G-protocol
public Double DeltaTimeOfFlight; // protocol version 'e' and 'g'
public Double RawDeltaVolume; // protocol version 'e'
public Double RawDeltaVolumeScaling; // protocol version 'e'
public Double RawDeltaVolumeAccu; // protocol version 'e'
public Double SampleInterval;
public Double Flow;
#endregion
#region F-protocol
public Int32 FProt_DisplayVol;
public Int32 FProt_Time;
public Int32 GProt_Time;
public String CRC;
#endregion
#region G-protocol
public Double GProt_AmplitudeUp;
public Double GProt_AmplitudeDown;
public Double GProt_PulsewidthRatioUp;
public Double GProt_PulsewidthRatioDown;
#endregion
#region I-protocol
public Int32 IProt_Valid;
public Double IProt_SumOfAllUp;
public Double IProt_PwUp;
public Double IProt_AmpUp;
public Double IProt_AmpCalHigh;
public Double IProt_SumOfAllDown;
public Double[] IProt_DifTof;
public Double IProt_PwDown;
public Double IProt_AmpDown;
public Double IProt_AmpCalLow;
public Double IProt_AmpGradient;
public Double IProt_AmpOffset;
public Double IProt_AmpUpCalculated;
public Double IProt_AmpDownCalculated;
public Double IProt_Temperature;
public Double[] IProt_TofUp = new Double[8];
public Double[] IProt_TofDown = new Double[8];
public Boolean DataForGraph;
public Boolean DataForTempGraph;
public String IProt_Crc;
#endregion
#region H-protocol
public Int32 HProt_Error;
public Double HProt_SampleInterval;
public Double HProt_AmplitudeUp;
public Double HProt_AmplitudeDown;
public Double HProt_TotalTimeOfFlightAvg;
public Double HProt_DeltaTimeOfFlight;
public Double HProt_RawDeltaVolume;
public Double HProt_RawDeltaVolumeAccu;
public Double HProt_DeltaVolumeQm;
public Double HProt_AccuVolumeQm;
public Double HProt_RawDeltaVolumeScaling;
public Double HProt_TimeOfFlightUp;
public Double HProt_TimeOfFlightDown;
public Double HProt_RawTemperature;
public Double HProt_CalculatedTemperature;
public Double HProt_TemperatureScale;
public UInt32 HProt_Time;
#endregion
#region Mean values
public Double TofSumOfAllUpMean;
public Double TofSumOfAllDownMean;
public Double[] TofUpMean = new Double[8];
public Double[] TofDownMean = new Double[8];
public Double[] DifTofMean = new Double[8];
public Double DifTof3HitsMean;
public Double DifTof8HitsMean;
public Double PulsewidthUpMean;
public Double PulsewidthDownMean;
public Double AmpUpMean;
public Double AmpDownMean;
public Double TemperatureHotMean;
public Double TemperatureColdMean;
public Double FlowMean;
#endregion
#region Standard deviation
public Double DifTof3HitsStdDeviation;
public Double DifTof8HitsStdDeviation;
public Double[] StdDeviation;
#endregion
#region Miscellaneous
public String Mode;
public String RawTimestamp;
public String CsvTimestamp;
public Boolean DecodingSuceeded;
#endregion
public object Clone()
{
var toClone = (DecodedData)MemberwiseClone();
toClone.TofUp = (Double[])TofUp.Clone();
toClone.TofDown = (Double[])TofDown.Clone();
toClone.DifTof = (Double[])DifTof.Clone();
return toClone;
}
}
public partial class GENESIS_DISPLAY_TOOL : Form
{
Int32 GcCounter = 0;
private void MainLoop(object sender, EventArgs e)
{
CultureInfo Culture = GetGlobalCulture();
const UInt16 MeterNumber = Constants.Meter1;
#region Definitions and initializations
DecodedData[] DecodingResult = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
DecodingResult[Constants.PATH0] = ((DecodedData)Decoded[Constants.PATH0].Clone());
DecodingResult[Constants.PATH1] = ((DecodedData)Decoded[Constants.PATH1].Clone());
DecodingResult[Constants.PATH2] = ((DecodedData)Decoded[Constants.PATH2].Clone());
String MessageType = String.Empty;
String ProtocolVersion = String.Empty;
String Temp = String.Empty;
//l_DispRxStringLength.Text = RxDataBuffer[MeterNumber].Length.ToString(culture); // Debug length of rxstring
#endregion
#region Prepare data
if (RxDataBuffer[MeterNumber].Contains("@"))
{
Temp = $"{RxDataBuffer[MeterNumber]}\n";
RxDataBuffer[MeterNumber] = String.Empty;
ValidData[MeterNumber] = true;
}
else
ValidData[MeterNumber] = false;
#endregion
#region Decode
if (ValidData[MeterNumber])
{
ValidData[MeterNumber] = false;
#region Decode data
DecodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, cB_StdDevEnable.Checked, cB_MeanValuesEnable.Checked, DecodingResult, Constants.NominalFrequency);
#endregion
#region Get timestamp
DateTime CurrentTime = new DateTime();
CurrentTime = DateTime.Now;
String RawTimestamp = CurrentTime.ToString(Formats.RawDataDateTimeLogString, Culture);
String CsvTimestamp = CurrentTime.ToString(Formats.CsvDateTimeLogString, Culture);
#endregion
#region Additional decoding parameters
UInt16 Path = DecodingResult[Constants.PATH0].Path; // the same value for all paths
MessageType = DecodingResult[Path].MessageType;
ProtocolVersion = DecodingResult[Path].ProtocolVersion;
#endregion
#region Raw data
RawData.DisplayText(RawTimestamp, Temp, Culture);
RawData.SaveText(SaveDataPathRaw, RawTimestamp, RawLoggingSingleMeterEnable, Temp, Constants.RawCyclesToStorage, Culture); // print complet
#endregion
#region Labels
Display.DecodedDataUpdateLabels(DecodingResult, Path, Culture);
#endregion
#region Comment field
//if ((UInt16.Equals(Path, Constants.PATH0)) && (String.Equals(MessageType, Message.Comment)))
//{
// if (rTB_DecodedDataComment.Text.Length > nUD_SettingsCommentFieldAutoclear.Value)
// rTB_DecodedDataComment.Clear();
// rTB_DecodedDataComment.AppendText($"{DecodingResult[Constants.PATH0].Comment}\n");
// rTB_DecodedDataComment.ScrollToCaret();
//}
#endregion
#region Maingraph
// Maingraph1.InitParameters((Double)nUD_SettingsXMainGraph.Value, lB_Graph_SelectGraph.Text, cB_MultihitOverallAvgEn.Checked, (Int32)nUD_SettingsStdDev.Value, (Int32)nUD_SettingsMean.Value);
if ((cB_GraphReset.Checked))// && (MessageType == Message.Data))
{
#region Live values
if ((!lB_Graph_SelectGraph.Text.Contains("Mean")) && (!lB_Graph_SelectGraph.Text.Contains("deviation"))&& (Boolean.Equals(DecodingResult[Path].DataForGraph, true)))
{
AssignDataToMainGraph(DecodingResult, Path, ref GraphListMainTotal, ref GraphListMainWindow, (Double)nUD_SettingsXMainGraph.Value);
//zGC_MainGraph.AssignData(DecodingResult, Path, ref GraphCounterDataMainTotal, ref GraphIndexOfLists);
goto SkipOptions; // also works without 'goto' if you're wanna be MISRA compliant
}
#endregion
//#region Mean values/ no std deviation
//if ((lB_Graph_SelectGraph.Text.Contains("Mean")) && (!lB_Graph_SelectGraph.Text.Contains("deviation")))
//{
// if(((Int32)TelegramCounterTofMean[Constants.PATH0] >= (Int32)nUD_SettingsMean.Value||
// ((Int32)TelegramCounterFlowMean[Constants.PATH0] >= (Int32)nUD_SettingsMean.Value))||
// ((Int32)TelegramCounterOthersMean[Constants.PATH0] >= (Int32)nUD_SettingsMean.Value))
// //Maingraph1.AssignData(DecodingResult, Path, ref GraphCounterDataMainTotal, ref GraphIndexOfLists);
// goto SkipOptions; // also works without 'goto'
//}
//#endregion
//#region Std deviation/ no mean values
//if ((!lB_Graph_SelectGraph.Text.Contains("Mean")) && (lB_Graph_SelectGraph.Text.Contains("deviation")))
//{
// if ((Int32)TelegramCounterStdDeviationMultihit[Constants.PATH0] >= (Int32)nUD_SettingsStdDev.Value)
// //Maingraph1.AssignData(DecodingResult, Path, ref GraphCounterDataMainTotal, ref GraphIndexOfLists);
// goto SkipOptions; // also works without 'goto' if you're wanna be MISRA compliant
//}
//#endregion
/*
#region Mean values/ std deviation
if ((lB_Graph_SelectGraph.Text.Contains("Mean")) && (lB_Graph_SelectGraph.Text.Contains("deviation")))
{
if (((Int32)TelegramCounterStdDeviationMultihit[Constants.PATH0] >= (Int32)nUD_SettingsStdDev.Value)
&& ((Int32)TelegramCounterTofMean[Constants.PATH0] >= (Int32)nUD_SettingsMean.Value)||
((Int32)TelegramCounterFlowMean[Constants.PATH0] >= (Int32)nUD_SettingsMean.Value))
Maingraph1.AssignData(DecodingResult, Path, ref GraphCounterDataMainTotal, ref GraphIndexOfLists);
}
#endregion*/
// Jump to here to skip unneeded options
SkipOptions:;
}
#endregion
#region Refresh values for background workers
Decoded[Constants.PATH0] = (DecodedData)DecodingResult[Constants.PATH0].Clone();
Decoded[Constants.PATH1] = (DecodedData)DecodingResult[Constants.PATH1].Clone();
Decoded[Constants.PATH2] = (DecodedData)DecodingResult[Constants.PATH2].Clone();
#endregion
return;
#region Start mean dif tofs
if ((ProtocolVersion == "d") || (ProtocolVersion == "i"))
{
switch (Path)
{
case Constants.PATH0:
ElapsedCounterTofMean = StartBackgroundWorkerTofMeanPath0(MessageType, ElapsedCounterTofMean, cB_MeanValuesEnable.Checked);
if (TelegramCounterDifTofMean[Constants.PATH0] >= (UInt16)nUD_SettingsMean.Value)
ElapsedCounterStdDeviation = StartBackgroundWorkerStdDeviationPath0(MessageType, ElapsedCounterStdDeviation, cB_StdDevEnable.Checked);
ElapsedCounterDifTofMean = StartDifTofMeanBackgroundWorkerPath0(MessageType, ElapsedCounterDifTofMean, cB_MeanValuesEnable.Checked);
ElapsedCounterMultiHitMean = StartMultihitBackgroundWorkerPath0(MessageType, ElapsedCounterMultiHitMean, cB_MeanValuesEnable.Checked);
ElapsedCounterOthersMean = StartBackgroundWorkerOthersMeanPath0(MessageType, ElapsedCounterOthersMean, cB_MeanValuesEnable.Checked);
break;
case Constants.PATH1:
ElapsedCounterTofMean = StartBackgroundWorkerTofMeanPath1(MessageType, ElapsedCounterTofMean, cB_MeanValuesEnable.Checked);
if (TelegramCounterDifTofMean[Constants.PATH1] >= (UInt16)nUD_SettingsMean.Value)
ElapsedCounterStdDeviation = StartBackgroundWorkerStdDeviationPath1(MessageType, ElapsedCounterStdDeviation, cB_StdDevEnable.Checked);
ElapsedCounterDifTofMean = StartDifTofMeanBackgroundWorkerPath1(MessageType, ElapsedCounterDifTofMean, cB_MeanValuesEnable.Checked);
ElapsedCounterMultiHitMean = StartMultihitBackgroundWorkerPath1(MessageType, ElapsedCounterMultiHitMean, cB_MeanValuesEnable.Checked);
ElapsedCounterOthersMean = StartBackgroundWorkerOthersMeanPath1(MessageType, ElapsedCounterOthersMean, cB_MeanValuesEnable.Checked);
break;
case Constants.PATH2:
ElapsedCounterTofMean = StartBackgroundWorkerTofMeanPath2(MessageType, ElapsedCounterTofMean, cB_MeanValuesEnable.Checked);
if (TelegramCounterDifTofMean[Constants.PATH2] >= (UInt16)nUD_SettingsMean.Value)
ElapsedCounterStdDeviation = StartBackgroundWorkerStdDeviationPath2(MessageType, ElapsedCounterStdDeviation, cB_StdDevEnable.Checked);
ElapsedCounterDifTofMean = StartDifTofMeanBackgroundWorkerPath2(MessageType, ElapsedCounterDifTofMean, cB_MeanValuesEnable.Checked);
ElapsedCounterMultiHitMean = StartMultihitBackgroundWorkerPath2(MessageType, ElapsedCounterMultiHitMean, cB_MeanValuesEnable.Checked);
ElapsedCounterOthersMean = StartBackgroundWorkerOthersMeanPath2(MessageType, ElapsedCounterOthersMean, cB_MeanValuesEnable.Checked);
break;
}
}
#endregion
#region Start mean flow
if (ProtocolVersion == "e")
{
switch (Path)
{
case Constants.PATH0: ElapsedCounterFlowMean = StartBackgroundWorkerFlowMeanPath0(MessageType, ElapsedCounterFlowMean, cB_MeanValuesEnable.Checked);
break;
case Constants.PATH1: ElapsedCounterFlowMean = StartBackgroundWorkerFlowMeanPath1(MessageType, ElapsedCounterFlowMean, cB_MeanValuesEnable.Checked);
break;
case Constants.PATH2: ElapsedCounterFlowMean = StartBackgroundWorkerFlowMeanPath2(MessageType, ElapsedCounterFlowMean, cB_MeanValuesEnable.Checked);
break;
default: break;
}
}
#endregion
#region Start mean temperature
if (((ProtocolVersion == "d") || (ProtocolVersion == "i")) && (Path == Constants.PATH0))
{
ElapsedCounterTemperatureMean = StartBackgroundWorkerTemperatureMeanPath0(MessageType, ElapsedCounterTemperatureMean, cB_MeanValuesEnable.Checked);
ElapsedCounterTemperatureMean = StartBackgroundWorkerTemperatureMeanPath1(MessageType, ElapsedCounterTemperatureMean, cB_MeanValuesEnable.Checked);
ElapsedCounterTemperatureMean = StartBackgroundWorkerTemperatureMeanPath2(MessageType, ElapsedCounterTemperatureMean, cB_MeanValuesEnable.Checked);
}
if ((ProtocolVersion == "a") || (ProtocolVersion=="b"))
{
switch(Path)
{
case Constants.PATH0: StartBackgroundWorkerTemperatureMeanPath0(MessageType, ElapsedCounterTemperatureMean, cB_MeanValuesEnable.Checked);
break;
case Constants.PATH1: StartBackgroundWorkerTemperatureMeanPath1(MessageType, ElapsedCounterTemperatureMean, cB_MeanValuesEnable.Checked);
break;
case Constants.PATH2: StartBackgroundWorkerTemperatureMeanPath2(MessageType, ElapsedCounterTemperatureMean, cB_MeanValuesEnable.Checked);
break;
default: break;
}
}
#endregion
#region Monitor background workers
DebugElapsedValues(ElapsedCounterTofMean, ElapsedCounterDifTofMean, ElapsedCounterMultiHitMean, ElapsedCounterOthersMean, ElapsedCounterTemperatureMean, ElapsedCounterFlowMean, ElapsedCounterStdDeviation, InvokeMainloopExceptionsCounter, SumOfAllElapsedValues, Culture);
#endregion
Misc.GarbageCollector(ref GcCounter);
}
#endregion
}
private void MainLoopMassLoggingMeter1(object sender, EventArgs e)
{
CultureInfo culture = GetGlobalCulture();
const UInt16 MeterNumber = Constants.Meter1;
#region Definitions and initializations
DecodedData[] DecodingResult = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
DecodingResult[Constants.PATH0] = ((DecodedData)Decoded[Constants.PATH0].Clone());
DecodingResult[Constants.PATH1] = ((DecodedData)Decoded[Constants.PATH1].Clone());
DecodingResult[Constants.PATH2] = ((DecodedData)Decoded[Constants.PATH2].Clone());
String MessageType = String.Empty;
String ProtocolVersion = String.Empty;
String Temp = String.Empty;
l_DispRxStringLength.Text = RxDataBuffer[MeterNumber].Length.ToString(culture); // Debug length of rxstring
#endregion
#region Prepare data
for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++)
{
if (RxDataBuffer[MeterNumber].ElementAt(0).ToString(culture).Equals("@"))
{
if (!String.IsNullOrEmpty(Output[MeterNumber]))
{
Temp = $"@{Output[MeterNumber]}";
ValidData[MeterNumber] = true;
}
Output[MeterNumber] = String.Empty;
}
else
Output[MeterNumber] = $"{Output[MeterNumber]}{RxDataBuffer[MeterNumber].ElementAt(0)}";
RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1);
}
#endregion
#region Decode
if (ValidData[MeterNumber])
{
Temp = Temp.Replace("\n", String.Empty);
ValidData[MeterNumber] = false;
#region Decode data
DecodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Output[MeterNumber], cB_StdDevEnable.Checked, cB_MeanValuesEnable.Checked, DecodingResult, Constants.NominalFrequency);
#endregion
#region Get timestamp
DateTime CurrentTime = new DateTime();
CurrentTime = DateTime.Now;
String RawTimestamp = CurrentTime.ToString(Formats.RawDataDateTimeLogString, culture);
String CsvTimestamp = CurrentTime.ToString(Formats.CsvDateTimeLogString, culture);
#endregion
#region Additional decoding parameters
UInt16 Path = DecodingResult[Constants.PATH0].Path; // the same value for all paths
MessageType = DecodingResult[Path].MessageType;
ProtocolVersion = DecodingResult[Path].ProtocolVersion;
#endregion
#region CSV-Logging
//if ((LoggingCsvEn == true) && (MessageType == Message.Data))
//{
// CsvLogging.Log(Path, ref CsvIndexValue, cB_Form1CsvLoggingPath0.Checked,
// cB_Form1CsvLoggingPath1.Checked, cB_Form1CsvLoggingPath2.Checked, DecodingResult, @SaveDataPathCsv, CsvTimestamp, ref CsvDataToLog, Constants.CsvCyclesToStorage);
//}
#endregion
#region Refresh values for background workers
Decoded[Constants.PATH0] = (DecodedData)DecodingResult[Constants.PATH0].Clone();
Decoded[Constants.PATH1] = (DecodedData)DecodingResult[Constants.PATH1].Clone();
Decoded[Constants.PATH2] = (DecodedData)DecodingResult[Constants.PATH2].Clone();
#endregion
#region Monitor background workers
DebugElapsedValues(ElapsedCounterTofMean, ElapsedCounterDifTofMean, ElapsedCounterMultiHitMean, ElapsedCounterOthersMean, ElapsedCounterTemperatureMean, ElapsedCounterFlowMean, ElapsedCounterStdDeviation, InvokeMainloopExceptionsCounter, SumOfAllElapsedValues, this.globalCulture);
#endregion
Misc.GarbageCollector(ref GcCounter);
}
#endregion
}
private void MainLoopMassLoggingMeter2(object sender, EventArgs e)
{
CultureInfo culture = GetGlobalCulture();
const UInt16 MeterNumber = Constants.Meter2;
#region Definitions and initializations
DecodedData[] DecodingResult = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
DecodingResult[Constants.PATH0] = ((DecodedData)Decoded[Constants.PATH0].Clone());
DecodingResult[Constants.PATH1] = ((DecodedData)Decoded[Constants.PATH1].Clone());
DecodingResult[Constants.PATH2] = ((DecodedData)Decoded[Constants.PATH2].Clone());
String MessageType = String.Empty;
String ProtocolVersion = String.Empty;
String Temp = String.Empty;
l_DispRxStringLength.Text = RxDataBuffer[MeterNumber].Length.ToString(culture); // Debug length of rxstring
#endregion
#region Prepare data
for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++)
{
if (RxDataBuffer[MeterNumber].ElementAt(0).ToString(culture).Equals("@"))
{
if (!String.IsNullOrEmpty(Output[MeterNumber]))
{
Temp = $"@{Output[MeterNumber]}";
ValidData[MeterNumber] = true;
}
Output[MeterNumber] = String.Empty;
}
else
Output[MeterNumber] = $"{Output[MeterNumber]}{RxDataBuffer[MeterNumber].ElementAt(0)}";
RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1);
}
#endregion
#region Decode
if (ValidData[MeterNumber])
{
#region Decode data
Temp = Temp.Replace("\n", String.Empty);
ValidData[MeterNumber] = false;
DecodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Output[MeterNumber], cB_StdDevEnable.Checked, cB_MeanValuesEnable.Checked, DecodingResult, Constants.NominalFrequency);
#endregion
#region Get timestamp
DateTime CurrentTime = new DateTime();
CurrentTime = DateTime.Now;
String RawTimestamp = CurrentTime.ToString(Formats.RawDataDateTimeLogString, culture);
String CsvTimestamp = CurrentTime.ToString(Formats.CsvDateTimeLogString, culture);
#endregion
#region Additional decoding parameters
UInt16 Path = DecodingResult[Constants.PATH0].Path; // the same value for all paths
MessageType = DecodingResult[Path].MessageType;
ProtocolVersion = DecodingResult[Path].ProtocolVersion;
#endregion
#region Raw data
//RawData.DisplayAndSaveText(SaveDataPathRaw, RawTimestamp, RawLoggingSingleMeterEnable, Output[MeterNumber], Constants.RawCyclesToStorage); // print complet
#endregion
#region CSV-Logging
//if ((LoggingCsvEn == true) && (MessageType == Message.Data))
//{
// CsvLogging.Log(Path, ref CsvIndexValue, cB_Form1CsvLoggingPath0.Checked,
// cB_Form1CsvLoggingPath1.Checked, cB_Form1CsvLoggingPath2.Checked, DecodingResult, @SaveDataPathCsv, CsvTimestamp, ref CsvDataToLog, Constants.CsvCyclesToStorage);
//}
#endregion
#region Refresh values for background workers
Decoded[Constants.PATH0] = (DecodedData)DecodingResult[Constants.PATH0].Clone();
Decoded[Constants.PATH1] = (DecodedData)DecodingResult[Constants.PATH1].Clone();
Decoded[Constants.PATH2] = (DecodedData)DecodingResult[Constants.PATH2].Clone();
#endregion
#region Monitor background workers
DebugElapsedValues(ElapsedCounterTofMean, ElapsedCounterDifTofMean, ElapsedCounterMultiHitMean, ElapsedCounterOthersMean, ElapsedCounterTemperatureMean, ElapsedCounterFlowMean, ElapsedCounterStdDeviation, InvokeMainloopExceptionsCounter, SumOfAllElapsedValues, culture);
#endregion
Misc.GarbageCollector(ref GcCounter);
}
#endregion
}
private void MainLoopMassLoggingMeter3(object sender, EventArgs e)
{
CultureInfo culture = GetGlobalCulture();
const UInt16 MeterNumber = Constants.Meter3;
#region Definitions and initializations
DecodedData[] DecodingResult = DecodedDataHelper.getDefaultDecodedDataArray(Constants.NumberOfPaths);
DecodingResult[Constants.PATH0] = ((DecodedData)Decoded[Constants.PATH0].Clone());
DecodingResult[Constants.PATH1] = ((DecodedData)Decoded[Constants.PATH1].Clone());
DecodingResult[Constants.PATH2] = ((DecodedData)Decoded[Constants.PATH2].Clone());
String MessageType = String.Empty;
String ProtocolVersion = String.Empty;
String Temp = String.Empty;
l_DispRxStringLength.Text = RxDataBuffer[MeterNumber].Length.ToString(culture); // Debug length of rxstring
#endregion
#region Prepare data
for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++)
{
if (RxDataBuffer[MeterNumber].ElementAt(0).ToString(culture).Equals("@"))
{
if (!String.IsNullOrEmpty(Output[MeterNumber]))
{
Temp = $"@{Output[MeterNumber]}";
ValidData[MeterNumber] = true;
}
Output[MeterNumber] = String.Empty;
}
else
Output[MeterNumber] = $"{Output[MeterNumber]}{RxDataBuffer[MeterNumber].ElementAt(0)}";
RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1);
}
#endregion
#region Decode
if (ValidData[MeterNumber])
{
#region Decode data
Temp = Temp.Replace("\n", String.Empty);
ValidData[MeterNumber] = false;
DecodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Output[MeterNumber], cB_StdDevEnable.Checked, cB_MeanValuesEnable.Checked, DecodingResult, Constants.NominalFrequency);
#endregion
#region Get timestamp
DateTime CurrentTime = new DateTime();
CurrentTime = DateTime.Now;
String RawTimestamp = CurrentTime.ToString(Formats.RawDataDateTimeLogString, culture);
String CsvTimestamp = CurrentTime.ToString(Formats.CsvDateTimeLogString, culture);
#endregion
#region Additional decoding parameters
UInt16 Path = DecodingResult[Constants.PATH0].Path; // the same value for all paths
MessageType = DecodingResult[Path].MessageType;
ProtocolVersion = DecodingResult[Path].ProtocolVersion;
#endregion
#region Raw data
//RawData.DisplayAndSaveText(SaveDataPathRaw, RawTimestamp, RawLoggingSingleMeterEnable, Output[MeterNumber], Constants.RawCyclesToStorage); // print complet
#endregion
#region CSV-Logging
//if ((LoggingCsvEn == true) && (MessageType == Message.Data))
//{
// CsvLogging.Log(Path, ref CsvIndexValue, cB_Form1CsvLoggingPath0.Checked,
// cB_Form1CsvLoggingPath1.Checked, cB_Form1CsvLoggingPath2.Checked, DecodingResult, @SaveDataPathCsv, CsvTimestamp, ref CsvDataToLog, Constants.CsvCyclesToStorage);
//}
#endregion
#region Refresh values for background workers
Decoded[Constants.PATH0] = (DecodedData)DecodingResult[Constants.PATH0].Clone();
Decoded[Constants.PATH1] = (DecodedData)DecodingResult[Constants.PATH1].Clone();
Decoded[Constants.PATH2] = (DecodedData)DecodingResult[Constants.PATH2].Clone();
#endregion
#region Monitor background workers
DebugElapsedValues(ElapsedCounterTofMean, ElapsedCounterDifTofMean, ElapsedCounterMultiHitMean, ElapsedCounterOthersMean, ElapsedCounterTemperatureMean, ElapsedCounterFlowMean, ElapsedCounterStdDeviation, InvokeMainloopExceptionsCounter, SumOfAllElapsedValues, culture);
#endregion
Misc.GarbageCollector(ref GcCounter);
}
#endregion
}
}
}