From 0c9ec9a9caa4f288f155c6bbef54fee38f292592 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Mon, 16 Jan 2023 13:04:26 +0100 Subject: [PATCH 01/12] MeterLutUpdate improved, GenesisMeter checks "DN" to decide for "EMEA" --- Common/.shared/SharedAssemblyInfo.cs | 4 ++-- Common/Common.sln.DotSettings | 1 + .../WaterMeter/Genesis/GenesisCore/GenesisMeter.cs | 6 +++++- .../WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs | 7 ++++++- .../WaterMeterRegisters.csproj.CoreCompileInputs.cache | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Common/.shared/SharedAssemblyInfo.cs b/Common/.shared/SharedAssemblyInfo.cs index 0d00d376..52747df5 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.3.4.*")] -[assembly: AssemblyFileVersion("2.3.4.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.3.5.*")] +[assembly: AssemblyFileVersion("2.3.5.0")] \ No newline at end of file diff --git a/Common/Common.sln.DotSettings b/Common/Common.sln.DotSettings index 588a89aa..4d2ea367 100644 --- a/Common/Common.sln.DotSettings +++ b/Common/Common.sln.DotSettings @@ -47,6 +47,7 @@ True True True + True True True True diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs index 9a78e235..719f0321 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs @@ -1245,6 +1245,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// - RadioFrequencyMhz introduced as Int32? (null if "NA" region or not installed), /// - LutCrc from String to Int32?. /// + /// + /// - Checked meter size string for "DN", than it cannot be an EMEA version. + /// private void ReadMeterFirmwareAndAssignRegisters() { //avoid overwriting of list if this already exits @@ -1359,7 +1362,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore try { var radioFrequencyRaw = ReadRegister(Register.Sensusradio.FrequencyIndicator); - if (radioFrequencyRaw != null) + // check meter size string contains "DN", because if "US" it cannot be an EMEA version + if (radioFrequencyRaw != null && MeterSize.Contains("DN")) { Region = "EMEA"; RadioFrequencyMhz = RegisterConverter.ConvertTo(radioFrequencyRaw); diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs index 06cb0ff2..f87a3c7e 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs @@ -434,6 +434,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// /// - Introduced lock for repeated execution of state machine /// + /// + /// - Started state machine with download of new mettbl. + /// private void LutUpdateStateMachine() { if (_lutBackupUpdateState == _lutUpdateState) @@ -451,7 +454,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile case LutUpdateState.StartInitial: _updateProcedureRetryCtr = 0; - _lutUpdateState = LutUpdateState.EraseLutFile; + _lutUpdateState = LutUpdateState.DownloadLutFile; + + //_lutUpdateState = LutUpdateState.EraseLutFile; break; case LutUpdateState.EraseLutFile: 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 f22623aa..d8b5c8f6 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 @@ -5ed75d99ee45ff67821090f1b3dbb001dd9e4fe3 +1a3d4919c9c702245832d925951f2b7cb72fc333 From bffac1b872095b92b88a990815eb0fcaa1d05a84 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Wed, 18 Jan 2023 12:03:51 +0100 Subject: [PATCH 02/12] Cordonel calculation of scale factor for Metrology module checked and simulated --- .../Docu/CordonelCalFactorCalculationCheck.xlsx | Bin 0 -> 15908 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Common/Metrology/Docu/CordonelCalFactorCalculationCheck.xlsx diff --git a/Common/Metrology/Docu/CordonelCalFactorCalculationCheck.xlsx b/Common/Metrology/Docu/CordonelCalFactorCalculationCheck.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..22da15ee64e6ca6e7ae3ede45866a31640db30c9 GIT binary patch literal 15908 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 QT!IJq`Du`NTz_2sKg};XR{#J2 literal 0 HcmV?d00001 From 6048db660224fe3c5157c70b92cf5eccbd963ac1 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Wed, 18 Jan 2023 16:05:05 +0100 Subject: [PATCH 03/12] GTB FrmFwUpdate: Set upgrade permission to 0xFF to allow upgrade of GENESISFLOW --- .../Genesis/GenesisFile/MeterFwUpdate.cs | 24 ++- ...culationCheck_JustageVerscheidenWerte.xlsx | Bin 0 -> 81000 bytes Common/ProductionUiCordonel/App.xaml.cs | 5 +- .../ApplicationSettings.cs | 42 ++-- .../Data/FinalTestState.cs | 101 +++++++++ .../Data/FinalTestStateInfo.cs | 52 +++++ .../Data/FinalTestStateText.cs | 19 ++ .../Data/PickingResultData.cs | 34 +-- .../Data/PressureResultDataNotifyable.cs | 20 +- .../ProductionUiCordonel/Event/StringArgs.cs | 4 +- Common/ProductionUiCordonel/FinalTest.xaml.cs | 160 +++++++-------- .../ProductionUiCordonel/MainWindow.xaml.cs | 56 ++--- .../Model/FinalTestModel.cs | 193 ++++++++++++++++++ .../Model/IMultiModeChildViewModel.cs | 4 +- .../Model/MarriageMultiModeViewModel.cs | 22 +- .../Model/MultiModeChildViewModel.cs | 38 ++-- .../Model/MultiModeMasterViewModel.cs | 44 ++-- .../Model/PickingMultiModeViewModel.cs | 32 +-- .../Model/PickingViewModel.cs | 6 +- .../Model/PressureMultiModeViewModel.cs | 18 +- Common/ProductionUiCordonel/MultiMode.xaml.cs | 10 +- .../MultiModeChild.xaml.cs | 16 +- .../Actions/ProductionCheckShippingState.cs | 10 +- .../ProductionProcessCheckAttachment.cs | 6 +- .../ProductionProcessCheckOrderNumber.cs | 22 +- .../ProductionProcessCheckSerialNumber.cs | 14 +- .../Actions/ProductionProcessDone.cs | 12 +- ...oductionProcessFinalParameterizationFix.cs | 6 +- ...tionProcessFinalParameterizationVakoCsd.cs | 16 +- .../Actions/ProductionProcessPasswordFile.cs | 22 +- .../Actions/ProductionProcessRadioCheck.cs | 74 +++---- .../Actions/ProductionProcessShippingMode.cs | 36 ++-- .../Actions/ProductionProcessSpecialConfig.cs | 6 +- .../BaseProductionProcess.cs | 10 +- .../Enum/ProductionProcessState.cs | 2 +- .../ProductionProcesses/IProductionProcess.cs | 2 +- .../MultiProcessController.cs | 4 +- .../PopUpProcessLogArgs.cs | 4 +- .../PopUpProcessProgressArgs.cs | 4 +- .../ProductionUiCordonel.csproj | 19 ++ .../Properties/Resources.Designer.cs | 18 ++ .../Properties/Resources.de.Designer.cs | 0 .../Properties/Resources.de.resx | 148 ++++++++++++++ .../Properties/Resources.resx | 6 + .../FinalTest/UcBarcodeInput.xaml.cs | 18 +- .../UserControls/FinalTest/UcDialog.xaml.cs | 8 +- .../FinalTest/UcRadioCheck.xaml.cs | 22 +- .../ctls/ctlMultiModeMarriage.xaml.cs | 7 +- .../ctls/ctlMultiModePicking.xaml.cs | 10 +- .../ctls/ctlMultiModePressure.xaml.cs | 20 +- Common/Ui/GenesisToolBox/FrmFwUpdate.cs | 22 +- .../GenesisToolBox/FrmLutUpdate.Designer.cs | 22 +- Common/Ui/GenesisToolBox/FrmLutUpdate.cs | 2 + 53 files changed, 1026 insertions(+), 446 deletions(-) create mode 100644 Common/Metrology/Docu/CordonelCalFactorCalculationCheck_JustageVerscheidenWerte.xlsx create mode 100644 Common/ProductionUiCordonel/Data/FinalTestState.cs create mode 100644 Common/ProductionUiCordonel/Data/FinalTestStateInfo.cs create mode 100644 Common/ProductionUiCordonel/Data/FinalTestStateText.cs create mode 100644 Common/ProductionUiCordonel/Model/FinalTestModel.cs create mode 100644 Common/ProductionUiCordonel/Properties/Resources.de.Designer.cs create mode 100644 Common/ProductionUiCordonel/Properties/Resources.de.resx diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs index 57a18ed3..9c89ba43 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs @@ -176,6 +176,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// public Boolean StoreConfigEnable = true; + /// + /// Allow update of genesis flow application + /// + public Boolean UpdateGenesisFlowEnable; + /// /// Enable partial file writes from first failed part to the end /// @@ -245,6 +250,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// Ctor /// /// + /// enable update of genesis flow app /// /// - Initial /// @@ -254,13 +260,17 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// /// - Check installed application before require access to registers. /// - public MeterFwUpdate(GenesisMeter genesisMeter) + /// + /// - Enable update of Genesis Flow on request. + /// + public MeterFwUpdate(GenesisMeter genesisMeter, Boolean updateGenesisFlowEnable = false) { if (genesisMeter == null) { return; } + UpdateGenesisFlowEnable = updateGenesisFlowEnable; AssignGenesis(genesisMeter); if (genesisMeter.MeterAppListVersion.Any(f => f.AppName == "GENESISFLOW" && f.IsInstalled)) @@ -277,6 +287,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile { _registersBeforeUpdate.Add(Register.Sensusradio.WakeupInterval, new Byte[] { 6 }); } + + if (UpdateGenesisFlowEnable) + { + _registersBeforeUpdate.Add(Register.System.MetrologyUpgradePermission, new Byte[] { 0xFF, 0, 0, 0 }); + } } /// @@ -1829,15 +1844,20 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// /// - Extended timeout. /// + /// + /// - Set retry counter to 0, + /// - reduce timeout from 5000 to 2000 ms. + /// private Boolean TriggerUpgrade() { Boolean returnValue; //trigger upgrade _actualOperation = Resources.StrFwUpdateStateTriggerUpgrade; + _updateProcedureRetryCtr = 0; var triggerCtr = 0; //set extended timeout for trigger upgrade response delay - _genesisMeter.TransmitProtocol.SetResponseTimeout(5000); + _genesisMeter.TransmitProtocol.SetResponseTimeout(2000); do { returnValue = _genesisMeter.WriteRegister(Register.System.TriggerFwUpgrade, 1); diff --git a/Common/Metrology/Docu/CordonelCalFactorCalculationCheck_JustageVerscheidenWerte.xlsx b/Common/Metrology/Docu/CordonelCalFactorCalculationCheck_JustageVerscheidenWerte.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c0de7756a356431f44e7c4abc4d1c927c3b61266 GIT binary patch literal 81000 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∋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 OhgFfTWsQKY%<3Dukhkan literal 0 HcmV?d00001 diff --git a/Common/ProductionUiCordonel/App.xaml.cs b/Common/ProductionUiCordonel/App.xaml.cs index e252be06..b5d91a56 100644 --- a/Common/ProductionUiCordonel/App.xaml.cs +++ b/Common/ProductionUiCordonel/App.xaml.cs @@ -1,4 +1,5 @@ -using System.Windows; +using System; +using System.Windows; using System.Windows.Input; namespace ProductionUiCordonel @@ -13,7 +14,7 @@ namespace ProductionUiCordonel //this.StartupUri = new Uri("MainWindow.xaml"); //this.StartupUri = new Uri("MultiMode.xaml"); } - private void Application_Startup(object sender, StartupEventArgs e) + private void Application_Startup(Object sender, StartupEventArgs e) { if (true) diff --git a/Common/ProductionUiCordonel/ApplicationSettings.cs b/Common/ProductionUiCordonel/ApplicationSettings.cs index 20369925..28c2e56a 100644 --- a/Common/ProductionUiCordonel/ApplicationSettings.cs +++ b/Common/ProductionUiCordonel/ApplicationSettings.cs @@ -14,40 +14,40 @@ namespace ProductionUiCordonel public class Pos { - public double Left { get; set; } - public double Top { get; set; } - public double Height { get; set; } - public double Width { get; set; } + public Double Left { get; set; } + public Double Top { get; set; } + public Double Height { get; set; } + public Double Width { get; set; } } public class MultiFormChilds { public Type ViewModelType { get; set; } - public bool Visisble { get; set; } - public string Name { get; set; } - public int Slot { get; set; } - public string TextPort { get; set; } + public Boolean Visisble { get; set; } + public String Name { get; set; } + public Int32 Slot { get; set; } + public String TextPort { get; set; } public Pos StartPos { get; set; } } - public int Slot { get; set; } + public Int32 Slot { get; set; } - public int? PressureStationId { get; set; } - public bool AutoDetect { get; set; } + public Int32? PressureStationId { get; set; } + public Boolean AutoDetect { get; set; } - public bool AccessToPresuretestTab { get; set; } - public bool AccessToMarrieTab { get; set; } - public bool AccessToFinalcheckTab { get; set; } + public Boolean AccessToPresuretestTab { get; set; } + public Boolean AccessToMarrieTab { get; set; } + public Boolean AccessToFinalcheckTab { get; set; } - public bool AccessToSettingTab { get; set; } - public bool AccessToStatusTab { get; set; } - public bool AccessToPickingTab { get; set; } + public Boolean AccessToSettingTab { get; set; } + public Boolean AccessToStatusTab { get; set; } + public Boolean AccessToPickingTab { get; set; } - public int? SirtComport433 { get; set; } - public int? SirtComport866 { get; set; } - public int? SirtBoxNr { get; set; } + public Int32? SirtComport433 { get; set; } + public Int32? SirtComport866 { get; set; } + public Int32? SirtBoxNr { get; set; } - public int? StationId { get; set; } + public Int32? StationId { get; set; } public List ChildForms { get; set; } diff --git a/Common/ProductionUiCordonel/Data/FinalTestState.cs b/Common/ProductionUiCordonel/Data/FinalTestState.cs new file mode 100644 index 00000000..1981f6d7 --- /dev/null +++ b/Common/ProductionUiCordonel/Data/FinalTestState.cs @@ -0,0 +1,101 @@ +namespace ProductionUiCordonel.Data +{ + /// + /// Genesis meter final test states + /// + public enum FinalTestState + { + /// + /// Idle (nothing to do) + /// + Idle, + /// + /// Start the initial execution + /// + StartInitial, + /// + /// Error handling + /// + Error, + /// + /// Single processing step failed + /// + StepFailed, + /// + /// Repeat last step + /// + RepeatStep, + /// + /// Repeat the entire final test + /// + RepeatFinalTest, + /// + /// Final test failed + /// + FinalTestFailed, + /// + /// Check the actual shipping state + /// + CheckShippingState, + /// + /// Check the attachments + /// + CheckAttachments, + /// + /// Check the order number + /// + CheckOrderNumber, + /// + /// Check the serial number + /// + CheckSerialNumber, + /// + /// Connect to Cordonel + /// + ConnectCordonel, + /// + /// Store all configurations to FLASH memory + /// + StoreAllConfigurations, + /// + /// Reboot the Cordonel to check all parameters being stored to FLASH memory + /// + RebootCordonel, + /// + /// Finalize process + /// + FinalizeProcess, + /// + /// Final parametrization fixed values + /// + FinalParametrizationFix, + /// + /// Final parametrization with VAKO and CSD + /// + FinalParametrizationVakoCsd, + /// + /// Read out all parametrization values + /// + FullReadOutParametrization, + /// + /// Check all settings for against required values + /// + ConfigurationCheck, + /// + /// Acquire, process set the password file + /// + ProcessPasswordFile, + /// + /// Process special configuration + /// + ProcessSpecialConfig, + /// + /// Prepare shipping mode + /// + PrepareShippingMode, + /// + /// Delimiter for list + /// + StateListDelimiter + } +} \ No newline at end of file diff --git a/Common/ProductionUiCordonel/Data/FinalTestStateInfo.cs b/Common/ProductionUiCordonel/Data/FinalTestStateInfo.cs new file mode 100644 index 00000000..bfcbca55 --- /dev/null +++ b/Common/ProductionUiCordonel/Data/FinalTestStateInfo.cs @@ -0,0 +1,52 @@ +using System; +using System.Linq; +using ProductionUiCordonel.Properties; + +namespace ProductionUiCordonel.Data +{ + /// + /// Concatenation of state and string + /// + public static class FinalTestStateInfo + { + /// + /// Build state information + /// + private static readonly FinalTestStateText[] StateInfos; + + /// + /// Ctor + /// + static FinalTestStateInfo() + { + StateInfos = new FinalTestStateText[(Int32)FinalTestState.StateListDelimiter]; + StateInfos[(Int32)FinalTestState.Idle].State = FinalTestState.Idle; + StateInfos[(Int32)FinalTestState.Idle].Message = Resources.StrStateIdle; + + StateInfos[(Int32)FinalTestState.StartInitial].State = FinalTestState.StartInitial; + StateInfos[(Int32)FinalTestState.StartInitial].Message = Resources.StrStateStartInitial; + + } + + /// + /// Get the current information + /// + /// state to search for information text + public static String GetTextFromState(FinalTestState state) + { + return (from stateInfo in StateInfos + where stateInfo.State == state + select stateInfo.Message).FirstOrDefault(); + } + /// + /// Get the state of the text + /// + /// information text to search if state is assigned + public static FinalTestState GetStateFromText(String text) + { + return (from stateInfo in StateInfos + where stateInfo.Message == text + select stateInfo.State).FirstOrDefault(); + } + } +} diff --git a/Common/ProductionUiCordonel/Data/FinalTestStateText.cs b/Common/ProductionUiCordonel/Data/FinalTestStateText.cs new file mode 100644 index 00000000..4bfd80cf --- /dev/null +++ b/Common/ProductionUiCordonel/Data/FinalTestStateText.cs @@ -0,0 +1,19 @@ +using System; + +namespace ProductionUiCordonel.Data +{ + /// + /// Concatenation between final test state and text + /// + public struct FinalTestStateText + { + /// + /// The state of the final test + /// + public FinalTestState State; + /// + /// The message text of the final test state + /// + public String Message; + } +} diff --git a/Common/ProductionUiCordonel/Data/PickingResultData.cs b/Common/ProductionUiCordonel/Data/PickingResultData.cs index 3f6c5f93..4d12f73f 100644 --- a/Common/ProductionUiCordonel/Data/PickingResultData.cs +++ b/Common/ProductionUiCordonel/Data/PickingResultData.cs @@ -10,23 +10,23 @@ namespace ProductionUiCordonel.Data { public class PickingItemCheckReturn { - public bool? Result; - public string Msg; + public Boolean? Result; + public String Msg; } public abstract class PickingResultBaseData : IPickingResultData { - public string Ident { get; set; } + public String Ident { get; set; } - public int Index { get; set; } + public Int32 Index { get; set; } - public string CheckText { get; set; } + public String CheckText { get; set; } - public string CurrentValueText { get; set; } + public String CurrentValueText { get; set; } - public bool? Result { get; set; } + public Boolean? Result { get; set; } - public bool HasError { get; set; } + public Boolean HasError { get; set; } public System.Windows.Media.Brush ResultColor { get { return getColorFromResult(); } } public abstract Func Action { get; } @@ -54,16 +54,16 @@ public abstract class PickingResultBaseData : IPickingResultData } public interface IPickingResultData { - string Ident { get; set; } + String Ident { get; set; } - int Index { get; set; } - string CheckText { get; set; } + Int32 Index { get; set; } + String CheckText { get; set; } - string CurrentValueText { get; set; } + String CurrentValueText { get; set; } - bool? Result { get; set; } + Boolean? Result { get; set; } - bool HasError { get; set; } + Boolean HasError { get; set; } System.Windows.Media.Brush ResultColor { get; } @@ -71,11 +71,11 @@ public abstract class PickingResultBaseData : IPickingResultData } public class PickingResultRegisterData : PickingResultBaseData { - public string RegisterIdent { get; set; } + public String RegisterIdent { get; set; } public GenesisMeter ReadMeter { get; set; } - public object CompareObject { get; set; } + public Object CompareObject { get; set; } public override Func Action { get { return staticReadAndCompareAction(); } } @@ -97,7 +97,7 @@ public abstract class PickingResultBaseData : IPickingResultData } else if (CompareObject is Boolean boolCompare) { - retComp.Result = boolCompare.Equals(RegisterConverter.ConvertTo(r)); + retComp.Result = boolCompare.Equals(RegisterConverter.ConvertTo(r)); retComp.Msg = boolCompare.ToString(); } diff --git a/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs b/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs index b0fe1932..10c41039 100644 --- a/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs +++ b/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs @@ -39,12 +39,12 @@ namespace ProductionUiCordonel.Data } - public string PcbId; + public String PcbId; - private int rev = 0; + private Int32 rev = 0; - public int Rev + public Int32 Rev { get { return rev; } set @@ -53,8 +53,8 @@ namespace ProductionUiCordonel.Data InternalPropertyChanged(nameof(Rev)); } } - private bool? passed = false; - public bool? Passed + private Boolean? passed = false; + public Boolean? Passed { get { return passed; } set @@ -66,7 +66,7 @@ namespace ProductionUiCordonel.Data - private string testerName = "C. Röhl"; + private String testerName = "C. Röhl"; public String TesterName { get { return testerName; } @@ -77,7 +77,7 @@ namespace ProductionUiCordonel.Data } } - private string testPressure = "6"; + private String testPressure = "6"; public String TestPressure { get { return testPressure; } @@ -89,7 +89,7 @@ namespace ProductionUiCordonel.Data } - private string leakRate = " 0,00001"; + private String leakRate = " 0,00001"; public String LeakRate { get { return leakRate; } @@ -100,7 +100,7 @@ namespace ProductionUiCordonel.Data } } - private string remark = ""; + private String remark = ""; public String Remark { get { return remark; } @@ -134,7 +134,7 @@ namespace ProductionUiCordonel.Data } } - internal void SetAllTestPoints(string input) + internal void SetAllTestPoints(String input) { foreach (var item in Testpoints) { diff --git a/Common/ProductionUiCordonel/Event/StringArgs.cs b/Common/ProductionUiCordonel/Event/StringArgs.cs index fc7afaba..0b96e4e8 100644 --- a/Common/ProductionUiCordonel/Event/StringArgs.cs +++ b/Common/ProductionUiCordonel/Event/StringArgs.cs @@ -8,8 +8,8 @@ namespace ProductionUiCordonel.Event { public class StringArgs : EventArgs { - public readonly string Content; - public StringArgs(string content) + public readonly String Content; + public StringArgs(String content) { Content = content; } diff --git a/Common/ProductionUiCordonel/FinalTest.xaml.cs b/Common/ProductionUiCordonel/FinalTest.xaml.cs index 7f459f80..986376c8 100644 --- a/Common/ProductionUiCordonel/FinalTest.xaml.cs +++ b/Common/ProductionUiCordonel/FinalTest.xaml.cs @@ -1,11 +1,8 @@ -using Newtonsoft.Json; -using ProductionUiCordonel.ProductionProcesses; -using ProductionUiCordonel.ProductionProcesses.Actions; -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; -using System; +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Data; +using System.Diagnostics; using System.IO; using System.Linq; using System.Net; @@ -14,7 +11,13 @@ using System.Threading.Tasks; using System.Timers; using System.Windows; using System.Windows.Controls; +using System.Windows.Input; using System.Windows.Threading; +using Newtonsoft.Json; +using ProductionUiCordonel.ProductionProcesses; +using ProductionUiCordonel.ProductionProcesses.Actions; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.CommonCore.Consts; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig; @@ -38,7 +41,7 @@ namespace ProductionUiCordonel private GenesisMeter genesisMeter; public GenesisMeter CurrentGenesisMeter { - get { return genesisMeter; } + get => genesisMeter; set { var oldMeter = genesisMeter; @@ -47,14 +50,11 @@ namespace ProductionUiCordonel } } - private int orderNumber = 0; - public int OrderNumber + private Int32 orderNumber; + public Int32 OrderNumber { ////lblOrderNumber - get - { - return orderNumber; - } + get => orderNumber; set { orderNumber = value; @@ -66,37 +66,31 @@ namespace ProductionUiCordonel } } - private long radioAdress = 0; - public long RadioAdress + private Int64 radioAddress; + public Int64 RadioAdress { - get - { - return radioAdress; - } + get => radioAddress; set { - radioAdress = value; + radioAddress = value; updateContentControl(lblRadioAdress, "-"); - if (radioAdress != 0) + if (radioAddress != 0) { - updateContentControl(lblRadioAdress, radioAdress.ToString()); + updateContentControl(lblRadioAdress, radioAddress.ToString()); } } } - private string serialNumber = "-"; - public string SerialNumber + private String serialNumber = "-"; + public String SerialNumber { - get - { - return serialNumber; - } + get => serialNumber; set { serialNumber = value; updateContentControl(lblSerialNumber, "-"); - if (!String.IsNullOrEmpty(serialNumber)) + if (!string.IsNullOrEmpty(serialNumber)) { updateContentControl(lblSerialNumber, serialNumber); } @@ -104,19 +98,16 @@ namespace ProductionUiCordonel } } - private string lastPcbID; - private string currentProcess = "-"; - public string CurrentProcess + private String lastPcbID; + private String currentProcess = "-"; + public String CurrentProcess { - get - { - return currentProcess; - } + get => currentProcess; set { currentProcess = value; updateContentControl(lblCurrentProcess, "-"); - if (!String.IsNullOrEmpty(currentProcess)) + if (!string.IsNullOrEmpty(currentProcess)) { updateContentControl(lblCurrentProcess, currentProcess); } @@ -139,14 +130,14 @@ namespace ProductionUiCordonel } public EventHandler OnPcbIdDetect; - private int intervalWithoutDetect = 1000; - private int intervalWithDetect = 10000; - private string _currentPcbID; + private Int32 intervalWithoutDetect = 1000; + private Int32 intervalWithDetect = 10000; + private String _currentPcbID; private Timer tmrAutoDetect; public ApplicationSettings Settings { get; set; } - private void Window_Initialized(object sender, EventArgs e) + private void Window_Initialized(Object sender, EventArgs e) { - var configfile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), nameof(Xylem.Common.Hardware.WaterMeter.Genesis), ProgramConfig.SerialConfigFileName); + var configfile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), nameof(Xylem.Common.Hardware.WaterMeter.Genesis), ProgramConfig.SerialConfigFileName); if (!File.Exists(configfile)) { @@ -172,11 +163,11 @@ namespace ProductionUiCordonel useSetting(true); } - private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) + private void Window_Closing(Object sender, CancelEventArgs e) { DisposeAllConnections(); } - private void useSetting(bool setSlot = false) + private void useSetting(Boolean setSlot = false) { tmrAutoDetect.Enabled = Settings.AutoDetect; tblkAutodetectState.Text = "Off"; @@ -207,11 +198,11 @@ namespace ProductionUiCordonel } private MeterBatch CurrentBatch; - private bool detectIsLocked; + private Boolean detectIsLocked; - private string _lastMsg; - public string LastMsg + private String _lastMsg; + public String LastMsg { set { @@ -223,22 +214,22 @@ namespace ProductionUiCordonel return _lastMsg; } } - private void updateUi(ContentControl c, string content) + private void updateUi(ContentControl c, String content) { c.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { c.Content = content; })); } - private void updateUi(TextBox c, string content) + private void updateUi(TextBox c, String content) { c.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { c.Text = content; })); } - private void updateUi(TextBlock c, string content) + private void updateUi(TextBlock c, String content) { c.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { c.Text = content; })); } - public string CurrentPcbID + public String CurrentPcbID { set { @@ -275,7 +266,7 @@ namespace ProductionUiCordonel return _currentPcbID; } } - private void GetPcbMapping(string pcbID) + private void GetPcbMapping(String pcbID) { if (string.IsNullOrEmpty(pcbID)) { @@ -288,14 +279,14 @@ namespace ProductionUiCordonel try { var responseJson = LocalWebRequest.GetRequest(url); - var a = JsonConvert.DeserializeObject(responseJson); + var a = JsonConvert.DeserializeObject(responseJson); var tmpInt = 0; int.TryParse(a[1], out tmpInt); OrderNumber = tmpInt; - long tmpLong = 0; + Int64 tmpLong = 0; if (a.Length > 2) { long.TryParse(a[2], out tmpLong); @@ -325,13 +316,13 @@ namespace ProductionUiCordonel } }); } - private bool Detect(bool IgnorErrors, int slot) + private Boolean Detect(Boolean IgnorErrors, Int32 slot) { if (!detectIsLocked) { LastMsg = "Start Detect"; CurrentProcess = "Suche Cordonel"; - bool hasDetect = false; + Boolean hasDetect = false; if (string.IsNullOrEmpty(CurrentPcbID) || CurrentGenesisMeter == null) { var mb = new MeterBatch(); @@ -359,7 +350,7 @@ namespace ProductionUiCordonel else { CurrentProcess = "Cordonel nicht gefunden"; - LastMsg = $"No Meter found"; + LastMsg = "No Meter found"; DisposeAllConnections(); } @@ -381,7 +372,6 @@ namespace ProductionUiCordonel if (string.IsNullOrEmpty(ret) || ret != CurrentPcbID) { LastMsg = "Meter connection lost"; - hasDetect = false; DisposeAllConnections(); CurrentPcbID = ""; @@ -396,13 +386,11 @@ namespace ProductionUiCordonel } return hasDetect; } - else - { - LastMsg = "Meter is still connected (locked)"; - return true; - } + + LastMsg = "Meter is still connected (locked)"; + return true; } - private void TmrAutoDetect_Elapsed(object sender, ElapsedEventArgs e) + private void TmrAutoDetect_Elapsed(Object sender, ElapsedEventArgs e) { tmrAutoDetect.Enabled = false; var hasDetect = Detect(true, 1); @@ -419,7 +407,7 @@ namespace ProductionUiCordonel private ProductionProcessCheckOrderNumber orderBarcode; private ProductionProcessCheckSerialNumber serialBarcode; - public void SetUpBlank(bool retry, bool abort = false) + public void SetUpBlank(Boolean retry, Boolean abort = false) { pc.Processes = new List(); @@ -456,7 +444,7 @@ namespace ProductionUiCordonel var radioCheck = new ProductionProcessRadioCheck(); - orderBarcode.isDone += delegate (object sender, EventArgs e) + orderBarcode.isDone += delegate (Object sender, EventArgs e) { radioCheck.Ordernumber = ((ProductionProcessCheckOrderNumber)sender).Ordernumber; }; @@ -485,7 +473,7 @@ namespace ProductionUiCordonel errorP.isDone += allProcessesDone; pc.ErrorProcess = errorP; - var successeP = new ProductionProcessDone(false); + var successeP = new ProductionProcessDone(); successeP.isDone += allProcessesDone; pc.DoneProcess = successeP; @@ -504,7 +492,7 @@ namespace ProductionUiCordonel } } - private void CheckOrder_isDone(object sender, EventArgs e) + private void CheckOrder_isDone(Object sender, EventArgs e) { OrderNumber = ((ProductionProcessCheckOrderNumber)sender).Ordernumber; @@ -512,7 +500,7 @@ namespace ProductionUiCordonel } - private void Radio_CheckOrder_isDone(object sender, EventArgs e) + private void Radio_CheckOrder_isDone(Object sender, EventArgs e) { OrderNumber = ((ProductionProcessCheckOrderNumber)sender).Ordernumber; @@ -520,7 +508,7 @@ namespace ProductionUiCordonel } - private void allProcessesDone(object sender, Tuple e) + private void allProcessesDone(Object sender, Tuple e) { detectIsLocked = false; if (e.Item3) @@ -565,7 +553,7 @@ namespace ProductionUiCordonel } - private void UiElmEnable(UIElement elm, bool isEnabled) + private void UiElmEnable(UIElement elm, Boolean isEnabled) { elm.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => @@ -575,14 +563,14 @@ namespace ProductionUiCordonel } )); } - private void PcOnProcessLogHandler(object sender, PopUpProcessLogArgs e) + private void PcOnProcessLogHandler(Object sender, PopUpProcessLogArgs e) { txtLog.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { if (e != null) { - txtLog.Text = e.Data + System.Environment.NewLine + txtLog.Text; + txtLog.Text = e.Data + Environment.NewLine + txtLog.Text; } } )); @@ -616,7 +604,7 @@ namespace ProductionUiCordonel } } - private void updateContentControl(ContentControl ctl, string text) + private void updateContentControl(ContentControl ctl, String text) { ctl.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => @@ -670,7 +658,7 @@ namespace ProductionUiCordonel } - private void Pc_ProcessStateChangedHandler(object sender, EventArgs e) + private void Pc_ProcessStateChangedHandler(Object sender, EventArgs e) { if (sender is IProductionProcess) { @@ -705,14 +693,14 @@ namespace ProductionUiCordonel } - private void BtnSwitchAutoDetect_Click(object sender, RoutedEventArgs e) + private void BtnSwitchAutoDetect_Click(Object sender, RoutedEventArgs e) { Settings.AutoDetect = !Settings.AutoDetect; storeSetting(); useSetting(); } - private void CbxSlotBox_SelectionChanged(object sender, SelectionChangedEventArgs e) + private void CbxSlotBox_SelectionChanged(Object sender, SelectionChangedEventArgs e) { } @@ -721,11 +709,11 @@ namespace ProductionUiCordonel Settings.Update("ProductionUiConfig.json"); } - private void BtnConntect_Click(object sender, RoutedEventArgs e) + private void BtnConntect_Click(Object sender, RoutedEventArgs e) { - var hasDetect = Detect(false, (int)cbxSlotBox.SelectedValue); + var hasDetect = Detect(false, (Int32)cbxSlotBox.SelectedValue); - Settings.Slot = (int)cbxSlotBox.SelectedValue; + Settings.Slot = (Int32)cbxSlotBox.SelectedValue; storeSetting(); } private void runDetect() @@ -742,7 +730,7 @@ namespace ProductionUiCordonel pc.Start(CurrentGenesisMeter); } } - private void BtnDetect_Click(object sender, RoutedEventArgs e) + private void BtnDetect_Click(Object sender, RoutedEventArgs e) { runDetect(); } @@ -751,23 +739,23 @@ namespace ProductionUiCordonel var sb = new StringBuilder(); var fileName = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}_ReturnNoteTxt_{lblPcbID.Content}.txt"; sb.AppendLine($"Aufallschein {DateTime.Now}"); - sb.AppendLine($"----------------------------------"); + sb.AppendLine("----------------------------------"); sb.AppendLine($"PcbId {lblPcbID.Content}"); sb.AppendLine($"Auftrag {lblOrderNumber.Content}"); sb.AppendLine($"Seriennummer {lblSerialNumber.Content}"); sb.AppendLine($"Status {lblMessage.Text}"); - sb.AppendLine($"-------------Meldung---------------"); + sb.AppendLine("-------------Meldung---------------"); sb.Append($"{txtLog.Text}"); File.WriteAllText(fileName, sb.ToString()); //txtLog.Text - System.Diagnostics.Process.Start(fileName); + Process.Start(fileName); } - private void Window_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) + private void Window_PreviewKeyDown(Object sender, KeyEventArgs e) { txtInputHidden.Focus(); - if (e.Key == System.Windows.Input.Key.Enter) + if (e.Key == Key.Enter) { if (serialBarcode?.GetUserControl() is UcBarcodeInput bar) { diff --git a/Common/ProductionUiCordonel/MainWindow.xaml.cs b/Common/ProductionUiCordonel/MainWindow.xaml.cs index d1ab3a52..0825efaa 100644 --- a/Common/ProductionUiCordonel/MainWindow.xaml.cs +++ b/Common/ProductionUiCordonel/MainWindow.xaml.cs @@ -62,14 +62,14 @@ namespace ProductionUiCordonel public EventHandler OnPcbIdDetect; - private int intervalWithoutDetect = 1000; - private int intervalWithDetect = 10000; - private string _currentPcbID; + private Int32 intervalWithoutDetect = 1000; + private Int32 intervalWithDetect = 10000; + private String _currentPcbID; public PickingViewModel PickingData = new PickingViewModel(); - public string CurrentPcbID + public String CurrentPcbID { set { @@ -127,8 +127,8 @@ namespace ProductionUiCordonel } } - private string _lastMsg; - public string LastMsg + private String _lastMsg; + public String LastMsg { set { @@ -160,7 +160,7 @@ namespace ProductionUiCordonel } public ApplicationSettings Settings { get; set; } - private void Window_Initialized(object sender, EventArgs e) + private void Window_Initialized(Object sender, EventArgs e) { var configfile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), nameof(Xylem.Common.Hardware.WaterMeter.Genesis), ProgramConfig.SerialConfigFileName); @@ -189,7 +189,7 @@ namespace ProductionUiCordonel useSetting(true); } - private void TmrAutoDetect_Elapsed(object sender, ElapsedEventArgs e) + private void TmrAutoDetect_Elapsed(Object sender, ElapsedEventArgs e) { tmrAutoDetect.Enabled = false; var hasDetect = Detect(true, 1); @@ -205,25 +205,25 @@ namespace ProductionUiCordonel } - private void BtnConntect_Click(object sender, RoutedEventArgs e) + private void BtnConntect_Click(Object sender, RoutedEventArgs e) { - var hasDetect = Detect(false, (int)cbxSlotBox.SelectedValue); + var hasDetect = Detect(false, (Int32)cbxSlotBox.SelectedValue); - Settings.Slot = (int)cbxSlotBox.SelectedValue; + Settings.Slot = (Int32)cbxSlotBox.SelectedValue; storeSetting(); } - private void updateUi(ContentControl c, string content) + private void updateUi(ContentControl c, String content) { c.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { c.Content = content; })); } - private void updateUi(TextBox c, string content) + private void updateUi(TextBox c, String content) { c.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { c.Text = content; })); } - private void updateUi(TextBlock c, string content) + private void updateUi(TextBlock c, String content) { c.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { c.Text = content; })); @@ -231,7 +231,7 @@ namespace ProductionUiCordonel private MeterBatch CurrentBatch; private GenesisMeter _currentMeter; - private bool detectIsLocked; + private Boolean detectIsLocked; private GenesisMeter CurrentMeter { @@ -254,12 +254,12 @@ namespace ProductionUiCordonel } } - private bool Detect(bool IgnorErrors, int slot) + private Boolean Detect(Boolean IgnorErrors, Int32 slot) { if (!detectIsLocked) { LastMsg = "Start Detect"; - bool hasDetect = false; + Boolean hasDetect = false; if (string.IsNullOrEmpty(CurrentPcbID) || CurrentMeter == null) { var mb = new MeterBatch(); @@ -327,7 +327,7 @@ namespace ProductionUiCordonel - private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) + private void Window_Closing(Object sender, System.ComponentModel.CancelEventArgs e) { DisposeAllConnections(); } @@ -351,7 +351,7 @@ namespace ProductionUiCordonel - private void GetPcbMapping(string pcbID) + private void GetPcbMapping(String pcbID) { if (string.IsNullOrEmpty(pcbID)) { @@ -364,7 +364,7 @@ namespace ProductionUiCordonel try { var responseJson = LocalWebRequest.GetRequest(url); - var a = JsonConvert.DeserializeObject(responseJson); + var a = JsonConvert.DeserializeObject(responseJson); if (ucFinalRadioTest != null) @@ -405,38 +405,38 @@ namespace ProductionUiCordonel - private void Button_Click(object sender, RoutedEventArgs e) + private void Button_Click(Object sender, RoutedEventArgs e) { } - private void UcFinalRadioTest_Loaded(object sender, RoutedEventArgs e) + private void UcFinalRadioTest_Loaded(Object sender, RoutedEventArgs e) { ucFinalRadioTest.OnLockMeter += UcFinalRadioTest_OnLockMeter; ucFinalRadioTest.OnReleaseMeter += UcFinalRadioTest_OnReleaseMeter; } - private void UcFinalRadioTest_OnLockMeter(object sender, EventArgs e) + private void UcFinalRadioTest_OnLockMeter(Object sender, EventArgs e) { detectIsLocked = true; } - private void UcFinalRadioTest_OnReleaseMeter(object sender, EventArgs e) + private void UcFinalRadioTest_OnReleaseMeter(Object sender, EventArgs e) { detectIsLocked = false; ucFinalRadioTest.SetUpBlank(false); } - private void BtnSwitchAutoDetect_Click(object sender, RoutedEventArgs e) + private void BtnSwitchAutoDetect_Click(Object sender, RoutedEventArgs e) { Settings.AutoDetect = !Settings.AutoDetect; storeSetting(); useSetting(); } - private void CbxSlotBox_SelectionChanged(object sender, SelectionChangedEventArgs e) + private void CbxSlotBox_SelectionChanged(Object sender, SelectionChangedEventArgs e) { } @@ -447,7 +447,7 @@ namespace ProductionUiCordonel - private void useSetting(bool setSlot = false) + private void useSetting(Boolean setSlot = false) { tmrAutoDetect.Enabled = Settings.AutoDetect; tblkAutodetectState.Text = "Off"; @@ -474,7 +474,7 @@ namespace ProductionUiCordonel } - private void StackPanel_SizeChanged(object sender, SizeChangedEventArgs e) + private void StackPanel_SizeChanged(Object sender, SizeChangedEventArgs e) { ucFinalRadioTest.Height = e.NewSize.Height; diff --git a/Common/ProductionUiCordonel/Model/FinalTestModel.cs b/Common/ProductionUiCordonel/Model/FinalTestModel.cs new file mode 100644 index 00000000..c6a9c6a3 --- /dev/null +++ b/Common/ProductionUiCordonel/Model/FinalTestModel.cs @@ -0,0 +1,193 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using ProductionUiCordonel.Data; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.Consts; +using Xylem.Common.Utils.ProcessExec.EventArguments; + +namespace ProductionUiCordonel.Model +{ + /// + /// Final test model preparing the Cordonel for shipping: + /// - Setup device with standard parameters covered by the VAKO or customer specific CSD, + /// - If radio is installed: radio test, + /// - Requiring radio key from LuDB, + /// - Requiring 7 passwords for the Cordonel access levels, + /// - Building the password file (Level 3 is the modified skeleton key), + /// - Store all configurations, + /// - Reboot the Cordonel to load all settings from FLASH to RAM, + /// - Configuration check of all parameters defined by VAKO and CSD. + /// + class FinalTestModel + { + + #region Variables + + /// + /// Port scan result event for message dispatcher to caller + /// + public event EventHandler OnProcessUpdate; + + // Text for caller to inform about actual process being carried out + private String _actualOperation; + + // states of the state machine, the backup state locks against repeated execution + private FinalTestState _finalTestState; + private FinalTestState _finalTestBackupState; + + // Process counter for caller to monitor actual progress + private Int32 _overallProcessedStepsCtr; + private Int32 _singleProcessedStepsCtr; + + // maximum processing steps for calculation of progress bar + private const Int32 MaxOverallProcessSteps = 20; + private Int32 _maxSingleProcessSteps; + + // processing retries + private const Int32 MaxProcessRetries = 2; + private Int32 _processRetryCtr; + + #endregion + + #region Events + /// + /// Process event + /// + /// + /// + /// + /// - Initial + /// + public virtual void ProcessUpdate_Event(Object sender, ProcessExecEventArgs e) + { + // copy text from overall messages to actual, because this is from sub-routine + OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(GetActualStateText(), + OverallProcessPercent, _actualOperation, e.OverallProcessPercent)); + } + + #endregion + + #region ProcessInformation + + /// + /// Process counter in percent + /// + /// + /// - Initial + /// + public Double OverallProcessPercent => 100.0d * + (_overallProcessedStepsCtr + _singleProcessedStepsCtr) / MaxOverallProcessSteps; + + /// + /// Single file process counter in percent + /// + /// + /// - Initial + /// + public Double SingleFileProcessPercent => 100.0d * _singleProcessedStepsCtr / _maxSingleProcessSteps; + + /// + /// Returns the final test state text information for display + /// + /// + /// + /// - Initial + /// + public String GetActualStateText() + { + // search text assigned to current state + var text = FinalTestStateInfo.GetTextFromState(_finalTestState); + if (_finalTestState == FinalTestState.Idle) + { + return text; + } + + text += _processRetryCtr > 0 ? $"{_processRetryCtr}" : ""; + if (_overallProcessedStepsCtr > 0) + { + text += $"{_overallProcessedStepsCtr}/{MaxOverallProcessSteps}"; + } + + return text; + } + + #endregion + #region CtorAssignment + + /// + /// Ctor + /// + /// + /// - Initial + /// + public FinalTestModel() + { + } + + + /// + /// Dispose + /// + public void Dispose() + { + } + #endregion + + #region StateMachine + /// + /// State machine of FinalTestModel. + /// + /// + /// - Initial + /// + public void StateMachine() + { + + // avoid repeated execution of the state machine of identical state + if (_finalTestState == _finalTestBackupState) + { + Thread.Sleep(1); + } + else + { + // remind backup state to avoid repeated execution and side effects + _finalTestBackupState = _finalTestState; + switch (_finalTestState) + { + case FinalTestState.Idle: + break; + + case FinalTestState.StartInitial: + _overallProcessedStepsCtr = 0; + _singleProcessedStepsCtr = 0; + _finalTestState = FinalTestState.Idle; + break; + + case FinalTestState.StepFailed: + _finalTestState = _processRetryCtr++ < MaxProcessRetries + ? FinalTestState.RepeatFinalTest + : FinalTestState.FinalTestFailed; + break; + + case FinalTestState.RepeatFinalTest: + _overallProcessedStepsCtr = 0; + _singleProcessedStepsCtr = 0; + _finalTestState = FinalTestState.Idle; + break; + + default: + _finalTestState = FinalTestState.Idle; + break; + + } + }// lock repeated execution of identical state + + #endregion + + } + } +} diff --git a/Common/ProductionUiCordonel/Model/IMultiModeChildViewModel.cs b/Common/ProductionUiCordonel/Model/IMultiModeChildViewModel.cs index 4b736cd1..2ab80257 100644 --- a/Common/ProductionUiCordonel/Model/IMultiModeChildViewModel.cs +++ b/Common/ProductionUiCordonel/Model/IMultiModeChildViewModel.cs @@ -10,8 +10,8 @@ namespace ProductionUiCordonel.Model { public interface IMultiModeChildViewModel : INotifyPropertyChanged, IDisposable { - string GetChildIdent(); + String GetChildIdent(); - void InputText(string text); + void InputText(String text); } } diff --git a/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs b/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs index c261e621..b71ada3b 100644 --- a/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs +++ b/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs @@ -12,8 +12,8 @@ namespace ProductionUiCordonel.Model { public class MarriageMultiModeViewModel : BaseMultiModeChildViewModel { - private bool canMarry = false; - public bool CanMarry + private Boolean canMarry = false; + public Boolean CanMarry { get { return canMarry; } set @@ -24,8 +24,8 @@ namespace ProductionUiCordonel.Model } - private int serialNr; - public int SerialNr + private Int32 serialNr; + public Int32 SerialNr { get { return serialNr; } set @@ -36,18 +36,18 @@ namespace ProductionUiCordonel.Model } - private bool locked = false; - public MarriageMultiModeViewModel(string ctrName, int slotNR, List barcodeTrigger, int? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID) + private Boolean locked = false; + public MarriageMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID) { base.VisibilityMarriage = System.Windows.Visibility.Visible; base.MeterDetectedHandler += PickingMultiModeViewModel_MeterDetectedHandler; } - internal async Task Store() + internal async Task Store() { var url = $"{ServiceUrls.MarriageServiceUrl()}SetPcbToSerial?PcbId={CurrentPcbID}&SerialNumber={SerialNr}&returnMetroData=0"; - return await Task.Run(() => + return await Task.Run(() => { try { @@ -102,7 +102,7 @@ namespace ProductionUiCordonel.Model }); } - private void PickingMultiModeViewModel_MeterDetectedHandler(object sender, EventArgs e) + private void PickingMultiModeViewModel_MeterDetectedHandler(Object sender, EventArgs e) { CheckBtnEnable(); } @@ -122,7 +122,7 @@ namespace ProductionUiCordonel.Model - public override void InputText(string text) + public override void InputText(String text) { try { @@ -152,7 +152,7 @@ namespace ProductionUiCordonel.Model } - public override bool SlotIsLocked() + public override Boolean SlotIsLocked() { return locked; } diff --git a/Common/ProductionUiCordonel/Model/MultiModeChildViewModel.cs b/Common/ProductionUiCordonel/Model/MultiModeChildViewModel.cs index 0229981c..947867d6 100644 --- a/Common/ProductionUiCordonel/Model/MultiModeChildViewModel.cs +++ b/Common/ProductionUiCordonel/Model/MultiModeChildViewModel.cs @@ -20,11 +20,11 @@ namespace ProductionUiCordonel private Timer tmrAutoDetect; public EventHandler OnPcbIdDetect; - public List BarcodeTrigger = new List(); + public List BarcodeTrigger = new List(); - private int intervalWithoutDetect = 1000; - private int intervalWithDetect = 10000; - private string _currentPcbID; + private Int32 intervalWithoutDetect = 1000; + private Int32 intervalWithDetect = 10000; + private String _currentPcbID; private MeterBatch Batch = new MeterBatch(); private Visibility visibilityMarriage = Visibility.Collapsed; public Visibility VisibilityMarriage @@ -72,8 +72,8 @@ namespace ProductionUiCordonel } - public string currentSlotStateText = "none"; - public string CurrentSlotStateText + public String currentSlotStateText = "none"; + public String CurrentSlotStateText { get { @@ -134,7 +134,7 @@ namespace ProductionUiCordonel } - private string slotInfo = "-"; + private String slotInfo = "-"; public String SlotInfo { get { return slotInfo; } @@ -157,7 +157,7 @@ namespace ProductionUiCordonel Error, Fatal } - private string childName = "asd"; + private String childName = "asd"; public String ChildName { get { return childName; } @@ -168,7 +168,7 @@ namespace ProductionUiCordonel } } - private string order; + private String order; public String Order { get { return order; } @@ -180,7 +180,7 @@ namespace ProductionUiCordonel } - public string CurrentPcbID + public String CurrentPcbID { get { @@ -204,14 +204,14 @@ namespace ProductionUiCordonel PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } - public string GetChildIdent() + public String GetChildIdent() { return ChildName; } - public int SlotNr; - public BaseMultiModeChildViewModel(string ctrName, int slotNR,List barcodeTrigger, int? StationId = null, bool useTimer = true) + public Int32 SlotNr; + public BaseMultiModeChildViewModel(String ctrName, Int32 slotNR,List barcodeTrigger, Int32? StationId = null, Boolean useTimer = true) { _logger = NLogHelper.CreateOrGetLogger("ProductionUI"); ChildName = ctrName; @@ -227,7 +227,7 @@ namespace ProductionUiCordonel BarcodeTrigger = barcodeTrigger; } - public void TmrAutoDetect_Elapsed(object sender, EventArgs e) + public void TmrAutoDetect_Elapsed(Object sender, EventArgs e) { CurrentSlotState = SlotState.IsDetecting; tmrAutoDetect.Enabled = false; @@ -255,24 +255,24 @@ namespace ProductionUiCordonel } } - public virtual void InputText(string text) + public virtual void InputText(String text) { Order = text; } - public void Log(string txt) + public void Log(String txt) { _logger?.Info(txt); } - public abstract bool SlotIsLocked(); + public abstract Boolean SlotIsLocked(); public event EventHandler MeterDetectedHandler; - private bool Detect(int slot) + private Boolean Detect(Int32 slot) { if (!SlotIsLocked()) { Log("Start Detect"); - bool hasDetect = false; + Boolean hasDetect = false; if (string.IsNullOrEmpty(CurrentPcbID) || CurrentMeter == null) { Batch = new MeterBatch(); diff --git a/Common/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs b/Common/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs index c5a336f8..8fc53dda 100644 --- a/Common/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs +++ b/Common/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs @@ -19,10 +19,10 @@ namespace ProductionUiCordonel.Model { internal class MultiModeMasterViewModel : INotifyPropertyChanged { - private string pickingState = "Warte auf Scanner"; - private string pickingScanner = "keine Verbindung"; - private string pickingSlot = "-"; - private string pickingResult = "-"; + private String pickingState = "Warte auf Scanner"; + private String pickingScanner = "keine Verbindung"; + private String pickingSlot = "-"; + private String pickingResult = "-"; private System.Windows.Media.Brush pickingResultColor; public System.Windows.Media.Brush PickingResultColor @@ -37,7 +37,7 @@ namespace ProductionUiCordonel.Model NotifyPropertyChanged(nameof(PickingResultColor)); } } - public string PickingState + public String PickingState { get { @@ -49,7 +49,7 @@ namespace ProductionUiCordonel.Model NotifyPropertyChanged(nameof(PickingState)); } } - public string PickingScanner + public String PickingScanner { get { @@ -61,7 +61,7 @@ namespace ProductionUiCordonel.Model NotifyPropertyChanged(nameof(PickingScanner)); } } - public string PickingSlot + public String PickingSlot { get { @@ -73,7 +73,7 @@ namespace ProductionUiCordonel.Model NotifyPropertyChanged(nameof(PickingSlot)); } } - public string PickingResult + public String PickingResult { get { @@ -117,12 +117,12 @@ namespace ProductionUiCordonel.Model private class BarScanner : IDisposable { - private bool isRuning = false; + private Boolean isRuning = false; public String Input = ""; private String Port; private CancellationToken Cancellation; private Task WaitForScannerTask; - public BarScanner(string port, CancellationToken cancellation) + public BarScanner(String port, CancellationToken cancellation) { Port = port; Cancellation = cancellation; @@ -175,7 +175,7 @@ namespace ProductionUiCordonel.Model } - public bool Compare(Dictionary checkAppsIdVersion, uint Frequency, uint MeterSize, bool PressurePresent) + public Boolean Compare(Dictionary checkAppsIdVersion, UInt32 Frequency, UInt32 MeterSize, Boolean PressurePresent) { using (var Batch = new MeterBatch()) { @@ -186,7 +186,7 @@ namespace ProductionUiCordonel.Model meter.SetupFromConfigFile(PickingSlotNr); Batch.AddMeter(meter); PickingState = "Am Zähler anmelden"; - if ((bool)meter.Login()) + if ((Boolean)meter.Login()) { meter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PickingStarted); var ret = RunCheck(checkAppsIdVersion, Frequency, MeterSize, PressurePresent, meter); @@ -214,7 +214,7 @@ namespace ProductionUiCordonel.Model return false; } - private bool RunCheck(Dictionary checkAppsIdVersion, uint Frequency, uint MeterSize, bool PressurePresent, GenesisMeter meter) + private Boolean RunCheck(Dictionary checkAppsIdVersion, UInt32 Frequency, UInt32 MeterSize, Boolean PressurePresent, GenesisMeter meter) { PickingState = $"Üperprüfe Parameter"; var FrequencyReadOut = RegisterConverter.ConvertTo(meter.ReadRegister("SENSUSRADIO_FrequencyIndicator")); @@ -232,7 +232,7 @@ namespace ProductionUiCordonel.Model } - var PressureReadOut = RegisterConverter.ConvertTo(meter.ReadRegister("METROLOGYASST_PressurePresent")); + var PressureReadOut = RegisterConverter.ConvertTo(meter.ReadRegister("METROLOGYASST_PressurePresent")); if (PressureReadOut != PressurePresent) { if (PressurePresent) @@ -293,12 +293,12 @@ namespace ProductionUiCordonel.Model private PickingCompareItem PickingOrderDetails; private BarScanner PickingBarScanner; - private string PickingOrder; - private string PickingPcbId; + private String PickingOrder; + private String PickingPcbId; - private string PickingScannerPort = "COM6"; - private int PickingSlotNr = 1; + private String PickingScannerPort = "COM6"; + private Int32 PickingSlotNr = 1; //PickingState,PickingScanner,PickingSlot,PickingResult private void PickingLoop(CancellationToken token) { @@ -328,7 +328,7 @@ namespace ProductionUiCordonel.Model case PickingStateMachine.WaitForScanning: PickingScanner = $"Offen {PickingScannerPort}"; PickingState = $"Warte auf Scannereingabe({PickingScannerPort})"; - if (PickingBarScanner != null && !String.IsNullOrEmpty(PickingBarScanner.Input)) + if (PickingBarScanner != null && !string.IsNullOrEmpty(PickingBarScanner.Input)) { PickingOrder = PickingBarScanner.Input; PickingScanner = $"Geschlossen {PickingScannerPort}"; @@ -459,7 +459,7 @@ namespace ProductionUiCordonel.Model break; case PickingStateMachine.WaitForBuildingMeterReady: - if (PickingBarScanner != null && !String.IsNullOrEmpty(PickingBarScanner.Input)) + if (PickingBarScanner != null && !string.IsNullOrEmpty(PickingBarScanner.Input)) { if (PickingBarScanner.Input == "%Cordonel_SAP_100%") @@ -493,7 +493,7 @@ namespace ProductionUiCordonel.Model break; case PickingStateMachine.WaitForBuildingPressureReady: - if (PickingBarScanner != null && !String.IsNullOrEmpty(PickingBarScanner.Input)) + if (PickingBarScanner != null && !string.IsNullOrEmpty(PickingBarScanner.Input)) { if (PickingBarScanner.Input == "%Cordonel_SAP_101%") @@ -522,7 +522,7 @@ namespace ProductionUiCordonel.Model } - private void Log(string v) + private void Log(String v) { //throw new NotImplementedException(); } diff --git a/Common/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs b/Common/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs index 4a3257ae..ed517287 100644 --- a/Common/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs +++ b/Common/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs @@ -21,8 +21,8 @@ namespace ProductionUiCordonel.Model public class PickingMultiModeViewModel : BaseMultiModeChildViewModel { - private bool inputIsEnabled = false; - public bool InputIsEnabled + private Boolean inputIsEnabled = false; + public Boolean InputIsEnabled { get { return inputIsEnabled; } set @@ -34,31 +34,31 @@ namespace ProductionUiCordonel.Model - private bool locked = false; - public PickingMultiModeViewModel(string ctrName, int slotNR, List barcodeTrigger, int? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID,false) + private Boolean locked = false; + public PickingMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID,false) { VisibilityPicking = Visibility.Visible; base.MeterDetectedHandler += PickingMultiModeViewModel_MeterDetectedHandler; } - private void PickingMultiModeViewModel_MeterDetectedHandler(object sender, EventArgs e) + private void PickingMultiModeViewModel_MeterDetectedHandler(Object sender, EventArgs e) { } - public override bool SlotIsLocked() + public override Boolean SlotIsLocked() { return locked; } - public override void InputText(string text) + public override void InputText(String text) { Order = text; ReloadData(false); TextForceUpdate(); } - internal void ReloadData(bool reset) + internal void ReloadData(Boolean reset) { Task.Run(() => @@ -113,7 +113,7 @@ namespace ProductionUiCordonel.Model //Init(CurrentMeter, new Dictionary(), OrderDteails.FrequencyIndicator, OrderDteails.MeterSize, OrderDteails.PressurePresent); - var a = new Dictionary(); + var a = new Dictionary(); a.Add(0, 486); a.Add(15, 287); if (OrderDteails.FrequencyIndicator == 868) @@ -167,7 +167,7 @@ namespace ProductionUiCordonel.Model }); } - private void UpdatePickingUi(string state, System.Windows.Media.Brush StateColor, string order, int toDo, int done) + private void UpdatePickingUi(String state, System.Windows.Media.Brush StateColor, String order, Int32 toDo, Int32 done) { Message = state; Order = order; @@ -228,7 +228,7 @@ namespace ProductionUiCordonel.Model } } - public string Message { get; set; } + public String Message { get; set; } private enum OverallStatus { NoDetect, @@ -237,7 +237,7 @@ namespace ProductionUiCordonel.Model CheckingIsNoMatch, CheckingIsHasError, } - public string StatusText + public String StatusText { get { @@ -278,10 +278,10 @@ namespace ProductionUiCordonel.Model } } - public int ToDo { get; private set; } - public int Done { get; private set; } + public Int32 ToDo { get; private set; } + public Int32 Done { get; private set; } - public void Init(GenesisMeter meter, Dictionary checkAppsIdVersion, uint Frequency, uint MeterSize, bool PressurePresent) + public void Init(GenesisMeter meter, Dictionary checkAppsIdVersion, UInt32 Frequency, UInt32 MeterSize, Boolean PressurePresent) { @@ -361,7 +361,7 @@ namespace ProductionUiCordonel.Model OnDataChanged?.Invoke(Data, EventArgs.Empty); } - public bool Run(string pcbID, String OrderNr) + public Boolean Run(String pcbID, String OrderNr) { var tmpData = Data.ToList(); foreach (var item in tmpData.Where(a => !a.Result.HasValue).OrderBy(a => a.Index)) diff --git a/Common/ProductionUiCordonel/Model/PickingViewModel.cs b/Common/ProductionUiCordonel/Model/PickingViewModel.cs index 2f03e41a..8c2425f7 100644 --- a/Common/ProductionUiCordonel/Model/PickingViewModel.cs +++ b/Common/ProductionUiCordonel/Model/PickingViewModel.cs @@ -47,7 +47,7 @@ namespace ProductionUiCordonel.Model CheckingIsNoMatch, CheckingIsHasError, } - public string StatusText + public String StatusText { get { @@ -89,7 +89,7 @@ namespace ProductionUiCordonel.Model } - public void Init(GenesisMeter meter, Dictionary checkAppsIdVersion, uint Frequency, uint MeterSize, bool PressurePresent) + public void Init(GenesisMeter meter, Dictionary checkAppsIdVersion, UInt32 Frequency, UInt32 MeterSize, Boolean PressurePresent) { @@ -168,7 +168,7 @@ namespace ProductionUiCordonel.Model OnDataChanged?.Invoke(Data, EventArgs.Empty); } - public bool Run(string pcbID, String OrderNr) + public Boolean Run(String pcbID, String OrderNr) { var tmpData = Data.ToList(); foreach (var item in tmpData.Where(a => !a.Result.HasValue).OrderBy(a => a.Index)) diff --git a/Common/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs b/Common/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs index feff6163..f18b2d9a 100644 --- a/Common/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs +++ b/Common/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs @@ -30,8 +30,8 @@ namespace ProductionUiCordonel.Model } - private bool inputIsEnabled = false; - public bool InputIsEnabled + private Boolean inputIsEnabled = false; + public Boolean InputIsEnabled { get { return inputIsEnabled; } set @@ -42,16 +42,16 @@ namespace ProductionUiCordonel.Model } - public bool Locked { get; set; } = false; - public int? StationID { get; set; } = null; + public Boolean Locked { get; set; } = false; + public Int32? StationID { get; set; } = null; - public PressureMultiModeViewModel(string ctrName, int slotNR, List barcodeTrigger, int? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID) + public PressureMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID) { base.VisibilityPressure = System.Windows.Visibility.Visible; StationID = stationID; } - public bool isHydraulicStaion() + public Boolean isHydraulicStaion() { if (!StationID.HasValue || StationID.Value == 1) @@ -60,12 +60,12 @@ namespace ProductionUiCordonel.Model } return true; } - public override bool SlotIsLocked() + public override Boolean SlotIsLocked() { return false; } - internal void ReloadData(bool reset) + internal void ReloadData(Boolean reset) { if (Result != null && Result.PcbId != CurrentPcbID) @@ -112,7 +112,7 @@ namespace ProductionUiCordonel.Model } } - internal void StoreData(bool successfull) + internal void StoreData(Boolean successfull) { if (Result != null && Result.PcbId == CurrentPcbID) diff --git a/Common/ProductionUiCordonel/MultiMode.xaml.cs b/Common/ProductionUiCordonel/MultiMode.xaml.cs index 692c3aaa..3424a063 100644 --- a/Common/ProductionUiCordonel/MultiMode.xaml.cs +++ b/Common/ProductionUiCordonel/MultiMode.xaml.cs @@ -51,7 +51,7 @@ namespace ProductionUiCordonel InitializeComponent(); this.Topmost = false; } - private void keyUp(object sender, KeyEventArgs e) + private void keyUp(Object sender, KeyEventArgs e) { } @@ -76,7 +76,7 @@ namespace ProductionUiCordonel } CancellationTokenSource cts; - private void Window_Loaded(object sender, RoutedEventArgs e) + private void Window_Loaded(Object sender, RoutedEventArgs e) { cts = new CancellationTokenSource(); AppSettings = new ApplicationSettings("MultiProductionUiConfig.json"); @@ -164,12 +164,12 @@ namespace ProductionUiCordonel //SetBaseFocus(); } - private void delegeChild_PosChange(object sender, EventArgs e) + private void delegeChild_PosChange(Object sender, EventArgs e) { throw new NotImplementedException(); } - private void TxtBarcodeInput_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) + private void TxtBarcodeInput_TextChanged(Object sender, System.Windows.Controls.TextChangedEventArgs e) { //if (sender is TextBox text) //{ @@ -192,7 +192,7 @@ namespace ProductionUiCordonel } - private void Window_Closed(object sender, System.EventArgs e) + private void Window_Closed(Object sender, System.EventArgs e) { cts.Cancel(); diff --git a/Common/ProductionUiCordonel/MultiModeChild.xaml.cs b/Common/ProductionUiCordonel/MultiModeChild.xaml.cs index 89a9f069..a867e692 100644 --- a/Common/ProductionUiCordonel/MultiModeChild.xaml.cs +++ b/Common/ProductionUiCordonel/MultiModeChild.xaml.cs @@ -16,7 +16,7 @@ namespace ProductionUiCordonel { public IMultiModeChildViewModel ViewModel; - public bool UseDefaultPos { get; internal set; } = true; + public Boolean UseDefaultPos { get; internal set; } = true; public event EventHandler PosChanged; @@ -55,7 +55,7 @@ namespace ProductionUiCordonel } } - internal void StartTextInputListener(string port, CancellationToken cancellation) + internal void StartTextInputListener(String port, CancellationToken cancellation) { if (port == null) { @@ -95,22 +95,22 @@ namespace ProductionUiCordonel } - internal void InputText(string text) + internal void InputText(String text) { ViewModel.InputText(text); } - private void BtnPresueFailed_Click(object sender, RoutedEventArgs e) + private void BtnPresueFailed_Click(Object sender, RoutedEventArgs e) { } - private void TxtPresurePcbId_TextChanged(object sender, TextChangedEventArgs e) + private void TxtPresurePcbId_TextChanged(Object sender, TextChangedEventArgs e) { } - private void PressureControl_OnBarcodeInput(object sender, Event.StringArgs e) + private void PressureControl_OnBarcodeInput(Object sender, Event.StringArgs e) { InputText(e.Content); } @@ -121,7 +121,7 @@ namespace ProductionUiCordonel } - private void Button_Click(object sender, RoutedEventArgs e) + private void Button_Click(Object sender, RoutedEventArgs e) { if (sender is Button btn) { @@ -129,7 +129,7 @@ namespace ProductionUiCordonel } } - private void Button_Click_1(object sender, RoutedEventArgs e) + private void Button_Click_1(Object sender, RoutedEventArgs e) { PosChanged?.Invoke(this, EventArgs.Empty); } diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs index 6d04c025..636038fd 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs @@ -52,12 +52,12 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions var url = $"{ServiceUrls.MeterInfoForTestBench()}{Meter.PcbId}"; var csdRet = LocalWebRequest.GetRequest(url); - var res = Newtonsoft.Json.JsonConvert.DeserializeObject(csdRet); + var res = Newtonsoft.Json.JsonConvert.DeserializeObject(csdRet); var CalibrationRun = res[4]; var LastTestBechState = 0; - bool? HyState = null; - bool? preState = null; + Boolean? HyState = null; + Boolean? preState = null; if (!string.IsNullOrEmpty(res[5])) { var tmp = 0; @@ -129,8 +129,8 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions //// Time Span in h in mAhr In % with one battery is 100% ////(((total used change difference / (Time span / 3600) ) / 3600000) / 19000)*100 - var loadAtH = ((((double)nowChargeV / ((double)nowSecondsV / 3600)) / 3600000) / (19000 * 2)) * 100; - var totalUsed = (((double)nowChargeV / 1000000 / 3.6) / ((19000 * 2))) * 100; + var loadAtH = ((((Double)nowChargeV / ((Double)nowSecondsV / 3600)) / 3600000) / (19000 * 2)) * 100; + var totalUsed = (((Double)nowChargeV / 1000000 / 3.6) / ((19000 * 2))) * 100; //lastFrame Meter.WriteLog($"totalUsed at EOL {totalUsed}"); diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckAttachment.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckAttachment.cs index 2ad158f7..80f373bd 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckAttachment.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckAttachment.cs @@ -25,9 +25,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions Error, Acknowledge } - public bool DialogIsDone { get; private set; } - public int OrderNumber { get; set; } - public ProductionProcessCheckAttachment(int orderNumber) + public Boolean DialogIsDone { get; private set; } + public Int32 OrderNumber { get; set; } + public ProductionProcessCheckAttachment(Int32 orderNumber) { OrderNumber = orderNumber; DialogIsDone = false; diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckOrderNumber.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckOrderNumber.cs index 6ed01bb2..9e0f24ae 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckOrderNumber.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckOrderNumber.cs @@ -28,14 +28,14 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions Print, Abort } - public bool DialogIsDone { get; private set; } - public int SerialNumber { get; private set; } - public int Ordernumber { get; private set; } + public Boolean DialogIsDone { get; private set; } + public Int32 SerialNumber { get; private set; } + public Int32 Ordernumber { get; private set; } - private int? OldOrderNumber { get; set; } + private Int32? OldOrderNumber { get; set; } - private bool Error = false; - public ProductionProcessCheckOrderNumber(int? oldOrderNumber = null) + private Boolean Error = false; + public ProductionProcessCheckOrderNumber(Int32? oldOrderNumber = null) { OldOrderNumber = oldOrderNumber; @@ -70,19 +70,19 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions isDone?.Invoke(this, EventArgs.Empty); } - private void StepMismatch(string msg) + private void StepMismatch(String msg) { UserControl.SetDesc(msg); UserControl.SetFocusMe(); //UserControl.Focus(); - base.NewStatus(msg); + NewStatus(msg); UserControl.BarcodeInput += UserControl_KeyDown; } - private void UserControl_KeyDown(object sender, string input) + private void UserControl_KeyDown(Object sender, String input) { var a = input; @@ -120,7 +120,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } - private void GetPcbMapping(string pcbID) + private void GetPcbMapping(String pcbID) { if (string.IsNullOrEmpty(pcbID)) { @@ -148,7 +148,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions using (var sr = new StreamReader(responseStream)) { var responseJson = sr.ReadToEnd(); - var a = JsonConvert.DeserializeObject(responseJson); + var a = JsonConvert.DeserializeObject(responseJson); SerialNumber = Convert.ToInt32(a[0]); Ordernumber = Convert.ToInt32(a[1]); diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckSerialNumber.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckSerialNumber.cs index 9ee88c3f..b93f17f9 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckSerialNumber.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckSerialNumber.cs @@ -28,13 +28,13 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions Print, Abort } - public bool DialogIsDone { get; private set; } - public string PcbSerialNumber { get; private set; } + public Boolean DialogIsDone { get; private set; } + public String PcbSerialNumber { get; private set; } - public string AltRadio { get; private set; } + public String AltRadio { get; private set; } - private bool Error = false; - public ProductionProcessCheckSerialNumber(String pcbSerialNumber, string altRadio = null) + private Boolean Error = false; + public ProductionProcessCheckSerialNumber(String pcbSerialNumber, String altRadio = null) { PcbSerialNumber = pcbSerialNumber; @@ -69,7 +69,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions isDone?.Invoke(this, EventArgs.Empty); } - private void StepMismatch(string msg) + private void StepMismatch(String msg) { base.currentProcessState = ProductionProcessState.Error; base.NewStatus(msg); @@ -79,7 +79,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } - private void UserControl_KeyDown(object sender, string input) + private void UserControl_KeyDown(Object sender, String input) { var a = input; PcbSerialNumber = Meter.SerialNumber; diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessDone.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessDone.cs index 85cae768..52ac9230 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessDone.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessDone.cs @@ -14,7 +14,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { public class ProductionProcessDone : BaseProductionProcess { - public event EventHandler> isDone; + public event EventHandler> isDone; private UcDialog UserControl; public DialogResult Result = DialogResult.None; public enum DialogResult @@ -24,9 +24,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions Print, Abort } - public bool DialogIsDone { get; private set; } - private bool Error = false; - public ProductionProcessDone(bool error = false) + public Boolean DialogIsDone { get; private set; } + private Boolean Error = false; + public ProductionProcessDone(Boolean error = false) { Error = error; DialogIsDone = false; @@ -78,10 +78,10 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions break; } } - isDone?.Invoke(null, new Tuple(retry, abort, print)); + isDone?.Invoke(null, new Tuple(retry, abort, print)); } - private void StepError(string ErrorText = "Ein Fehler ist aufgetreten") + private void StepError(String ErrorText = "Ein Fehler ist aufgetreten") { UserControl.SetDesc(ErrorText); diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationFix.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationFix.cs index 2bcabab6..46e3050a 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationFix.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationFix.cs @@ -59,7 +59,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions public Task> wirteRegisterInBetweenCheck(String reg, Int32 value, Boolean waitForResult = true, - Boolean checkRegister = false, int addToCheck = 10, int addFromCheck = 0) + Boolean checkRegister = false, Int32 addToCheck = 10, Int32 addFromCheck = 0) { return new Task>(() => { @@ -299,7 +299,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions - var funkadresse = new List(); + var funkadresse = new List(); funkadresse.AddRange((new Byte[] { 0x0E, 0x9F, 0xAC, 0xC6 }).ToArray()); funkadresse.AddRange((new Byte[] { 0xA0, 0xE1, 0xEF, 0x1C }).ToArray()); funkadresse.AddRange((new Byte[] { 0x3B, 0x27, 0xA4, 0x9B }).ToArray()); @@ -349,7 +349,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions var ret = true; - int done = 0; + Int32 done = 0; foreach (var cTask in overAllResult) { cTask.RunSynchronously(); diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs index a982e8cd..357c8a66 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs @@ -15,9 +15,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { private UcPlain UserControl; private ProductionProcessConnect connectProcess; - private bool hasRadio; + private Boolean hasRadio; - public ProductionProcessFinalParameterizationVakoCsd(ProductionProcessConnect connectProcess, bool registerHasRadio = true) + public ProductionProcessFinalParameterizationVakoCsd(ProductionProcessConnect connectProcess, Boolean registerHasRadio = true) { this.connectProcess = connectProcess; name = "Kunden Parametrierung"; @@ -66,7 +66,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions public Task> wirteRegisterInBetweenCheck(String reg, Int32 value, Boolean waitForResult = true, - Boolean checkRegister = false, int addToCheck = 10, int addFromCheck = 0) + Boolean checkRegister = false, Int32 addToCheck = 10, Int32 addFromCheck = 0) { return new Task>(() => { @@ -126,7 +126,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions //SENSUSRADIO_EncryptionKey dont reserve SENSUSRADIO_EncryptionKey! if (item.RegisterName.ToLower().Contains("displaypow".ToLower()) || item.RegisterName.ToLower().Contains("METROLOGYASST_FlowPoint".ToLower())) { - overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, new byte[] { item.RegisterValue.ToArray()[0] }, true, true)); + overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, new Byte[] { item.RegisterValue.ToArray()[0] }, true, true)); } else if (item.RegisterName.ToLower().Contains("SENSUSRADIO_EncryptionKey".ToLower())) { @@ -146,9 +146,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions //} } - overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmEnableMask", new byte[] { 0x00, 0x00, 0x80, 0x53 }.Reverse().ToArray(), true, false)); ; - overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmBroadcastMask", new byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray(), true, false)); - overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmVisualMask", new byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray(), true, false)); + overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmEnableMask", new Byte[] { 0x00, 0x00, 0x80, 0x53 }.Reverse().ToArray(), true, false)); ; + overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmBroadcastMask", new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray(), true, false)); + overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmVisualMask", new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray(), true, false)); foreach (var item in myJsonResponse.Where(m => m.Source == ProgrammingSource.Csd)) @@ -194,7 +194,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } var ret = true; - int done = 0; + Int32 done = 0; foreach (var cTask in overAllResult) { diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs index 4213afb5..19c293f5 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs @@ -38,9 +38,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions return UserControl; } - private void updateImage(Image ctlImage, bool? success = null) + private void updateImage(Image ctlImage, Boolean? success = null) { - string path = "/Resources/iconWating.png"; + String path = "/Resources/iconWating.png"; if (success.HasValue) { if (success.Value) @@ -60,7 +60,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { base.currentProcessState = ProductionProcessState.Done; return; - bool ret = RequestPassword(); + Boolean ret = RequestPassword(); updateImage(UserControl.RequestPassword, ret); base.Progress = base.Progress + 16; @@ -137,14 +137,14 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { public Int64? orderNumber = null; public Int64? radioAdress = null; - public string Skeleton = ""; - public List listOfHashes = new List(); - public List listOfPasswords = new List(); + public String Skeleton = ""; + public List listOfHashes = new List(); + public List listOfPasswords = new List(); } private MeterPasswordContainer pwContainer = new MeterPasswordContainer(); private MeterPwdFile meterPwdFile; - public bool RequestPassword() + public Boolean RequestPassword() { base.NewStatus($"Request Passwords"); var url = ServiceUrls.GenesisGetPasswordContainerServiceUrl(); @@ -152,7 +152,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions url = ($"{url}{Meter.PcbId}"); var errorCode = 0; - var header = new Dictionary(); + var header = new Dictionary(); header.Add("Cache-Control", "no-cache"); header.Add("X-Node-Token", "d5b8c0b2-81f6-4421-80d0-44eb2093e616"); var resp = LocalWebRequest.GetRequestWithError(url, out errorCode, 20000, header,true); @@ -166,13 +166,13 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } - public bool CreatePasswordFile() + public Boolean CreatePasswordFile() { meterPwdFile = new MeterPwdFile(Meter); return meterPwdFile.BuildPwdFile(pwContainer.listOfPasswords, 1, pwContainer.Skeleton); } - public bool WritePasswordFileToMeter() + public Boolean WritePasswordFileToMeter() { if (meterPwdFile.UnlockEraseWriteMeterPwdFile()) { @@ -180,7 +180,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } return false; } - public bool UpdatePasswordinDb() + public Boolean UpdatePasswordinDb() { var newPs = Encoding.UTF8.GetString(pwContainer.listOfPasswords.Last()); diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessRadioCheck.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessRadioCheck.cs index b3e22253..172c63f5 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessRadioCheck.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessRadioCheck.cs @@ -122,24 +122,24 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions private SIRTCOM.Statemashine stm; private static HttpClient httpclient; - private byte? RSSI_PAM_Min; - private byte? RSSI_PAM_Max; - private byte? RSSI_PAM; - private byte? RSSI_SEMI_Min; - private byte? RSSI_SEMI_Max; - private byte? RSSI_SEMI; + private Byte? RSSI_PAM_Min; + private Byte? RSSI_PAM_Max; + private Byte? RSSI_PAM; + private Byte? RSSI_SEMI_Min; + private Byte? RSSI_SEMI_Max; + private Byte? RSSI_SEMI; - public byte BoxNr; + public Byte BoxNr; - public int Ordernumber; + public Int32 Ordernumber; public UInt32 RadioAdress; - public byte Comport; + public Byte Comport; - public string EncyptionKey = ""; + public String EncyptionKey = ""; - private void enableBtn(Button btn, bool enable) + private void enableBtn(Button btn, Boolean enable) { btn.Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => @@ -179,7 +179,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions await GetRssiMinMaxAsync(BoxNr, Ordernumber); SetUi(); - GetRSSI((int)RadioAdress, Comport, EncyptionKey); + GetRSSI((Int32)RadioAdress, Comport, EncyptionKey); SetUi(); } catch (Exception ex) @@ -216,10 +216,10 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions private class SaveData { public Int32 RadioAdress { get; set; } - public byte RSSI_PAM { get; set; } - public byte RSSI_SEMI { get; set; } - public int LimitId { get; set; } - public byte Result { get; set; } + public Byte RSSI_PAM { get; set; } + public Byte RSSI_SEMI { get; set; } + public Int32 LimitId { get; set; } + public Byte Result { get; set; } } @@ -231,9 +231,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions DebugMessage("Calling SaveRSSI Webservice...", true); try { - saveData.RadioAdress = (int)RadioAdress; // 0-4294967295 - string url = $"{ServiceUrls.GenesisRadioCheckServiceUrl()}SaveRSSI"; - string body = JsonConvert.SerializeObject(saveData); + saveData.RadioAdress = (Int32)RadioAdress; // 0-4294967295 + String url = $"{ServiceUrls.GenesisRadioCheckServiceUrl()}SaveRSSI"; + String body = JsonConvert.SerializeObject(saveData); await PostDataAsync(url, body); DebugMessage(" Ready\r\n", true); } @@ -244,14 +244,14 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } - private async Task GetRssiMinMaxAsync(byte BoxNr, Int32 FaNr) + private async Task GetRssiMinMaxAsync(Byte BoxNr, Int32 FaNr) { //DebugMessage("Calling GetLimits Webservice...", true); try { // TODO anpassen - string url = $"{ServiceUrls.GenesisRadioCheckServiceUrl()}GetLimits/{BoxNr}/{FaNr}"; - string body = await GetResponseAsync(url); + String url = $"{ServiceUrls.GenesisRadioCheckServiceUrl()}GetLimits/{BoxNr}/{FaNr}"; + String body = await GetResponseAsync(url); JObject o = JObject.Parse(body); saveData.LimitId = Convert.ToInt32(o.SelectToken("LimitId").ToString()); @@ -276,7 +276,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } } - private void GetRSSI(Int32 RadioAdress, Int32 ByteCOMPort, string strKey) + private void GetRSSI(Int32 RadioAdress, Int32 ByteCOMPort, String strKey) { RSSI_PAM = null; @@ -284,11 +284,11 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions stm = new SIRTCOM.Statemashine(); - byte P81_1 = 0; + Byte P81_1 = 0; saveData.RadioAdress = RadioAdress; - stm.initialise((byte)ByteCOMPort); + stm.initialise((Byte)ByteCOMPort); SIRTCOM.Wrapper wrp = new SIRTCOM.Wrapper(); stm.StartLoggin("C:\\GenesisLog\\log.txt"); @@ -332,12 +332,12 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } - public void DebugMessage(string value, Boolean Append = false) + public void DebugMessage(String value, Boolean Append = false) { NewStatus(value); } - private void GotRSSICallback(byte Rssi_Semi_Sirt, byte Rssi_Pam_Cord) + private void GotRSSICallback(Byte Rssi_Semi_Sirt, Byte Rssi_Pam_Cord) { // RSSI beim Empfangen der PAM gemessen vom Cordonel (Sendestärke des SIRT verpackt in SEMI, byte 20) DebugMessage($"RSSI Cord of PAM (Sirt => Cord):{Rssi_Pam_Cord}\r\n", true); @@ -383,7 +383,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions - private void Stm_OnStateChanged(object sender, SIRTCOM.MyEventArgs e) + private void Stm_OnStateChanged(Object sender, SIRTCOM.MyEventArgs e) { // our Pam SIRTCOM.PAM Pam = stm.GetPAM(1); @@ -401,20 +401,20 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions stm.Stop(); stm.ClearPam(); - string HexbytesSEMI = Pam.Semi.HexData.Replace(" ", ""); - byte[] SEMI_bytes = new byte[HexbytesSEMI.Length / 2]; + String HexbytesSEMI = Pam.Semi.HexData.Replace(" ", ""); + Byte[] SEMI_bytes = new Byte[HexbytesSEMI.Length / 2]; - for (int i = 0; i < HexbytesSEMI.Length; i += 2) + for (Int32 i = 0; i < HexbytesSEMI.Length; i += 2) SEMI_bytes[i / 2] = Convert.ToByte(HexbytesSEMI.Substring(i, 2), 16); // SEMI Status if (SEMI_bytes[19] == 0) { // RSSI beim Empfangen der SEMI gemessen vom Sirt - byte Semi_Rssi_Sirt = SEMI_bytes[2]; + Byte Semi_Rssi_Sirt = SEMI_bytes[2]; // RSSI beim Empfangen der PAM gemessen vom Cordonel - byte Pam_Rssi_Cord = SEMI_bytes[20]; + Byte Pam_Rssi_Cord = SEMI_bytes[20]; GotRSSICallback(Semi_Rssi_Sirt, Pam_Rssi_Cord); } @@ -431,7 +431,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } } - public static async Task PostDataAsync(string url, string data) + public static async Task PostDataAsync(String url, String data) { httpclient = new HttpClient(); // 20 Sekunden Timeout @@ -441,11 +441,11 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions HttpResponseMessage response = await httpclient.PostAsync(url, queryString); response.EnsureSuccessStatusCode(); - string content = await response.Content.ReadAsStringAsync(); + String content = await response.Content.ReadAsStringAsync(); return content; } - static async Task GetResponseAsync(string url) + static async Task GetResponseAsync(String url) { httpclient = new HttpClient(); // 20 Sekunden Timeout @@ -454,7 +454,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions HttpResponseMessage response = httpclient.GetAsync(url).Result; response.EnsureSuccessStatusCode(); - string content = await response.Content.ReadAsStringAsync(); + String content = await response.Content.ReadAsStringAsync(); return content; } diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs index d532467a..95fee41c 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs @@ -13,9 +13,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions public class ProductionProcessShippingMode : BaseProductionProcess { private UcPlain UserControl; - private bool doRestart = false; - private bool hasRadio = false; - public ProductionProcessShippingMode(bool restart = false, bool registerHasRadio = true) + private Boolean doRestart = false; + private Boolean hasRadio = false; + public ProductionProcessShippingMode(Boolean restart = false, Boolean registerHasRadio = true) { name = "Versandbereitschaft herstellen"; currentProcessState = ProductionProcessState.Waiting; @@ -48,7 +48,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { Meter.ResetAlarm(GenesisMeter.Alarm.ALL);//(true, new byte[] { 0x00, 0x00, 0x00, 0x01 }); - Meter.SetLcdText(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 }); @@ -58,7 +58,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions if (Meter.StoreAllConfigurations()) { - var writeList = new List(); + var writeList = new List(); writeList.Add(Meter.WriteRegister("SENSUSRADIO_SystemState", 1, true, false)); writeList.Add(Meter.WriteRegister("SENSUSRADIO_MainAlarmMask", 0, true, false)); @@ -90,12 +90,12 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { if (doRestart) { - var CheckValuesAufterBoot = new List>(); - CheckValuesAufterBoot.Add(new Tuple("METROLOGYASST_PulseLength", Meter.ReadRegister("METROLOGYASST_PulseLength"))); - CheckValuesAufterBoot.Add(new Tuple("POWERMON_BatteryQuantity", Meter.ReadRegister("POWERMON_BatteryQuantity"))); - CheckValuesAufterBoot.Add(new Tuple("GENESISFLOW_MeterSize", Meter.ReadRegister("GENESISFLOW_MeterSize"))); - CheckValuesAufterBoot.Add(new Tuple("GENESISFLOW_CalFactor1", Meter.ReadRegister("GENESISFLOW_CalFactor1"))); - CheckValuesAufterBoot.Add(new Tuple("SENSUSRADIO_RadioAddress", Meter.ReadRegister("SENSUSRADIO_RadioAddress"))); + var CheckValuesAufterBoot = new List>(); + CheckValuesAufterBoot.Add(new Tuple("METROLOGYASST_PulseLength", Meter.ReadRegister("METROLOGYASST_PulseLength"))); + CheckValuesAufterBoot.Add(new Tuple("POWERMON_BatteryQuantity", Meter.ReadRegister("POWERMON_BatteryQuantity"))); + CheckValuesAufterBoot.Add(new Tuple("GENESISFLOW_MeterSize", Meter.ReadRegister("GENESISFLOW_MeterSize"))); + CheckValuesAufterBoot.Add(new Tuple("GENESISFLOW_CalFactor1", Meter.ReadRegister("GENESISFLOW_CalFactor1"))); + CheckValuesAufterBoot.Add(new Tuple("SENSUSRADIO_RadioAddress", Meter.ReadRegister("SENSUSRADIO_RadioAddress"))); var _meterResetPsu = new MeterResetPsu(Meter) { StoreConfigEnable = true @@ -106,7 +106,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions Meter.Login(); - bool? hasDiffrences = null; + Boolean? hasDiffrences = null; foreach (var item in CheckValuesAufterBoot) { if (!item.Item2.SequenceEqual(Meter.ReadRegister(item.Item1))) @@ -187,11 +187,11 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { if (doRestart) { - var CheckValuesAufterBoot = new List>(); - CheckValuesAufterBoot.Add(new Tuple("METROLOGYASST_PulseLength", Meter.ReadRegister("METROLOGYASST_PulseLength"))); - CheckValuesAufterBoot.Add(new Tuple("POWERMON_BatteryQuantity", Meter.ReadRegister("POWERMON_BatteryQuantity"))); - CheckValuesAufterBoot.Add(new Tuple("GENESISFLOW_MeterSize", Meter.ReadRegister("GENESISFLOW_MeterSize"))); - CheckValuesAufterBoot.Add(new Tuple("GENESISFLOW_CalFactor1", Meter.ReadRegister("GENESISFLOW_CalFactor1"))); + var CheckValuesAufterBoot = new List>(); + CheckValuesAufterBoot.Add(new Tuple("METROLOGYASST_PulseLength", Meter.ReadRegister("METROLOGYASST_PulseLength"))); + CheckValuesAufterBoot.Add(new Tuple("POWERMON_BatteryQuantity", Meter.ReadRegister("POWERMON_BatteryQuantity"))); + CheckValuesAufterBoot.Add(new Tuple("GENESISFLOW_MeterSize", Meter.ReadRegister("GENESISFLOW_MeterSize"))); + CheckValuesAufterBoot.Add(new Tuple("GENESISFLOW_CalFactor1", Meter.ReadRegister("GENESISFLOW_CalFactor1"))); var _meterResetPsu = new MeterResetPsu(Meter) { @@ -203,7 +203,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions Meter.Login(); - bool? hasDiffrences = null; + Boolean? hasDiffrences = null; foreach (var item in CheckValuesAufterBoot) { if (!item.Item2.SequenceEqual(Meter.ReadRegister(item.Item1))) diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessSpecialConfig.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessSpecialConfig.cs index 5d3392a4..ee890fe2 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessSpecialConfig.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessSpecialConfig.cs @@ -16,7 +16,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { private UcDialog UserControl; - public bool DialogIsDone { get; private set; } + public Boolean DialogIsDone { get; private set; } public ProductionProcessSpecialConfig() { @@ -57,7 +57,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions var radioDefault = new UcDialog.DialogOption("old default", "same as iperl", () => { - var funkadresse = new List(); + var funkadresse = new List(); funkadresse.AddRange((new Byte[] { 0xE6, 0xC8, 0x88, 0x00 }).ToArray()); funkadresse.AddRange((new Byte[] { 0xDE, 0xB8, 0x68, 0xC0 }).ToArray()); funkadresse.AddRange((new Byte[] { 0xD6, 0xA8, 0x48, 0x80 }).ToArray()); @@ -79,7 +79,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions var optOneLiter = new UcDialog.DialogOption("new default", "new default key", () => { - var funkadresse = new List(); + var funkadresse = new List(); funkadresse.AddRange((new Byte[] { 0x0E, 0x9F, 0xAC, 0xC6 }).ToArray()); funkadresse.AddRange((new Byte[] { 0xA0, 0xE1, 0xEF, 0x1C }).ToArray()); funkadresse.AddRange((new Byte[] { 0x3B, 0x27, 0xA4, 0x9B }).ToArray()); diff --git a/Common/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs b/Common/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs index 54596056..ca8334f3 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs @@ -12,8 +12,8 @@ namespace ProductionUiCordonel.ProductionProcesses { public abstract class BaseProductionProcess : IProductionProcess { - private int _progress = 0; - public int Progress + private Int32 _progress = 0; + public Int32 Progress { get { return _progress; } set @@ -23,7 +23,7 @@ namespace ProductionUiCordonel.ProductionProcesses } } public ProductionProcessState currentProcessState; - public string name; + public String name; public GenesisMeter Meter { get; internal set; } @@ -34,7 +34,7 @@ namespace ProductionUiCordonel.ProductionProcesses StringBuilder sbLog = new StringBuilder(); - public string GetName() + public String GetName() { return name; } @@ -73,7 +73,7 @@ namespace ProductionUiCordonel.ProductionProcesses } - internal void NewStatus(string v) + internal void NewStatus(String v) { PopUpProcessLogHandler?.Invoke(this, new PopUpProcessLogArgs(v)); sbLog.AppendLine(v); diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Enum/ProductionProcessState.cs b/Common/ProductionUiCordonel/ProductionProcesses/Enum/ProductionProcessState.cs index 20583a9c..76b6c12c 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Enum/ProductionProcessState.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Enum/ProductionProcessState.cs @@ -16,7 +16,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Enum public static class ProductionProcessStateHelper { - public static string GetTextFromProductionProcessState(ProductionProcessState sate) + public static String GetTextFromProductionProcessState(ProductionProcessState sate) { switch (sate) { diff --git a/Common/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs b/Common/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs index 5ca8999c..4e98a4e3 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs @@ -17,7 +17,7 @@ namespace ProductionUiCordonel.ProductionProcesses event EventHandler PopUpProcessProgressChangedHandler; event EventHandler PopUpProcessLogHandler; - string GetName(); + String GetName(); ProductionProcessState GetState(); UserControl GetUserControl(); void Start(GenesisMeter Meter,CancellationToken cancellationToken); diff --git a/Common/ProductionUiCordonel/ProductionProcesses/MultiProcessController.cs b/Common/ProductionUiCordonel/ProductionProcesses/MultiProcessController.cs index 9c663f06..1775d000 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/MultiProcessController.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/MultiProcessController.cs @@ -96,12 +96,12 @@ namespace ProductionUiCordonel.ProductionProcesses } - private void Process_PopUpProcessProgressChangedHandler(object sender, PopUpProcessProgressArgs e) + private void Process_PopUpProcessProgressChangedHandler(Object sender, PopUpProcessProgressArgs e) { ProcessProgressHandler?.Invoke(sender,e); } - private void Process_PopUpProcessLogHandler(object sender, PopUpProcessLogArgs e) + private void Process_PopUpProcessLogHandler(Object sender, PopUpProcessLogArgs e) { ProcessLogHandler?.Invoke(sender,e); } diff --git a/Common/ProductionUiCordonel/ProductionProcesses/PopUpProcessLogArgs.cs b/Common/ProductionUiCordonel/ProductionProcesses/PopUpProcessLogArgs.cs index d07f5c58..8a16e1cb 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/PopUpProcessLogArgs.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/PopUpProcessLogArgs.cs @@ -8,8 +8,8 @@ namespace ProductionUiCordonel.ProductionProcesses { public class PopUpProcessLogArgs : EventArgs { - public readonly string Data; - public PopUpProcessLogArgs(string text) + public readonly String Data; + public PopUpProcessLogArgs(String text) { Data = text; } diff --git a/Common/ProductionUiCordonel/ProductionProcesses/PopUpProcessProgressArgs.cs b/Common/ProductionUiCordonel/ProductionProcesses/PopUpProcessProgressArgs.cs index 59c75c76..59035ad3 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/PopUpProcessProgressArgs.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/PopUpProcessProgressArgs.cs @@ -14,8 +14,8 @@ namespace ProductionUiCordonel.ProductionProcesses SubProcess, } public readonly ProcessProgessType ProgressType; - public readonly int Progress; - public PopUpProcessProgressArgs(int progress, ProcessProgessType type) + public readonly Int32 Progress; + public PopUpProcessProgressArgs(Int32 progress, ProcessProgessType type) { Progress = progress; ProgressType = type; diff --git a/Common/ProductionUiCordonel/ProductionUiCordonel.csproj b/Common/ProductionUiCordonel/ProductionUiCordonel.csproj index 8e43cfb5..6c43179f 100644 --- a/Common/ProductionUiCordonel/ProductionUiCordonel.csproj +++ b/Common/ProductionUiCordonel/ProductionUiCordonel.csproj @@ -139,9 +139,13 @@ ctlMultiModePressure.xaml + + + + @@ -177,6 +181,11 @@ + + Resources.de.resx + True + True + UcBarcodeInput.xaml @@ -273,9 +282,15 @@ Settings.settings True + + ResXFileCodeGenerator + Resources.de.Designer.cs + Designer + ResXFileCodeGenerator Resources.Designer.cs + Designer @@ -347,6 +362,10 @@ {4B88B0D3-E791-4774-9521-EABEACDC420E} Logging + + {2fd60cf1-45cd-4060-b8e5-4f39fba7f1cb} + ProcessExec + diff --git a/Common/ProductionUiCordonel/Properties/Resources.Designer.cs b/Common/ProductionUiCordonel/Properties/Resources.Designer.cs index bc038f93..25759934 100644 --- a/Common/ProductionUiCordonel/Properties/Resources.Designer.cs +++ b/Common/ProductionUiCordonel/Properties/Resources.Designer.cs @@ -129,5 +129,23 @@ namespace ProductionUiCordonel.Properties { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Looks up a localized string similar to Idle. + /// + internal static string StrStateIdle { + get { + return ResourceManager.GetString("StrStateIdle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Initial start. + /// + internal static string StrStateStartInitial { + get { + return ResourceManager.GetString("StrStateStartInitial", resourceCulture); + } + } } } diff --git a/Common/ProductionUiCordonel/Properties/Resources.de.Designer.cs b/Common/ProductionUiCordonel/Properties/Resources.de.Designer.cs new file mode 100644 index 00000000..e69de29b diff --git a/Common/ProductionUiCordonel/Properties/Resources.de.resx b/Common/ProductionUiCordonel/Properties/Resources.de.resx new file mode 100644 index 00000000..379bca46 --- /dev/null +++ b/Common/ProductionUiCordonel/Properties/Resources.de.resx @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\ConnectPlugged_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Connect_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\iconCheck.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\iconWarn.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\iconWating.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Refresh_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\CLEARMAtrix.JPG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Leerlauf + + + Neustart + + \ No newline at end of file diff --git a/Common/ProductionUiCordonel/Properties/Resources.resx b/Common/ProductionUiCordonel/Properties/Resources.resx index a8ca6250..0d3ffc2d 100644 --- a/Common/ProductionUiCordonel/Properties/Resources.resx +++ b/Common/ProductionUiCordonel/Properties/Resources.resx @@ -139,4 +139,10 @@ ..\Resources\CLEARMAtrix.JPG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Idle + + + Initial start + \ No newline at end of file diff --git a/Common/ProductionUiCordonel/UserControls/FinalTest/UcBarcodeInput.xaml.cs b/Common/ProductionUiCordonel/UserControls/FinalTest/UcBarcodeInput.xaml.cs index be091ebd..f6f0caf3 100644 --- a/Common/ProductionUiCordonel/UserControls/FinalTest/UcBarcodeInput.xaml.cs +++ b/Common/ProductionUiCordonel/UserControls/FinalTest/UcBarcodeInput.xaml.cs @@ -12,7 +12,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest public partial class UcBarcodeInput : UserControl { - public event EventHandler BarcodeInput; + public event EventHandler BarcodeInput; public UcBarcodeInput() { @@ -21,15 +21,15 @@ namespace ProductionUiCordonel.UserControls.FinalTest public class DialogOption { - public DialogOption(string headLine, string desc, Action selectedAction) + public DialogOption(String headLine, String desc, Action selectedAction) { HeadLine = headLine; Desc = desc; SelectedAction = selectedAction; } private Action SelectedAction; - private string HeadLine = "Hl"; - private string Desc = "descr"; + private String HeadLine = "Hl"; + private String Desc = "descr"; public UIElement GeneratBtn() { var btn = new Button(); @@ -51,7 +51,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest } - internal void SetDesc(string v) + internal void SetDesc(String v) { lblDescription.Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => @@ -74,7 +74,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest )); } - public void inputKey(string input) + public void inputKey(String input) { this.Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => @@ -84,7 +84,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest )); } - private void txtHiddenInput_KeyDown(object sender, KeyEventArgs e) + private void txtHiddenInput_KeyDown(Object sender, KeyEventArgs e) { //if (e.Key == Key.Enter) //{ @@ -99,7 +99,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest } - private void UserControl_MouseDown(object sender, MouseButtonEventArgs e) + private void UserControl_MouseDown(Object sender, MouseButtonEventArgs e) { this.Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => @@ -109,7 +109,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest )); } - private void LblInput_MouseDown(object sender, MouseButtonEventArgs e) + private void LblInput_MouseDown(Object sender, MouseButtonEventArgs e) { this.Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => diff --git a/Common/ProductionUiCordonel/UserControls/FinalTest/UcDialog.xaml.cs b/Common/ProductionUiCordonel/UserControls/FinalTest/UcDialog.xaml.cs index 7a5b4077..ddac27ec 100644 --- a/Common/ProductionUiCordonel/UserControls/FinalTest/UcDialog.xaml.cs +++ b/Common/ProductionUiCordonel/UserControls/FinalTest/UcDialog.xaml.cs @@ -29,15 +29,15 @@ namespace ProductionUiCordonel.UserControls.FinalTest public class DialogOption { - public DialogOption(string headLine, string desc, Action selectedAction) + public DialogOption(String headLine, String desc, Action selectedAction) { HeadLine = headLine; Desc = desc; SelectedAction = selectedAction; } private Action SelectedAction; - private string HeadLine = "Hl"; - private string Desc = "descr"; + private String HeadLine = "Hl"; + private String Desc = "descr"; public UIElement GeneratBtn() { var btn = new Button(); @@ -59,7 +59,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest } - internal void SetDesc(string v) + internal void SetDesc(String v) { lblDescription.Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => diff --git a/Common/ProductionUiCordonel/UserControls/FinalTest/UcRadioCheck.xaml.cs b/Common/ProductionUiCordonel/UserControls/FinalTest/UcRadioCheck.xaml.cs index f4c9c894..995e36a3 100644 --- a/Common/ProductionUiCordonel/UserControls/FinalTest/UcRadioCheck.xaml.cs +++ b/Common/ProductionUiCordonel/UserControls/FinalTest/UcRadioCheck.xaml.cs @@ -30,10 +30,10 @@ namespace ProductionUiCordonel.UserControls.FinalTest { public class UIContainerElement { - public int? Value = null; + public Int32? Value = null; public System.Drawing.Color Color; - public UIContainerElement(int? value) + public UIContainerElement(Int32? value) { Value = value; if (!value.HasValue) @@ -46,7 +46,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest } } - public string GetText() + public String GetText() { return Value.HasValue ? Value.Value.ToString() : "-"; } @@ -63,7 +63,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest public UIContainerElement CordMax; public UIContainerElement SirtMax; - public UIContainer(int? cordMin = null, int? sirtMin = null, int? cordRssi = null, int? sirtRssi = null, int? cordMax = null, int? sirtMax = null) + public UIContainer(Int32? cordMin = null, Int32? sirtMin = null, Int32? cordRssi = null, Int32? sirtRssi = null, Int32? cordMax = null, Int32? sirtMax = null) { CordMin = new UIContainerElement(cordMin); SirtMin = new UIContainerElement(sirtMin); @@ -75,7 +75,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest //only when results from semi are prensent if (CordRssi.Value.HasValue && SirtRssi.Value.HasValue) { - bool success = true; + Boolean success = true; if (!CordMin.Value.HasValue || CordRssi.Value.Value < CordMin.Value.Value) { @@ -151,17 +151,17 @@ namespace ProductionUiCordonel.UserControls.FinalTest InitializeComponent(); } - private void btnReset_Click(object sender, RoutedEventArgs e) + private void btnReset_Click(Object sender, RoutedEventArgs e) { Task.Run(() => { OnResetRequested?.Invoke(sender, e); }); } - private void Button_Click(object sender, RoutedEventArgs e) + private void Button_Click(Object sender, RoutedEventArgs e) { Task.Run(() => { OnRetryRequested?.Invoke(sender, e); }); } - internal void ViewResult(int WaitSeconds = 10) + internal void ViewResult(Int32 WaitSeconds = 10) { @@ -189,18 +189,18 @@ namespace ProductionUiCordonel.UserControls.FinalTest }); } - private void BtnDone_Click(object sender, RoutedEventArgs e) + private void BtnDone_Click(Object sender, RoutedEventArgs e) { Task.Run(() => { OnDoneRequested?.Invoke(sender, e); }); BtnDone.IsEnabled = false; } - private void BtnDone_Copy_Click(object sender, RoutedEventArgs e) + private void BtnDone_Copy_Click(Object sender, RoutedEventArgs e) { Task.Run(() => { OnDoneRequested?.Invoke(sender, e); }); } - private void BtnfrocePam_Click(object sender, RoutedEventArgs e) + private void BtnfrocePam_Click(Object sender, RoutedEventArgs e) { Task.Run(() => { OnForceAPam?.Invoke(sender, e); }); } diff --git a/Common/ProductionUiCordonel/ctls/ctlMultiModeMarriage.xaml.cs b/Common/ProductionUiCordonel/ctls/ctlMultiModeMarriage.xaml.cs index 9f63937b..70db61bf 100644 --- a/Common/ProductionUiCordonel/ctls/ctlMultiModeMarriage.xaml.cs +++ b/Common/ProductionUiCordonel/ctls/ctlMultiModeMarriage.xaml.cs @@ -1,4 +1,5 @@ -using ProductionUiCordonel.Model; +using System; +using ProductionUiCordonel.Model; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; @@ -22,9 +23,9 @@ namespace ProductionUiCordonel.ctls //ViewModel.Store(); } - private void btnMarry_Click(object sender, RoutedEventArgs e) + private void btnMarry_Click(Object sender, RoutedEventArgs e) { - Task.Run(() => + Task.Run(() => { return ViewModel.Store(); }).ContinueWith(a => diff --git a/Common/ProductionUiCordonel/ctls/ctlMultiModePicking.xaml.cs b/Common/ProductionUiCordonel/ctls/ctlMultiModePicking.xaml.cs index 0ab71c0f..2fb36d16 100644 --- a/Common/ProductionUiCordonel/ctls/ctlMultiModePicking.xaml.cs +++ b/Common/ProductionUiCordonel/ctls/ctlMultiModePicking.xaml.cs @@ -39,12 +39,12 @@ namespace ProductionUiCordonel.ctls ViewModel.OnUpdateUi += UpdatePickingUi; } - private void ViewModel_MeterDetectedHandler(object sender, EventArgs e) + private void ViewModel_MeterDetectedHandler(Object sender, EventArgs e) { Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { - bool update = false; + Boolean update = false; if (sender is null) { ViewModel.InputIsEnabled = false; @@ -58,7 +58,7 @@ namespace ProductionUiCordonel.ctls ViewModel.CurrentMeter.WriteRegister("GENESISFLOW_SealDisplay", 0); ViewModel.CurrentMeter.WriteRegister("POWERMON_WarnFromClamp", (UInt32)473040000); ViewModel.CurrentMeter.WriteRegister("SYSTEM_CalendarSeconds", Convert.ToInt32(ts.TotalSeconds)); - ViewModel.CurrentMeter.SetLcdText(false, new byte[] { 0x12, 0x34 }); + ViewModel.CurrentMeter.SetLcdText(false, new Byte[] { 0x12, 0x34 }); //ViewModel.ReloadData(false); @@ -67,7 +67,7 @@ namespace ProductionUiCordonel.ctls )); } - private void UpdatePickingUi(object sender, EventArgs e) + private void UpdatePickingUi(Object sender, EventArgs e) { icPicking.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { @@ -84,7 +84,7 @@ namespace ProductionUiCordonel.ctls } - private void PickingData_OnDataChanged(object sender, EventArgs e) + private void PickingData_OnDataChanged(Object sender, EventArgs e) { if (sender is ObservableCollection newData) { diff --git a/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs b/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs index 4fc8a26d..fc6a95f9 100644 --- a/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs +++ b/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs @@ -48,12 +48,12 @@ namespace ProductionUiCordonel.ctls - private void ViewModel_MeterDetectedHandler(object sender, EventArgs e) + private void ViewModel_MeterDetectedHandler(Object sender, EventArgs e) { Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { - bool update = false; + Boolean update = false; if (sender is null) { ViewModel.InputIsEnabled = false; @@ -66,23 +66,23 @@ namespace ProductionUiCordonel.ctls )); } - private void BtnPresueOk_Click(object sender, RoutedEventArgs e) + private void BtnPresueOk_Click(Object sender, RoutedEventArgs e) { ViewModel.StoreData(true); } - private void BtnPresueFailed_Click(object sender, RoutedEventArgs e) + private void BtnPresueFailed_Click(Object sender, RoutedEventArgs e) { ViewModel.StoreData(false); } - private void ViewModel_OnStoreDone(object sender, StringArgs e) + private void ViewModel_OnStoreDone(Object sender, StringArgs e) { MessageBox.Show(e.Content); } - private int? BarcodeInputActiveOffset = null; - private string BarcodeInput = ""; + private Int32? BarcodeInputActiveOffset = null; + private String BarcodeInput = ""; - private void TextBox_TextChanged(object sender, TextChangedEventArgs e) + private void TextBox_TextChanged(Object sender, TextChangedEventArgs e) { if (sender is TextBox txtSender) { @@ -120,9 +120,9 @@ namespace ProductionUiCordonel.ctls } - private void Button_Click(object sender, RoutedEventArgs e) + private void Button_Click(Object sender, RoutedEventArgs e) { - string input = ""; + String input = ""; var obj = ((FrameworkElement)sender).DataContext; if (obj is PressureTestPoints ptp) { diff --git a/Common/Ui/GenesisToolBox/FrmFwUpdate.cs b/Common/Ui/GenesisToolBox/FrmFwUpdate.cs index de901d7d..fede9de0 100644 --- a/Common/Ui/GenesisToolBox/FrmFwUpdate.cs +++ b/Common/Ui/GenesisToolBox/FrmFwUpdate.cs @@ -145,6 +145,9 @@ namespace Xylem.Common.Ui.GenesisToolBox /// /// Clear data table and set genesis to not connected /// + /// + /// - Enable update of Genesis Flow in Genesis Tool Box. + /// private void Init() { ProcessViewControl(false); @@ -1198,6 +1201,9 @@ namespace Xylem.Common.Ui.GenesisToolBox } + /// + /// - Enable update of Genesis Flow in Genesis Tool Box. + /// private void btnOpenPackageControlFile_Click(Object sender, EventArgs e) { //reload last path @@ -1220,7 +1226,7 @@ namespace Xylem.Common.Ui.GenesisToolBox tbxPackageFilePathName.Text = packageFilePathName; if (_meterFwUpdate == null) { - _meterFwUpdate = new MeterFwUpdate(_currentGenesis); + _meterFwUpdate = new MeterFwUpdate(_currentGenesis, true); } if (_meterFwUpdate == null) @@ -1261,7 +1267,7 @@ namespace Xylem.Common.Ui.GenesisToolBox tbxBinaryPath.Text = binaryFilePath; - var meterFwUpdate = new MeterFwUpdate(_currentGenesis); + var meterFwUpdate = new MeterFwUpdate(_currentGenesis, true); if (meterFwUpdate.LoadFileApps(binaryFilePath)) { lblFileAppsLoadedInfo.ForeColor = Color.Green; @@ -1583,6 +1589,9 @@ namespace Xylem.Common.Ui.GenesisToolBox /// /// /// + /// + /// - Enable update of Genesis Flow in Genesis Tool Box. + /// public Boolean Prepare(Int32 slot, String binaryPath, String packageInfoPath) { _updateGui = false; @@ -1604,7 +1613,7 @@ namespace Xylem.Common.Ui.GenesisToolBox tbxBinaryPath.Text = binaryPath; if (_meterFwUpdate == null) { - _meterFwUpdate = new MeterFwUpdate(_currentGenesis); + _meterFwUpdate = new MeterFwUpdate(_currentGenesis, true); } if (_meterFwUpdate == null) @@ -1638,7 +1647,7 @@ namespace Xylem.Common.Ui.GenesisToolBox tbxPackageFilePathName.Text = packageInfoPath; if (_meterFwUpdate == null) { - _meterFwUpdate = new MeterFwUpdate(_currentGenesis); + _meterFwUpdate = new MeterFwUpdate(_currentGenesis, true); } if (_meterFwUpdate == null) @@ -1826,6 +1835,9 @@ namespace Xylem.Common.Ui.GenesisToolBox dgvFiles.AutoResizeColumns(); } + /// + /// - Enable update of Genesis Flow in Genesis Tool Box. + /// private void dgvFiles_CellContentClick(Object sender, DataGridViewCellEventArgs e) { @@ -1839,7 +1851,7 @@ namespace Xylem.Common.Ui.GenesisToolBox lblFwNameSelected.Text = dgvFiles.Rows[e.RowIndex].Cells[1].Value.ToString(); lblSelectedID.Text = parentFilId.ToString(); - _meterFwUpdate = new MeterFwUpdate(_currentGenesis); + _meterFwUpdate = new MeterFwUpdate(_currentGenesis, true); var fileApps = new List(); diff --git a/Common/Ui/GenesisToolBox/FrmLutUpdate.Designer.cs b/Common/Ui/GenesisToolBox/FrmLutUpdate.Designer.cs index e85c58c2..9df88456 100644 --- a/Common/Ui/GenesisToolBox/FrmLutUpdate.Designer.cs +++ b/Common/Ui/GenesisToolBox/FrmLutUpdate.Designer.cs @@ -30,6 +30,7 @@ { this.components = new System.ComponentModel.Container(); this.grpSetup = new System.Windows.Forms.GroupBox(); + this.btnClearDisplay = new System.Windows.Forms.Button(); this.label10 = new System.Windows.Forms.Label(); this.tbxRadio = new System.Windows.Forms.TextBox(); this.tbxRegion = new System.Windows.Forms.TextBox(); @@ -76,7 +77,6 @@ this.label9 = new System.Windows.Forms.Label(); this.lblUpdateTime = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label(); - this.btnClearDisplay = new System.Windows.Forms.Button(); this.grpSetup.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.groupBox1.SuspendLayout(); @@ -107,6 +107,16 @@ this.grpSetup.TabStop = false; this.grpSetup.Text = "Cordonel"; // + // btnClearDisplay + // + this.btnClearDisplay.Location = new System.Drawing.Point(128, 239); + this.btnClearDisplay.Name = "btnClearDisplay"; + this.btnClearDisplay.Size = new System.Drawing.Size(116, 25); + this.btnClearDisplay.TabIndex = 33; + this.btnClearDisplay.Text = "Release Display"; + this.btnClearDisplay.UseVisualStyleBackColor = true; + this.btnClearDisplay.Click += new System.EventHandler(this.btnClearDisplay_Click); + // // label10 // this.label10.AutoSize = true; @@ -557,16 +567,6 @@ this.label7.TabIndex = 32; this.label7.Text = "Cordonel LUT Update"; // - // btnClearDisplay - // - this.btnClearDisplay.Location = new System.Drawing.Point(128, 239); - this.btnClearDisplay.Name = "btnClearDisplay"; - this.btnClearDisplay.Size = new System.Drawing.Size(116, 25); - this.btnClearDisplay.TabIndex = 33; - this.btnClearDisplay.Text = "Clear Display"; - this.btnClearDisplay.UseVisualStyleBackColor = true; - this.btnClearDisplay.Click += new System.EventHandler(this.btnClearDisplay_Click); - // // FrmLutUpdate // this.AccessibleRole = System.Windows.Forms.AccessibleRole.Sound; diff --git a/Common/Ui/GenesisToolBox/FrmLutUpdate.cs b/Common/Ui/GenesisToolBox/FrmLutUpdate.cs index 5c7737cd..2112d5c9 100644 --- a/Common/Ui/GenesisToolBox/FrmLutUpdate.cs +++ b/Common/Ui/GenesisToolBox/FrmLutUpdate.cs @@ -286,6 +286,8 @@ namespace Xylem.Common.Ui.GenesisToolBox { _tryConnectPcb = false; ProcessViewControl(false); + btnClearDisplay.Enabled = true; + })); } } From 5f3d4545e659728411ecacf055d27e4aa5125c92 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Thu, 19 Jan 2023 13:01:43 +0100 Subject: [PATCH 04/12] GenesisMeter: -correction password from file returned empty string --- .../Genesis/GenesisCore/GenesisMeter.cs | 61 +++++++++---------- .../Genesis/GenesisFile/MeterFwUpdate.cs | 7 ++- .../Ui/GenesisToolBox/FrmFwUpdate.Designer.cs | 16 ++++- Common/Ui/GenesisToolBox/FrmFwUpdate.cs | 11 ++-- Common/Ui/GenesisToolBox/FrmFwUpdate.resx | 6 ++ .../Ui/GenesisToolBox/frmMainForm.Designer.cs | 26 ++++---- 6 files changed, 74 insertions(+), 53 deletions(-) diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs index 719f0321..39569910 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs @@ -947,10 +947,13 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// /// - PcbId unknown returns immediately. /// + /// + /// - Password had been reset to empty string if read from file, corrected! + /// private String GetPassword() { var url = ServiceUrls.GenesisGetPasswordServiceUrl(); - String password; + var password = ""; //without PCB ID it is not possible to login, //but if it is already assigned to this Gensis, don't read it again @@ -966,7 +969,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore } } - } url += PcbId; @@ -993,16 +995,14 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore $"URL({url}), Error({ex.Message})"); if (File.Exists(ProgramConfig.OfflineInfoFile)) { - var listOfOfflinePasswords = JsonConvert.DeserializeObject>(File.ReadAllText(ProgramConfig.OfflineInfoFile)); + var listOfOfflinePasswords = JsonConvert.DeserializeObject>( + File.ReadAllText(ProgramConfig.OfflineInfoFile)); password = listOfOfflinePasswords.First(x => x.PcbId == PcbId).Password; if (!string.IsNullOrEmpty(password)) { _logger.Info($"Slot:{Slot} - Got password from password file!"); } } - - password = ""; - } return password; @@ -1053,7 +1053,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// public Boolean ReLogin() { - if (IsLoggedOn) return true; + if (IsLoggedOn) + return true; return string.IsNullOrEmpty(_password) ? Login() : Login(_password); } @@ -1175,7 +1176,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// converted version to string public static String BuildFwVersionString(Int32? version) { - return version == null ? "0.00" : $@"{version / 100}.{version % 100 :D2}"; + return version == null ? "0.00" : $@"{version / 100}.{version % 100:D2}"; } /// @@ -1374,7 +1375,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore // ignored } - //log application information to file _logger.Info($"PCB ID: {PcbId}"); _logger.Info($"Date time (UTC): {DateTimeOffset.UtcNow}"); @@ -1398,6 +1398,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore } _logger.Info($"Meter size: {MeterSize}"); + _logger.Info($"Upgrade permission: {MetrologyUpgradePermission:X2}"); //remove unused registers with invalid version var tempConfigRegisters = _configRegister.MeterRegisterDic.ToList(); @@ -1425,13 +1426,14 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore } foreach (var checkMinRegister in Register.GetMinRequiredRegisters()) { - if (!_configRegister.MeterRegisterDic.Any(a => a.Key.GetIdent() == checkMinRegister)) + if (_configRegister.MeterRegisterDic.All(a => a.Key.GetIdent() != checkMinRegister)) { // These registers ar required for essential operation, they have to be added even if the // version in the configuration.json is outdated or they are not defined! try { - var allVersion = tempConfigRegisters.Where(a => a.Key.GetIdent() == checkMinRegister)?.OrderByDescending(s => s.Key.RegisterDetail.Version.Last)?.First(); + var allVersion = tempConfigRegisters.Where(a => a.Key.GetIdent() == checkMinRegister)?.OrderByDescending( + s => s.Key.RegisterDetail.Version.Last)?.First(); if (allVersion.HasValue) { allVersion.Value.Key.RegisterDetail.Version.Last = int.MaxValue; @@ -1443,12 +1445,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore _logger.Warn(ex, $"Not able to set minimum list of registers. check json file for {checkMinRegister} "); } - } - } - if (IsDevelopmentUsage) { var registerToPotentialAdd = new List(); @@ -1461,21 +1460,17 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore } if (registerToPotentialAdd.Any()) { - - var registerAddForOldConfigs = registerToPotentialAdd.GroupBy(item => item.GetIdent()) .Select(grp => grp.Aggregate((max, cur) => - (max == null || cur.RegisterDetail.Version.Last > max.RegisterDetail.Version.Last) ? cur : max)); + (max == null || cur.RegisterDetail.Version.Last > max.RegisterDetail.Version.Last) ? + cur : max)); foreach (var registerAddOldConfig in registerAddForOldConfigs) { registerAddOldConfig.IsAvailable = false; _configRegister.MeterRegisterDic.TryAdd(registerAddOldConfig, null); } - // - } - } } @@ -1733,15 +1728,15 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore _logger.Info($"Slot:{Slot} - Old PCB identification was {PcbId}"); - var pcbIdRaw = ReadRegister(Register.Configexchange.PcbSerialNumber, expectedLength); - if (pcbIdRaw != null) - { - PcbId = Encoding.ASCII.GetString(pcbIdRaw).Split('\0')[0]; - _logger.Info($"Slot:{Slot} - Get PCB identification {PcbId}"); - return PcbId; - } + var pcbIdRaw = ReadRegister(Register.Configexchange.PcbSerialNumber, expectedLength); + if (pcbIdRaw != null) + { + PcbId = Encoding.ASCII.GetString(pcbIdRaw).Split('\0')[0]; + _logger.Info($"Slot:{Slot} - Get PCB identification {PcbId}"); + return PcbId; + } - return string.Empty; + return string.Empty; } /// @@ -1820,9 +1815,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore { var regDef = _configRegister.GetRegisterDefinitionByName(reg); var data = RegisterConverter.ConvertFrom(value); - _logger.Info( $"Slot:{Slot} - Write register({regDef.RegisterName}), " + + _logger.Info($"Slot:{Slot} - Write register({regDef.RegisterName}), " + $"record({BitConverter.ToString(data.ToArray())})"); - + PreRegisterWrite(regDef, data); var command = data.Length > RegisterDefinition.ChunkSize ? @@ -1901,7 +1896,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore if (IsLoggedOn) { _logger.Debug($"Slot:{Slot} - Authorization is required"); - + if (!string.IsNullOrEmpty(_password)) { IsLoggedOn = false; @@ -1915,7 +1910,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore case RequestAcknowledgeState.Ok: break; - + //try out this case RequestAcknowledgeState.CommandError: case RequestAcknowledgeState.MeterError: @@ -1931,7 +1926,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// - Initial /// // ReSharper disable once InconsistentNaming UI1236 is a naming forced by the caller - public Byte[] SendUI1236Command(Byte[] ui1236Frame,Boolean waitForResult = true,Boolean checkRegister = false,UInt16 skipRetryErrorCode = 4) + public Byte[] SendUI1236Command(Byte[] ui1236Frame, Boolean waitForResult = true, Boolean checkRegister = false, UInt16 skipRetryErrorCode = 4) { _logger.Info($"Slot:{Slot} - Sending Ui-1236 frame: {ui1236Frame} "); var sendFifoUi1236 = RequestProtocol.AddRecordToSendFifoUI1236(ui1236Frame); diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs index 9c89ba43..0e687e19 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs @@ -290,7 +290,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile if (UpdateGenesisFlowEnable) { - _registersBeforeUpdate.Add(Register.System.MetrologyUpgradePermission, new Byte[] { 0xFF, 0, 0, 0 }); + _registersBeforeUpdate.Add(Register.System.MetrologyUpgradePermission, new Byte[] { 0xFF }); } } @@ -996,6 +996,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// /// - Try catch block to avoid e.g. METROLOGYASST_PulseMode. /// + /// + /// - Read back upgrade permission for metrology. + /// public Boolean UpdatePreparation() { _actualOperation = Resources.StrFwUpdateStatePrepareUpdate; @@ -1046,6 +1049,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile { //nothing to handle } + _genesisMeter.MetrologyUpgradePermission = RegisterConverter.ConvertTo( + _genesisMeter.ReadRegister(Register.System.MetrologyUpgradePermission)); //remove the update stop action StopUpdateProcess = false; diff --git a/Common/Ui/GenesisToolBox/FrmFwUpdate.Designer.cs b/Common/Ui/GenesisToolBox/FrmFwUpdate.Designer.cs index 22a98395..2295cfa7 100644 --- a/Common/Ui/GenesisToolBox/FrmFwUpdate.Designer.cs +++ b/Common/Ui/GenesisToolBox/FrmFwUpdate.Designer.cs @@ -107,6 +107,7 @@ this.cbxFilterFWType = new System.Windows.Forms.ComboBox(); this.chbFilterIsDeveloper = new System.Windows.Forms.CheckBox(); this.saveConfigFile = new System.Windows.Forms.SaveFileDialog(); + this.cbxMetUpdPerm = new System.Windows.Forms.CheckBox(); this.grpSetup.SuspendLayout(); this.groupBox2.SuspendLayout(); this.groupBox4.SuspendLayout(); @@ -210,6 +211,7 @@ // // groupBox2 // + this.groupBox2.Controls.Add(this.cbxMetUpdPerm); this.groupBox2.Controls.Add(this.btnRebootMeter); this.groupBox2.Controls.Add(this.groupBox4); this.groupBox2.Controls.Add(this.lblUpdateTime); @@ -622,7 +624,7 @@ // // tmrProgressUpdate // - this.tmrProgressUpdate.Interval = 200; + this.tmrProgressUpdate.Interval = 250; this.tmrProgressUpdate.Tick += new System.EventHandler(this.tmrProgressUpdate_Tick); // // dlgOpenPackageFile @@ -962,6 +964,17 @@ // this.saveConfigFile.Filter = "configuration file (*.hex)|*.hex"; // + // cbxMetUpdPerm + // + this.cbxMetUpdPerm.AutoSize = true; + this.cbxMetUpdPerm.Enabled = false; + this.cbxMetUpdPerm.Location = new System.Drawing.Point(955, 310); + this.cbxMetUpdPerm.Name = "cbxMetUpdPerm"; + this.cbxMetUpdPerm.Size = new System.Drawing.Size(110, 17); + this.cbxMetUpdPerm.TabIndex = 24; + this.cbxMetUpdPerm.Text = "Metrology Update"; + this.cbxMetUpdPerm.UseVisualStyleBackColor = true; + // // FrmFwUpdate // this.AccessibleRole = System.Windows.Forms.AccessibleRole.Sound; @@ -1088,5 +1101,6 @@ private System.Windows.Forms.CheckBox cbxStoreConfigEnable; private System.Windows.Forms.SaveFileDialog saveConfigFile; private System.Windows.Forms.Button btnRebootMeter; + private System.Windows.Forms.CheckBox cbxMetUpdPerm; } } \ No newline at end of file diff --git a/Common/Ui/GenesisToolBox/FrmFwUpdate.cs b/Common/Ui/GenesisToolBox/FrmFwUpdate.cs index fede9de0..061e69e1 100644 --- a/Common/Ui/GenesisToolBox/FrmFwUpdate.cs +++ b/Common/Ui/GenesisToolBox/FrmFwUpdate.cs @@ -1179,6 +1179,8 @@ namespace Xylem.Common.Ui.GenesisToolBox barSingleProgressUpdate.Update(); } SetTimeDisplay(); + if (_currentGenesis != null) + cbxMetUpdPerm.Checked = (_currentGenesis.MetrologyUpgradePermission & 0xFF) == 0xFF; Update(); } @@ -1812,14 +1814,14 @@ namespace Xylem.Common.Ui.GenesisToolBox if (cbxFilterFwDn.SelectedItem.ToString() != "ALL") { var myMeterSize = ((MeterSize)cbxFilterFwDn.SelectedItem).GetHashCode(); - url = url + $"&CordonelFwFile_Dn={myMeterSize}"; + url += $"&CordonelFwFile_Dn={myMeterSize}"; } if (cbxFilterFWType.SelectedItem.ToString() != "ALL") { var fwTypeEnum = ((CordonelFWTypeEnum)cbxFilterFWType.SelectedItem).GetHashCode(); - url = url + $"&CordonelFwFile_Type={fwTypeEnum}"; + url += $"&CordonelFwFile_Type={fwTypeEnum}"; } - url = url + $"&FileCategoryID=1"; + url += "&FileCategoryID=1"; var result = LocalWebRequest.GetRequest(url, 1000); @@ -1827,9 +1829,8 @@ namespace Xylem.Common.Ui.GenesisToolBox dgvFiles.DataSource = a.OrderByDescending(o => o.FileDate).ToList(); - for (Int32 i = 0; i < dgvFiles.ColumnCount; i++) + for (var i = 0; i < dgvFiles.ColumnCount; i++) { - dgvFiles.Columns[i].Visible = i < 5; } dgvFiles.AutoResizeColumns(); diff --git a/Common/Ui/GenesisToolBox/FrmFwUpdate.resx b/Common/Ui/GenesisToolBox/FrmFwUpdate.resx index 14eefb68..23ab59ed 100644 --- a/Common/Ui/GenesisToolBox/FrmFwUpdate.resx +++ b/Common/Ui/GenesisToolBox/FrmFwUpdate.resx @@ -132,6 +132,12 @@ True + + True + + + True + 465, 17 diff --git a/Common/Ui/GenesisToolBox/frmMainForm.Designer.cs b/Common/Ui/GenesisToolBox/frmMainForm.Designer.cs index ac41abe9..a83967dc 100644 --- a/Common/Ui/GenesisToolBox/frmMainForm.Designer.cs +++ b/Common/Ui/GenesisToolBox/frmMainForm.Designer.cs @@ -40,12 +40,12 @@ this.btnAlarm = new System.Windows.Forms.Button(); this.btnSetup = new System.Windows.Forms.Button(); this.gpLAA = new System.Windows.Forms.GroupBox(); - this.btnLowLevelTools = new System.Windows.Forms.Button(); this.button5 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.btnPara = new System.Windows.Forms.Button(); this.btnRegHistory = new System.Windows.Forms.Button(); this.btnPassword = new System.Windows.Forms.Button(); + this.btnLowLevelTools = new System.Windows.Forms.Button(); this.gbDeveloper = new System.Windows.Forms.GroupBox(); this.BtnFileSplit = new System.Windows.Forms.Button(); this.btnFiles = new System.Windows.Forms.Button(); @@ -102,7 +102,7 @@ this.btnLutUpdate.Name = "btnLutUpdate"; this.btnLutUpdate.Size = new System.Drawing.Size(151, 39); this.btnLutUpdate.TabIndex = 17; - this.btnLutUpdate.Text = "Metrology LUT"; + this.btnLutUpdate.Text = "LUT Update"; this.btnLutUpdate.UseVisualStyleBackColor = true; this.btnLutUpdate.Click += new System.EventHandler(this.btnLutUpdate_Click); // @@ -191,17 +191,6 @@ this.gpLAA.TabStop = false; this.gpLAA.Text = "Production LAA"; // - // btnLowLevelTools - // - this.btnLowLevelTools.Location = new System.Drawing.Point(4, 167); - this.btnLowLevelTools.Name = "btnLowLevelTools"; - this.btnLowLevelTools.Size = new System.Drawing.Size(152, 40); - this.btnLowLevelTools.TabIndex = 22; - this.btnLowLevelTools.Text = "Low Level Tools"; - this.btnLowLevelTools.UseMnemonic = false; - this.btnLowLevelTools.UseVisualStyleBackColor = true; - this.btnLowLevelTools.Click += new System.EventHandler(this.btnLog_Click); - // // button5 // this.button5.Location = new System.Drawing.Point(4, 191); @@ -256,6 +245,17 @@ this.btnPassword.UseVisualStyleBackColor = true; this.btnPassword.Click += new System.EventHandler(this.btnPassword_Click); // + // btnLowLevelTools + // + this.btnLowLevelTools.Location = new System.Drawing.Point(4, 167); + this.btnLowLevelTools.Name = "btnLowLevelTools"; + this.btnLowLevelTools.Size = new System.Drawing.Size(152, 40); + this.btnLowLevelTools.TabIndex = 22; + this.btnLowLevelTools.Text = "Low Level Tools"; + this.btnLowLevelTools.UseMnemonic = false; + this.btnLowLevelTools.UseVisualStyleBackColor = true; + this.btnLowLevelTools.Click += new System.EventHandler(this.btnLog_Click); + // // gbDeveloper // this.gbDeveloper.Controls.Add(this.btnLowLevelTools); From 387f862e105af06836c48295b530b73e28cc20c5 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Fri, 20 Jan 2023 11:18:20 +0100 Subject: [PATCH 05/12] GenesisMeter: Region and MeterSize checked with Radio --- .../Genesis/GenesisCore/GenesisMeter.cs | 94 +++++++++++-------- .../Genesis/GenesisFile/MeterFile.cs | 9 +- .../Genesis/GenesisFile/MeterLutUpdate.cs | 25 +++-- Common/Ui/GenesisToolBox/FrmLutUpdate.cs | 11 ++- 4 files changed, 77 insertions(+), 62 deletions(-) diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs index 39569910..affc74e9 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs @@ -1220,6 +1220,61 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// public Byte MetrologyUpgradePermission; + /// + /// Check region and size. + /// After reading the version, all valid registers are going to be selected. + /// + /// + /// - Initial, extracted from + /// + public void CheckRegionSizeLutCrc() + { + //read metrology lookup table CRC + try + { + var lutCrcRaw = ReadRegister(Register.Genesisflow.LookupFileCrc); + if (lutCrcRaw != null) + { + var lutCrc = RegisterConverter.ConvertTo(lutCrcRaw); + LutCrc = $@"0x{lutCrc:X4}"; + } + } + catch (Exception) + { + // ignored + } + + //read meter size + MeterSize = MeterSizeConverter.ConvertMeterSizeEnumToSizeName((MeterSize)RegisterConverter.ConvertTo( + ReadRegister(Register.Genesisflow.MeterSize))); + + //read radio frequency + Region = "NA"; + RadioFrequencyMhz = null; + try + { + var radioFrequencyRaw = ReadRegister(Register.Sensusradio.FrequencyIndicator); + if (radioFrequencyRaw != null ) + { + Region = "EMEA"; + RadioFrequencyMhz = RegisterConverter.ConvertTo(radioFrequencyRaw); + } + } + catch (Exception) + { + // ignored + } + + // check meter size string contains "DN", because if "US" it cannot be an EMEA version + if ((Region.Contains("NA") && MeterSize.Contains("DN")) || + (Region.Contains("EMEA") && MeterSize.Contains("US"))) + { + Region = "?"; + MeterSize = "?"; + LutCrc = "?"; + } + } + /// /// Reading all applications which can be found in the configuration.json and have been stored /// to the meter register dictionary in advance. @@ -1316,29 +1371,12 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore }); } + CheckRegionSizeLutCrc(); + //read metrology upgrade permission MetrologyUpgradePermission = RegisterConverter.ConvertTo( ReadRegister(Register.System.MetrologyUpgradePermission)); - //read metrology lookup table CRC - try - { - var lutCrcRaw = ReadRegister(Register.Genesisflow.LookupFileCrc); - if (lutCrcRaw != null) - { - var lutCrc = RegisterConverter.ConvertTo(lutCrcRaw); - LutCrc = $@"0x{lutCrc:X4}"; - } - } - catch (Exception) - { - // ignored - } - - //read meter size - MeterSize = MeterSizeConverter.ConvertMeterSizeEnumToSizeName((MeterSize)RegisterConverter.ConvertTo( - ReadRegister(Register.Genesisflow.MeterSize))); - //read core revision var coreRegisterRead = RegisterConverter.ConvertTo(ReadRegister(Register.System.CoreRevision, 16)); CoreRevision = null; @@ -1357,24 +1395,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore } } - //read radio frequency - Region = "NA"; - RadioFrequencyMhz = null; - try - { - var radioFrequencyRaw = ReadRegister(Register.Sensusradio.FrequencyIndicator); - // check meter size string contains "DN", because if "US" it cannot be an EMEA version - if (radioFrequencyRaw != null && MeterSize.Contains("DN")) - { - Region = "EMEA"; - RadioFrequencyMhz = RegisterConverter.ConvertTo(radioFrequencyRaw); - } - } - catch (Exception) - { - // ignored - } - //log application information to file _logger.Info($"PCB ID: {PcbId}"); _logger.Info($"Date time (UTC): {DateTimeOffset.UtcNow}"); diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFile.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFile.cs index fffb75f2..78afd9c7 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFile.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFile.cs @@ -29,16 +29,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile private readonly GenesisMeter _currentGenesis; private Int32 _filePointer; - //TODO THW test only private const String StrNewFileReadWriteMode = "wb+"; - //wb open file for writing in binary mode, if file exists its contents will be overwritten, - //if file does not exist it will be created //private const String StrNewFileReadWriteMode = "wb"; - private const String StrNewFileReadWriteMode = "w"; - //Open for reading in binary mode. If the file does not exist, FOpen returns NULL //private const String StrOpenFileReadOnlyMode = "rb"; - private const String StrOpenFileReadOnlyMode = "r"; - //Open for both reading and writing in binary mode. If the file does not exist, FOpen returns NULL //private const String StrOpenFileReadWriteMode = "rb+"; + private const String StrNewFileReadWriteMode = "w"; + private const String StrOpenFileReadOnlyMode = "r"; private const String StrOpenFileReadWriteMode = "r+"; /// diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs index f87a3c7e..90e0346e 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs @@ -567,6 +567,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// /// - Initial /// + /// + /// - Used genesis meter lut crc, region and meter size read back procedure. + /// private Boolean FinalizeLutDownload() { var returnValue = true; @@ -621,12 +624,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile continue; } - _operationCtr++; - _actualOperation = "Read back LUT CRC from meter"; - var lutCrc = RegisterConverter.ConvertTo( - _genesisMeter.ReadRegister(Register.Genesisflow.LookupFileCrc)); + // read back all values + _genesisMeter.CheckRegionSizeLutCrc(); - if ((lutCrc & LutCrcErrorMask) != 0) + var lutFileCrc = $"0x{LutFile.FileCrc:X4}"; + if (!_genesisMeter.LutCrc.Equals(lutFileCrc)) { const String txt = "Meter LUT CRC could not be set!"; ErrorMessage = txt; @@ -637,14 +639,10 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile } OnProcessUpdate?.Invoke(this, - new ProcessExecEventArgs($"Read back and validated LUT CRC 0x{lutCrc:X4}")); + new ProcessExecEventArgs($"Read back and validated LUT CRC {_genesisMeter.LutCrc}")); - _operationCtr++; - _actualOperation = "Read back meter size from meter"; - var meterSize = (MeterSize)RegisterConverter.ConvertTo( - _genesisMeter.ReadRegister(Register.Genesisflow.MeterSize)); - - if (meterSize != LutFile.MeterSize) + var lutMeterSize = MeterSizeConverter.ConvertMeterSizeEnumToSizeName(LutFile.MeterSize); + if (!_genesisMeter.MeterSize.Equals(lutMeterSize)) { const String txt = "Meter size could not be set!"; ErrorMessage = txt; @@ -656,8 +654,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile ErrorMessage = ""; OnProcessUpdate?.Invoke(this, - new ProcessExecEventArgs("Read back and validated meter size " + - $"{MeterSizeConverter.ConvertMeterSizeEnumToSizeName(meterSize)}")); + new ProcessExecEventArgs($"Read back and validated meter size {lutMeterSize}")); } while (!returnValue && retryCtr++ < RegisterWriteRetries && !StopUpdateProcess); diff --git a/Common/Ui/GenesisToolBox/FrmLutUpdate.cs b/Common/Ui/GenesisToolBox/FrmLutUpdate.cs index 2112d5c9..ae90feb5 100644 --- a/Common/Ui/GenesisToolBox/FrmLutUpdate.cs +++ b/Common/Ui/GenesisToolBox/FrmLutUpdate.cs @@ -347,6 +347,12 @@ namespace Xylem.Common.Ui.GenesisToolBox ProcessViewControl(false); SetControlsDownloadIsFinished(); + // update the display of the meter size, LUT CRC and region + tbxMeterFw.Text = _currentGenesis.FwVersion; + tbxMeterMeterSize.Text = _currentGenesis.MeterSize; + tbxMeterLutCrc.Text = _currentGenesis.LutCrc; + tbxRegion.Text = _currentGenesis.Region; + if (!_lutFileSuccessfulWritten) { lblLutFileLoadedInfo.ForeColor = Color.Red; @@ -364,10 +370,7 @@ namespace Xylem.Common.Ui.GenesisToolBox } else { - // on successfully execution the meter size and LUT CRC is identical to file content - tbxMeterMeterSize.Text = tbxFileMeterSize.Text; - tbxMeterLutCrc.Text = tbxFileCrc.Text; - LogSuccessText(StrUpdateSuccessMessage); + LogSuccessText(StrUpdateSuccessMessage); MessageBoxShow(StrUpdateSuccessMessage, @"SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information); } From 2155bb9a5d7d1dc5e60639a7b0ef20d14f2c3e77 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Fri, 20 Jan 2023 16:14:35 +0100 Subject: [PATCH 06/12] MeterFwUpdate: - Corrected to set metrology upgrade permission, LowLevelTool: - Erase of single manual input files --- .../Genesis/GenesisFile/MeterFwUpdate.cs | 16 ++-- .../FrmLowLevelTools.Designer.cs | 95 +++++++++++++++++-- Common/Ui/GenesisToolBox/FrmLowLevelTools.cs | 69 +++++++++++++- 3 files changed, 159 insertions(+), 21 deletions(-) diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs index 0e687e19..0aa82f1d 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterFwUpdate.cs @@ -260,9 +260,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// /// - Check installed application before require access to registers. /// - /// - /// - Enable update of Genesis Flow on request. - /// public MeterFwUpdate(GenesisMeter genesisMeter, Boolean updateGenesisFlowEnable = false) { if (genesisMeter == null) @@ -287,11 +284,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile { _registersBeforeUpdate.Add(Register.Sensusradio.WakeupInterval, new Byte[] { 6 }); } - - if (UpdateGenesisFlowEnable) - { - _registersBeforeUpdate.Add(Register.System.MetrologyUpgradePermission, new Byte[] { 0xFF }); - } } /// @@ -996,8 +988,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// /// - Try catch block to avoid e.g. METROLOGYASST_PulseMode. /// - /// - /// - Read back upgrade permission for metrology. + /// + /// - Set upgrade permission for metrology to 0xFF if required (will be done by GTB). /// public Boolean UpdatePreparation() { @@ -1037,6 +1029,10 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile _registersAfterUpdate = new Dictionary(); try { + if (UpdateGenesisFlowEnable) + { + _genesisMeter.WriteRegister(Register.System.MetrologyUpgradePermission, new Byte[] { 0xFF }); + } foreach (var item in _registersBeforeUpdate) { var writeBackValue = _genesisMeter.ReadRegister(item.Key); diff --git a/Common/Ui/GenesisToolBox/FrmLowLevelTools.Designer.cs b/Common/Ui/GenesisToolBox/FrmLowLevelTools.Designer.cs index 4e08351d..5594f44e 100644 --- a/Common/Ui/GenesisToolBox/FrmLowLevelTools.Designer.cs +++ b/Common/Ui/GenesisToolBox/FrmLowLevelTools.Designer.cs @@ -57,6 +57,7 @@ this.lblFwUpdateInfo = new System.Windows.Forms.Label(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnTidyFile = new System.Windows.Forms.Button(); this.btnGetDateTime = new System.Windows.Forms.Button(); this.btnSetDateTime = new System.Windows.Forms.Button(); this.btnRebootMeter = new System.Windows.Forms.Button(); @@ -70,11 +71,17 @@ this.groupBox2 = new System.Windows.Forms.GroupBox(); this.btnListFileDetails = new System.Windows.Forms.Button(); this.btnReadLogFiles = new System.Windows.Forms.Button(); - this.btnTidyFile = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.tbxFileToEraseName = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.tbxFileToEraseDrive = new System.Windows.Forms.TextBox(); + this.btnEraseFile = new System.Windows.Forms.Button(); this.grpSetup.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.groupBox1.SuspendLayout(); this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); this.SuspendLayout(); // // grpSetup @@ -363,6 +370,16 @@ this.groupBox1.TabStop = false; this.groupBox1.Text = "Tools"; // + // btnTidyFile + // + this.btnTidyFile.Location = new System.Drawing.Point(10, 174); + this.btnTidyFile.Name = "btnTidyFile"; + this.btnTidyFile.Size = new System.Drawing.Size(116, 25); + this.btnTidyFile.TabIndex = 39; + this.btnTidyFile.Text = "Tidy File System"; + this.btnTidyFile.UseVisualStyleBackColor = true; + this.btnTidyFile.Click += new System.EventHandler(this.btnTidyFile_Click); + // // btnGetDateTime // this.btnGetDateTime.Location = new System.Drawing.Point(10, 144); @@ -462,7 +479,7 @@ this.groupBox2.Controls.Add(this.btnUploadConfig); this.groupBox2.Location = new System.Drawing.Point(417, 69); this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(136, 273); + this.groupBox2.Size = new System.Drawing.Size(136, 123); this.groupBox2.TabIndex = 37; this.groupBox2.TabStop = false; this.groupBox2.Text = "Log"; @@ -487,15 +504,64 @@ this.btnReadLogFiles.UseVisualStyleBackColor = true; this.btnReadLogFiles.Click += new System.EventHandler(this.btnReadLogFiles_Click); // - // btnTidyFile + // groupBox3 // - this.btnTidyFile.Location = new System.Drawing.Point(10, 174); - this.btnTidyFile.Name = "btnTidyFile"; - this.btnTidyFile.Size = new System.Drawing.Size(116, 25); - this.btnTidyFile.TabIndex = 39; - this.btnTidyFile.Text = "Tidy File System"; - this.btnTidyFile.UseVisualStyleBackColor = true; - this.btnTidyFile.Click += new System.EventHandler(this.btnTidyFile_Click); + this.groupBox3.Controls.Add(this.label4); + this.groupBox3.Controls.Add(this.tbxFileToEraseName); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Controls.Add(this.tbxFileToEraseDrive); + this.groupBox3.Controls.Add(this.btnEraseFile); + this.groupBox3.Location = new System.Drawing.Point(559, 69); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(136, 123); + this.groupBox3.TabIndex = 40; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Erase Files"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(10, 60); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(38, 13); + this.label4.TabIndex = 40; + this.label4.Text = "Name:"; + // + // tbxFileToEraseName + // + this.tbxFileToEraseName.Location = new System.Drawing.Point(50, 57); + this.tbxFileToEraseName.Name = "tbxFileToEraseName"; + this.tbxFileToEraseName.Size = new System.Drawing.Size(76, 20); + this.tbxFileToEraseName.TabIndex = 41; + this.tbxFileToEraseName.Text = "tstfile"; + this.tbxFileToEraseName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tbxFileToEraseName_KeyDown); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(10, 30); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(35, 13); + this.label3.TabIndex = 39; + this.label3.Text = "Drive:"; + // + // tbxFileToEraseDrive + // + this.tbxFileToEraseDrive.Location = new System.Drawing.Point(50, 27); + this.tbxFileToEraseDrive.Name = "tbxFileToEraseDrive"; + this.tbxFileToEraseDrive.Size = new System.Drawing.Size(76, 20); + this.tbxFileToEraseDrive.TabIndex = 39; + this.tbxFileToEraseDrive.Text = "1"; + // + // btnEraseFile + // + this.btnEraseFile.Location = new System.Drawing.Point(10, 84); + this.btnEraseFile.Name = "btnEraseFile"; + this.btnEraseFile.Size = new System.Drawing.Size(116, 25); + this.btnEraseFile.TabIndex = 39; + this.btnEraseFile.Text = "Erase File"; + this.btnEraseFile.UseVisualStyleBackColor = true; + this.btnEraseFile.Click += new System.EventHandler(this.btnEraseFile_Click); // // FrmLowLevelTools // @@ -503,6 +569,7 @@ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(723, 432); + this.Controls.Add(this.groupBox3); this.Controls.Add(this.groupBox2); this.Controls.Add(this.label7); this.Controls.Add(this.lblUpdateTime); @@ -532,6 +599,8 @@ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.groupBox1.ResumeLayout(false); this.groupBox2.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -581,5 +650,11 @@ private System.Windows.Forms.Button btnReadLogFiles; private System.Windows.Forms.Button btnListFileDetails; private System.Windows.Forms.Button btnTidyFile; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox tbxFileToEraseDrive; + private System.Windows.Forms.Button btnEraseFile; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox tbxFileToEraseName; } } \ No newline at end of file diff --git a/Common/Ui/GenesisToolBox/FrmLowLevelTools.cs b/Common/Ui/GenesisToolBox/FrmLowLevelTools.cs index 3e03dfe8..514a0fe6 100644 --- a/Common/Ui/GenesisToolBox/FrmLowLevelTools.cs +++ b/Common/Ui/GenesisToolBox/FrmLowLevelTools.cs @@ -8,6 +8,7 @@ using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using System.Windows.Input; using Logic.ProductionToProductMapper.Cordonel; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -157,6 +158,9 @@ namespace Xylem.Common.Ui.GenesisToolBox btnReadLogFiles.Enabled = false; btnListFileDetails.Enabled = false; btnTidyFile.Enabled = false; + btnEraseFile.Enabled = false; + tbxFileToEraseName.Enabled = false; + tbxFileToEraseDrive.Enabled = false; } /// @@ -174,6 +178,9 @@ namespace Xylem.Common.Ui.GenesisToolBox btnReadLogFiles.Enabled = true; btnListFileDetails.Enabled = true; btnTidyFile.Enabled = true; + btnEraseFile.Enabled = true; + tbxFileToEraseName.Enabled = true; + tbxFileToEraseDrive.Enabled = true; } /// @@ -1372,7 +1379,8 @@ namespace Xylem.Common.Ui.GenesisToolBox ? $@"File {fileToErase} successfully erased" : $@"File {fileToErase} erasure failed"); - if (success) continue; + if (success) + continue; _currentGenesis.Logout(); _currentGenesis.ReLogin(); } @@ -1391,6 +1399,65 @@ namespace Xylem.Common.Ui.GenesisToolBox }); } + /// + /// Erase a specified file + /// + /// + /// + /// + /// - Initial + /// + private void btnEraseFile_Click(Object sender, EventArgs e) + { + if (_currentGenesis == null) + return; + if (_meterFile == null) + _meterFile = new MeterFile(_currentGenesis); + + //reset timer + _startTime = DateTimeOffset.UtcNow; + + LowLevelActionControl(true); + + var file = $@"{tbxFileToEraseDrive.Text}\{tbxFileToEraseName.Text}"; + var msg = $@"Erase file {file}"; + LogText(msg); + lblOverall.Text = msg; + + Task.Factory.StartNew(() => + { + _currentGenesis.ReLogin(); + + // erase files + _meterFile.UnlockEraseWriteMeterFile(file); + var success = _meterFile.EraseMeterFile(file); + + LogText(success + ? $@"File {file} successfully erased" + : $@"File {file} erasure failed"); + + // catalogue after cleaning + SetActualProcessAndLog(@"List meter files"); + ListMeterFiles(); + + }).ContinueWith(delegate + { + //add a blank line to separate next operation + LogText(""); + _currentGenesis.Logout(); + LowLevelActionControl(false); + Invoke(new Action(() => { tbxFileToEraseName.Focus(); })); + }); + + } + + private void tbxFileToEraseName_KeyDown(Object sender, System.Windows.Forms.KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + btnEraseFile_Click(this, null); + } + } #endregion } } From a1df7a2fecae37346faf35169de6ee50bf3379d8 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Fri, 20 Jan 2023 16:55:21 +0100 Subject: [PATCH 07/12] LutUpdate: - accelerated by removing list of files --- .../Genesis/GenesisFile/MeterLutUpdate.cs | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs index 90e0346e..ae549d6f 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisFile/MeterLutUpdate.cs @@ -804,6 +804,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile /// /// - Initial /// + /// + /// - Removed list file drive 1 to speed up process. Files will be read back and binary compared! + /// private Boolean DownloadLutFiles() { //counters for actual process information @@ -847,26 +850,26 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile // read all files on drive 1 _operationCtr++; - if (ListMeterFilesDrive1()) - { - foreach (var checkInstalledFile in filesToDownload) - { - if (_meterFilesDrive1.Contains(checkInstalledFile)) - { - ErrorMessage = ""; - var txt = $"{checkInstalledFile} found in meter"; - OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); - continue; - } + //if (ListMeterFilesDrive1()) + //{ + // foreach (var checkInstalledFile in filesToDownload) + // { + // if (_meterFilesDrive1.Contains(checkInstalledFile)) + // { + // ErrorMessage = ""; + // var txt = $"{checkInstalledFile} found in meter"; + // OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt)); + // continue; + // } - ErrorMessage = $"LUT file {StrLutMeterFileName} not installed!\n"; - returnValue = false; - } - } - else - { - returnValue = false; - } + // ErrorMessage = $"LUT file {StrLutMeterFileName} not installed!\n"; + // returnValue = false; + // } + //} + //else + //{ + // returnValue = false; + //} if (!returnValue) { From 0230ea7554f90d25350f2eb6a80df8e8277a5ea4 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Mon, 23 Jan 2023 13:18:54 +0100 Subject: [PATCH 08/12] ProductionUiCordonel: -ReSharper --- Common/Common.sln.DotSettings.user | 2 +- Common/ProductionUiCordonel/App.xaml.cs | 1 - .../Data/PickingResultData.cs | 4 - .../Data/PressureResultDataNotifyable.cs | 2 +- .../ProductionUiCordonel/Event/StringArgs.cs | 4 - Common/ProductionUiCordonel/FinalTest.xaml | 4 +- Common/ProductionUiCordonel/FinalTest.xaml.cs | 82 +++----- Common/ProductionUiCordonel/MainWindow.xaml | 2 +- .../ProductionUiCordonel/MainWindow.xaml.cs | 16 +- .../Model/FinalTestModel.cs | 6 - .../Model/IMultiModeChildViewModel.cs | 5 - .../Model/MarriageMultiModeViewModel.cs | 6 +- .../Model/MultiModeMasterViewModel.cs | 3 +- .../Model/PickingMultiModeViewModel.cs | 5 +- .../Model/PressureMultiModeViewModel.cs | 4 +- Common/ProductionUiCordonel/MultiMode.xaml.cs | 4 - .../Actions/ProductionCheckShippingState.cs | 34 ++-- .../ProductionProcessCheckAttachment.cs | 16 +- .../ProductionProcessCheckOrderNumber.cs | 39 ++-- .../ProductionProcessCheckSerialNumber.cs | 26 +-- .../Actions/ProductionProcessConnect.cs | 43 ++-- .../Actions/ProductionProcessDone.cs | 18 +- ...tionProcessFinalParameterizationVakoCsd.cs | 30 +-- ...oductionProcessFinalParametrizationFix.cs} | 192 ++++++++---------- .../Actions/ProductionProcessFullReadOut.cs | 16 +- ...nProcessGetFinalParametrizationVakoCsd.cs} | 32 ++- .../Actions/ProductionProcessLogOff.cs | 2 +- .../Actions/ProductionProcessPasswordFile.cs | 35 ++-- .../Actions/ProductionProcessRadioCheck.cs | 11 +- .../Actions/ProductionProcessShippingMode.cs | 62 +++--- .../Actions/ProductionProcessSpecialConfig.cs | 16 +- .../BaseProductionProcess.cs | 4 +- .../Enum/ProductionProcessState.cs | 4 - .../ProductionProcesses/IProductionProcess.cs | 4 - .../MultiProcessController.cs | 4 +- .../PopUpProcessLogArgs.cs | 4 - .../PopUpProcessProgressArgs.cs | 4 - .../ProcessStateChangedArgs.cs | 4 - .../ProductionUiCordonel.csproj | 4 +- .../Properties/AssemblyInfo.cs | 2 - .../FinalTest/UcBarcodeInput.xaml | 2 +- .../UserControls/FinalTest/UcDialog.xaml.cs | 11 - .../FinalTest/UcFullReadOut.xaml.cs | 15 +- .../FinalTest/UcPasswordFile.xaml.cs | 15 +- .../UserControls/FinalTest/UcPlain.xaml.cs | 15 +- .../FinalTest/UcRadioCheck.xaml.cs | 19 +- .../ctls/ctlMultiModeMarriage.xaml.cs | 2 +- .../ctls/ctlMultiModePicking.xaml.cs | 13 +- .../ctls/ctlMultiModePressure.xaml.cs | 5 +- 49 files changed, 305 insertions(+), 548 deletions(-) rename Common/ProductionUiCordonel/ProductionProcesses/Actions/{ProductionProcessFinalParameterizationFix.cs => ProductionProcessFinalParametrizationFix.cs} (70%) rename Common/ProductionUiCordonel/ProductionProcesses/Actions/{ProductionProcessGetFinalParameterizationVakoCsd.cs => ProductionProcessGetFinalParametrizationVakoCsd.cs} (72%) diff --git a/Common/Common.sln.DotSettings.user b/Common/Common.sln.DotSettings.user index 68fd2006..2ad4797a 100644 --- a/Common/Common.sln.DotSettings.user +++ b/Common/Common.sln.DotSettings.user @@ -27,7 +27,7 @@ True NewVersion True - C:\Users\Thomas\AppData\Local\Temp\JetBrains\ReSharperPlatformVs15\vAny_33007af5\CoverageData\_Common.-1885154465\Snapshot\snapshot.utdcvr + diff --git a/Common/ProductionUiCordonel/App.xaml.cs b/Common/ProductionUiCordonel/App.xaml.cs index b5d91a56..cc3dff1f 100644 --- a/Common/ProductionUiCordonel/App.xaml.cs +++ b/Common/ProductionUiCordonel/App.xaml.cs @@ -1,6 +1,5 @@ using System; using System.Windows; -using System.Windows.Input; namespace ProductionUiCordonel { diff --git a/Common/ProductionUiCordonel/Data/PickingResultData.cs b/Common/ProductionUiCordonel/Data/PickingResultData.cs index 4d12f73f..1a5553cf 100644 --- a/Common/ProductionUiCordonel/Data/PickingResultData.cs +++ b/Common/ProductionUiCordonel/Data/PickingResultData.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; diff --git a/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs b/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs index 10c41039..83b84b5b 100644 --- a/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs +++ b/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs @@ -42,7 +42,7 @@ namespace ProductionUiCordonel.Data public String PcbId; - private Int32 rev = 0; + private Int32 rev; public Int32 Rev { diff --git a/Common/ProductionUiCordonel/Event/StringArgs.cs b/Common/ProductionUiCordonel/Event/StringArgs.cs index 0b96e4e8..324f7ea1 100644 --- a/Common/ProductionUiCordonel/Event/StringArgs.cs +++ b/Common/ProductionUiCordonel/Event/StringArgs.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace ProductionUiCordonel.Event { diff --git a/Common/ProductionUiCordonel/FinalTest.xaml b/Common/ProductionUiCordonel/FinalTest.xaml index 9c644d0e..0306640a 100644 --- a/Common/ProductionUiCordonel/FinalTest.xaml +++ b/Common/ProductionUiCordonel/FinalTest.xaml @@ -14,7 +14,7 @@ - public partial class ctlMultiModeMarriage : UserControl { - private MarriageMultiModeViewModel ViewModel = null; + private MarriageMultiModeViewModel ViewModel; public ctlMultiModeMarriage() { InitializeComponent(); diff --git a/Common/ProductionUiCordonel/ctls/ctlMultiModePicking.xaml.cs b/Common/ProductionUiCordonel/ctls/ctlMultiModePicking.xaml.cs index 2fb36d16..32ec18f2 100644 --- a/Common/ProductionUiCordonel/ctls/ctlMultiModePicking.xaml.cs +++ b/Common/ProductionUiCordonel/ctls/ctlMultiModePicking.xaml.cs @@ -1,18 +1,7 @@ using System; -using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; using System.Windows.Threading; using ProductionUiCordonel.Data; using ProductionUiCordonel.Model; @@ -24,7 +13,7 @@ namespace ProductionUiCordonel.ctls /// public partial class ctlMultiModePicking : UserControl { - private PickingMultiModeViewModel ViewModel = null; + private PickingMultiModeViewModel ViewModel; public ctlMultiModePicking() { InitializeComponent(); diff --git a/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs b/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs index fc6a95f9..54c28e3b 100644 --- a/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs +++ b/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs @@ -4,7 +4,6 @@ using System; using System.Linq; using System.Windows; using System.Windows.Controls; -using System.Windows.Media; using System.Windows.Threading; using Xylem.Common.Logic.ProductionOrderCore.TestResults; @@ -17,7 +16,7 @@ namespace ProductionUiCordonel.ctls { public event EventHandler OnBarcodeInput; - private PressureMultiModeViewModel ViewModel = null; + private PressureMultiModeViewModel ViewModel; public ctlMultiModePressure() { InitializeComponent(); @@ -79,7 +78,7 @@ namespace ProductionUiCordonel.ctls { MessageBox.Show(e.Content); } - private Int32? BarcodeInputActiveOffset = null; + private Int32? BarcodeInputActiveOffset; private String BarcodeInput = ""; private void TextBox_TextChanged(Object sender, TextChangedEventArgs e) From d3b8918a0abce58208858b4b07294cc66babc198 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Mon, 23 Jan 2023 13:46:37 +0100 Subject: [PATCH 09/12] ProductionUiCordonel: -ReSharper --- Common/ProductionUiCordonel/App.xaml.cs | 5 - .../ApplicationSettings.cs | 4 +- .../Data/PickingResultData.cs | 24 +- .../Data/PressureResultDataNotifyable.cs | 37 +-- Common/ProductionUiCordonel/FinalTest.xaml.cs | 10 +- .../ProductionUiCordonel/MainWindow.xaml.cs | 38 ++- .../Model/MarriageMultiModeViewModel.cs | 21 +- .../Model/MultiModeChildViewModel.cs | 72 ++---- .../Model/MultiModeMasterViewModel.cs | 105 ++++---- .../Model/PickingMultiModeViewModel.cs | 237 ++++++++++-------- .../Model/PickingViewModel.cs | 69 +++-- .../Model/PressureMultiModeViewModel.cs | 40 +-- Common/ProductionUiCordonel/MultiMode.xaml.cs | 11 +- .../MultiModeChild.xaml.cs | 48 ++-- .../Actions/ProductionCheckShippingState.cs | 21 +- .../ProductionProcessCheckAttachment.cs | 9 +- .../ProductionProcessCheckOrderNumber.cs | 8 +- .../ProductionProcessCheckSerialNumber.cs | 4 +- .../Actions/ProductionProcessConnect.cs | 32 ++- .../Actions/ProductionProcessDone.cs | 4 +- ...tionProcessFinalParameterizationVakoCsd.cs | 26 +- ...roductionProcessFinalParametrizationFix.cs | 8 +- .../Actions/ProductionProcessFullReadOut.cs | 6 +- ...onProcessGetFinalParametrizationVakoCsd.cs | 9 +- .../Actions/ProductionProcessLogOff.cs | 8 +- .../Actions/ProductionProcessPasswordFile.cs | 14 +- .../Actions/ProductionProcessRadioCheck.cs | 63 ++--- .../Actions/ProductionProcessShippingMode.cs | 6 +- .../Actions/ProductionProcessSpecialConfig.cs | 4 +- .../BaseProductionProcess.cs | 6 +- .../ProductionProcesses/IProductionProcess.cs | 4 +- .../MultiProcessController.cs | 4 +- .../Properties/Resources.Designer.cs | 64 ++--- .../Properties/Settings.Designer.cs | 12 +- .../FinalTest/UcBarcodeInput.xaml.cs | 8 +- .../UserControls/FinalTest/UcDialog.xaml.cs | 2 +- .../FinalTest/UcRadioCheck.xaml.cs | 38 +-- .../ctls/ctlMultiModeMarriage.xaml.cs | 7 +- .../ctls/ctlMultiModePressure.xaml.cs | 8 +- 39 files changed, 540 insertions(+), 556 deletions(-) diff --git a/Common/ProductionUiCordonel/App.xaml.cs b/Common/ProductionUiCordonel/App.xaml.cs index cc3dff1f..38724c1a 100644 --- a/Common/ProductionUiCordonel/App.xaml.cs +++ b/Common/ProductionUiCordonel/App.xaml.cs @@ -8,11 +8,6 @@ namespace ProductionUiCordonel /// public partial class App : Application { - public App() - { - //this.StartupUri = new Uri("MainWindow.xaml"); - //this.StartupUri = new Uri("MultiMode.xaml"); - } private void Application_Startup(Object sender, StartupEventArgs e) { diff --git a/Common/ProductionUiCordonel/ApplicationSettings.cs b/Common/ProductionUiCordonel/ApplicationSettings.cs index 28c2e56a..6c285692 100644 --- a/Common/ProductionUiCordonel/ApplicationSettings.cs +++ b/Common/ProductionUiCordonel/ApplicationSettings.cs @@ -1,7 +1,7 @@ -using Newtonsoft.Json; -using System; +using System; using System.Collections.Generic; using System.IO; +using Newtonsoft.Json; namespace ProductionUiCordonel { diff --git a/Common/ProductionUiCordonel/Data/PickingResultData.cs b/Common/ProductionUiCordonel/Data/PickingResultData.cs index 1a5553cf..a8ca3be1 100644 --- a/Common/ProductionUiCordonel/Data/PickingResultData.cs +++ b/Common/ProductionUiCordonel/Data/PickingResultData.cs @@ -1,4 +1,5 @@ using System; +using System.Windows.Media; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; @@ -24,23 +25,23 @@ public abstract class PickingResultBaseData : IPickingResultData public Boolean HasError { get; set; } - public System.Windows.Media.Brush ResultColor { get { return getColorFromResult(); } } - public abstract Func Action { get; } + public Brush ResultColor => getColorFromResult(); + public abstract Func Action { get; } - private System.Windows.Media.Brush getColorFromResult() + private Brush getColorFromResult() { - var converter = new System.Windows.Media.BrushConverter(); - var brush = (System.Windows.Media.Brush)converter.ConvertFromString("#000000"); + var converter = new BrushConverter(); + var brush = (Brush)converter.ConvertFromString("#000000"); if (Result.HasValue) // && a.Result.Value )) { if (!Result.Value) { - brush = (System.Windows.Media.Brush)converter.ConvertFromString("#FF8000"); + brush = (Brush)converter.ConvertFromString("#FF8000"); } else { - brush = (System.Windows.Media.Brush)converter.ConvertFromString("#419C14"); + brush = (Brush)converter.ConvertFromString("#419C14"); } } @@ -61,7 +62,7 @@ public abstract class PickingResultBaseData : IPickingResultData Boolean HasError { get; set; } - System.Windows.Media.Brush ResultColor { get; } + Brush ResultColor { get; } Func Action { get; } } @@ -73,11 +74,11 @@ public abstract class PickingResultBaseData : IPickingResultData public Object CompareObject { get; set; } - public override Func Action { get { return staticReadAndCompareAction(); } } + public override Func Action => staticReadAndCompareAction(); public Func staticReadAndCompareAction() { - return delegate () + return delegate { var retComp = new PickingItemCheckReturn(); retComp.Result = null; @@ -113,8 +114,7 @@ public abstract class PickingResultBaseData : IPickingResultData } public readonly Func _action; - public override Func Action { get { return _action; } } - + public override Func Action => _action; } } diff --git a/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs b/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs index 83b84b5b..d2f7fe2a 100644 --- a/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs +++ b/Common/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs @@ -46,7 +46,7 @@ namespace ProductionUiCordonel.Data public Int32 Rev { - get { return rev; } + get => rev; set { rev = value; @@ -56,7 +56,7 @@ namespace ProductionUiCordonel.Data private Boolean? passed = false; public Boolean? Passed { - get { return passed; } + get => passed; set { passed = value; @@ -69,7 +69,7 @@ namespace ProductionUiCordonel.Data private String testerName = "C. Röhl"; public String TesterName { - get { return testerName; } + get => testerName; set { testerName = value; @@ -80,7 +80,7 @@ namespace ProductionUiCordonel.Data private String testPressure = "6"; public String TestPressure { - get { return testPressure; } + get => testPressure; set { testPressure = value; @@ -92,7 +92,7 @@ namespace ProductionUiCordonel.Data private String leakRate = " 0,00001"; public String LeakRate { - get { return leakRate; } + get => leakRate; set { leakRate = value; @@ -103,7 +103,7 @@ namespace ProductionUiCordonel.Data private String remark = ""; public String Remark { - get { return remark; } + get => remark; set { remark = value; @@ -112,21 +112,22 @@ namespace ProductionUiCordonel.Data } - private ObservableCollection testpoints = new ObservableCollection() { - new PressureTestPoints() { Ident = 1, Input = "2E-07" }, - new PressureTestPoints() { Ident = 2, Input = "2E-07" }, - new PressureTestPoints() { Ident = 3, Input = "2E-07" }, - new PressureTestPoints() { Ident = 4, Input = "2E-07" }, - new PressureTestPoints() { Ident = 5, Input = "2E-07" }, - new PressureTestPoints() { Ident = 6, Input = "2E-07" }, - new PressureTestPoints() { Ident = 7, Input = "2E-07" }, - new PressureTestPoints() { Ident = 8, Input = "2E-07" }, - new PressureTestPoints() { Ident = 9, Input = "2E-07" }, - new PressureTestPoints() { Ident = 10, Input = "2E-07" } + private ObservableCollection testpoints = new ObservableCollection + { + new PressureTestPoints { Ident = 1, Input = "2E-07" }, + new PressureTestPoints { Ident = 2, Input = "2E-07" }, + new PressureTestPoints { Ident = 3, Input = "2E-07" }, + new PressureTestPoints { Ident = 4, Input = "2E-07" }, + new PressureTestPoints { Ident = 5, Input = "2E-07" }, + new PressureTestPoints { Ident = 6, Input = "2E-07" }, + new PressureTestPoints { Ident = 7, Input = "2E-07" }, + new PressureTestPoints { Ident = 8, Input = "2E-07" }, + new PressureTestPoints { Ident = 9, Input = "2E-07" }, + new PressureTestPoints { Ident = 10, Input = "2E-07" } }; public ObservableCollection Testpoints { - get { return testpoints; } + get => testpoints; set { testpoints = value; diff --git a/Common/ProductionUiCordonel/FinalTest.xaml.cs b/Common/ProductionUiCordonel/FinalTest.xaml.cs index bd628968..3869b471 100644 --- a/Common/ProductionUiCordonel/FinalTest.xaml.cs +++ b/Common/ProductionUiCordonel/FinalTest.xaml.cs @@ -209,10 +209,7 @@ namespace ProductionUiCordonel _lastMsg = value; updateUi(lblMessage, _lastMsg); } - get - { - return _lastMsg; - } + get => _lastMsg; } private void updateUi(ContentControl c, String content) { @@ -261,10 +258,7 @@ namespace ProductionUiCordonel } } - get - { - return _currentPcbID; - } + get => _currentPcbID; } private void GetPcbMapping(String pcbID) { diff --git a/Common/ProductionUiCordonel/MainWindow.xaml.cs b/Common/ProductionUiCordonel/MainWindow.xaml.cs index 79df4910..6f4931fc 100644 --- a/Common/ProductionUiCordonel/MainWindow.xaml.cs +++ b/Common/ProductionUiCordonel/MainWindow.xaml.cs @@ -1,6 +1,5 @@ -using Newtonsoft.Json; -using ProductionUiCordonel.Model; -using System; +using System; +using System.ComponentModel; using System.IO; using System.Linq; using System.Net; @@ -9,6 +8,8 @@ using System.Timers; using System.Windows; using System.Windows.Controls; using System.Windows.Threading; +using Newtonsoft.Json; +using ProductionUiCordonel.Model; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.CommonCore.Consts; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig; @@ -96,10 +97,7 @@ namespace ProductionUiCordonel } } - get - { - return _currentPcbID; - } + get => _currentPcbID; } public enum uiState @@ -116,10 +114,7 @@ namespace ProductionUiCordonel _currentState = value; updateUi(lblState, _currentState.ToString()); } - get - { - return _currentState; - } + get => _currentState; } private String _lastMsg; @@ -130,10 +125,7 @@ namespace ProductionUiCordonel _lastMsg = value; updateUi(lblMessage, _lastMsg); } - get - { - return _lastMsg; - } + get => _lastMsg; } public MainWindow() @@ -231,7 +223,7 @@ namespace ProductionUiCordonel private GenesisMeter CurrentMeter { - get { return _currentMeter; } + get => _currentMeter; set { _currentMeter = value; @@ -279,7 +271,7 @@ namespace ProductionUiCordonel } else { - LastMsg = $"No Meter found"; + LastMsg = "No Meter found"; DisposeAllConnections(); } @@ -314,16 +306,14 @@ namespace ProductionUiCordonel } return hasDetect; } - else - { - LastMsg = "Meter is still connected (locked)"; - return true; - } + + LastMsg = "Meter is still connected (locked)"; + return true; } - private void Window_Closing(Object sender, System.ComponentModel.CancelEventArgs e) + private void Window_Closing(Object sender, CancelEventArgs e) { DisposeAllConnections(); } @@ -459,7 +449,7 @@ namespace ProductionUiCordonel - ucFinalRadioTest.OrderHasChanged += delegate (Object sender, EventArgs args) + ucFinalRadioTest.OrderHasChanged += delegate { txtOrderNr.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { txtOrderNr.Text = ucFinalRadioTest.OrderNumber.ToString(); })); }; diff --git a/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs b/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs index 7ed39bd5..9012588f 100644 --- a/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs +++ b/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Net; using System.Threading.Tasks; +using System.Windows; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; using Xylem.Common.Logic.SoftwareAccessHelper; @@ -13,11 +14,11 @@ namespace ProductionUiCordonel.Model private Boolean canMarry; public Boolean CanMarry { - get { return canMarry; } + get => canMarry; set { canMarry = value; - NotifyPropertyChanged(nameof(CanMarry)); + NotifyPropertyChanged(); } } @@ -25,11 +26,11 @@ namespace ProductionUiCordonel.Model private Int32 serialNr; public Int32 SerialNr { - get { return serialNr; } + get => serialNr; set { serialNr = value; - NotifyPropertyChanged(nameof(SerialNr)); + NotifyPropertyChanged(); } } @@ -37,8 +38,8 @@ namespace ProductionUiCordonel.Model private Boolean locked = false; public MarriageMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID) { - base.VisibilityMarriage = System.Windows.Visibility.Visible; - base.MeterDetectedHandler += PickingMultiModeViewModel_MeterDetectedHandler; + VisibilityMarriage = Visibility.Visible; + MeterDetectedHandler += PickingMultiModeViewModel_MeterDetectedHandler; } internal async Task Store() @@ -74,11 +75,9 @@ namespace ProductionUiCordonel.Model return true; } - else - { - Log($"No result for {url} on Store"); - return false; - } + + Log($"No result for {url} on Store"); + return false; } diff --git a/Common/ProductionUiCordonel/Model/MultiModeChildViewModel.cs b/Common/ProductionUiCordonel/Model/MultiModeChildViewModel.cs index 947867d6..fe6d7edb 100644 --- a/Common/ProductionUiCordonel/Model/MultiModeChildViewModel.cs +++ b/Common/ProductionUiCordonel/Model/MultiModeChildViewModel.cs @@ -1,11 +1,11 @@ -using NLog; -using ProductionUiCordonel.Model; -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Timers; using System.Windows; +using NLog; +using ProductionUiCordonel.Model; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; using Xylem.Common.Utils.Logging; @@ -29,45 +29,36 @@ namespace ProductionUiCordonel private Visibility visibilityMarriage = Visibility.Collapsed; public Visibility VisibilityMarriage { - get - { - return visibilityMarriage; - } + get => visibilityMarriage; set { visibilityMarriage = value; - NotifyPropertyChanged(nameof(VisibilityMarriage)); + NotifyPropertyChanged(); } } private Visibility visibilityPicking = Visibility.Collapsed; public Visibility VisibilityPicking { - get - { - return visibilityPicking; - } + get => visibilityPicking; set { visibilityPicking = value; - NotifyPropertyChanged(nameof(VisibilityPicking)); + NotifyPropertyChanged(); } } private Visibility visibilityPressure = Visibility.Collapsed; public Visibility VisibilityPressure { - get - { - return visibilityPressure; - } + get => visibilityPressure; set { visibilityPressure = value; - NotifyPropertyChanged(nameof(VisibilityPressure)); + NotifyPropertyChanged(); } } @@ -75,15 +66,12 @@ namespace ProductionUiCordonel public String currentSlotStateText = "none"; public String CurrentSlotStateText { - get - { - return currentSlotStateText; - } + get => currentSlotStateText; set { currentSlotStateText = value; - NotifyPropertyChanged(nameof(CurrentSlotStateText)); + NotifyPropertyChanged(); } } @@ -93,10 +81,7 @@ namespace ProductionUiCordonel private SlotState currentSlotState = SlotState.None; public SlotState CurrentSlotState { - get - { - return currentSlotState; - } + get => currentSlotState; set { currentSlotState = value; @@ -126,10 +111,8 @@ namespace ProductionUiCordonel case SlotState.Fatal: CurrentSlotStateText = "Schwerwiegender Fehler"; break; - default: - break; } - NotifyPropertyChanged(nameof(CurrentSlotState)); + NotifyPropertyChanged(); } } @@ -137,11 +120,11 @@ namespace ProductionUiCordonel private String slotInfo = "-"; public String SlotInfo { - get { return slotInfo; } + get => slotInfo; set { slotInfo = value; - NotifyPropertyChanged(nameof(SlotInfo)); + NotifyPropertyChanged(); } } @@ -160,37 +143,34 @@ namespace ProductionUiCordonel private String childName = "asd"; public String ChildName { - get { return childName; } + get => childName; set { childName = value; - NotifyPropertyChanged(nameof(ChildName)); + NotifyPropertyChanged(); } } private String order; public String Order { - get { return order; } + get => order; set { order = value; - NotifyPropertyChanged(nameof(Order)); + NotifyPropertyChanged(); } } public String CurrentPcbID { - get - { - return _currentPcbID; - } + get => _currentPcbID; set { _currentPcbID = value; - NotifyPropertyChanged(nameof(CurrentPcbID)); + NotifyPropertyChanged(); } } @@ -294,7 +274,7 @@ namespace ProductionUiCordonel } else { - Log($"No Meter found"); + Log("No Meter found"); DisposeAllConnections(); } @@ -325,11 +305,9 @@ namespace ProductionUiCordonel } return hasDetect; } - else - { - Log("Meter is still connected (locked)"); - return true; - } + + Log("Meter is still connected (locked)"); + return true; } private void DisposeAllConnections() diff --git a/Common/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs b/Common/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs index a1386b0d..ecb9affd 100644 --- a/Common/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs +++ b/Common/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs @@ -1,6 +1,4 @@ -using Logic.ProductionToProductMapper.Cordonel; -using Newtonsoft.Json; -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.IO.Ports; @@ -8,10 +6,14 @@ using System.Linq; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; +using System.Windows.Media; +using Logic.ProductionToProductMapper.Cordonel; +using Newtonsoft.Json; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; using Xylem.Common.Logic.SoftwareAccessHelper; namespace ProductionUiCordonel.Model @@ -23,65 +25,50 @@ namespace ProductionUiCordonel.Model private String pickingSlot = "-"; private String pickingResult = "-"; - private System.Windows.Media.Brush pickingResultColor; - public System.Windows.Media.Brush PickingResultColor + private Brush pickingResultColor; + public Brush PickingResultColor { - get - { - return pickingResultColor; - } + get => pickingResultColor; set { pickingResultColor = value; - NotifyPropertyChanged(nameof(PickingResultColor)); + NotifyPropertyChanged(); } } public String PickingState { - get - { - return pickingState; - } + get => pickingState; set { pickingState = value; - NotifyPropertyChanged(nameof(PickingState)); + NotifyPropertyChanged(); } } public String PickingScanner { - get - { - return pickingScanner; - } + get => pickingScanner; set { pickingScanner = value; - NotifyPropertyChanged(nameof(PickingScanner)); + NotifyPropertyChanged(); } } public String PickingSlot { - get - { - return pickingSlot; - } + get => pickingSlot; set { pickingSlot = value; - NotifyPropertyChanged(nameof(PickingSlot)); + NotifyPropertyChanged(); } } public String PickingResult { - get - { - return pickingResult; - } + get => pickingResult; set { pickingResult = value; - NotifyPropertyChanged(nameof(PickingResult)); + NotifyPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; @@ -147,13 +134,11 @@ namespace ProductionUiCordonel.Model isRuning = false; break; } - else - { - Input = a.ReadLine(); - a.Close(); - isRuning = false; - break; - } + + Input = a.ReadLine(); + a.Close(); + isRuning = false; + break; } } @@ -185,14 +170,14 @@ namespace ProductionUiCordonel.Model meter.SetupFromConfigFile(PickingSlotNr); Batch.AddMeter(meter); PickingState = "Am Zähler anmelden"; - if ((Boolean)meter.Login()) + if (meter.Login()) { - meter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PickingStarted); + meter.SetProcessState(DisplayCodes.PickingStarted); var ret = RunCheck(checkAppsIdVersion, Frequency, MeterSize, PressurePresent, meter); if (ret) { - meter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PickingTested); + meter.SetProcessState(DisplayCodes.PickingTested); var url = $"{ServiceUrls.MeterProcessStateUrl()}SetPickingState?PcbID={meter.PcbId}&FertigungsauftragsNr={PickingOrder}"; var RetString = LocalWebRequest.PostRequestAsyncAndGetContent(url); @@ -205,7 +190,7 @@ namespace ProductionUiCordonel.Model } else { - meter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PickingFailed); + meter.SetProcessState(DisplayCodes.PickingFailed); } } } @@ -215,7 +200,7 @@ namespace ProductionUiCordonel.Model private Boolean RunCheck(Dictionary checkAppsIdVersion, UInt32 Frequency, UInt32 MeterSize, Boolean PressurePresent, GenesisMeter meter) { - PickingState = $"Üperprüfe Parameter"; + PickingState = "Üperprüfe Parameter"; var FrequencyReadOut = RegisterConverter.ConvertTo(meter.ReadRegister("SENSUSRADIO_FrequencyIndicator")); if (FrequencyReadOut != Frequency) { @@ -236,11 +221,11 @@ namespace ProductionUiCordonel.Model { if (PressurePresent) { - PickingState = $"Pcb mit Drucksensor. Laut Auftrag keine verbaut"; + PickingState = "Pcb mit Drucksensor. Laut Auftrag keine verbaut"; } else { - PickingState = $"Pcb ohne Drucksensor. Laut Auftrag soll eine verbaut werden"; + PickingState = "Pcb ohne Drucksensor. Laut Auftrag soll eine verbaut werden"; } //todo raus return false; @@ -254,14 +239,14 @@ namespace ProductionUiCordonel.Model var MeterFWApp = meter.MeterAppListVersion.First(a => item.Key == a.AppId); if (MeterFWApp == null || MeterFWApp.Version != item.Value) { - PickingState = $"Falsche FW, bitte Updaten"; + PickingState = "Falsche FW, bitte Updaten"; return false; } } catch (Exception) { - PickingState = $"Fehler beim auslesen der FW"; + PickingState = "Fehler beim auslesen der FW"; return false; } @@ -276,14 +261,14 @@ namespace ProductionUiCordonel.Model var storeRet = meter.ReadRegister("METROLOGYASST_StoreConfiguration"); if (!storeRet.All(a => a.Equals(0))) { - PickingState = $"Filesystem corrupt"; + PickingState = "Filesystem corrupt"; return false; } } catch (Exception) { - PickingState = $"Fehler beim überprüfen des Filesystems"; + PickingState = "Fehler beim überprüfen des Filesystems"; return false; } @@ -347,7 +332,7 @@ namespace ProductionUiCordonel.Model { try { - PickingState = $"Warte auf Pcb"; + PickingState = "Warte auf Pcb"; PickingSlot = $"Öffne EP {PickingSlotNr}"; tryMeter.SetupFromConfigFile(PickingSlotNr); Batch.AddMeter(tryMeter); @@ -367,7 +352,7 @@ namespace ProductionUiCordonel.Model else { PickingSlot = $"Keine Konnektivität EP {PickingSlotNr}"; - Log($"No Meter found"); + Log("No Meter found"); } @@ -413,11 +398,11 @@ namespace ProductionUiCordonel.Model PickingState = $"Vergleiche Auftragsdaten {PickingOrder} mit Pcb Eigenschaften"; - var converter = new System.Windows.Media.BrushConverter(); + var converter = new BrushConverter(); if (Compare(PickingOrderDetails.CheckAppsIdVersion, PickingOrderDetails.FrequencyIndicator, PickingOrderDetails.MeterSize, PickingOrderDetails.PressurePresent)) { //erfolg anzeigen und weiter - var b = (System.Windows.Media.Brush)converter.ConvertFromString("#419C14"); + var b = (Brush)converter.ConvertFromString("#419C14"); b.Freeze(); PickingResultColor = b; sm = PickingStateMachine.MeterDone; @@ -426,15 +411,15 @@ namespace ProductionUiCordonel.Model { sm = PickingStateMachine.MeterError; - var b = (System.Windows.Media.Brush)converter.ConvertFromString("#FF8000"); + var b = (Brush)converter.ConvertFromString("#FF8000"); b.Freeze(); PickingResultColor = b; } break; case PickingStateMachine.MeterError: PickingOrderDetails = null; - PickingState = $"Vergleich abgeschlossen"; - PickingResult = $"Vergleich fertig fehlgeschlagen"; + PickingState = "Vergleich abgeschlossen"; + PickingResult = "Vergleich fertig fehlgeschlagen"; Thread.Sleep(10000); sm = PickingStateMachine.StartCom; @@ -442,7 +427,7 @@ namespace ProductionUiCordonel.Model case PickingStateMachine.MeterDone: - PickingState = $"Vergleich abgeschlossen warten auf Montage Rückmeldung"; + PickingState = "Vergleich abgeschlossen warten auf Montage Rückmeldung"; PickingResult = $"Pcb {PickingPcbId} wurde dem Auftrag {PickingOrder} hinzugefügt"; Thread.Sleep(10000); PickingScanner = $"Öfffne {PickingScannerPort}"; @@ -479,12 +464,12 @@ namespace ProductionUiCordonel.Model PickingBarScanner = new BarScanner(PickingScannerPort, token); PickingBarScanner.Start(); - PickingState = $"Montage Rückmeldung erhalten, Montage des Drucksensors bestätigen"; + PickingState = "Montage Rückmeldung erhalten, Montage des Drucksensors bestätigen"; sm = PickingStateMachine.WaitForBuildingPressureReady; } else { - PickingState = $"Montage Rückmeldung erhalten, auftrag Scannen"; + PickingState = "Montage Rückmeldung erhalten, auftrag Scannen"; sm = PickingStateMachine.StartCom; } } @@ -507,13 +492,11 @@ namespace ProductionUiCordonel.Model { } - PickingState = $"Montage Rückmeldung erhalten, auftrag Scannen"; + PickingState = "Montage Rückmeldung erhalten, auftrag Scannen"; sm = PickingStateMachine.StartCom; } } break; - default: - break; } Thread.Sleep(1000); diff --git a/Common/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs b/Common/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs index 17d153bb..e8704730 100644 --- a/Common/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs +++ b/Common/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs @@ -1,7 +1,4 @@ -using Logic.ProductionToProductMapper.Cordonel; -using Newtonsoft.Json; -using ProductionUiCordonel.Data; -using System; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; @@ -10,10 +7,15 @@ using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Media; +using Logic.ProductionToProductMapper.Cordonel; +using Newtonsoft.Json; +using ProductionUiCordonel.Data; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; using Xylem.Common.Logic.ProductionOrderCore.OrderData; using Xylem.Common.Logic.SoftwareAccessHelper; +using MessageBox = System.Windows.Forms.MessageBox; namespace ProductionUiCordonel.Model { @@ -23,21 +25,20 @@ namespace ProductionUiCordonel.Model private Boolean inputIsEnabled; public Boolean InputIsEnabled { - get { return inputIsEnabled; } + get => inputIsEnabled; set { inputIsEnabled = value; - NotifyPropertyChanged(nameof(InputIsEnabled)); + NotifyPropertyChanged(); } } - private Boolean locked; - public PickingMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID,false) + public PickingMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID, false) { VisibilityPicking = Visibility.Visible; - base.MeterDetectedHandler += PickingMultiModeViewModel_MeterDetectedHandler; + MeterDetectedHandler += PickingMultiModeViewModel_MeterDetectedHandler; } private void PickingMultiModeViewModel_MeterDetectedHandler(Object sender, EventArgs e) @@ -54,20 +55,17 @@ namespace ProductionUiCordonel.Model public override void InputText(String text) { Order = text; - ReloadData(false); + ReloadData(); TextForceUpdate(); } - internal void ReloadData(Boolean reset) + internal void ReloadData() { Task.Run(() => { try { - - - var orderNR = 0; - if (!locked && !string.IsNullOrEmpty(Order) && Order.Length > 6 && int.TryParse(Order, out orderNR)) + if (!locked && !string.IsNullOrEmpty(Order) && Order.Length > 6 && int.TryParse(Order, out var orderNR)) { var str = LocalWebRequest.GetRequest($"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetOrderOverview?ProductionOrderNumber={orderNR}"); @@ -81,12 +79,11 @@ namespace ProductionUiCordonel.Model return; } - var retCode = 0; - str = LocalWebRequest.GetRequestWithError($"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetOrderDetails?ProductionOrderNumber={orderNR}&CheckPcbId={CurrentMeter.PcbId}",out retCode, 15000); + str = LocalWebRequest.GetRequestWithError($"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetOrderDetails?ProductionOrderNumber={orderNR}&CheckPcbId={CurrentMeter.PcbId}", out var retCode, 15000); if (retCode == 417) { - System.Windows.Forms.MessageBox.Show("NO radio parameter found"); + MessageBox.Show(@"NO radio parameter found"); } if (OrderOverView.Count == OrderOverView.AssignedPicking) @@ -97,61 +94,52 @@ namespace ProductionUiCordonel.Model return; } - try + var OrderDteails = JsonConvert.DeserializeObject(str); + + + if (CurrentMeter != null) { - var OrderDteails = JsonConvert.DeserializeObject(str); - - - if (CurrentMeter != null) + try { - try + + + locked = true; + //Init(CurrentMeter, new Dictionary(), OrderDteails.FrequencyIndicator, OrderDteails.MeterSize, OrderDteails.PressurePresent); + + + var a = new Dictionary(); + a.Add(0, 486); + a.Add(15, 287); + if (OrderDteails.FrequencyIndicator == 868) { - - - locked = true; - //Init(CurrentMeter, new Dictionary(), OrderDteails.FrequencyIndicator, OrderDteails.MeterSize, OrderDteails.PressurePresent); - - - var a = new Dictionary(); - a.Add(0, 486); - a.Add(15, 287); - if (OrderDteails.FrequencyIndicator == 868) - { - a.Add(24, 1067); - } - else - { - a.Add(24, 1066); - } - - Init(CurrentMeter, a, OrderDteails.FrequencyIndicator, OrderDteails.MeterSize, OrderDteails.PressurePresent); - - - var r = Run(CurrentMeter.PcbId, orderNR.ToString()); - - if (r) - { - doneCount = doneCount + 1; - } - locked = false; - UpdatePickingUi("Start checking meter", StatusColor, orderNR.ToString(), OrderOverView.Count, doneCount); + a.Add(24, 1067); } - catch (Exception ex) + else { - Log(ex.Message); + a.Add(24, 1066); } - finally + + Init(CurrentMeter, a, OrderDteails.FrequencyIndicator, OrderDteails.MeterSize, OrderDteails.PressurePresent); + + + var r = Run(CurrentMeter.PcbId, orderNR.ToString()); + + if (r) { - locked = false; + doneCount = doneCount + 1; } + locked = false; + UpdatePickingUi("Start checking meter", StatusColor, orderNR.ToString(), OrderOverView.Count, doneCount); + } + catch (Exception ex) + { + Log(ex.Message); + } + finally + { + locked = false; } } - catch (Exception) - { - - throw; - } - } else { @@ -166,7 +154,7 @@ namespace ProductionUiCordonel.Model }); } - private void UpdatePickingUi(String state, System.Windows.Media.Brush StateColor, String order, Int32 toDo, Int32 done) + private void UpdatePickingUi(String state, Brush StateColor, String order, Int32 toDo, Int32 done) { Message = state; Order = order; @@ -209,17 +197,19 @@ namespace ProductionUiCordonel.Model public event EventHandler OnDataChanged; public event EventHandler OnUpdateUi; - public event PropertyChangedEventHandler PropertyChanged; + public new event PropertyChangedEventHandler PropertyChanged; private GenesisMeter currentMeter; - private PickingCompareItem baseFile; - public ObservableCollection Data { get; set; } + public ObservableCollection Data + { + get; set; + } private OverallStatus status = OverallStatus.NoDetect; private OverallStatus Status { - get { return status; } + get => status; set { status = value; @@ -227,7 +217,10 @@ namespace ProductionUiCordonel.Model } } - public String Message { get; set; } + public String Message + { + get; set; + } private enum OverallStatus { NoDetect, @@ -257,7 +250,7 @@ namespace ProductionUiCordonel.Model } } - public System.Windows.Media.Brush StatusColor + public Brush StatusColor { get { @@ -277,8 +270,14 @@ namespace ProductionUiCordonel.Model } } - public Int32 ToDo { get; private set; } - public Int32 Done { get; private set; } + public Int32 ToDo + { + get; private set; + } + public Int32 Done + { + get; private set; + } public void Init(GenesisMeter meter, Dictionary checkAppsIdVersion, UInt32 Frequency, UInt32 MeterSize, Boolean PressurePresent) { @@ -287,48 +286,69 @@ namespace ProductionUiCordonel.Model currentMeter = meter; var data = new List(); - data.Add(new PickingResultCustomCheckData(delegate () + data.Add(new PickingResultCustomCheckData(delegate { - var r = meter.Login(); - meter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PickingStarted); - return new PickingItemCheckReturn() { Result = true, Msg = "done" }; + meter.Login(); + meter.SetProcessState(DisplayCodes.PickingStarted); + return new PickingItemCheckReturn { Result = true, Msg = "done" }; }) - { Index = data.Count, Ident = "Login", CheckText = "Try to access Meter", HasError = false, Result = null, CurrentValueText = "-" }); + { + Index = data.Count, Ident = "Login", CheckText = "Try to access Meter", HasError = false, Result = null, + CurrentValueText = "-" + }); - data.Add(new PickingResultRegisterData() { ReadMeter = meter, Index = data.Count, Ident = "Check Radio", CheckText = $"{Frequency}MHz", CompareObject = Frequency, CurrentValueText = "none", HasError = false, Result = null, RegisterIdent = "SENSUSRADIO_FrequencyIndicator" }); ; + data.Add(new PickingResultRegisterData + { + ReadMeter = meter, Index = data.Count, Ident = "Check Radio", CheckText = $"{Frequency}MHz", + CompareObject = Frequency, CurrentValueText = "none", HasError = false, Result = null, + RegisterIdent = "SENSUSRADIO_FrequencyIndicator" + }); - data.Add(new PickingResultRegisterData() { ReadMeter = meter, Index = data.Count, Ident = "MeterSize", CheckText = "DN40-50", CompareObject = MeterSize, CurrentValueText = "none", HasError = false, Result = null, RegisterIdent = "GENESISFLOW_MeterSize" }); + data.Add(new PickingResultRegisterData + { + ReadMeter = meter, Index = data.Count, Ident = "MeterSize", + CheckText = "DN40-50", CompareObject = MeterSize, CurrentValueText = "none", HasError = false, + Result = null, RegisterIdent = "GENESISFLOW_MeterSize" + }); - data.Add(new PickingResultRegisterData() { ReadMeter = meter, Index = data.Count, Ident = "Pressure", CheckText = "Pressure Sensor", CompareObject = PressurePresent, CurrentValueText = "-", HasError = false, Result = null, RegisterIdent = "METROLOGYASST_PressurePresent" }); + data.Add(new PickingResultRegisterData + { + ReadMeter = meter, Index = data.Count, Ident = "Pressure", + CheckText = "Pressure Sensor", CompareObject = PressurePresent, CurrentValueText = "-", HasError = false, + Result = null, RegisterIdent = "METROLOGYASST_PressurePresent" + }); foreach (var item in checkAppsIdVersion) { - data.Add(new PickingResultCustomCheckData(delegate () + data.Add(new PickingResultCustomCheckData(delegate { try { var MeterFWApp = meter.MeterAppListVersion.First(a => item.Key == a.AppId); - if (MeterFWApp == null || MeterFWApp.Version != item.Value) + if (MeterFWApp.Version != item.Value) { - return new PickingItemCheckReturn() { Result = false, Msg = MeterFWApp.StrVersion }; + return new PickingItemCheckReturn { Result = false, Msg = MeterFWApp.StrVersion }; } - return new PickingItemCheckReturn() { Result = true, Msg = MeterFWApp.StrVersion }; + return new PickingItemCheckReturn { Result = true, Msg = MeterFWApp.StrVersion }; } catch (Exception) { - return new PickingItemCheckReturn() { Result = false, Msg = "error" }; + return new PickingItemCheckReturn { Result = false, Msg = "error" }; } }) - { Index = data.Count, Ident = $"Check AppId {item.Key}", CheckText = $"Version {item.Value}", HasError = false, Result = null, CurrentValueText = "-" }); ; + { + Index = data.Count, Ident = $"Check AppId {item.Key}", CheckText = $"Version {item.Value}", + HasError = false, Result = null, CurrentValueText = "-" + }); } - data.Add(new PickingResultCustomCheckData(delegate () + data.Add(new PickingResultCustomCheckData(delegate { try { @@ -337,20 +357,23 @@ namespace ProductionUiCordonel.Model var storeRet = meter.ReadRegister("METROLOGYASST_StoreConfiguration"); if (storeRet.All(a => a.Equals(0))) { - return new PickingItemCheckReturn() { Result = true, Msg = "Filesystem OK" }; + return new PickingItemCheckReturn { Result = true, Msg = "Filesystem OK" }; } - return new PickingItemCheckReturn() { Result = false, Msg = "Filesystem corrupt" }; + return new PickingItemCheckReturn { Result = false, Msg = "Filesystem corrupt" }; } catch (Exception) { - return new PickingItemCheckReturn() { Result = false, Msg = "error" }; + return new PickingItemCheckReturn { Result = false, Msg = "error" }; } }) - { Index = data.Count, Ident = $"Check Filesystem", CheckText = $"Check Filesystem", HasError = false, Result = null, CurrentValueText = "checking" }); ; - + { + Index = data.Count, Ident = "Check Filesystem", CheckText = "Check Filesystem", HasError = false, + Result = null, CurrentValueText = "checking" + }); + Status = OverallStatus.CheckingIsRunning; ChangeDataData(data); } @@ -373,12 +396,11 @@ namespace ProductionUiCordonel.Model if (tmpData.All(a => !a.HasError && a.Result.HasValue && a.Result.Value)) { - currentMeter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PickingTested); + currentMeter.SetProcessState(DisplayCodes.PickingTested); var url = $"{ServiceUrls.MeterProcessStateUrl()}SetPickingState?PcbID={pcbID}&FertigungsauftragsNr={OrderNr}"; var RetString = LocalWebRequest.PostRequestAsyncAndGetContent(url); - var result = false; - if (bool.TryParse(RetString, out result)) + if (bool.TryParse(RetString, out var result)) { Status = OverallStatus.CheckingIsDone; return result; @@ -390,23 +412,18 @@ namespace ProductionUiCordonel.Model return false; } + + currentMeter.SetProcessState(DisplayCodes.PickingFailed); + if (tmpData.All(a => a.HasError)) + { + Status = OverallStatus.CheckingIsHasError; + } else { - currentMeter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PickingFailed); - if (tmpData.All(a => a.HasError)) - { - Status = OverallStatus.CheckingIsHasError; - } - else - { - Status = OverallStatus.CheckingIsNoMatch; - } - - return false; + Status = OverallStatus.CheckingIsNoMatch; } - - + return false; } internal void Empty() @@ -415,5 +432,9 @@ namespace ProductionUiCordonel.Model ChangeDataData(new List()); } + protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) + { + PropertyChanged?.Invoke(this, e); + } } } diff --git a/Common/ProductionUiCordonel/Model/PickingViewModel.cs b/Common/ProductionUiCordonel/Model/PickingViewModel.cs index 8c2425f7..af11b5fc 100644 --- a/Common/ProductionUiCordonel/Model/PickingViewModel.cs +++ b/Common/ProductionUiCordonel/Model/PickingViewModel.cs @@ -1,14 +1,15 @@ -using Logic.ProductionToProductMapper.Cordonel; -using ProductionUiCordonel.Data; -using System; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Threading; using System.Windows.Media; +using Logic.ProductionToProductMapper.Cordonel; +using ProductionUiCordonel.Data; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; using Xylem.Common.Logic.SoftwareAccessHelper; namespace ProductionUiCordonel.Model @@ -23,14 +24,10 @@ namespace ProductionUiCordonel.Model public ObservableCollection Data { get; set; } - public PickingViewModel() - { - - } private OverallStatus status = OverallStatus.NoDetect; private OverallStatus Status { - get { return status; } + get => status; set { status = value; @@ -68,7 +65,7 @@ namespace ProductionUiCordonel.Model } } - public System.Windows.Media.Brush StatusColor + public Brush StatusColor { get { @@ -96,39 +93,39 @@ namespace ProductionUiCordonel.Model currentMeter = meter; var data = new List(); - data.Add(new PickingResultCustomCheckData(delegate () - { + data.Add(new PickingResultCustomCheckData(delegate + { var r = meter.Login(); - meter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PickingStarted); - return new PickingItemCheckReturn() { Result = true, Msg = "done" }; + meter.SetProcessState(DisplayCodes.PickingStarted); + return new PickingItemCheckReturn { Result = true, Msg = "done" }; }) { Index = data.Count, Ident = "Login", CheckText = "Try to access Meter", HasError = false, Result = null, CurrentValueText = "-" }); if (Frequency != 0) { - data.Add(new PickingResultRegisterData() { ReadMeter = meter, Index = data.Count, Ident = "Check Radio", CheckText = "433", CompareObject = Frequency, CurrentValueText = "none", HasError = false, Result = null, RegisterIdent = "SENSUSRADIO_FrequencyIndicator" }); ; + data.Add(new PickingResultRegisterData { ReadMeter = meter, Index = data.Count, Ident = "Check Radio", CheckText = "433", CompareObject = Frequency, CurrentValueText = "none", HasError = false, Result = null, RegisterIdent = "SENSUSRADIO_FrequencyIndicator" }); ; - data.Add(new PickingResultRegisterData() { ReadMeter = meter, Index = data.Count, Ident = "MeterSize", CheckText = "DN40-50", CompareObject = MeterSize, CurrentValueText = "none", HasError = false, Result = null, RegisterIdent = "GENESISFLOW_MeterSize" }); + data.Add(new PickingResultRegisterData { ReadMeter = meter, Index = data.Count, Ident = "MeterSize", CheckText = "DN40-50", CompareObject = MeterSize, CurrentValueText = "none", HasError = false, Result = null, RegisterIdent = "GENESISFLOW_MeterSize" }); } foreach (var item in checkAppsIdVersion) { - data.Add(new PickingResultCustomCheckData(delegate () - { + data.Add(new PickingResultCustomCheckData(delegate + { try { var MeterFWApp = meter.MeterAppListVersion.First(a => item.Key == a.AppId); if (MeterFWApp == null || MeterFWApp.Version != item.Value) { - return new PickingItemCheckReturn() { Result = false, Msg = MeterFWApp.StrVersion }; + return new PickingItemCheckReturn { Result = false, Msg = MeterFWApp.StrVersion }; } - return new PickingItemCheckReturn() { Result = true, Msg = MeterFWApp.StrVersion }; + return new PickingItemCheckReturn { Result = true, Msg = MeterFWApp.StrVersion }; } catch (Exception) { - return new PickingItemCheckReturn() { Result = false, Msg = "error" }; + return new PickingItemCheckReturn { Result = false, Msg = "error" }; } }) @@ -136,7 +133,7 @@ namespace ProductionUiCordonel.Model } - data.Add(new PickingResultCustomCheckData(delegate () + data.Add(new PickingResultCustomCheckData(delegate { try { @@ -145,19 +142,19 @@ namespace ProductionUiCordonel.Model var storeRet = meter.ReadRegister("METROLOGYASST_StoreConfiguration"); if (storeRet.All(a => a.Equals(0))) { - return new PickingItemCheckReturn() { Result = true, Msg = "Filesystem OK" }; + return new PickingItemCheckReturn { Result = true, Msg = "Filesystem OK" }; } - return new PickingItemCheckReturn() { Result = false, Msg = "Filesystem corrupt" }; + return new PickingItemCheckReturn { Result = false, Msg = "Filesystem corrupt" }; } catch (Exception) { - return new PickingItemCheckReturn() { Result = false, Msg = "error" }; + return new PickingItemCheckReturn { Result = false, Msg = "error" }; } }) - { Index = data.Count, Ident = $"Check Filesystem", CheckText = $"Check Filesystem", HasError = false, Result = null, CurrentValueText = "checking" }); ; + { Index = data.Count, Ident = "Check Filesystem", CheckText = "Check Filesystem", HasError = false, Result = null, CurrentValueText = "checking" }); ; Status = OverallStatus.CheckingIsRunning; ChangeDataData(data); @@ -181,7 +178,7 @@ namespace ProductionUiCordonel.Model if (tmpData.All(a => !a.HasError && a.Result.HasValue && a.Result.Value)) { - currentMeter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PickingTested); + currentMeter.SetProcessState(DisplayCodes.PickingTested); var url = $"{ServiceUrls.MeterProcessStateUrl()}SetPickingState?PcbID={pcbID}&FertigungsauftragsNr={OrderNr}"; var RetString = LocalWebRequest.PostRequestAsyncAndGetContent(url); @@ -198,21 +195,19 @@ namespace ProductionUiCordonel.Model return false; } + + currentMeter.SetProcessState(DisplayCodes.PickingFailed); + if (tmpData.All(a => a.HasError)) + { + Status = OverallStatus.CheckingIsHasError; + } else { - currentMeter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PickingFailed); - if (tmpData.All(a => a.HasError)) - { - Status = OverallStatus.CheckingIsHasError; - } - else - { - Status = OverallStatus.CheckingIsNoMatch; - } - - return false; + Status = OverallStatus.CheckingIsNoMatch; } + return false; + } diff --git a/Common/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs b/Common/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs index 0a74e9ed..f121524a 100644 --- a/Common/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs +++ b/Common/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs @@ -1,12 +1,14 @@ -using Newtonsoft.Json; -using ProductionUiCordonel.Data; -using ProductionUiCordonel.Event; -using System; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; +using System.Windows; +using Newtonsoft.Json; +using ProductionUiCordonel.Data; +using ProductionUiCordonel.Event; using Xylem.Common.CommonCore.Configuration; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; using Xylem.Common.Logic.ProductionOrderCore.ProcessState; using Xylem.Common.Logic.ProductionOrderCore.TestResults; using Xylem.Common.Logic.SoftwareAccessHelper; @@ -21,11 +23,11 @@ namespace ProductionUiCordonel.Model private PressureResultDataNotifyable result = new PressureResultDataNotifyable(); public PressureResultDataNotifyable Result { - get { return result; } + get => result; set { result = value; - NotifyPropertyChanged(nameof(Result)); + NotifyPropertyChanged(); } } @@ -33,11 +35,11 @@ namespace ProductionUiCordonel.Model private Boolean inputIsEnabled; public Boolean InputIsEnabled { - get { return inputIsEnabled; } + get => inputIsEnabled; set { inputIsEnabled = value; - NotifyPropertyChanged(nameof(InputIsEnabled)); + NotifyPropertyChanged(); } } @@ -47,7 +49,7 @@ namespace ProductionUiCordonel.Model public PressureMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID) { - base.VisibilityPressure = System.Windows.Visibility.Visible; + VisibilityPressure = Visibility.Visible; StationID = stationID; } @@ -75,7 +77,7 @@ namespace ProductionUiCordonel.Model { } - Result = new PressureResultDataNotifyable() { Remark = "loading", Testpoints = new ObservableCollection(), PcbId = "" }; + Result = new PressureResultDataNotifyable { Remark = "loading", Testpoints = new ObservableCollection(), PcbId = "" }; Task.Run(() => { try @@ -98,7 +100,7 @@ namespace ProductionUiCordonel.Model return new PressureResultDataNotifyable(); } - }).ContinueWith((a) => + }).ContinueWith(a => { var res = a.Result; res.PcbId = CurrentPcbID; @@ -119,7 +121,7 @@ namespace ProductionUiCordonel.Model { InputIsEnabled = false; var isStored = false; - var status = Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PressureTestedFailed; + var status = DisplayCodes.PressureTestedFailed; Task.Run(() => { @@ -127,13 +129,13 @@ namespace ProductionUiCordonel.Model if (successfull) { - status = Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PressureTested; + status = DisplayCodes.PressureTested; } try { if (StationID == 1) { - var addResult = new PressureTestResult() + var addResult = new PressureTestResult { FreeText = Result.Remark, Passed = successfull, @@ -145,19 +147,19 @@ namespace ProductionUiCordonel.Model if (!LocalWebRequest.PostRequestAsync(url, json: addResult)) { - throw new ApplicationException($"PressureState: NOT successful"); + throw new ApplicationException("PressureState: NOT successful"); } } else { - url = url + $"SetPressureStateDetailed"; + url = url + "SetPressureStateDetailed"; var mutedResult = Result.ToBase(); isStored = LocalWebRequest.PostRequestAsync(url, json: mutedResult); if (!isStored) { OnStoreDone?.Invoke(null, new StringArgs("Can not store Result")); - status = Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PressureTestedFailed; + status = DisplayCodes.PressureTestedFailed; } } @@ -168,12 +170,12 @@ namespace ProductionUiCordonel.Model catch (Exception ex) { Log(ex.Message); - status = Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PressureTestedFailed; + status = DisplayCodes.PressureTestedFailed; OnStoreDone?.Invoke(null, new StringArgs("Can not store Result")); } - if (status == Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.PressureTested) + if (status == DisplayCodes.PressureTested) { OnStoreDone?.Invoke(null, new StringArgs("Pressure test stored successfully. Meter can passed")); return; diff --git a/Common/ProductionUiCordonel/MultiMode.xaml.cs b/Common/ProductionUiCordonel/MultiMode.xaml.cs index 742b4da3..c8b01f79 100644 --- a/Common/ProductionUiCordonel/MultiMode.xaml.cs +++ b/Common/ProductionUiCordonel/MultiMode.xaml.cs @@ -1,9 +1,10 @@ -using ProductionUiCordonel.Model; -using System; +using System; using System.Collections.Generic; using System.Threading; using System.Windows; +using System.Windows.Controls; using System.Windows.Input; +using ProductionUiCordonel.Model; namespace ProductionUiCordonel { @@ -45,7 +46,7 @@ namespace ProductionUiCordonel DataContext = multiModeMasterViewModel; InitializeComponent(); - this.Topmost = false; + Topmost = false; } private void keyUp(Object sender, KeyEventArgs e) { @@ -165,7 +166,7 @@ namespace ProductionUiCordonel throw new NotImplementedException(); } - private void TxtBarcodeInput_TextChanged(Object sender, System.Windows.Controls.TextChangedEventArgs e) + private void TxtBarcodeInput_TextChanged(Object sender, TextChangedEventArgs e) { //if (sender is TextBox text) //{ @@ -188,7 +189,7 @@ namespace ProductionUiCordonel } - private void Window_Closed(Object sender, System.EventArgs e) + private void Window_Closed(Object sender, EventArgs e) { cts.Cancel(); diff --git a/Common/ProductionUiCordonel/MultiModeChild.xaml.cs b/Common/ProductionUiCordonel/MultiModeChild.xaml.cs index a867e692..99e3dab9 100644 --- a/Common/ProductionUiCordonel/MultiModeChild.xaml.cs +++ b/Common/ProductionUiCordonel/MultiModeChild.xaml.cs @@ -1,11 +1,12 @@ -using ProductionUiCordonel.Model; -using System; +using System; using System.IO.Ports; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Threading; +using ProductionUiCordonel.Event; +using ProductionUiCordonel.Model; namespace ProductionUiCordonel { @@ -24,33 +25,33 @@ namespace ProductionUiCordonel { InitializeComponent(); ViewModel = viewModel; - this.DataContext = ViewModel; + DataContext = ViewModel; if (ViewModel is PressureMultiModeViewModel pressureModel) { PressureControl.setViewModel(pressureModel); - this.Left = 0; - this.Top = 250; - this.Height = SystemParameters.PrimaryScreenHeight - 300; - this.Width = SystemParameters.PrimaryScreenWidth / 2; + Left = 0; + Top = 250; + Height = SystemParameters.PrimaryScreenHeight - 300; + Width = SystemParameters.PrimaryScreenWidth / 2; } if (ViewModel is PickingMultiModeViewModel pickingModel) { PickingControl.setViewModel(pickingModel); - this.Left = SystemParameters.VirtualScreenLeft; - this.Top = SystemParameters.VirtualScreenTop; - this.Height = SystemParameters.VirtualScreenHeight; - this.Width = SystemParameters.VirtualScreenWidth - SystemParameters.PrimaryScreenWidth; + Left = SystemParameters.VirtualScreenLeft; + Top = SystemParameters.VirtualScreenTop; + Height = SystemParameters.VirtualScreenHeight; + Width = SystemParameters.VirtualScreenWidth - SystemParameters.PrimaryScreenWidth; } if (ViewModel is MarriageMultiModeViewModel marriageModel) { MarriageControl.setViewModel(marriageModel); - this.Left = SystemParameters.PrimaryScreenWidth / 2; - this.Top = 250; - this.Height = SystemParameters.PrimaryScreenHeight - 300; - this.Width = SystemParameters.PrimaryScreenWidth / 2; + Left = SystemParameters.PrimaryScreenWidth / 2; + Top = 250; + Height = SystemParameters.PrimaryScreenHeight - 300; + Width = SystemParameters.PrimaryScreenWidth / 2; } @@ -72,17 +73,14 @@ namespace ProductionUiCordonel { break; } - else - { - var resText = a.ReadLine(); - this.Dispatcher.Invoke(DispatcherPriority.Normal, + var resText = a.ReadLine(); + Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => - { - ViewModel.InputText(resText); - } + { + ViewModel.InputText(resText); + } )); - } @@ -110,7 +108,7 @@ namespace ProductionUiCordonel } - private void PressureControl_OnBarcodeInput(Object sender, Event.StringArgs e) + private void PressureControl_OnBarcodeInput(Object sender, StringArgs e) { InputText(e.Content); } @@ -125,7 +123,7 @@ namespace ProductionUiCordonel { if (sender is Button btn) { - btn.Content = $"POS L{this.Left},T{this.Top },H{this.Height},W{this.Width}"; + btn.Content = $"POS L{Left},T{Top },H{Height},W{Width}"; } } diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs index 87d2d75e..c523b7e4 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionCheckShippingState.cs @@ -1,9 +1,10 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; -using System; +using System; using System.Linq; using System.Windows.Controls; using System.Windows.Threading; +using Newtonsoft.Json; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Logic.SoftwareAccessHelper; @@ -52,7 +53,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions var url = $"{ServiceUrls.MeterInfoForTestBench()}{Meter.PcbId}"; var csdRet = LocalWebRequest.GetRequest(url); - var res = Newtonsoft.Json.JsonConvert.DeserializeObject(csdRet); + var res = JsonConvert.DeserializeObject(csdRet); var CalibrationRun = res[4]; var LastTestBechState = 0; @@ -88,7 +89,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions UserControl.lblText.Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => { - UserControl.lblText.Content = $"Zähler nicht erfolgreich geprüft"; + UserControl.lblText.Content = "Zähler nicht erfolgreich geprüft"; } )); @@ -99,7 +100,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions UserControl.lblText.Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => { - UserControl.lblText.Content = $"Zähler nicht erfolgreich vorbehandelt"; + UserControl.lblText.Content = "Zähler nicht erfolgreich vorbehandelt"; } )); currentProcessState = ProductionProcessState.Error; @@ -115,10 +116,10 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions UserControl.lblText.Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => { - UserControl.lblText.Content = $"Batterie nicht lesbar"; + UserControl.lblText.Content = "Batterie nicht lesbar"; } )); - Meter.WriteLog($"Batterie nicht lesbar"); + Meter.WriteLog("Batterie nicht lesbar"); break; } var nowChargeV = BitConverter.ToUInt64(nowCharge.ToArray(), 0); @@ -139,8 +140,8 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions if (totalUsed > 10) { currentProcessState = ProductionProcessState.Error; - UserControl.lblText.Content = $"Batterie über 15% entladen"; - Meter.WriteLog($"Batterie über 15% entladen"); + UserControl.lblText.Content = "Batterie über 15% entladen"; + Meter.WriteLog("Batterie über 15% entladen"); } if (currentProcessState != ProductionProcessState.Error) diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckAttachment.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckAttachment.cs index 8e44fe3c..466b19d2 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckAttachment.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckAttachment.cs @@ -1,11 +1,12 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using System; +using System; using System.Collections.Generic; using System.Windows.Controls; +using Newtonsoft.Json; +using ProductionUiCordonel.ProductionProcesses.Enum; using ProductionUiCordonel.UserControls.FinalTest; -using Xylem.Common.Logic.SoftwareAccessHelper; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Logic.ProductionOrderCore.Vako; +using Xylem.Common.Logic.SoftwareAccessHelper; namespace ProductionUiCordonel.ProductionProcesses.Actions { @@ -66,7 +67,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions try { var a = LocalWebRequest.GetRequest($"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetSingleVakoKey?ProductionOrderNumber={OrderNumber}&KeyName=C_GEN_PULS"); - var myJsonResponse = Newtonsoft.Json.JsonConvert.DeserializeObject(a); + var myJsonResponse = JsonConvert.DeserializeObject(a); if (myJsonResponse.Value.ToLower() == "q" || myJsonResponse.Value.ToLower() == "k") { UserControl.SetDesc("Pulse Module anbauen!"); diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckOrderNumber.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckOrderNumber.cs index 296893d2..b92ef0c0 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckOrderNumber.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckOrderNumber.cs @@ -1,10 +1,10 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using System; -using System.Windows.Controls; -using ProductionUiCordonel.UserControls.FinalTest; +using System; using System.IO; using System.Net; +using System.Windows.Controls; using Newtonsoft.Json; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.CommonCore.Configuration; namespace ProductionUiCordonel.ProductionProcesses.Actions diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckSerialNumber.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckSerialNumber.cs index 3a40ec62..15e5f9e7 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckSerialNumber.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessCheckSerialNumber.cs @@ -1,6 +1,6 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using System; +using System; using System.Windows.Controls; +using ProductionUiCordonel.ProductionProcesses.Enum; using ProductionUiCordonel.UserControls.FinalTest; namespace ProductionUiCordonel.ProductionProcesses.Actions diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessConnect.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessConnect.cs index 5cff6a33..11d2c952 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessConnect.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessConnect.cs @@ -1,9 +1,10 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Windows.Controls; +using Newtonsoft.Json; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Logic.ProductionOrderCore; @@ -23,10 +24,17 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } public override void InitUserControl() { - UserControl = new UcPlain(); - UserControl.lblHl.Content = name; - UserControl.lblText.Content = ""; - + UserControl = new UcPlain + { + lblHl = + { + Content = name + }, + lblText = + { + Content = "" + } + }; } public override UserControl GetControl() @@ -46,21 +54,21 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions public override void StartProcess() { - NewStatus($"Prüfe Verbindung"); + NewStatus("Prüfe Verbindung"); Progress = 0; if (!Meter.IsLoggedOn) { - NewStatus($"Login wird gestartet"); + NewStatus("Login wird gestartet"); Meter.Login(); } //Check access in Progress = 50; - NewStatus($"Zugang wird überprüft"); + NewStatus("Zugang wird überprüft"); //var res = base.Meter.ReadRegister(Register.Genesisflow.LedMode); //if (res != null && res.Length > 0) //{ Progress = 100; - NewStatus($"Zugang verifiziert"); + NewStatus("Zugang verifiziert"); currentProcessState = ProductionProcessState.Done; asyncProgrammingParametersTask = new Task>(() => @@ -71,7 +79,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions var url = $"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetProgrammingParameters?PcbID={Meter.PcbId}"; var csdRet = LocalWebRequest.GetRequest(url, 80000); - return Newtonsoft.Json.JsonConvert.DeserializeObject>(csdRet); + return JsonConvert.DeserializeObject>(csdRet); } catch (Exception ) diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessDone.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessDone.cs index 284a03d8..e91ab4be 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessDone.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessDone.cs @@ -1,7 +1,7 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using System; +using System; using System.Collections.Generic; using System.Windows.Controls; +using ProductionUiCordonel.ProductionProcesses.Enum; using ProductionUiCordonel.UserControls.FinalTest; namespace ProductionUiCordonel.ProductionProcesses.Actions diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs index 15abdfd1..d16b4651 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs @@ -1,11 +1,11 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Controls; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Logic.ProductionOrderCore; @@ -126,7 +126,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions //SENSUSRADIO_EncryptionKey dont reserve SENSUSRADIO_EncryptionKey! if (item.RegisterName.ToLower().Contains("displaypow".ToLower()) || item.RegisterName.ToLower().Contains("METROLOGYASST_FlowPoint".ToLower())) { - overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, new Byte[] { item.RegisterValue.ToArray()[0] }, true, true)); + overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, new[] { item.RegisterValue.ToArray()[0] }, true, true)); } else if (item.RegisterName.ToLower().Contains("SENSUSRADIO_EncryptionKey".ToLower())) { @@ -146,9 +146,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions //} } - overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmEnableMask", new Byte[] { 0x00, 0x00, 0x80, 0x53 }.Reverse().ToArray(), true, false)); ; - overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmBroadcastMask", new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray(), true, false)); - overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmVisualMask", new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray(), true, false)); + overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmEnableMask", new Byte[] { 0x00, 0x00, 0x80, 0x53 }.Reverse().ToArray())); ; + overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmBroadcastMask", new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray())); + overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmVisualMask", new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray())); foreach (var item in myJsonResponse.Where(m => m.Source == ProgrammingSource.Csd)) @@ -166,7 +166,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_ResetAccumulators", - (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, false)); + (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray())); @@ -179,15 +179,15 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions overAllResult.Add(wirteRegisterInBetweenCheck("IRDA_MfgDate", Convert.ToInt32(ts.TotalSeconds))); overAllResult.Add(_currentGenesis_WriteRegister("LOGGER_TriggerLogFlush", - (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, false)); + (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray())); overAllResult.Add(_currentGenesis_WriteRegister("NFC_EraseRMA", - (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, false)); + (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray())); if (hasRadio) { overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_ResetCounter", - (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, false)); + (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray())); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true)); @@ -231,7 +231,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } - Progress = 15 + ((Int32)Math.Round(((Double)done / (Double)overAllResult.Count) * 85, 0)); + Progress = 15 + ((Int32)Math.Round((done / (Double)overAllResult.Count) * 85, 0)); done = done + 1; } @@ -252,7 +252,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { currentProcessState = ProductionProcessState.Error; reTrysLeft = -1; - NewStatus($"Warnung!Fehler beim laden des Parametersatzes"); + NewStatus("Warnung!Fehler beim laden des Parametersatzes"); } diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationFix.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationFix.cs index 963c6943..b112ee4c 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationFix.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationFix.cs @@ -1,13 +1,13 @@ -using Newtonsoft.Json; -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Threading.Tasks; using System.Windows.Controls; +using Newtonsoft.Json; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFullReadOut.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFullReadOut.cs index 65615695..d474aa1c 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFullReadOut.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFullReadOut.cs @@ -1,9 +1,9 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; -using System; +using System; using System.Linq; using System.Windows.Controls; using System.Windows.Threading; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; namespace ProductionUiCordonel.ProductionProcesses.Actions diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessGetFinalParametrizationVakoCsd.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessGetFinalParametrizationVakoCsd.cs index 1cd01f38..e809c3bf 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessGetFinalParametrizationVakoCsd.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessGetFinalParametrizationVakoCsd.cs @@ -1,9 +1,10 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Windows.Controls; +using Newtonsoft.Json; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Logic.ProductionOrderCore; using Xylem.Common.Logic.SoftwareAccessHelper; @@ -54,7 +55,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions var url = $"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetProgrammingParameters?PcbID={Meter.PcbId}"; var csdRet = LocalWebRequest.GetRequest(url, 60000); - Result = Newtonsoft.Json.JsonConvert.DeserializeObject>(csdRet); + Result = JsonConvert.DeserializeObject>(csdRet); Progress = 100; diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessLogOff.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessLogOff.cs index acceef95..b913711b 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessLogOff.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessLogOff.cs @@ -1,10 +1,10 @@ -using Logic.ProductionToProductMapper.Cordonel; -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; -using System; +using System; using System.Collections.Generic; using System.Reflection; using System.Windows.Controls; +using Logic.ProductionToProductMapper.Cordonel; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Logic.SoftwareAccessHelper; diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs index f71c500e..f96becb9 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs @@ -1,12 +1,12 @@ -using Newtonsoft.Json; -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Windows.Controls; +using Newtonsoft.Json; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile; using Xylem.Common.Logic.SoftwareAccessHelper; @@ -80,7 +80,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } updateImage(UserControl.WriteToMeter, ret); Progress = Progress + 16; - //Check if new password is in the meter ... even the file wirte wasnt succesfull + //Check if new password is in the meter ... even the file write wasn't successful if (!ret) { Meter.Logout(); @@ -137,7 +137,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions private MeterPwdFile meterPwdFile; public Boolean RequestPassword() { - NewStatus($"Request Passwords"); + NewStatus("Request Passwords"); var url = ServiceUrls.GenesisGetPasswordContainerServiceUrl(); //url = "http://localhost:56011/api/Password/GetPasswordHashFileContent?PcbId="; url = ($"{url}{Meter.PcbId}"); @@ -150,7 +150,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions if (errorCode == HttpStatusCode.OK.GetHashCode()) { pwContainer = JsonConvert.DeserializeObject(resp); - NewStatus($"Passwörter verfügbar"); + NewStatus("Passwörter verfügbar"); return true; } return false; diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessRadioCheck.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessRadioCheck.cs index 669b6e04..41d0a0e7 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessRadioCheck.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessRadioCheck.cs @@ -1,20 +1,23 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using System; +using System; +using System.Configuration; using System.Linq; +using System.Net.Http; using System.Text; -using System.Threading.Tasks; -using System.Windows.Controls; -using ProductionUiCordonel.UserControls.FinalTest; using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Threading; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ProductionUiCordonel.ProductionProcesses.Enum; +using ProductionUiCordonel.UserControls.FinalTest; +using SIRTCOM; +using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; -using Newtonsoft.Json; -using Xylem.Common.CommonCore.Configuration; -using System.Configuration; -using System.Net.Http; -using System.Windows.Threading; -using Newtonsoft.Json.Linq; using Xylem.Common.Logic.SoftwareAccessHelper; +using Button = System.Windows.Controls.Button; +using UserControl = System.Windows.Controls.UserControl; namespace ProductionUiCordonel.ProductionProcesses.Actions { @@ -33,12 +36,12 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { UserControl = new UcRadioCheck(); - UserControl.OnRetryRequested += delegate (Object sender, EventArgs args) { GetRssi(); }; + UserControl.OnRetryRequested += delegate { GetRssi(); }; - UserControl.OnResetRequested += delegate (Object sender, EventArgs args) { Reset(); }; - UserControl.OnForceAPam += delegate (Object sender, EventArgs args) { forcePush(); }; - UserControl.OnDoneRequested += delegate (Object sender, EventArgs args) + UserControl.OnResetRequested += delegate { Reset(); }; + UserControl.OnForceAPam += delegate { forcePush(); }; + UserControl.OnDoneRequested += delegate { currentProcessState = ProductionProcessState.Done; @@ -86,7 +89,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions EncyptionKey = LocalWebRequest.GetRequest($"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetEncryptionKey?PcbID={Meter.PcbId}", 80000).ToUpper().Trim('\"'); if (!EncyptionKey.Equals(BitConverter.ToString(enc.ToArray()).Replace("-", ""))) { - System.Windows.Forms.MessageBox.Show("Funkschlüssel überprüfen!"); + MessageBox.Show("Funkschlüssel überprüfen!"); } EncyptionKey = BitConverter.ToString(enc.ToArray()).Replace("-", ""); @@ -99,9 +102,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions //{ // Comport = 7; //} - BoxNr = Convert.ToByte(ConfigurationManager.AppSettings[$"SirtBoxNr"]); + BoxNr = Convert.ToByte(ConfigurationManager.AppSettings["SirtBoxNr"]); - DebugMessage($"Start RadioCheck Comport:{Comport} ,BoxNr:{BoxNr}, freq: {freq}, RadioAddress:{RadioAdress}s\r\n", false); + DebugMessage($"Start RadioCheck Comport:{Comport} ,BoxNr:{BoxNr}, freq: {freq}, RadioAddress:{RadioAdress}s\r\n"); Meter.WriteRegister("SENSUSRADIO_IrDAModulePresent", 1, true, true); @@ -116,7 +119,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions #region FormerForm private SaveData saveData; - private SIRTCOM.Statemashine stm; + private Statemashine stm; private static HttpClient httpclient; private Byte? RSSI_PAM_Min; @@ -204,7 +207,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions stm.ClearPam(); stm.Stop(); } - DebugMessage("Reset\r\n", false); + DebugMessage("Reset\r\n"); clearRssi(); SetUi(); StartProcess(); @@ -279,14 +282,14 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions RSSI_PAM = null; RSSI_SEMI = null; - stm = new SIRTCOM.Statemashine(); + stm = new Statemashine(); Byte P81_1 = 0; saveData.RadioAdress = RadioAdress; stm.initialise((Byte)ByteCOMPort); - SIRTCOM.Wrapper wrp = new SIRTCOM.Wrapper(); + Wrapper wrp = new Wrapper(); stm.StartLoggin("C:\\GenesisLog\\log.txt"); // ist wohl nicht nötig da der SIRT richtig konfiguroert ist: @@ -310,7 +313,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions stm.OnStateChanged += Stm_OnStateChanged; stm.Start(); // Start polling - DebugMessage($" OK\r\n", true); + DebugMessage(" OK\r\n", true); Meter.ResetAlarm(GenesisMeter.Alarm.EMPTY_PIPE); Thread.Sleep(5000); //Meter.WriteRegister("SENSUSRADIO_SYSTEMSTATE", 0x01, true, false); @@ -324,8 +327,8 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions private void forcePush() { - Meter.WriteRegister("SENSUSRADIO_SYSTEMSTATE", 0x55, true, false); - Meter.WriteRegister("SENSUSRADIO_SYSTEMSTATE", 0x02, true, false); + Meter.WriteRegister("SENSUSRADIO_SYSTEMSTATE", 0x55); + Meter.WriteRegister("SENSUSRADIO_SYSTEMSTATE", 0x02); } @@ -373,21 +376,21 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions SetUi(); if (saveData.Result == 1) { - UserControl.ViewResult(10); + UserControl.ViewResult(); } } - private void Stm_OnStateChanged(Object sender, SIRTCOM.MyEventArgs e) + private void Stm_OnStateChanged(Object sender, MyEventArgs e) { // our Pam - SIRTCOM.PAM Pam = stm.GetPAM(1); + PAM Pam = stm.GetPAM(1); - if (Pam.State == SIRTCOM.PAM.PAMStates.Timeout) + if (Pam.State == PAM.PAMStates.Timeout) { - DebugMessage($"Timeout nach {Pam.GetTime()} s\r\n", false); + DebugMessage($"Timeout nach {Pam.GetTime()} s\r\n"); } if (Pam.CountSemi > 0) diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs index 400f5540..ed6f275a 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessShippingMode.cs @@ -1,10 +1,10 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using ProductionUiCordonel.UserControls.FinalTest; -using System; +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; diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessSpecialConfig.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessSpecialConfig.cs index 927bd7ae..f1cf1da5 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessSpecialConfig.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessSpecialConfig.cs @@ -1,8 +1,8 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Windows.Controls; +using ProductionUiCordonel.ProductionProcesses.Enum; using ProductionUiCordonel.UserControls.FinalTest; namespace ProductionUiCordonel.ProductionProcesses.Actions diff --git a/Common/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs b/Common/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs index 52b39c61..c7dbe591 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs @@ -1,9 +1,9 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using System; +using System; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Controls; +using ProductionUiCordonel.ProductionProcesses.Enum; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; namespace ProductionUiCordonel.ProductionProcesses @@ -13,7 +13,7 @@ namespace ProductionUiCordonel.ProductionProcesses private Int32 _progress; public Int32 Progress { - get { return _progress; } + get => _progress; set { _progress = value; diff --git a/Common/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs b/Common/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs index 4b420f32..96976f1d 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs @@ -1,7 +1,7 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using System; +using System; using System.Threading; using System.Windows.Controls; +using ProductionUiCordonel.ProductionProcesses.Enum; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; namespace ProductionUiCordonel.ProductionProcesses diff --git a/Common/ProductionUiCordonel/ProductionProcesses/MultiProcessController.cs b/Common/ProductionUiCordonel/ProductionProcesses/MultiProcessController.cs index 6cbebc2e..5731f06a 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/MultiProcessController.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/MultiProcessController.cs @@ -1,9 +1,9 @@ -using ProductionUiCordonel.ProductionProcesses.Enum; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using ProductionUiCordonel.ProductionProcesses.Enum; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; namespace ProductionUiCordonel.ProductionProcesses diff --git a/Common/ProductionUiCordonel/Properties/Resources.Designer.cs b/Common/ProductionUiCordonel/Properties/Resources.Designer.cs index 25759934..c5794db5 100644 --- a/Common/ProductionUiCordonel/Properties/Resources.Designer.cs +++ b/Common/ProductionUiCordonel/Properties/Resources.Designer.cs @@ -8,10 +8,16 @@ // //------------------------------------------------------------------------------ +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Drawing; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + namespace ProductionUiCordonel.Properties { - using System; - - /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -19,27 +25,27 @@ namespace ProductionUiCordonel.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [DebuggerNonUserCode()] + [CompilerGenerated()] internal class Resources { - private static global::System.Resources.ResourceManager resourceMan; + private static ResourceManager resourceMan; - private static global::System.Globalization.CultureInfo resourceCulture; + private static CultureInfo resourceCulture; - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// /// Returns the cached ResourceManager instance used by this class. /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager { get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProductionUiCordonel.Properties.Resources", typeof(Resources).Assembly); + if (ReferenceEquals(resourceMan, null)) { + ResourceManager temp = new ResourceManager("ProductionUiCordonel.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; @@ -50,8 +56,8 @@ namespace ProductionUiCordonel.Properties { /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture { get { return resourceCulture; } @@ -63,70 +69,70 @@ namespace ProductionUiCordonel.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap CLEARMAtrix { + internal static Bitmap CLEARMAtrix { get { object obj = ResourceManager.GetObject("CLEARMAtrix", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ((Bitmap)(obj)); } } /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap Connect_16x { + internal static Bitmap Connect_16x { get { object obj = ResourceManager.GetObject("Connect_16x", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ((Bitmap)(obj)); } } /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap ConnectPlugged_16x { + internal static Bitmap ConnectPlugged_16x { get { object obj = ResourceManager.GetObject("ConnectPlugged_16x", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ((Bitmap)(obj)); } } /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap iconCheck { + internal static Bitmap iconCheck { get { object obj = ResourceManager.GetObject("iconCheck", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ((Bitmap)(obj)); } } /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap iconWarn { + internal static Bitmap iconWarn { get { object obj = ResourceManager.GetObject("iconWarn", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ((Bitmap)(obj)); } } /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap iconWating { + internal static Bitmap iconWating { get { object obj = ResourceManager.GetObject("iconWating", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ((Bitmap)(obj)); } } /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap Refresh_16x { + internal static Bitmap Refresh_16x { get { object obj = ResourceManager.GetObject("Refresh_16x", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ((Bitmap)(obj)); } } diff --git a/Common/ProductionUiCordonel/Properties/Settings.Designer.cs b/Common/ProductionUiCordonel/Properties/Settings.Designer.cs index 9bca8ed4..15aa4dc9 100644 --- a/Common/ProductionUiCordonel/Properties/Settings.Designer.cs +++ b/Common/ProductionUiCordonel/Properties/Settings.Designer.cs @@ -8,16 +8,20 @@ // //------------------------------------------------------------------------------ +using System.CodeDom.Compiler; +using System.Configuration; +using System.Runtime.CompilerServices; + namespace ProductionUiCordonel.Properties { - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + [CompilerGenerated()] + [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : ApplicationSettingsBase { - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + private static Settings defaultInstance = ((Settings)(Synchronized(new Settings()))); public static Settings Default { diff --git a/Common/ProductionUiCordonel/UserControls/FinalTest/UcBarcodeInput.xaml.cs b/Common/ProductionUiCordonel/UserControls/FinalTest/UcBarcodeInput.xaml.cs index f6f0caf3..afba3ed7 100644 --- a/Common/ProductionUiCordonel/UserControls/FinalTest/UcBarcodeInput.xaml.cs +++ b/Common/ProductionUiCordonel/UserControls/FinalTest/UcBarcodeInput.xaml.cs @@ -66,7 +66,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest internal void SetFocusMe() { - this.Dispatcher.Invoke(DispatcherPriority.Send, + Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => { txtHiddenInput.Focus(); @@ -76,7 +76,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest public void inputKey(String input) { - this.Dispatcher.Invoke(DispatcherPriority.Send, + Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => { BarcodeInput?.Invoke(this,input); @@ -101,7 +101,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest private void UserControl_MouseDown(Object sender, MouseButtonEventArgs e) { - this.Dispatcher.Invoke(DispatcherPriority.Send, + Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => { //txtHiddenInput.Focus(); @@ -111,7 +111,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest private void LblInput_MouseDown(Object sender, MouseButtonEventArgs e) { - this.Dispatcher.Invoke(DispatcherPriority.Send, + Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => { //txtHiddenInput.Focus(); diff --git a/Common/ProductionUiCordonel/UserControls/FinalTest/UcDialog.xaml.cs b/Common/ProductionUiCordonel/UserControls/FinalTest/UcDialog.xaml.cs index c1722aa5..44f0f20f 100644 --- a/Common/ProductionUiCordonel/UserControls/FinalTest/UcDialog.xaml.cs +++ b/Common/ProductionUiCordonel/UserControls/FinalTest/UcDialog.xaml.cs @@ -76,7 +76,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest - this.Dispatcher.Invoke(DispatcherPriority.Send, + Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => { var stackPnl = new StackPanel(); diff --git a/Common/ProductionUiCordonel/UserControls/FinalTest/UcRadioCheck.xaml.cs b/Common/ProductionUiCordonel/UserControls/FinalTest/UcRadioCheck.xaml.cs index e3ba784e..c4226889 100644 --- a/Common/ProductionUiCordonel/UserControls/FinalTest/UcRadioCheck.xaml.cs +++ b/Common/ProductionUiCordonel/UserControls/FinalTest/UcRadioCheck.xaml.cs @@ -5,29 +5,30 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Threading; +using Color = System.Drawing.Color; namespace ProductionUiCordonel.UserControls.FinalTest { /// /// Interaction logic for UcRadioCheck.xaml /// - public partial class UcRadioCheck : UserControl + public partial class UcRadioCheck { public class UIContainerElement { public Int32? Value; - public System.Drawing.Color Color; + public Color Color; public UIContainerElement(Int32? value) { Value = value; if (!value.HasValue) { - Color = System.Drawing.Color.LightYellow; + Color = Color.LightYellow; } else { - Color = System.Drawing.Color.Transparent; + Color = Color.Transparent; } } @@ -65,35 +66,35 @@ namespace ProductionUiCordonel.UserControls.FinalTest if (!CordMin.Value.HasValue || CordRssi.Value.Value < CordMin.Value.Value) { success = false; - CordMin.Color = System.Drawing.Color.Tomato; - CordRssi.Color = System.Drawing.Color.White; + CordMin.Color = Color.Tomato; + CordRssi.Color = Color.White; } if (!SirtMin.Value.HasValue || SirtRssi.Value.Value < SirtMin.Value.Value) { success = false; - SirtMin.Color = System.Drawing.Color.Tomato; - SirtRssi.Color = System.Drawing.Color.White; + SirtMin.Color = Color.Tomato; + SirtRssi.Color = Color.White; } if (!CordMax.Value.HasValue || CordRssi.Value.Value > CordMax.Value.Value) { success = false; - CordMax.Color = System.Drawing.Color.Tomato; - CordRssi.Color = System.Drawing.Color.White; + CordMax.Color = Color.Tomato; + CordRssi.Color = Color.White; } if (!SirtMax.Value.HasValue || SirtRssi.Value.Value > SirtMax.Value.Value) { success = false; - SirtMax.Color = System.Drawing.Color.Tomato; - SirtRssi.Color = System.Drawing.Color.White; + SirtMax.Color = Color.Tomato; + SirtRssi.Color = Color.White; } if (success) { - CordRssi.Color = System.Drawing.Color.LightGreen; - SirtRssi.Color = System.Drawing.Color.LightGreen; + CordRssi.Color = Color.LightGreen; + SirtRssi.Color = Color.LightGreen; } } @@ -105,7 +106,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest public void SetUi(UIContainer uiContainer) { - this.Dispatcher.Invoke(DispatcherPriority.Send, + Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => { setLbl(lblCordMin, uiContainer.CordMin); @@ -122,7 +123,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest { lbl.Content = element.GetText(); lbl.Background = - new SolidColorBrush(Color.FromArgb(element.Color.A, element.Color.R, element.Color.G, element.Color.B)); + new SolidColorBrush(System.Windows.Media.Color.FromArgb(element.Color.A, element.Color.R, element.Color.G, element.Color.B)); } @@ -159,8 +160,9 @@ namespace ProductionUiCordonel.UserControls.FinalTest var waitMS = WaitSeconds * 1000; while (waitMS > 0) { + var ms = waitMS; BtnDone.Dispatcher.Invoke(DispatcherPriority.Send, - new Action(() => { BtnDone.Content = $"Done({waitMS / 1000}s)"; } + new Action(() => { BtnDone.Content = $"Done({ms / 1000}s)"; } )); waitMS = waitMS - 1000; @@ -168,7 +170,7 @@ namespace ProductionUiCordonel.UserControls.FinalTest } BtnDone.Dispatcher.Invoke(DispatcherPriority.Send, - new Action(() => { BtnDone.Content = $"Done"; } + new Action(() => { BtnDone.Content = "Done"; } )); OnDoneRequested?.Invoke(this, EventArgs.Empty); }); diff --git a/Common/ProductionUiCordonel/ctls/ctlMultiModeMarriage.xaml.cs b/Common/ProductionUiCordonel/ctls/ctlMultiModeMarriage.xaml.cs index f331c1a1..23351998 100644 --- a/Common/ProductionUiCordonel/ctls/ctlMultiModeMarriage.xaml.cs +++ b/Common/ProductionUiCordonel/ctls/ctlMultiModeMarriage.xaml.cs @@ -1,8 +1,9 @@ using System; -using ProductionUiCordonel.Model; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; +using ProductionUiCordonel.Model; +using MessageBox = System.Windows.Forms.MessageBox; namespace ProductionUiCordonel.ctls { @@ -32,11 +33,11 @@ namespace ProductionUiCordonel.ctls { if (a.Result) { - System.Windows.Forms.MessageBox.Show("Meter has passed"); + MessageBox.Show("Meter has passed"); } else { - System.Windows.Forms.MessageBox.Show("Meter not has passed"); + MessageBox.Show("Meter not has passed"); } }); diff --git a/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs b/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs index 54c28e3b..1f686ffc 100644 --- a/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs +++ b/Common/ProductionUiCordonel/ctls/ctlMultiModePressure.xaml.cs @@ -1,10 +1,10 @@ -using ProductionUiCordonel.Event; -using ProductionUiCordonel.Model; -using System; +using System; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Threading; +using ProductionUiCordonel.Event; +using ProductionUiCordonel.Model; using Xylem.Common.Logic.ProductionOrderCore.TestResults; namespace ProductionUiCordonel.ctls @@ -93,7 +93,7 @@ namespace ProductionUiCordonel.ctls { BarcodeInput = $"{BarcodeInput}{input}"; - if (input == System.Environment.NewLine) + if (input == Environment.NewLine) { var tmpOffset = BarcodeInputActiveOffset.Value; BarcodeInputActiveOffset = null; From 02770c2d0f72d31ead83364d01d8090c51b5be48 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Mon, 23 Jan 2023 13:59:18 +0100 Subject: [PATCH 10/12] ProductionProcessPasswordFile: _ password file generation re-activated UcPlain.xaml: Font size changed to 12 --- .../Model/MarriageMultiModeViewModel.cs | 3 ++- .../Actions/ProductionProcessPasswordFile.cs | 15 +++++++-------- .../UserControls/FinalTest/UcPlain.xaml | 7 +++---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs b/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs index 9012588f..92c7cd22 100644 --- a/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs +++ b/Common/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs @@ -36,7 +36,8 @@ namespace ProductionUiCordonel.Model private Boolean locked = false; - public MarriageMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID) + public MarriageMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : + base(ctrName, slotNR, barcodeTrigger, stationID) { VisibilityMarriage = Visibility.Visible; MeterDetectedHandler += PickingMultiModeViewModel_MeterDetectedHandler; diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs index f96becb9..5713cbda 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs @@ -49,8 +49,6 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions public override void StartProcess() { - currentProcessState = ProductionProcessState.Done; - return; Boolean ret = RequestPassword(); updateImage(UserControl.RequestPassword, ret); Progress = Progress + 16; @@ -141,12 +139,13 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions var url = ServiceUrls.GenesisGetPasswordContainerServiceUrl(); //url = "http://localhost:56011/api/Password/GetPasswordHashFileContent?PcbId="; url = ($"{url}{Meter.PcbId}"); - - var errorCode = 0; - var header = new Dictionary(); - header.Add("Cache-Control", "no-cache"); - header.Add("X-Node-Token", "d5b8c0b2-81f6-4421-80d0-44eb2093e616"); - var resp = LocalWebRequest.GetRequestWithError(url, out errorCode, 20000, header,true); + + var header = new Dictionary + { + { "Cache-Control", "no-cache" }, + { "X-Node-Token", "d5b8c0b2-81f6-4421-80d0-44eb2093e616" } + }; + var resp = LocalWebRequest.GetRequestWithError(url, out var errorCode, 20000, header,true); if (errorCode == HttpStatusCode.OK.GetHashCode()) { pwContainer = JsonConvert.DeserializeObject(resp); diff --git a/Common/ProductionUiCordonel/UserControls/FinalTest/UcPlain.xaml b/Common/ProductionUiCordonel/UserControls/FinalTest/UcPlain.xaml index 9c7e3107..15437633 100644 --- a/Common/ProductionUiCordonel/UserControls/FinalTest/UcPlain.xaml +++ b/Common/ProductionUiCordonel/UserControls/FinalTest/UcPlain.xaml @@ -2,12 +2,11 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:local="clr-namespace:ProductionUiCordonel.UserControls.FinalTest" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="260" d:DesignWidth="350"> - From 7cb19975db3ca58b2b65092adc618a40be2a684d Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Mon, 23 Jan 2023 14:11:03 +0100 Subject: [PATCH 11/12] ProductionUiCordonel: - ReSharper --- ...tionProcessFinalParameterizationVakoCsd.cs | 71 ++++++------------- 1 file changed, 22 insertions(+), 49 deletions(-) diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs index d16b4651..6602b40e 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs @@ -29,7 +29,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { UserControl = new UcPlain(); UserControl.lblHl.Content = name; - UserControl.lblText.Content = "Kann bis zu 1 Minute dauern!"; + UserControl.lblText.Content = "Dieser Vorgang Kann bis zu 1 Minute dauern!"; } public override UserControl GetControl() @@ -52,8 +52,6 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { return new Task>(() => { - - Task.Delay(10).Wait(); var ret = Meter.WriteRegister(reg, value, waitForResult, checkRegister); if (!ret) @@ -65,15 +63,15 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } - public Task> wirteRegisterInBetweenCheck(String reg, Int32 value, Boolean waitForResult = true, - Boolean checkRegister = false, Int32 addToCheck = 10, Int32 addFromCheck = 0) + public Task> wirteRegisterInBetweenCheck(String reg, Int32 value, Boolean waitForResult = true, + Int32 addToCheck = 10, Int32 addFromCheck = 0) { return new Task>(() => { Meter.WriteRegister(reg, value, waitForResult); - var accucalValue = RegisterConverter.ConvertTo(Meter.ReadRegister(reg)); - if (accucalValue >= (value + addFromCheck) && value <= accucalValue + (addToCheck)) + var actualValue = RegisterConverter.ConvertTo(Meter.ReadRegister(reg)); + if (actualValue >= (value + addFromCheck) && value <= actualValue + (addToCheck)) { return new Tuple(reg, true); } @@ -83,8 +81,8 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions private void doStartProcessLoop() { - var reTrysLeft = 4; - while (reTrysLeft >= 0) + var remainingRetries = 4; + while (remainingRetries >= 0) { try { @@ -110,11 +108,9 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions // var ts = DateTimeOffset.UtcNow - new DateTimeOffset(2000, 1, 1, 0, 0, 0, new TimeSpan(0)); - overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); - foreach (var item in myJsonResponse.Where(m => m.Source == ProgrammingSource.Vako)) { @@ -138,19 +134,16 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } - - //else if (!item.RegisterName.ToLower().Contains("apparrangement")) //{ // overAllResult.Add(_currentGenesis_WriteRegister(item.RegisterName, item.RegisterValue.Reverse().ToArray(), true, true)); //} } - overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmEnableMask", new Byte[] { 0x00, 0x00, 0x80, 0x53 }.Reverse().ToArray())); ; + overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmEnableMask", new Byte[] { 0x00, 0x00, 0x80, 0x53 }.Reverse().ToArray())); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmBroadcastMask", new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray())); overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_AlarmVisualMask", new Byte[] { 0x00, 0x00, 0x1f, 0xdc }.Reverse().ToArray())); - foreach (var item in myJsonResponse.Where(m => m.Source == ProgrammingSource.Csd)) { //todo: find a better sln for SENSUSRADIO_EncryptionKey @@ -166,28 +159,20 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_ResetAccumulators", - (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray())); - - - - - - + (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray())); overAllResult.Add(wirteRegisterInBetweenCheck("SYSTEM_CalendarSeconds", Convert.ToInt32(ts.TotalSeconds))); - overAllResult.Add(wirteRegisterInBetweenCheck("IRDA_MfgDate", Convert.ToInt32(ts.TotalSeconds))); - overAllResult.Add(_currentGenesis_WriteRegister("LOGGER_TriggerLogFlush", - (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray())); + (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray())); overAllResult.Add(_currentGenesis_WriteRegister("NFC_EraseRMA", - (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray())); + (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray())); if (hasRadio) { overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_ResetCounter", - (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray())); + (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray())); overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true)); @@ -208,35 +193,30 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions } else { - if (cTask.Result.Item1.ToLower().Contains("Metersize".ToLower()) || cTask.Result.Item1.ToLower().Contains("NFC_EraseRMA".ToLower()) || cTask.Result.Item1.ToLower().Contains("CUSTOMER_ExcessFlowVolumeThreshold".ToLower()) || cTask.Result.Item1.ToLower().Contains("CUSTOMER_LeakFlowThreshold".ToLower()) || cTask.Result.Item1.ToLower() == "SENSUSRADIO_MetroRadioLifeTimeCounter".ToLower()) + if (cTask.Result.Item1.ToLower().Contains("Metersize".ToLower()) || cTask.Result.Item1.ToLower().Contains("NFC_EraseRMA".ToLower()) || cTask.Result.Item1.ToLower().Contains("CUSTOMER_ExcessFlowVolumeThreshold".ToLower()) || cTask.Result.Item1.ToLower().Contains("CUSTOMER_LeakFlowThreshold".ToLower()) || cTask.Result.Item1.ToLower() == "SENSUSRADIO_MetroRadioLifeTimeCounter".ToLower()) { - NewStatus($"Warnung!Schreiben des Parameter {cTask.Result.Item1} war nicht erfolgreich"); + NewStatus($"Warnung! Fehler beim Schreiben des Parameters {cTask.Result.Item1}"); } else { - NewStatus($"Warnung!Schreiben des Parameter {cTask.Result.Item1} war nicht erfolgreich"); + NewStatus($"Warnung! Fehler beim Schreiben des Parameters {cTask.Result.Item1}"); ret = false; break; } - } } - catch (Exception ex) + catch (Exception) { if (cTask.Result.Item1 != "GENESISFLOW_MaxDeltaToFRange") { throw; } } - - Progress = 15 + ((Int32)Math.Round((done / (Double)overAllResult.Count) * 85, 0)); - done = done + 1; + done += 1; } - - if (!ret) { @@ -246,35 +226,28 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions currentProcessState = ProductionProcessState.Done; return; } - reTrysLeft = reTrysLeft - 1; + remainingRetries -= 1; } else { currentProcessState = ProductionProcessState.Error; - reTrysLeft = -1; - NewStatus("Warnung!Fehler beim laden des Parametersatzes"); + remainingRetries = -1; + NewStatus("Warnung! Fehler beim Laden des Parametersatzes"); } - - } catch (Exception ex) { currentProcessState = ProductionProcessState.Error; - NewStatus($"Warnung!Fehler bei behandeln {ex.Message}"); - reTrysLeft = reTrysLeft - 1; + NewStatus($"Warnung! Fehler beim Behandeln von {ex.Message}"); + remainingRetries = remainingRetries - 1; } - - } } public override void StartProcess() { doStartProcessLoop(); - - - } } } From f04cdf45c51c1d1bd083f1eef0b50acf1e1f8407 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Mon, 23 Jan 2023 14:45:07 +0100 Subject: [PATCH 12/12] ProductionUiCordonel: - ReSharper --- Common/ProductionUiCordonel/FinalTest.xaml.cs | 4 ++-- ...ctionProcessFinalParametrizationVakoCsd.cs} | 18 +++++++++++++----- .../Actions/ProductionProcessPasswordFile.cs | 10 +++++----- .../ProductionUiCordonel.csproj | 2 +- 4 files changed, 21 insertions(+), 13 deletions(-) rename Common/ProductionUiCordonel/ProductionProcesses/Actions/{ProductionProcessFinalParameterizationVakoCsd.cs => ProductionProcessFinalParametrizationVakoCsd.cs} (95%) diff --git a/Common/ProductionUiCordonel/FinalTest.xaml.cs b/Common/ProductionUiCordonel/FinalTest.xaml.cs index 3869b471..cecea0b6 100644 --- a/Common/ProductionUiCordonel/FinalTest.xaml.cs +++ b/Common/ProductionUiCordonel/FinalTest.xaml.cs @@ -428,7 +428,7 @@ namespace ProductionUiCordonel //pc.Processes.Add(new ProductionProcessFinalParametrizationFix()); //[x] [x] [] - pc.Processes.Add(new ProductionProcessFinalParameterizationVakoCsd(connectProcess, RadioAddress != 0)); //[x] [x] [] + pc.Processes.Add(new ProductionProcessFinalParametrizationVakoCsd(connectProcess, RadioAddress != 0)); //[x] [x] [] //if (RadioAddress != 0) //{ @@ -445,7 +445,7 @@ namespace ProductionUiCordonel //pc.Processes.Add(new ProductionProcessSpecialConfig()); //[x] [x] [] pc.Processes.Add(new ProductionProcessShippingMode(true, RadioAddress != 0)); //[] [] [] - pc.Processes.Add(new ProductionProcessFinalParameterizationVakoCsd(connectProcess, RadioAddress != 0)); //[x] [x] [] + pc.Processes.Add(new ProductionProcessFinalParametrizationVakoCsd(connectProcess, RadioAddress != 0)); //[x] [x] [] pc.Processes.Add(new ProductionProcessShippingMode(false, RadioAddress != 0)); //[] [] [] diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationVakoCsd.cs similarity index 95% rename from Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs rename to Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationVakoCsd.cs index 6602b40e..90dec186 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParameterizationVakoCsd.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessFinalParametrizationVakoCsd.cs @@ -11,13 +11,13 @@ using Xylem.Common.Logic.ProductionOrderCore; namespace ProductionUiCordonel.ProductionProcesses.Actions { - public class ProductionProcessFinalParameterizationVakoCsd : BaseProductionProcess + public class ProductionProcessFinalParametrizationVakoCsd : BaseProductionProcess { private UcPlain UserControl; private ProductionProcessConnect connectProcess; private Boolean hasRadio; - public ProductionProcessFinalParameterizationVakoCsd(ProductionProcessConnect connectProcess, Boolean registerHasRadio = true) + public ProductionProcessFinalParametrizationVakoCsd(ProductionProcessConnect connectProcess, Boolean registerHasRadio = true) { this.connectProcess = connectProcess; name = "Kunden Parametrierung"; @@ -27,9 +27,17 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions public override void InitUserControl() { - UserControl = new UcPlain(); - UserControl.lblHl.Content = name; - UserControl.lblText.Content = "Dieser Vorgang Kann bis zu 1 Minute dauern!"; + UserControl = new UcPlain + { + lblHl = + { + Content = name + }, + lblText = + { + Content = "Dieser Vorgang kann bis zu 1 Minute dauern!" + } + }; } public override UserControl GetControl() diff --git a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs index 5713cbda..0b8b6bcd 100644 --- a/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs +++ b/Common/ProductionUiCordonel/ProductionProcesses/Actions/ProductionProcessPasswordFile.cs @@ -51,7 +51,7 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions { Boolean ret = RequestPassword(); updateImage(UserControl.RequestPassword, ret); - Progress = Progress + 16; + Progress += 16; if (Encoding.UTF8.GetString(pwContainer.listOfPasswords.Last()) == pwContainer.Skeleton)//pwContainer.Skeleton ) @@ -70,14 +70,14 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions updateImage(UserControl.CreateFile, ret); - Progress = Progress + 16; + Progress += 16; if (ret) { ret = WritePasswordFileToMeter(); } updateImage(UserControl.WriteToMeter, ret); - Progress = Progress + 16; + Progress += 16; //Check if new password is in the meter ... even the file write wasn't successful if (!ret) { @@ -90,14 +90,14 @@ namespace ProductionUiCordonel.ProductionProcesses.Actions ret = UpdatePasswordinDb(); } updateImage(UserControl.UpdatePassword, ret); - Progress = Progress + 16; + Progress += 16; if (ret) { ret = Meter.Logout(); } updateImage(UserControl.Logout, ret); - Progress = Progress + 16; + Progress += 16; if (ret) diff --git a/Common/ProductionUiCordonel/ProductionUiCordonel.csproj b/Common/ProductionUiCordonel/ProductionUiCordonel.csproj index ef5c4fcd..e466f08d 100644 --- a/Common/ProductionUiCordonel/ProductionUiCordonel.csproj +++ b/Common/ProductionUiCordonel/ProductionUiCordonel.csproj @@ -164,7 +164,7 @@ - +