CUST: - FwUpdateSw: - MeterPowerCorrectionFile modified

This commit is contained in:
Thomas Wiedebusch 2024-05-15 18:08:37 +02:00
parent a8c0c1744d
commit f97033c6c4
4 changed files with 97 additions and 75 deletions

View File

@ -194,6 +194,10 @@
<Project>{AC434B18-4D7B-49BA-9AD5-0527C79E8297}</Project>
<Name>GenesisPwd</Name>
</ProjectReference>
<ProjectReference Include="..\GenesisStatus\GenesisStatus.csproj">
<Project>{0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}</Project>
<Name>GenesisStatus</Name>
</ProjectReference>
<ProjectReference Include="..\Registers\Registers.csproj">
<Project>{F4AAF7E6-7333-4284-B735-E32DEB076C64}</Project>
<Name>Registers</Name>

View File

@ -45,7 +45,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
private const Int32 PulseEvenDistributionSize = sizeof(Boolean);
// production data
private const Int32 ProdTimeIdx = FileDataIdx;
private const Int32 ProdDateTimeIdx = FileDataIdx;
private const Int32 ProdTimeIdx = ProdDateTimeIdx + TimeSize;
private const Int32 ProdChargeIdx = ProdTimeIdx + TimeSize;
private const Int32 ProdRadioStateIdx = ProdChargeIdx + ChargeSize;
private const Int32 ProdPulseAdaptInstalledIdx = ProdRadioStateIdx + RadioStateSize;
@ -56,7 +57,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
// field data
private const Int32 FieldFwVersionIdx = ProdPulseEvenDistributionIdx + PulseEvenDistributionSize;
private const Int32 FieldTimeIdx = FieldFwVersionIdx + FwVersionSize;
private const Int32 FieldDateTimeIdx = FieldFwVersionIdx + FwVersionSize;
private const Int32 FieldTimeIdx = FieldDateTimeIdx + TimeSize;
private const Int32 FieldChargeIdx = FieldTimeIdx + TimeSize;
private const Int32 FieldRadioStateIdx = FieldChargeIdx + ChargeSize;
private const Int32 FieldPulseAdaptInstalledIdx = FieldRadioStateIdx + RadioStateSize;
@ -84,15 +86,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <summary>
/// Content of power correction meter file
/// </summary>
public List<String> FileContent = new List<String>();
/// <summary>
/// Power correction data.
/// </summary>
public PowerCorrection PowerCorrectionData
{
get; set;
}
public readonly List<String> FileContent = new List<String>();
/// <summary>
/// Ctor
@ -167,95 +161,94 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
fc.Clear();
fc.Add(Resources.StrPowCorrFileInfo);
if (CopyByteArray(value_u8a = new Byte[TimeSize], bin, TimeSize, 0, ProdTimeIdx))
{
fc.Add($"{Resources.StrPowCorrFactoryValues} -{Resources.StrPowCorrDateTime}" +
if (CopyByteArray(value_u8a = new Byte[TimeSize], bin, TimeSize, 0, ProdDateTimeIdx))
fc.Add($"{Resources.StrPowCorrFactoryValues} - {Resources.StrPowCorrDateTime}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(TimeT))}");
fc.Add($"{Resources.StrPowCorrFactoryValues} -{Resources.StrPowCorrTime_s}" +
if (CopyByteArray(value_u8a = new Byte[TimeSize], bin, TimeSize, 0, ProdTimeIdx))
fc.Add($"{Resources.StrPowCorrFactoryValues} - {Resources.StrPowCorrTime_s}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(UInt32))}");
}
if (CopyByteArray(value_u8a = new Byte[ChargeSize], bin, ChargeSize, 0, ProdChargeIdx))
fc.Add($"{Resources.StrPowCorrFactoryValues} -{Resources.StrPowCorrCharge_uAs}" +
fc.Add($"{Resources.StrPowCorrFactoryValues} - {Resources.StrPowCorrCharge_uAs}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(UInt64))}");
if (CopyByteArray(value_u8a = new Byte[TimeSize], bin, TimeSize, 0, FieldTimeIdx))
{
fc.Add($"{Resources.StrPowCorrActualValues} -{Resources.StrPowCorrDateTime}" +
if (CopyByteArray(value_u8a = new Byte[TimeSize], bin, TimeSize, 0, FieldDateTimeIdx))
fc.Add($"{Resources.StrPowCorrActualValues} - {Resources.StrPowCorrDateTime}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(TimeT))}");
fc.Add($"{Resources.StrPowCorrActualValues} -{Resources.StrPowCorrTime_s}" +
if (CopyByteArray(value_u8a = new Byte[TimeSize], bin, TimeSize, 0, FieldTimeIdx))
fc.Add($"{Resources.StrPowCorrActualValues} - {Resources.StrPowCorrTime_s}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(UInt32))}");
}
if (CopyByteArray(value_u8a = new Byte[ChargeSize], bin, ChargeSize, 0, FieldChargeIdx))
fc.Add($"{Resources.StrPowCorrActualValues} -{Resources.StrPowCorrCharge_uAs}" +
fc.Add($"{Resources.StrPowCorrActualValues} - {Resources.StrPowCorrCharge_uAs}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(UInt64))}");
if (CopyByteArray(value_u8a = new Byte[RadioStateSize], bin, RadioStateSize, 0, ProdRadioStateIdx))
fc.Add($"{Resources.StrPowCorrFactoryValues} -{Resources.StrPowCorrRadioSystemState}" +
fc.Add($"{Resources.StrPowCorrFactoryValues} - {Resources.StrPowCorrRadioSystemState}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(Byte))}");
if (CopyByteArray(value_u8a = new Byte[RadioStateSize], bin, RadioStateSize, 0, FieldRadioStateIdx))
fc.Add($"{Resources.StrPowCorrActualValues} -{Resources.StrPowCorrRadioSystemState}" +
fc.Add($"{Resources.StrPowCorrActualValues} - {Resources.StrPowCorrRadioSystemState}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(Byte))}");
if (CopyByteArray(value_u8a = new Byte[PulseAdaptInstalledSize], bin, PulseAdaptInstalledSize, 0,
ProdPulseAdaptInstalledIdx))
fc.Add($"{Resources.StrPowCorrFactoryValues} -{Resources.StrPowCorrPulseAdapterInstallationState}" +
fc.Add($"{Resources.StrPowCorrFactoryValues} - {Resources.StrPowCorrPulseAdapterInstallationState}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(Boolean))}");
if (CopyByteArray(value_u8a = new Byte[PulseAdaptInstalledSize], bin, PulseAdaptInstalledSize, 0,
FieldPulseAdaptInstalledIdx))
fc.Add($"{Resources.StrPowCorrActualValues} -{Resources.StrPowCorrPulseAdapterAutoDetected}" +
fc.Add($"{Resources.StrPowCorrActualValues} - {Resources.StrPowCorrPulseAdapterAutoDetected}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(Boolean))}");
if (CopyByteArray(value_u8a = new Byte[PulseModeSize], bin, PulseModeSize, 0, ProdPulseModeIdx))
fc.Add($"{Resources.StrPowCorrFactoryValues} -{Resources.StrPowCorrPulseMode}" +
fc.Add($"{Resources.StrPowCorrFactoryValues} - {Resources.StrPowCorrPulseMode}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(Byte))}");
if (CopyByteArray(value_u8a = new Byte[PulseModeSize], bin, PulseModeSize, 0, FieldPulseModeIdx))
fc.Add($"{Resources.StrPowCorrActualValues} -{Resources.StrPowCorrPulseMode}" +
fc.Add($"{Resources.StrPowCorrActualValues} - {Resources.StrPowCorrPulseMode}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(Byte))}");
if (CopyByteArray(value_u8a = new Byte[PulseSequenceCtrSize], bin, PulseSequenceCtrSize, 0,
ProdPulseSequenceCtrIdx))
fc.Add($"{Resources.StrPowCorrFactoryValues} -{Resources.StrPowCorrPulseSequenceCounter}" +
fc.Add($"{Resources.StrPowCorrFactoryValues} - {Resources.StrPowCorrPulseSequenceCounter}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(Byte))}");
if (CopyByteArray(value_u8a = new Byte[PulseSequenceCtrSize], bin, PulseSequenceCtrSize, 0,
FieldPulseSequenceCtrIdx))
fc.Add($"{Resources.StrPowCorrActualValues} -{Resources.StrPowCorrPulseSequenceCounter}" +
fc.Add($"{Resources.StrPowCorrActualValues} - {Resources.StrPowCorrPulseSequenceCounter}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(Byte))}");
if (CopyByteArray(value_u8a = new Byte[PulseEvenDistributionSize], bin, PulseEvenDistributionSize, 0,
ProdPulseEvenDistributionIdx))
fc.Add($"{Resources.StrPowCorrFactoryValues} -{Resources.StrPowCorrPulseEvenDistribution}" +
fc.Add($"{Resources.StrPowCorrFactoryValues} - {Resources.StrPowCorrPulseEvenDistribution}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(Boolean))}");
if (CopyByteArray(value_u8a = new Byte[PulseEvenDistributionSize], bin, PulseEvenDistributionSize, 0,
FieldPulseEvenDistributionIdx))
fc.Add($"{Resources.StrPowCorrActualValues} -{Resources.StrPowCorrPulseEvenDistribution}" +
fc.Add($"{Resources.StrPowCorrActualValues} - {Resources.StrPowCorrPulseEvenDistribution}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(Boolean))}");
fc.Add($"{Resources.StrPowCorrActualValues} -{Resources.StrPowCorrOldFwVersion}" +
$": {_currentGenesis.FwVersion}");
if (CopyByteArray(value_u8a = new Byte[FwVersionSize], bin, FwVersionSize, 0, FieldFwVersionIdx))
fc.Add($"{Resources.StrPowCorrActualValues} - {Resources.StrPowCorrOldFwVersion}" +
$": {GenesisMeter.BuildFlexnetFwVersion(out _, null, value_u8a[1], value_u8a[0])}");
if (CopyByteArray(value_u8a = new Byte[FwVersionSize], bin, FwVersionSize, 0, RequiredFwVersionIdx))
fc.Add($"{Resources.StrPowCorrActualValues} -{Resources.StrPowCorrNewFwVersion}" +
fc.Add($"{Resources.StrPowCorrActualValues} - {Resources.StrPowCorrNewFwVersion}" +
$": {GenesisMeter.BuildFlexnetFwVersion(out _, null, value_u8a[1], value_u8a[0])}");
if (CopyByteArray(value_u8a = new Byte[CalcPulseReportLengthSize], bin, CalcPulseReportLengthSize,
0, CalcPulseReportLengthIdx))
fc.Add($"{Resources.StrPowCorrCalculation}-{Resources.StrPowCorrPulseReportLength}" +
fc.Add($"{Resources.StrPowCorrPulseReportLength}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(UInt32))}");
if (CopyByteArray(value_u8a = new Byte[TimeSize], bin, TimeSize, 0, CalcPostProdTimeIdx))
fc.Add($"{Resources.StrPowCorrCalculation}-{Resources.StrPowCorrPostProdTime_s}" +
fc.Add($"{Resources.StrPowCorrPostProdTime_s}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(UInt32))}");
if (CopyByteArray(value_u8a = new Byte[ChargeSize], bin, ChargeSize, 0, CalcOverestimatedChargeIdx))
fc.Add($"{Resources.StrPowCorrCalculation}-{Resources.StrPowCorrOverestimate_uAs}" +
fc.Add($"{Resources.StrPowCorrOverestimate_uAs}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(UInt64))}");
if (CopyByteArray(value_u8a = new Byte[ChargeSize], bin, ChargeSize, 0, CalcFixedEstimatedChargeIdx))
fc.Add($"{Resources.StrPowCorrCalculation}-{Resources.StrPowCorrFixedEstimateCharge_uAs}" +
fc.Add($"{Resources.StrPowCorrFixedEstimateCharge_uAs}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(UInt64))}");
if (CopyByteArray(value_u8a = new Byte[ChargeSize], bin, ChargeSize, 0, CalcMinimumChargeIdx))
fc.Add($"{Resources.StrPowCorrCalculation}-{Resources.StrPowCorrOverestimateLimit_uAs}" +
fc.Add($"{Resources.StrPowCorrOverestimateLimit_uAs}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(UInt64))}");
if (CopyByteArray(value_u8a = new Byte[ChargeSize], bin, ChargeSize, 0, CalcCorrectedChargeIdx))
fc.Add($"{Resources.StrPowCorrCalculation}-{Resources.StrPowCorrCorrectedCharge_uAs}" +
fc.Add($"{Resources.StrPowCorrCorrectedCharge_uAs}" +
$": {RegisterConverter.ConvertToText(value_u8a, typeof(UInt64))}");
return true;
@ -270,12 +263,15 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <summary>
/// Copy byte arrays
/// </summary>
/// <param name="destination"></param>
/// <param name="source"></param>
/// <param name="destinationStartIndex"></param>
/// <param name="destination">destination array to copy to</param>
/// <param name="source">array to copy from</param>
/// <param name="size"></param>
/// <param name="destinationStartIndex"></param>
/// <param name="sourceStartIndex"></param>
/// <returns></returns>
/// <returns>true: success</returns>
/// <remarks date="2024-May-13" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
private Boolean CopyByteArray(Byte[] destination, Byte[] source, Int32 size, Int32 destinationStartIndex = 0,
Int32 sourceStartIndex = 0)
{
@ -306,23 +302,30 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// PRECONDITION: PowerCorrectionData has to be filled in advance!
/// </summary>
/// <returns>true: success</returns>
/// <remarks date="2024-May-13" author="Thomas Wiedebusch">
/// <remarks date="2024-May-13..15" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
private Boolean BuildBinData()
/// <param name="powerCorrectionData">power correction</param>
/// <returns>if successfully copied</returns>
private Boolean BuildBinData(PowerCorrection powerCorrectionData)
{
if (PowerCorrectionData == null || _currentGenesis == null)
if (powerCorrectionData == null || _currentGenesis == null)
return false;
try
{
if (_meterBinData == null)
_meterBinData = new Byte[FileSize];
var pc = PowerCorrectionData;
var pc = powerCorrectionData;
// production
var timeT = new TimeT();
var dateTimeUtc = pc.ProductionDateTimeUtc ?? timeT.DateTimeUtc;
var secSince2000 = timeT.UtcAnyToSecondsSince2000(dateTimeUtc);
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(secSince2000),
TimeSize, ProdDateTimeIdx);
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.ProductionTotalUsedSeconds_s),
TimeSize, ProdTimeIdx);
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.ProductionTotalUsedCharge_uAs),
@ -342,6 +345,13 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.ActualFwVersion),
FwVersionSize, FieldFwVersionIdx);
// reset timeT to 2000
timeT.SecondsSince2000 = 0;
dateTimeUtc = pc.ActualDateTimeUtc ?? timeT.DateTimeUtc;
secSince2000 = timeT.UtcAnyToSecondsSince2000(dateTimeUtc);
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(secSince2000),
TimeSize, FieldDateTimeIdx);
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.ActualTotalUsedSeconds_s),
TimeSize, FieldTimeIdx);
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.ActualTotalUsedCharge_uAs),
@ -349,7 +359,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.ActualRadioSystemState),
RadioStateSize, FieldRadioStateIdx);
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.ActualPulseAdapterIsInstalled),
RadioStateSize, FieldPulseAdaptInstalledIdx, PulseAdaptInstalledSize);
PulseAdaptInstalledSize, FieldPulseAdaptInstalledIdx);
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.ActualPulseMode),
PulseModeSize, FieldPulseModeIdx);
CopyByteArray(_meterBinData, RegisterConverter.ValueToByteArray(pc.ActualPulseSequenceCounter),
@ -394,18 +404,20 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// Write the meter power correction file.
/// </summary>
/// <returns>true successfully written </returns>
/// <remarks date="2024-May-08" author="Thomas Wiedebusch">
/// <remarks date="2024-May-08..15" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
public Boolean WritePowCorrMeterFile()
/// <param name="powerCorrectionData"></param>
/// <returns>true if successfully written</returns>
public Boolean WritePowCorrMeterFile(PowerCorrection powerCorrectionData)
{
if (_currentGenesis == null || _meterFile == null)
if (_currentGenesis == null || _meterFile == null || powerCorrectionData == null)
return false;
try
{
if (!BuildBinData())
if (!BuildBinData(powerCorrectionData))
return false;
BuildStringListOfPowCorrFileContent();

View File

@ -1494,7 +1494,7 @@ namespace Xylem.Common.Ui.GenesisToolBox
/// <summary>
/// Cpllect life time information and production status.
/// Collect life time information and production status.
/// </summary>
/// <remarks date="2023-Jan-04" author="Roland Drabesch/Thomas Wiedebusch">
/// - Initial

View File

@ -207,8 +207,8 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
ProcessState.FinalConnect,
ProcessState.ReadEngineeringLogs,
ProcessState.CorrectPowerOverestimation,
ProcessState.VerifyMeterFiles,
ProcessState.CalculateLifeTime,
ProcessState.VerifyMeterFiles,
ProcessState.CheckFwUpdateSuccess
};
@ -1413,7 +1413,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
/// </summary>
/// <param name="successExitState"></param>
/// <param name="errorExitState"></param>
/// <remarks date="2024-May-13" author="Thomas Wiedebusch">
/// <remarks date="2024-May-13..15" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
private void CorrectPowerOverestimation(ProcessState successExitState,
@ -1446,27 +1446,19 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
// 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
// using the preset _fwUpdatePowerCorrection.ActualFwVersion on initial connect as after
// the FW update this is lost in _currentGenesis.InstalledFwVersion and overwritten by the
// new version after the FW update!
if ((_currentGenesis.Region == "EMEA" &&
_cordonelFirmwarePackage.FwPackageInfo.Version >= PowCorrConst.EmeaFwThresholdForPowCorr &&
_currentGenesis.InstalledFwVersion < PowCorrConst.EmeaFwThresholdForPowCorr) ||
_fwUpdatePowerCorrection.ActualFwVersion < PowCorrConst.EmeaFwThresholdForPowCorr) ||
(_currentGenesis.Region == "NA" &&
_cordonelFirmwarePackage.FwPackageInfo.Version >= PowCorrConst.NaFNaFwThresholdForPowCorr &&
_currentGenesis.InstalledFwVersion < PowCorrConst.NaFNaFwThresholdForPowCorr))
_fwUpdatePowerCorrection.ActualFwVersion < PowCorrConst.NaFNaFwThresholdForPowCorr))
{
// CASE 2.1: Missing power correction settings from FW update package
if (_fwUpdatePowerCorrection == null)
{
//do something
_fwUpdatePowerCorrection = new PowerCorrection();
}
// fill all currently known infos to power correction
_fwUpdatePowerCorrection.ActualPulseAdapterIsInstalled = _currentGenesis.PulseAdapterAutoDetected;
_fwUpdatePowerCorrection.ActualFwVersion = _currentGenesis.InstalledFwVersion;
_fwUpdatePowerCorrection.RequiredFwVersion = (UInt32?)_cordonelFirmwarePackage.FwPackageInfo.Version;
// preset meter power correction file
powCorrFile.PowerCorrectionData = _fwUpdatePowerCorrection;
_fwUpdatePowerCorrection.RequiredFwVersion = (UInt32?)_cordonelFirmwarePackage.FwPackageInfo.Version;
// estimate the power correction values which includes the pulse adapter installation marker and
// the readout of Cordonel registers to get the actual status
@ -1488,7 +1480,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
if (retVal)
{
// store results to "1\\powcorr" in the meter
powCorrFile.WritePowCorrMeterFile();
powCorrFile.WritePowCorrMeterFile(_fwUpdatePowerCorrection);
}
}
@ -3714,7 +3706,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
/// <remarks date="2024-May-07" author="Thomas Wiedebusch">
/// - Added power correction on FW update to specific version.
/// </remarks>
private StatusReturn ExecConnect()
private StatusReturn ExecConnect()
{
// If the PCB ID is not set (read from meter) this is the first initial login.
if (string.IsNullOrEmpty(_currentGenesis.PcbId))
@ -3828,6 +3820,10 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
/// <remarks date="2024-Apr-24" author="Thomas Wiedebusch">
/// - Update app information on new connect.
/// </remarks>
/// <remarks date="2024-May-15" author="Thomas Wiedebusch">
/// - Remind installed FW version on initial connect to _fwUpdatePowerCorrection as this will be lost
/// after FW update in _currentGenesis.InstalledFwVersion and set to the version after the update.
/// </remarks>
private Boolean LoginAndSpecialSetupProcedure(String password)
{
Boolean retVal;
@ -3876,6 +3872,16 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
// Set radio to customer mode (encryption active)
if (_initialConnect && retVal)
{
if (_fwUpdatePowerCorrection == null)
{
//do something
_fwUpdatePowerCorrection = new PowerCorrection();
}
// fill all currently known infos to power correction
_fwUpdatePowerCorrection.ActualPulseAdapterIsInstalled = _currentGenesis.PulseAdapterAutoDetected;
_fwUpdatePowerCorrection.ActualFwVersion = _currentGenesis.InstalledFwVersion;
if (_currentGenesis.RadioFrequencyMhz != null)
{
SetRadioToCustomerMode();