RegisterRestorer: - keep static recovery registers
This commit is contained in:
@@ -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
@@ -1 +1 @@
|
||||
89102b0142e574de38a9f47d370f3334e5e6c268
|
||||
8fbe991b217e7692af4817ad205b768685aa5a72
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
338bdd8d71c148c9df0972f903098eb23eacf0c9
|
||||
1babc7d629fd8c486aff20f4990c117c2e58a68f
|
||||
|
||||
Reference in New Issue
Block a user