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)