RegisterRestorer: - keep static recovery registers

This commit is contained in:
Thomas Wiedebusch
2024-06-06 18:43:26 +02:00
parent b840e3cbba
commit 2ad9144bad
4 changed files with 170 additions and 32 deletions
@@ -447,6 +447,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
/// <remarks date="2024-Apr-09" author="Thomas Wiedebusch">
/// - Removed skip recovery if already done in previous run to enable a retry.
/// </remarks>
/// <remarks date="2024-Jun-06" author="Thomas Wiedebusch">
/// - Backup recoveryRegistersDb to RecoveryRegisters.
/// </remarks>
public StatusReturn WriteRegisters(List<RecoveryRegisterItem> recoveryRegistersDb, Boolean eolProgramming = false)
{
if (_currentGenesis == null ||
@@ -465,10 +468,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
{
RecoveryRegisters = new List<RecoveryRegisterItem>();
}
if (RecoveryRegisters.Count == 0)
{
RecoveryRegisters = recoveryRegistersDb;
}
RecoveryRegisters.Clear();
RecoveryRegisters.AddRange(recoveryRegistersDb);
StopRegisterAccess = false;
_actualRegisterCtr = 0;
@@ -710,6 +712,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
/// <remarks date="2024-Mar-20" author="Thomas Wiedebusch">
/// - Hash password and encryption key with SHA256.
/// </remarks>
/// <remarks date="2024-Jun-06" author="Thomas Wiedebusch">
/// - Modified access to read and write value as sometimes the comparison failed.
/// </remarks>
public Boolean CompareRegisters()
{
if (_pcbIdFinalRegisterRead != _pcbIdWriteRegisters ||
@@ -765,22 +770,20 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
try
{
// Get the raw byte array of this register
var writtenValue =
RecoveryRegisters.FirstOrDefault(reg => reg.RegisterIdent.Equals(regName)).WriteValue;
var readBackValue =
RecoveryRegisters.FirstOrDefault(reg => reg.RegisterIdent.Equals(regName)).ReadBackValue;
// Get the register
var recReg = RecoveryRegisters.First(reg => reg.RegisterIdent.Equals(regName));
// If any value is null then there is nothing to compare
if (writtenValue == null || readBackValue == null)
if (recReg?.WriteValue == null || recReg.ReadBackValue == null)
{
_failedComparisonRegisters?.Add(new RecoveryRegisterItem(regName, writtenValue, readBackValue));
_failedComparisonRegisters?.Add(new RecoveryRegisterItem(regName, recReg?.WriteValue,
recReg.ReadBackValue));
continue; //TODO THW check if error should be signalized
}
// ATTENTION: Take the size of the read back value as this will be filled up to a chunk of 4
// bytes and therefore the required write value may have a smaller byte list!
var dataSize = writtenValue.Length;
var dataSize = recReg.WriteValue.Length;
var strRequiredRegisterValue = "";
try
@@ -793,34 +796,34 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
Int64 finalValue = 0;
if (regDef.DataType.Name.Equals("Int32"))
{
restoreValue = RegisterConverter.ByteArrayToValue<Int32>(writtenValue);
finalValue = RegisterConverter.ByteArrayToValue<Int32>(readBackValue);
restoreValue = RegisterConverter.ByteArrayToValue<Int32>(recReg.WriteValue);
finalValue = RegisterConverter.ByteArrayToValue<Int32>(recReg.ReadBackValue);
}
else if (regDef.DataType.Name.Equals("UInt32"))
{
restoreValue = RegisterConverter.ByteArrayToValue<UInt32>(writtenValue);
finalValue = RegisterConverter.ByteArrayToValue<UInt32>(readBackValue);
restoreValue = RegisterConverter.ByteArrayToValue<UInt32>(recReg.WriteValue);
finalValue = RegisterConverter.ByteArrayToValue<UInt32>(recReg.ReadBackValue);
}
// Just half of number range will work due to cast to Int64
else if (regDef.DataType.Name.Equals("UInt64"))
{
restoreValue = (Int64)RegisterConverter.ByteArrayToValue<UInt64>(writtenValue);
finalValue = (Int64)RegisterConverter.ByteArrayToValue<UInt64>(readBackValue);
restoreValue = (Int64)RegisterConverter.ByteArrayToValue<UInt64>(recReg.WriteValue);
finalValue = (Int64)RegisterConverter.ByteArrayToValue<UInt64>(recReg.ReadBackValue);
}
else if (regDef.DataType.Name.Equals("Int64"))
{
restoreValue = RegisterConverter.ByteArrayToValue<UInt32>(writtenValue);
finalValue = RegisterConverter.ByteArrayToValue<UInt32>(readBackValue);
restoreValue = RegisterConverter.ByteArrayToValue<UInt32>(recReg.WriteValue);
finalValue = RegisterConverter.ByteArrayToValue<UInt32>(recReg.ReadBackValue);
}
else if (regDef.DataType.Name.Equals("Byte"))
{
restoreValue = RegisterConverter.ByteArrayToValue<Byte>(writtenValue);
finalValue = RegisterConverter.ByteArrayToValue<Byte>(readBackValue);
restoreValue = RegisterConverter.ByteArrayToValue<Byte>(recReg.WriteValue);
finalValue = RegisterConverter.ByteArrayToValue<Byte>(recReg.ReadBackValue);
}
else if (regDef.DataType.Name.Equals("SByte"))
{
restoreValue = RegisterConverter.ByteArrayToValue<SByte>(writtenValue);
finalValue = RegisterConverter.ByteArrayToValue<SByte>(readBackValue);
restoreValue = RegisterConverter.ByteArrayToValue<SByte>(recReg.WriteValue);
finalValue = RegisterConverter.ByteArrayToValue<SByte>(recReg.ReadBackValue);
}
// Check limited to +/- 3
if (restoreValue - 3 <= finalValue && restoreValue + 3 >= finalValue)
@@ -832,7 +835,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
{
for (var c = 0; c < dataSize; c++)
{
if (writtenValue[c] != readBackValue[c])
if (recReg.WriteValue[c] != recReg.ReadBackValue[c])
{
isIdentical = false;
break;
@@ -842,8 +845,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
}
// convert register content to text with raw and converted value depending on data type
strRequiredRegisterValue =
RegisterConverter.GetRegisterContentText(regDef, writtenValue);
if (readBackValue != null && (isIdentical || isApproximated))
RegisterConverter.GetRegisterContentText(regDef, recReg.WriteValue);
if (recReg.ReadBackValue != null && (isIdentical || isApproximated))
{
strRequiredRegisterValue += $" - {Resources.StrRegisterCompareSucceeded}";
}
@@ -851,13 +854,13 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
{
var encryptRawData = regName.Contains("EncryptionKey") || regName.Contains("Password");
var strReadBackRegisterValue = RegisterConverter.GetRegisterRawText(regDef, readBackValue,
var strReadBackRegisterValue = RegisterConverter.GetRegisterRawText(regDef, recReg.ReadBackValue,
encryptRawData);
strRequiredRegisterValue += $" - {Resources.StrMeterValue}: ({strReadBackRegisterValue})" +
$" - {Resources.StrRegisterCompareFailed}";
_failedComparisonRegisters?.Add(new RecoveryRegisterItem(regName, writtenValue,
readBackValue));
_failedComparisonRegisters?.Add(new RecoveryRegisterItem(regName, recReg.WriteValue,
recReg.ReadBackValue));
retVal = false;
}
}
@@ -1 +1 @@
89102b0142e574de38a9f47d370f3334e5e6c268
8fbe991b217e7692af4817ad205b768685aa5a72
@@ -1 +1 @@
338bdd8d71c148c9df0972f903098eb23eacf0c9
1babc7d629fd8c486aff20f4990c117c2e58a68f