CUST: - FwUpdateSw: - start implementation of power correction

This commit is contained in:
Thomas Wiedebusch 2024-05-08 12:11:41 +02:00
parent 1fbc2d0f61
commit 4e716823f9
5 changed files with 179 additions and 12 deletions

View File

@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
{
@ -10,14 +12,19 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <summary>
/// Drive and name for power correction file stored on meter
/// </summary>
public const String StrMeterPowerCorrectionFilePathName = "1\\powcorr";
public const String StrMeterPowCorrFileName = "1\\powcorr";
private readonly GenesisMeter _currentGenesis;
private readonly MeterFile _meterFile;
private const Int32 MeterPwrCorrFileLengthIndex = 0;
private const Int32 MeterPwrCorrFileLengthSize = 2;
private const Int32 MeterPwrCorrFileCrcIndex = MeterPwrCorrFileLengthIndex + MeterPwrCorrFileLengthSize;
private const Int32 MeterPwrCorrFileCrcSize= 2;
private const Int32 MeterPwrCorrFileDataIndex = MeterPwrCorrFileCrcIndex + MeterPwrCorrFileCrcSize;
private List<Byte>_meterBinData = new List<Byte>();
/// <summary>
/// Detected FW version before maintenance
/// </summary>
@ -97,5 +104,39 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// CRC of power correction file
/// </summary>
public UInt32 MeterPowerCorrectionCRC { get; set; }
/// <summary>
/// Ctor
/// </summary>
/// <param name="currentGenesis"></param>
/// <remarks date="2024-May-08" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
public MeterPowerCorrectionFile(GenesisMeter currentGenesis)
{
_currentGenesis = currentGenesis;
_meterFile = new MeterFile(_currentGenesis);
}
/// <summary>
/// Read power correction meter file.
/// </summary>
/// <returns>true: file found</returns>
/// <remarks date="2024-May-08" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public Boolean ReadPowCorrMeterFile()
{
if (_currentGenesis == null || _meterFile == null)
return false;
var retVal = _currentGenesis.ReLogin();
if (retVal)
{
retVal = _meterFile.ReadMeterFile(StrMeterPowCorrFileName, out _meterBinData);
}
return retVal;
}
}
}

View File

