From 24d2ae6eb9555633e885e10565769734dc331a2d Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Wed, 7 Feb 2024 09:50:24 +0100 Subject: [PATCH 1/9] CUST: - FwUpdateBuilder DB access delay increased --- .../Common/FwUpdateDb/FwUpdateDb.cs | 22 +++++++++---------- .../FrmFwUpdateBuilder.cs | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs index 66487988..2280b7dc 100644 --- a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs +++ b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs @@ -144,7 +144,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.GetSoftwareLicenseUrl(); - var requestResponse = LocalWebRequest.GetRequest(url + programName, 1200); + var requestResponse = LocalWebRequest.GetRequest(url + programName, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -186,7 +186,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb $"&Major={swLicense.Major}" + $"&Minor={swLicense.Minor}" + $"&Build={swLicense.Build}"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); var ret = bool.Parse(requestResponse.Trim('"')); if (string.IsNullOrEmpty(requestResponse)) { @@ -229,7 +229,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb url += $"{swLicense.Program}&Major={swLicense.Major}&Minor={swLicense.Minor}" + $"&Build={swLicense.Build}&ValidTo={swLicense.ValidTo:yyyy-MM-ddTHH:mm:ss}" + $"&Description={swLicense.Description ?? "null"}&ProgramNameIsUnique={swLicense.ProgramNameIsUnique}"; - var requestResponse = LocalWebRequest.PostRequestAsyncAndGetContent(url, 1200); + var requestResponse = LocalWebRequest.PostRequestAsyncAndGetContent(url, 5000); if (requestResponse != null && string.IsNullOrEmpty(requestResponse) && !JsonConvert.DeserializeObject(requestResponse)) { @@ -408,7 +408,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.ListAllFwUpdateUsersServiceUrl(); - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -810,7 +810,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.ListAllCordonelCustomerOrdersServiceUrl(); url += $@"{customerNumber}"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 10000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -848,7 +848,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.ListAllOrderCordonelsServiceUrl(); url += $@"{orderNumber}&CustomerOrderPos={orderPos}"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -916,7 +916,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.GetFwUpdateUserByIdServiceUrl(); url += "0"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1025,7 +1025,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb $"&HardwareId={dbNewUser.HardwareId}" + $"&PasswordHash={dbNewUser.PasswordHash} +" + $"&ValidDate={validDateTime:yyyy-MM-ddTHH:mm:ss}&AccountActive=true"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1077,7 +1077,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.RefreshFwUpdateUsersPasswordHashServiceUrl(); url += $"{dbUserId}&PasswordHash={dbUserPwdHash}"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1124,7 +1124,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb var validDateTime = DateTimeServer.SetValidationDate(FwUpdateConfig.Consts.FwUpdateConfig.ValidDays); var url = ServiceUrls.EditFwUpdateUserValidityServiceUrl(); url += $"{dbUserId}&ValidDate={validDateTime:yyyy-MM-ddTHH:mm:ss}&AccountActive=true"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1173,7 +1173,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.RefreshFwUpdateUsersHardwareIdServiceUrl(); url += $"{dbUserId}&HardwareId={dbHwId}"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; diff --git a/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs b/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs index 0fa5b422..51216b09 100644 --- a/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs +++ b/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs @@ -1344,7 +1344,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder //_cordonelUpdateList[0].CustomerSerialNumber = "8 SEN20 1975 6272"; //_cordonelUpdateList[0].PcbId = "182100041"; //GetPwdFromDb(_cordonelUpdateList[0]); - //fwUpdateSafe.License.Build = 5; + //fwUpdateSafe.License.Build = 6; //var dateTime = fwUpdateSafe.License.ValidTo.AddDays(-1); //fwUpdateSafe.License.ValidTo = dateTime; //var addDays = fwUpdateSafe.SafeInfo.FwUpdateValidDate.AddDays(-1); From 1bb1823c0f402a8e8ee32634ae8cff7e19e16ef5 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Wed, 7 Feb 2024 09:50:24 +0100 Subject: [PATCH 2/9] CUST: - FwUpdateBuilder DB access delay increased --- .../Common/FwUpdateDb/FwUpdateDb.cs | 22 +++++++++---------- .../FrmFwUpdateBuilder.cs | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs index 66487988..2280b7dc 100644 --- a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs +++ b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs @@ -144,7 +144,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.GetSoftwareLicenseUrl(); - var requestResponse = LocalWebRequest.GetRequest(url + programName, 1200); + var requestResponse = LocalWebRequest.GetRequest(url + programName, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -186,7 +186,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb $"&Major={swLicense.Major}" + $"&Minor={swLicense.Minor}" + $"&Build={swLicense.Build}"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); var ret = bool.Parse(requestResponse.Trim('"')); if (string.IsNullOrEmpty(requestResponse)) { @@ -229,7 +229,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb url += $"{swLicense.Program}&Major={swLicense.Major}&Minor={swLicense.Minor}" + $"&Build={swLicense.Build}&ValidTo={swLicense.ValidTo:yyyy-MM-ddTHH:mm:ss}" + $"&Description={swLicense.Description ?? "null"}&ProgramNameIsUnique={swLicense.ProgramNameIsUnique}"; - var requestResponse = LocalWebRequest.PostRequestAsyncAndGetContent(url, 1200); + var requestResponse = LocalWebRequest.PostRequestAsyncAndGetContent(url, 5000); if (requestResponse != null && string.IsNullOrEmpty(requestResponse) && !JsonConvert.DeserializeObject(requestResponse)) { @@ -408,7 +408,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.ListAllFwUpdateUsersServiceUrl(); - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -810,7 +810,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.ListAllCordonelCustomerOrdersServiceUrl(); url += $@"{customerNumber}"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 10000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -848,7 +848,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.ListAllOrderCordonelsServiceUrl(); url += $@"{orderNumber}&CustomerOrderPos={orderPos}"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -916,7 +916,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.GetFwUpdateUserByIdServiceUrl(); url += "0"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1025,7 +1025,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb $"&HardwareId={dbNewUser.HardwareId}" + $"&PasswordHash={dbNewUser.PasswordHash} +" + $"&ValidDate={validDateTime:yyyy-MM-ddTHH:mm:ss}&AccountActive=true"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1077,7 +1077,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.RefreshFwUpdateUsersPasswordHashServiceUrl(); url += $"{dbUserId}&PasswordHash={dbUserPwdHash}"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1124,7 +1124,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb var validDateTime = DateTimeServer.SetValidationDate(FwUpdateConfig.Consts.FwUpdateConfig.ValidDays); var url = ServiceUrls.EditFwUpdateUserValidityServiceUrl(); url += $"{dbUserId}&ValidDate={validDateTime:yyyy-MM-ddTHH:mm:ss}&AccountActive=true"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1173,7 +1173,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.RefreshFwUpdateUsersHardwareIdServiceUrl(); url += $"{dbUserId}&HardwareId={dbHwId}"; - var requestResponse = LocalWebRequest.GetRequest(url, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; diff --git a/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs b/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs index 0fa5b422..51216b09 100644 --- a/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs +++ b/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs @@ -1344,7 +1344,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder //_cordonelUpdateList[0].CustomerSerialNumber = "8 SEN20 1975 6272"; //_cordonelUpdateList[0].PcbId = "182100041"; //GetPwdFromDb(_cordonelUpdateList[0]); - //fwUpdateSafe.License.Build = 5; + //fwUpdateSafe.License.Build = 6; //var dateTime = fwUpdateSafe.License.ValidTo.AddDays(-1); //fwUpdateSafe.License.ValidTo = dateTime; //var addDays = fwUpdateSafe.SafeInfo.FwUpdateValidDate.AddDays(-1); From 5fba86bc8594130c261265e7aa388b608782aabc Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Wed, 7 Feb 2024 14:46:18 +0100 Subject: [PATCH 3/9] SharedAssemblyVersion temporary back to 2.6.6 with 2.6.7 RequestProtocol --- Common/.shared/SharedAssemblyInfo.cs | 4 +- .../Genesis/GenesisCore/RegisterRestorer.cs | 252 ++++++++++++------ .../Genesis/Registers/RecoveryRegisterItem.cs | 18 ++ ...erRegisters.csproj.CoreCompileInputs.cache | 2 +- ...ToXlsHelper.csproj.CoreCompileInputs.cache | 2 +- .../Common/FwUpdateDb/FwUpdateDb.cs | 83 +++--- .../FrmFwUpdateBuilder.cs | 6 +- 7 files changed, 243 insertions(+), 124 deletions(-) diff --git a/Common/.shared/SharedAssemblyInfo.cs b/Common/.shared/SharedAssemblyInfo.cs index 62f0cb85..7ccc038e 100644 --- a/Common/.shared/SharedAssemblyInfo.cs +++ b/Common/.shared/SharedAssemblyInfo.cs @@ -14,5 +14,5 @@ using System.Reflection; //[assembly: AssemblyVersion("1.2.*.0")] -[assembly: AssemblyVersion("2.6.7.*")] -[assembly: AssemblyFileVersion("2.6.7.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.6.6.*")] +[assembly: AssemblyFileVersion("2.6.6.0")] \ No newline at end of file diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs index 1865b93c..2d14c473 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using Newtonsoft.Json; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.CommonCore.Consts; @@ -28,27 +29,32 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// /// PCB ID for pre update read for comparison /// - private String _pcbIdInitialRegisterRead = "X"; + private String _pcbIdInitialRegisterRead = Constants.StrUnknown; /// /// PCB ID for pre update write for comparison /// - private String _pcbIdRecoveryRegisters = "X"; + private String _pcbIdRecoveryRegisters = Constants.StrUnknown; /// /// PCB ID for post update for comparison /// private String _pcbIdFinalRegisterRead = Constants.StrUnknown; + /// + /// Collection of recovery registers and values + /// + public List RegistersSetup; + /// /// Register content on initial connect to keep those during update /// - private readonly MeterRegisters _initialReadRegisters = new MeterRegisters(); + private MeterRegisters _initialReadRegisters = new MeterRegisters(); /// /// Register content after all operation had been performed /// - private readonly MeterRegisters _finalReadRegisters = new MeterRegisters(); + private MeterRegisters _finalReadRegisters = new MeterRegisters(); /// /// Register which shall be restored after change of FW or after register recovery @@ -60,13 +66,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// public event EventHandler OnProcessUpdate; - /// - /// List for parameters which need to be removed from parameter list as they mustn't be accessed - /// - private static readonly List _prohibitedParameters = new List - { - "CUSTOMER_AppArrangement" - }; /// /// List for un-reversed parameters, all others need to be swapped byte-wise /// @@ -81,51 +80,59 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// private static readonly List _excludedFromCompareParameters = new List { - "SENSUSRADIO_UpgFWVersion" // After a FW-Update the FW version has changed and the compare will fail + "SENSUSRADIO_UpgFWVersion", // After a FW-Update the FW version has changed and the compare will fail + "IRDA_MfgDate" // After a FW-Update the date has changed and the compare will fail }; /// /// Pre programming parameters for all devices defined here, will be filled with radio parameters /// if meter has radio /// - private static readonly List _prepareProgramming = new List + private static readonly List _prepareProgramming = new List { // The display needs to be unsealed for change of unit and resolution - new ProgrammingParameters("GENESISFLOW_SealDisplay", new Byte[] { 0x00 }) + new RecoveryRegisterItem("GENESISFLOW_SealDisplay", new Byte[] { 0x00 }) }; + /// + /// Pre programming parameters for all devices defined here, will be filled with radio parameters + /// if meter has radio + /// + // ReSharper disable once CollectionNeverQueried.Global IS FOR DEBUG + public readonly List FailedComparisonRegisters = new List(); + /// /// Post programming parameters for radio only /// - private static readonly List _finalizeProgrammingRadioOnly = new List + private static readonly List _finalizeProgrammingRadioOnly = new List { - new ProgrammingParameters("LOGGER_TriggerLogFlush", new Byte[] { 0x01 }), - new ProgrammingParameters("PERIODICLOG_ResetCounter", new Byte[] { 0x00 }), + new RecoveryRegisterItem("LOGGER_TriggerLogFlush", new Byte[] { 0x01 }), + new RecoveryRegisterItem("PERIODICLOG_ResetCounter", new Byte[] { 0x00 }), // System state 0xFF will force a storage of all parameters and reset, followed by system state 0x02 // for customer mode, the reset needs only a few milliseconds // Attention logout-delay-login required after this step! - new ProgrammingParameters("SENSUSRADIO_SystemState", new Byte[] { 0xFF }) + new RecoveryRegisterItem("SENSUSRADIO_SystemState", new Byte[] { 0xFF }) }; /// /// Post programming parameters for all devices /// - private static readonly List _finalizeProgramming = new List + private static readonly List _finalizeProgramming = new List { - new ProgrammingParameters("GENESISFLOW_SealDisplay", new Byte[] { 0x01 }), - new ProgrammingParameters("GENESISFLOW_TriggerIdle", new Byte[] { 0x00 }), + new RecoveryRegisterItem("GENESISFLOW_SealDisplay", new Byte[] { 0x01 }), + new RecoveryRegisterItem("GENESISFLOW_TriggerIdle", new Byte[] { 0x00 }), }; /// /// Post programming parameters for EOL (end of line, prepare for shipping workplace) /// - private static readonly List _finalizeProgrammingEol = new List + private static readonly List _finalizeProgrammingEol = new List { - new ProgrammingParameters("GENESISFLOW_ResetAccumulators", new Byte[] { 0x01 }), - new ProgrammingParameters("NFC_EraseRMA", new Byte[] { 0x01 }) + new RecoveryRegisterItem("GENESISFLOW_ResetAccumulators", new Byte[] { 0x01 }), + new RecoveryRegisterItem("NFC_EraseRMA", new Byte[] { 0x01 }) }; /// - /// Actual Port Counter + /// Actual register counter /// public Int32 ActualRegisterCtr; @@ -179,9 +186,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// /// - Data base access imported to have a common interface for programming parameters for EOL (shipping) and CUST. /// - public static Boolean DownloadProgrammingParametersFromDb(String pcbId, out List recoveryRegisters) + /// + /// - Removed prohibited parameters. + /// + public static Boolean DownloadProgrammingParametersFromDb(String pcbId, List recoveryRegisters) { - recoveryRegisters = new List(); try { var url = $"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetProgrammingParameters?PcbID={pcbId}"; @@ -207,27 +216,43 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore // reverse byte order for all parameters except those listed below if (!string.IsNullOrEmpty(proPar.RegisterName)) { - // ATTENTION: These parameters are coming out of the DB and need to be removed from list - if (RegisterRestorer._prohibitedParameters.Contains(proPar.RegisterName)) - { - } // ATTENTION: These parameters are coming out of the DB in wrong order - if (RegisterRestorer._unRevertedParameters.Contains(proPar.RegisterName)) + if (_unRevertedParameters.Contains(proPar.RegisterName)) { - // skip VAKO if equally register is set in CSD or on read only access - if (proPar.Source == ProgrammingSource.Vako && sortableProgrammingParameters.Any(a => - a.Source == ProgrammingSource.Csd && proPar.RegisterName.Equals(a.RegisterName))) + // Add parameter if it is not in the list + if (sortableProgrammingParameters.All(a => !proPar.RegisterName.Equals(a.RegisterName))) + { + sortableProgrammingParameters.Add(proPar); continue; - sortableProgrammingParameters.Add(proPar); + } + // if parameter from VAKO is in the list and the new is from CSD, replace this with CSD + if (proPar.Source == ProgrammingSource.Csd && sortableProgrammingParameters.Any(a => + proPar.RegisterName.Equals(a.RegisterName) && a.Source == ProgrammingSource.Vako)) + { + var removeProPar = + sortableProgrammingParameters.Where(a => proPar.RegisterName.Equals(a.RegisterName)); + sortableProgrammingParameters.Remove(removeProPar.LastOrDefault()); + sortableProgrammingParameters.Add(proPar); + } } else { - // skip VAKO if equally register is set in CSD or on read only access - if (proPar.Source == ProgrammingSource.Vako && sortableProgrammingParameters.Any(a => - a.Source == ProgrammingSource.Csd && proPar.RegisterName.Equals(a.RegisterName))) + // Add parameter if it is not in the list + if (sortableProgrammingParameters.All(a => !proPar.RegisterName.Equals(a.RegisterName))) + { + sortableProgrammingParameters.Add(new ProgrammingParameters(proPar.RegisterName, + proPar.RegisterValue.Reverse().ToArray(), proPar.Source)); continue; - sortableProgrammingParameters.Add(new ProgrammingParameters(proPar.RegisterName, - proPar.RegisterValue.Reverse().ToArray(), proPar.Source)); + } + // if parameter from VAKO is in the list and the new is from CSD, replace this with CSD + if (proPar.Source == ProgrammingSource.Csd && sortableProgrammingParameters.Any(a => + proPar.RegisterName.Equals(a.RegisterName) && a.Source == ProgrammingSource.Vako)) + { + var removeProPar = sortableProgrammingParameters.Where(a => proPar.RegisterName.Equals(a.RegisterName)); + sortableProgrammingParameters.Remove(removeProPar.LastOrDefault()); + sortableProgrammingParameters.Add(new ProgrammingParameters(proPar.RegisterName, + proPar.RegisterValue.Reverse().ToArray(), proPar.Source)); + } } } // register for this FW is defined else @@ -245,11 +270,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore { foreach (var proPar in sortableProgrammingParameters) { - var recReg = new RecoveryRegisterItem - { - RegisterIdent = proPar.RegisterName, - WriteValue = proPar.RegisterValue - }; + var recReg = new RecoveryRegisterItem(proPar.RegisterName, proPar.RegisterValue); recoveryRegisters.Add(recReg); } } @@ -309,7 +330,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// public Boolean EolProgrammingRegisters(List recoveryRegistersDb) { - // mark EOL as true to force Accu reset + // mark EOL as true to force accu reset return RecoverRegisters(recoveryRegistersDb, true); } @@ -343,6 +364,10 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// - Remind pcbId as already recovered before the true return, /// - Exclude lock of repeated execution for EOL. /// + /// + /// - Avoid writing of parameters if not writable. The DB delivers parameters which exclusively have to be + /// compared to the specified value. + /// public Boolean RecoverRegisters(List recoveryRegistersDb, Boolean eolProgramming = false) { if (_currentGenesis == null || @@ -370,14 +395,17 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore var meterRegisters = _currentGenesis.GetConfigRegistersDefinitions(); // prepare list for finalization depending on SENSUSRADIO installation - var finalizeProgrammingAll = new List(); + var finalizeProgrammingAll = new List(); if (recoveryRegistersDb.Any(x => x.RegisterIdent.Contains("SENSUSRADIO"))) { finalizeProgrammingAll.AddRange(_finalizeProgrammingRadioOnly); } // add EOL sequence if called if (eolProgramming) + { finalizeProgrammingAll.AddRange(_finalizeProgrammingEol); + } + // standard end of programming sequence finalizeProgrammingAll.AddRange(_finalizeProgramming); @@ -396,15 +424,15 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore try { - _currentGenesis.WriteRegister(prepRecReg.RegisterName, prepRecReg.RegisterValue); + _currentGenesis.WriteRegister(prepRecReg.RegisterIdent, prepRecReg.WriteValue); // if this call does not throw an exception, the register is present - var regDef = meterRegisters.GetRegisterDefinitionByName(prepRecReg.RegisterName); + var regDef = meterRegisters.GetRegisterDefinitionByName(prepRecReg.RegisterIdent); var strRawAndConvertedValue = ""; try { - strRawAndConvertedValue = RegisterConverter.GetRegisterContentText(regDef, prepRecReg.RegisterValue); + strRawAndConvertedValue = RegisterConverter.GetRegisterContentText(regDef, prepRecReg.WriteValue); } catch (Exception) { @@ -438,10 +466,15 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore try { - _currentGenesis.WriteRegister(recReg.RegisterIdent, recReg.WriteValue); - // if this call does not throw an exception, the register is present var regDef = meterRegisters.GetRegisterDefinitionByName(recReg.RegisterIdent); + + // avoid register write if not allowed + if (regDef.RegisterDetail.Privilege.Lvl8 != Access.RW) + continue; + + _currentGenesis.WriteRegister(recReg.RegisterIdent, recReg.WriteValue); + var strRawAndConvertedValue = ""; try { @@ -483,15 +516,15 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore try { - _currentGenesis.WriteRegister(finalRecReg.RegisterName, finalRecReg.RegisterValue); + _currentGenesis.WriteRegister(finalRecReg.RegisterIdent, finalRecReg.WriteValue); // if this call does not throw an exception, the register is present - var regDef = meterRegisters.GetRegisterDefinitionByName(finalRecReg.RegisterName); + var regDef = meterRegisters.GetRegisterDefinitionByName(finalRecReg.RegisterIdent); var strRawAndConvertedValue = ""; try { - strRawAndConvertedValue = RegisterConverter.GetRegisterContentText(regDef, finalRecReg.RegisterValue); + strRawAndConvertedValue = RegisterConverter.GetRegisterContentText(regDef, finalRecReg.WriteValue); } catch (Exception) { @@ -519,6 +552,10 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore _pcbIdRecoveryRegisters = _currentGenesis.PcbId; _currentGenesis?.Logout(); + + // Wait for completion as storing needs a certain time + Thread.Sleep(1000); + return true; } @@ -542,6 +579,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// /// - Avoid message event if message is empty. /// + /// + /// - Remind registers which failed the comparison including values. + /// public Boolean CompareRegisters() { if (_pcbIdFinalRegisterRead != _pcbIdInitialRegisterRead || @@ -552,6 +592,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore StopRegisterAccess = false; ActualRegisterCtr = 0; var retVal = true; + FailedComparisonRegisters?.Clear(); // build a string list of the registers being able to sort those var registerNames = _restoreRegisters.MeterRegisterDic.Select(register => register.Key.GetIdent()).ToList(); @@ -661,6 +702,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore strRequiredRegisterValue += $" - {Resources.StrMeterValue}: ({strReadBackRegisterValue})" + $" - {Resources.StrRegisterCompareFailed}"; + FailedComparisonRegisters?.Add(new RecoveryRegisterItem(regName, restorableRawRegister, + finalReadRawRegister)); retVal = false; } } @@ -728,18 +771,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore return false; } - // get the pre-defined dictionary - var meterRegisters = _currentGenesis.GetConfigRegistersDefinitions(); - - // extract all registers which can be read and create two dictionaries for before update to safe program - // internally the register content for comparison ability. - foreach (var reg in meterRegisters.MeterRegisterDic.Where(r => r.Key.RegisterDetail?.Version.First != null - && r.Key.RegisterDetail.Version.Last != null && r.Key.RestoreCapability.StaticTypeValue != null - && r.Key.DataType != typeof(Rpc) && r.Key.IsAvailable && - (r.Key.RegisterDetail.Privilege.Lvl8 == Access.RW || r.Key.RegisterDetail.Privilege.Lvl8 == Access.RO))) - { - _finalReadRegisters.MeterRegisterDic.TryAdd(reg.Key, reg.Value); - } + // create a dictionary for final read being able to compare those with the initial read and restored + if (!BuildReadableRegisterDictionary(ref _finalReadRegisters)) + return false; // log to report file the after update register read string OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs($@"{Resources.StrReadRegister}", 0, @@ -793,18 +827,39 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore _initialReadRegisters.MeterRegisterDic.Clear(); _restoreRegisters.MeterRegisterDic.Clear(); - // get the pre-defined dictionary - var meterRegisters = _currentGenesis.GetConfigRegistersDefinitions(); + // create the dictionaries out of the configuration.json + if (!BuildInitialDictionaries()) + return false; - // extract all registers which can be read and create two dictionaries for before update to safe program - // internally the register content for comparison ability. - foreach (var reg in meterRegisters.MeterRegisterDic.Where(r => r.Key.RegisterDetail?.Version.First != null - && r.Key.RegisterDetail.Version.Last != null && r.Key.RestoreCapability.StaticTypeValue != null - && r.Key.DataType != typeof(Rpc) && r.Key.IsAvailable && - (r.Key.RegisterDetail.Privilege.Lvl8 == Access.RW || r.Key.RegisterDetail.Privilege.Lvl8 == Access.RO))) - { - _initialReadRegisters.MeterRegisterDic.TryAdd(reg.Key, reg.Value); - } + // log to report file the initial register read string + OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs($@"{Resources.StrReadRegister}", 0, + Resources.StrReadRegistersBeforeUpdate)); + + return ReadRegistersSet(_initialReadRegisters, _restoreRegisters); + } + + /// + /// Get DEFINED registers from GenesisMeter class and build a list all registers which are flagged + /// with read write (RW) or read only (RO). Build a list of all registers being able to restore flagged + /// with equals ". + /// The defined registers are based on the "configuration.json" and the installed application with + /// a specific version. + /// + /// true if registers could be read + /// + /// - Initial from . + /// + private Boolean BuildInitialDictionaries() + { + if (_currentGenesis == null) + return false; + + _initialReadRegisters.MeterRegisterDic.Clear(); + _restoreRegisters.MeterRegisterDic.Clear(); + + // create a dictionary for initial read being able to compare those with the final read and restored + if (!BuildReadableRegisterDictionary(ref _initialReadRegisters)) + return false; // take the pre-selected registers for final compare restore capability check even if the registers after // the update may have changed, only registers which are present before the update can be restored! @@ -815,11 +870,42 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore _restoreRegisters.MeterRegisterDic.TryAdd(reg.Key, reg.Value); } - // log to report file the initial register read string - OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs($@"{Resources.StrReadRegister}", 0, - Resources.StrReadRegistersBeforeUpdate)); + return _restoreRegisters.MeterRegisterDic.Count > 0 && _initialReadRegisters.MeterRegisterDic.Count > 0; + } - return ReadRegistersSet(_initialReadRegisters, _restoreRegisters); + /// + /// Get DEFINED registers from GenesisMeter class and build a list all registers which are flagged + /// with read write (RW) or read only (RO). + /// The defined registers are based on the "configuration.json" and the installed application with + /// a specific version. + /// + /// all readable registers dictionary creation + /// true if register dictionary is not empty + /// true if registers could be read + /// + /// - Initial from . + /// + public Boolean BuildReadableRegisterDictionary(ref MeterRegisters registers) + { + if (_currentGenesis == null || registers?.MeterRegisterDic == null) + return false; + + registers.MeterRegisterDic.Clear(); + + // get the pre-defined dictionary + var meterRegisters = _currentGenesis.GetConfigRegistersDefinitions(); + + // extract all registers which can be read and create two dictionaries for before update to safe program + // internally the register content for comparison ability. + foreach (var reg in meterRegisters.MeterRegisterDic.Where(r => r.Key.RegisterDetail?.Version.First != null + && r.Key.RegisterDetail.Version.Last != null && r.Key.RestoreCapability.StaticTypeValue != null + && r.Key.DataType != typeof(Rpc) && r.Key.IsAvailable && + (r.Key.RegisterDetail.Privilege.Lvl8 == Access.RW || r.Key.RegisterDetail.Privilege.Lvl8 == Access.RO))) + { + registers.MeterRegisterDic.TryAdd(reg.Key, reg.Value); + } + + return registers.MeterRegisterDic.Count > 0; } /// diff --git a/Common/Hardware/WaterMeter/Genesis/Registers/RecoveryRegisterItem.cs b/Common/Hardware/WaterMeter/Genesis/Registers/RecoveryRegisterItem.cs index 9006251e..e6563f01 100644 --- a/Common/Hardware/WaterMeter/Genesis/Registers/RecoveryRegisterItem.cs +++ b/Common/Hardware/WaterMeter/Genesis/Registers/RecoveryRegisterItem.cs @@ -7,6 +7,24 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers /// public class RecoveryRegisterItem { + /// + /// Ctor + /// + public RecoveryRegisterItem() + { + } + + /// + /// Ctor for write access parameter setup + /// + public RecoveryRegisterItem(String registerIdent, Byte[] writeValue, Byte[] readBackValue = null) + { + RegisterIdent = registerIdent; + WriteValue = writeValue; + ReadBackValue = readBackValue; + } + + /// /// Register name, use the latest configuration.json to make sure that the address will be correct /// 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 d110f5fc..82bc2c16 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 @@ -c43c40a030005a8f189e6179faf40a6d42bfef5c +bf6bb8fceb3db5a9977dadc407cf576684bf7127 diff --git a/Common/Tools/Tools.JsonToXlsHelper/obj/Debug/Tools.JsonToXlsHelper.csproj.CoreCompileInputs.cache b/Common/Tools/Tools.JsonToXlsHelper/obj/Debug/Tools.JsonToXlsHelper.csproj.CoreCompileInputs.cache index 84b6b3be..8dda2975 100644 --- a/Common/Tools/Tools.JsonToXlsHelper/obj/Debug/Tools.JsonToXlsHelper.csproj.CoreCompileInputs.cache +++ b/Common/Tools/Tools.JsonToXlsHelper/obj/Debug/Tools.JsonToXlsHelper.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -65d75c3322f8a137c69963cfdc0cb6f1ffacf62a +247396738e2c5d26ac00f9df05c0cc5c61d7f33a diff --git a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs index 2280b7dc..d404b446 100644 --- a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs +++ b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs @@ -26,6 +26,11 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb [Serializable] public class FwUpdateDb { + + private const Int32 shortTimeoutDbRequest = 2000; + private const Int32 moderateTimeoutDbRequest = 10000; + private const Int32 hugeTimeoutDbRequest = 30000; + /// /// DB connection cannot be established. /// @@ -144,7 +149,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.GetSoftwareLicenseUrl(); - var requestResponse = LocalWebRequest.GetRequest(url + programName, 5000); + var requestResponse = LocalWebRequest.GetRequest(url + programName, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -186,7 +191,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb $"&Major={swLicense.Major}" + $"&Minor={swLicense.Minor}" + $"&Build={swLicense.Build}"; - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); var ret = bool.Parse(requestResponse.Trim('"')); if (string.IsNullOrEmpty(requestResponse)) { @@ -229,7 +234,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb url += $"{swLicense.Program}&Major={swLicense.Major}&Minor={swLicense.Minor}" + $"&Build={swLicense.Build}&ValidTo={swLicense.ValidTo:yyyy-MM-ddTHH:mm:ss}" + $"&Description={swLicense.Description ?? "null"}&ProgramNameIsUnique={swLicense.ProgramNameIsUnique}"; - var requestResponse = LocalWebRequest.PostRequestAsyncAndGetContent(url, 5000); + var requestResponse = LocalWebRequest.PostRequestAsyncAndGetContent(url, moderateTimeoutDbRequest); if (requestResponse != null && string.IsNullOrEmpty(requestResponse) && !JsonConvert.DeserializeObject(requestResponse)) { @@ -266,9 +271,9 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb /// /// - Use common interface for programming parameters for EOL (shipping) and CUST from . /// - public Boolean DownloadCordonelRecoveryRegistersFromDb(String pcbId, out List recoveryRegisters) + public Boolean DownloadCordonelRecoveryRegistersFromDb(String pcbId, ref List recoveryRegisters) { - if (!RegisterRestorer.DownloadProgrammingParametersFromDb(pcbId, out recoveryRegisters)) + if (!RegisterRestorer.DownloadProgrammingParametersFromDb(pcbId, recoveryRegisters)) { DbIsConnected = false; return false; @@ -321,8 +326,13 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb return false; } - DbIsConnected = true; + if (meterPwdDb == null ) + { + DbIsConnected = false; + return false; + } + DbIsConnected = true; passwordContainer.PcbId = pcbId; passwordContainer.SkeletonKey = Encoding.UTF8.GetString(meterPwdDb.ListOfPasswords[MeterPwdDb.SkeletonKeyIdx]); @@ -332,13 +342,15 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb // Use the standard constructor as writing to meter is not necessary var meterPwdFile = new MeterPwdFile(); // The BuildPwdFile has an extended validation check - var retBol = meterPwdFile.BuildPwdFile(meterPwdDb.ListOfPasswords, 1, passwordContainer.SkeletonKey); + var retBol = + meterPwdFile.BuildPwdFile(meterPwdDb.ListOfPasswords, 1, passwordContainer.SkeletonKey); if (!retBol) { DbIsConnected = false; return false; } + passwordContainer.EncryptedPasswordFile = new Byte[MeterPwdDb.PwdFileLength]; passwordContainer.EncryptedPasswordFile = meterPwdFile.HashedPasswordFile; @@ -347,6 +359,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { hashList.AddRange(hash); } + var pwdControllerPwdFile = hashList.ToArray(); //passwordContainer.EncryptedPasswordFile = hashList.ToArray(); @@ -408,7 +421,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.ListAllFwUpdateUsersServiceUrl(); - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -456,7 +469,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.ListAllFwUpdateBuilderOperatorsServiceUrl(); - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -486,7 +499,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.ListAllSwPackages(); - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -516,7 +529,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb // download content url = ServiceUrls.DownloadFileParts(); url += $"{fileId}&readContent=true"; - requestResponse = LocalWebRequest.GetRequest(url, 15000); + requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -547,7 +560,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.ListAllConfigurationFilePackages(); - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -577,7 +590,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb // download content url = ServiceUrls.DownloadFileParts(); url += $"{fileId}&readContent=true"; - requestResponse = LocalWebRequest.GetRequest(url, 10000); + requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -612,7 +625,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.ListAllFwUpdateSafes(); - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -653,7 +666,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.ListAllFwUpdateSafesForUserServiceUrl(); url += $"{userId}"; - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -691,7 +704,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.DownloadFileParts(); url += $"{fileId}&readContent={readContent}"; - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -729,7 +742,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.DownloadFileParts(); url += $"{fileId}&readContent={readContent}"; - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -769,7 +782,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.ListAllCordonelCustomersWithFilterServiceUrl(); url += searchPattern; - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -810,7 +823,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.ListAllCordonelCustomerOrdersServiceUrl(); url += $@"{customerNumber}"; - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -823,7 +836,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb DbCordonelCustomerOrders?.Sort((a, b) => a.CustomerOrderNumber.CompareTo(b.CustomerOrderNumber)); return DbCordonelCustomerOrders != null && DbCordonelCustomerOrders.Count != 0; } - catch (Exception) + catch (Exception e) { DbIsConnected = false; return false; @@ -848,7 +861,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.ListAllOrderCordonelsServiceUrl(); url += $@"{orderNumber}&CustomerOrderPos={orderPos}"; - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -882,7 +895,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb try { var url = ServiceUrls.ListAllCordonelFwPackagesUrl(); - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -916,7 +929,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.GetFwUpdateUserByIdServiceUrl(); url += "0"; - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1025,7 +1038,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb $"&HardwareId={dbNewUser.HardwareId}" + $"&PasswordHash={dbNewUser.PasswordHash} +" + $"&ValidDate={validDateTime:yyyy-MM-ddTHH:mm:ss}&AccountActive=true"; - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, 1200); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1077,7 +1090,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.RefreshFwUpdateUsersPasswordHashServiceUrl(); url += $"{dbUserId}&PasswordHash={dbUserPwdHash}"; - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1124,7 +1137,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb var validDateTime = DateTimeServer.SetValidationDate(FwUpdateConfig.Consts.FwUpdateConfig.ValidDays); var url = ServiceUrls.EditFwUpdateUserValidityServiceUrl(); url += $"{dbUserId}&ValidDate={validDateTime:yyyy-MM-ddTHH:mm:ss}&AccountActive=true"; - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1173,7 +1186,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.RefreshFwUpdateUsersHardwareIdServiceUrl(); url += $"{dbUserId}&HardwareId={dbHwId}"; - var requestResponse = LocalWebRequest.GetRequest(url, 5000); + var requestResponse = LocalWebRequest.GetRequest(url, moderateTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1421,7 +1434,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.DownloadFwUpdateSafeServiceUrl(); url += $"{containerId}"; - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1455,7 +1468,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.ListAllPcbIdsFromSafe(); url += $"{containerId}"; - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1491,7 +1504,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.DownloadFileContentServiceUrl(); url += "{filePartId}"; - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1559,7 +1572,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb url += $"&readContent={readContent}"; - var requestResponse = LocalWebRequest.GetRequest(url, 20000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -1596,7 +1609,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb { var url = ServiceUrls.UploadFwUpdateReportServiceUrl(); - if (LocalWebRequest.PostRequestAsync(url, 10000, fwUpdRpt)) + if (LocalWebRequest.PostRequestAsync(url, hugeTimeoutDbRequest, fwUpdRpt)) { DbIsConnected = true; return true; @@ -1646,7 +1659,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb url = ServiceUrls.AddPcbIdsToSafeServiceUrl(); url += containerId; - if (LocalWebRequest.PostRequestAsync(url, 10000, pcbIds)) + if (LocalWebRequest.PostRequestAsync(url, hugeTimeoutDbRequest, pcbIds)) { DbIsConnected = true; return true; @@ -1689,7 +1702,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb url += $"{pcbId}&ProgressName={Assembly.GetExecutingAssembly().GetName().Name}"; url += $"&version={Assembly.GetExecutingAssembly().GetName().Version}"; - if (LocalWebRequest.PostRequestAsync(url, 1200, apps)) + if (LocalWebRequest.PostRequestAsync(url, moderateTimeoutDbRequest, apps)) { DbIsConnected = true; return true; @@ -1725,7 +1738,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb var url = ServiceUrls.DownloadCordonelAppVersionServiceUrl(); url += $"{pcbId}&returnRadioFRQ=true"; - var requestResponse = LocalWebRequest.GetRequest(url, 10000); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; diff --git a/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs b/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs index 51216b09..6c232eb2 100644 --- a/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs +++ b/ServiceFwUpdate/Ui/ServiceFwUpdateBuilder/FrmFwUpdateBuilder.cs @@ -19,6 +19,7 @@ using Xylem.Common.CommonCore.Consts; using Xylem.Common.CommonCore.ThreadWatcher; using Xylem.Common.Cryptology.Security; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Logic.ProductionOrderCore.FW; using Xylem.Common.Logic.ProductionOrderCore.OrderData; using Xylem.Common.Utils.DateTimeServer; @@ -1344,7 +1345,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder //_cordonelUpdateList[0].CustomerSerialNumber = "8 SEN20 1975 6272"; //_cordonelUpdateList[0].PcbId = "182100041"; //GetPwdFromDb(_cordonelUpdateList[0]); - //fwUpdateSafe.License.Build = 6; + //fwUpdateSafe.License.Build = 5; //var dateTime = fwUpdateSafe.License.ValidTo.AddDays(-1); //fwUpdateSafe.License.ValidTo = dateTime; //var addDays = fwUpdateSafe.SafeInfo.FwUpdateValidDate.AddDays(-1); @@ -5085,8 +5086,9 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder var reties = 2; do { + cordonel.RecoveryRegisters = new List(); if (_fwUpdateDbAccess == null || - !_fwUpdateDbAccess.DownloadCordonelRecoveryRegistersFromDb(cordonel.PcbId, out cordonel.RecoveryRegisters)) + !_fwUpdateDbAccess.DownloadCordonelRecoveryRegistersFromDb(cordonel.PcbId, ref cordonel.RecoveryRegisters)) continue; LogSuccessText(Resources.StrCordonelRecoveryRegistersAdded + " " + cordonel.PcbId + " - " + cordonel.CustomerSerialNumber); From 6e7f4a2aaa050c65678964daf2c697bcbba508f4 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Wed, 7 Feb 2024 14:51:11 +0100 Subject: [PATCH 4/9] ReSharper run --- ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs index 97f8c00e..bf8d3962 100644 --- a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs +++ b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs @@ -836,7 +836,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb DbCordonelCustomerOrders?.Sort((a, b) => a.CustomerOrderNumber.CompareTo(b.CustomerOrderNumber)); return DbCordonelCustomerOrders != null && DbCordonelCustomerOrders.Count != 0; } - catch (Exception e) + catch (Exception) { DbIsConnected = false; return false; From 6b3bef9bd1952f576b9135dc424a571fa35e9173 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Wed, 7 Feb 2024 16:38:59 +0100 Subject: [PATCH 5/9] SharedAssemblyVersion to 2.6.8 --- Common/.shared/SharedAssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/.shared/SharedAssemblyInfo.cs b/Common/.shared/SharedAssemblyInfo.cs index 7ccc038e..b198312b 100644 --- a/Common/.shared/SharedAssemblyInfo.cs +++ b/Common/.shared/SharedAssemblyInfo.cs @@ -14,5 +14,5 @@ using System.Reflection; //[assembly: AssemblyVersion("1.2.*.0")] -[assembly: AssemblyVersion("2.6.6.*")] -[assembly: AssemblyFileVersion("2.6.6.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.6.8.*")] +[assembly: AssemblyFileVersion("2.6.8.0")] \ No newline at end of file From 2cb06fa7d6cef111fa1b554d454fec4178837425 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Thu, 8 Feb 2024 11:04:08 +0100 Subject: [PATCH 6/9] IRAD_MfgDate corrected --- .../WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs | 4 +--- ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs | 4 +++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs index 2d14c473..98cd879b 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs @@ -80,8 +80,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// private static readonly List _excludedFromCompareParameters = new List { - "SENSUSRADIO_UpgFWVersion", // After a FW-Update the FW version has changed and the compare will fail - "IRDA_MfgDate" // After a FW-Update the date has changed and the compare will fail + "SENSUSRADIO_UpgFWVersion" // After a FW-Update the FW version has changed and the compare will fail }; /// /// Pre programming parameters for all devices defined here, will be filled with radio parameters @@ -486,7 +485,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore catch (Exception ex) { _currentGenesis.WriteLog("Could not replace register value of " + recReg.RegisterIdent + "; " + ex.Message); - // nothing to do } finally { diff --git a/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs b/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs index acb51469..0c2f6c3a 100644 --- a/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs +++ b/ServiceFwUpdate/Ui/ServiceFwUpdateSw/FrmServiceFwUpdateSw.cs @@ -1937,6 +1937,9 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw /// /// - Initial. /// + /// + /// - Avoid to setup IRDA_MfgDate as this is the manufacturing date and not the FW-Update date! + /// private Boolean SetDateTime() { if (_currentGenesis == null) @@ -1950,7 +1953,6 @@ namespace Xylem.ServiceFwUpdate.Ui.ServiceFwUpdateSw // build byte array var rawSeconds = RegisterConverter.ConvertFrom(teaTime.SecondsSince2000); retVal = _currentGenesis.WriteRegister("SYSTEM_CalendarSeconds", rawSeconds); - _currentGenesis.WriteRegister("IRDA_MfgDate", rawSeconds); LogSuccessText(Resources.StrDateTimeSetupSucceeded + " " + teaTime); } catch (Exception) From 1fccafccacfa451c178db40d60cb9c8cbbe0a600 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Thu, 8 Feb 2024 14:38:30 +0100 Subject: [PATCH 7/9] RegisterRestorer --- .../Genesis/GenesisCore/RegisterRestorer.cs | 76 +++++++++++++------ 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs index 2d14c473..9c6c62f2 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs @@ -59,7 +59,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// /// Register which shall be restored after change of FW or after register recovery /// - private readonly MeterRegisters _restoreRegisters = new MeterRegisters(); + private readonly MeterRegisters _recoveryRegisters = new MeterRegisters(); /// /// Register access event for message dispatcher to caller @@ -80,8 +80,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// private static readonly List _excludedFromCompareParameters = new List { - "SENSUSRADIO_UpgFWVersion", // After a FW-Update the FW version has changed and the compare will fail - "IRDA_MfgDate" // After a FW-Update the date has changed and the compare will fail + "SENSUSRADIO_UpgFWVersion" // After a FW-Update the FW version has changed and the compare will fail }; /// /// Pre programming parameters for all devices defined here, will be filled with radio parameters @@ -94,11 +93,20 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore }; /// - /// Pre programming parameters for all devices defined here, will be filled with radio parameters - /// if meter has radio + /// /// - // ReSharper disable once CollectionNeverQueried.Global IS FOR DEBUG - public readonly List FailedComparisonRegisters = new List(); + // ReSharper disable once CollectionNeverQueried.Local IS FOR DEBUG + private readonly List _failedComparisonRegisters = new List(); + + /// + /// + /// + // ReSharper disable once CollectionNeverQueried.Local IS FOR DEBUG + private List _dbParameterRegisterList = new List(); + private readonly List _recoveryRegisterList = new List(); + private List _initialRegisterList = new List(); + private List _finalRegisterList = new List(); + /// /// Post programming parameters for radio only @@ -106,6 +114,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore private static readonly List _finalizeProgrammingRadioOnly = new List { new RecoveryRegisterItem("LOGGER_TriggerLogFlush", new Byte[] { 0x01 }), + // set counter to 0 as this is a value how often the radio detected a reset new RecoveryRegisterItem("PERIODICLOG_ResetCounter", new Byte[] { 0x00 }), // System state 0xFF will force a storage of all parameters and reset, followed by system state 0x02 // for customer mode, the reset needs only a few milliseconds @@ -119,6 +128,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore private static readonly List _finalizeProgramming = new List { new RecoveryRegisterItem("GENESISFLOW_SealDisplay", new Byte[] { 0x01 }), + // trigger idle 0 releases the display to normal operation new RecoveryRegisterItem("GENESISFLOW_TriggerIdle", new Byte[] { 0x00 }), }; @@ -128,7 +138,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore private static readonly List _finalizeProgrammingEol = new List { new RecoveryRegisterItem("GENESISFLOW_ResetAccumulators", new Byte[] { 0x01 }), - new RecoveryRegisterItem("NFC_EraseRMA", new Byte[] { 0x01 }) + new RecoveryRegisterItem("NFC_EraseRMA", new Byte[] { 0x01 }), + new RecoveryRegisterItem("CUSTOMER_RebootCount", new Byte[] {0x00}) }; /// @@ -386,6 +397,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore StopRegisterAccess = false; ActualRegisterCtr = 0; + // Build string list for debug + _dbParameterRegisterList.Clear(); + _dbParameterRegisterList = recoveryRegistersDb.Select(register => register.RegisterIdent).ToList(); + _dbParameterRegisterList.Sort(); + // write values to Genesis _currentGenesis.ReLogin(); if (!_currentGenesis.IsLoggedOn) @@ -400,7 +416,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore { finalizeProgrammingAll.AddRange(_finalizeProgrammingRadioOnly); } - // add EOL sequence if called + // add EOL (shipping reset of accumulators, alarms and setup of manufacturing date) if (eolProgramming) { finalizeProgrammingAll.AddRange(_finalizeProgrammingEol); @@ -480,7 +496,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore { strRawAndConvertedValue = RegisterConverter.GetRegisterContentText(regDef, recReg.WriteValue); // replace value in _restoreRegister with the required recovery value - _restoreRegisters?.Set(regDef, recReg.WriteValue); + _recoveryRegisters?.Set(regDef, recReg.WriteValue); } catch (Exception ex) @@ -585,17 +601,17 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore public Boolean CompareRegisters() { if (_pcbIdFinalRegisterRead != _pcbIdInitialRegisterRead || - _restoreRegisters == null || + _recoveryRegisters == null || _finalReadRegisters == null) return false; StopRegisterAccess = false; ActualRegisterCtr = 0; var retVal = true; - FailedComparisonRegisters?.Clear(); + _failedComparisonRegisters?.Clear(); // build a string list of the registers being able to sort those - var registerNames = _restoreRegisters.MeterRegisterDic.Select(register => register.Key.GetIdent()).ToList(); + var registerNames = _recoveryRegisters.MeterRegisterDic.Select(register => register.Key.GetIdent()).ToList(); // Remove all excluded registers foreach (var regName in _excludedFromCompareParameters.Where(regName => registerNames.Any(reg => reg == regName))) { @@ -611,14 +627,14 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore { ActualRegisterCtr++; - var regDef = _restoreRegisters.GetRegisterDefinitionByName(regName); + var regDef = _recoveryRegisters.GetRegisterDefinitionByName(regName); var overallProcessCtrPercent = 100.0 * ActualRegisterCtr / registersCount; try { // Get the raw byte array of this register - var restorableRawRegister = _restoreRegisters.Get(regName); + var restorableRawRegister = _recoveryRegisters.Get(regName); var finalReadRawRegister = _finalReadRegisters.Get(regName); // take the size into account as a read value will be filled up to a chunk of 4 bytes @@ -702,7 +718,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore strRequiredRegisterValue += $" - {Resources.StrMeterValue}: ({strReadBackRegisterValue})" + $" - {Resources.StrRegisterCompareFailed}"; - FailedComparisonRegisters?.Add(new RecoveryRegisterItem(regName, restorableRawRegister, + _failedComparisonRegisters?.Add(new RecoveryRegisterItem(regName, restorableRawRegister, finalReadRawRegister)); retVal = false; } @@ -779,6 +795,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs($@"{Resources.StrReadRegister}", 0, Resources.StrReadRegistersAfterUpdate)); + // Build string list for debug + _finalRegisterList.Clear(); + _finalRegisterList = _finalReadRegisters.MeterRegisterDic.Select(register => register.Key.GetIdent()).ToList(); + _finalRegisterList.Sort(); + // executes login read logout return ReadRegistersSet(_finalReadRegisters); } @@ -819,13 +840,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore // deny update of registers if already done if (_pcbIdInitialRegisterRead == _currentGenesis.PcbId && _initialReadRegisters.MeterRegisterDic.Count > 0 && - _restoreRegisters.MeterRegisterDic.Count > 0) + _recoveryRegisters.MeterRegisterDic.Count > 0) return true; // remind the PCB ID before update for comparison _pcbIdInitialRegisterRead = _currentGenesis.PcbId; - _initialReadRegisters.MeterRegisterDic.Clear(); - _restoreRegisters.MeterRegisterDic.Clear(); // create the dictionaries out of the configuration.json if (!BuildInitialDictionaries()) @@ -835,7 +854,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs($@"{Resources.StrReadRegister}", 0, Resources.StrReadRegistersBeforeUpdate)); - return ReadRegistersSet(_initialReadRegisters, _restoreRegisters); + return ReadRegistersSet(_initialReadRegisters, _recoveryRegisters); } /// @@ -854,8 +873,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore if (_currentGenesis == null) return false; - _initialReadRegisters.MeterRegisterDic.Clear(); - _restoreRegisters.MeterRegisterDic.Clear(); + _recoveryRegisters.MeterRegisterDic.Clear(); + _recoveryRegisterList.Clear(); // create a dictionary for initial read being able to compare those with the final read and restored if (!BuildReadableRegisterDictionary(ref _initialReadRegisters)) @@ -867,10 +886,17 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore r.Key.RestoreCapability.CheckRestoreCapability() && r.Key.RegisterDetail.Privilege.Lvl8 == Access.RW)) { - _restoreRegisters.MeterRegisterDic.TryAdd(reg.Key, reg.Value); + _recoveryRegisters.MeterRegisterDic.TryAdd(reg.Key, reg.Value); + _recoveryRegisterList.Add(reg.Key.GetIdent()); } + _recoveryRegisterList.Sort(); - return _restoreRegisters.MeterRegisterDic.Count > 0 && _initialReadRegisters.MeterRegisterDic.Count > 0; + // Build string list for debug + _initialRegisterList.Clear(); + _initialRegisterList = _initialReadRegisters.MeterRegisterDic.Select(register => register.Key.GetIdent()).ToList(); + _initialRegisterList.Sort(); + + return _recoveryRegisters.MeterRegisterDic.Count > 0 && _initialReadRegisters.MeterRegisterDic.Count > 0; } /// @@ -885,7 +911,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// /// - Initial from . /// - public Boolean BuildReadableRegisterDictionary(ref MeterRegisters registers) + private Boolean BuildReadableRegisterDictionary(ref MeterRegisters registers) { if (_currentGenesis == null || registers?.MeterRegisterDic == null) return false; From 29d53443a5508e6bb4ed55e3d2111d9a1bf165ad Mon Sep 17 00:00:00 2001 From: Stoyan Zlatev Date: Thu, 8 Feb 2024 16:30:23 +0100 Subject: [PATCH 8/9] Http .dll moved in LaaProductionWeb --- Common/.vs/config/applicationhost.config | 2 +- .../LaaProduction.Http/HttpClient.cs | 91 +++++++++++++++++++ .../LaaProduction.Http/HttpMessage.cs | 50 ++++++++++ .../LaaProduction.Http/HttpResponse[T].cs | 16 ++++ .../Interfaces/IHttpClient.cs | 15 +++ .../Interfaces/IHttpErrorResponse.cs | 11 +++ .../Interfaces/IHttpMessage.cs | 14 +++ .../Interfaces/IHttpResponse[T].cs | 9 ++ .../LaaProduction.Http.csproj} | 19 +++- .../Properties/AssemblyInfo.cs | 8 +- LaaProductionWeb/LaaProduction.Http/README.md | 1 + .../LaaProduction.Http/packages.config | 4 + .../EmployeesRoles.cs | 63 ------------- ...aProduction.Personalization.Updater.csproj | 74 --------------- .../Program.cs | 79 ---------------- .../Properties/AssemblyInfo.cs | 36 -------- .../SoftwareFunctions.cs | 26 ------ .../Interfaces/IShipmentManager.cs | 6 -- .../LaaProduction.Shipment/README.md | 6 -- .../LaaProduction.Shipment/ShipmentManager.cs | 8 -- LaaProductionWeb/LaaProductionWeb.sln | 18 ++-- .../Controllers/HomeController.cs | 2 +- .../LaaProductionWeb/LaaProductionWeb.csproj | 4 + 23 files changed, 241 insertions(+), 321 deletions(-) create mode 100644 LaaProductionWeb/LaaProduction.Http/HttpClient.cs create mode 100644 LaaProductionWeb/LaaProduction.Http/HttpMessage.cs create mode 100644 LaaProductionWeb/LaaProduction.Http/HttpResponse[T].cs create mode 100644 LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpClient.cs create mode 100644 LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpErrorResponse.cs create mode 100644 LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpMessage.cs create mode 100644 LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpResponse[T].cs rename LaaProductionWeb/{LaaProduction.Shipment/LaaProduction.Shipment.csproj => LaaProduction.Http/LaaProduction.Http.csproj} (71%) rename LaaProductionWeb/{LaaProduction.Shipment => LaaProduction.Http}/Properties/AssemblyInfo.cs (84%) create mode 100644 LaaProductionWeb/LaaProduction.Http/README.md create mode 100644 LaaProductionWeb/LaaProduction.Http/packages.config delete mode 100644 LaaProductionWeb/LaaProduction.Personalization.Updater/EmployeesRoles.cs delete mode 100644 LaaProductionWeb/LaaProduction.Personalization.Updater/LaaProduction.Personalization.Updater.csproj delete mode 100644 LaaProductionWeb/LaaProduction.Personalization.Updater/Program.cs delete mode 100644 LaaProductionWeb/LaaProduction.Personalization.Updater/Properties/AssemblyInfo.cs delete mode 100644 LaaProductionWeb/LaaProduction.Personalization.Updater/SoftwareFunctions.cs delete mode 100644 LaaProductionWeb/LaaProduction.Shipment/Interfaces/IShipmentManager.cs delete mode 100644 LaaProductionWeb/LaaProduction.Shipment/README.md delete mode 100644 LaaProductionWeb/LaaProduction.Shipment/ShipmentManager.cs diff --git a/Common/.vs/config/applicationhost.config b/Common/.vs/config/applicationhost.config index ecc20ba7..a894c3cf 100644 --- a/Common/.vs/config/applicationhost.config +++ b/Common/.vs/config/applicationhost.config @@ -155,7 +155,7 @@ - + diff --git a/LaaProductionWeb/LaaProduction.Http/HttpClient.cs b/LaaProductionWeb/LaaProduction.Http/HttpClient.cs new file mode 100644 index 00000000..beafc7fc --- /dev/null +++ b/LaaProductionWeb/LaaProduction.Http/HttpClient.cs @@ -0,0 +1,91 @@ +namespace LaaProduction.Http +{ + using LaaProduction.Http.Interfaces; + + using Newtonsoft.Json; + + using System; + using System.Collections.Generic; + using System.Net.Http; + using System.Threading.Tasks; + + public class HttpClient : IHttpClient + { + private readonly System.Net.Http.HttpClient httpClient; + private readonly string routePrefix; + + public HttpClient(string baseURI, string routePrefix) + { + var httpHandler = new HttpClientHandler + { + UseDefaultCredentials = true, + }; + + this.httpClient = new System.Net.Http.HttpClient(httpHandler) + { + BaseAddress = new Uri(baseURI, UriKind.Absolute) + }; + + this.routePrefix = routePrefix.TrimEnd('/'); + } + + public static IHttpClient CreateHttpClient(string baseURI, string routePrefix) + => new HttpClient(baseURI, routePrefix); + + public IHttpMessage Delete(string route) + => new HttpMessage(this, HttpMethod.Delete, $"{routePrefix}/{route.TrimStart('/')}"); + + public IHttpMessage Get(string route) + => new HttpMessage(this, HttpMethod.Get, $"{routePrefix}/{route.TrimStart('/')}"); + + public IHttpMessage Options(string route) + => new HttpMessage(this, HttpMethod.Options, $"{routePrefix}/{route.TrimStart('/')}"); + + public IHttpMessage Post(string route) + => new HttpMessage(this, HttpMethod.Post, $"{routePrefix}/{route.TrimStart('/')}"); + + public IHttpMessage Put(string route) + => new HttpMessage(this, HttpMethod.Put, $"{routePrefix}/{route.TrimStart('/')}"); + + internal async Task> SendAsync(HttpMessage fluentHttpRequestMessage) + { + var httpResult = new HttpResponse(); + + using (fluentHttpRequestMessage) + { + using (var httpResponseMessage = await this.httpClient.SendAsync(fluentHttpRequestMessage)) + { + if (httpResponseMessage.Content is HttpContent httpContent) + { + var contentString = await httpContent.ReadAsStringAsync(); + + try + { + if (httpResponseMessage.IsSuccessStatusCode) + { + httpResult.Value = JsonConvert.DeserializeObject(contentString); + httpResult.Succeeded = httpResponseMessage.IsSuccessStatusCode && httpResult != null; + } + else + { + httpResult.Errors = JsonConvert.DeserializeObject>(contentString); + } + } + catch (Exception e) + { + httpResult.Succeeded = false; + httpResult.Message = JsonConvert.SerializeObject(new + { + HttpContent = contentString, + Exception = e.ToString(), + InnerException = e.InnerException?.ToString() + }); + } + } + } + } + + return httpResult; + } + } +} diff --git a/LaaProductionWeb/LaaProduction.Http/HttpMessage.cs b/LaaProductionWeb/LaaProduction.Http/HttpMessage.cs new file mode 100644 index 00000000..782b4757 --- /dev/null +++ b/LaaProductionWeb/LaaProduction.Http/HttpMessage.cs @@ -0,0 +1,50 @@ +namespace LaaProduction.Http +{ + using LaaProduction.Http.Interfaces; + + using Newtonsoft.Json; + + using System.Net.Http; + using System.Net.Http.Headers; + using System.Text; + using System.Threading.Tasks; + + internal class HttpMessage : IHttpMessage + { + private const string Bearer = nameof(Bearer); + + private readonly HttpClient fluentHttpClient; + private readonly HttpRequestMessage httpRequestMessage; + + public HttpMessage(HttpClient fluentHttpClient, HttpMethod method, string route) + { + this.fluentHttpClient = fluentHttpClient; + this.httpRequestMessage = new HttpRequestMessage(method, route); + } + + public void Dispose() + => this.httpRequestMessage?.Dispose(); + + public IHttpMessage AuthorizeBearer(string parameter) + { + this.httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue(Bearer, parameter); + + return this; + } + + public Task> SendAsync() + => this.fluentHttpClient.SendAsync(this); + + public IHttpMessage WhitJsonBody(object model) + { + var content = JsonConvert.SerializeObject(model); + + this.httpRequestMessage.Content = new StringContent(content, Encoding.UTF8, "application/json"); + + return this; + } + + public static implicit operator HttpRequestMessage(HttpMessage message) + => message?.httpRequestMessage; + } +} \ No newline at end of file diff --git a/LaaProductionWeb/LaaProduction.Http/HttpResponse[T].cs b/LaaProductionWeb/LaaProduction.Http/HttpResponse[T].cs new file mode 100644 index 00000000..2f3200e1 --- /dev/null +++ b/LaaProductionWeb/LaaProduction.Http/HttpResponse[T].cs @@ -0,0 +1,16 @@ +namespace LaaProduction.Http.Interfaces +{ + using System.Collections.Generic; + + public class HttpResponse : IHttpResponse + { + public bool Succeeded { get; internal set; } + + public T Value { get; internal set; } + + public IDictionary Errors { get; internal set; } + = new Dictionary(); + + public string Message { get; internal set; } + } +} \ No newline at end of file diff --git a/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpClient.cs b/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpClient.cs new file mode 100644 index 00000000..7c817993 --- /dev/null +++ b/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpClient.cs @@ -0,0 +1,15 @@ +namespace LaaProduction.Http.Interfaces +{ + public interface IHttpClient + { + IHttpMessage Delete(string route); + + IHttpMessage Get(string route); + + IHttpMessage Options(string route); + + IHttpMessage Post(string url); + + IHttpMessage Put(string url); + } +} diff --git a/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpErrorResponse.cs b/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpErrorResponse.cs new file mode 100644 index 00000000..c79316f7 --- /dev/null +++ b/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpErrorResponse.cs @@ -0,0 +1,11 @@ +namespace LaaProduction.Http.Interfaces +{ + using System.Collections.Generic; + + public interface IHttpErrorResponse + { + IDictionary Errors { get; } + + string Message { get; } + } +} diff --git a/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpMessage.cs b/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpMessage.cs new file mode 100644 index 00000000..b426f4b4 --- /dev/null +++ b/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpMessage.cs @@ -0,0 +1,14 @@ +namespace LaaProduction.Http.Interfaces +{ + using System; + using System.Threading.Tasks; + + public interface IHttpMessage : IDisposable + { + IHttpMessage AuthorizeBearer(string parameter); + + Task> SendAsync(); + + IHttpMessage WhitJsonBody(object model); + } +} diff --git a/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpResponse[T].cs b/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpResponse[T].cs new file mode 100644 index 00000000..e8d24740 --- /dev/null +++ b/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpResponse[T].cs @@ -0,0 +1,9 @@ +namespace LaaProduction.Http.Interfaces +{ + public interface IHttpResponse : IHttpErrorResponse + { + bool Succeeded { get; } + + T Value { get; } + } +} diff --git a/LaaProductionWeb/LaaProduction.Shipment/LaaProduction.Shipment.csproj b/LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj similarity index 71% rename from LaaProductionWeb/LaaProduction.Shipment/LaaProduction.Shipment.csproj rename to LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj index 505eab6c..1599c1ad 100644 --- a/LaaProductionWeb/LaaProduction.Shipment/LaaProduction.Shipment.csproj +++ b/LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj @@ -4,11 +4,11 @@ Debug AnyCPU - {A487E02B-0E6C-4A98-84F6-4AF3E7B8E73B} + {197185D3-53B7-41A1-A099-CE9F85D5C8F9} Library Properties - LaaProduction.Shippment - LaaProduction.Shippment + LaaProduction.Http + LaaProduction.Http v4.8.1 512 true @@ -31,6 +31,9 @@ 4 + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + @@ -41,11 +44,17 @@ - - + + + + + + + + diff --git a/LaaProductionWeb/LaaProduction.Shipment/Properties/AssemblyInfo.cs b/LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs similarity index 84% rename from LaaProductionWeb/LaaProduction.Shipment/Properties/AssemblyInfo.cs rename to LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs index 98511f1f..8f887987 100644 --- a/LaaProductionWeb/LaaProduction.Shipment/Properties/AssemblyInfo.cs +++ b/LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs @@ -5,12 +5,12 @@ using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("LaaProduction.Shippment")] +[assembly: AssemblyTitle("LaaProduction.Http")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("LaaProduction.Shippment")] -[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyProduct("LaaProduction.Http")] +[assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -20,7 +20,7 @@ using System.Runtime.InteropServices; [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a487e02b-0e6c-4a98-84f6-4af3e7b8e73b")] +[assembly: Guid("197185d3-53b7-41a1-a099-ce9f85d5c8f9")] // Version information for an assembly consists of the following four values: // diff --git a/LaaProductionWeb/LaaProduction.Http/README.md b/LaaProductionWeb/LaaProduction.Http/README.md new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/LaaProductionWeb/LaaProduction.Http/README.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LaaProductionWeb/LaaProduction.Http/packages.config b/LaaProductionWeb/LaaProduction.Http/packages.config new file mode 100644 index 00000000..c865026e --- /dev/null +++ b/LaaProductionWeb/LaaProduction.Http/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/LaaProductionWeb/LaaProduction.Personalization.Updater/EmployeesRoles.cs b/LaaProductionWeb/LaaProduction.Personalization.Updater/EmployeesRoles.cs deleted file mode 100644 index e7c499c8..00000000 --- a/LaaProductionWeb/LaaProduction.Personalization.Updater/EmployeesRoles.cs +++ /dev/null @@ -1,63 +0,0 @@ - -namespace LaaProduction.Personalization -{ - public enum EmployeesRoles - { - AV_ABFRAGE_GEPRUEFTE, - AV_ABFRAGEN6SIGMA, - AV_ABGEBROCHENEPRUEFGAENGE, - AV_AUFTRAGPOSITION, - AV_AUFTRAGSTORNO, - AV_CDLWIN_VERWALTEN, - AV_EICHSCHEIN, - AV_eRegister, - AV_FEHLERGRENZEN, - AV_FERTIGMELDEN, - AV_FREMDGERAETE, - AV_LISTEPLOMBEN, - AV_LIZENZEN_VERWALTEN, - AV_MITTEILUNGEN, - AV_PREUFSTATAUSLAST, - AV_PRUEFERGEBNISSE, - AV_PRUEFERGEBNISSEUMSCHREIBEN, - AV_PRUEFFEHLER_FREIGABE, - AV_PRUEFPUNKTEAENDERN, - AV_RECHTE, - AV_REGULIERERINFOS, - AV_REPARATUR, - AV_RUECKLAEUFER, - AV_RZDATEN, - AV_RZFEHLER, - AV_SENSUSREAD_LESEN, - AV_SENSUSREAD_VERWALTEN, - AV_SENSUSREADLIZENZEN, - AV_SERIENDRUCK, - AV_SONDERAUFTRAEGE, - AV_SQL_1, - AV_SQL_4, - AV_SQL_7, - AV_SQL_8, - AV_SQLAbfragen, - AV_TERMINTREUE, - AV_TERMINVERZOEGERUNGEN, - AV_TREFFERQUOTE, - AV_VAKODECODE, - AV_VERSANDINFO, - AV_VORGANGSNR, - DRUCKPRUEFER, - eRegister_Freigabe, - PDA_EICHUNG, - PREUFSTATAUSLAST, - PROT_DRUCK_BEI_ABWEICHUNG, - PRUEFSTELLENLEITUNG, - SUPERUSER, - TEST, - WEB_Admin, - WEB_API, - WEB_Approvals, - WEB_Equipments, - WEB_QAP, - WEB_Reports, - WEB_Shipment, - } -} \ No newline at end of file diff --git a/LaaProductionWeb/LaaProduction.Personalization.Updater/LaaProduction.Personalization.Updater.csproj b/LaaProductionWeb/LaaProduction.Personalization.Updater/LaaProduction.Personalization.Updater.csproj deleted file mode 100644 index 88dd430d..00000000 --- a/LaaProductionWeb/LaaProduction.Personalization.Updater/LaaProduction.Personalization.Updater.csproj +++ /dev/null @@ -1,74 +0,0 @@ - - - - - Debug - AnyCPU - {4B7F1659-2A57-414C-A192-FA0A822B6612} - Exe - LaaProduction.Personalization.Updater - LaaProduction.Personalization.Updater - v4.8.1 - 512 - true - true - false - C:\Users\SZLATEV\source\repos\laa_production\LaaProductionWeb\LaaProduction.Personalization\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 - false - - - - \ No newline at end of file diff --git a/LaaProductionWeb/LaaProduction.Personalization.Updater/Program.cs b/LaaProductionWeb/LaaProduction.Personalization.Updater/Program.cs deleted file mode 100644 index 250488f0..00000000 --- a/LaaProductionWeb/LaaProduction.Personalization.Updater/Program.cs +++ /dev/null @@ -1,79 +0,0 @@ -namespace LaaProduction.Personalization.Updater -{ - using System; - using System.Collections.Generic; - using System.Data.SqlClient; - using System.IO; - using System.Linq; - - public class Program - { - public static void Main() - { - Console.WriteLine("Updating LaaProduction.Personalization ..."); - - var employeesRoles = new List(); - var softwareFunctions = new List(); - - using (var sqlConnection = new SqlConnection("Server=SLASQL01.emea.sensus.net; Database=Auftrag; Integrated Security=True;")) - { - sqlConnection.FireInfoMessageEventOnUserErrors = true; - sqlConnection.InfoMessage += (sender, args) - => Console.WriteLine(args.Message); - sqlConnection.Open(); - - using (var sqlCommand = sqlConnection.CreateCommand()) - { - sqlCommand.CommandText = "SELECT DISTINCT [Recht] FROM [MitarbeiterRechte] ORDER BY [Recht]"; - - using (var sqlReader = sqlCommand.ExecuteReader()) - { - while (sqlReader.Read()) - { - employeesRoles.Add(sqlReader.GetString(0)); - } - } - } - - using (var sqlCommand = sqlConnection.CreateCommand()) - { - sqlCommand.CommandText = "SELECT DISTINCT [Function] FROM [SoftwareFunctions] ORDER BY [Function]"; - - using (var sqlReader = sqlCommand.ExecuteReader()) - { - while (sqlReader.Read()) - { - softwareFunctions.Add(sqlReader.GetString(0)); - } - } - } - } - - var employeesRolesEnumContent = $@" -namespace LaaProduction.Personalization -{{ - public enum EmployeesRoles - {{ - {string.Join($"{Environment.NewLine}\t", employeesRoles.Select(x => $"{x},"))} - }} -}}"; - Console.WriteLine($"Update file: {employeesRolesEnumContent}"); - - var softwareFunctionsEnumContent = $@" -namespace LaaProduction.Personalization -{{ - public enum SoftwareFunctions - {{ - {string.Join($"{Environment.NewLine}\t", softwareFunctions.Select(x => $"{x},"))} - }} -}}"; - Console.WriteLine($"Update file: {softwareFunctionsEnumContent}"); - Console.WriteLine($"Update directory: {Environment.CurrentDirectory}"); - - File.WriteAllText("..\\..\\SoftwareFunctions.cs", softwareFunctionsEnumContent); - File.WriteAllText("..\\..\\EmployeesRoles.cs", employeesRolesEnumContent); - - Console.ReadKey(); - } - } -} diff --git a/LaaProductionWeb/LaaProduction.Personalization.Updater/Properties/AssemblyInfo.cs b/LaaProductionWeb/LaaProduction.Personalization.Updater/Properties/AssemblyInfo.cs deleted file mode 100644 index 52692cbd..00000000 --- a/LaaProductionWeb/LaaProduction.Personalization.Updater/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("LaaProduction.Personalization.Updater")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("LaaProduction.Personalization.Updater")] -[assembly: AssemblyCopyright("Copyright © 2023")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("4b7f1659-2a57-414c-a192-fa0a822b6612")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/LaaProductionWeb/LaaProduction.Personalization.Updater/SoftwareFunctions.cs b/LaaProductionWeb/LaaProduction.Personalization.Updater/SoftwareFunctions.cs deleted file mode 100644 index 9636b271..00000000 --- a/LaaProductionWeb/LaaProduction.Personalization.Updater/SoftwareFunctions.cs +++ /dev/null @@ -1,26 +0,0 @@ - -namespace LaaProduction.Personalization -{ - public enum SoftwareFunctions - { - DEV_FILE_CONTROL, - DEV_FILE_SPLIT, - DEV_LEGACY_TEST_APP, - DEV_LOW_LEVEL_TOOLS, - GENERAL_ALARM, - GENERAL_FIRMWARE_UPDATE, - GENERAL_LUT_MANAGEMENT, - GENERAL_LUT_UPDATE, - GENERAL_PRESSURE_LOG, - GENERAL_PULS_CONFIG, - GENERAL_REGISTER_STORE, - GENERAL_SETUP, - GENERAL_STREAM_QUALITY, - GENERAL_TEMP_METER, - LAA_MAPPING_NA, - LAA_PARAMETERIZATION, - LAA_PASSWORD, - LAA_PROCESS_PARAMETER, - LAA_REGISTER_HISTORY, - } -} \ No newline at end of file diff --git a/LaaProductionWeb/LaaProduction.Shipment/Interfaces/IShipmentManager.cs b/LaaProductionWeb/LaaProduction.Shipment/Interfaces/IShipmentManager.cs deleted file mode 100644 index 6dd2326d..00000000 --- a/LaaProductionWeb/LaaProduction.Shipment/Interfaces/IShipmentManager.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace LaaProduction.Shipment.Interfaces -{ - public interface IShipmentManager - { - } -} diff --git a/LaaProductionWeb/LaaProduction.Shipment/README.md b/LaaProductionWeb/LaaProduction.Shipment/README.md deleted file mode 100644 index b3a86ff8..00000000 --- a/LaaProductionWeb/LaaProduction.Shipment/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Database table dependencies ---- -[Auftrag].[dbo].[PalettenScan] -... -[Auftrag].[dbo].[AuftragPosition] -[Auftrag].[dbo].[PalettenScan] \ No newline at end of file diff --git a/LaaProductionWeb/LaaProduction.Shipment/ShipmentManager.cs b/LaaProductionWeb/LaaProduction.Shipment/ShipmentManager.cs deleted file mode 100644 index 0457c64f..00000000 --- a/LaaProductionWeb/LaaProduction.Shipment/ShipmentManager.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace LaaProduction.Shipment -{ - using LaaProduction.Shipment.Interfaces; - - public class ShipmentManager : IShipmentManager - { - } -} diff --git a/LaaProductionWeb/LaaProductionWeb.sln b/LaaProductionWeb/LaaProductionWeb.sln index 577b632f..d69038b1 100644 --- a/LaaProductionWeb/LaaProductionWeb.sln +++ b/LaaProductionWeb/LaaProductionWeb.sln @@ -7,16 +7,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProduction.Services", "L EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProduction.Personalization", "LaaProduction.Personalization\LaaProduction.Personalization.csproj", "{4C17FD42-7002-431A-8D6E-C57DD7D7C2D2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProduction.Shipment", "LaaProduction.Shipment\LaaProduction.Shipment.csproj", "{A487E02B-0E6C-4A98-84F6-4AF3E7B8E73B}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProduction.Search", "LaaProduction.Search\LaaProduction.Search.csproj", "{23C6F8CD-2A91-4444-A828-6A0B5B942520}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProduction.Personalization.Updater", "LaaProduction.Personalization.Updater\LaaProduction.Personalization.Updater.csproj", "{4B7F1659-2A57-414C-A192-FA0A822B6612}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProduction.SharedModels", "LaaProduction.SharedModels\LaaProduction.SharedModels.csproj", "{0BF77588-2684-459D-8C71-DBBC6B05E9EE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProductionWeb", "LaaProductionWeb\LaaProductionWeb.csproj", "{DBBFBA08-138C-4115-85F6-FE6DA4E190AC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProduction.Http", "LaaProduction.Http\LaaProduction.Http.csproj", "{197185D3-53B7-41A1-A099-CE9F85D5C8F9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -31,18 +29,10 @@ Global {4C17FD42-7002-431A-8D6E-C57DD7D7C2D2}.Debug|Any CPU.Build.0 = Debug|Any CPU {4C17FD42-7002-431A-8D6E-C57DD7D7C2D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {4C17FD42-7002-431A-8D6E-C57DD7D7C2D2}.Release|Any CPU.Build.0 = Release|Any CPU - {A487E02B-0E6C-4A98-84F6-4AF3E7B8E73B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A487E02B-0E6C-4A98-84F6-4AF3E7B8E73B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A487E02B-0E6C-4A98-84F6-4AF3E7B8E73B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A487E02B-0E6C-4A98-84F6-4AF3E7B8E73B}.Release|Any CPU.Build.0 = Release|Any CPU {23C6F8CD-2A91-4444-A828-6A0B5B942520}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23C6F8CD-2A91-4444-A828-6A0B5B942520}.Debug|Any CPU.Build.0 = Debug|Any CPU {23C6F8CD-2A91-4444-A828-6A0B5B942520}.Release|Any CPU.ActiveCfg = Release|Any CPU {23C6F8CD-2A91-4444-A828-6A0B5B942520}.Release|Any CPU.Build.0 = Release|Any CPU - {4B7F1659-2A57-414C-A192-FA0A822B6612}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4B7F1659-2A57-414C-A192-FA0A822B6612}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4B7F1659-2A57-414C-A192-FA0A822B6612}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4B7F1659-2A57-414C-A192-FA0A822B6612}.Release|Any CPU.Build.0 = Release|Any CPU {0BF77588-2684-459D-8C71-DBBC6B05E9EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0BF77588-2684-459D-8C71-DBBC6B05E9EE}.Debug|Any CPU.Build.0 = Debug|Any CPU {0BF77588-2684-459D-8C71-DBBC6B05E9EE}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -51,6 +41,10 @@ Global {DBBFBA08-138C-4115-85F6-FE6DA4E190AC}.Debug|Any CPU.Build.0 = Debug|Any CPU {DBBFBA08-138C-4115-85F6-FE6DA4E190AC}.Release|Any CPU.ActiveCfg = Release|Any CPU {DBBFBA08-138C-4115-85F6-FE6DA4E190AC}.Release|Any CPU.Build.0 = Release|Any CPU + {197185D3-53B7-41A1-A099-CE9F85D5C8F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {197185D3-53B7-41A1-A099-CE9F85D5C8F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {197185D3-53B7-41A1-A099-CE9F85D5C8F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {197185D3-53B7-41A1-A099-CE9F85D5C8F9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/LaaProductionWeb/LaaProductionWeb/Controllers/HomeController.cs b/LaaProductionWeb/LaaProductionWeb/Controllers/HomeController.cs index 50f7867e..d2d4be2c 100644 --- a/LaaProductionWeb/LaaProductionWeb/Controllers/HomeController.cs +++ b/LaaProductionWeb/LaaProductionWeb/Controllers/HomeController.cs @@ -1,6 +1,6 @@ namespace LaaProductionWeb.Controllers { - using LaaProductionHttp.Interfaces; + using LaaProduction.Http.Interfaces; using LaaProductionWeb.App_Infrastructure; using LaaProductionDI; diff --git a/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj b/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj index 7f46e95d..354cdd22 100644 --- a/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj +++ b/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj @@ -294,6 +294,10 @@ + + {197185D3-53B7-41A1-A099-CE9F85D5C8F9} + LaaProduction.Http + {4c17fd42-7002-431a-8d6e-c57dd7d7c2d2} LaaProduction.Personalization From 2b85c6877a1354cf2f41a749ff509e1697a86e14 Mon Sep 17 00:00:00 2001 From: Stoyan Zlatev Date: Thu, 8 Feb 2024 16:55:57 +0100 Subject: [PATCH 9/9] sync before branch changing --- .../{ADLoginModel.cs => LDAPLoginModel.cs} | 2 +- .../Infrastructure/{SoftwareUser.cs => LDAPUser.cs} | 0 Common/Ui/GenesisToolBox/Infrastructure/Software.cs | 6 +++--- .../LaaProduction.Personalization/AccountManager.cs | 2 +- .../Interfaces/IAccountManager.cs | 2 +- .../{ADLoginModel.cs => LDAPLoginModel.cs} | 10 +++++++++- .../LaaProduction.SharedModels.csproj | 3 ++- .../LaaProduction.SharedModels/UserLoginModel.cs | 5 +++++ .../LaaProductionWeb/API/APIExtensions.cs | 12 +++++++----- .../LaaProductionWeb/API/LoginController.cs | 12 +++++++++++- .../API/Search/WildcardController.cs | 2 +- .../LaaProductionWeb/LaaProductionWeb.csproj | 3 --- 12 files changed, 41 insertions(+), 18 deletions(-) rename Common/Ui/GenesisToolBox/Infrastructure/{ADLoginModel.cs => LDAPLoginModel.cs} (94%) rename Common/Ui/GenesisToolBox/Infrastructure/{SoftwareUser.cs => LDAPUser.cs} (100%) rename LaaProductionWeb/LaaProduction.SharedModels/{ADLoginModel.cs => LDAPLoginModel.cs} (71%) diff --git a/Common/Ui/GenesisToolBox/Infrastructure/ADLoginModel.cs b/Common/Ui/GenesisToolBox/Infrastructure/LDAPLoginModel.cs similarity index 94% rename from Common/Ui/GenesisToolBox/Infrastructure/ADLoginModel.cs rename to Common/Ui/GenesisToolBox/Infrastructure/LDAPLoginModel.cs index 76460c73..376ee6ac 100644 --- a/Common/Ui/GenesisToolBox/Infrastructure/ADLoginModel.cs +++ b/Common/Ui/GenesisToolBox/Infrastructure/LDAPLoginModel.cs @@ -1,6 +1,6 @@ namespace Xylem.Common.Ui.GenesisToolBox.Infrastructure { - internal class ADLoginModel + internal class LDAPLoginModel { public string Assembly { get; set; } diff --git a/Common/Ui/GenesisToolBox/Infrastructure/SoftwareUser.cs b/Common/Ui/GenesisToolBox/Infrastructure/LDAPUser.cs similarity index 100% rename from Common/Ui/GenesisToolBox/Infrastructure/SoftwareUser.cs rename to Common/Ui/GenesisToolBox/Infrastructure/LDAPUser.cs diff --git a/Common/Ui/GenesisToolBox/Infrastructure/Software.cs b/Common/Ui/GenesisToolBox/Infrastructure/Software.cs index b693e18f..473e603d 100644 --- a/Common/Ui/GenesisToolBox/Infrastructure/Software.cs +++ b/Common/Ui/GenesisToolBox/Infrastructure/Software.cs @@ -29,7 +29,7 @@ var version = SoftwareVersion.Current; var user = new LDAPUser(); - Login(new ADLoginModel + Login(new LDAPLoginModel { Assembly = version.AssemblyName.Name, Email = user.Email, @@ -47,8 +47,8 @@ /// /// Sends login request and obtains an bearer authorization token. /// - /// - containing all software and user info required for authentication. - public static void Login(ADLoginModel model) + /// - containing all software and user info required for authentication. + public static void Login(LDAPLoginModel model) { var authenticationResponse = LocalWebRequest.PostRequestAndGetResponseAsync( url: $"{ServiceUrls.LaaProductionAPI}/LaaProductionWeb/API/Login/AD", diff --git a/LaaProductionWeb/LaaProduction.Personalization/AccountManager.cs b/LaaProductionWeb/LaaProduction.Personalization/AccountManager.cs index 50920478..de18c6c5 100644 --- a/LaaProductionWeb/LaaProduction.Personalization/AccountManager.cs +++ b/LaaProductionWeb/LaaProduction.Personalization/AccountManager.cs @@ -75,7 +75,7 @@ return new ClaimsPrincipal(claimsIdentity); } - public string Login(ADLoginModel model) + public string Login(LDAPLoginModel model) { var softwareId = this.GetOrCreateSoftwareId( model.Assembly, diff --git a/LaaProductionWeb/LaaProduction.Personalization/Interfaces/IAccountManager.cs b/LaaProductionWeb/LaaProduction.Personalization/Interfaces/IAccountManager.cs index 8ad6fe94..21e5405b 100644 --- a/LaaProductionWeb/LaaProduction.Personalization/Interfaces/IAccountManager.cs +++ b/LaaProductionWeb/LaaProduction.Personalization/Interfaces/IAccountManager.cs @@ -8,7 +8,7 @@ { IPrincipal GetClaimsPrincipal(string token); - string Login(ADLoginModel model); + string Login(LDAPLoginModel model); string Login(UserLoginModel model); diff --git a/LaaProductionWeb/LaaProduction.SharedModels/ADLoginModel.cs b/LaaProductionWeb/LaaProduction.SharedModels/LDAPLoginModel.cs similarity index 71% rename from LaaProductionWeb/LaaProduction.SharedModels/ADLoginModel.cs rename to LaaProductionWeb/LaaProduction.SharedModels/LDAPLoginModel.cs index 66c9c357..795efc91 100644 --- a/LaaProductionWeb/LaaProduction.SharedModels/ADLoginModel.cs +++ b/LaaProductionWeb/LaaProduction.SharedModels/LDAPLoginModel.cs @@ -1,7 +1,10 @@ namespace LaaProduction.SharedModels { - public class ADLoginModel + using System.ComponentModel.DataAnnotations; + + public class LDAPLoginModel { + [Required] public string Assembly { get; set; } public int MajorV { get; set; } @@ -12,14 +15,19 @@ public int EmployeeId { get; set; } + [Required] public string FirstName { get; set; } + [Required] public string LastName { get; set; } + [Required] public string Username { get; set; } + [Required] public string Phone { get; set; } + [Required] public string Email { get; set; } } } diff --git a/LaaProductionWeb/LaaProduction.SharedModels/LaaProduction.SharedModels.csproj b/LaaProductionWeb/LaaProduction.SharedModels/LaaProduction.SharedModels.csproj index b6589ad5..d877d769 100644 --- a/LaaProductionWeb/LaaProduction.SharedModels/LaaProduction.SharedModels.csproj +++ b/LaaProductionWeb/LaaProduction.SharedModels/LaaProduction.SharedModels.csproj @@ -37,6 +37,7 @@ + @@ -46,7 +47,7 @@ - + diff --git a/LaaProductionWeb/LaaProduction.SharedModels/UserLoginModel.cs b/LaaProductionWeb/LaaProduction.SharedModels/UserLoginModel.cs index b677736e..e2a37684 100644 --- a/LaaProductionWeb/LaaProduction.SharedModels/UserLoginModel.cs +++ b/LaaProductionWeb/LaaProduction.SharedModels/UserLoginModel.cs @@ -1,7 +1,10 @@ namespace LaaProduction.SharedModels { + using System.ComponentModel.DataAnnotations; + public class UserLoginModel { + [Required] public string Assembly { get; set; } public int MajorV { get; set; } @@ -10,8 +13,10 @@ public int BuildV { get; set; } + [Required] public string Username { get; set; } + [Required] public string Password { get; set; } } } diff --git a/LaaProductionWeb/LaaProductionWeb/API/APIExtensions.cs b/LaaProductionWeb/LaaProductionWeb/API/APIExtensions.cs index 67ea5b8c..fb6ae352 100644 --- a/LaaProductionWeb/LaaProductionWeb/API/APIExtensions.cs +++ b/LaaProductionWeb/LaaProductionWeb/API/APIExtensions.cs @@ -5,14 +5,11 @@ using System; using System.Collections.Generic; using System.Linq; - using System.Text; - using System.Web.Http; using System.Web.Http.ModelBinding; - using System.Web.Http.Results; internal static class APIExtensions { - public static string Content(this ModelStateDictionary modelStateDictionary) + public static object Errors(this ModelStateDictionary modelStateDictionary) { var errors = new Dictionary(); @@ -35,7 +32,12 @@ } } - return JsonConvert.SerializeObject(errors, Formatting.Indented); + return errors; + } + + public static string ErrorsJson(this ModelStateDictionary modelStateDictionary) + { + return JsonConvert.SerializeObject(modelStateDictionary.Errors(), Formatting.Indented); } } } \ No newline at end of file diff --git a/LaaProductionWeb/LaaProductionWeb/API/LoginController.cs b/LaaProductionWeb/LaaProductionWeb/API/LoginController.cs index 2239899b..4fb6740c 100644 --- a/LaaProductionWeb/LaaProductionWeb/API/LoginController.cs +++ b/LaaProductionWeb/LaaProductionWeb/API/LoginController.cs @@ -27,8 +27,13 @@ [HttpPost] [Route(nameof(AD))] - public IHttpActionResult AD([FromBody] ADLoginModel model) + public IHttpActionResult AD([FromBody] LDAPLoginModel model) { + if (!this.ModelState.IsValid) + { + return this.BadRequest(this.ModelState.ErrorsJson()); + } + var bearer = this.accountManager.Login(model); return this.Json(bearer); @@ -38,6 +43,11 @@ [Route(nameof(Local))] public IHttpActionResult Local([FromBody] UserLoginModel model) { + if (!this.ModelState.IsValid) + { + return this.BadRequest(this.ModelState.ErrorsJson()); + } + var bearer = this.accountManager.Login(model); return this.Json(bearer); diff --git a/LaaProductionWeb/LaaProductionWeb/API/Search/WildcardController.cs b/LaaProductionWeb/LaaProductionWeb/API/Search/WildcardController.cs index 441c773d..2097d23b 100644 --- a/LaaProductionWeb/LaaProductionWeb/API/Search/WildcardController.cs +++ b/LaaProductionWeb/LaaProductionWeb/API/Search/WildcardController.cs @@ -41,7 +41,7 @@ { return this.ResponseMessage(new HttpResponseMessage { - Content = new StringContent(this.ModelState.Content()), + Content = new StringContent(this.ModelState.ErrorsJson()), RequestMessage = this.Request, StatusCode = HttpStatusCode.BadRequest, Version = this.Request.Version diff --git a/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj b/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj index 354cdd22..2ddede65 100644 --- a/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj +++ b/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj @@ -48,9 +48,6 @@ ..\packages\LaaProductionDI.1.0.4\lib\netstandard2.0\LaaProductionDI.dll - - ..\packages\LaaProductionHttp.1.0.4\lib\netstandard2.0\LaaProductionHttp.dll - ..\packages\LaaProductionSMTP.1.0.4\lib\netstandard2.0\LaaProductionSMTP.dll