diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs index becf42a8..e8f45c74 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs @@ -194,6 +194,14 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// private Boolean _enableRawDataLogging; + /// + /// Detected pulse adapter communication on request port + /// + public Boolean PulseAdapterAutoDetected + { + set; + get; + } /// /// Enable use of registers that are not valid (last version not match the current app) diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/PowerCorrection.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/PowerCorrection.cs index b5886060..c8813805 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/PowerCorrection.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/PowerCorrection.cs @@ -70,12 +70,12 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore public DateTime? ActualDateTimeUtc { get; set; } /// - /// Total used seconds before maintenance + /// Total used seconds of entire runtime /// public UInt32 ActualTotalUsedSeconds_s { get; set; } /// - /// Total used charge of batteries before maintenance + /// Total used charge of batteries of entire runtime /// public UInt64 ActualTotalUsedCharge_uAs { get; set; } @@ -104,11 +104,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// public Boolean ActualPulseEvenDistribution { get; set; } - /// - /// Detected pulse adapter during maintenance - /// - public Boolean PulseAdapterAutoDetected { get; set; } - /// /// Mark pulse adapter as installed on any detected or sequence counted /// diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/PowerCorrectionCalc.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/PowerCorrectionCalc.cs index 42603769..41c6041c 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/PowerCorrectionCalc.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/PowerCorrectionCalc.cs @@ -65,7 +65,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore // skip if indicated that a pulse adapter never has been installed _powCorr.PulseAdapterMarkedAsInstalled = _powCorr.ProductionPulseAdapterIsInstalled || - _powCorr.PulseAdapterAutoDetected || + _powCorr.ActualPulseAdapterIsInstalled || _powCorr.ActualPulseSequenceCounter != _powCorr.ProductionPulseSequenceCounter; if (!_powCorr.PulseAdapterMarkedAsInstalled) diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterPowerCorrectionFile.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterPowerCorrectionFile.cs index b1991dbe..7565b0bf 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterPowerCorrectionFile.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterPowerCorrectionFile.cs @@ -64,10 +64,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile private const Int32 FieldPulseSequenceCtrIdx = FieldPulseModeIdx + PulseModeSize; private const Int32 FieldPulseEvenDistributionIdx = FieldPulseSequenceCtrIdx + PulseSequenceCtrSize; - private const Int32 FieldPulseAdapterAutoDetectedIdx = FieldPulseEvenDistributionIdx + PulseEvenDistributionSize; - private const Int32 FieldPulseAdapterAutoDetectedSize = sizeof(Boolean); // calculated - private const Int32 RequiredFwVersionIdx = FieldPulseAdapterAutoDetectedIdx + FieldPulseAdapterAutoDetectedSize; + private const Int32 RequiredFwVersionIdx = FieldPulseEvenDistributionIdx + PulseEvenDistributionSize; private const Int32 CalcPulseReportLengthIdx = RequiredFwVersionIdx + FwVersionSize; private const Int32 CalcPulseReportLengthSize = sizeof(UInt32); @@ -226,7 +224,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile if (CopyByteArray(value_u8a = new Byte[PulseAdaptInstalledSize], bin, PulseAdaptInstalledSize, 0, FieldPulseAdaptInstalledIdx)) - fc.Add(Resources.StrPowCorrPulseAdapterInstallationState + + fc.Add(Resources.StrPowCorrPulseAdapterAutoDetected + $": {RegisterConverter.ConvertToText(value_u8a, typeof(Boolean))}"); if (CopyByteArray(value_u8a = new Byte[PulseModeSize], bin, PulseModeSize, 0, FieldPulseModeIdx)) @@ -243,11 +241,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile fc.Add(Resources.StrPowCorrPulseEvenDistribution + $": {RegisterConverter.ConvertToText(value_u8a, typeof(Boolean))}"); - if (CopyByteArray(value_u8a = new Byte[PulseEvenDistributionSize], bin, FieldPulseAdapterAutoDetectedSize, - 0, FieldPulseAdapterAutoDetectedIdx)) - fc.Add(Resources.StrPowCorrPulseAdapterAutoDetected + - $": {RegisterConverter.ConvertToText(value_u8a, typeof(Boolean))}"); - fc.Add(Resources.StrPowCorrOldFwVersion + $": {_currentGenesis.FwVersion}"); if (CopyByteArray(value_u8a = new Byte[FwVersionSize], bin, FwVersionSize, 0, RequiredFwVersionIdx)) @@ -379,9 +372,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.ActualPulseEvenDistribution), PulseEvenDistributionSize, FieldPulseEvenDistributionIdx); - CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.PulseAdapterAutoDetected), - FieldPulseAdapterAutoDetectedSize, FieldPulseAdapterAutoDetectedIdx); - // calculations CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.RequiredFwVersion), FwVersionSize, RequiredFwVersionIdx); diff --git a/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache b/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache index 82bc2c16..8d4994b0 100644 --- a/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache +++ b/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -bf6bb8fceb3db5a9977dadc407cf576684bf7127 +8fbe991b217e7692af4817ad205b768685aa5a72 diff --git a/Common/Ui/GenesisToolBox/FrmLowLevelTools.Designer.cs b/Common/Ui/GenesisToolBox/FrmLowLevelTools.Designer.cs index 10d1d9ca..796e357c 100644 --- a/Common/Ui/GenesisToolBox/FrmLowLevelTools.Designer.cs +++ b/Common/Ui/GenesisToolBox/FrmLowLevelTools.Designer.cs @@ -81,6 +81,7 @@ this.label3 = new System.Windows.Forms.Label(); this.tbxFileToEraseDrive = new System.Windows.Forms.TextBox(); this.btnEraseFile = new System.Windows.Forms.Button(); + this.btnReadPowCorr = new System.Windows.Forms.Button(); this.grpSetup.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.groupBox1.SuspendLayout(); @@ -489,6 +490,7 @@ // // groupBox2 // + this.groupBox2.Controls.Add(this.btnReadPowCorr); this.groupBox2.Controls.Add(this.btnUploadPWFile); this.groupBox2.Controls.Add(this.ddlLocation); this.groupBox2.Controls.Add(this.btnReadBatAndLog); @@ -508,7 +510,7 @@ this.btnUploadPWFile.Name = "btnUploadPWFile"; this.btnUploadPWFile.Size = new System.Drawing.Size(116, 25); this.btnUploadPWFile.TabIndex = 42; - this.btnUploadPWFile.Text = "Upload PWD"; + this.btnUploadPWFile.Text = "Upload Pwd File"; this.btnUploadPWFile.UseVisualStyleBackColor = true; this.btnUploadPWFile.Click += new System.EventHandler(this.btnUploadPWFile_Click); // @@ -617,6 +619,16 @@ this.btnEraseFile.UseVisualStyleBackColor = true; this.btnEraseFile.Click += new System.EventHandler(this.btnEraseFile_Click); // + // btnReadPowCorr + // + this.btnReadPowCorr.Location = new System.Drawing.Point(10, 175); + this.btnReadPowCorr.Name = "btnReadPowCorr"; + this.btnReadPowCorr.Size = new System.Drawing.Size(116, 25); + this.btnReadPowCorr.TabIndex = 43; + this.btnReadPowCorr.Text = "Read Power Corr"; + this.btnReadPowCorr.UseVisualStyleBackColor = true; + this.btnReadPowCorr.Click += new System.EventHandler(this.btnReadPowCorr_Click); + // // FrmLowLevelTools // this.AccessibleRole = System.Windows.Forms.AccessibleRole.Sound; @@ -714,5 +726,6 @@ private System.Windows.Forms.ComboBox ddlLocation; private System.Windows.Forms.Button btnReadBatAndLog; private System.Windows.Forms.Button btnUploadPWFile; + private System.Windows.Forms.Button btnReadPowCorr; } } \ No newline at end of file diff --git a/Common/Ui/GenesisToolBox/FrmLowLevelTools.cs b/Common/Ui/GenesisToolBox/FrmLowLevelTools.cs index 50e69a94..7ecf695f 100644 --- a/Common/Ui/GenesisToolBox/FrmLowLevelTools.cs +++ b/Common/Ui/GenesisToolBox/FrmLowLevelTools.cs @@ -40,6 +40,7 @@ namespace Xylem.Common.Ui.GenesisToolBox private const String StrBurnUpgrade = "Waiting for meter response"; private MeterFile _meterFile; + private MeterPowerCorrectionFile _meterPowCorrFile; //private String _lastFwUpdateState; //private Int32 _lastSingleProgress; @@ -153,6 +154,7 @@ namespace Xylem.Common.Ui.GenesisToolBox /// private void DisableToolButtons() { + btnReadPowCorr.Enabled = false; btnPulseModeOff.Enabled = false; btnClearDisplay.Enabled = false; btnSetDateTime.Enabled = false; @@ -176,6 +178,7 @@ namespace Xylem.Common.Ui.GenesisToolBox /// private void EnableToolButtons() { + btnReadPowCorr.Enabled = true; btnPulseModeOff.Enabled = true; btnClearDisplay.Enabled = true; btnSetDateTime.Enabled = true; @@ -831,7 +834,7 @@ namespace Xylem.Common.Ui.GenesisToolBox LogText($"Count: {count}", logFileName); LogText($"Extra data size: {extraDataSize}", logFileName); - + //avoid access beyond the buffer and check for data to display if (ctr + 5 + extraDataSize < data.Count && extraDataSize > 0) @@ -840,12 +843,12 @@ namespace Xylem.Common.Ui.GenesisToolBox LogText($"Extra data: {ByteArrayStyle.ByteStyler.ToString(extraData.ToArray())}", logFileName); if (status == 261) { - - rawDic.Add(new Tuple(fileName, ByteArrayStyle.ByteStyler.ToString(extraData.ToArray()))); + + rawDic.Add(new Tuple(fileName, ByteArrayStyle.ByteStyler.ToString(extraData.ToArray()))); } } - + LogText("", logFileName); ctr += (5 + extraDataSize); @@ -876,9 +879,9 @@ namespace Xylem.Common.Ui.GenesisToolBox sb.AppendLine($"{dt};{rawBat.Item2}"); } - File.AppendAllLines(logFileName+ "BAT.CSV", new[] { sb.ToString() }); + File.AppendAllLines(logFileName + "BAT.CSV", new[] { sb.ToString() }); + - }).ContinueWith(delegate { //add a blank line to separate next operation @@ -1299,10 +1302,56 @@ namespace Xylem.Common.Ui.GenesisToolBox }); } + /// + /// Read power correction information. + /// + /// + /// - Initial + /// + private void btnReadPowCorr_Click(Object sender, EventArgs e) + { + if (_currentGenesis == null) + { + return; + } + + if (_meterPowCorrFile == null) + { + _meterPowCorrFile = new MeterPowerCorrectionFile(_currentGenesis); + } + + //reset timer + _startTime = DateTimeOffset.UtcNow; + + LowLevelActionControl(true); + + var msg = @"Upload power correction file from meter"; + LogText(msg); + lblOverall.Text = msg; + lblActualProcess.Text = @"Read power correction file"; + + + Task.Factory.StartNew(() => + { + _currentGenesis.ReLogin(); + _meterPowCorrFile.ReadPowCorrMeterFile(); + foreach (var line in _meterPowCorrFile.FileContent) + { + LogText(line); + } + + }).ContinueWith(delegate + { + //add a blank line to separate next operation + LogText(""); + _currentGenesis.Logout(); + LowLevelActionControl(false); + }); + } /// /// Read config file from meter and store it to disk. /// - /// + /// /// - Initial /// private void btnUploadPWFile_Click(Object sender, EventArgs e) @@ -1323,10 +1372,10 @@ namespace Xylem.Common.Ui.GenesisToolBox LowLevelActionControl(true); - var msg = @"Upload configuration file from meter"; + var msg = @"Upload password file from meter"; LogText(msg); lblOverall.Text = msg; - lblActualProcess.Text = @"Read config file"; + lblActualProcess.Text = @"Read password file"; var rawData = new List(); @@ -1440,7 +1489,7 @@ namespace Xylem.Common.Ui.GenesisToolBox /// - /// Read engineering log files from meter and analyzes the contents. + /// Cpllect life time information and production status. /// /// /// - Initial @@ -1498,32 +1547,37 @@ namespace Xylem.Common.Ui.GenesisToolBox ReadLogFiles(filename); - - var resp = LocalWebRequest.GetRequest($"http://10.49.40.25/MeterProcessState/api/FinalCheck/GetKitronProductionResults?PcbID={_currentGenesis.PcbId}", 8000); - LogText(resp, filename); - var sbRegister = new StringBuilder(); - - var Ledmode = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("GENESISFLOW_LedMode")); - var SampleRate = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("GENESISFLOW_SampleRate")); - sbRegister.AppendLine($"LedMode is {Ledmode}"); - - - sbRegister.AppendLine($"SampelRate is {SampleRate}"); - - if (Ledmode != 0) + try { - _currentGenesis.WriteRegister("GENESISFLOW_LedMode", 0); - sbRegister.AppendLine($"Change Led mode to Customermode (0)"); + + var resp = LocalWebRequest.GetRequest($"http://10.49.40.25/MeterProcessState/api/FinalCheck/GetKitronProductionResults?PcbID={_currentGenesis.PcbId}", 8000); + LogText(resp, filename); + var sbRegister = new StringBuilder(); + + var Ledmode = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("GENESISFLOW_LedMode")); + var SampleRate = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("GENESISFLOW_SampleRate")); + sbRegister.AppendLine($"LedMode is {Ledmode}"); + + + sbRegister.AppendLine($"SampelRate is {SampleRate}"); + + if (Ledmode != 0) + { + _currentGenesis.WriteRegister("GENESISFLOW_LedMode", 0); + sbRegister.AppendLine($"Change Led mode to Customermode (0)"); + } + + + if (SampleRate != 2) + { + _currentGenesis.WriteRegister("GENESISFLOW_SampleRate", 2); + sbRegister.AppendLine($"Change SampleRate mode to Customermode (2)"); + } } - - - if (SampleRate != 2) + catch (Exception exception) { - _currentGenesis.WriteRegister("GENESISFLOW_SampleRate", 2); - sbRegister.AppendLine($"Change SampleRate mode to Customermode (2)"); + _currentGenesis.WriteLog(exception.Message); } - - } diff --git a/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs b/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs index 7f279590..8e14d990 100644 --- a/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs +++ b/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs @@ -1460,12 +1460,16 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw _fwUpdatePowerCorrection = new PowerCorrection(); } - // fill all infos to meter power correction file + // fill all currently known infos to power correction + _fwUpdatePowerCorrection.ActualPulseAdapterIsInstalled = _currentGenesis.PulseAdapterAutoDetected; _fwUpdatePowerCorrection.ActualFwVersion = _currentGenesis.InstalledFwVersion; _fwUpdatePowerCorrection.RequiredFwVersion = (UInt32?)_cordonelFirmwarePackage.FwPackageInfo.Version; + + // preset meter power correction file powCorrFile.PowerCorrectionData = _fwUpdatePowerCorrection; - // calculate the power correction + // estimate the power correction values which includes the pulse adapter installation marker and + // the readout of Cordonel registers to get the actual status var powCorrCalc = new PowerCorrectionCalc(_currentGenesis, _fwUpdatePowerCorrection); var retVal = powCorrCalc.PowerCorrEstimation(); if (retVal) @@ -1488,21 +1492,22 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw } } + // one step of the power correction execution failed if (!retVal) { InfoProcessFailed(null, Resources.StrPowerCorrectionFailed); _processState = errorExitState; return; } - } - else + }// check for region and required FW version threshold + else // power correction mustn't be performed as the jump in version is not given { InfoProcessSuccess(null, Resources.StrPowerCorrectionNotNeeded); _processState = successExitState; return; } - // log + // log result of successfully executed power correction LogStringList(Resources.StrPowerCorrection, powCorrFile.FileContent, Resources.StrPowerCorrectionSucceeded); _processState = successExitState;