@ -1096,6 +1096,42 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Power correction:.
/// </summary>
internal static string StrPowerCorrection {
get {
return ResourceManager.GetString("StrPowerCorrection", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to ERROR: Power correction failed!.
/// </summary>
internal static string StrPowerCorrectionFailed {
get {
return ResourceManager.GetString("StrPowerCorrectionFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Power correction not needed..
/// </summary>
internal static string StrPowerCorrectionNotNeeded {
get {
return ResourceManager.GetString("StrPowerCorrectionNotNeeded", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Power correction succeeded..
/// </summary>
internal static string StrPowerCorrectionSucceeded {
get {
return ResourceManager.GetString("StrPowerCorrectionSucceeded", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Process state connect.
/// </summary>

View File

@ -694,4 +694,16 @@
<data name="StrFwUpdateFailed" xml:space="preserve">
<value>ERROR: Firmware update failed!</value>
</data>
<data name="StrPowerCorrection" xml:space="preserve">
<value>Power correction:</value>
</data>
<data name="StrPowerCorrectionFailed" xml:space="preserve">
<value>ERROR: Power correction failed!</value>
</data>
<data name="StrPowerCorrectionNotNeeded" xml:space="preserve">
<value>Power correction not needed.</value>
</data>
<data name="StrPowerCorrectionSucceeded" xml:space="preserve">
<value>Power correction succeeded.</value>
</data>
</root>

View File

@ -1395,10 +1395,13 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
/// Correct power overestimation at FW change from
/// <see cref="PowerCorrection.EmeaFwThresholdForPowCorr"/>,
/// <see cref="PowerCorrection.NaFNaFwThresholdForPowCorr"/>.
/// Precondition:
/// Meter registers have to be read in advance,
/// Meter files have to be read in advance.
/// </summary>
/// <param name="successExitState"></param>
/// <param name="errorExitState"></param>
/// <remarks date="2024-May-07" author="Thomas Wiedebusch">
/// <remarks date="2024-May-08" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
private void CorrectPowerOverestimation(ProcessState successExitState,
@ -1407,29 +1410,92 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
// remind the invoker being able to generate error messages based on the last state
_invokerProcessState = _processState;
if ( _fwUpdatePowerCorrection == null
|| _currentGenesis?.InstalledFwVersion == null
|| _cordonelFirmwarePackage?.FwPackageInfo?.Version == null)
if (_currentGenesis?.InstalledFwVersion == null ||
_cordonelFirmwarePackage?.FwPackageInfo?.Version == null)
{
InfoProcessFailed(null, Resources.StrLifeTimeCalculationFailed);
InfoProcessFailed(null, Resources.StrPowerCorrectionFailed);
_processState = errorExitState;
return;
}
_fwUpdatePowerCorrection.ActualFwVersion = _currentGenesis.InstalledFwVersion;
_fwUpdatePowerCorrection.RequiredFwVersion =
(UInt32?)_cordonelFirmwarePackage?.FwPackageInfo?.Version;
var powCorrFile = new MeterPowerCorrectionFile(_currentGenesis);
// CASE 1: Power correction has been executed in previous run:
// Check if file "1\\powcorr" is in meter
if (_readMeterFiles.Any(f => f.Contains(MeterPowerCorrectionFile.StrMeterPowCorrFileName)))
{
// read the powCorrFile
powCorrFile.ReadPowCorrMeterFile();
LogPowCorrContent(powCorrFile);
_processState = successExitState;
return;
}
// CASE 2: Power correction needed due to update of FW to corrected version regarding the
// power calculation:
// Check required versus installed FW versions and threshold version for power correction
if ((_currentGenesis.Region == "EMEA" &&
_cordonelFirmwarePackage.FwPackageInfo.Version >= PowerCorrection.EmeaFwThresholdForPowCorr &&
_currentGenesis.InstalledFwVersion < PowerCorrection.EmeaFwThresholdForPowCorr) ||
(_currentGenesis.Region == "NA" &&
_cordonelFirmwarePackage.FwPackageInfo.Version >= PowerCorrection.NaFNaFwThresholdForPowCorr &&
_currentGenesis.InstalledFwVersion < PowerCorrection.NaFNaFwThresholdForPowCorr))
{
var applyAlgorithm1 = true;
// CASE 2.1: Missing power correction settings from FW update package
if (_fwUpdatePowerCorrection == null)
{
applyAlgorithm1 = false;
//do something
_fwUpdatePowerCorrection = new PowerCorrection();
}
// calculate the power correction
if (applyAlgorithm1)
{
}
else
{
}
// correct the total used seconds
// fill all infos to meter power correction file
_fwUpdatePowerCorrection.ActualFwVersion = _currentGenesis.InstalledFwVersion;
_fwUpdatePowerCorrection.RequiredFwVersion = (UInt32?)_cordonelFirmwarePackage.FwPackageInfo.Version;
// store results to "1\\powcorr" in the meter
}
else
{
InfoProcessSuccess(null, Resources.StrPowerCorrectionNotNeeded);
_processState = successExitState;
return;
}
LogPowCorrContent(powCorrFile);
_processState = successExitState;
}
/// <summary>
/// Log the power correction file content.
/// </summary>
/// <param name="powCorrFile"></param>
/// <remarks date="2023-Nov-21" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
private void LogPowCorrContent(MeterPowerCorrectionFile powCorrFile)
{
//TODO THW
var lifeTimeInfo = new List<String>
var powerCorrectionInfo = new List<String>
{
$"{Resources.StrLifeTimeDrainedBattery} {0} ",
$"{Resources.StrLifeTimeRemainingYears} {0} " +
$"{Resources.StrLifeTimeYears}"
};
LogStringList(Resources.StrLifeTimeCalculation, lifeTimeInfo, Resources.StrLifeTimeCalculationSucceeded);
_processState = successExitState;
LogStringList(Resources.StrPowerCorrection, powerCorrectionInfo, Resources.StrPowerCorrectionSucceeded);
}
/// <summary>

View File

@ -694,4 +694,16 @@
<data name="StrFwUpdateFailed" xml:space="preserve">
<value>FEHLER: Firmware Update fehlgeschlagen!</value>
</data>
<data name="StrPowerCorrection" xml:space="preserve">
<value>Verbrauchskorrektur:</value>
</data>
<data name="StrPowerCorrectionFailed" xml:space="preserve">
<value>FEHLER: Verbrauchskorrektur fehlgeschlagen!</value>
</data>
<data name="StrPowerCorrectionNotNeeded" xml:space="preserve">
<value>Verbrauchskorrektur nich nötig.</value>
</data>
<data name="StrPowerCorrectionSucceeded" xml:space="preserve">
<value>Verbrauchskorrektur erfolgreich durchgeführt.</value>
</data>
</root>