using Newtonsoft.Json; using ProductionUiCordonel.ProductionProcesses.Enum; using ProductionUiCordonel.UserControls.FinalTest; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Threading.Tasks; using System.Windows.Controls; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; namespace ProductionUiCordonel.ProductionProcesses.Actions { public class ProductionProcessFinalParameterization : BaseProductionProcess { private UcPlain UserControl; public ProductionProcessFinalParameterization() { name = "Final Parameterization"; currentProcessState = ProductionProcessState.Waiting; } public override void InitUserControl() { UserControl = new UcPlain(); } public override UserControl GetControl() { if (UserControl == null) { throw new Exception($"UserControl {this.GetType()} not Ready"); } return UserControl; } public override void ProcessDone() { //clear } public Task> _currentGenesis_WriteRegister(String reg, T value, Boolean waitForResult = true, Boolean checkRegister = false) { return new Task>(() => { var ret = Meter.WriteRegister(reg, value, waitForResult, checkRegister); if (!ret) { ret = Meter.WriteRegister(reg, value, waitForResult, checkRegister); } return new Tuple(reg, ret); }); } public Task> wirteRegisterInBetweenCheck(String reg, Int32 value, Boolean waitForResult = true, Boolean checkRegister = false, int addToCheck = 10, int addFromCheck = 0) { return new Task>(() => { Meter.WriteRegister(reg, value, waitForResult); var accucalValue = RegisterConverter.ConvertTo(Meter.ReadRegister(reg)); if (accucalValue >= (value + addFromCheck) && value <= accucalValue + (addToCheck)) { return new Tuple(reg, true); } return new Tuple(reg, false); }); } public override void StartProcess() { base.Progress = 0; var useRadio = true; var radioParams = new RadioConfigurationParams(); if (useRadio) { var url = ServiceUrls.GenesisFinalCheckServiceUrl(); url = url + $"GetRadioConfiguration?PcbId={Meter.PcbId}"; var http = (HttpWebRequest)WebRequest.Create(url); http.Method = "GET"; http.Timeout = 2000; var response = (HttpWebResponse)http.GetResponse(); var responseStream = response.GetResponseStream(); if (responseStream == null) { throw new InvalidOperationException(); } using (var sr = new StreamReader(responseStream)) { var responseJson = sr.ReadToEnd(); radioParams = JsonConvert.DeserializeObject(responseJson); } } base.Progress = 20; var overAllResult = new List>>(); //611.219.280 // var ts = DateTimeOffset.UtcNow - new DateTimeOffset(2000, 1, 1, 0, 0, 0, new TimeSpan(0)); //Alarms ////_currentGenesis.WriteRegister("SENSUSRADIO_MainAlarmMask? ////_currentGenesis.WriteRegister("SENSUSRADIO_ExtendedAlarmMask ? //CUSTOMER_AlarmBroadcastMask? //CUSTOMER_AlarmEnableMask ? //CUSTOMER_AlarmVisualAutoClearMask? //CUSTOMER_AlarmVisualMask ? overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); //Meter.SetLcdText(true, null); //overAllResult.Add(_currentGenesis_WriteRegister(Register.Customer.TriggerAlarmCancel, // (new Byte[] { 0xFF, 0xFF, 0xFF, 0xFF }).Reverse().ToArray(), true, false)); overAllResult.Add(wirteRegisterInBetweenCheck("CUSTOMER_LeakFlowThreshold", 375, true, true, 1, -1)); overAllResult.Add(wirteRegisterInBetweenCheck("CUSTOMER_ExcessFlowVolumeThreshold", 25000, true, true, 1, -1)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_ExcessFlowTimeThreshold", (new Byte[] { 0x00, 0x00, 0x00, 0x05 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_LeakTimeThreshold", (new Byte[] { 0x00, 0x00, 0x4E, 0xC0 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_Locale", (new Byte[] { 0x00, 0x00, 0x00, 0xD0 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_PressureHighDelay", (new Byte[] { 0x00, 0x00, 0x02, 0x58 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_PressureHighThreshold", (new Byte[] { 0x00, 0x0B, 0x71, 0xB0 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_PressureLowDelay", (new Byte[] { 0x00, 0x00, 0x02, 0x58 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_PressureLowThreshold", (new Byte[] { 0x00, 0x00, 0x75, 0x30 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_ReverseFlowTimeThreshold", (new Byte[] { 0x00, 0x00, 0x00, 0x78 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_TemperatureHighDelay", (new Byte[] { 0x00, 0x00, 0x01, 0x2C }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_TemperatureHighThreshold", (new Byte[] { 0x00, 0x00, 0x01, 0xF4 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_TemperatureLowDelay", (new Byte[] { 0x00, 0x00, 0x01, 0x2C }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_TemperatureLowThreshold", (new Byte[] { 0x00, 0x00, 0x00, 0x14 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_ArrowThreshold", (new Byte[] { 0x00, 0x1E, 0x84, 0x80 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_DisplayPow10", (new Byte[] { 0x00, 0x00, 0x00, 0xFD }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_DisplayUnits", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_ForwardArrow", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_HardErrorLimit", (new Byte[] { 0x00, 0x00, 0x00, 0x04 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_LedMode", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_LowFlowMaxPeriod", (new Byte[] { 0x00, 0x00, 0x00, 0x3C }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_LowFlowMaxPeriod", 60 << 16, true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_LowFlowThreshold", (new Byte[] { 0x00, 0x00, 0x00, 0xC8 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_MeterSize", (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_PipeFillingDelay", (new Byte[] { 0x00, 0x00, 0x00, 0x1E }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_ResetAccumulators", (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, false)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SampleRate", (new Byte[] { 0x00, 0x00, 0x00, 0x02 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_UpdateThreshold", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("IRDA_AdapterPresenceLimit", (new Byte[] { 0x00, 0x00, 0x00, 0x60 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("IRDA_PulseReportRate", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_FlowPoint", (new Byte[] { 0x00, 0x00, 0x00, 0x02 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_FlowUnits", (new Byte[] { 0x00, 0x00, 0x00, 0x04 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PressureOffset", (new Byte[] { 0x00, 0x00, 0x03, 0xF5 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PressurePresent", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PressureRate", (new Byte[] { 0x00, 0x0D, 0xBB, 0xA0 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PressureUnits", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PulseLength", (new Byte[] { 0x00, 0x00, 0x00, 0x07 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PulseMode", (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PulseWeight", (new Byte[] { 0x00, 0x00, 0x27, 0x10 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_TemperatureUnits", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_AverageFlowPeriod", (new Byte[] { 0x00, 0x00, 0x00, 0x05 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_DataLogContents", (new Byte[] { 0x0C, 0x00, 0x24, 0x03 }).Reverse().ToArray(), true, false)); overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_DataLogPeriod", (new Byte[] { 0x00, 0x00, 0x00, 0x3C }).Reverse().ToArray(), true, false)); overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_FixedDateDayOfMonth", (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, false)); overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_FixedDateReadingContents", (new Byte[] { 0x0C, 0x00, 0x24, 0x03 }).Reverse().ToArray(), true, false)); overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_PeriodicLogLifeTimeCounter", (new Byte[] { 0x00, 0x00, 0x00, 0x0 }).Reverse().ToArray(), true, false)); overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_ResetCounter", (new Byte[] { 0x00, 0x00, 0x00, 0x0 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("POWERMON_BatterySelection", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, false)); overAllResult.Add(_currentGenesis_WriteRegister("POWERMON_WarnFromClamp", (new Byte[] { 0x25, 0x89, 0x06, 0x00 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_WakeupInterval", (new Byte[] { 0x00, 0x00, 0x00, 0x03 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_MbusState", (new Byte[] { 0x00, 0x00, 0x00, 0x07 }).Reverse().ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_UtcTimeOffset", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); //// just read later //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_FrequencyIndicator}).Reverse(), true, true); overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_HistoricalAlarmsDays", (new Byte[] { 0x00, 0x00, 0x00, 0x1D }).Reverse().ToArray(), true, true)); //Original //0x11, 0x12, 0x13, 0x14, 0x21, 0x22, 0x23, 0x24, 0x31, 0x32, 0x33, 0x34, 0x41, 0x42, 0x43, 0x44 //Write to register //0x14, 0x13, 0x12, 0x11, 0x24, 0x23, 0x22, 0x21, 0x34, 0x33, 0x32, 0x31, 0x44, 0x43, 0x42, 0x41 //good one //E6-C8-88-00-DE-B8-68-C0-D6-A8-48-80-CE-98-28-40 //0E-05-04-04-00-14-30-68-D0-14-0E-80-40-63-93-73-22 //&bad one //0E-05-04-05-00-00-88-C8-E6-C0-68-B8-DE-80-48-A8-D6-40-28-98-CE //0E-05-04-04-00-22-73-93-63-40-80-0E-14-D0-68-30-14 if (useRadio) { //var funkadresse = new List(); //funkadresse.AddRange((new Byte[] { 0xE6, 0xC8, 0x88, 0x00 }).ToArray()); //funkadresse.AddRange((new Byte[] { 0xDE, 0xB8, 0x68, 0xC0 }).ToArray()); //funkadresse.AddRange((new Byte[] { 0xD6, 0xA8, 0x48, 0x80 }).ToArray()); //funkadresse.AddRange((new Byte[] { 0xCE, 0x98, 0x28, 0x40 }).ToArray()); //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_EncryptionKey", funkadresse.ToArray(), // true, true)); overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_EncryptionKey", (new Byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }).ToArray(), true, true)); overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_RadioAddress", radioParams.RadioAddress, true, true)); if (radioParams.PowerLevel > 0 && radioParams.PowerLevelOption > 0 && radioParams.ImpedanceCodeNew > 0 && radioParams.ImpedanceCodeOption > 0) { overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_PowerLevel", radioParams.PowerLevel, true, true)); overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_PowerLevelOption", radioParams.PowerLevelOption, true, true)); overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_ImpedanceCodeNew", radioParams.ImpedanceCodeNew, true, true)); overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_ImpedanceCodeOption", radioParams.ImpedanceCodeOption, true, true)); } else { base.currentProcessState = ProductionProcessState.Error; return; } //_currentGenesis_WriteRegister("SENSUSRADIO_CustomerText", // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, false); } overAllResult.Add(wirteRegisterInBetweenCheck("SYSTEM_CalendarSeconds", Convert.ToInt32(ts.TotalSeconds))); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true)); ////radio end state! //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_SystemState", // (new Byte[] { 0x00, 0x00, 0x00, 0xFF }).Reverse().ToArray(), true, false)); //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_SystemState", // (new Byte[] { 0x00, 0x00, 0x00, 0x02 }).Reverse().ToArray(), true, true)); var ret = true; int done = 0; foreach (var cTask in overAllResult) { cTask.RunSynchronously(); if (cTask.Result.Item2) { base.NewStatus($"set Parameter {cTask.Result.Item1} succeed"); } else { base.NewStatus($"set Parameter {cTask.Result.Item1} failed"); ret = false; break; } base.Progress = 20 + ((Int32)Math.Round(((Double)done / (Double)overAllResult.Count) * 80, 0)); done = done + 1; } if (!ret) { base.currentProcessState = ProductionProcessState.Error; } else { currentProcessState = ProductionProcessState.Done; } } } }