280 lines
13 KiB
C#
280 lines
13 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Controls;
|
|
using ProductionUiCordonelLegacy.ProductionProcesses.Enum;
|
|
using ProductionUiCordonelLegacy.UserControls.FinalTest;
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
|
|
using Xylem.Common.Logic.ProductionOrderCore;
|
|
|
|
namespace ProductionUiCordonelLegacy.ProductionProcesses.Actions
|
|
{
|
|
public class ProductionProcessFinalParametrizationVakoCsd : BaseProductionProcess
|
|
{
|
|
private UcPlain UserControl;
|
|
private ProductionProcessConnect connectProcess;
|
|
private Boolean hasRadio;
|
|
|
|
public ProductionProcessFinalParametrizationVakoCsd(ProductionProcessConnect connectProcess, Boolean registerHasRadio = true)
|
|
{
|
|
this.connectProcess = connectProcess;
|
|
name = "Kunden Parametrierung";
|
|
currentProcessState = ProductionProcessState.Waiting;
|
|
hasRadio = registerHasRadio;
|
|
}
|
|
|
|
public override void InitUserControl()
|
|
{
|
|
UserControl = new UcPlain
|
|
{
|
|
lblHl =
|
|
{
|
|
Content = name
|
|
},
|
|
lblText =
|
|
{
|
|
Content = "Dieser Vorgang kann bis zu 1 Minute dauern!"
|
|
}
|
|
};
|
|
}
|
|
|
|
public override UserControl GetControl()
|
|
{
|
|
if (UserControl == null)
|
|
{
|
|
throw new Exception($"UserControl {GetType()} not Ready");
|
|
}
|
|
return UserControl;
|
|
}
|
|
|
|
|
|
public override void ProcessDone()
|
|
{
|
|
//clear
|
|
}
|
|
|
|
public Task<Tuple<String, Boolean,string>> _currentGenesis_WriteRegister<T>(String reg, T value, Boolean waitForResult = true,
|
|
Boolean checkRegister = false, string logvalue = "")
|
|
{
|
|
return new Task<Tuple<String, Boolean, string>>(() =>
|
|
{
|
|
Task.Delay(10).Wait();
|
|
var ret = Meter.WriteRegister(reg, value, waitForResult, checkRegister);
|
|
if (!ret)
|
|
{
|
|
ret = Meter.WriteRegister(reg, value, waitForResult, checkRegister);
|
|
}
|
|
if (checkRegister)
|
|
{
|
|
|
|
}
|
|
return new Tuple<String, Boolean,string>(reg, ret, logvalue.ToString());
|
|
});
|
|
}
|
|
|
|
|
|
public Task<Tuple<String, Boolean,string>> wirteRegisterInBetweenCheck(String reg, Int32 value, Boolean waitForResult = true,
|
|
Int32 addToCheck = 10, Int32 addFromCheck = 0)
|
|
{
|
|
return new Task<Tuple<String, Boolean,string>>(() =>
|
|
{
|
|
Meter.WriteRegister(reg, value, waitForResult);
|
|
|
|
var actualValue = RegisterConverter.ByteArrayToValue<Int32>(Meter.ReadRegister(reg));
|
|
if (actualValue >= (value + addFromCheck) && value <= actualValue + (addToCheck))
|
|
{
|
|
return new Tuple<String, Boolean, string>(reg, true, value.ToString());
|
|
}
|
|
return new Tuple<String, Boolean,string>(reg, false, value.ToString());
|
|
});
|
|
}
|
|
|
|
private void doStartProcessLoop()
|
|
{
|
|
var remainingRetries = 4;
|
|
while (remainingRetries >= 0)
|
|
{
|
|
try
|
|
{
|
|
while (connectProcess.asyncProgrammingParametersTask.Status == TaskStatus.Running)
|
|
{
|
|
|
|
Thread.Sleep(500);
|
|
}
|
|
if (connectProcess.asyncProgrammingParametersTask.Status == TaskStatus.RanToCompletion
|
|
&& connectProcess.asyncProgrammingParametersTask.Result != null
|
|
&& connectProcess.asyncProgrammingParametersTask.Result.Any())
|
|
{
|
|
var myJsonResponse = connectProcess.asyncProgrammingParametersTask.Result;
|
|
|
|
Progress = 15;
|
|
|
|
//fix
|
|
// CUSTOMER_LeakFlowThreshold
|
|
//CUSTOMER_ExcessFlowVolumeThreshold
|
|
|
|
var overAllResult = new List<Task<Tuple<String, Boolean,string>>>();
|
|
//611.219.280
|
|
//
|
|
var ts = DateTimeOffset.UtcNow - new DateTimeOffset(2000, 1, 1, 0, 0, 0, new TimeSpan(0));
|
|
|
|
overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SealDisplay",
|
|
(new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true));
|
|
|
|
// keien frq aber radio parameter
|
|
if (!Meter.RadioFrequencyMhz.HasValue && myJsonResponse.Any(a => a.RegisterName.Contains("RADIO")))
|
|
{
|
|
throw new ApplicationException("Radio inconsistent between meter and programmingparameters");
|
|
}
|
|
// eine frequen aber keine radio parameter
|
|
if (Meter.RadioFrequencyMhz.HasValue && !myJsonResponse.Any(a => a.RegisterName.Contains("RADIO")))
|
|
{
|
|
throw new ApplicationException("Radio inconsistent between meter and programmingparameters");
|
|
}
|
|
foreach (var item in myJsonResponse.Where(m => m.Source == ProgrammingSource.Vako || m.Source == ProgrammingSource.Order ))
|
|
{
|
|
|
|
if (item.RegisterName == "CUSTOMER_LeakFlowThreshold")
|
|
{
|
|
|
|
}
|
|
//todo: find a better sln for SENSUSRADIO_EncryptionKey
|
|
//SENSUSRADIO_EncryptionKey dont reserve SENSUSRADIO_EncryptionKey!
|
|
if (item.RegisterName.ToLower().Contains("displaypow".ToLower()) || item.RegisterName.ToLower().Contains("METROLOGYASST_FlowPoint".ToLower()))
|
|
{
|
|
overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, new[] { item.RegisterValue.ToArray()[0] }, true, true));
|
|
}
|
|
else if (item.RegisterName.ToLower().Contains("SENSUSRADIO_EncryptionKey".ToLower()))
|
|
{
|
|
overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, item.RegisterValue.ToArray(), true, true));
|
|
}
|
|
else
|
|
{
|
|
overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, item.RegisterValue.Reverse().ToArray(), true, true));
|
|
|
|
}
|
|
|
|
//else if (!item.RegisterName.ToLower().Contains("apparrangement"))
|
|
//{
|
|
// overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, item.RegisterValue.Reverse().ToArray(), true, true));
|
|
//}
|
|
}
|
|
|
|
//overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmEnableMask", new Byte[] { 0x00, 0x00, 0x80, 0x53 }.Reverse().ToArray(), true, true, BitConverter.ToString(new Byte[] { 0x00, 0x00, 0x80, 0x53 }.Reverse().ToArray())));
|
|
overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmBroadcastMask", new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray(), true, true, BitConverter.ToString(new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray())));
|
|
overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmVisualMask", new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray(), true, true, BitConverter.ToString(new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray())));
|
|
|
|
foreach (var item in myJsonResponse.Where(m => m.Source == ProgrammingSource.Csd))
|
|
{
|
|
//todo: find a better sln for SENSUSRADIO_EncryptionKey
|
|
//SENSUSRADIO_EncryptionKey dont reserve SENSUSRADIO_EncryptionKey!
|
|
if (item.RegisterName.ToLower().Contains("SENSUSRADIO_EncryptionKey".ToLower()))
|
|
{
|
|
overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, item.RegisterValue.ToArray(), true, true));
|
|
}
|
|
else if (!item.RegisterName.ToLower().Contains("apparrangement"))
|
|
{
|
|
overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, item.RegisterValue.Reverse().ToArray(), true, true, BitConverter.ToString(item.RegisterValue.Reverse().ToArray())));
|
|
}
|
|
}
|
|
|
|
overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_ResetAccumulators",
|
|
(new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray()));
|
|
|
|
overAllResult.Add(wirteRegisterInBetweenCheck("SYSTEM_CalendarSeconds", Convert.ToInt32(ts.TotalSeconds)));
|
|
overAllResult.Add(wirteRegisterInBetweenCheck("IRDA_MfgDate", Convert.ToInt32(ts.TotalSeconds)));
|
|
|
|
overAllResult.Add(_currentGenesis_WriteRegister("NFC_EraseRMA",
|
|
(new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray()));
|
|
|
|
if (Meter.RadioFrequencyMhz.HasValue)
|
|
{
|
|
overAllResult.Add(_currentGenesis_WriteRegister("LOGGER_TriggerLogFlush",
|
|
(new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray()));
|
|
|
|
|
|
overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_ResetCounter",
|
|
(new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray()));
|
|
|
|
overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SealDisplay",
|
|
(new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true));
|
|
}
|
|
|
|
|
|
|
|
var ret = true;
|
|
Int32 done = 0;
|
|
|
|
foreach (var cTask in overAllResult)
|
|
{
|
|
try
|
|
{
|
|
Thread.Sleep(50);
|
|
cTask.RunSynchronously();
|
|
if (cTask.Result.Item2)
|
|
{
|
|
NewStatus($"Schreiben des Parameter {cTask.Result.Item1} war erfolgreich (value {cTask.Result.Item3})");
|
|
}
|
|
else
|
|
{
|
|
if (cTask.Result.Item1.ToLower().Contains("Metersize".ToLower()) || cTask.Result.Item1.ToLower().Contains("CUSTOMER_AppArrangement".ToLower()) || cTask.Result.Item1.ToLower().Contains("NFC_EraseRMA".ToLower()) || cTask.Result.Item1.ToLower().Contains("CUSTOMER_ExcessFlowVolumeThreshold".ToLower()) || cTask.Result.Item1.ToLower().Contains("CUSTOMER_LeakFlowThreshold".ToLower()) || cTask.Result.Item1.ToLower() == "SENSUSRADIO_MetroRadioLifeTimeCounter".ToLower())
|
|
{
|
|
NewStatus($"Warnung! Fehler beim Schreiben des Parameters {cTask.Result.Item1}");
|
|
}
|
|
else
|
|
{
|
|
NewStatus($"Warnung! Fehler beim Schreiben des Parameters {cTask.Result.Item1}");
|
|
|
|
ret = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
if (cTask.Result.Item1 != "GENESISFLOW_MaxDeltaToFRange")
|
|
{
|
|
throw;
|
|
}
|
|
}
|
|
Progress = 15 + ((Int32)Math.Round((done / (Double)overAllResult.Count) * 85, 0));
|
|
done += 1;
|
|
}
|
|
|
|
if (!ret)
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
currentProcessState = ProductionProcessState.Done;
|
|
return;
|
|
}
|
|
remainingRetries -= 1;
|
|
}
|
|
else
|
|
{
|
|
currentProcessState = ProductionProcessState.Error;
|
|
remainingRetries = -1;
|
|
NewStatus("Warnung! Fehler beim Laden des Parametersatzes");
|
|
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
currentProcessState = ProductionProcessState.Error;
|
|
NewStatus($"Warnung! Fehler beim Behandeln von {ex.Message}");
|
|
remainingRetries = remainingRetries - 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void StartProcess()
|
|
{
|
|
doStartProcessLoop();
|
|
}
|
|
}
|
|
}
|