diff --git a/Common/.shared/SharedAssemblyInfo.cs b/Common/.shared/SharedAssemblyInfo.cs index 62f0cb85..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.7.*")] -[assembly: AssemblyFileVersion("2.6.7.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.6.8.*")] +[assembly: AssemblyFileVersion("2.6.8.0")] \ No newline at end of file diff --git a/Common/CommonCore/Common.Abstraction/Common.Abstraction.csproj b/Common/CommonCore/Common.Abstraction/Common.Abstraction.csproj index 2a21bd41..04a4defc 100644 --- a/Common/CommonCore/Common.Abstraction/Common.Abstraction.csproj +++ b/Common/CommonCore/Common.Abstraction/Common.Abstraction.csproj @@ -4,12 +4,21 @@ Debug AnyCPU +<<<<<<<< HEAD:Common/CommonCore/Common.Abstraction/Common.Abstraction.csproj {1743B349-E347-4DCF-A106-15AE3F95C3A3} Library Properties Common.Abstraction Common.Abstraction v4.5 +======== + {197185D3-53B7-41A1-A099-CE9F85D5C8F9} + Library + Properties + LaaProduction.Http + LaaProduction.Http + v4.8.1 +>>>>>>>> main:LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj 512 true @@ -31,6 +40,9 @@ 4 + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + @@ -41,10 +53,25 @@ +<<<<<<<< HEAD:Common/CommonCore/Common.Abstraction/Common.Abstraction.csproj +======== + + + + + + + + + + + + +>>>>>>>> main:LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj \ No newline at end of file diff --git a/Common/CommonCore/Common.Abstraction/Properties/AssemblyInfo.cs b/Common/CommonCore/Common.Abstraction/Properties/AssemblyInfo.cs index fbb92683..a4f643b4 100644 --- a/Common/CommonCore/Common.Abstraction/Properties/AssemblyInfo.cs +++ b/Common/CommonCore/Common.Abstraction/Properties/AssemblyInfo.cs @@ -5,12 +5,21 @@ 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. +<<<<<<<< HEAD:Common/CommonCore/Common.Abstraction/Properties/AssemblyInfo.cs [assembly: AssemblyTitle("Common.Abstraction")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Common.Abstraction")] [assembly: AssemblyCopyright("Copyright © 2023")] +======== +[assembly: AssemblyTitle("LaaProduction.Http")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("LaaProduction.Http")] +[assembly: AssemblyCopyright("Copyright © 2024")] +>>>>>>>> main:LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -20,7 +29,11 @@ using System.Runtime.InteropServices; [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM +<<<<<<<< HEAD:Common/CommonCore/Common.Abstraction/Properties/AssemblyInfo.cs [assembly: Guid("1743b349-e347-4dcf-a106-15ae3f95c3a3")] +======== +[assembly: Guid("197185d3-53b7-41a1-a099-ce9f85d5c8f9")] +>>>>>>>> main:LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs // Version information for an assembly consists of the following four values: // diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/RegisterRestorer.cs index 1865b93c..516d1785 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,45 +29,43 @@ 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 /// - private readonly MeterRegisters _restoreRegisters = new MeterRegisters(); + private readonly MeterRegisters _recoveryRegisters = new MeterRegisters(); /// /// Register access event for message dispatcher to caller /// 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,70 @@ 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 }; /// /// 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 }) }; + /// + /// + /// + // 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 /// - 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 }), + // 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 // 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 }), + // trigger idle 0 releases the display to normal operation + 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 }), + new RecoveryRegisterItem("CUSTOMER_RebootCount", new Byte[] {0x00}) }; /// - /// Actual Port Counter + /// Actual register counter /// public Int32 ActualRegisterCtr; @@ -179,9 +197,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 +227,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 +281,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 +341,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 +375,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 || @@ -361,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) @@ -370,14 +411,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 + // add EOL (shipping reset of accumulators, alarms and setup of manufacturing date) if (eolProgramming) + { finalizeProgrammingAll.AddRange(_finalizeProgrammingEol); + } + // standard end of programming sequence finalizeProgrammingAll.AddRange(_finalizeProgramming); @@ -396,15 +440,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,22 +482,26 @@ 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 { 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) { _currentGenesis.WriteLog("Could not replace register value of " + recReg.RegisterIdent + "; " + ex.Message); - // nothing to do } finally { @@ -483,15 +531,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 +567,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,19 +594,23 @@ 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 || - _restoreRegisters == null || + _recoveryRegisters == null || _finalReadRegisters == null) return false; 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(); + 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))) { @@ -570,14 +626,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 @@ -661,6 +717,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore strRequiredRegisterValue += $" - {Resources.StrMeterValue}: ({strReadBackRegisterValue})" + $" - {Resources.StrRegisterCompareFailed}"; + _failedComparisonRegisters?.Add(new RecoveryRegisterItem(regName, restorableRawRegister, + finalReadRawRegister)); retVal = false; } } @@ -728,23 +786,19 @@ 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, 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); } @@ -785,13 +839,83 @@ 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()) + return false; + + // log to report file the initial register read string + OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs($@"{Resources.StrReadRegister}", 0, + Resources.StrReadRegistersBeforeUpdate)); + + return ReadRegistersSet(_initialReadRegisters, _recoveryRegisters); + } + + /// + /// 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; + + _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)) + 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! + foreach (var reg in _initialReadRegisters.MeterRegisterDic.Where(r => + r.Key.RestoreCapability.CheckRestoreCapability() && + r.Key.RegisterDetail.Privilege.Lvl8 == Access.RW)) + { + _recoveryRegisters.MeterRegisterDic.TryAdd(reg.Key, reg.Value); + _recoveryRegisterList.Add(reg.Key.GetIdent()); + } + _recoveryRegisterList.Sort(); + + // 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; + } + + /// + /// 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 . + /// + private 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(); @@ -803,23 +927,10 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore && 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); + registers.MeterRegisterDic.TryAdd(reg.Key, reg.Value); } - // 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! - foreach (var reg in _initialReadRegisters.MeterRegisterDic.Where(r => - r.Key.RestoreCapability.CheckRestoreCapability() && - r.Key.RegisterDetail.Privilege.Lvl8 == Access.RW)) - { - _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 ReadRegistersSet(_initialReadRegisters, _restoreRegisters); + 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/OmniPlus/OmniPlus/Properties/AssemblyInfo.cs b/Common/OmniPlus/OmniPlus/Properties/AssemblyInfo.cs deleted file mode 100644 index 4677159c..00000000 --- a/Common/OmniPlus/OmniPlus/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("OmniPlus")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("OmniPlus")] -[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("f8d84b9a-0fcf-4083-b067-8c39b7314152")] - -// 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/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/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.Http/Interfaces/IHttpClient.cs b/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpClient.cs index e421f4c8..7c817993 100644 --- a/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpClient.cs +++ b/LaaProductionWeb/LaaProduction.Http/Interfaces/IHttpClient.cs @@ -10,6 +10,6 @@ IHttpMessage Post(string url); - IHttpMessage Put(string route); + IHttpMessage Put(string url); } } diff --git a/LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj b/LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj index 64cc9a27..04a4defc 100644 --- a/LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj +++ b/LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj @@ -4,12 +4,21 @@ Debug AnyCPU - {EB19F145-1E59-47A4-957A-E287497227B9} +<<<<<<<< HEAD:Common/CommonCore/Common.Abstraction/Common.Abstraction.csproj + {1743B349-E347-4DCF-A106-15AE3F95C3A3} + Library + Properties + Common.Abstraction + Common.Abstraction + v4.5 +======== + {197185D3-53B7-41A1-A099-CE9F85D5C8F9} Library Properties LaaProduction.Http LaaProduction.Http v4.8.1 +>>>>>>>> main:LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj 512 true @@ -44,6 +53,12 @@ +<<<<<<<< HEAD:Common/CommonCore/Common.Abstraction/Common.Abstraction.csproj + + + + +======== @@ -56,6 +71,7 @@ +>>>>>>>> main:LaaProductionWeb/LaaProduction.Http/LaaProduction.Http.csproj \ No newline at end of file diff --git a/LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs b/LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs index 9d1be980..a4f643b4 100644 --- a/LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs +++ b/LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs @@ -5,12 +5,21 @@ 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. +<<<<<<<< HEAD:Common/CommonCore/Common.Abstraction/Properties/AssemblyInfo.cs +[assembly: AssemblyTitle("Common.Abstraction")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Common.Abstraction")] +[assembly: AssemblyCopyright("Copyright © 2023")] +======== [assembly: AssemblyTitle("LaaProduction.Http")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("LaaProduction.Http")] [assembly: AssemblyCopyright("Copyright © 2024")] +>>>>>>>> main:LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -20,7 +29,11 @@ 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("eb19f145-1e59-47a4-957a-e287497227b9")] +<<<<<<<< HEAD:Common/CommonCore/Common.Abstraction/Properties/AssemblyInfo.cs +[assembly: Guid("1743b349-e347-4dcf-a106-15ae3f95c3a3")] +======== +[assembly: Guid("197185d3-53b7-41a1-a099-ce9f85d5c8f9")] +>>>>>>>> main:LaaProductionWeb/LaaProduction.Http/Properties/AssemblyInfo.cs // Version information for an assembly consists of the following four values: // diff --git a/LaaProductionWeb/LaaProduction.Personalization/AccountManager.cs b/LaaProductionWeb/LaaProduction.Personalization/AccountManager.cs index 83223845..b397682d 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 88% rename from LaaProductionWeb/LaaProduction.SharedModels/ADLoginModel.cs rename to LaaProductionWeb/LaaProduction.SharedModels/LDAPLoginModel.cs index dc4f07bf..795efc91 100644 --- a/LaaProductionWeb/LaaProduction.SharedModels/ADLoginModel.cs +++ b/LaaProductionWeb/LaaProduction.SharedModels/LDAPLoginModel.cs @@ -2,7 +2,7 @@ { using System.ComponentModel.DataAnnotations; - public class ADLoginModel + public class LDAPLoginModel { [Required] public string Assembly { get; set; } @@ -13,7 +13,6 @@ public int BuildV { get; set; } - [Range(1, int.MaxValue)] public int EmployeeId { get; set; } [Required] @@ -24,9 +23,11 @@ [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 5683ef1a..d877d769 100644 --- a/LaaProductionWeb/LaaProduction.SharedModels/LaaProduction.SharedModels.csproj +++ b/LaaProductionWeb/LaaProduction.SharedModels/LaaProduction.SharedModels.csproj @@ -47,7 +47,7 @@ - + diff --git a/LaaProductionWeb/LaaProductionWeb.sln b/LaaProductionWeb/LaaProductionWeb.sln index 8f576f7f..d69038b1 100644 --- a/LaaProductionWeb/LaaProductionWeb.sln +++ b/LaaProductionWeb/LaaProductionWeb.sln @@ -13,7 +13,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProduction.SharedModels" 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", "{EB19F145-1E59-47A4-957A-E287497227B9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProduction.Http", "LaaProduction.Http\LaaProduction.Http.csproj", "{197185D3-53B7-41A1-A099-CE9F85D5C8F9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -41,10 +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 - {EB19F145-1E59-47A4-957A-E287497227B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EB19F145-1E59-47A4-957A-E287497227B9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EB19F145-1E59-47A4-957A-E287497227B9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EB19F145-1E59-47A4-957A-E287497227B9}.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/API/APIExtensions.cs b/LaaProductionWeb/LaaProductionWeb/API/APIExtensions.cs index 3a025b03..fb6ae352 100644 --- a/LaaProductionWeb/LaaProductionWeb/API/APIExtensions.cs +++ b/LaaProductionWeb/LaaProductionWeb/API/APIExtensions.cs @@ -9,7 +9,7 @@ internal static class APIExtensions { - public static string Content(this ModelStateDictionary modelStateDictionary) + public static object Errors(this ModelStateDictionary modelStateDictionary) { var errors = new Dictionary(); @@ -32,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 be9bf694..4fb6740c 100644 --- a/LaaProductionWeb/LaaProductionWeb/API/LoginController.cs +++ b/LaaProductionWeb/LaaProductionWeb/API/LoginController.cs @@ -27,44 +27,30 @@ [HttpPost] [Route(nameof(AD))] - public IHttpActionResult AD([FromBody] ADLoginModel model) + public IHttpActionResult AD([FromBody] LDAPLoginModel model) { - if (this.ModelState.IsValid) + if (!this.ModelState.IsValid) { - var bearer = this.accountManager.Login(model); - - return this.Json(bearer); + return this.BadRequest(this.ModelState.ErrorsJson()); } - return this.BadRequest(this.ModelState); + var bearer = this.accountManager.Login(model); + + return this.Json(bearer); } [HttpPost] [Route(nameof(Local))] public IHttpActionResult Local([FromBody] UserLoginModel model) { - if (this.ModelState.IsValid) + if (!this.ModelState.IsValid) { - var bearer = this.accountManager.Login(model); - - return this.Json(bearer); + return this.BadRequest(this.ModelState.ErrorsJson()); } - return this.BadRequest(this.ModelState); - } + var bearer = this.accountManager.Login(model); - [HttpPost] - [Route(nameof(New))] - public IHttpActionResult New([FromBody] UserLoginModel model) - { - if (this.ModelState.IsValid) - { - var bearer = this.accountManager.Login(model); - - return this.Json(bearer); - } - - return this.BadRequest(this.ModelState); + 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 2237b8e1..2ddede65 100644 --- a/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj +++ b/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj @@ -45,9 +45,6 @@ 4 - - ..\..\Common\ExchangeHub\bin\Debug\ExchangeHub.dll - ..\packages\LaaProductionDI.1.0.4\lib\netstandard2.0\LaaProductionDI.dll @@ -94,6 +91,9 @@ ..\packages\Owin.1.0\lib\net40\Owin.dll + + ..\..\Common\SIRTBroadcaster.Abstraction\bin\Debug\SIRTBroadcaster.Abstraction.dll + ..\packages\Swashbuckle.Core.5.6.0\lib\net40\Swashbuckle.Core.dll @@ -173,8 +173,6 @@ - - @@ -185,7 +183,6 @@ - @@ -219,11 +216,11 @@ - + Global.asax - + @@ -239,7 +236,6 @@ - Designer @@ -262,7 +258,6 @@ - @@ -294,12 +289,10 @@ - - - {EB19F145-1E59-47A4-957A-E287497227B9} + {197185D3-53B7-41A1-A099-CE9F85D5C8F9} LaaProduction.Http diff --git a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.cs index 66487988..bf8d3962 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, 1200); + 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, 1200); + 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, 1200); + 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, 1200); + 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, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, hugeTimeoutDbRequest); if (string.IsNullOrEmpty(requestResponse)) { DbIsConnected = false; @@ -848,7 +861,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, 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, 1200); + 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, 1200); + var requestResponse = LocalWebRequest.GetRequest(url, 5000); 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, 1200); + 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, 1200); + 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, 1200); + 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 0fa5b422..2328bd7b 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 = 5; + //fwUpdateSafe.License.Build = 6; //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); 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)