common/Ui/LegacyGenesisControl/PreAdjWr.cs
2026-04-23 17:50:07 +02:00

518 lines
19 KiB
C#

using CordonelPreadjustmentUi;
using CordonelPreadjustmentUi.Processes.Itinerary;
using Newtonsoft.Json;
using NLog;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Xylem.Common.CommonCore.Consts;
using Xylem.Common.Hardware.Interfaces.Ports.PortCore;
using Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
using Xylem.Common.Ui.CordonelPreadjustmentUi.Parameters;
using Xylem.Common.Utils.Logging;
using XylemCommonUiLegacyGenCtl.DataPackage;
namespace XylemCommonUiLegacyGenCtl
{
[Guid("C5367517-AAAA-439A-A124-40A0A95F2A4D"),
ComVisible(true),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ICtlPreadjustment))]
public partial class PreAdjWr : UserControl, ICtlPreadjustment, IDisposable
{
private PollingAction pollingAction = PollingAction.IsBusy;
private PreAdjustmentControl wrappedControl;
private FlushParams flushParams = null;
private ILogger _logger = null;
private List<int> MetersFinallyPassed = new List<int>();
private TestSetupContainer TestsetuptContainer;
public MeterTypes Mode { get; private set; }
public PreAdjWr()
{
try
{
InitializeComponent();
_logger = NLogHelper.CreateOrGetLogger("PreAdjWr");
_logger.Trace("ctor start");
wrappedControl = new PreAdjustmentControl();
wrappedControl.OnAbort += WrappedControl_OnAbort;
wrappedControl.OnIsDone += WrappedControl_OnIsDone;
wrappedControl.OnRequestFlush += WrappedControl_OnFlushRequested;
wrappedControl.OnRequestTemperatur += WrappedControl_OnTemperaturRequested;
if (!this.Controls.Contains(wrappedControl))
{
this.Controls.Add(wrappedControl);
}
_logger.Trace("ctor end");
}
catch (Exception ex)
{
if (_logger != null)
{
_logger.Fatal(ex);
}
else
{
MessageBox.Show($@"FATAL Ctor {ex.Message}");
}
}
}
private void ctlAdjustmentWrapper_Load(object sender, EventArgs e)
{
}
public int GetFlushDurationS()
{
if (pollingAction != PollingAction.DoFlush)
{
return 0;
}
return flushParams == null ? 0 : flushParams.DurationS;
}
public int GetFlushFlowrateQmH()
{
if (pollingAction != PollingAction.DoFlush)
{
return 0;
}
return flushParams == null ? 0 : flushParams.FlowrateQmH;
}
private void WrappedControl_OnFlushRequested(object sender, EventArgsFlushRequest e)
{
flushParams = e.Value;
pollingAction = PollingAction.DoFlush;
}
private void WrappedControl_OnTemperaturRequested(object sender, EventArgs e)
{
pollingAction = PollingAction.RequestTemp;
}
private void WrappedControl_OnIsDone(object sender, EventArgsMeterSuccsessfull e)
{
MetersFinallyPassed = e.Value;
pollingAction = PollingAction.IsDone;
Dispose(true);
}
private void WrappedControl_OnAbort(object sender, EventArgsMeterSuccsessfull e)
{
MetersFinallyPassed = e.Value;
pollingAction = PollingAction.IsOnError;
Dispose(true);
}
// Double upperTempLimit = 35, Double lowerTempLimit = 15, Double tempDeviationLimit = 1, Int32 ampTestTofRecordingTime = 2, Double ampTestTriggerValue = 0.5, bool ampTestGenerateLogfiles = true, bool ampTestGenerateMeanValuesFile = true, Int32 ampTestFirstHitLevelPropMin = 12, Int32 ampTestFirstHitLevelPropMax = 32, Int32 ampTestAmpTestDistance = 7, Int32 ampTestPercentageStart = 5, Int32 ampTestPercentageStop = 40, Int32 ampTestActivityCheckInverval = 2, bool offsetTestGenerateLogfiles = true, Int32 offsetTestUpperVoltageLimitMV = 650, Int32 offsetTestLowerVoltageLimitMV = 200, Int32 offsetTestOffsetLimitPS = 300, Int32 offsetTestSettlingTime = 60, Int32 offsetTestZeroflowOffsetTestNumberOfLines = 9000, Int32 offsetTestActivityCheckInverval = 2, Int32 offsetTestBadDataLimit = 3)
private bool loadTempMetersConfig(out List<Int32> Meters, out List<Int32> TempMeters)
{
TempMeters = new List<Int32>();
Meters = new List<Int32>();
var configFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), nameof(Xylem.Common.Hardware.WaterMeter.Genesis), ProgramConfig.SerialConfigFileName);
if (!File.Exists(configFile))
{
configFile = Path.Combine(ProgramConfig.SerialConfigFileName);
if (!File.Exists(configFile))
{
return false;
}
}
var tr = new StreamReader(configFile);
var slotConfigList = JsonConvert.DeserializeObject<SlotConfig[]>(tr.ReadToEnd());
foreach (var tMeter in slotConfigList)
{
if (tMeter.Type == SlotType.TemperatureMeter)
{
TempMeters.Add(tMeter.Slot);
}
else
{
Meters.Add(tMeter.Slot);
}
}
return true;
}
public void PrepareActionAuto(Int32 slotCount, String cultureStr)
{
internalPrepareAction(slotCount, cultureStr);
}
private void internalPrepareAction(int slotCount, string cultureStr)
{
try
{
if (TestsetuptContainer == null)
{
TestsetuptContainer = new TestSetupContainer();
TestsetuptContainer.TempSouce = Enums.TempSouceType.PtOverSps;
TestsetuptContainer.ProductionMode = false;
TestsetuptContainer.meterTestSettings = new MeterTestSettings[slotCount];
TestsetuptContainer.meterTestResults = new MeterTestResults[slotCount];
}
var numberOfPaths = (TestsetuptContainer.AllChanelsRequired ? 3 : 1);
_logger.Info($"PrepareAction [numberOfPaths = {numberOfPaths},slotCount = {slotCount},cultureStr = {cultureStr}, size = { TestsetuptContainer.MeterSize}]");
var meters = new List<Int32>();
var tempMeters = new List<Int32>();
loadTempMetersConfig(out meters, out tempMeters);
var s = new PreAdjustmentSettingsContainer(numberOfPaths, meters.ToArray(), cultureStr, tempMeters.ToArray(), TestsetuptContainer.MeterSize);
switch (TestsetuptContainer.TempSouce)
{
case Enums.TempSouceType.ManualInput:
s.SetTempUseManualInput(true);
s.SetTempUsePtOverSps(false);
break;
case Enums.TempSouceType.PtOverSps:
s.SetTempUsePtOverSps(true);
break;
case Enums.TempSouceType.TempFlansh:
s.SetTempUseTempFlansh(true);
s.SetTempUsePtOverSps(false);
break;
default:
break;
}
_logger.Info($"SetSettings [{s.ToString()}]");
_logger.Info($"TestsetuptContainer [{TestsetuptContainer.ToString()}]");
wrappedControl.SetSettings(s);
s.Production = TestsetuptContainer.ProductionMode;
foreach (var item in TestsetuptContainer?.meterTestSettings.Where(f => f != null && f.PreAdjustment && (!string.IsNullOrEmpty(f.SerialNr) && f.SerialNr != "-")))
{
EnableMeter(item.Slot, true, item.SerialNr);
}
Mode = Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterTypes.Cordonel;
if (TestsetuptContainer.meterTestSettings.Any(a => a != null && a.meterType == Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterTypes.MagFlux))
{
Mode = Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterTypes.MagFlux;
}
}
catch (Exception ex)
{
_logger.Fatal(ex);
MessageBox.Show($@"FATAL internalPrep {ex.Message}");
}
}
public void PrepareAction(Int32 slotCount, String cultureStr)
{
internalPrepareAction(slotCount, cultureStr);
}
public void EnableMeter(Int32 slot, Boolean Enabled, string Srn)
{
try
{
wrappedControl.EnableMeter(slot, Enabled, Srn);
}
catch (Exception ex)
{
_logger.Fatal(ex);
MessageBox.Show($@"FATAL EnableMeter {ex.Message}");
}
}
public void StartAction()
{
try
{
_logger.Info("Start Action");
if (Mode == MeterTypes.Cordonel)
{
foreach (var item in TestsetuptContainer?.meterTestSettings)
{
if (item != null && item.PreAdjustment)
{
wrappedControl.EnableMeter(item.Slot, true, item.SerialNr);
}
}
wrappedControl.TestRunNumber = TestsetuptContainer != null ? TestsetuptContainer.TestRunNumber : 0;
wrappedControl.AutoStart();
}
else if (Mode == MeterTypes.MagFlux)
{
_logger.Info("MagFlux Zeroflow is preparing");
wrappedControl.SetBusy(true);
wrappedControl.StatusLabel("MagFlux Zeroflow is preparing");
var meterBatch = new MeterBatch();
var t = new Task(() =>
{
foreach (var item in TestsetuptContainer?.meterTestSettings)
{
try
{
if (item != null && item.PreAdjustment && item.meterType == MeterTypes.MagFlux)
{
var newMeter = new MagFluxMeter();
newMeter.SetupFromConfigFile(item.Slot);
newMeter.Login();
newMeter.SerialNumber = item.SerialNr;
meterBatch.AddMeter(newMeter);
newMeter.InitCalibration();
}
}
catch (Exception ex)
{
MessageBox.Show("Meter init error:" + ex.Message);
}
}
meterBatch.MetersStartMeasurement();
var c = TestsetuptContainer.meterTestSettings.Count();
TestsetuptContainer.meterTestResults = new MeterTestResults[10];
int WaitTimeS = TestsetuptContainer.DelayInSBeforStart;
wrappedControl.StatusLabel($"MagFlux Zeroflow is running for {WaitTimeS}");
var Start = DateTimeOffset.UtcNow;
var End = Start.AddSeconds(WaitTimeS);
while (End > DateTimeOffset.UtcNow)
{
wrappedControl.PushProgressBars(WaitTimeS, Start, WaitTimeS, Start);
Thread.Sleep(500);
}
try
{
foreach (var meter in meterBatch.ListOfMeters)
{
if (meter is MagFluxMeter mfMeter)
{
try
{
mfMeter.StopMeasurement();
}
catch (Exception ex)
{
MessageBox.Show("Meter Stop:" + ex.Message);
}
Thread.Sleep(1000);
var RetryLeft = 10;
while (mfMeter.GetMeasurementState(0) != Xylem.Common.Metrology.Measurements.Consts.MeasurementStates.IsCompleted && RetryLeft > 0)
{
Thread.Sleep(1000);
RetryLeft = RetryLeft - 1;
}
var resU = meter.GetMainMeasurementResult(0, WaitTimeS);
try
{
TestsetuptContainer.meterTestResults[meter.Slot - 1] = new MeterTestResults();
TestsetuptContainer.meterTestResults[meter.Slot - 1].Results = new List<Xylem.Common.Hardware.WaterMeter.DataPackages.MeasurementRecords.FlowDeviations>();
TestsetuptContainer.meterTestResults[meter.Slot - 1].meterType = MeterTypes.MagFlux;
TestsetuptContainer.meterTestResults[meter.Slot - 1].Slot = meter.Slot;
TestsetuptContainer.meterTestResults[meter.Slot - 1].SerialNr = meter.SerialNumber;
TestsetuptContainer.meterTestResults[meter.Slot - 1].Results.Add(new Xylem.Common.Hardware.WaterMeter.DataPackages.MeasurementRecords.FlowDeviations() { RefTimeS = 60, MeasuredRefFlowQmPerH = 0, RequierdTimeS = 60, RequierdFlowQmPerH = 0, MeasuredDutFlowQmPerH = resU.DutFlowRateCmPh.Value, DutTimeS = resU.DutTimeS });
}
catch (Exception ex)
{
MessageBox.Show("Meter add results:" + ex.Message);
}
mfMeter.Logout();
try
{
mfMeter.DisposeMeter();
}
catch (Exception)
{
}
}
}
}
catch (Exception ex)
{
_logger.Fatal(ex);
MessageBox.Show(ex.Message);
}
meterBatch.Dispose();
});
t.ContinueWith((r) => { pollingAction = PollingAction.IsDone; });
t.Start();
}
}
catch (Exception ex)
{
_logger.Fatal(ex);
MessageBox.Show($@"FATAL Start Action {ex.Message}");
pollingAction = PollingAction.IsOnError;
}
finally
{
}
}
public void SetFlushIsDone()
{
wrappedControl?.SetFlushIsDone();
pollingAction = PollingAction.IsBusy;
}
public void SetTestBenchTemp(double Temp)
{
wrappedControl?.SetTestBenchTemp(Temp);
pollingAction = PollingAction.IsBusy;
}
public PollingAction GetPollingAction()
{
return pollingAction;
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (wrappedControl != null)
{
wrappedControl.CloseConnections();
wrappedControl.Dispose();
}
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
public bool GetMeterIsDone(int Slot)
{
if (MetersFinallyPassed.Contains(Slot))
{
return true;
}
return false;
}
public void SetTestSetupContainer(dynamic vbContainer)
{
if (vbContainer is TestSetupContainer container)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine($"WatingForDecision={container.WatingForDecision}");
sb.AppendLine($"TempSouce={container.TempSouce}");
sb.AppendLine($"MeterSize={container.MeterSize}");
sb.AppendLine($"DelayInSBeforStart={container.DelayInSBeforStart}");
sb.AppendLine($"AllChanelsRequired={container.AllChanelsRequired}");
sb.AppendLine($"ProductionMode={container.ProductionMode}");
foreach (var item in container.meterTestSettings)
{
if (item == null)
{
continue;
}
sb.AppendLine($"Slot={item.Slot}");
sb.AppendLine($"SerialNr={item.SerialNr}");
sb.AppendLine($"FlowTesting={item.FlowTesting}");
sb.AppendLine($"PreAdjustment={item.PreAdjustment}");
sb.AppendLine($"FlowAdjustment={item.FlowAdjustment}");
sb.AppendLine($"FlowAdjustmentTarget={item.FlowAdjustmentTarget}");
sb.AppendLine($"FlowAdjustmentTarget={item.meterType}");
}
_logger.Info($"SetTestSetupContainer ({sb}) ");
TestsetuptContainer = vbContainer;
}
}
public dynamic GetTestSetupContainer()
{
return TestsetuptContainer;
}
}
}