using System; using System.Collections.Generic; using System.IO; using System.Linq; using Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol; namespace DynamicStremingLogAnalyzer { internal class PathOffsetBag { public int Path { get; set; } public int CurrentOffsetValue { get; set; } public List DeltaTimeOfFlightS { get; set; } public int indexOflastChange { get; set; } } internal class MeterBag { public MeterBag() { LedFiles = new Dictionary>(); LogFiles = new Dictionary>(); } public string SerialNumber { get; set; } public string PcbID { get; set; } public Dictionary> LedFiles; public Dictionary> LogFiles; public List TestRuns = new List(); //public List PathOffsets { get; set; } //public bool MeterValid { get; set; } = true; } public class TestRun { public DateTime? Start; public DateTime? End; public int? Offset1; public int? Offset2; public int? Offset3; public List DeltaTimeOfFlightS1 = new List(); public List DeltaTimeOfFlightS2 = new List(); public List DeltaTimeOfFlightS3 = new List(); public int? CalcOffset1; public int? CalcOffset2; public int? CalcOffset3; public int TotalLineCount { get; internal set; } public void Calc() { var avg = DeltaTimeOfFlightS1.Sum() / DeltaTimeOfFlightS1.Count; CalcOffset1 = (Int32)((avg * Math.Pow(2, 40))); avg = DeltaTimeOfFlightS2.Sum() / DeltaTimeOfFlightS2.Count; CalcOffset2 = (Int32)((avg * Math.Pow(2, 40))); avg = DeltaTimeOfFlightS3.Sum() / DeltaTimeOfFlightS3.Count; CalcOffset3 = (Int32)((avg * Math.Pow(2, 40))); } } internal class Program { private static void Main(string[] args) { DateTimeOffset timestamp; var meters = new List(); foreach (var item in Directory.GetFiles("\\\\sla12buma\\cordonelds$\\LAA-D-70MYB62\\2023-06-05\\Pruef2000\\", "*_PreAdjustment.log", SearchOption.AllDirectories)) { var SerialNumber = item.Substring(item.LastIndexOf("_SN") + 3, item.IndexOf("_PreAdjustment.log") - item.LastIndexOf("_SN") - 3); MeterBag meter; if (!meters.Any(m => m.SerialNumber == SerialNumber)) { meter = new MeterBag(); meter.SerialNumber = SerialNumber; meters.Add(meter); } else { meter = meters.FirstOrDefault(m => m.SerialNumber == SerialNumber); } if (item.Contains("LedRawData_")) { meter.LedFiles.Add(item, File.ReadAllLines(item).ToList()); } else if (item.Contains("Meter_Slot")) { meter.LogFiles.Add(item, File.ReadAllLines(item).ToList()); } } foreach (var meter in meters) { foreach (var logfile in meter.LogFiles) { var r = new TestRun(); foreach (var logline in logfile.Value) { if (logline.Contains("APP Offset Test procedure started ")) { if (r.End.HasValue) { meter.TestRuns.Add(r); } r = new TestRun(); DateTime.TryParse(logline.Substring(0, "2023-06-05 17:50:38.3184".Length), out DateTime tmp); r.Start = tmp; } if (r.Start.HasValue) { if (logline.Contains("cRecords.Count=")) { var starPos = logline.LastIndexOf("cRecords.Count=") + "cRecords.Count=".Length; var endPos = logline.Length; if (int.TryParse(logline.Substring(starPos, endPos- starPos -1), out var tmp)) { r.TotalLineCount = tmp; } } if (logline.Contains("to 'Zero flow offset Path 1'-register at Meter")) { var starPos = logline.LastIndexOf(" CC Writing ") + " CC Writing ".Length; var endPos = logline.IndexOf("to 'Zero flow offset Path 1'-register at Meter"); var lineOffset = logline.Substring(starPos, endPos - starPos).Trim(); if (int.TryParse(lineOffset, out int tmpOffset1)) { r.Offset1 = tmpOffset1; } else { r.Offset1 = 99; } } if (logline.Contains("to 'Zero flow offset Path 2'-register at Meter")) { var starPos = logline.LastIndexOf(" CC Writing ") + " CC Writing ".Length; var endPos = logline.IndexOf("to 'Zero flow offset Path 2'-register at Meter"); var lineOffset = logline.Substring(starPos, endPos - starPos).Trim(); if (int.TryParse(lineOffset, out int tmpOffset2)) { r.Offset2 = tmpOffset2; } else { r.Offset2 = 99; } } if (logline.Contains("to 'Zero flow offset Path 3'-register at Meter")) { var starPos = logline.LastIndexOf(" CC Writing ") + " CC Writing ".Length; var endPos = logline.IndexOf("to 'Zero flow offset Path 3'-register at Meter"); var lineOffset = logline.Substring(starPos, endPos - starPos).Trim(); if (int.TryParse(lineOffset, out int tmpOffset3)) { r.Offset3 = tmpOffset3; } else { r.Offset3 = 99; } } if (logline.Contains("Offset Test sequence Offset Test sequence successful at all")) { DateTime.TryParse(logline.Substring(0, "2023-06-05 17:50:38.3184".Length), out DateTime tmp); r.End = tmp; } } } if (r.End.HasValue) { meter.TestRuns.Add(r); } } var StreamingDecode = new StreamingDecoder(false); foreach (var ledFile in meter.LedFiles) { foreach (var line in ledFile.Value) { if (line.Contains('|')) { if (DateTimeOffset.TryParse(line.Split('|')[0], out timestamp)) { if (meter.TestRuns.Any(run => run.Start <= timestamp && run.End >= timestamp)) { var currentRun = meter.TestRuns.First(run => run.Start <= timestamp && run.End >= timestamp); if (StreamingDecode.DecodeMsg(line.Split('|')[1].Trim())) { var c = StreamingDecode.DataCalib; if (c.IsValid) { switch (c.Channel) { case 1: currentRun.DeltaTimeOfFlightS1.Add(c.DeltaTimeOfFlightS); break; case 2: currentRun.DeltaTimeOfFlightS2.Add(c.DeltaTimeOfFlightS); break; case 3: currentRun.DeltaTimeOfFlightS3.Add(c.DeltaTimeOfFlightS); break; default: break; } } } } } } } } } foreach (var meter in meters) { foreach (var testrun in meter.TestRuns) { testrun.Calc(); Console.WriteLine($"{meter.SerialNumber} ; 1; {testrun.Offset1}; {testrun.CalcOffset1}; {testrun.TotalLineCount / 3}; {testrun.DeltaTimeOfFlightS1.Count} "); Console.WriteLine($"{meter.SerialNumber} ; 2; {testrun.Offset2}; {testrun.CalcOffset2}; {testrun.TotalLineCount / 3}; {testrun.DeltaTimeOfFlightS2.Count} "); Console.WriteLine($"{meter.SerialNumber} ; 3; {testrun.Offset3}; {testrun.CalcOffset3}; {testrun.TotalLineCount / 3}; {testrun.DeltaTimeOfFlightS3.Count} "); } } Console.ReadLine(); ////Meter_SlotSlot_2_SN23706764_PreAdjustment //meter.PathOffsets.Add(new PathOffsetBag() { Path = 1, CurrentOffsetValue = 0, indexOflastChange = 0, DeltaTimeOfFlightS = new List() }); // meter.PathOffsets.Add(new PathOffsetBag() { Path = 2, CurrentOffsetValue = 0, indexOflastChange = 0, DeltaTimeOfFlightS = new List() }); // meter.PathOffsets.Add(new PathOffsetBag() { Path = 3, CurrentOffsetValue = 0, indexOflastChange = 0, DeltaTimeOfFlightS = new List() }); // var directoryName = Path.GetDirectoryName(item); // //LedRawData__Slot_10_SN23706763_PreAdjustment.log // File.Exists(directoryName + "\\Meter_SlotSlot_2_SN23706764_PreAdjustment.log"); // DateTimeOffset? Start = null; // // foreach (var line in File.ReadAllLines(item)) // { // meters.Add(meter); //} //foreach (var removeLineMeter in meters) //{ // for (int i = 1; i <= 3; i++) // { // var cList = removeLineMeter.PathOffsets.Find(f => f.Path == i); // if (cList.DeltaTimeOfFlightS.Count > 27000) // { // cList.DeltaTimeOfFlightS.RemoveRange(0, cList.DeltaTimeOfFlightS.Count - 27000); // } // else // { // removeLineMeter.MeterValid = false; // } // } //} //foreach (var calcMeter in meters.Where(m => m.MeterValid)) //{ // foreach (var pOffset in calcMeter.PathOffsets) // { // List CalculatedOffsets = new List(); // foreach (var currentOffset in pOffset.DeltaTimeOfFlightS) // { // CalculatedOffsets.Add(currentOffset); // var avg = CalculatedOffsets.Sum() / CalculatedOffsets.Count; // var OffsetValue = (Int32)((avg * Math.Pow(2, 40))); // if (pOffset.CurrentOffsetValue != OffsetValue) // { // pOffset.CurrentOffsetValue = OffsetValue; // pOffset.indexOflastChange = CalculatedOffsets.Count; // } // else // { // } // } // } //} //var sb = new StringBuilder(); //foreach (var PrintMeter in meters.Where(m => m.MeterValid)) //{ // Console.WriteLine(PrintMeter.SerialNumber); // foreach (var pOffset in PrintMeter.PathOffsets) // { // Console.WriteLine($"{pOffset.Path} = {pOffset.indexOflastChange}"); // } //} //\Pruef2000 } } }