From edebf29ba3c59bf52dfbfa057f5899b7a8c42320 Mon Sep 17 00:00:00 2001 From: Roland Drabesch Date: Wed, 23 Aug 2023 14:45:24 +0200 Subject: [PATCH] getProgramming parameters now with real data types --- .../OrderData/OrderProgrammingParameters.cs | 116 +++++- .../ProgrammingParameters.cs | 84 +++- .../Actions/ProductionCheckShippingState.cs | 17 + .../Actions/ProductionProcessConnect.cs | 2 +- .../Actions/ProductionProcessPasswordFile.cs | 3 +- .../Controllers/FinalCheckController.cs | 34 ++ .../Controllers/TestBenchController.cs | 13 +- .../Ui/DynamicStremingLogAnalyzer/Program.cs | 373 ++++++++++++++---- 8 files changed, 536 insertions(+), 106 deletions(-) diff --git a/Common/Logic/ProductionOrderCore/OrderData/OrderProgrammingParameters.cs b/Common/Logic/ProductionOrderCore/OrderData/OrderProgrammingParameters.cs index 48bb4925..22ffe7be 100644 --- a/Common/Logic/ProductionOrderCore/OrderData/OrderProgrammingParameters.cs +++ b/Common/Logic/ProductionOrderCore/OrderData/OrderProgrammingParameters.cs @@ -15,6 +15,7 @@ namespace Xylem.Common.Logic.ProductionOrderCore.OrderData { public static class OrderProgrammingParameters { + // public static List GetProgrammingParameters(String pcbID, String connectionString) { var ret = new List(); @@ -48,11 +49,11 @@ namespace Xylem.Common.Logic.ProductionOrderCore.OrderData if (radioParams.RadioAddress != 0) { - ret.Add(new ProgrammingParameters("SENSUSRADIO_RadioAddress", BitConverter.GetBytes(radioParams.RadioAddress).Reverse().ToArray())); + ret.Add(new ProgrammingParameters("SENSUSRADIO_RadioAddress", BitConverter.GetBytes(radioParams.RadioAddress).Reverse().ToArray(), ProgrammingSource.Order, (UInt32)radioParams.RadioAddress, typeof(UInt32).ToString(), ReadCompare.Equal)); if (radioParams.FrqOffset.HasValue) { - ret.Add(new ProgrammingParameters("SENSUSRADIO_FrequencyOffset", BitConverter.GetBytes(radioParams.FrqOffset.Value).Reverse().ToArray())); + ret.Add(new ProgrammingParameters("SENSUSRADIO_FrequencyOffset", BitConverter.GetBytes(radioParams.FrqOffset.Value).Reverse().ToArray(), ProgrammingSource.Order, (Int16)radioParams.FrqOffset.Value, typeof(Int16).ToString(), ReadCompare.Equal)); } @@ -62,10 +63,10 @@ namespace Xylem.Common.Logic.ProductionOrderCore.OrderData if (radioParams.PowerLevel > 0 && radioParams.PowerLevelOption > 0 && radioParams.ImpedanceCodeNew > 0 && radioParams.ImpedanceCodeOption > 0) { - ret.Add(new ProgrammingParameters("SENSUSRADIO_PowerLevel", BitConverter.GetBytes(radioParams.PowerLevel).Reverse().ToArray())); - ret.Add(new ProgrammingParameters("SENSUSRADIO_PowerLevelOption", BitConverter.GetBytes(radioParams.PowerLevelOption).Reverse().ToArray())); - ret.Add(new ProgrammingParameters("SENSUSRADIO_ImpedanceCodeNew", BitConverter.GetBytes(radioParams.ImpedanceCodeNew).Reverse().ToArray())); - ret.Add(new ProgrammingParameters("SENSUSRADIO_ImpedanceCodeOption", BitConverter.GetBytes(radioParams.ImpedanceCodeOption).Reverse().ToArray())); + ret.Add(new ProgrammingParameters("SENSUSRADIO_PowerLevel", BitConverter.GetBytes(radioParams.PowerLevel).Reverse().ToArray(),ProgrammingSource.Order, (ushort)radioParams.PowerLevel, typeof(ushort).ToString(), ReadCompare.Equal)); + ret.Add(new ProgrammingParameters("SENSUSRADIO_PowerLevelOption", BitConverter.GetBytes(radioParams.PowerLevelOption).Reverse().ToArray(), ProgrammingSource.Order, (ushort)radioParams.PowerLevelOption, typeof(ushort).ToString(), ReadCompare.Equal)); + ret.Add(new ProgrammingParameters("SENSUSRADIO_ImpedanceCodeNew", BitConverter.GetBytes(radioParams.ImpedanceCodeNew).Reverse().ToArray(), ProgrammingSource.Order, (UInt16)radioParams.ImpedanceCodeNew, typeof(UInt16).ToString(), ReadCompare.Equal)); + ret.Add(new ProgrammingParameters("SENSUSRADIO_ImpedanceCodeOption", BitConverter.GetBytes(radioParams.ImpedanceCodeOption).Reverse().ToArray(), ProgrammingSource.Order, (UInt16)radioParams.ImpedanceCodeOption, typeof(UInt16).ToString(), ReadCompare.Equal)); } } var rawVako = VakoDbAdapter.GetRawVako(connectionString, orderNr); @@ -166,5 +167,108 @@ namespace Xylem.Common.Logic.ProductionOrderCore.OrderData return ret; } + + public static List GetProgrammingParametersFixNa(String connectionString) + { + var ret = new List(); + + Int32 orderNr = 3215223; + + var rawVako = VakoDbAdapter.GetRawVako(connectionString, orderNr); + var rawMapping = VakoDbAdapter.GetVakoMapping(connectionString, rawVako.Type); + var vakoData = VakoParser.Parse(rawVako, rawMapping); + + var csdIdent = vakoData.KeyValues.FirstOrDefault(a => a.Name == "C_GEN_CSD")?.Value; + + + using (var dataAccess = new SqlDataAccess(connectionString)) + { + var sb = new StringBuilder(); + sb.AppendLine($" SELECT "); + sb.AppendLine($" RegisterName ,"); + sb.AppendLine($" RegisterValue "); + sb.AppendLine($" from [Auftrag].[dbo].[Cordonel_ProgrammingMapper] "); + + + sb.AppendLine($" where 1=0 "); + + + foreach (var item in vakoData.KeyValues) + { + sb.AppendLine($" or (KEYNAME = '{item.Name}' and KeyValue = '{item.Charcode.Replace("\'", "\'\'")}') "); + } + var mapData = dataAccess.ExecuteQuery(sb.ToString()); + + foreach (DataRow row in mapData.Rows) + { + ret.Add(new ProgrammingParameters(row["RegisterName"].ToString(), (Byte[])row["RegisterValue"])); + } + } + + var meterSize = BitConverter.ToUInt32(ret.Find(a => a.RegisterName == "GENESISFLOW_MeterSize").RegisterValue.Reverse().ToArray(), 0); + var displayUnits = BitConverter.ToInt32(ret.Find(a => a.RegisterName == "GENESISFLOW_DisplayUnits").RegisterValue.Reverse().ToArray(), 0); + var flowUnits = BitConverter.ToInt32(ret.Find(a => a.RegisterName == "METROLOGYASST_FlowUnits").RegisterValue.Reverse().ToArray(), 0); + + + + + using (var dataAccess = new SqlDataAccess(connectionString)) + { + var sb = new StringBuilder(); + sb.AppendLine($" SELECT "); + sb.AppendLine($" CordonelDnDisplayunitDisplaypow10_RegisterIdent as RegisterName, "); + sb.AppendLine($" [CordonelDnDisplayunitDisplaypow10_DisplayPow10] as RegisterValue "); + sb.AppendLine($" FROM [Auftrag].[dbo].[CordonelDnDisplayunitDisplaypow10] "); + sb.AppendLine($" where [CordonelDnDisplayunitDisplaypow10_MeterSize] = {meterSize} "); + sb.AppendLine($" and [CordonelDnDisplayunitDisplaypow10_DisplayUnit] = {displayUnits} "); + sb.AppendLine($" union "); + sb.AppendLine($" SELECT "); + sb.AppendLine($" CordonelDnFlowUnitFlowPoint_RegisterIdent as RegisterName, "); + sb.AppendLine($" CAST([CordonelDnFlowUnitFlowPoint_FlowPoint] AS varbinary) as RegisterValue "); + sb.AppendLine($" FROM [Auftrag].[dbo].[CordonelDnFlowUnitFlowPoint] "); + sb.AppendLine($" where[CordonelDnFlowUnitFlowPoint_FlowUnit] = {flowUnits} "); + sb.AppendLine($" and[CordonelDnFlowUnitFlowPoint_MeterSize] = {meterSize} "); + + var mapData = dataAccess.ExecuteQuery(sb.ToString()); + + foreach (DataRow row in mapData.Rows) + { + ret.Add(new ProgrammingParameters(row["RegisterName"].ToString(), RegisterConverter.ConvertFrom(Convert.ToInt32(row["RegisterValue"])))); + } + } + var ident = "GNS"; + if (vakoData.KeyValues.Where(k => k.Key == "Produktgruppe").Any() && vakoData.KeyValues.Where(k => k.Key == "Produktgruppe").First().Charcode == "U") + { + ident = ident + vakoData.KeyValues.Where(k => k.Key == "Nennweite").First()?.Charcode; + } + + + + var retStr = LocalWebRequest.GetRequest($"http://sla12iis01/csdcore/csdservice/getstampings?CsdIdent={csdIdent}&GroupId=1&ProductIdent={ident}&ProductDn={rawVako.Dn}&ShowOnlyValidStampings=0", 8000); + var retListRealCsd = JsonConvert.DeserializeObject>(retStr); + if (retListRealCsd.Any()) + { + + foreach (var csdItemToConvert in retListRealCsd) + { + if (csdItemToConvert.ValueText.Contains("-")) + { + ret.Add(new ProgrammingParameters(csdItemToConvert.Name, ByteStyler.Parse(csdItemToConvert.ValueText, false), ProgrammingSource.Csd)); + } + } + } + + + StringBuilder csv = new StringBuilder(); + foreach (var item in ret) + { + csv.AppendLine($"{item.RegisterName}={ByteStyler.ToString(item.RegisterValue)} (From{item.Source})"); + } + + return ret; + + } + + } } diff --git a/Common/Logic/ProductionOrderCore/ProgrammingParameters.cs b/Common/Logic/ProductionOrderCore/ProgrammingParameters.cs index fa3c3884..2407729d 100644 --- a/Common/Logic/ProductionOrderCore/ProgrammingParameters.cs +++ b/Common/Logic/ProductionOrderCore/ProgrammingParameters.cs @@ -8,9 +8,28 @@ namespace Xylem.Common.Logic.ProductionOrderCore public enum ProgrammingSource { Vako, - Csd + Csd, + ProcessOrFix, + Order } - + public enum ReadCompare + { + NoCompare, + Equal, + True, + Near, + + } + public enum isForProcessStep + { + NotSet, + UnlockMeter, + Programming, + LockMeter, + SetShippingState + + } + /// /// Values for single registers /// @@ -22,18 +41,61 @@ namespace Xylem.Common.Logic.ProductionOrderCore /// /// /// - public ProgrammingParameters(String registerName, Byte[] registerValue, ProgrammingSource programmingSource = ProgrammingSource.Vako) + public ProgrammingParameters(String registerName, Byte[] registerValue, ProgrammingSource programmingSource = ProgrammingSource.Vako, object realValue = null, string typeName = "", ReadCompare compare = ReadCompare.NoCompare) { RegisterName = registerName; RegisterValue = registerValue; Source = programmingSource; + TypeName = typeName; + + if (!String.IsNullOrEmpty(TypeName)) + { + switch (TypeName) + { + case "System.Byte": + RealValue = Convert.ToByte(realValue); + break; + case "System.Int16": + RealValue = Convert.ToInt16(realValue); + break; + case "System.Int32": + RealValue = Convert.ToInt32(realValue); + break; + + case "System.Int64": + RealValue = Convert.ToInt64(realValue); + break; + case "System.SByte": + RealValue = Convert.ToSByte(realValue); + break; + case "System.UInt16": + RealValue = Convert.ToUInt16(realValue); + break; + case "System.UInt32": + RealValue = Convert.ToUInt32(realValue); + break; + + case "System.UInt64": + RealValue = Convert.ToUInt64(realValue); + break; + default: + throw new NotImplementedException($"DataType {TypeName} is not supported. For Register {RegisterName}"); + + } + + } + + + Compare = compare; } - + + + /// /// The register name /// public String RegisterName { get; set; } - + /// /// The register value converted to raw bytes by register converter /// @@ -41,5 +103,17 @@ namespace Xylem.Common.Logic.ProductionOrderCore public ProgrammingSource Source { get; set; } + public object RealValue { get; set; } + public string TypeName { get; set; } + + public ReadCompare Compare { get; set; } + + public void CreateRealValueTypesafe() + { + if (TypeName != "") + { + + } + } } } diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs index 917c372d..163b4d9f 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs @@ -144,6 +144,23 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } + try + { + + } + catch (Exception) + { + + throw; + } + //; + if (Meter.LutCrc != $@"0x{int.Parse(res[8]):X4}") + { + currentProcessState = ProductionProcessState.Error; + UserControl.lblText.Content = "Lut not correct"; + } + + if (currentProcessState != ProductionProcessState.Error) { diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessConnect.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessConnect.cs index dcb04c24..9be883f8 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessConnect.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessConnect.cs @@ -80,7 +80,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions try { //var url = $"http://localhost:56011/api/FinalCheck/GetProgrammingParameters?PcbID={base.Meter.PcbId}"; - var url = $"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetProgrammingParameters?PcbID={Meter.PcbId}"; + var url = $"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetProgrammingParametersFixNa"; var csdRet = LocalWebRequest.GetRequest(url, 80000); diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs index a15a69f0..9d77e116 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs @@ -53,8 +53,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions Meter.Logout(); ret = Meter.Login(); - currentProcessState = ProductionProcessState.Done; - return; + //If the password file is written, the "Password" from _pwdContainer is overwritten from Skeleton-key //to the "level 8 password" form the LuDB server. The DB password column is the current login password //for production. Initially the "Password" is the Skeleton-key which can not be part of the list of diff --git a/Common/Service/MeterProcessState/Controllers/FinalCheckController.cs b/Common/Service/MeterProcessState/Controllers/FinalCheckController.cs index 7fe88fd3..cddc97a5 100644 --- a/Common/Service/MeterProcessState/Controllers/FinalCheckController.cs +++ b/Common/Service/MeterProcessState/Controllers/FinalCheckController.cs @@ -63,6 +63,40 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers } } + //LocalWebRequest + /// + /// Get Radio Configuration from database matching the PcbID + /// + /// PcbID from Meter + /// + [Route("GetProgrammingParametersFixNa"), HttpGet] + public async Task GetProgrammingParametersFixNa() + { + try + { + return await Task.Run(() => + { + var builder = new StringBuilder(); + var ret = OrderProgrammingParameters.GetProgrammingParametersFixNa( GlobalConfig.ConnectionString.Value); + foreach (var r in ret.Where(r => r.RegisterName == "SENSUSRADIO_EncryptionKey")) + { + foreach (var t in r.RegisterValue) + { + builder.Append(t.ToString("x2")); + } + + break; + } + + return Request.CreateResponse(HttpStatusCode.OK, ret); + + }); + } + catch (Exception ex) + { + return Request.CreateResponse(HttpStatusCode.InternalServerError, ex); + } + } /// /// Get Radio Configuration from database matching the PcbID diff --git a/Common/Service/MeterProcessState/Controllers/TestBenchController.cs b/Common/Service/MeterProcessState/Controllers/TestBenchController.cs index 80fd009b..c7a668af 100644 --- a/Common/Service/MeterProcessState/Controllers/TestBenchController.cs +++ b/Common/Service/MeterProcessState/Controllers/TestBenchController.cs @@ -27,7 +27,7 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers /// /// [Route("SetMeterLogPathInfo"), HttpGet] - public async Task SetMeterLogPathInfo(Int32 SerialNumber, Int32? TestRunId =null, Int32? CalibrationRunId = null, String BasePath = "", String MainLogName = "", String LEDName = "" ) + public async Task SetMeterLogPathInfo(Int32 SerialNumber, Int32? TestRunId = null, Int32? CalibrationRunId = null, String BasePath = "", String MainLogName = "", String LEDName = "") { try @@ -56,8 +56,8 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers var MapData = dataacces.ExecuteQuery(sb.ToString()); - - return Request.CreateResponse(HttpStatusCode.OK,""); + + return Request.CreateResponse(HttpStatusCode.OK, ""); } }); @@ -89,16 +89,17 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers sb.AppendLine($" SELECT distinct [MapPcbIdToSerialNumber_SerialNumber], mapOrder.CordonelAssignedPicking_FertigungsAuftragsNr ,KundeneigeneSerienNr as CustomerSerialNr "); sb.AppendLine($" , meter.[Adresse] , Nennweite as Dn "); sb.AppendLine($" , (SELECT TOP(1) Dn_InternalId FROM CordonelMeterSizes where Dn_VakoID = substring(Identnr.VakoCode, 4, 2)) as NewNennweiteID "); - + sb.AppendLine($" , (select top 1 ID from[Auftrag].[dbo].[CordonelMeterCalibrationResults] where PcbId = '{PcbID}' order by date desc) as CalibrationRunID "); sb.AppendLine($" , (select top 1 StatusFertigung from Auftrag.dbo.AuftragPositionSerienNr a where a.SerienNr = [MapPcbIdToSerialNumber_SerialNumber] order by AnlageDatum desc) as LastProcessState "); + sb.AppendLine($" , lut.FileCrc as LutCrc "); sb.AppendLine($" FROM Auftrag.dbo.Cordonel_AssignedPicking mapOrder "); sb.AppendLine($" left outer join [Auftrag].[dbo].[MapPcbIdToSerialNumber] map on mapOrder.CordonelAssignedPicking_PcbId = map.MapPcbIdToSerialNumber_PcbId and MapPcbIdToSerialNumber_Deleted = 0 "); sb.AppendLine($" left outer join Auftrag.dbo.AuftragPositionSerienNr mapSrn on map.[MapPcbIdToSerialNumber_SerialNumber] = mapSrn.SerienNr and mapSrn.Pruefgangnr = 0 "); sb.AppendLine($" left outer join Auftrag.dbo.AuftragPosition_gesamt auftraginfo on auftraginfo.AuftragNr = mapSrn.AuftragNr and auftraginfo.PositionNr = mapSrn.PositionNr "); sb.AppendLine($" left outer join [Auftrag].[dbo].[Genesis_Meter] meter on meter.Seriennummer = MapPcbIdToSerialNumber_SerialNumber "); sb.AppendLine($" left outer join Identnr on auftraginfo.Identnr = Identnr.IdentNr "); - + sb.AppendLine($" left outer join [Auftrag].[dbo].[Cordonel_Lut] lut on lut.MeterSize = (SELECT TOP(1) Dn_InternalId FROM CordonelMeterSizes where Dn_VakoID = substring(Identnr.VakoCode, 4, 2)) and lut.CurrentVersionForProd = 1 "); sb.AppendLine($" where mapOrder.CordonelAssignedPicking_IsDeleted = 0 and mapOrder.CordonelAssignedPicking_PcbId = '{PcbID}'"); var MapData = dataacces.ExecuteQuery(sb.ToString()); @@ -109,7 +110,7 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers } - var ret = new String[] { MapData.Rows[0]["MapPcbIdToSerialNumber_SerialNumber"].ToString(), MapData.Rows[0]["CordonelAssignedPicking_FertigungsAuftragsNr"].ToString(), MapData.Rows[0]["Adresse"].ToString(), MapData.Rows[0]["CustomerSerialNr"].ToString(), MapData.Rows[0]["CalibrationRunID"].ToString(), MapData.Rows[0]["LastProcessState"].ToString(), MapData.Rows[0]["Dn"].ToString() , MapData.Rows[0]["NewNennweiteID"].ToString() }; + var ret = new String[] { MapData.Rows[0]["MapPcbIdToSerialNumber_SerialNumber"].ToString(), MapData.Rows[0]["CordonelAssignedPicking_FertigungsAuftragsNr"].ToString(), MapData.Rows[0]["Adresse"].ToString(), MapData.Rows[0]["CustomerSerialNr"].ToString(), MapData.Rows[0]["CalibrationRunID"].ToString(), MapData.Rows[0]["LastProcessState"].ToString(), MapData.Rows[0]["Dn"].ToString(), MapData.Rows[0]["NewNennweiteID"].ToString(), MapData.Rows[0]["LutCrc"].ToString() }; return Request.CreateResponse(HttpStatusCode.OK, ret); } diff --git a/Common/Ui/DynamicStremingLogAnalyzer/Program.cs b/Common/Ui/DynamicStremingLogAnalyzer/Program.cs index fbb95e48..1762872c 100644 --- a/Common/Ui/DynamicStremingLogAnalyzer/Program.cs +++ b/Common/Ui/DynamicStremingLogAnalyzer/Program.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol; namespace DynamicStremingLogAnalyzer @@ -20,14 +19,52 @@ namespace DynamicStremingLogAnalyzer { public MeterBag() { - PathOffsets = new List(); + LedFiles = new Dictionary>(); + LogFiles = new Dictionary>(); } public string SerialNumber { get; set; } public string PcbID { get; set; } - public List PathOffsets { 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 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))); + } - public bool MeterValid { get; set; } = true; } internal class Program @@ -37,129 +74,293 @@ namespace DynamicStremingLogAnalyzer DateTimeOffset timestamp; var meters = new List(); - foreach (var item in Directory.GetFiles("\\\\sla12buma\\cordonelds$\\LAA-D-70MYB62\\2023-02-06\\", "*_PreAdjustment.log", SearchOption.AllDirectories)) + + Console.ReadLine(); + + + localwebrequest() + foreach (var item in Directory.GetFiles("\\\\sla12buma\\cordonelds$\\LAA-D-70MYB62\\2023-06-05\\Pruef2000\\", "*_PreAdjustment.log", SearchOption.AllDirectories)) { - - - //Meter_SlotSlot_2_SN23706764_PreAdjustment - var meter = new MeterBag(); - meter.SerialNumber = item.Substring(item.LastIndexOf("_SN") + 3, item.IndexOf("_PreAdjustment.log") - item.LastIndexOf("_SN") - 3); - 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); + 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()); + } + } - //LedRawData__Slot_10_SN23706763_PreAdjustment.log - File.Exists(directoryName + "\\Meter_SlotSlot_2_SN23706764_PreAdjustment.log"); - - - - DateTimeOffset? Start = null; - var StreamingDecode = new StreamingDecoder(false); - foreach (var line in File.ReadAllLines(item)) + foreach (var meter in meters) + { + foreach (var logfile in meter.LogFiles) { - if (line.Contains('|')) + var r = new TestRun(); + foreach (var logline in logfile.Value) { - if (DateTimeOffset.TryParse(line.Split('|')[0], out timestamp)) + + if (logline.Contains("APP Offset Test procedure started ")) { - if (!Start.HasValue) + if (r.End.HasValue) { - Start = timestamp; + meter.TestRuns.Add(r); } - else + + 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("to 'Zero flow offset Path 1'-register at Meter")) { - if (StreamingDecode.DecodeMsg(line.Split('|')[1].Trim())) + 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)) { - var c = StreamingDecode.DataCalib; - if (c.IsValid) - { - meter.PathOffsets.Find(f => f.Path == c.Channel).DeltaTimeOfFlightS.Add(c.DeltaTimeOfFlightS); - } - + 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; + + } + } } - - } - 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) + if (r.End.HasValue) { - cList.DeltaTimeOfFlightS.RemoveRange(0, cList.DeltaTimeOfFlightS.Count - 27000); - } - else - { - removeLineMeter.MeterValid = false; + meter.TestRuns.Add(r); } + + } - - } - - - - foreach (var calcMeter in meters.Where(m => m.MeterValid)) - { - foreach (var pOffset in calcMeter.PathOffsets) + var StreamingDecode = new StreamingDecoder(false); + foreach (var ledFile in meter.LedFiles) { - List CalculatedOffsets = new List(); - - foreach (var currentOffset in pOffset.DeltaTimeOfFlightS) + foreach (var line in ledFile.Value) { - 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 + + 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; + } + } + + } + + + } + + + } } } - - } + } } - var sb = new StringBuilder(); - - foreach (var PrintMeter in meters.Where(m => m.MeterValid)) + foreach (var meter in meters) { - - Console.WriteLine(PrintMeter.SerialNumber); - foreach (var pOffset in PrintMeter.PathOffsets) + foreach (var testrun in meter.TestRuns) { - Console.WriteLine($"{pOffset.Path} = {pOffset.indexOflastChange}"); + testrun.Calc(); + Console.WriteLine($"{meter.SerialNumber} ; 1; {testrun.Offset1}; {testrun.CalcOffset1}; "); + Console.WriteLine($"{meter.SerialNumber} ; 2; {testrun.Offset2}; {testrun.CalcOffset2}; "); + Console.WriteLine($"{meter.SerialNumber} ; 3; {testrun.Offset3}; {testrun.CalcOffset3}; "); + } } + 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 } }