Delays implemented between file access steps
This commit is contained in:
@@ -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--;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user