diff --git a/Common/CommonCore.Configuration/ServiceUrls.cs b/Common/CommonCore.Configuration/ServiceUrls.cs
index 2df71b90..82ec85ea 100644
--- a/Common/CommonCore.Configuration/ServiceUrls.cs
+++ b/Common/CommonCore.Configuration/ServiceUrls.cs
@@ -21,6 +21,12 @@ namespace Xylem.Common.CommonCore.Configuration
private const String DefaultListAllFwPackagesServiceUrl =
"http://10.49.40.25/MeterProcessState/api/FileUpToDate/GetFwFiles?FileIsForDeveloperOnly=false&FileCategoryID=1";
+ private const String DefaultListAllSwPackagesServiceUrl =
+ "http://10.49.40.25/MeterProcessState/api/FileUpToDate/GetFwFiles?FileIsForDeveloperOnly=false&FileCategoryID=5";
+
+ private const String DefaultListAllConfigFilePackagesServiceUrl =
+ "http://10.49.40.25/MeterProcessState/api/FileUpToDate/GetFwFiles?FileIsForDeveloperOnly=false&FileCategoryID=6";
+
private const String DefaultListAllFwUpdateSafesServiceUrl =
"http://10.49.40.25/MeterProcessState/api/FileUpToDate/GetFwFiles?FileIsForDeveloperOnly=false&FileCategoryID=4";
@@ -259,6 +265,26 @@ namespace Xylem.Common.CommonCore.Configuration
DefaultListAllFwPackagesServiceUrl;
}
+ ///
+ /// Get all Cordonel FW update SW package description files.
+ ///
+ ///
+ public static String ListAllSwPackages()
+ {
+ return ConfigurationManager.AppSettings["ListAllSwPackagesServiceUrl"] ??
+ DefaultListAllSwPackagesServiceUrl;
+ }
+
+ ///
+ /// Get all Cordonel FW update SW package description files.
+ ///
+ ///
+ public static String ListAllConfigurationFilePackages()
+ {
+ return ConfigurationManager.AppSettings["ListAllConfigFilePackagesServiceUrl"] ??
+ DefaultListAllConfigFilePackagesServiceUrl;
+ }
+
///
/// Set all applications versions installed to a specific Cordonel.
///
diff --git a/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache b/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache
index b81d5f66..2d9cbed7 100644
--- a/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache
+++ b/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache
@@ -1 +1 @@
-46bd00889699f5a20a4981a22f62b66368323855
+7ac73abb7afd9e6ddc0520a1568581c7ed0afd36
diff --git a/ServiceFwUpdate/Common/FwUpdateConfig/Consts/FwUpdateConfig.cs b/ServiceFwUpdate/Common/FwUpdateConfig/Consts/FwUpdateConfig.cs
index d5f2e79d..58b80075 100644
--- a/ServiceFwUpdate/Common/FwUpdateConfig/Consts/FwUpdateConfig.cs
+++ b/ServiceFwUpdate/Common/FwUpdateConfig/Consts/FwUpdateConfig.cs
@@ -80,6 +80,16 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateConfig.Consts
///
public const String FwUpdateFileExtension = ".safe";
+ ///
+ /// Library-subfolder: For releases the files are sorted to subfolders to avoid confusion of the user.
+ ///
+ public const String LibrarySubFolderName = "Library";
+
+ ///
+ /// Library-subfolder: For releases the files are sorted to subfolders to avoid confusion of the user.
+ ///
+ public const String ConfigSubFolderName = "Config";
+
///
/// Separator in file name between PcbId CustomerName and OrderNumber for the FW-Update Safe and all report
/// files.
diff --git a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs
index a588176b..7733418e 100644
--- a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs
+++ b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs
@@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
-using System.IO;
+using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
@@ -37,6 +37,16 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
///
public List DbAllUpdateOperators { get; private set; }
+ ///
+ /// Cordonel SW package.
+ ///
+ public List DbFwUpdateSwPackage { get; private set; }
+
+ ///
+ /// Cordonel configuration files.
+ ///
+ public List DbFwUpdateConfigFiles { get; private set; }
+
///
/// Cordonel FW packages.
///
@@ -316,7 +326,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
///
public Boolean GetAllBuilderOperatorsFromDb()
{
-
+
if (DbAllBuilderOperators == null) DbAllBuilderOperators = new List();
DbAllBuilderOperators.Clear();
@@ -374,6 +384,126 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
}
}
+ ///
+ /// Load the latest FW update SW package from DB.
+ ///
+ /// true if successful
+ ///
+ /// - Initial.
+ ///
+ public Boolean DownloadFwUpdateSwContainerFromDb()
+ {
+ try
+ {
+ var url = ServiceUrls.ListAllSwPackages();
+ var requestResponse = LocalWebRequest.GetRequest(url, 10000);
+ if (string.IsNullOrEmpty(requestResponse))
+ {
+ DbIsConnected = false;
+ return false;
+ }
+
+ DbIsConnected = true;
+
+ // get a list of all stored FW update SW packages
+ var dbCordonelSwPackages = JsonConvert.DeserializeObject>(requestResponse);
+ if (dbCordonelSwPackages == null || dbCordonelSwPackages.Count == 0)
+ {
+ return false;
+ }
+
+ // get latest version
+ var fileId = dbCordonelSwPackages.Select(package => package.FileId).Prepend(0).Max();
+ if (fileId == 0)
+ {
+ return false;
+ }
+
+ if (DbFwUpdateSwPackage == null) DbFwUpdateSwPackage = new List();
+ DbFwUpdateSwPackage.Clear();
+
+ // download content
+ url = ServiceUrls.DownloadFileParts();
+ url += $"{fileId}&readContent=true";
+ requestResponse = LocalWebRequest.GetRequest(url, 15000);
+ if (string.IsNullOrEmpty(requestResponse))
+ {
+ DbIsConnected = false;
+ return false;
+ }
+
+ DbIsConnected = true;
+ DbFwUpdateSwPackage = JsonConvert.DeserializeObject>(requestResponse);
+ return DbFwUpdateSwPackage != null && DbFwUpdateSwPackage.Count > 0;
+
+ }
+ catch (Exception)
+ {
+ DbIsConnected = false;
+ return false;
+ }
+ }
+
+ ///
+ /// Load the latest FW update configuration files from DB.
+ ///
+ /// true if successful
+ ///
+ /// - Initial.
+ ///
+ public Boolean DownloadFwUpdateConfigurationFilesFromDb()
+ {
+ try
+ {
+ var url = ServiceUrls.ListAllConfigurationFilePackages();
+ var requestResponse = LocalWebRequest.GetRequest(url, 10000);
+ if (string.IsNullOrEmpty(requestResponse))
+ {
+ DbIsConnected = false;
+ return false;
+ }
+
+ DbIsConnected = true;
+
+ // get a list of all stored FW update config file packages
+ var dbConfigFilePackages = JsonConvert.DeserializeObject>(requestResponse);
+ if (dbConfigFilePackages == null || dbConfigFilePackages.Count == 0)
+ {
+ return false;
+ }
+
+ // get latest version
+ var fileId = dbConfigFilePackages.Select(package => package.FileId).Prepend(0).Max();
+ if (fileId == 0)
+ {
+ return false;
+ }
+
+ if (DbFwUpdateConfigFiles == null) DbFwUpdateConfigFiles = new List();
+ DbFwUpdateConfigFiles.Clear();
+
+ // download content
+ url = ServiceUrls.DownloadFileParts();
+ url += $"{fileId}&readContent=true";
+ requestResponse = LocalWebRequest.GetRequest(url, 10000);
+ if (string.IsNullOrEmpty(requestResponse))
+ {
+ DbIsConnected = false;
+ return false;
+ }
+
+ DbIsConnected = true;
+ DbFwUpdateConfigFiles = JsonConvert.DeserializeObject>(requestResponse);
+ return DbFwUpdateConfigFiles != null && DbFwUpdateConfigFiles.Count > 0;
+
+ }
+ catch (Exception)
+ {
+ DbIsConnected = false;
+ return false;
+ }
+ }
+
///
/// Get all Cordonel safe info files from DB.
///
@@ -524,7 +654,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
}
}
- ///
+ ///
/// Get all Cordonel customers from DB. The return can be used to select a specific customer and get
/// the customer number which is the base for the order search.
///
@@ -538,7 +668,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
// for the DB interface a specific search pattern will be used, so replace it from the user interface
// as there is a "*" the placeholder for "all".
searchPattern = searchPattern.Replace("*", "%");
- if (DbSearchedCordonelCustomers == null)
+ if (DbSearchedCordonelCustomers == null)
DbSearchedCordonelCustomers = new List();
DbSearchedCordonelCustomers.Clear();
@@ -554,7 +684,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
}
DbIsConnected = true;
- DbSearchedCordonelCustomers =
+ DbSearchedCordonelCustomers =
JsonConvert.DeserializeObject>(requestResponse);
return DbSearchedCordonelCustomers != null && DbSearchedCordonelCustomers.Count != 0;
}
@@ -574,9 +704,9 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
///
/// - Initial.
///
- public Boolean GetAllCordonelCustomerOrdersFromDb(Int64 customerNumber )
+ public Boolean GetAllCordonelCustomerOrdersFromDb(Int64 customerNumber)
{
- if (DbCordonelCustomerOrders == null)
+ if (DbCordonelCustomerOrders == null)
DbCordonelCustomerOrders = new List();
DbCordonelCustomerOrders.Clear();
@@ -592,7 +722,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
}
DbIsConnected = true;
- DbCordonelCustomerOrders =
+ DbCordonelCustomerOrders =
JsonConvert.DeserializeObject>(requestResponse);
return DbCordonelCustomerOrders != null && DbCordonelCustomerOrders.Count != 0;
}
@@ -611,9 +741,9 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
///
/// - Initial.
///
- public Boolean GetAllCordonelSerialNumbersFromDb(Int64 orderNumber, Int64 orderPos )
+ public Boolean GetAllCordonelSerialNumbersFromDb(Int64 orderNumber, Int64 orderPos)
{
- if (DbCordonelSerialNumbers == null)
+ if (DbCordonelSerialNumbers == null)
DbCordonelSerialNumbers = new List();
DbCordonelSerialNumbers.Clear();
@@ -629,7 +759,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
}
DbIsConnected = true;
- DbCordonelSerialNumbers =
+ DbCordonelSerialNumbers =
JsonConvert.DeserializeObject>(requestResponse);
return DbCordonelSerialNumbers != null && DbCordonelSerialNumbers.Count != 0;
}
@@ -694,7 +824,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
{
// The fully specified user has to be defined by FullName, LogInName, Domain, Hw Id and User Pwd Hash.
// The user id mustn't be set as this will be returned by the DB search.
- if (dbCheckFullSpecUpdateOperator == null || DbAllUpdateOperators == null ||
+ if (dbCheckFullSpecUpdateOperator == null || DbAllUpdateOperators == null ||
DbAllUpdateOperators.Count == 0 ||
string.IsNullOrEmpty(dbCheckFullSpecUpdateOperator.FullName) ||
string.IsNullOrEmpty(dbCheckFullSpecUpdateOperator.LogInName) ||
@@ -1226,13 +1356,13 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
if (pcbId > 0)
{
url += $"PcbId={pcbId}";
- if( userId > 0 ) url += $"&UserId={userId}";
- if( orderNr > 0 ) url += $"&OrderNr={orderNr}";
+ if (userId > 0) url += $"&UserId={userId}";
+ if (orderNr > 0) url += $"&OrderNr={orderNr}";
}
else if (userId > 0)
{
url += $"UserId={userId}";
- if( orderNr > 0 ) url += $"&OrderNr={orderNr}";
+ if (orderNr > 0) url += $"&OrderNr={orderNr}";
}
else if (orderNr > 0)
{
@@ -1304,7 +1434,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
///
/// - Set container Id, needed to assign PCB IDs.
///
- public Boolean UploadFwUpdateSafeToDb(FwUpdateSafeDb fwUpdateSafeDb, List pcbIds )
+ public Boolean UploadFwUpdateSafeToDb(FwUpdateSafeDb fwUpdateSafeDb, List pcbIds)
{
if (fwUpdateSafeDb == null) return false;
fwUpdateSafeDb.ContainerId = 0;
@@ -1316,10 +1446,10 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
url += $"&PValidDate={fwUpdateSafeDb.ValidDate:yyyy-MM-ddTHH:mm:ss}";
url += $"&PBuilderOperatorName={fwUpdateSafeDb.OperatorNameBuilder}";
- var success = LocalWebRequest.PostBinaryFileRequestAsync(url, fwUpdateSafeDb.Name,fwUpdateSafeDb.Content, out var requestResponse);
-
+ var success = LocalWebRequest.PostBinaryFileRequestAsync(url, fwUpdateSafeDb.Name, fwUpdateSafeDb.Content, out var requestResponse);
+
var containerId = JsonConvert.DeserializeObject(requestResponse);
- if (success && !string.IsNullOrEmpty(requestResponse) && containerId > 0)
+ if (success && !string.IsNullOrEmpty(requestResponse) && containerId > 0)
{
fwUpdateSafeDb.ContainerId = containerId;
diff --git a/ServiceFwUpdate/Documents/2021-10-27 Quick Reference Cordonel Service FW-Update Builder - Rev B.pdf b/ServiceFwUpdate/Documents/2021-10-27 Quick Reference Cordonel Service FW-Update Builder - Rev B.pdf
new file mode 100644
index 00000000..9efe2398
Binary files /dev/null and b/ServiceFwUpdate/Documents/2021-10-27 Quick Reference Cordonel Service FW-Update Builder - Rev B.pdf differ
diff --git a/ServiceFwUpdate/Documents/Quick Reference Cordonel Service FW-Update Builder.docx b/ServiceFwUpdate/Documents/Quick Reference Cordonel Service FW-Update Builder.docx
index 46526eff..5db661dd 100644
Binary files a/ServiceFwUpdate/Documents/Quick Reference Cordonel Service FW-Update Builder.docx and b/ServiceFwUpdate/Documents/Quick Reference Cordonel Service FW-Update Builder.docx differ
diff --git a/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs b/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs
index 3f135a86..ea5647aa 100644
--- a/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs
+++ b/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs
@@ -187,7 +187,6 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder
///
private const Int32 DbConnectionTimeoutMs = 5000;
private Int32 _dbAccessDelayCtrMs;
- private Boolean _dbAccessIsLocked;
///
/// Project name for the DLL to load:
@@ -219,7 +218,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder
ProgramConfig.NlogConfig);
///
- /// Source folder of binaries
+ /// Source folder of software package if taken from local [user]/downloads/ServiceFwUpdateSw
///
private static readonly String FwUpdateSwSourcePath = Path.Combine(Environment.GetFolderPath(
Environment.SpecialFolder.UserProfile), FwUpdateConfig.DefaultFwUpdateSwSourcePath);
@@ -452,7 +451,6 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder
private void infoToolStripMenuItem_Click(Object sender, EventArgs e)
{
_processState = ProcessState.UserRegistration;
- _dbAccessIsLocked = true;
var frmRegister = new FrmRegister(_regUser);
DisableAllControlsInvoked();
frmRegister.Show();
@@ -472,7 +470,6 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder
Show();
Update();
CheckUserRegistration();
- _dbAccessIsLocked = false;
}
///
/// Exit the program
@@ -692,7 +689,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder
if (e.TabPage == tabPageFwPackageSelection)
{
// Load fw packages only if not selected indicated in count
- if (_fwUpdatePackages.Count > 0 ||
+ if (_fwUpdatePackages.Count > 0 ||
_cordonelFwPackageInfoSearch != null && _cordonelFwPackageInfoSearch.Count > 0) return;
DisableAllControlsInvoked();
@@ -926,9 +923,9 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder
if (File.Exists(nLogConfigSourcePathName) && !File.Exists(NLogConfigurationDestPathFile))
SystemControl.CopyFile(nLogConfigSourcePathName, NLogConfigurationDestPathFile);
- var rulerPathName = Path.Combine(fwUpdateBuilderLibraryPath,
+ var rulerPathName = Path.Combine(fwUpdateBuilderLibraryPath,
FwUpdateConfig.MeterFwUpdateRulerConfigFileName);
- if (!File.Exists(rulerPathName)) rulerPathName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
+ if (!File.Exists(rulerPathName)) rulerPathName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
FwUpdateConfig.MeterFwUpdateRulerConfigFileName);
if (File.Exists(rulerPathName))
{
@@ -1129,8 +1126,8 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder
}
GetFwUpdateSwLicenseFromDb(FwUpdateSwFullName, out fwUpdateSafe.License);
-
-if (fwUpdateSafe.License == null)
+
+ if (fwUpdateSafe.License == null)
{
LogErrorText(Resources.StrSwLicenseMissing);
MessageBoxShow(Resources.StrSwLicenseMissing, Resources.StrError, MessageBoxButtons.OK,
@@ -1139,15 +1136,15 @@ if (fwUpdateSafe.License == null)
return false;
}
- // overwrite license as operator has decided for FW-Update Valid date
+ // overwrite license validation date as operator has selected this
fwUpdateSafe.License.ValidTo =
DateTimeServer.GetDateTimeFromDateString(lblFwUpdateDutyDate.Text + " 23:59:59", _cultureInfo);
LogSuccessText($@"{Resources.StrSwLicenseLoadedSuccessfully} {FwUpdateProjectName}" +
$" {fwUpdateSafe.License.Major}.{fwUpdateSafe.License.Minor}.{fwUpdateSafe.License.Build}");
- //GetFwUpdateSwContainerFromDb();
- if (!BuildFwUpdateSwContainer(fwUpdateSafe.License) ||
+ // local files: if (!BuildFwUpdateSwContainer(fwUpdateSafe.License) ||
+ if (!BuildFwUpdateSwContainerFromDb(fwUpdateSafe.License) ||
_fwUpdateSwContainer?.RegisterDefinitionFile == null ||
_fwUpdateSwContainer.SoftwareSetupFile == null ||
_fwUpdateSwContainer.MeterFilesEraseRestore == null ||
@@ -1285,113 +1282,6 @@ if (fwUpdateSafe.License == null)
}
}
- /////
- ///// Take user input to fill the FW-Update collection information.
- /////
- /////
- ///// - Initial.
- /////
- /////
- ///// - Clear update info on entry.
- /////
- /////
- ///// - Checkbox to enable DEBUG Cordonels for development.
- /////
- /////
- ///// - Added DEBUG Cordonels to CordonelProductionInfos.
- /////
- //public void DebugDeviceAndFwPackageSelection()
- //{
- // _cordonelProductionInfos.Clear();
- // if (!cbxAddDebugCordonels.Checked) return;
-
- // var updateInfo = new CordonelDeviceInfo
- // {
- // PcbId = "182100041",
- // CustomerSerialNumber = @"Octopus 1",
- // RequiredRelease = "EMEA R106D 868MHz"
- // //RequiredRelease = "EMEA R106B TEST (it is R106D)"
- // //RequiredRelease = "EMEA R106B 433MHz"
- // };
- // if (_cordonelDeviceInfos.All(d => d.PcbId != updateInfo.PcbId)) _cordonelDeviceInfos.Add(updateInfo);
-
- // updateInfo = new CordonelDeviceInfo
- // {
- // PcbId = "192000001",
- // CustomerSerialNumber = @"Octopus 2",
- // RequiredRelease = "EMEA R1066 433MHz"
- // };
- // if (_cordonelDeviceInfos.All(d => d.PcbId != updateInfo.PcbId)) _cordonelDeviceInfos.Add(updateInfo);
-
- // updateInfo = new CordonelDeviceInfo
- // {
- // PcbId = "192000004",
- // CustomerSerialNumber = @"Octopus 3",
- // RequiredRelease = "EMEA R106D 868MHz"
- // };
- // if (_cordonelDeviceInfos.All(d => d.PcbId != updateInfo.PcbId)) _cordonelDeviceInfos.Add(updateInfo);
-
- // updateInfo = new CordonelDeviceInfo
- // {
- // PcbId = "192000006",
- // CustomerSerialNumber = @"Octopus 4",
- // RequiredRelease = "EMEA R106D 868MHz"
- // };
- // if (_cordonelDeviceInfos.All(d => d.PcbId != updateInfo.PcbId)) _cordonelDeviceInfos.Add(updateInfo);
-
- // updateInfo = new CordonelDeviceInfo
- // {
- // PcbId = "192000007",
- // CustomerSerialNumber = @"Octopus 5",
- // RequiredRelease = "EMEA R106D 868MHz"
- // };
- // if (_cordonelDeviceInfos.All(d => d.PcbId != updateInfo.PcbId)) _cordonelDeviceInfos.Add(updateInfo);
-
- // updateInfo = new CordonelDeviceInfo
- // {
- // PcbId = "192000009",
- // CustomerSerialNumber = @"Octopus 6",
- // RequiredRelease = "EMEA R106D 868MHz"
- // };
- // if (_cordonelDeviceInfos.All(d => d.PcbId != updateInfo.PcbId)) _cordonelDeviceInfos.Add(updateInfo);
-
- // foreach (var cordonelUpdateInfo in _cordonelDeviceInfos)
- // {
- // var cordonel = new CordonelProductionInfosDb
- // {
- // IsSelected = true,
- // CatalogNumber = "OCTOPUS",
- // CustomerOrderNumber = 999999,
- // CustomerOrderPos = 99,
- // Diameter = "0",
- // Length = "0",
- // PcbId = cordonelUpdateInfo.PcbId,
- // CustomerSerialNumber = cordonelUpdateInfo.CustomerSerialNumber,
- // SensusSerialNumber = @"Test-Cordonel",
- // RequiredReleaseNameVersion = cordonelUpdateInfo.RequiredRelease
- // };
- // if (_fwUpdateDbAccess != null &&
- // _fwUpdateDbAccess.DownloadCordonelAppVersionsFromDb(cordonel.PcbId, out var cordonelAppVersions))
- // {
- // foreach (var appVersion in cordonelAppVersions)
- // {
- // if (appVersion.Id == -1) cordonel.CoreRevision = appVersion.Version;
- // if (appVersion.Id == 0x0F)
- // {
- // cordonel.Metrology = appVersion.Version;
- // cordonel.MetrologyIsUpdateable = appVersion.IsUpdateable;
- // }
-
- // if (appVersion.Id == 0x18)
- // cordonel.InstalledReleaseNameVersion = appVersion.Version;
- // }
- // }
- // if (_cordonelProductionInfos.All(d => d.PcbId != cordonel.PcbId))
- // _cordonelProductionInfos.Add(cordonel);
- // }
-
- // _cordonelsPropertyChanged = true;
- //}
#endregion --------------------------------------- Build FW-Update Safe ---------------------------------------
@@ -1404,9 +1294,6 @@ if (fwUpdateSafe.License == null)
///
private void CheckUserRegistration()
{
-
-
-
if (_fwUpdateDbAccess == null || _regUser == null) return;
_regUser.Domain = CryptInformation.GetSysDomain();
_regUser.LogInName = CryptInformation.GetSysUserLoginName();
@@ -1519,7 +1406,6 @@ if (fwUpdateSafe.License == null)
if (_fwUpdateDbAccess.DbIsConnected)
{
// DB is free to use
- _dbAccessIsLocked = false;
if (_dbLicenseRefreshDelayCtrMs > DbLicenseRefreshTimeoutMs)
{
@@ -2373,7 +2259,6 @@ if (fwUpdateSafe.License == null)
Thread.CurrentThread.CurrentCulture = _cultureInfo;
try
{
- _dbAccessIsLocked = true;
// check DB connection in advance to overcome the timing issues for DB service startup
_fwUpdateDbAccess.CheckDbConnection();
}
@@ -2383,7 +2268,6 @@ if (fwUpdateSafe.License == null)
}
}).ContinueWith(delegate
{
- _dbAccessIsLocked = false;
_processState = ProcessState.Idle;
});
}
@@ -2409,7 +2293,6 @@ if (fwUpdateSafe.License == null)
Thread.CurrentThread.CurrentCulture = _cultureInfo;
try
{
- _dbAccessIsLocked = true;
// check DB connection in advance to overcome the timing issues for DB service startup
_fwUpdateDbAccess.CheckDbConnection();
GetAllUpdateOperatorsFromDb();
@@ -2420,7 +2303,6 @@ if (fwUpdateSafe.License == null)
}
}).ContinueWith(delegate
{
- _dbAccessIsLocked = false;
_fwUpdateOperatorsPropertyChanged = true;
_processState = ProcessState.Idle;
});
@@ -2441,7 +2323,6 @@ if (fwUpdateSafe.License == null)
Thread.CurrentThread.CurrentCulture = _cultureInfo;
try
{
- _dbAccessIsLocked = true;
// check DB connection in advance to overcome the timing issues for DB service startup
_fwUpdateDbAccess.CheckDbConnection();
GetLicenseFromDb();
@@ -2452,7 +2333,6 @@ if (fwUpdateSafe.License == null)
}
}).ContinueWith(delegate
{
- _dbAccessIsLocked = false;
if (_regUser.AccountActive)
{
_licenseValidDateTimeOffset = DateTimeServer.GetDateTimeTodayUntilMidnight();
@@ -2468,6 +2348,12 @@ if (fwUpdateSafe.License == null)
///
/// - Initial
///
+ ///
+ /// - Load configuration files from DB as the latest MeterFwUpdateRuler.json is needed for the
+ /// FwUpdateBuilder FW package check and validation routine! This step has to be done in advance
+ /// to the FW package load, as the Builder uses the information of the MeterFwUpdateRuler to
+ /// create the package information!
+ ///
private void LoadDbCordonelFwPackagesTask()
{
_invokerProcessState = _processState;
@@ -2477,9 +2363,11 @@ if (fwUpdateSafe.License == null)
Thread.CurrentThread.CurrentCulture = _cultureInfo;
try
{
- _dbAccessIsLocked = true;
// check DB connection in advance to overcome the timing issues for DB service startup
_fwUpdateDbAccess.CheckDbConnection();
+ // has to be done first to extract the MeterFwUpdateRuler
+ GetFwUpdateConfigFilesFromDb();
+ // load the packages and use the MeterFwUpdateRuler to assign the DN, EMEA, NA, 868, 433..
GetCordonelFwPackagesFromDb();
}
catch (Exception)
@@ -2488,7 +2376,6 @@ if (fwUpdateSafe.License == null)
}
}).ContinueWith(delegate
{
- _dbAccessIsLocked = false;
_fwPackagePropertyChanged = true;
_processState = ProcessState.Idle;
});
@@ -2515,7 +2402,6 @@ if (fwUpdateSafe.License == null)
Thread.CurrentThread.CurrentCulture = _cultureInfo;
try
{
- _dbAccessIsLocked = true;
// check DB connection in advance to overcome the timing issues for DB service startup
_fwUpdateDbAccess.CheckDbConnection();
GetAllCordonelCustomersFromDb();
@@ -2526,7 +2412,6 @@ if (fwUpdateSafe.License == null)
}
}).ContinueWith(delegate
{
- _dbAccessIsLocked = false;
_customersPropertyChanged = true;
_processState = ProcessState.Idle;
});
@@ -2553,7 +2438,6 @@ if (fwUpdateSafe.License == null)
Thread.CurrentThread.CurrentCulture = _cultureInfo;
try
{
- _dbAccessIsLocked = true;
// check DB connection in advance to overcome the timing issues for DB service startup
_fwUpdateDbAccess.CheckDbConnection();
GetAllCordonelSerialNumbersOfOrderFromDb();
@@ -2564,7 +2448,6 @@ if (fwUpdateSafe.License == null)
}
}).ContinueWith(delegate
{
- _dbAccessIsLocked = false;
_cordonelsPropertyChanged = true;
_processState = ProcessState.Idle;
});
@@ -2588,7 +2471,6 @@ if (fwUpdateSafe.License == null)
Thread.CurrentThread.CurrentCulture = _cultureInfo;
try
{
- _dbAccessIsLocked = true;
// check DB connection in advance to overcome the timing issues for DB service startup
_fwUpdateDbAccess.CheckDbConnection();
GetAllCordonelOrdersOfCustomerFromDb();
@@ -2599,7 +2481,6 @@ if (fwUpdateSafe.License == null)
}
}).ContinueWith(delegate
{
- _dbAccessIsLocked = false;
_cordonelsPropertyChanged = true;
_processState = ProcessState.Idle;
});
@@ -3833,7 +3714,7 @@ if (fwUpdateSafe.License == null)
}
var initialSortColumn = gridViewCustomerSelection.Columns[Resources.StrTableCustomerName];
- if (initialSortColumn != null)
+ if (initialSortColumn != null)
gridViewCustomerSelection.Sort(initialSortColumn, ListSortDirection.Ascending);
}
catch (Exception)
@@ -4000,6 +3881,9 @@ if (fwUpdateSafe.License == null)
///
/// - Meter FW update ruler.
///
+ ///
+ /// - Configuration files loading from DB: - MeterFwUpdateRuler, configuration.json and MeterEraseRestore.
+ ///
private Boolean GetCordonelFwPackagesFromDb()
{
if (_fwUpdateDbAccess == null || !_fwUpdateDbAccess.GetAllCordonelFwInfoFilesFromDb() ||
@@ -4007,6 +3891,10 @@ if (fwUpdateSafe.License == null)
return false;
_cordonelFwPackageInfoSearch.Clear();
+ // The configuration files contain the latest MeterFwUpdateRuler.json (needed for the FwUpdateBuilder),
+ // the latest configuration.json and the latest MeterEraseRestore.json (needed for the FwUpdateSw).
+ // GetConfigurationFilesFromDb();
+
// Start with the last package, as this will be the latest
for (var idx = _fwUpdateDbAccess.DbCordonelFwPackages.Count - 1;
idx > _fwUpdateDbAccess.DbCordonelFwPackages.Count - 40; idx--)
@@ -4055,10 +3943,10 @@ if (fwUpdateSafe.License == null)
$"{rule.Release.Substring(3, 2)}";
if (releaseVersion == fwPackInfo.ReleaseVersion)
{
- Int32.TryParse(rule.CoreVersionMin, out var x);
+ int.TryParse(rule.CoreVersionMin, out var x);
fwPackInfo.CoreVersionMin = x;
x = 0;
- Int32.TryParse(rule.CoreVersionMax, out x);
+ int.TryParse(rule.CoreVersionMax, out x);
fwPackInfo.CoreVersionMax = x;
fwPackInfo.FwIsReleased = !string.IsNullOrEmpty(rule.ApproverName);
}
@@ -4216,6 +4104,135 @@ if (fwUpdateSafe.License == null)
return false;
}
+ ///
+ /// Get Cordonel Fa update configuration files from DB.
+ /// The configuration files contain the latest MeterFwUpdateRuler.json (needed for the FwUpdateBuilder),
+ /// the latest configuration.json and the latest MeterEraseRestore.json (needed for the FwUpdateSw).
+ /// Copies the MeterFwUpdateRuler.json to the [exe-root] or [exe-root]/Library of the FwUpdateBuilder.
+ ///
+ /// true if successful
+ ///
+ /// - Initial.
+ ///
+ private Boolean GetFwUpdateConfigFilesFromDb()
+ {
+ if (_fwUpdateDbAccess == null ||
+ !_fwUpdateDbAccess.DownloadFwUpdateConfigurationFilesFromDb() ||
+ _fwUpdateDbAccess.DbFwUpdateConfigFiles.Count == 0)
+ return false;
+
+ try
+ {
+ // extract the MeterFwUpdateRuler
+ foreach (var f in _fwUpdateDbAccess.DbFwUpdateConfigFiles)
+ {
+ if (f.FileName == FwUpdateConfig.MeterFwUpdateRulerConfigFileName)
+ {
+ // Copy MeterFwUpdateRuler either to exe-path or if existing to Library-subfolder
+ var fwUpdateBuilderExePath = AppDomain.CurrentDomain.BaseDirectory;
+ var fwUpdateBuilderLibraryPath = Path.Combine(fwUpdateBuilderExePath,
+ FwUpdateConfig.LibrarySubFolderName);
+
+ // check the Library path existence (will be used in Release build)
+ var meterFwUpdateRulerPath = Directory.Exists(fwUpdateBuilderLibraryPath) ?
+ fwUpdateBuilderLibraryPath : fwUpdateBuilderExePath;
+
+ var sourceFile = Path.Combine(meterFwUpdateRulerPath, f.FileName);
+ var fs = File.Open(sourceFile, FileMode.Create);
+ fs.Write(f.FileContent, 0, f.FileContent.Length);
+ fs.Close();
+ }
+ }
+ }
+
+ catch (Exception)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ ///
+ /// Get Cordonel SW and configuration files from DB.
+ /// The software is a container of dll files, language packages and logging setups.
+ /// The configuration files contain the latest MeterFwUpdateRuler.json (needed for the FwUpdateBuilder),
+ /// the latest configuration.json and the latest MeterEraseRestore.json (needed for the FwUpdateSw).
+ /// Creates License, FileCrc, FileLength and SubDiractories.
+ ///
+ /// license information of valid software
+ /// true if successful
+ ///
+ /// - Initial.
+ ///
+ private Boolean BuildFwUpdateSwContainerFromDb(SoftwareLicense fwUpdateSwLicense)
+ {
+ if (_fwUpdateDbAccess?.DbFwUpdateConfigFiles == null ||
+ !_fwUpdateDbAccess.DownloadFwUpdateSwContainerFromDb() ||
+ _fwUpdateDbAccess.DbFwUpdateSwPackage.Count == 0 ||
+ _fwUpdateDbAccess.DbFwUpdateConfigFiles.Count == 0)
+ return false;
+
+ _fwUpdateSwContainer = new SoftwareContainer
+ {
+ Major = fwUpdateSwLicense.Major,
+ Minor = fwUpdateSwLicense.Minor,
+ Build = fwUpdateSwLicense.Build,
+ Program = fwUpdateSwLicense.Program,
+ SoftwareDynLinkLibs = new List(),
+ RegisterDefinitionFile = new FilePart(),
+ SoftwareSetupFile = new FilePart(),
+ MeterFilesEraseRestore = new FilePart()
+ };
+
+ foreach (var f in _fwUpdateDbAccess.DbFwUpdateConfigFiles)
+ {
+ // load the register definition
+ if (f.FileName == ProgramConfig.RegisterDefinitionFileName)
+ {
+ f.FileContentLength = f.FileContent.Length;
+ f.FileContentCrc16CcittMsb = Crc16Ccitt.CalculateMsb1021(f.FileContent);
+ _fwUpdateSwContainer.RegisterDefinitionFile = f;
+ }
+
+ // load the meter files to erase and restore
+ if (f.FileName == FwUpdateConfig.MeterFilesEraseRestoreConfigFileName)
+ {
+ f.FileContentLength = f.FileContent.Length;
+ f.FileContentCrc16CcittMsb = Crc16Ccitt.CalculateMsb1021(f.FileContent);
+ _fwUpdateSwContainer.MeterFilesEraseRestore = f;
+ }
+ }
+
+ foreach (var f in _fwUpdateDbAccess.DbFwUpdateSwPackage)
+ {
+ // load the logging configuration
+ if (f.FileName == ProgramConfig.NlogConfig)
+ {
+ f.FileContentLength = f.FileContent.Length;
+ f.FileContentCrc16CcittMsb = Crc16Ccitt.CalculateMsb1021(f.FileContent);
+ _fwUpdateSwContainer.SoftwareSetupFile = f;
+ }
+ // load the DLLs
+ if (f.FileName.EndsWith(".dll"))
+ {
+ // extract sub-directory from file name in DB for sub-directory creation in FwUpdateLoader
+ // supports only depth of one level
+ if (f.FileName.Contains("\\"))
+ {
+ var fileName = f.FileName.Split('\\');
+ var subDirectory = fileName[0];
+ f.FileName = fileName[fileName.Length - 1];
+ f.SubDirectory = subDirectory;
+ }
+
+ f.FileContentLength = f.FileContent.Length;
+ f.FileContentCrc16CcittMsb = Crc16Ccitt.CalculateMsb1021(f.FileContent);
+ _fwUpdateSwContainer.SoftwareDynLinkLibs.Add(f);
+ }
+ }
+ return true;
+ }
+
///
/// Build the FW-Update SW container
///
@@ -4232,6 +4249,7 @@ if (fwUpdateSafe.License == null)
///
/// - Take license from DB.
///
+ // ReSharper disable once UnusedMember.Local
private Boolean BuildFwUpdateSwContainer(SoftwareLicense fwUpdateSwLicense)
{
_fwUpdateSwContainer = new SoftwareContainer
@@ -4247,7 +4265,7 @@ if (fwUpdateSafe.License == null)
};
try
{
- //TODO THW for debug purposes the locally values are taken
+ // for debug purposes the locally stored files from download folder are taken
// copy all elements of software release in the main directory
var fileList = new List();
@@ -4498,84 +4516,6 @@ if (fwUpdateSafe.License == null)
return false;
}
- /////
- ///// Load firmware package from local HDD.
- /////
- /////
- ///// true if succeeded
- /////
- ///// - Initial.
- /////
- /////
- ///// - Returns bool.
- /////
- /////
- ///// - Logging added.
- /////
- //private Boolean LoadFirmwarePackage(String releaseNameVersion)
- //{
- // // if this packages has already been loaded, exit immediately
- // if (_fwUpdatePackages.Any(version => version.ReleaseNameVersion == releaseNameVersion))
- // {
- // return true;
- // }
-
- // var cordonelFwPackage = new CordonelFirmware
- // {
- // ReleaseNameVersion = releaseNameVersion,
- // PackageDescriptionFile = new FilePart(),
- // BinaryApplicationFiles = new List()
- // };
-
- // try
- // {
- // // copy all firmware releases which later will be the "Cordonel Firmware" container
- // var files = Directory.GetFiles(FwUpdateFwSourceFolder + releaseNameVersion);
- // if (files.Length == 0)
- // {
- // var msg = Resources.StrFwPackageLoadFailed + @" " + releaseNameVersion;
- // LogErrorText(msg);
- // MessageBoxShow(msg, Resources.StrError, MessageBoxButtons.OK, MessageBoxIcon.Error);
- // return false;
- // }
-
- // foreach (var f in files)
- // {
- // // extract the file name
- // var fileName = Path.GetFileName(f);
- // // load the ADF
- // if (f.Contains("product") && f.EndsWith(".txt"))
- // {
- // cordonelFwPackage.PackageDescriptionFile.FileName = fileName;
- // var file = File.ReadAllBytes(f);
- // cordonelFwPackage.PackageDescriptionFile.FileContent = new Byte[file.Length];
- // cordonelFwPackage.PackageDescriptionFile.FileContent = file;
- // }
- // // load the binaries
- // if (f.Contains("binfile") && f.EndsWith(".bin"))
- // {
- // var filePart = new FilePart { FileName = fileName };
- // var file = new List(File.ReadAllBytes(f));
- // filePart.FileContent = new Byte[file.Count];
- // filePart.FileContent = file.ToArray();
- // cordonelFwPackage.BinaryApplicationFiles.Add(filePart);
- // }
- // }
- // _fwUpdatePackages.Add(cordonelFwPackage);
- // LogSuccessText(Resources.StrFwPackageLoadSuccess + " " + releaseNameVersion);
- // }
- // catch (Exception e)
- // {
- // var msg = Resources.StrFwPackageLoadFailed + @" " + releaseNameVersion;
- // LogErrorText(msg);
- // MessageBoxShow(msg, Resources.StrError, MessageBoxButtons.OK, MessageBoxIcon.Error);
- // MessageBoxShow(e.ToString(), Resources.StrError, MessageBoxButtons.OK,
- // MessageBoxIcon.Error);
- // _processState = ProcessState.Error;
- // return false;
- // }
- // return true;
- //}
#endregion --------------------------------------- Load DB Contents -------------------------------------------
#region ------------------------------------------ Language ---------------------------------------------------
diff --git a/ServiceFwUpdate/Ui/ServiceFwUpdateLoader/FrmFwUpdateLoader.cs b/ServiceFwUpdate/Ui/ServiceFwUpdateLoader/FrmFwUpdateLoader.cs
index 7c48bec8..0687aae1 100644
--- a/ServiceFwUpdate/Ui/ServiceFwUpdateLoader/FrmFwUpdateLoader.cs
+++ b/ServiceFwUpdate/Ui/ServiceFwUpdateLoader/FrmFwUpdateLoader.cs
@@ -509,7 +509,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
public FrmFwUpdateLoader()
{
var fwUpdateLoaderExePath = AppDomain.CurrentDomain.BaseDirectory;
- var fwUpdateLoaderConfigPath = Path.Combine(fwUpdateLoaderExePath, "Config");
+ var fwUpdateLoaderConfigPath = Path.Combine(fwUpdateLoaderExePath, FwUpdateConfig.ConfigSubFolderName);
// Set the FW-Update SW destination folder to the FW-Update Loader exe path
_fwUpdateSwDestinationPath = Path.Combine(fwUpdateLoaderExePath, FwUpdateProjectName);