From 6048db660224fe3c5157c70b92cf5eccbd963ac1 Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Wed, 18 Jan 2023 16:05:05 +0100 Subject: [PATCH] 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; + })); } }