Delays implemented between file access steps

This commit is contained in:
Thomas Wiedebusch
2022-03-29 14:47:25 +02:00
parent 50f15842aa
commit d95a85f0b7
3 changed files with 41 additions and 47 deletions
@@ -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";
@@ -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<Int32>(
_currentGenesis.ReadRegister(Register.Configexchange.FileRead));
@@ -28,6 +28,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// </summary>
public event EventHandler<ProcessExecEventArgs> 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
/// </remarks>
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<UInt32>(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<UInt32>(
_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<Byte>(
_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<String>();
}
_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
/// </remarks>
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--;
}