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!