diff --git a/Common/Common.sln b/Common/Common.sln index 05f7ea5b..5ab24fde 100644 --- a/Common/Common.sln +++ b/Common/Common.sln @@ -151,6 +151,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamicStremingLogAnalyzer" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenesisStatus", "Hardware\WaterMeter\Genesis\GenesisStatus\GenesisStatus.csproj", "{0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProductionService", "Service\ProductionService\ProductionService.csproj", "{35726BCF-975C-4B49-BEFA-C00D90394F1D}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution Utils\DateTimeServerShared\DateTimeServerShared.projitems*{4806d89a-fbfb-41bc-aaa7-2242444bf55a}*SharedItemsImports = 4 @@ -3449,6 +3451,70 @@ Global {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.XP32bit|x64.Build.0 = Release|Any CPU {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.XP32bit|x86.ActiveCfg = Release|Any CPU {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.XP32bit|x86.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.COM|Any CPU.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.COM|Any CPU.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.COM|Mixed Platforms.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.COM|Mixed Platforms.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.COM|x64.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.COM|x64.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.COM|x86.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.COM|x86.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Debug|x64.ActiveCfg = Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Debug|x64.Build.0 = Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Debug|x86.ActiveCfg = Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Debug|x86.Build.0 = Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.GenesisDisplayTool_V01|Any CPU.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.GenesisDisplayTool_V01|x64.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.GenesisDisplayTool_V01|x64.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.GenesisDisplayTool_V01|x86.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.GenesisDisplayTool_V01|x86.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.PerformTest|Any CPU.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.PerformTest|Any CPU.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.PerformTest|Mixed Platforms.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.PerformTest|Mixed Platforms.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.PerformTest|x64.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.PerformTest|x64.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.PerformTest|x86.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.PerformTest|x86.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Release|Any CPU.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Release|x64.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Release|x64.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Release|x86.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.Release|x86.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|x64.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|x64.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|x86.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|x86.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|Any CPU.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|x64.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|x64.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|x86.ActiveCfg = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -3516,6 +3582,7 @@ Global {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39} = {03D4F23E-7E4A-4091-BC96-036C996D351A} {652ECA13-A411-4789-8814-6823965947CB} = {03D4F23E-7E4A-4091-BC96-036C996D351A} {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F} = {B5F43F61-4448-4992-85B5-7EDFB82FD643} + {35726BCF-975C-4B49-BEFA-C00D90394F1D} = {696A94BE-7237-4AE2-9E36-6059DE519971} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4BCB7B69-696C-436A-86F7-C91EA5588164} diff --git a/Common/CordonelAssemblyLine/Model/PickingModel.cs b/Common/CordonelAssemblyLine/Model/PickingModel.cs index bf7aaa6b..f51a9f00 100644 --- a/Common/CordonelAssemblyLine/Model/PickingModel.cs +++ b/Common/CordonelAssemblyLine/Model/PickingModel.cs @@ -243,14 +243,14 @@ namespace CordonelAssemblyLine.Model } } - private readonly System.Windows.Media.Brush _progressWaiting = - (System.Windows.Media.Brush) new System.Windows.Media.BrushConverter().ConvertFromString("Aquamarine"); - private readonly System.Windows.Media.Brush _progressCurrent = - (System.Windows.Media.Brush) new System.Windows.Media.BrushConverter().ConvertFromString("yellow"); - private readonly System.Windows.Media.Brush _progressDone = - (System.Windows.Media.Brush) new System.Windows.Media.BrushConverter().ConvertFromString("green"); - private readonly System.Windows.Media.Brush _progressError = - (System.Windows.Media.Brush) new System.Windows.Media.BrushConverter().ConvertFromString("red"); + private readonly System.Windows.Media.Brush _progressWaiting = + (System.Windows.Media.Brush)new System.Windows.Media.BrushConverter().ConvertFromString("Aquamarine"); + private readonly System.Windows.Media.Brush _progressCurrent = + (System.Windows.Media.Brush)new System.Windows.Media.BrushConverter().ConvertFromString("yellow"); + private readonly System.Windows.Media.Brush _progressDone = + (System.Windows.Media.Brush)new System.Windows.Media.BrushConverter().ConvertFromString("green"); + private readonly System.Windows.Media.Brush _progressError = + (System.Windows.Media.Brush)new System.Windows.Media.BrushConverter().ConvertFromString("red"); private System.Windows.Media.Brush _lblS01Color; @@ -431,7 +431,7 @@ namespace CordonelAssemblyLine.Model PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } - Task _s; + private Task _s; /// /// Initial start of assembling @@ -601,12 +601,18 @@ namespace CordonelAssemblyLine.Model sbMSG.AppendLine($"Remaining life time in years {genesisStatus.RemainingLifeTimeYears:F2}"); sbMSG.AppendLine($"Totally drained battery load in % {genesisStatus.DrainedBatteryLoadPercent:F2}"); - if (genesisStatus.DrainedBatteryLoadPercent >= 7.5) + if (genesisStatus.RemainingLifeTimeYears >= 21) { - lblS08Text = "Batterieentladung über 7.5%"; + lblS08Text = $"{genesisStatus.RemainingLifeTimeYears} Jahre"; + } + else + { + lblS08Text = $"{genesisStatus.RemainingLifeTimeYears} Jahre"; lblS08Color = _progressError; ret = false; } + + meter.WriteLog(sbMSG.ToString()); } } @@ -783,7 +789,7 @@ namespace CordonelAssemblyLine.Model SetState("Pcb mit Drucksensor. Laut Auftrag keiner verbaut"); lblS05Text = "Drucksensor vorhanden!"; meter.WriteLog(State); - + } else { @@ -1097,7 +1103,7 @@ namespace CordonelAssemblyLine.Model lblS04Color = _progressCurrent; } - } + } break; case PickingStateMachine.Compare: @@ -1108,35 +1114,35 @@ namespace CordonelAssemblyLine.Model lblS09Color = _progressCurrent; - - //Rule from J.Schulz, 9 months for customers with immediately usage here temporary decided on order volume - //minDate = minDate.AddMonths(_orderOverview.OrderOverViewCordonel.Count < 5 ? -9 : -3); - // The production date has to be at least within the last 3 months from now backwards - minDate = minDate.AddMonths(-3); - SetState($"Register wurde am {_orderOverview.KitronProductionDate } hergestellt, für diesen Auftrag " + - $"muss das Register nach dem {minDate} hergestellt worden sein"); - lblS09Text = $"{_orderOverview.KitronProductionDate}"; + ////Rule from J.Schulz, 9 months for customers with immediately usage here temporary decided on order volume + ////minDate = minDate.AddMonths(_orderOverview.OrderOverViewCordonel.Count < 5 ? -9 : -3); - //TODO may be useful to introduce SkipRegisterOldness instead of SkipBatteyCheck will be used for oldness of register - if (_skipProcessSteps == null || !_skipProcessSteps.SkipBatteyCheck) - { - if (_orderOverview.KitronProductionDate <= minDate) - { - SetState($"Fehlgeschlagen Register ist zu alt! Bitte QS informieren. Kitron-Produktionsdatum: {_orderOverview.KitronProductionDate }"); + //// The production date has to be at least within the last 3 months from now backwards + //minDate = minDate.AddMonths(-3); + //SetState($"Register wurde am {_orderOverview.KitronProductionDate } hergestellt, für diesen Auftrag " + + // $"muss das Register nach dem {minDate} hergestellt worden sein"); + //lblS09Text = $"{_orderOverview.KitronProductionDate}"; - _state = PickingStateMachine.MeterError; - lblS09Color = _progressError; - var b = (System.Windows.Media.Brush)converter.ConvertFromString("#FFFF00"); - b.Freeze(); - ResultColor = b; - break; - } - } - else - { - SetState($"Produktionsdatum wird nicht überprüft Sonderfreigabe Nr.:{_skipProcessSteps.Id} von {_skipProcessSteps.Name}"); - } + ////TODO may be useful to introduce SkipRegisterOldness instead of SkipBatteyCheck will be used for oldness of register + //if (_skipProcessSteps == null || !_skipProcessSteps.SkipBatteyCheck) + //{ + // if (_orderOverview.KitronProductionDate <= minDate) + // { + // SetState($"Fehlgeschlagen Register ist zu alt! Bitte QS informieren. Kitron-Produktionsdatum: {_orderOverview.KitronProductionDate }"); + + // _state = PickingStateMachine.MeterError; + // lblS09Color = _progressError; + // var b = (System.Windows.Media.Brush)converter.ConvertFromString("#FFFF00"); + // b.Freeze(); + // ResultColor = b; + // break; + // } + //} + //else + //{ + // SetState($"Produktionsdatum wird nicht überprüft Sonderfreigabe Nr.:{_skipProcessSteps.Id} von {_skipProcessSteps.Name}"); + //} lblS09Color = _progressDone; if (Compare(_orderDetails.CheckAppsIdVersion, _orderDetails.FrequencyIndicator, _orderDetails.MeterSize, _orderDetails.PressurePresent)) diff --git a/Common/Cryptology/Security/Cryptology.csproj b/Common/Cryptology/Security/Cryptology.csproj index 1a3f3f01..5a30cb96 100644 --- a/Common/Cryptology/Security/Cryptology.csproj +++ b/Common/Cryptology/Security/Cryptology.csproj @@ -9,13 +9,14 @@ Properties Xylem.Common.Cryptology.Security Xylem.Common.Cryptology.Security - v4.7.2 + v4.6.1 512 false SAK SAK SAK SAK + true diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisPwd/MeterPwdHandlerDb.cs b/Common/Hardware/WaterMeter/Genesis/GenesisPwd/MeterPwdHandlerDb.cs index c15f6599..6e8d41e4 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisPwd/MeterPwdHandlerDb.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisPwd/MeterPwdHandlerDb.cs @@ -38,7 +38,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd try { var url = ServiceUrls.GenesisGetPasswordServiceUrl(); - var response = LocalWebRequest.GetRequest(url + pcbId, 2000); + var response = LocalWebRequest.GetRequest(url + pcbId, 20000); password = JsonConvert.DeserializeObject(response); if (string.IsNullOrEmpty(password)) { diff --git a/Common/ProductionUiCordonel/FinalTest.xaml.cs b/Common/ProductionUiCordonel/FinalTest.xaml.cs index cb50d4a8..2e092139 100644 --- a/Common/ProductionUiCordonel/FinalTest.xaml.cs +++ b/Common/ProductionUiCordonel/FinalTest.xaml.cs @@ -436,7 +436,7 @@ namespace ProductionUiCordonel //pc.Processes.Add(new ProductionProcessFinalParametrizationFix()); //[x] [x] [] pc.Processes.Add(new ProductionProcessFinalParametrizationVakoCsd(connectProcess, true)); //[x] [x] [] - + pc.Processes.Add(new ProductionProcessShippingMode(true, true)); //[] [] [] var radioCheck = new ProductionProcessRadioCheck(); @@ -447,7 +447,7 @@ namespace ProductionUiCordonel pc.Processes.Add(radioCheck); //[] [] [] //pc.Processes.Add(new ProductionProcessSpecialConfig()); //[x] [x] [] - pc.Processes.Add(new ProductionProcessShippingMode(true,true)); //[] [] [] + pc.Processes.Add(new ProductionProcessFinalParametrizationVakoCsd(connectProcess, true)); //[x] [x] [] diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationVakoCsd.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationVakoCsd.cs index ff2c3720..01b5e765 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationVakoCsd.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationVakoCsd.cs @@ -103,7 +103,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions && connectProcess.asyncProgrammingParametersTask.Result != null && connectProcess.asyncProgrammingParametersTask.Result.Any()) { - var myJsonResponse = connectProcess.asyncProgrammingParametersTask.Result; + var myJsonResponse = connectProcess.asyncProgrammingParametersTask.Result; Progress = 15; @@ -120,12 +120,12 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); // keien frq aber radio parameter - if (!Meter.RadioFrequencyMhz.HasValue && myJsonResponse.Any(a => a.RegisterName.Contains("radio"))) + if (!Meter.RadioFrequencyMhz.HasValue && myJsonResponse.Any(a => a.RegisterName.Contains("RADIO"))) { throw new ApplicationException("Radio inconsistent between meter and programmingparameters"); } // eine frequen aber keine radio parameter - if (Meter.RadioFrequencyMhz.HasValue && !myJsonResponse.Any(a => a.RegisterName.Contains("radio"))) + if (Meter.RadioFrequencyMhz.HasValue && !myJsonResponse.Any(a => a.RegisterName.Contains("RADIO"))) { throw new ApplicationException("Radio inconsistent between meter and programmingparameters"); } diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs index c5a1cb33..7be685ba 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs @@ -50,7 +50,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions var ret = MeterPwdHandlerDb.RequestPwdFileFromDb(Meter.PcbId, out _pwdContainer); updateImage(_userControl.RequestPassword, ret); Progress += 16; - + Meter.Logout(); + ret = Meter.Login(); + //If the password file is written, the "Password" from _pwdContainer is overwritten from Skeleton-key //to the "level 8 password" form the LuDB server. The DB password column is the current login password //for production. Initially the "Password" is the Skeleton-key which can not be part of the list of @@ -58,9 +60,11 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions if (Encoding.UTF8.GetString(_pwdContainer.ListOfPasswords.Last()) == _pwdContainer.Password) { NewStatus("Passwörter schon geschrieben. Prozess wird übersprungen"); + currentProcessState = ProductionProcessState.Done; return; } + //Get the passwords from LuDB, insert the skeleton-kay and generate the password file if (ret) diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs index f9ec9d4c..126a3017 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs @@ -1,10 +1,10 @@ -using System; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Windows.Controls; -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile; @@ -46,11 +46,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions public override void StartProcess() { - Meter.ResetAlarm(GenesisMeter.Alarm.ALL);//(true, new byte[] { 0x00, 0x00, 0x00, 0x01 }); - Meter.SetLcdText(true, new Byte[] { 0x00, 0x00, 0x00, 0x01 }); - - Meter.ResetAlarm(GenesisMeter.Alarm.EMPTY_PIPE);//(true, new byte[] { 0x00, 0x00, 0x00, 0x01 }); hasRadio = Meter.RadioFrequencyMhz.HasValue; @@ -60,40 +56,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { if (Meter.StoreAllConfigurations()) { - - var writeList = new List + if (doRestart) { - Meter.WriteRegister("SENSUSRADIO_SystemState", 1), - Meter.WriteRegister("SENSUSRADIO_MainAlarmMask", 0), - Meter.WriteRegister("SENSUSRADIO_ExtendedAlarmMask", 0) - }; - - - Thread.Sleep(15000); - if (!Meter.Logout()) - { - Thread.Sleep(15000); - if (!Meter.Logout()) - { - Meter.WriteLog("logout failed"); - } - } - - Thread.Sleep(5000); - if (!Meter.Login()) - { - Thread.Sleep(15000); - if (!Meter.Login()) - { - Meter.WriteLog("Login failed"); - } - } - - if (writeList.All(a => a)) - { - if (doRestart) - { - var CheckValuesAfterBoot = new List> + var CheckValuesAfterBoot = new List> { new Tuple("METROLOGYASST_PulseLength", Meter.ReadRegister("METROLOGYASST_PulseLength")), @@ -103,67 +68,59 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions new Tuple("GENESISFLOW_CalFactor1", Meter.ReadRegister("GENESISFLOW_CalFactor1")), new Tuple("SENSUSRADIO_RadioAddress", Meter.ReadRegister("SENSUSRADIO_RadioAddress")) }; - var _meterResetPsu = new MeterResetPsu(Meter) + var _meterResetPsu = new MeterResetPsu(Meter) + { + StoreConfigEnable = true + }; + var rebootSucceeded = _meterResetPsu.MeterResetPsuExecute(); + + Thread.Sleep(10000); + if (!Meter.Login()) + + { + Meter.WriteLog("relogin first attempt Failed"); + Thread.Sleep(5000); + if (!Meter.Login()) { - StoreConfigEnable = true - }; - var rebootSucceeded = _meterResetPsu.MeterResetPsuExecute(); - - Thread.Sleep(10000); - Meter.Login(); - - - Boolean? hasDiffrences = null; - foreach (var item in CheckValuesAfterBoot) - { - if (!item.Item2.SequenceEqual(Meter.ReadRegister(item.Item1))) - { - hasDiffrences = true; - } - else - { - if (!hasDiffrences.HasValue) - { - hasDiffrences = false; - } - } - } - - if (rebootSucceeded && hasDiffrences.HasValue && !hasDiffrences.Value) - { - - Meter.WriteRegister("SENSUSRADIO_SystemState", 0xFF); - Meter.Logout(); - Thread.Sleep(5000); - Meter.Login(); - var SENSUSRADIO_MainAlarmMask = Meter.ReadRegister("SENSUSRADIO_MainAlarmMask"); - var SENSUSRADIO_ExtendedAlarmMask = Meter.ReadRegister("SENSUSRADIO_ExtendedAlarmMask"); - var SENSUSRADIO_SystemState = Meter.ReadRegister("SENSUSRADIO_SystemState"); - if (SENSUSRADIO_SystemState[0] == 0x02 && SENSUSRADIO_MainAlarmMask[0] != 0) - { - currentProcessState = ProductionProcessState.Done; - } - else - { - Meter.WriteLog("resetRadio Failed"); - currentProcessState = ProductionProcessState.Error; - } - - - - } - else - { - Meter.WriteLog("reboot compare failed"); + Meter.WriteLog("relogins Failed"); currentProcessState = ProductionProcessState.Error; } } - else + + + Boolean? hasDiffrences = null; + foreach (var item in CheckValuesAfterBoot) { + if (!item.Item2.SequenceEqual(Meter.ReadRegister(item.Item1))) + { + hasDiffrences = true; + } + else + { + if (!hasDiffrences.HasValue) + { + hasDiffrences = false; + } + } + } + + if (rebootSucceeded && hasDiffrences.HasValue && !hasDiffrences.Value) + { + Meter.WriteRegister("SENSUSRADIO_SystemState", 0xFF); Meter.Logout(); Thread.Sleep(5000); - Meter.Login(); + if (!Meter.Login()) + { + Meter.WriteLog("relogin first attempt Failed"); + Thread.Sleep(5000); + + if (!Meter.Login()) + { + Meter.WriteLog("relogin Failed"); + currentProcessState = ProductionProcessState.Error; + } + } var SENSUSRADIO_MainAlarmMask = Meter.ReadRegister("SENSUSRADIO_MainAlarmMask"); var SENSUSRADIO_ExtendedAlarmMask = Meter.ReadRegister("SENSUSRADIO_ExtendedAlarmMask"); var SENSUSRADIO_SystemState = Meter.ReadRegister("SENSUSRADIO_SystemState"); @@ -176,17 +133,60 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions Meter.WriteLog("resetRadio Failed"); currentProcessState = ProductionProcessState.Error; } - } + + + } + else + { + Meter.WriteLog("reboot compare failed"); + currentProcessState = ProductionProcessState.Error; + } } else { - currentProcessState = ProductionProcessState.Error; + Meter.ResetAlarm(GenesisMeter.Alarm.ALL);//(true, new byte[] { 0x00, 0x00, 0x00, 0x01 }); + + Meter.SetLcdText(true, new Byte[] { 0x00, 0x00, 0x00, 0x01 }); + + Meter.ResetAlarm(GenesisMeter.Alarm.EMPTY_PIPE);//(true, new byte[] { 0x00, 0x00, 0x00, 0x01 }); + + Meter.WriteRegister("SENSUSRADIO_SystemState", 0xFF); + Meter.Logout(); + Thread.Sleep(5000); + if (!Meter.Login()) + { + Thread.Sleep(5000); + if (!Meter.Login()) + { + currentProcessState = ProductionProcessState.Error; + return; + } + } + + var SENSUSRADIO_MainAlarmMask = Meter.ReadRegister("SENSUSRADIO_MainAlarmMask"); + var SENSUSRADIO_ExtendedAlarmMask = Meter.ReadRegister("SENSUSRADIO_ExtendedAlarmMask"); + var SENSUSRADIO_SystemState = Meter.ReadRegister("SENSUSRADIO_SystemState"); + if (SENSUSRADIO_SystemState[0] == 0x02 && SENSUSRADIO_MainAlarmMask[0] != 0) + { + currentProcessState = ProductionProcessState.Done; + } + else + { + Meter.WriteLog("resetRadio Failed"); + currentProcessState = ProductionProcessState.Error; + } } - - return; } + else + { + currentProcessState = ProductionProcessState.Error; + } + + + return; + } else { diff --git a/Common/Service/MeterProcessState/Controllers/EasyAccessControler.cs b/Common/Service/MeterProcessState/Controllers/EasyAccessControler.cs index 4f058f76..f69dc21b 100644 --- a/Common/Service/MeterProcessState/Controllers/EasyAccessControler.cs +++ b/Common/Service/MeterProcessState/Controllers/EasyAccessControler.cs @@ -1,10 +1,5 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using System; +using System; using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; @@ -165,5 +160,125 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers } } + + [Route("GetTestDataFull")] + public async Task GetTestDataFull(String PcbId = "", string Auftrag = "") + { + try + { + var returnPw = "Not assigned"; + var resDic = new List>(); + using (var dataAccess = new SqlDataAccess(GlobalConfig.connectionString.Value)) + { + StringBuilder query = new StringBuilder(); + query.AppendLine(" select "); + query.AppendLine(" apsn.SerienNr, "); + query.AppendLine(" pg.PruefgangNr, "); + query.AppendLine(" apsn.Wiederholungen, "); + query.AppendLine(" apsn.Einbauplatz, "); + query.AppendLine(" pg.Nennweite, "); + query.AppendLine(" PP1_Soll,PP1_Ist,PP1_Ist_V, "); + query.AppendLine(" pf.PP1_Fehler, "); + query.AppendLine(" PP2_Soll,PP2_Ist,PP2_Ist_V, "); + query.AppendLine(" pf.PP2_Fehler, "); + query.AppendLine(" PP3_Soll,PP3_Ist,PP3_Ist_V, "); + query.AppendLine(" pf.PP3_Fehler, "); + query.AppendLine(" PP4_Soll,PP4_Ist,PP4_Ist_V, "); + query.AppendLine(" pf.PP4_Fehler, "); + query.AppendLine(" PP5_Soll,PP5_Ist,PP5_Ist_V, "); + query.AppendLine(" pf.PP5_Fehler, "); + query.AppendLine(" PP6_Soll,PP6_Ist,PP6_Ist_V, "); + query.AppendLine(" pf.PP6_Fehler, "); + query.AppendLine(" PP7_Soll,PP7_Ist,PP7_Ist_V, "); + query.AppendLine(" pf.PP7_Fehler, "); + query.AppendLine(" PP8_Soll,PP8_Ist,PP8_Ist_V, "); + query.AppendLine(" pf.PP8_Fehler, "); + query.AppendLine(" PP9_Soll,PP9_Ist,PP9_Ist_V, "); + query.AppendLine(" pf.PP9_Fehler, "); + query.AppendLine(" PP10_Soll,PP10_Ist,PP10_Ist_V, "); + query.AppendLine(" pf.PP10_Fehler "); + + query.AppendLine(" from [Auftrag].[dbo].[AuftragPositionSerienNr] apsn "); + query.AppendLine(" inner join [Auftrag].[dbo].[AuftragPosition_Gesamt] apg on apg.AuftragNr = apsn.AuftragNr and apg.PositionNr = apsn.PositionNr and apg.Ort = 'L2' "); + + query.AppendLine(" inner join [Auftrag].[dbo].[Pruefgang] pg on apsn.[Pruefgangnr] = pg.PruefgangNr and pg.PruefstationNr = 2016 "); + + query.AppendLine(" inner join [Auftrag].[dbo].Prueffehler pf on pg.[Pruefgangnr] = pf.PruefgangNr and pf.SerienNr = apsn.SerienNr "); + + + query.AppendLine(" where apsn.SerienNr in ( "); + query.AppendLine(" SELECT "); + query.AppendLine(" [MapPcbIdToSerialNumber_SerialNumber] "); + query.AppendLine(" FROM [Auftrag].[dbo].[MapPcbIdToSerialNumber] "); + query.AppendLine(" inner join [Auftrag].[dbo].[AuftragPositionSerienNr] apsn on apsn.SerienNr = [MapPcbIdToSerialNumber_SerialNumber] and apsn.SerienNr not in (20702497,20702499,20717438) "); + query.AppendLine(" "); + query.AppendLine(" inner join[Auftrag].[dbo].[AuftragPosition_Gesamt] apg on apg.AuftragNr = apsn.AuftragNr and apg.PositionNr = apsn.PositionNr and apg.Ort = 'L2' "); + query.AppendLine(" inner join[Auftrag].[dbo].[Pruefgang] pg on apsn.[Pruefgangnr] = pg.PruefgangNr and pg.PruefstationNr = 2016 "); + query.AppendLine(" inner join[Auftrag].[dbo].Prueffehler pf on pg.[Pruefgangnr] = pf.PruefgangNr and pf.SerienNr = [MapPcbIdToSerialNumber_SerialNumber] "); + query.AppendLine(" "); + query.AppendLine(" group by [MapPcbIdToSerialNumber_SerialNumber] "); + query.AppendLine(" having Count(*) < 5) "); + query.AppendLine(" "); + query.AppendLine(" and PP3_Fehler is not null "); + query.AppendLine(" "); + query.AppendLine(" order by apsn.SerienNr desc, apsn.Wiederholungen asc "); + + + + var dt = dataAccess.ExecuteQuery(query.ToString()); + + var sb = new StringBuilder(); + sb = null; + foreach (var item in dt.Select()) + { + try + { + + + if (sb == null) + { + sb = new StringBuilder(); + + } + + + } + catch (Exception ex) + { + + throw; + } + + + } + + + HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); + + + result.Content = new StringContent(sb.ToString()); + result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel"); + result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); //attachment will force download + result.Content.Headers.ContentDisposition.FileName = "RecordExport.csv"; + + + return result; + + + } + + + } + catch (Exception ex) + { + return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.ToString() + "
" + ex.InnerException.ToString()); + } + } + + + + + + } } \ No newline at end of file diff --git a/Common/Service/MeterProcessState/Controllers/PasswordController.cs b/Common/Service/MeterProcessState/Controllers/PasswordController.cs index 46af3095..f774a81c 100644 --- a/Common/Service/MeterProcessState/Controllers/PasswordController.cs +++ b/Common/Service/MeterProcessState/Controllers/PasswordController.cs @@ -423,7 +423,7 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers result.RadioAddress = (Int64)item["Adresse"]; result.Skeleton = (String)item["Skeleton"]; result.Password = (String)item["Password"]; - result.PasswordFileIdent = result.RadioAddress.HasValue ? result.RadioAddress.Value.ToString() : PcbId; + result.PasswordFileIdent = (result.RadioAddress.HasValue && result.RadioAddress.Value != 0) ? result.RadioAddress.Value.ToString() : PcbId; if (item["KeySetId"].GetType() != typeof(System.DBNull)) { result.KeySetId = (String)item["KeySetId"]; diff --git a/Common/Service/MeterProcessState/Controllers/ProccesStateController.cs b/Common/Service/MeterProcessState/Controllers/ProccesStateController.cs index c1e47823..3574304d 100644 --- a/Common/Service/MeterProcessState/Controllers/ProccesStateController.cs +++ b/Common/Service/MeterProcessState/Controllers/ProccesStateController.cs @@ -789,7 +789,7 @@ namespace Service.MeterProcessState.Controllers sb.AppendLine($" where "); sb.AppendLine($" (OrderNumber = {orderNumber} or OrderNumber is null) "); sb.AppendLine($" and (PcbId = {pcbId} or PcbId is null) "); - + // PcbId != null sticht ordernumber , Ordernumbner //TODO Roland: The defaults should come from a DefaultProductionSkipAndLifeTimeInfo table const Int32 DefaultMaxMonthsNaRegion = 6; const Int32 DefaultMaxMonthsEmeaRegion = 3; @@ -799,7 +799,7 @@ namespace Service.MeterProcessState.Controllers var dt = dataAccess.ExecuteQuery(sb.ToString()); - if (dt.Rows.Count < 1 ) + if (dt.Rows.Count == 1 ) { var stat = new GenesisStatus { @@ -812,9 +812,9 @@ namespace Service.MeterProcessState.Controllers }; //TODO Roland implement defaults // get region from order if (Region == "NA") - stat.ProductionDueDate = stat.KitronProductionDate + TimeSpan.FromDays(30.0 * DefaultMaxMonthsNaRegion); + stat.ProductionDueDate = stat.KitronProductionDate.AddMonths(DefaultMaxMonthsNaRegion); // else - stat.ProductionDueDate = stat.KitronProductionDate + TimeSpan.FromDays(30.0 * DefaultMaxMonthsEmeaRegion); + stat.ProductionDueDate = stat.KitronProductionDate.AddMonths(DefaultMaxMonthsEmeaRegion); return stat; } var ret = new GenesisStatus(); diff --git a/Common/Service/ProductionService/App.config b/Common/Service/ProductionService/App.config new file mode 100644 index 00000000..0c844b21 --- /dev/null +++ b/Common/Service/ProductionService/App.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/Common/Service/ProductionService/CordonelMetersFinalCheck.Designer.cs b/Common/Service/ProductionService/CordonelMetersFinalCheck.Designer.cs new file mode 100644 index 00000000..c5c4d518 --- /dev/null +++ b/Common/Service/ProductionService/CordonelMetersFinalCheck.Designer.cs @@ -0,0 +1,37 @@ +namespace ProductionService +{ + partial class CordonelMetersFinalCheck + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.ServiceName = "Service1"; + } + + #endregion + } +} diff --git a/Common/Service/ProductionService/CordonelMetersFinalCheck.cs b/Common/Service/ProductionService/CordonelMetersFinalCheck.cs new file mode 100644 index 00000000..1bcda043 --- /dev/null +++ b/Common/Service/ProductionService/CordonelMetersFinalCheck.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Linq; +using System.ServiceProcess; +using System.Text; +using System.Threading.Tasks; + +using System.Timers; +using System.Data.SqlClient; + +namespace ProductionService +{ + + public partial class CordonelMetersFinalCheck : ServiceBase + { + private Timer timer; + private SqlConnection sqlConnection; + + public CordonelMetersFinalCheck() + { + InitializeComponent(); + } + + protected override void OnStart(string[] args) + { + timer = new Timer(); + timer.Interval = 60 * 60 * 1000; // 1 hour in milliseconds + timer.Elapsed += new ElapsedEventHandler(OnTimer); + timer.Start(); + + string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"; + sqlConnection = new SqlConnection(connectionString); + sqlConnection.Open(); + } + + protected override void OnStop() + { + timer.Stop(); + sqlConnection.Close(); + } + + private void OnTimer(object sender, ElapsedEventArgs e) + { + SqlCommand command = new SqlCommand("SELECT COUNT(*) FROM MyTable", sqlConnection); + int count = (int)command.ExecuteScalar(); + // Do something with the count here + + foreach (var item in collection) + { + + } + } + } +} diff --git a/Common/Service/ProductionService/ProductionService.csproj b/Common/Service/ProductionService/ProductionService.csproj new file mode 100644 index 00000000..3d0b67df --- /dev/null +++ b/Common/Service/ProductionService/ProductionService.csproj @@ -0,0 +1,86 @@ + + + + + Debug + AnyCPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D} + WinExe + ProductionService + ProductionService + v4.6.1 + 512 + true + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\packages\Microsoft.Extensions.Logging.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll + + + ..\..\packages\Quartz.3.6.2\lib\net472\Quartz.dll + + + + ..\..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + + ..\..\packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + ..\..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll + + + + ..\..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + + + + + + + + + + + Component + + + CordonelMetersFinalCheck.cs + + + + + + + + + + \ No newline at end of file diff --git a/Common/Service/ProductionService/Program.cs b/Common/Service/ProductionService/Program.cs new file mode 100644 index 00000000..bb1880e1 --- /dev/null +++ b/Common/Service/ProductionService/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceProcess; +using System.Text; +using System.Threading.Tasks; + +namespace ProductionService +{ + static class Program + { + /// + /// The main entry point for the application. + /// + static void Main() + { + ServiceBase[] ServicesToRun; + ServicesToRun = new ServiceBase[] + { + new CordonelMetersFinalCheck() + }; + ServiceBase.Run(ServicesToRun); + } + } +} diff --git a/Common/Service/ProductionService/Properties/AssemblyInfo.cs b/Common/Service/ProductionService/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..4a7a110e --- /dev/null +++ b/Common/Service/ProductionService/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("ProductionService")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ProductionService")] +[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("35726bcf-975c-4b49-befa-c00d90394f1d")] + +// 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/Service/ProductionService/packages.config b/Common/Service/ProductionService/packages.config new file mode 100644 index 00000000..2dc8dfda --- /dev/null +++ b/Common/Service/ProductionService/packages.config @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.csproj b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.csproj index 6cafcc0c..e5d57ede 100644 --- a/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.csproj +++ b/ServiceFwUpdate/Common/FwUpdateDb/FwUpdateDb.csproj @@ -9,13 +9,14 @@ Properties Xylem.ServiceFwUpdate.Common.FwUpdateDb Xylem.ServiceFwUpdate.Common.FwUpdateDb - v4.7.2 + v4.6.1 512 true SAK SAK SAK SAK +
true diff --git a/ServiceFwUpdate/Common/FwUpdateSafe/FwUpdateSafe.csproj b/ServiceFwUpdate/Common/FwUpdateSafe/FwUpdateSafe.csproj index 8ce8bcd6..5fc50e02 100644 --- a/ServiceFwUpdate/Common/FwUpdateSafe/FwUpdateSafe.csproj +++ b/ServiceFwUpdate/Common/FwUpdateSafe/FwUpdateSafe.csproj @@ -9,13 +9,14 @@ Properties Xylem.ServiceFwUpdate.Common.FwUpdateSafe Xylem.ServiceFwUpdate.Common.FwUpdateSafe - v4.7.2 + v4.6.1 512 true SAK SAK SAK SAK + true