getProgramming parameters now with real data types

This commit is contained in:
Roland Drabesch 2023-08-23 14:45:24 +02:00
parent d884c01225
commit edebf29ba3
8 changed files with 536 additions and 106 deletions

View File

@ -15,6 +15,7 @@ namespace Xylem.Common.Logic.ProductionOrderCore.OrderData
{
public static class OrderProgrammingParameters
{
//
public static List<ProgrammingParameters> GetProgrammingParameters(String pcbID, String connectionString)
{
var ret = new List<ProgrammingParameters>();
@ -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<ProgrammingParameters> GetProgrammingParametersFixNa(String connectionString)
{
var ret = new List<ProgrammingParameters>();
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<List<CsdParameterResult>>(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;
}
}
}

View File

@ -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
}
/// <summary>
/// Values for single registers
/// </summary>
@ -22,18 +41,61 @@ namespace Xylem.Common.Logic.ProductionOrderCore
/// <param name="registerName"></param>
/// <param name="registerValue"></param>
/// <param name="programmingSource"></param>
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;
}
/// <summary>
/// The register name
/// </summary>
public String RegisterName { get; set; }
/// <summary>
/// The register value converted to raw bytes by register converter
/// </summary>
@ -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 != "")
{
}
}
}
}

View File

@ -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)
{

View File

@ -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);

View File

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

View File

@ -63,6 +63,40 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers
}
}
//LocalWebRequest
/// <summary>
/// Get Radio Configuration from database matching the PcbID
/// </summary>
/// <param name="pcbID">PcbID from Meter</param>
/// <returns></returns>
[Route("GetProgrammingParametersFixNa"), HttpGet]
public async Task<HttpResponseMessage> 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);
}
}
/// <summary>
/// Get Radio Configuration from database matching the PcbID

View File

@ -27,7 +27,7 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers
///
/// <returns></returns>
[Route("SetMeterLogPathInfo"), HttpGet]
public async Task<HttpResponseMessage> SetMeterLogPathInfo(Int32 SerialNumber, Int32? TestRunId =null, Int32? CalibrationRunId = null, String BasePath = "", String MainLogName = "", String LEDName = "" )
public async Task<HttpResponseMessage> 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);
}

View File

@ -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<PathOffsetBag>();
LedFiles = new Dictionary<string, List<string>>();
LogFiles = new Dictionary<string, List<string>>();
}
public string SerialNumber { get; set; }
public string PcbID { get; set; }
public List<PathOffsetBag> PathOffsets { 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 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<MeterBag>();
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<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);
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<double> CalculatedOffsets = new List<double>();
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<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
}
}