From d95a85f0b75d3c7fb1af3b3566f183a1bc1939d4 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Tue, 29 Mar 2022 14:47:25 +0200 Subject: [PATCH] Delays implemented between file access steps --- .../GenesisFile/Consts/LutUpdateStateInfo.cs | 2 +- .../Genesis/GenesisFile/MeterFile.cs | 4 +- .../Genesis/GenesisFile/MeterLutUpdate.cs | 82 +++++++++---------- 3 files changed, 41 insertions(+), 47 deletions(-) diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/Consts/LutUpdateStateInfo.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/Consts/LutUpdateStateInfo.cs index d3c0e8a4..c2e7fe52 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/Consts/LutUpdateStateInfo.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/Consts/LutUpdateStateInfo.cs @@ -45,7 +45,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.Consts StateInfos[7].Message = "Compare LUT file"; StateInfos[8].State = LutUpdateState.FinalizeLutDownload; - StateInfos[8].Message = "Init meter size and LUT file CRC"; + StateInfos[8].Message = "Finalize LUT file installation"; StateInfos[9].State = LutUpdateState.EraseLutFile; StateInfos[9].Message = "Erase LUT file in meter"; diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFile.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFile.cs index 57b3cbe3..24c8c106 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFile.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFile.cs @@ -342,10 +342,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile _currentGenesis.WriteRegister(Register.Configexchange.FileRead, _filePointer); //the preceding routine needs to wait for response, else this is always true! - while (readBackCount > 0 && returnValue) + while (readBackCount > 0 && !_stopProcess) { - returnValue = _stopProcess; - var remainingData = RegisterConverter.ConvertTo( _currentGenesis.ReadRegister(Register.Configexchange.FileRead)); diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs index 6a88b894..f874c197 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs @@ -28,6 +28,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// public event EventHandler OnProcessUpdate; + //error mask for unsuccessfully written LUT CRC + private const UInt32 LutCrcErrorMask = 0x8000000; + //disk and name of lookup file private const String StrLutMeterFileName = "1\\mettbl"; @@ -37,7 +40,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile // identifier for Genesis lookup table private const String StrLutFileId = "GEN_LUT\0"; private const Int32 IndexLutFileId = 0; - private const UInt32 LengthLutFileId = 8; + private const Int32 LengthLutFileId = 8; // data length, calculated from version field to the end of the data section private const Int32 IndexDataLength = 8; @@ -45,7 +48,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile // CCITT-CRC-16 , calculated from version field to the end of the data section private const Int32 IndexCrc = 12; - private const UInt32 LengthCrc = 2; + private const Int32 LengthCrc = 2; // version private const Int32 IndexVersion = 14; @@ -55,18 +58,13 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile private const Int32 IndexMeterSize = 16; // header size of file - private const UInt32 LutFileHeaderLength = - LengthLutFileId + LengthDataLength + LengthCrc + LengthVersion; + private const Int32 LutFileHeaderLength = LengthLutFileId + LengthDataLength + LengthCrc + LengthVersion; // data size of file private const Int32 LutFileDataLength = 730; // LUT file entire file size - private const UInt32 SizeLutFile = LutFileHeaderLength + LutFileDataLength; - - - // process display message - private const String StrProcessLut = "Processing metrology lookup table"; + private const Int32 SizeLutFile = LutFileHeaderLength + LutFileDataLength; //trigger update retries private const Int32 RegisterWriteRetries = 0; @@ -132,9 +130,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// public virtual void ProcessUpdate_Event(Object sender, ProcessExecEventArgs e) { - // copy text from overall messages to actual, because this is from sub-routine - OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(StrProcessLut, - OverallProcessCtrPercent, _actualOperation, e.OverallProcessPercent)); + //// copy text from overall messages to actual, because this is from sub-routine + //OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(_overallOperation, + // OverallProcessCtrPercent, _actualOperation, e.OverallProcessPercent)); } #endregion @@ -453,8 +451,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile case LutUpdateState.StartInitial: _updateProcedureRetryCtr = 0; - //TODO THW Test only _lutUpdateState = LutUpdateState.EraseLutFile; - _lutUpdateState = LutUpdateState.DownloadLutFile; + _lutUpdateState = LutUpdateState.EraseLutFile; break; case LutUpdateState.EraseLutFile: @@ -587,7 +584,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile returnValue = _genesisMeter.WriteRegister(Register.Genesisflow.LookupFileCrc, LutFile.FileCrc); if (!returnValue) { - const String txt = "Meter LUT CRC could not be set!\n"; + const String txt = "Meter LUT CRC could not be set!"; ErrorMessage = txt; OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); _operationCtr--; @@ -600,7 +597,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile _genesisMeter.WriteRegister(Register.Genesisflow.MeterSize, new[] { (Byte)LutFile.MeterSize }); if (!returnValue) { - const String txt = "Meter size could not be set!\n"; + const String txt = "Meter size could not be set!"; ErrorMessage = txt; OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); _operationCtr--; @@ -612,7 +609,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile returnValue = _genesisMeter.WriteRegister(Register.Genesisflow.StoreCalibration, 1); if (!returnValue) { - const String txt = "Meter store calibration failed!\n"; + const String txt = "Meter store calibration failed!"; ErrorMessage = txt; OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); _operationCtr--; @@ -620,28 +617,31 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile } _operationCtr++; - _actualOperation = "Read LUT CRC"; + _actualOperation = "Read back LUT CRC from meter"; var lutCrc = RegisterConverter.ConvertTo( _genesisMeter.ReadRegister(Register.Genesisflow.LookupFileCrc)); - if ((lutCrc & 0x80000000) != 0) + if ((lutCrc & LutCrcErrorMask) != 0) { - const String txt = "Meter LUT CRC could not be set!\n"; + const String txt = "Meter LUT CRC could not be set!"; ErrorMessage = txt; OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); _operationCtr--; returnValue = false; continue; } + + OnProcessUpdate?.Invoke(this, + new ProcessExecEventArgs($"Read back and validated LUT CRC 0x{lutCrc:X4}")); _operationCtr++; - _actualOperation = "Read meter size"; + _actualOperation = "Read back meter size from meter"; var meterSize = (MeterSize)RegisterConverter.ConvertTo( _genesisMeter.ReadRegister(Register.Genesisflow.MeterSize)); if (meterSize != LutFile.MeterSize) { - const String txt = "Meter size could not be set!\n"; + const String txt = "Meter size could not be set!"; ErrorMessage = txt; OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); _operationCtr--; @@ -650,7 +650,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile } ErrorMessage = ""; - OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs("Meter size and LUT CRC correctly set!\n")); + OnProcessUpdate?.Invoke(this, + new ProcessExecEventArgs("Read back and validated meter size " + + $"{MeterSizeConverter.ConvertMeterSizeEnumToSizeName(meterSize)}")); } while (!returnValue && retryCtr++ < RegisterWriteRetries && !StopUpdateProcess); @@ -677,8 +679,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile _meterFilesDrive1 = new List(); } _meterFilesDrive1.Clear(); + Thread.Sleep(500); - OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs("\nRead meter files drive 1")); + OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs("Read meter files drive 1")); if (!_meterFile.ReadMeterFileCatalog(out var meterFilesDrive1, MeterFile.StrMeterDrive1, MeterFile.WildcardAll.ToString())) return false; @@ -702,13 +705,13 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// private Boolean EraseFile(String fileDriveName) { - OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs($"\nErasing {fileDriveName}")); + OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs($"Erasing {fileDriveName}")); var returnValue = _meterFile.UnlockEraseWriteMeterFile(fileDriveName); // erase returns always TRUE, even if the erasure failed! Check with catalogue _meterFile.EraseMeterFile(fileDriveName); // give the meter a certain time to erase - Thread.Sleep(1000); + Thread.Sleep(500); if (ReadMeterFilesDrive1()) { @@ -755,8 +758,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile //erase loop and retry if not successful do { - var filesToErase = new[] { StrLutBackupMeterFileName, StrLutMeterFileName }; - //var filesToErase = new[] { StrLutMeterFileName, StrLutBackupMeterFileName}; + var filesToErase = new[] { StrLutMeterFileName, StrLutBackupMeterFileName }; // read all files which are already installed _actualOperation = "Read installed meter files drive 1"; @@ -772,17 +774,13 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile _operationCtr++; _actualOperation = $"Erase {fileToErase}"; - var txt = $"LUT file {fileToErase} erased!\n"; if (EraseFile(fileToErase)) { ErrorMessage = ""; - OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); continue; } - txt = $"LUT file {fileToErase} not erased!\n"; - ErrorMessage = txt; - OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); + ErrorMessage = $"LUT file {fileToErase} not erased!"; returnValue = false; _operationCtr--; } @@ -821,7 +819,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile //write LUT files and retry if not successful do { - _actualOperation = "Download LUT files to meter"; var filesToDownload = new[] { StrLutMeterFileName, StrLutBackupMeterFileName }; foreach (var fileToDownload in filesToDownload) @@ -833,7 +830,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile ReestablishMeterFileSystem(); _meterFile.UnlockEraseWriteMeterFile(fileToDownload); - var txt = $"{fileToDownload} successfully written\n"; + Thread.Sleep(500); + var txt = $"{fileToDownload} successfully written"; if (_meterFile.WriteMeterFile(fileToDownload, LutFile.BinData.ToArray())) { ErrorMessage = ""; @@ -841,7 +839,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile continue; } - txt = $"Writing of {fileToDownload} failed!\n"; + txt = $"Writing of {fileToDownload} failed!"; ErrorMessage = txt; OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); returnValue = false; @@ -850,7 +848,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile // read all files on drive 1 _operationCtr++; - _actualOperation = "Read installed meter files drive 1"; if (ReadMeterFilesDrive1()) { @@ -859,7 +856,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile if (_meterFilesDrive1.Contains(checkInstalledFile)) { ErrorMessage = ""; - var txt = $"{checkInstalledFile} found in meter\n"; + var txt = $"{checkInstalledFile} found in meter"; OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); continue; } @@ -906,7 +903,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile //write LUT files and retry if not successful do { - _actualOperation = "Upload LUT files to meter"; var filesToUpload = new[] { StrLutMeterFileName, StrLutBackupMeterFileName }; foreach (var fileToUpload in filesToUpload) @@ -917,26 +913,26 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile // logout and re-login to clear all ongoing processes and clear the Genesis buffers ReestablishMeterFileSystem(); - if (_meterFile.ReadMeterFile(fileToUpload, out var binData, LutFile.BinData.Count)) + if (_meterFile.ReadMeterFile(fileToUpload, out var binData, SizeLutFile)) { // compare the entire buffer which also includes the header of the file if (!binData.SequenceEqual(LutFile.BinData)) { - ErrorMessage = $"Meter LUT file is unequal to downloaded {fileToUpload}!\n"; + ErrorMessage = $"Meter LUT file is unequal to downloaded {fileToUpload}!"; returnValue = false; _operationCtr--; } else { OnProcessUpdate?.Invoke(this, - new ProcessExecEventArgs($"LUT file {fileToUpload} of meter successfully compared!\n")); + new ProcessExecEventArgs($"LUT file {fileToUpload} of meter successfully compared!")); } continue; } - ErrorMessage += $"Reading of {fileToUpload} failed!\n"; + ErrorMessage += $"Reading of {fileToUpload} failed!"; returnValue = false; _operationCtr--; }