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 } } }