changed sequencing of MeterLutUpdate - still not working: cannot set meter size or erase 1\\mettbl and 1\\mettbl_b

This commit is contained in:
Thomas Wiedebusch
2022-03-04 11:15:00 +01:00
parent 1ae56612ff
commit c015b16f0a
3 changed files with 41 additions and 27 deletions
@@ -971,7 +971,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
var writeBackValue = _genesisMeter.ReadRegister(item.Key);
_registersAfterUpdate.Add(item.Key, writeBackValue);
_genesisMeter.WriteRegister(item.Key, item.Value);
}
//remove the update stop action
@@ -92,7 +92,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
// Look up table file
public MeterLutFile LutFile;
public MeterLutFile LutFileReadBack;
// list of names of installed meter files on drive 1
private List<String> _meterFilesDrive1;
@@ -109,7 +108,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// Register subset needed to adjust for update performance content before update
/// </summary>
private readonly Dictionary<String, Byte[]> _registersBeforeUpdate = new Dictionary<String, Byte[]>();
/// <summary>
/// Register to restore after update
/// </summary>
@@ -172,8 +171,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
if (genesisMeter.MeterAppListVersion.Any(f => f.AppName == "GENESISFLOW" && f.IsInstalled))
{
_registersBeforeUpdate.Add(Register.Genesisflow.LedMode, new[] {(Byte) LedMode.Off});
_registersBeforeUpdate.Add(Register.Genesisflow.SampleRate, new Byte[] {1});
_registersBeforeUpdate.Add(Register.Genesisflow.LedMode, new[] { (Byte)LedMode.Off });
_registersBeforeUpdate.Add(Register.Genesisflow.SampleRate, new Byte[] { 1 });
}
if (genesisMeter.MeterAppListVersion.Any(f => f.AppName == "METROLOGYASST" && f.IsInstalled))
_registersBeforeUpdate.Add(Register.Mertrologyasst.PulseMode, new Byte[] { 0 });
@@ -568,21 +567,21 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
_genesisMeter.TransmitProtocol.SetResponseTimeout(5000);
do
{
_actualOperation = "Write meter size";
_actualOperation = "Write Lut CRC to meter";
_operationCtr++;
if (!_genesisMeter.WriteRegister(Register.Genesisflow.MeterSize, (Byte)LutFile.MeterSize))
if (!_genesisMeter.WriteRegister<UInt32>(Register.Genesisflow.LookupFileCrc, LutFile.FileCrc))
{
ErrorMessage = "Meter size could not be set!\n";
ErrorMessage += "Meter LUT CRC could not be set!\n";
_operationCtr--;
returnValue = false;
}
else
{
_operationCtr++;
_actualOperation = "Write Lut CRC to meter";
if (!_genesisMeter.WriteRegister<UInt32>(Register.Genesisflow.LookupFileCrc, LutFile.FileCrc))
_actualOperation = "Write meter size";
if (!_genesisMeter.WriteRegister(Register.Genesisflow.MeterSize, new[] { (Byte)LutFile.MeterSize }))
{
ErrorMessage += "Meter LUT CRC could not be set!\n";
ErrorMessage = "Meter size could not be set!\n";
_operationCtr--;
returnValue = false;
}
@@ -620,6 +619,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// </remarks>
private Boolean ReadMeterFilesDrive1()
{
// logout and re-login to clear all ongoing processes and clear the Genesis buffers
ReestablishMeterFileSystem();
if (_meterFilesDrive1 == null)
{
_meterFilesDrive1 = new List<String>();
@@ -645,8 +647,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
var returnValue = _meterFile.UnlockEraseWriteMeterFile(fileDriveName);
//erase returns always TRUE, even if the erasure failed! Check with catalogue
_meterFile.EraseMeterFile(fileDriveName);
_meterFilesDrive1.Clear();
if (ReadMeterFilesDrive1())
{
if (_meterFilesDrive1.Contains(fileDriveName))
@@ -674,13 +675,14 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
if (LutFile == null) return false;
//set extended timeout for trigger upgrade response delay
_genesisMeter.TransmitProtocol.SetResponseTimeout(5000);
_genesisMeter.TransmitProtocol.SetResponseTimeout(10000);
var returnValue = true;
//erase loop and retry if not successful
do
{
var filesToErase = new[] { StrLutMeterFileName, StrLutBackupMeterFileName};
var filesToErase = new[] { StrLutBackupMeterFileName, StrLutMeterFileName };
//var filesToErase = new[] { StrLutMeterFileName, StrLutBackupMeterFileName};
// read all files which are already installed
_actualOperation = "Read installed meter files drive 1";
@@ -702,7 +704,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
_operationCtr--;
}
}
if (!returnValue)
{
ReestablishMeterFileSystem();
@@ -729,19 +731,24 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
if (LutFile == null) return false;
//set extended timeout for trigger upgrade response delay
_genesisMeter.TransmitProtocol.SetResponseTimeout(5000);
_genesisMeter.TransmitProtocol.SetResponseTimeout(10000);
var returnValue = true;
//write LUT files and retry if not successful
do
{
_actualOperation = "Download LUT files to meter";
var filesToDownload = new[] { StrLutMeterFileName, StrLutBackupMeterFileName};
var filesToDownload = new[] { StrLutMeterFileName, StrLutBackupMeterFileName };
foreach (var fileToDownload in filesToDownload)
{
_operationCtr++;
_actualOperation = $"Write {fileToDownload}";
// logout and re-login to clear all ongoing processes and clear the Genesis buffers
ReestablishMeterFileSystem();
_meterFile.UnlockEraseWriteMeterFile(fileToDownload);
if (_meterFile.WriteMeterFile(fileToDownload, LutFile.BinData.ToArray())) continue;
ErrorMessage += $"Writing of {fileToDownload} failed!\n";
@@ -752,6 +759,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
// read all files on drive 1
_operationCtr++;
_actualOperation = "Read installed meter files drive 1";
if (ReadMeterFilesDrive1())
{
foreach (var checkInstalledFile in filesToDownload)
@@ -766,7 +774,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
{
returnValue = false;
}
if (!returnValue)
{
ReestablishMeterFileSystem();
@@ -793,24 +801,27 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
if (LutFile == null) return false;
//set extended timeout for trigger upgrade response delay
_genesisMeter.TransmitProtocol.SetResponseTimeout(5000);
_genesisMeter.TransmitProtocol.SetResponseTimeout(10000);
var returnValue = true;
//write LUT files and retry if not successful
do
{
_actualOperation = "Upload LUT files to meter";
var filesToUpload = new[] { StrLutMeterFileName, StrLutBackupMeterFileName};
var filesToUpload = new[] { StrLutMeterFileName, StrLutBackupMeterFileName };
foreach (var fileToUpload in filesToUpload)
{
_operationCtr++;
_actualOperation = $"Read {fileToUpload}";
LutFileReadBack = new MeterLutFile(fileToUpload);
if (_meterFile.ReadMeterFile(fileToUpload, out LutFileReadBack.BinData, LutFile.BinData.Count))
// 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))
{
// compare the entire buffer which also includes the header of the file
if (!LutFileReadBack.BinData.SequenceEqual(LutFile.BinData))
if (!binData.SequenceEqual(LutFile.BinData))
{
ErrorMessage += $"Meter LUT file is unequal to downloaded {fileToUpload}!\n";
returnValue = false;