365 lines
18 KiB
C#
365 lines
18 KiB
C#
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<Tuple<String, Boolean>> _currentGenesis_WriteRegister<T>(String reg, T value, Boolean waitForResult = true,
|
|
Boolean checkRegister = false)
|
|
{
|
|
return new Task<Tuple<String, Boolean>>(() =>
|
|
{
|
|
|
|
var ret = Meter.WriteRegister(reg, value, waitForResult, checkRegister);
|
|
if (!ret)
|
|
{
|
|
ret = Meter.WriteRegister(reg, value, waitForResult, checkRegister);
|
|
}
|
|
return new Tuple<String, Boolean>(reg, ret);
|
|
});
|
|
}
|
|
|
|
|
|
public Task<Tuple<String, Boolean>> wirteRegisterInBetweenCheck(String reg, Int32 value, Boolean waitForResult = true,
|
|
Boolean checkRegister = false, int addToCheck = 10, int addFromCheck = 0)
|
|
{
|
|
return new Task<Tuple<String, Boolean>>(() =>
|
|
{
|
|
Meter.WriteRegister(reg, value, waitForResult);
|
|
|
|
var accucalValue = RegisterConverter.ConvertTo<Int32>(Meter.ReadRegister(reg));
|
|
if (accucalValue >= (value + addFromCheck) && value <= accucalValue + (addToCheck))
|
|
{
|
|
return new Tuple<String, Boolean>(reg, true);
|
|
}
|
|
return new Tuple<String, Boolean>(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<RadioConfigurationParams>(responseJson);
|
|
}
|
|
}
|
|
base.Progress = 20;
|
|
|
|
|
|
|
|
|
|
var overAllResult = new List<Task<Tuple<String, Boolean>>>();
|
|
//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<byte>();
|
|
//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;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|