375 lines
14 KiB
C#
375 lines
14 KiB
C#
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<double> DeltaTimeOfFlightS { get; set; }
|
|
public int indexOflastChange { get; set; }
|
|
|
|
}
|
|
|
|
internal class MeterBag
|
|
{
|
|
public MeterBag()
|
|
{
|
|
LedFiles = new Dictionary<string, List<string>>();
|
|
LogFiles = new Dictionary<string, List<string>>();
|
|
}
|
|
public string SerialNumber { get; set; }
|
|
public string PcbID { get; set; }
|
|
|
|
public Dictionary<string, List<string>> LedFiles;
|
|
public Dictionary<string, List<string>> LogFiles;
|
|
|
|
public List<TestRun> TestRuns = new List<TestRun>();
|
|
|
|
//public List<PathOffsetBag> 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<double> DeltaTimeOfFlightS1 = new List<double>();
|
|
public List<double> DeltaTimeOfFlightS2 = new List<double>();
|
|
public List<double> DeltaTimeOfFlightS3 = new List<double>();
|
|
|
|
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<MeterBag>();
|
|
|
|
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<double>() });
|
|
// meter.PathOffsets.Add(new PathOffsetBag() { Path = 2, CurrentOffsetValue = 0, indexOflastChange = 0, DeltaTimeOfFlightS = new List<double>() });
|
|
// meter.PathOffsets.Add(new PathOffsetBag() { Path = 3, CurrentOffsetValue = 0, indexOflastChange = 0, DeltaTimeOfFlightS = new List<double>() });
|
|
|
|
|
|
// 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<double> CalculatedOffsets = new List<double>();
|
|
|
|
// 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
|
|
}
|
|
}
|
|
}
|