diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs
index 568f902b..92a77aa4 100644
--- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs
+++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs
@@ -383,6 +383,10 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
///
/// - Initial.
///
+ ///
+ /// - Compare registers reactivated based on new interface (configuration.json) with new
+ /// "StaticType": “approximate”.
+ ///
public Boolean CompareRegisters()
{
if (_pcbIdFinalRegisterRead != _pcbIdInitialRegisterRead ||
@@ -425,17 +429,35 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
var strRequiredRegisterValue = "";
try
{
- var isIdentical = true;
- for (var c = 0; c < dataSize; c++)
+ var isApproximated = false;
+ var isIdentical = false;
+ if (regDef.RegisterDetail.StaticType == StaticType.ReadBackApproximated)
{
- if (restorableRawRegister[c] == finalReadRawRegister[c]) continue;
- isIdentical = false;
- break;
+ var restoreValue = RegisterConverter.ConvertTo(restorableRawRegister);
+ var finalValue = RegisterConverter.ConvertTo(finalReadRawRegister);
+
+ // Check limited to +/- 3
+ if (restoreValue - 3 <= finalValue && restoreValue + 3 >= finalValue)
+ {
+ isApproximated = true;
+ }
+ }
+ else
+ {
+ for (var c = 0; c < dataSize; c++)
+ {
+ if (restorableRawRegister[c] != finalReadRawRegister[c])
+ {
+ isIdentical = false;
+ break;
+ }
+ isIdentical = true;
+ }
}
// convert register content to text with raw and converted value depending on data type
strRequiredRegisterValue =
RegisterConverter.GetRegisterContentText(regDef, restorableRawRegister);
- if (finalReadRawRegister != null && isIdentical)
+ if (finalReadRawRegister != null && (isIdentical || isApproximated))
{
strRequiredRegisterValue += $" - {Resources.StrRegisterCompareSucceeded}";
}
diff --git a/Common/Hardware/WaterMeter/Genesis/Registers/DataTypes/StaticType.cs b/Common/Hardware/WaterMeter/Genesis/Registers/DataTypes/StaticType.cs
index 8138e026..935412ac 100644
--- a/Common/Hardware/WaterMeter/Genesis/Registers/DataTypes/StaticType.cs
+++ b/Common/Hardware/WaterMeter/Genesis/Registers/DataTypes/StaticType.cs
@@ -26,19 +26,25 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers.DataTypes
///
/// Static type to define restore capability
///
- private const String RestoreRequired = "static";
+ public const String RestoreRequired = "static";
+
+ ///
+ /// Static type approximate informs that the read back value may be not identical
+ /// to the written value and is approximated.
+ ///
+ public const String ReadBackApproximated = "approximate";
///
/// Denied restore capability
///
// ReSharper disable once UnusedMember.Local
- private const String RestoreDenied = "dynamic";
+ public const String RestoreDenied = "dynamic";
///
/// Unpredictable restore capability
///
// ReSharper disable once UnusedMember.Local
- private const String RestoreUnpredictable = "infrequentlyupdated";
+ public const String RestoreUnpredictable = "infrequentlyupdated";
///
/// Check restore capability
@@ -46,7 +52,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers.DataTypes
/// true if restore required
public Boolean CheckRestoreCapability()
{
- return StaticTypeValue == RestoreRequired;
+ return StaticTypeValue == RestoreRequired || StaticTypeValue == ReadBackApproximated;
}
///
diff --git a/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs b/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs
index a9f5087f..acb51469 100644
--- a/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs
+++ b/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs
@@ -323,6 +323,10 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
///
/// - Restore meter files and compare registers removed for this release.
///
+ ///
+ /// - Compare registers reactivated based on new interface (configuration.json) with new
+ /// "StaticType": “approximate”.
+ ///
private void FwUpdateSwStateMachine()
{
while (!_processToken.IsCancellationRequested)
@@ -457,8 +461,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
break;
case ProcessState.CompareRegisters:
- //TODO THW ReadRegisters(GetNextProcessState(_processState, _stateSequencePrepareMeterRelease));
- _processState = GetNextProcessState(_processState, _stateSequencePrepareMeterRelease);
+ ReadRegisters(GetNextProcessState(_processState, _stateSequencePrepareMeterRelease));
break;
case ProcessState.RestorePasswordFile:
diff --git a/ServiceFwUpdate/Ui/ServiceFwUpdateSw/Properties/Resources.Designer.cs b/ServiceFwUpdate/Ui/ServiceFwUpdateSw/Properties/Resources.Designer.cs
index cc6170f2..6f3b5a9a 100644
--- a/ServiceFwUpdate/Ui/ServiceFwUpdateSw/Properties/Resources.Designer.cs
+++ b/ServiceFwUpdate/Ui/ServiceFwUpdateSw/Properties/Resources.Designer.cs
@@ -656,7 +656,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw.Properties {
}
///
- /// Looks up a localized string similar to Installed LUT is equal to required LUT..
+ /// Looks up a localized string similar to Installed LUT is equal to required..
///
internal static string StrLutFileCompareSucceeded {
get {
@@ -701,7 +701,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw.Properties {
}
///
- /// Looks up a localized string similar to ERROR: LUT is not in FW updae safe!.
+ /// Looks up a localized string similar to ERROR: LUT is not in FW update safe!.
///
internal static string StrLutFileNotDelivered {
get {
diff --git a/ServiceFwUpdate/Ui/ServiceFwUpdateSw/Properties/Resources.resx b/ServiceFwUpdate/Ui/ServiceFwUpdateSw/Properties/Resources.resx
index 23882360..3dba6bd7 100644
--- a/ServiceFwUpdate/Ui/ServiceFwUpdateSw/Properties/Resources.resx
+++ b/ServiceFwUpdate/Ui/ServiceFwUpdateSw/Properties/Resources.resx
@@ -620,13 +620,13 @@
ERROR: Installed LUT is unequal to required!
- Installed LUT is equal to required LUT.
+ Installed LUT is equal to required.
ERROR: LUT from FW update safe invalid!
- ERROR: LUT is not in FW updae safe!
+ ERROR: LUT is not in FW update safe!
ERROR: LUT readout failed!