CUST release test passed
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PCB/@EntryIndexedValue">PCB</s:String>
|
||||
<s:Boolean x:Key="/Default/GrammarAndSpelling/GrammarChecking/Exceptions/=LCD_0020DISPLAY/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=adaptor/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Applic/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=applist/@EntryIndexedValue">True</s:Boolean>
|
||||
|
||||
@@ -338,7 +338,7 @@
|
||||
<value>389, 17</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabel1.Text" xml:space="preserve">
|
||||
<value>© Copyright 2021..2024 Xylem. All Rights Reserved. For internal use only!</value>
|
||||
<value>© Copyright 2021..2025 Xylem. All Rights Reserved. For internal use only!</value>
|
||||
</data>
|
||||
<data name="lblStatusDbConnect.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>False</value>
|
||||
|
||||
@@ -521,7 +521,7 @@
|
||||
<value>42</value>
|
||||
</data>
|
||||
<data name="label2.Text" xml:space="preserve">
|
||||
<value>© Copyright 2021..2024 Xylem. All Rights Reserved. For internal use only!</value>
|
||||
<value>© Copyright 2021..2025 Xylem. All Rights Reserved. For internal use only!</value>
|
||||
</data>
|
||||
<data name=">>label2.Name" xml:space="preserve">
|
||||
<value>label2</value>
|
||||
|
||||
@@ -698,6 +698,23 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
|
||||
|
||||
#region ------------------------------------------ Checks -----------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// The loader version needs to be checked to avoid an incompatible Software to Loader version as the Loader
|
||||
/// release contains some dlls to keep the FwUpdateSafe as small as possible.
|
||||
/// </summary>
|
||||
/// <returns>true if version is accepted</returns>
|
||||
private Boolean CrosscheckLoaderVersion()
|
||||
{
|
||||
if (_fwUpdateSafe?.License != null &&
|
||||
_version.Major == _fwUpdateSafe.License.Major &&
|
||||
_version.Minor == _fwUpdateSafe.License.Minor &&
|
||||
_version.Build == _fwUpdateSafe.License.Build )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
/// <summary>
|
||||
/// Check validation date and if safe is loaded.
|
||||
/// </summary>
|
||||
@@ -736,7 +753,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Search "Firmware is up to date!" string in file to guarantee the successfully execution of the update
|
||||
/// Search "Firmware is up to date!" string in file to guarantee the successful execution of the update
|
||||
/// process. Get success string for all language settings!
|
||||
/// </summary>
|
||||
/// <remarks date="2021-Oct-15" author="Thomas Wiedebusch">
|
||||
@@ -818,7 +835,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
|
||||
/// </remarks>
|
||||
/// <remarks date="2021-Apr-12" author="Thomas Wiedebusch">
|
||||
/// - Added number of upload reports.
|
||||
/// - Split order number as it contains a eg. "1234567890-10".
|
||||
/// - Split order number as it contains an e.g. "1234567890-10".
|
||||
/// </remarks>
|
||||
public void CheckReportStatus()
|
||||
{
|
||||
@@ -1461,6 +1478,9 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
|
||||
/// <remarks date="2023-Oct-23" author="Thomas Wiedebusch">
|
||||
/// - Output extended to customer name and valid date and colored based on valid date.
|
||||
/// </remarks>
|
||||
/// <remarks date="2024-Jun-06" author="Thomas Wiedebusch">
|
||||
/// - Crosscheck Loader version.
|
||||
/// </remarks>
|
||||
private void LoadFwUpdateSafe()
|
||||
{
|
||||
Byte[] encryptedStream = null;
|
||||
@@ -1528,12 +1548,38 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
|
||||
}
|
||||
}
|
||||
|
||||
CheckFwUpdateEnabled();
|
||||
_dbAccessIsLocked = false;
|
||||
_processState = ProcessState.CheckPcbIdProcessState;
|
||||
Thread.CurrentThread.CurrentUICulture = _cultureInfo;
|
||||
Thread.CurrentThread.CurrentCulture = _cultureInfo;
|
||||
// The loader version needs to be checked to avoid an incompatible Software to Loader version
|
||||
if (CrosscheckLoaderVersion())
|
||||
{
|
||||
CheckFwUpdateEnabled();
|
||||
_dbAccessIsLocked = false;
|
||||
_processState = ProcessState.CheckPcbIdProcessState;
|
||||
}
|
||||
else
|
||||
{
|
||||
var versionMajor = "?";
|
||||
var versionMinor = "?";
|
||||
var versionBuild = "?";
|
||||
if (_fwUpdateSafe?.License != null)
|
||||
{
|
||||
versionMajor = _fwUpdateSafe.License.Major.ToString();
|
||||
versionMinor = _fwUpdateSafe.License.Minor.ToString();
|
||||
versionBuild = _fwUpdateSafe.License.Build.ToString();
|
||||
}
|
||||
var msg = Resources.StrSoftwareVersionExpired +
|
||||
$@" Version: {versionMajor}.{versionMinor}.{versionBuild}";
|
||||
LogText(msg);
|
||||
MessageBoxShow(msg, Resources.StrError,
|
||||
MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
_dbAccessIsLocked = false;
|
||||
_processState = ProcessState.Idle;
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogText(ex.Message);
|
||||
LogText(Resources.StrDecryptFwUpdateSafeFailed + " " + _customerAndOrderInfo);
|
||||
//MessageBoxShow(e.ToString(), Resources.StrError, MessageBoxButtons.OK,
|
||||
// MessageBoxIcon.Error);
|
||||
@@ -1561,7 +1607,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
|
||||
/// </remarks>
|
||||
/// <remarks date="2021-Mar-18" author="Thomas Wiedebusch">
|
||||
/// - load configuration.json to the AppDomain "FwUpdateLoader" as it cannot be accessed if stored in the
|
||||
/// sub-directory "ServiceFwUpdateSw". ALl other files can remain there.
|
||||
/// subdirectory "ServiceFwUpdateSw". ALl other files can remain there.
|
||||
/// </remarks>
|
||||
/// <remarks date="2021-Mar-20" author="Thomas Wiedebusch">
|
||||
/// - Logging info.
|
||||
@@ -1878,7 +1924,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
|
||||
var parameters = new Object[2];
|
||||
|
||||
// As a complex field cannot be passed between a dynamic loaded assembly due to
|
||||
// the unknown signature or assembly version, a simply data type will be passed and
|
||||
// the unknown signature or assembly version, a simple data type will be passed and
|
||||
// then converted to the complex type.
|
||||
switch (data)
|
||||
{
|
||||
@@ -1927,7 +1973,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
|
||||
/// - Change menu.
|
||||
/// </remarks>
|
||||
/// <remarks date="2021-Feb-26" author="Thomas Wiedebusch">
|
||||
/// - Avoid repetition if current culture is equal to required.
|
||||
/// - Avoid repetition if current culture is equal to the required one.
|
||||
/// </remarks>
|
||||
/// <remarks date="2021-Apr-28" author="Thomas Wiedebusch">
|
||||
/// - Backup safe name for language change.
|
||||
|
||||
@@ -331,7 +331,7 @@
|
||||
<value>389, 17</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabel1.Text" xml:space="preserve">
|
||||
<value>© Copyright 2021..2024 Xylem. All Rights Reserved. For internal use only!</value>
|
||||
<value>© Copyright 2021..2025 Xylem. All Rights Reserved. For internal use only!</value>
|
||||
</data>
|
||||
<data name="lblStatusDbConnect.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>False</value>
|
||||
|
||||
@@ -476,7 +476,7 @@
|
||||
<value>40</value>
|
||||
</data>
|
||||
<data name="label2.Text" xml:space="preserve">
|
||||
<value>© Copyright 2021..2024 Xylem. All Rights Reserved. For internal use only!</value>
|
||||
<value>© Copyright 2021..2025 Xylem. All Rights Reserved. For internal use only!</value>
|
||||
</data>
|
||||
<data name=">>label2.Name" xml:space="preserve">
|
||||
<value>label2</value>
|
||||
|
||||
+10
-1
@@ -19,7 +19,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader.Properties {
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
@@ -249,6 +249,15 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to ERROR: This Safe requires FW Update Loader.
|
||||
/// </summary>
|
||||
internal static string StrSoftwareVersionExpired {
|
||||
get {
|
||||
return ResourceManager.GetString("StrSoftwareVersionExpired", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to PCB ID.
|
||||
/// </summary>
|
||||
|
||||
@@ -207,4 +207,7 @@
|
||||
<data name="StrSafeValidDate" xml:space="preserve">
|
||||
<value>Gültig bis:</value>
|
||||
</data>
|
||||
<data name="StrSoftwareVersionExpired" xml:space="preserve">
|
||||
<value>FEHLER: Dieser Safe benötigt FW Update Loader</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -207,4 +207,7 @@
|
||||
<data name="StrSafeValidDate" xml:space="preserve">
|
||||
<value>Valid to:</value>
|
||||
</data>
|
||||
<data name="StrSoftwareVersionExpired" xml:space="preserve">
|
||||
<value>ERROR: This Safe requires FW Update Loader</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -75,8 +75,6 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
|
||||
private readonly ILogger _logger;
|
||||
|
||||
private readonly CancellationTokenSource _processToken = new CancellationTokenSource();
|
||||
|
||||
// actual process state
|
||||
private ProcessState _processState;
|
||||
// locker to avoid repeated state execution
|
||||
@@ -100,7 +98,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
|
||||
// reminder for corrupted password file
|
||||
private Boolean _passwordFileIsCorrupted;
|
||||
// initial connect to force a quick connect being able switch the pulse mode off
|
||||
// initial connect to force a quick connect being able to switch the pulse mode off
|
||||
private Boolean _initialConnect;
|
||||
// remind final login, as this allows EXPLICIT login with password level 8 to validate password file
|
||||
private Boolean _afterUpdateConnect;
|
||||
@@ -246,6 +244,8 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
// cancellation token
|
||||
private CancellationTokenSource _cancellationTokenSource;
|
||||
private CancellationToken _cancellationToken;
|
||||
private static CancellationTokenSource _processTokenSource;
|
||||
private CancellationToken _processToken;
|
||||
|
||||
#endregion --------------------------------------- Variables --------------------------------------------------
|
||||
|
||||
@@ -299,7 +299,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// - On Init set buttons to download disable but connect enable.
|
||||
/// </remarks>
|
||||
/// <remarks date="2021-Apr-15" author="Thomas Wiedebusch">
|
||||
/// - On final connection after update and password restore, the connect will be exit with
|
||||
/// - On final connection after update and password restore, the "connect" will be exited with
|
||||
/// check update request to make the final check.
|
||||
/// </remarks>
|
||||
/// <remarks date="2021-Jun-08" author="Roland Drabesch">
|
||||
@@ -345,17 +345,13 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2024-May-16" author="Thomas Wiedebusch">
|
||||
/// - Force stop on stop request.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-05" author="Thomas Wiedebusch">
|
||||
/// - _cancellationToken.
|
||||
/// </remarks>
|
||||
private void FwUpdateSwStateMachine()
|
||||
{
|
||||
// Execute the state machine until processes should be kept alive
|
||||
while (!_processToken.IsCancellationRequested)
|
||||
{
|
||||
if (_cancellationTokenSource.IsCancellationRequested)
|
||||
_processState = ProcessState.Stop;
|
||||
|
||||
if (_lastProcessState == _processState)
|
||||
// Avoid repeated run on identical state
|
||||
if (_lastProcessState == _processState )
|
||||
{
|
||||
Thread.Sleep(1);
|
||||
// do nothing until state changed
|
||||
@@ -537,7 +533,6 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
_processState = ProcessState.Idle;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
catch (ThreadAbortException)
|
||||
{
|
||||
@@ -677,7 +672,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <summary>
|
||||
/// Interface function to receive serial byte stream assigned to a special container.
|
||||
/// As a complex field cannot be passed between a dynamic loaded assembly due to
|
||||
/// the unknown signature or assembly version, a simply data type will be passed and
|
||||
/// the unknown signature or assembly version, a simple data type will be passed and
|
||||
/// then converted to the complex type.
|
||||
/// </summary>
|
||||
/// <param name="dataContainerId"></param>
|
||||
@@ -779,6 +774,9 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
_cancellationTokenSource = new CancellationTokenSource();
|
||||
_cancellationToken = _cancellationTokenSource.Token;
|
||||
|
||||
_processTokenSource = new CancellationTokenSource();
|
||||
_processToken = _processTokenSource.Token;
|
||||
|
||||
radioBtnEnglishLanguage.Checked = true;
|
||||
if (_cultureInfo.IetfLanguageTag == "de-DE")
|
||||
{
|
||||
@@ -820,21 +818,8 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2022-Mai-10" author="Thomas Wiedebusch">
|
||||
/// - Release display removed.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-05" author="Thomas Wiedebusch">
|
||||
/// - _cancellationToken.
|
||||
/// </remarks>
|
||||
private void DisposeGenesis()
|
||||
{
|
||||
//// Wait for cancellation
|
||||
//if (_cancellationToken.IsCancellationRequested)
|
||||
//{
|
||||
// Thread.Sleep(500);
|
||||
// // Reset the cancellation request
|
||||
// _cancellationTokenSource?.Dispose();
|
||||
// _cancellationTokenSource = new CancellationTokenSource();
|
||||
// _cancellationToken = _cancellationTokenSource.Token;
|
||||
//}
|
||||
|
||||
_currentGenesis?.Logout();
|
||||
// Batch removal disposes the meter!
|
||||
_meterBatch?.RemoveAllMeters();
|
||||
@@ -958,23 +943,27 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2022-Mai-10" author="Thomas Wiedebusch">
|
||||
/// - Release display removed.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-05" author="Thomas Wiedebusch">
|
||||
/// <remarks date="2025-Jun-05..06" author="Thomas Wiedebusch">
|
||||
/// - _cancellationToken.
|
||||
/// </remarks>
|
||||
private void FrmFwUpdate_FormClosing(Object sender, FormClosingEventArgs e)
|
||||
{
|
||||
_cancellationTokenSource?.Dispose();
|
||||
_cancellationTokenSource?.Cancel();
|
||||
_processTokenSource?.Cancel();
|
||||
|
||||
_frmHistory?.Close();
|
||||
_processToken?.Cancel();
|
||||
_frmHistory?.Dispose();
|
||||
|
||||
// this additionally disposes all meters
|
||||
_meterBatch?.RemoveAllMeters();
|
||||
_meterBatch?.Dispose();
|
||||
|
||||
_meterFwUpdate?.Dispose();
|
||||
_meterFwUpdate = null;
|
||||
|
||||
_registerRestorer = null;
|
||||
|
||||
_tmrProgressUpdate?.Dispose();
|
||||
|
||||
}
|
||||
#endregion --------------------------------------- Form Load Unload -------------------------------------------
|
||||
|
||||
@@ -1459,7 +1448,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
// remind the invoker being able to generate error messages based on the last state
|
||||
_invokerProcessState = _processState;
|
||||
|
||||
if (_currentGenesis?.InstalledFwVersion == null ||
|
||||
if (_currentGenesis?.InstalledFwVersion == null ||
|
||||
_cordonelFirmwarePackage?.FwPackageInfo?.Version == null)
|
||||
{
|
||||
InfoProcessFailed(null, Resources.StrPowerCorrectionFailed);
|
||||
@@ -1474,7 +1463,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
{
|
||||
// read the powCorrFile and build a string list of the file content
|
||||
powCorrFile.ReadPowCorrMeterFile();
|
||||
LogStringList(Resources.StrPowerCorrection, powCorrFile.FileContent,
|
||||
LogStringList(Resources.StrPowerCorrection, powCorrFile.FileContent,
|
||||
Resources.StrPowerCorrectionNotNeeded);
|
||||
_processState = successExitState;
|
||||
return;
|
||||
@@ -1508,7 +1497,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
if (retVal)
|
||||
{
|
||||
// pulse mode was switched off, skip power correction
|
||||
if (!_fwUpdatePowerCorrection.PulseAdapterMarkedAsInstalled )
|
||||
if (!_fwUpdatePowerCorrection.PulseAdapterMarkedAsInstalled)
|
||||
{
|
||||
InfoProcessSuccess(null, Resources.StrPowerCorrectionNotNeeded);
|
||||
_processState = successExitState;
|
||||
@@ -1524,7 +1513,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
powCorrFile.WritePowCorrMeterFile(_fwUpdatePowerCorrection);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// one step of the power correction execution failed
|
||||
if (!retVal)
|
||||
{
|
||||
@@ -1541,13 +1530,13 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
}
|
||||
|
||||
// log result of successfully executed power correction
|
||||
LogStringList(Resources.StrPowerCorrection, powCorrFile.FileContent,
|
||||
LogStringList(Resources.StrPowerCorrection, powCorrFile.FileContent,
|
||||
Resources.StrPowerCorrectionSucceeded);
|
||||
_processState = successExitState;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculate the consumed power and remaining life time.
|
||||
/// Calculate the consumed power and remaining lifetime.
|
||||
/// </summary>
|
||||
/// <param name="successExitState"></param>
|
||||
/// <param name="errorExitState"></param>
|
||||
@@ -1677,8 +1666,8 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// - Region (NA, EMEA, China),
|
||||
/// - RadioFrequencyMhz (null, 433 MHz, 868 MHz),
|
||||
/// If any information cannot be read from the meter, it will be assumed, that the FwUpdateBuilder operator
|
||||
/// assembled a correct FwUpdateSafe. Otherwise old devices may be unable to update.
|
||||
/// The FwPackage has to be checked in advance before calling this routine, as all these information is needed
|
||||
/// assembled a correct FwUpdateSafe. Otherwise, old devices may be unable to update.
|
||||
/// The FwPackage has to be checked in advance before calling this routine, as all this information is needed
|
||||
/// for this update capability check.
|
||||
/// </summary>
|
||||
/// <returns>true all checks are approved and valid</returns>
|
||||
@@ -1758,10 +1747,10 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
|
||||
/// <summary>
|
||||
/// Meter size update capability check:
|
||||
/// - MeterSize (DN40, DN50,..., DN300, US1_5, US2, US3,..., US12.
|
||||
/// - MeterSize ( DN40, DN50,..., DN300, US1_5, US2, US3,..., US12.
|
||||
/// If any information cannot be read from the meter, it will be assumed, that the FwUpdateBuilder operator
|
||||
/// assembled a correct FwUpdateSafe. Otherwise old devices may be unable to update.
|
||||
/// The FwPackage has to be checked in advance before calling this routine, as all these information is needed
|
||||
/// assembled a correct FwUpdateSafe. Otherwise, old devices may be unable to update.
|
||||
/// The FwPackage has to be checked in advance before calling this routine, as all this information is needed
|
||||
/// for this update capability check.
|
||||
/// </summary>
|
||||
/// <returns>true if meter size is approved</returns>
|
||||
@@ -1867,8 +1856,22 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// - _finalConnectAfterUpdate set to false as user forces a new connection to create a new report and switch
|
||||
/// eventually to new device without exit the program.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-05" author="Thomas Wiedebusch">
|
||||
/// - _cancellationToken.
|
||||
/// </remarks>
|
||||
private void BtnConnect_Click(Object sender, EventArgs e)
|
||||
{
|
||||
// Wait for cancellation
|
||||
if (_cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
Thread.Sleep(500);
|
||||
// Reset the cancellation request
|
||||
_cancellationTokenSource?.Dispose();
|
||||
_cancellationTokenSource = new CancellationTokenSource();
|
||||
_cancellationToken = _cancellationTokenSource.Token;
|
||||
}
|
||||
|
||||
ClearHistoryWindow();
|
||||
// restart for new device
|
||||
_afterUpdateConnect = false;
|
||||
if (_resetTimeMeasurement)
|
||||
@@ -1910,12 +1913,13 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2020-Nov-27" author="Thomas Wiedebusch">
|
||||
/// - Initial
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-05" author="Thomas Wiedebusch">
|
||||
/// <remarks date="2025-Jun-06" author="Thomas Wiedebusch">
|
||||
/// - _cancellationToken.
|
||||
/// </remarks>
|
||||
private void BtnStop_Click(Object sender, EventArgs e)
|
||||
{
|
||||
_cancellationTokenSource?.Cancel();
|
||||
_processState = ProcessState.Stop;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1929,12 +1933,25 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2023-Oct-24" author="Thomas Wiedebusch">
|
||||
/// - Start of update procedure changed to read files to erase and restore.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-06" author="Thomas Wiedebusch">
|
||||
/// - _cancellationToken.
|
||||
/// </remarks>
|
||||
private void BtnUpdateFw_Click(Object sender, EventArgs e)
|
||||
{
|
||||
if (_currentGenesis == null || _meterFwUpdate?.FileApps == null ||
|
||||
_registerRestorer == null)
|
||||
return;
|
||||
|
||||
// Wait for cancellation
|
||||
if (_cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
Thread.Sleep(500);
|
||||
// Reset the cancellation request
|
||||
_cancellationTokenSource?.Dispose();
|
||||
_cancellationTokenSource = new CancellationTokenSource();
|
||||
_cancellationToken = _cancellationTokenSource.Token;
|
||||
}
|
||||
|
||||
_startTime = DateTimeOffset.UtcNow;
|
||||
_resetTimeMeasurement = false;
|
||||
_processState = ProcessState.ReadInfoEraseRestoreFiles;
|
||||
@@ -2167,7 +2184,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// - Initial.
|
||||
/// </remarks>
|
||||
/// <remarks date="2024-Feb-08" author="Thomas Wiedebusch">
|
||||
/// - Avoid to setup IRDA_MfgDate as this is the manufacturing date and not the FW-Update date!
|
||||
/// - Avoid to set up IRDA_MfgDate as this is the manufacturing date and not the FW-Update date!
|
||||
/// </remarks>
|
||||
private Boolean SetDateTime()
|
||||
{
|
||||
@@ -2394,7 +2411,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
if (_currentGenesis == null)
|
||||
return false;
|
||||
var retVal = _currentGenesis.ReLogin();
|
||||
// Set LCD DISPLAY from IdLE and 9999 back to operation, this may be necessary if the update has been
|
||||
// Set "LCD DISPLAY" from IdLE and 9999 back to operation, this may be necessary if the update has been
|
||||
// interrupted by a program stop due to a power loss or any unpredictable event.
|
||||
LogText(_currentGenesis.WriteRegister(Register.Genesisflow.TriggerIdle, 0)
|
||||
? Resources.StrLedOffSucceeded
|
||||
@@ -2429,7 +2446,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <summary>
|
||||
/// Logging of string lists.
|
||||
/// </summary>
|
||||
/// <param name="strHeader">Head line for comment</param>
|
||||
/// <param name="strHeader">Headline for comment</param>
|
||||
/// <param name="strings">string list</param>
|
||||
/// <param name="successMessage">optional message if process succeeded</param>
|
||||
/// <param name="errorMessage">optional message if process failed</param>
|
||||
@@ -2538,14 +2555,9 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2023-Nov-15" author="Thomas Wiedebusch">
|
||||
/// - Initial.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-05" author="Thomas Wiedebusch">
|
||||
/// - _cancellationToken.
|
||||
/// </remarks>
|
||||
private ProcessState GetNextProcessState(ProcessState invokerProcessState,
|
||||
IReadOnlyList<ProcessState> processSateSequence)
|
||||
{
|
||||
if (_cancellationToken.IsCancellationRequested)
|
||||
return ProcessState.Stop;
|
||||
// The last entry is an end of list marker
|
||||
for (var c = 0; c < processSateSequence.Count - 1; c++)
|
||||
{
|
||||
@@ -2993,6 +3005,9 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2024-Apr-24" author="Thomas Wiedebusch">
|
||||
/// - Communication error on app detection.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-06" author="Thomas Wiedebusch">
|
||||
/// - Added file access events.
|
||||
/// </remarks>
|
||||
private void ErrorProcesses()
|
||||
{
|
||||
SetOverallProgressDisplayOff();
|
||||
@@ -3021,8 +3036,10 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
_processState = GetNextProcessState(_invokerProcessState, _stateSequencePrepareAndCheckMeter);
|
||||
break;
|
||||
case ProcessState.InitialReadMeterFiles:
|
||||
case ProcessState.PreUpdateReadMeterFiles:
|
||||
msg = Resources.StrFileReadoutFailed;
|
||||
ErrorProcessCommon(msg);
|
||||
InfoProcessFailed(lblFileErase, Resources.StrFileReadoutFailed, false);
|
||||
// Even if this state failed try to maintain the next steps of the sequence
|
||||
_processState = GetNextProcessState(_invokerProcessState, _stateSequencePrepareAndCheckMeter);
|
||||
break;
|
||||
@@ -3076,6 +3093,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
case ProcessState.VerifyMeterFiles:
|
||||
msg = Resources.StrFileRestoreFailed;
|
||||
ErrorProcessCommon(msg);
|
||||
InfoProcessFailed(lblFileRestore, Resources.StrFileReadoutFailed, false);
|
||||
_processState = GetNextProcessState(_invokerProcessState, _stateSequencePrepareMeterRelease);
|
||||
break;
|
||||
case ProcessState.ReadEngineeringLogs:
|
||||
@@ -3088,7 +3106,14 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
ErrorProcessCommon(msg);
|
||||
_processState = GetNextProcessState(_invokerProcessState, _stateSequencePrepareMeterRelease);
|
||||
break;
|
||||
|
||||
|
||||
case ProcessState.EraseMeterFiles:
|
||||
msg = Resources.StrFileReadoutFailed;
|
||||
ErrorProcessCommon(msg);
|
||||
InfoProcessFailed(lblFileErase, Resources.StrFileReadoutFailed);
|
||||
_processState = ProcessState.ReleaseMeterToNormalOperation;
|
||||
break;
|
||||
|
||||
// This is the check sequence for update capability
|
||||
case ProcessState.CheckFwUpdateSuccess:
|
||||
msg = Resources.StrFirmwareUpdateFailed;
|
||||
@@ -3218,10 +3243,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2025-Jun-05" author="Thomas Wiedebusch">
|
||||
/// - Removed registerRestorer.StopRegisterAccess.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-05" author="Thomas Wiedebusch">
|
||||
/// - _cancellationToken.
|
||||
/// </remarks>
|
||||
private void StopProcesses()
|
||||
private void StopProcesses()
|
||||
{
|
||||
InfoProcessFailed(null, Resources.StrUserStop);
|
||||
SetOverallProgressDisplayOff();
|
||||
@@ -3234,16 +3256,6 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
_meterFwUpdate.StopUpdateProcess = true;
|
||||
if (_meterFile != null)
|
||||
_meterFile.StopProcess = true;
|
||||
|
||||
// Wait for cancellation
|
||||
if (_cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
Thread.Sleep(500);
|
||||
// Reset the cancellation request
|
||||
_cancellationTokenSource?.Dispose();
|
||||
_cancellationTokenSource = new CancellationTokenSource();
|
||||
_cancellationToken = _cancellationTokenSource.Token;
|
||||
}
|
||||
|
||||
MessageBoxShow(Resources.StrUserStop, "Info", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
|
||||
|
||||
@@ -3411,7 +3423,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
private StatusReturn ExecReboot()
|
||||
{
|
||||
String text = null;
|
||||
// var timerInterval = _tmrProgressUpdate.Interval;
|
||||
|
||||
var timerInterval = TimerInterval_ms;
|
||||
_bootDelayCtr_ms = 0;
|
||||
var internalCommunicationDelayMs = _bootDelayCtr_ms + 10 * timerInterval;
|
||||
@@ -3652,7 +3664,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
exitProcessStateObjects[2] = breakExitState;
|
||||
|
||||
var processExec = new ProcessExec();
|
||||
processExec.NewProcess(InitConnect, null, ExecConnect, FinalizeConnect, _cultureInfo,
|
||||
processExec.NewProcess(InitConnect, null, ExecConnect, FinalizeConnect, _cultureInfo,
|
||||
exitProcessStateObjects, _cancellationToken);
|
||||
}
|
||||
|
||||
@@ -3667,7 +3679,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// </remarks>
|
||||
private void InitConnect()
|
||||
{
|
||||
SetControlsCommunicationActive();
|
||||
SetControlsAllButtonsDisabled();
|
||||
Thread.Sleep(1000);
|
||||
if (_currentGenesis == null)
|
||||
{
|
||||
@@ -3782,7 +3794,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))
|
||||
@@ -3830,8 +3842,8 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
return StatusReturn.Failed;
|
||||
}
|
||||
|
||||
// This login may be time consuming on readout of application information
|
||||
// first try to login with password Level 8, this is needed if the password file is installed
|
||||
// This login may be time-consuming on readout of application information
|
||||
// first try to log in with password Level 8, this is needed if the password file is installed
|
||||
if (LoginAndSpecialSetupProcedure(_passwordLvl8))
|
||||
{
|
||||
// Reset login delay as on successfully login the meter resets the retry-lock-in-delay
|
||||
@@ -3912,7 +3924,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
{
|
||||
// Start with a fresh list of errors to decide after the entire procedure how to proceed
|
||||
_errorCollectionMessages?.Clear();
|
||||
|
||||
|
||||
// Dispose register restorer on new connection
|
||||
_registerRestorer = null;
|
||||
|
||||
@@ -4199,7 +4211,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
break;
|
||||
|
||||
case ProcessState.CompareRegisters:
|
||||
if ( _recoveryRegistersRequired)
|
||||
if (_recoveryRegistersRequired)
|
||||
{
|
||||
SetOverallProgressDisplayOn(Resources.StrRegisterReadoutActive);
|
||||
InfoProcessActive(lblRegisterReadout, Resources.StrRegisterCompareActive);
|
||||
@@ -4391,6 +4403,9 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2024-Apr-09" author="Thomas Wiedebusch">
|
||||
/// - ReLogin replaced with Logout, Delay 250 ms and Login.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-06" author="Thomas Wiedebusch">
|
||||
/// - Moved error events to errorProcesses.
|
||||
/// </remarks>
|
||||
private void ReadMeterFiles(ProcessState successExitState, ProcessState errorExitState = ProcessState.Error)
|
||||
{
|
||||
// remind the invoker being able to generate error messages based on the last state
|
||||
@@ -4399,7 +4414,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
// return on unassigned meter
|
||||
if (_currentGenesis != null)
|
||||
{
|
||||
SetControlsCommunicationActive();
|
||||
SetControlsAllButtonsDisabled();
|
||||
SetOverallProgressDisplayOn(Resources.StrFileAccessActive);
|
||||
|
||||
switch (_invokerProcessState)
|
||||
@@ -4454,19 +4469,6 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
}
|
||||
}
|
||||
|
||||
switch (_invokerProcessState)
|
||||
{
|
||||
case ProcessState.InitialReadMeterFiles:
|
||||
case ProcessState.PreUpdateReadMeterFiles:
|
||||
InfoProcessFailed(lblFileErase, Resources.StrFileReadoutFailed, false);
|
||||
break;
|
||||
case ProcessState.VerifyMeterFiles:
|
||||
InfoProcessFailed(lblFileRestore, Resources.StrFileReadoutFailed, false);
|
||||
break;
|
||||
}
|
||||
//log files
|
||||
LogStringList(Resources.StrFileRead, _readMeterFiles, errorMessage: Resources.StrFileReadoutFailed);
|
||||
|
||||
_processState = errorExitState;
|
||||
SetOverallProgressDisplayOff();
|
||||
}
|
||||
@@ -4485,6 +4487,9 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2023-Oct-19" author="Thomas Wiedebusch">
|
||||
/// - Output message changed to get colored error or success messages.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-06" author="Thomas Wiedebusch">
|
||||
/// - Moved error events to errorProcesses.
|
||||
/// </remarks>
|
||||
private void MeterFilesErase(ProcessState successExitState, ProcessState errorExitState = ProcessState.Error)
|
||||
{
|
||||
// remind the invoker being able to generate error messages based on the last state
|
||||
@@ -4493,7 +4498,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
// return on unassigned meter
|
||||
if (_currentGenesis != null)
|
||||
{
|
||||
SetControlsCommunicationActive();
|
||||
SetControlsAllButtonsDisabled();
|
||||
InfoProcessActive(lblFileErase, Resources.StrFileAccessActive);
|
||||
_currentGenesis.ReLogin();
|
||||
// read all meter files
|
||||
@@ -4545,10 +4550,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
return;
|
||||
}
|
||||
}
|
||||
LogStringList(Resources.StrFileErased, erasedMeterFiles, errorMessage: Resources.StrFileReadoutFailed);
|
||||
|
||||
}
|
||||
InfoProcessFailed(lblFileErase, Resources.StrFileReadoutFailed, false);
|
||||
_processState = errorExitState;
|
||||
// change first the process state, otherwise the timer may switch the bar on again
|
||||
SetOverallProgressDisplayOff();
|
||||
@@ -4570,7 +4572,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
// return on unassigned meter
|
||||
if (_currentGenesis != null)
|
||||
{
|
||||
SetControlsCommunicationActive();
|
||||
SetControlsAllButtonsDisabled();
|
||||
InfoProcessActive(lblFileRestore, Resources.StrFileAccessActive);
|
||||
|
||||
_currentGenesis.ReLogin();
|
||||
@@ -4696,7 +4698,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
if (_fwUpdateSafePwdFile != null &&
|
||||
pwdFileObject.CheckHashedPwdFile(_fwUpdateSafePwdFile, _skeletonKey, _passwordLvl8))
|
||||
{
|
||||
SetControlsCommunicationActive();
|
||||
SetControlsAllButtonsDisabled();
|
||||
_currentGenesis?.ReLogin();
|
||||
if (pwdFileObject.UnlockEraseWriteMeterPwdFile())
|
||||
{
|
||||
@@ -4758,7 +4760,7 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
InfoProcessActive(lblLutFileCheck, Resources.StrLutFileRestoreActive, false);
|
||||
|
||||
// 1. LUT file is needed but invalid
|
||||
if (!string.IsNullOrEmpty(_currentGenesis.LutCrc) &&
|
||||
if (!string.IsNullOrEmpty(_currentGenesis.LutCrc) &&
|
||||
_currentGenesis.LutCrc.Contains(MeterLutFile.StrLutFileInvalidCrc))
|
||||
{
|
||||
InfoProcessFailed(lblLutFileCheck, Resources.StrLutFileNotInstalled);
|
||||
@@ -4770,8 +4772,8 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
// If meter LUT CRC is not set and the meter files do not report the LUT, the meter does not have an
|
||||
// installed LUT
|
||||
if ((string.IsNullOrEmpty(_currentGenesis.LutCrc) ||
|
||||
_currentGenesis.LutCrc.Equals(Constants.StrUnknown))
|
||||
&& _readMeterFiles != null
|
||||
_currentGenesis.LutCrc.Equals(Constants.StrUnknown))
|
||||
&& _readMeterFiles != null
|
||||
&& !_readMeterFiles.Any(f => f.Contains(MeterLutFile.StrLutMeterFileName))
|
||||
&& !_readMeterFiles.Any(f => f.Contains(MeterLutFile.StrLutBackupMeterFileName)))
|
||||
{
|
||||
@@ -5068,23 +5070,20 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// <remarks date="2020-Dec-19" author="Thomas Wiedebusch">
|
||||
/// - Reworked exit state.
|
||||
/// </remarks>
|
||||
/// <remarks date="2025-Jun-06" author="Thomas Wiedebusch">
|
||||
/// - Handle user break identical to error to return to the correct state for clean retry for just the FW update.
|
||||
/// </remarks>
|
||||
private void FinalizeFwUpdate(StatusReturn success, IReadOnlyList<Object> exitProcessStateObjects)
|
||||
{
|
||||
if (_meterFwUpdate != null)
|
||||
_meterFwUpdate.OnProcessUpdate -= ProcessUpdate_Event;
|
||||
|
||||
ObjectsToProcessStates(exitProcessStateObjects, out var successExitState, out var errorExitState,
|
||||
out var breakExitState);
|
||||
out _);
|
||||
|
||||
SetActualProgressDisplayOff();
|
||||
SetOverallProgressDisplayOff();
|
||||
|
||||
if (_processState == breakExitState)
|
||||
{
|
||||
InfoProcessFailed(lblFirmwareUpdate, Resources.StrFirmwareUpdateBreak);
|
||||
return;
|
||||
}
|
||||
|
||||
if (success == StatusReturn.Okay)
|
||||
{
|
||||
InfoProcessActive(lblFirmwareUpdate, Resources.StrFirmwareUpdateCheck);
|
||||
@@ -5105,8 +5104,8 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw
|
||||
/// - Initial
|
||||
/// </remarks>
|
||||
/// <remarks date="2021-Mar-10" author="Thomas Wiedebusch">
|
||||
/// - Changed function type as this is not time consuming.
|
||||
/// - Implemented directory creation if it does not exists.
|
||||
/// - Changed function type as this is not time-consuming.
|
||||
/// - Implemented directory creation if it does not exist.
|
||||
/// </remarks>
|
||||
/// <remarks date="2021-Mar-29" author="Thomas Wiedebusch">
|
||||
/// - Common definition for report- and app version extensions.
|
||||
|
||||
@@ -337,7 +337,7 @@
|
||||
<value>3, 16</value>
|
||||
</data>
|
||||
<data name="gridViewApplic.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>864, 408</value>
|
||||
<value>865, 408</value>
|
||||
</data>
|
||||
<data name="gridViewApplic.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>2</value>
|
||||
@@ -361,7 +361,7 @@
|
||||
<value>3, 170</value>
|
||||
</data>
|
||||
<data name="grpApplications.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>870, 427</value>
|
||||
<value>871, 427</value>
|
||||
</data>
|
||||
<data name="grpApplications.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>26</value>
|
||||
@@ -388,7 +388,7 @@
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="lblUpdateTime.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>415, 2</value>
|
||||
<value>414, 2</value>
|
||||
</data>
|
||||
<data name="lblUpdateTime.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>3, 0, 3, 3</value>
|
||||
@@ -421,7 +421,7 @@
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="label9.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>309, 2</value>
|
||||
<value>308, 2</value>
|
||||
</data>
|
||||
<data name="label9.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>0, 0, 0, 3</value>
|
||||
@@ -619,7 +619,7 @@
|
||||
<value>Microsoft Sans Serif, 8.25pt</value>
|
||||
</data>
|
||||
<data name="lblFwUpdateInfo.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>21, 51</value>
|
||||
<value>20, 51</value>
|
||||
</data>
|
||||
<data name="lblFwUpdateInfo.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>72, 13</value>
|
||||
@@ -1030,7 +1030,7 @@
|
||||
<value>3, 92</value>
|
||||
</data>
|
||||
<data name="grpLanguageSelection.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>108, 66</value>
|
||||
<value>107, 66</value>
|
||||
</data>
|
||||
<data name="grpLanguageSelection.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>37</value>
|
||||
@@ -1312,13 +1312,13 @@
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel4.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>879, 3</value>
|
||||
<value>880, 3</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel4.RowCount" type="System.Int32, mscorlib">
|
||||
<value>3</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel4.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>114, 161</value>
|
||||
<value>113, 161</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel4.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>28</value>
|
||||
@@ -1540,13 +1540,13 @@
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel6.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>879, 170</value>
|
||||
<value>880, 170</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel6.RowCount" type="System.Int32, mscorlib">
|
||||
<value>4</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel6.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>114, 427</value>
|
||||
<value>113, 427</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel6.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>30</value>
|
||||
@@ -1633,7 +1633,7 @@
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel3.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
|
||||
<value><?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="lblUpdateTime" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="lblActualProcess" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lblWaitingForMeterResponse" Row="0" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="label9" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="Percent,72,48804,Percent,27,51196,Absolute,48,Absolute,412" /><Rows Styles="Percent,100,Absolute,18" /></TableLayoutSettings></value>
|
||||
<value><?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="lblUpdateTime" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="lblActualProcess" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lblWaitingForMeterResponse" Row="0" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="label9" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="Percent,72,48804,Percent,27,51196,Absolute,48,Absolute,413" /><Rows Styles="Percent,100,Absolute,18" /></TableLayoutSettings></value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Bottom</value>
|
||||
@@ -1684,7 +1684,7 @@
|
||||
<value>8</value>
|
||||
</data>
|
||||
<data name="label1.Text" xml:space="preserve">
|
||||
<value>© Copyright 2021..2024 Xylem. All Rights Reserved. For internal use only!</value>
|
||||
<value>© Copyright 2021..2025 Xylem. All Rights Reserved. For internal use only!</value>
|
||||
</data>
|
||||
<data name=">>label1.Name" xml:space="preserve">
|
||||
<value>label1</value>
|
||||
|
||||
Reference in New Issue
Block a user