using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.Shapes; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.LogicalTree; using Avalonia.Markup.Xaml; using Avalonia.Media; using Avalonia.Threading; using AvaloniaApplication1.DataBase; using DaireApplication.DataBase; using DaireApplication.ViewModels; using DaireApplication.Views; using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Tracing; using System.Linq; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using static System.Runtime.InteropServices.JavaScript.JSType; namespace DaireApplication; public partial class Diagnostics : UserControl { private MainWindow? _mainWindow; private ErrorSettingsTable _error=new(); public ConfigrationTable _configration; private Process? _keyboardProcess; public string GrayColor="#666666"; public string RedColor= "#FF0000"; public string GreenColor= "#71C837"; public string PinkColor= "#AF196F"; public string OrangeColor= "#FF6600"; public List flagRectangles { get; set; } public List InputesElements { get; set; } public List MotoreState { get; set; } public List hvoOutPuts { get; set; } public List lvoOutPuts { get; set; } TextBlock targetText = new TextBlock(); Button targetButton = new Button(); float oldValue = 0; bool isNegative = false; bool _isAdvSettings; bool _isFromManualControl; public MachineTable _machine { get; set; } public Diagnostics() { InitializeComponent(); } public Diagnostics(MainWindow mainWindow,bool isAdvSettings=false, bool isFromManualControl=false) { _mainWindow = mainWindow; _machine = new MachineTable(); _configration = new(); _isAdvSettings = isAdvSettings; _isFromManualControl = isFromManualControl; InitializeComponent(); setDefaultSettings(); getUiElementes(); fcThreshold.AddHandler(TextInputEvent, OnTextInput, RoutingStrategies.Tunnel); heatConRange.AddHandler(TextInputEvent, OnTextInput, RoutingStrategies.Tunnel); fcThresholdBorder.AddHandler(InputElement.PointerPressedEvent, OnTextBoxFocused, RoutingStrategies.Tunnel, handledEventsToo: true); heatConRangeBorder.AddHandler(InputElement.PointerPressedEvent, OnTextBoxFocused, RoutingStrategies.Tunnel, handledEventsToo: true); AttachHandlers(_mainWindow.logoBtn, AdvanceSettingsView); } public void AttachHandlers(Button button, System.EventHandler func) { if (button != null) { button.Holding += func; button.PointerPressed += (sender, e) => { // Simulate a long press on any pointer (mouse or touch) var point = e.GetPosition(button); func(sender, new HoldingRoutedEventArgs(HoldingState.Started, point, e.Pointer.Type)); }; button.PointerReleased += (sender, e) => { // End simulated long press var point = e.GetPosition(button); func(sender, new HoldingRoutedEventArgs(HoldingState.Completed, point, e.Pointer.Type)); }; } } public void AdvanceSettingsView(object? sender, RoutedEventArgs e) { if (_mainWindow.ContentArea.Content == this) { _mainWindow.ContentArea.Content = new AdvanceSettings(_mainWindow,true,false); } } public void ResendConfig(object? sender, RoutedEventArgs e) { if (!_mainWindow.sendConfig) { _mainWindow.reSendHolding = true; } } public static void CloseApplication(object? sender, RoutedEventArgs e) { var lifetime = Application.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime; lifetime?.Shutdown(); // This should correctly shut down the application } private async void motorClick(object? sender, RoutedEventArgs e) { if (sender is Button button) { var grid= button.Content as Grid; var stackPanel = grid.Children[0] as StackPanel; var text = stackPanel.Children[1] as TextBlock; if (text.Text=="ON") { _mainWindow.holdingRegister.motor = (ushort)(_mainWindow.holdingRegister.motor & ~(1 << int.Parse(grid.Tag.ToString()))); } else if (text.Text == "OFF") { _mainWindow.holdingRegister.motor = (ushort)(_mainWindow.holdingRegister.motor | (1 << int.Parse(grid.Tag.ToString()))); } await _mainWindow.WriteToSerialAsync("motorClick"); } } private async void hvoClick(object? sender, RoutedEventArgs e) { if (sender is Button button) { var grid= button.Content as Grid; var text = grid.Children[1] as TextBlock; if (text.Text=="ON") { _mainWindow.holdingRegister.hvOut = (ushort)(_mainWindow.holdingRegister.hvOut & ~(1 << int.Parse(grid.Tag.ToString()))); } else if (text.Text == "OFF") { _mainWindow.holdingRegister.hvOut = (ushort)(_mainWindow.holdingRegister.hvOut | (1 << int.Parse(grid.Tag.ToString()))); } await _mainWindow.WriteToSerialAsync("hvoClick"); } } private async void lvoClick(object? sender, RoutedEventArgs e) { if (sender is Button button) { var grid= button.Content as Grid; var stack= button.Content as StackPanel; if (grid!=null) { var text = grid.Children[1] as TextBlock; if (text.Text == "ON") { _mainWindow.holdingRegister.lvOut = (ushort)(_mainWindow.holdingRegister.lvOut & ~(1 << int.Parse(grid.Tag.ToString()))); } else if (text.Text == "OFF") { _mainWindow.holdingRegister.lvOut = (ushort)(_mainWindow.holdingRegister.lvOut | (1 << int.Parse(grid.Tag.ToString()))); } } else if(stack != null) { var text = stack.Children[1] as TextBlock; if (text.Text == "ON") { _mainWindow.holdingRegister.lvOut = (ushort)(_mainWindow.holdingRegister.lvOut & ~(1 << int.Parse(stack.Tag.ToString()))); } else if (text.Text == "OFF") { _mainWindow.holdingRegister.lvOut = (ushort)(_mainWindow.holdingRegister.lvOut | (1 << int.Parse(stack.Tag.ToString()))); } } await _mainWindow.WriteToSerialAsync("lvoClick"); } } private async void resetErrorClick(object? sender, RoutedEventArgs e) { if (sender is Button button) { _mainWindow.holdingRegister.resetError = (ushort)(_mainWindow.holdingRegister.resetError | (1 << 0)); await _mainWindow.WriteToSerialAsync("resetErrorClick"); } } private async void ChangeTempMode(object sender, RoutedEventArgs e) { float number =0; if (sender is Border border) { if (border.Tag.ToString()=="t1") { number = float.Parse(t1Text.Text); } else if(border.Tag.ToString() == "t2") { number = float.Parse(t2Text.Text); } else if (border.Tag.ToString() == "t3") { number = float.Parse(t3Text.Text); } else if (border.Tag.ToString() == "t4") { number = float.Parse(t4Text.Text); } var parent = border.Parent as StackPanel; var brother = parent.Children[1] as Border; List allTexts= new (); if (brother.Tag?.ToString() == "t1") { allTexts.Add(t1Container.Children[0] as TextBlock); allTexts.Add(t1Container.Children[1] as TextBlock); allTexts.Add(t1Container.Children[2] as TextBlock); } else if (brother.Tag?.ToString() == "t2") { allTexts.Add(t2Container.Children[0] as TextBlock); allTexts.Add(t2Container.Children[1] as TextBlock); allTexts.Add(t2Container.Children[2] as TextBlock); } else if (brother.Tag?.ToString() == "t3") { allTexts.Add(t3Container.Children[0] as TextBlock); allTexts.Add(t3Container.Children[1] as TextBlock); allTexts.Add(t3Container.Children[2] as TextBlock); } else if (brother.Tag?.ToString() == "t4") { allTexts.Add(t4Container.Children[0] as TextBlock); allTexts.Add(t4Container.Children[1] as TextBlock); allTexts.Add(t4Container.Children[2] as TextBlock); } var button=border.Child as Button; if (button.Content.ToString()=="M") { allTexts[0].Foreground = Brush.Parse("#231f20"); // black allTexts[1].Foreground = Brush.Parse("#af196f"); // pink allTexts[2].Foreground = Brush.Parse("#231f20"); // black button.Foreground = Brush.Parse("#af196f"); button.Content = "A"; if (button.Tag.ToString() == "t1") { _mainWindow.holdingRegister.setTemp1 = (int)(number * 10); } else if (button.Tag.ToString() == "t2") { _mainWindow.holdingRegister.setTemp2 = (int)(number * 10); } else if (button.Tag.ToString() == "t3") { _mainWindow.holdingRegister.setTemp3 = (int)(number * 10); } else if (button.Tag.ToString() == "t4") { _mainWindow.holdingRegister.setTemp4 = (int)(number * 10); } await _mainWindow.WriteToSerialAsync("DiagnosticsTemp"); } else { foreach (var item in allTexts) { item.Foreground = Brush.Parse("#808080"); //gray } button.Foreground = Brush.Parse("#4d4d4d"); button.Content = "M"; if (button.Tag.ToString()=="t1") { _mainWindow.holdingRegister.setTemp1 = -10000; } else if (button.Tag.ToString() == "t2") { _mainWindow.holdingRegister.setTemp2 = -10000; } else if (button.Tag.ToString() == "t3") { _mainWindow.holdingRegister.setTemp3 = -10000; } else if (button.Tag.ToString() == "t4") { _mainWindow.holdingRegister.setTemp4 = -10000; } await _mainWindow.WriteToSerialAsync("DiagnosticsTemp"); } } else if(sender is Button btn) { if (btn.Tag.ToString() == "t1") { number = float.Parse(t1Text.Text); } else if (btn.Tag.ToString() == "t2") { number = float.Parse(t2Text.Text); } else if (btn.Tag.ToString() == "t3") { number = float.Parse(t3Text.Text); } else if (btn.Tag.ToString() == "t4") { number = float.Parse(t4Text.Text); } var border1 = btn.Parent as Border; var parent = border1.Parent as StackPanel; var brother = parent.Children[1] as Border; List allTexts = new(); if (brother.Tag?.ToString() == "t1") { allTexts.Add(t1Container.Children[0] as TextBlock); allTexts.Add(t1Container.Children[1] as TextBlock); allTexts.Add(t1Container.Children[2] as TextBlock); } else if (brother.Tag?.ToString() == "t2") { allTexts.Add(t2Container.Children[0] as TextBlock); allTexts.Add(t2Container.Children[1] as TextBlock); allTexts.Add(t2Container.Children[2] as TextBlock); } else if (brother.Tag?.ToString() == "t3") { allTexts.Add(t3Container.Children[0] as TextBlock); allTexts.Add(t3Container.Children[1] as TextBlock); allTexts.Add(t3Container.Children[2] as TextBlock); } else if (brother.Tag?.ToString() == "t4") { allTexts.Add(t4Container.Children[0] as TextBlock); allTexts.Add(t4Container.Children[1] as TextBlock); allTexts.Add(t4Container.Children[2] as TextBlock); } var button = border1.Child as Button; if (button.Content.ToString() == "M") { allTexts[0].Foreground = Brush.Parse("#231f20"); // black allTexts[1].Foreground = Brush.Parse("#af196f"); // pink allTexts[2].Foreground = Brush.Parse("#231f20"); // black button.Foreground = Brush.Parse("#af196f"); button.Content = "A"; if (button.Tag.ToString() == "t1") { _mainWindow.holdingRegister.setTemp1 = (int)(number * 10); } else if (button.Tag.ToString() == "t2") { _mainWindow.holdingRegister.setTemp2 = (int)(number * 10); } else if (button.Tag.ToString() == "t3") { _mainWindow.holdingRegister.setTemp3 = (int)(number * 10); } else if (button.Tag.ToString() == "t4") { _mainWindow.holdingRegister.setTemp4 = (int)(number * 10); } await _mainWindow.WriteToSerialAsync("DiagnosticsTemp"); } else { foreach (var item in allTexts) { item.Foreground = Brush.Parse("#808080"); //gray } button.Foreground = Brush.Parse("#4d4d4d"); button.Content = "M"; if (button.Tag.ToString() == "t1") { _mainWindow.holdingRegister.setTemp1 = -10000; } else if (button.Tag.ToString() == "t2") { _mainWindow.holdingRegister.setTemp2 = -10000; } else if (button.Tag.ToString() == "t3") { _mainWindow.holdingRegister.setTemp3 = -10000; } else if (button.Tag.ToString() == "t4") { _mainWindow.holdingRegister.setTemp4 = -10000; } await _mainWindow.WriteToSerialAsync("DiagnosticsTemp"); } } } private void OnPopupOverlayPointerPressed(object sender, PointerPressedEventArgs e) { if (isNegative) { targetText.Text = "-" + oldValue.ToString("0.0"); } else { targetText.Text = "+" + oldValue.ToString("0.0"); } keyBoardPopup.IsVisible = false; } private void InnerPopupPointerPressed(object? sender, PointerPressedEventArgs e) { e.Handled = true; } private void OnKeyClick(object? sender, RoutedEventArgs e) { if (sender is Button button) { if ((button.Content=="+"|| button.Content == "-")&& targetText.Text.Length>0) { } else if((targetText.Text.Length==0 && button.Content == ".")||(targetText.Text.Contains(".")&& button.Content == ".")) { } else { targetText.Text += button.Content; } } } private void OnBackClick(object? sender, RoutedEventArgs e) { if (!string.IsNullOrEmpty(targetText.Text)) { // Remove the last character from the text box targetText.Text = targetText.Text.Remove(targetText.Text.Length - 1, 1); //number = number.Remove(number.Length - 1); } } private async void EnterClick(object? sender, RoutedEventArgs e) { if (sender is Button button) { bool canEdit = targetButton.Content == "A"; if (!string.IsNullOrEmpty(targetText.Text)) { float number = float.Parse(targetText.Text); if (char.IsDigit(targetText.Text[0])) { targetText.Text = "+" + number.ToString("0.0"); } else { targetText.Text = number.ToString("0.0"); } var machine = _machine.ReadMachine(); if (button.Tag.ToString() == "t1") { if (canEdit) { _mainWindow.holdingRegister.setTemp1 = (int)(number * 10); } machine.setTemp1 = number; } else if (button.Tag.ToString() == "t2") { if (canEdit) { _mainWindow.holdingRegister.setTemp2 = (int)(number * 10); } machine.setTemp2 = number; } else if (button.Tag.ToString() == "t3") { if (canEdit) { _mainWindow.holdingRegister.setTemp3 = (int)(number * 10); } machine.setTemp3 = number; } else if (button.Tag.ToString() == "t4") { if (canEdit) { _mainWindow.holdingRegister.setTemp4 = (int)(number * 10); } machine.setTemp4 = number; } _machine.UpdateMachine(machine); getUiElementes(); if (canEdit) { await _mainWindow.WriteToSerialAsync("DiagnosticsEnter"); } keyBoardPopup.IsVisible = false; } } } private void ShowNumberKeyBoard(object? sender, PointerPressedEventArgs e) { if (sender is Border border) { var parent = border.Parent as StackPanel; var brother = parent.Children[0] as Border; targetButton = brother.Child as Button; if (border.Tag?.ToString() == "t1") { targetText = t1Text; } else if (border.Tag?.ToString() == "t2") { targetText = t2Text; } else if (border.Tag?.ToString() == "t3") { targetText = t3Text; } else if (border.Tag?.ToString() == "t4") { targetText = t4Text; } enterBtn.Tag = border.Tag; isNegative = targetText.Text.StartsWith("-"); oldValue = float.Parse(targetText.Text.Substring(1)); targetText.Text = ""; keyBoardPopup.IsVisible = true; } } private async void OnIgnorePidPopupOverlayPointerPressed(object? sender, RoutedEventArgs e) { pidPopupOverlay.IsVisible = false; } private async void showInnerPid(object? sender, RoutedEventArgs e) { if (sender is Button button) { var configratipn = _configration.ReadConfigrationById(button.Tag.ToString()); pidPopupOverlay.IsVisible = false; header.Text = button.Content.ToString(); header.Tag = button.Tag; // Set slider values instead of text box values kpSlider.Value = configratipn.kp; kiSlider.Value = configratipn.ki; kdSlider.Value = configratipn.kd; klSlider.Value = configratipn.kl; // Update the display values kpSliderValue.Text = configratipn.kp.ToString(); kiSliderValue.Text = configratipn.ki.ToString(); kdSliderValue.Text = configratipn.kd.ToString(); klSliderValue.Text = configratipn.kl.ToString(); fcThreshold.Text = configratipn.FC_Threshold.ToString("0.0"); heatConRange.Text = configratipn.HeatConRange.ToString("0.0"); innerPidPopupOverlay.IsVisible = true; } } private async void OnIgnoreInnerPidPopupOverlayPointerPressed(object? sender, RoutedEventArgs e) { innerPidPopupOverlay.IsVisible = false; pidPopupOverlay.IsVisible = true; } private void OnKeyUp(object? sender, KeyEventArgs e) { if (sender is TextBox textBox) { if (textBox != null && float.TryParse(textBox.Text, out float value)) { if (textBox.Name == "heatConRange") { if (value > 25.0) { textBox.Text = "25.0"; } } else { if (value > 100) { textBox.Text = "100"; } } // Check if the value exceeds 100 and reset to 100 if necessary. } } } private async void YesBtnClick(object? sender, RoutedEventArgs e) { if (sender is Button button) { var configration = _configration.ReadConfigrationById(header.Tag.ToString()); if (configration!=null) { // Read values from sliders instead of text boxes configration.kp = (int)kpSlider.Value; configration.ki = (int)kiSlider.Value; configration.kd = (int)kdSlider.Value; configration.kl = (int)klSlider.Value; if (string.IsNullOrEmpty(fcThreshold.Text)) { configration.FC_Threshold = 0; } else { configration.FC_Threshold = float.Parse(fcThreshold.Text); } if (string.IsNullOrEmpty(heatConRange.Text)) { configration.HeatConRange = 1.0F; } else { if (float.TryParse(heatConRange.Text, out float value)) { if (value<1.0) { configration.HeatConRange = 1.0F; } else { configration.HeatConRange = float.Parse(heatConRange.Text); } } else { configration.HeatConRange = 1.0F; } } _configration.UpdateConfigration(configration); _mainWindow.reSendHolding = true; CloseKeyboard(); innerPidPopupOverlay.IsVisible = false; pidPopupOverlay.IsVisible = true; } } } private void CloseKeyboard() { try { if (_keyboardProcess != null) { // Kill the keyboard process _keyboardProcess.Kill(); _keyboardProcess.Dispose(); _keyboardProcess = null; // Force kill any remaining keyboard processes var processKill = new Process { StartInfo = new ProcessStartInfo { FileName = "killall", Arguments = "-9 onboard matchbox-keyboard florence", // Common Linux on-screen keyboards UseShellExecute = false, CreateNoWindow = true } }; processKill.Start(); processKill.WaitForExit(1000); processKill.Dispose(); } } catch (Exception ex) { Console.WriteLine($"Error closing keyboard: {ex.Message}"); } } private (string? fileName, string args) GetKeyboardCommand() { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return ("osk.exe", ""); if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) return ("onboard", ""); // or "florence", "matchbox-keyboard" return (null, ""); } private async void OnTextBoxFocused(object? sender, PointerPressedEventArgs e) { if (_keyboardProcess is { HasExited: false }) return; var (fileName, args) = GetKeyboardCommand(); if (fileName is null) return; _keyboardProcess = new Process { StartInfo = new ProcessStartInfo { FileName = fileName, Arguments = args, UseShellExecute = true, WorkingDirectory = "/usr/bin" }, EnableRaisingEvents = true }; try { _keyboardProcess.Start(); Dispatcher.UIThread.Post(() => { if (sender is Border border) { var textbox = border.Child as TextBox; textbox.SelectionStart = 0; textbox.SelectionEnd = textbox.Text?.Length ?? 0; } }); } catch { // fail silently if keyboard not found } } private void OnTextInput(object? sender, TextInputEventArgs e) { if (sender is TextBox textBox) { string newText = textBox.Text + e.Text; if (!Regex.IsMatch(newText, @"^\d*\.?\d*$")) { e.Handled = true; } } } private void OnTextInputOnlyInteager(object? sender, TextInputEventArgs e) { if (sender is TextBox textBox) { string newText = textBox.Text + e.Text; if (!Regex.IsMatch(newText, @"^\d*$")) { e.Handled = true; } } } private async void showPidPopUp(object? sender, RoutedEventArgs e) { pidPopupOverlay.IsVisible = true; } private void getUiElementes() { var error = _error.ReadErrorSettings()[0]; if (error.phaseNumber == 1) { phaseContainer.Background = Avalonia.Media.Brushes.Gray; phaseContainer.IsEnabled = false; } else { phaseContainer.Background = Brush.Parse("#E6E6E6"); phaseContainer.IsEnabled = true; } flagRectangles = this.GetLogicalDescendants() .OfType() .Where(cb => cb.Classes.Contains("flag")) .ToList(); InputesElements = this.GetLogicalDescendants() .OfType() .Where(c => c.Classes.Contains("in") && (c is Grid || c is Ellipse)) .ToList(); MotoreState = this.GetLogicalDescendants() .OfType() .Where(c => c.Classes.Contains("motorState") && (c is Grid || c is Ellipse)) .ToList(); hvoOutPuts = this.GetLogicalDescendants() .OfType() .Where(c => c.Classes.Contains("hvo") && (c is Grid || c is Ellipse)) .ToList(); lvoOutPuts = this.GetLogicalDescendants() .OfType() .Where(c => c.Classes.Contains("lvo") && (c is Grid||c is StackPanel || c is Ellipse)) .ToList(); var machine=_machine.ReadMachine(); t1Text.Text = char.IsDigit(machine.setTemp1.ToString()[0])?"+"+ machine.setTemp1.ToString(): machine.setTemp1.ToString(); t2Text.Text = char.IsDigit(machine.setTemp2.ToString()[0]) ? "+" + machine.setTemp2.ToString() : machine.setTemp2.ToString(); t3Text.Text = char.IsDigit(machine.setTemp3.ToString()[0]) ? "+" + machine.setTemp3.ToString() : machine.setTemp3.ToString(); t4Text.Text = char.IsDigit(machine.setTemp4.ToString()[0]) ? "+" + machine.setTemp4.ToString() : machine.setTemp4.ToString(); } private void setDefaultSettings() { var stackPanel = _mainWindow.HomeTrack.Parent as StackPanel; _mainWindow.minimizeBtn.IsVisible = false; if (_isFromManualControl) { // Special UI setup when called from ManualControl _mainWindow.HomeTrack.IsVisible = true; _mainWindow.HomePolygon.Stroke = Avalonia.Media.Brushes.Black; _mainWindow.RecipeSelTrack.IsVisible = false; _mainWindow.RunInterfaceTrack.IsVisible = false; _mainWindow.RecipePanelTrack.IsVisible = true; _mainWindow.RecipePanelPolygon.Stroke = Avalonia.Media.Brushes.Black; _mainWindow.RecipeEditTrack.IsVisible = false; _mainWindow.SettingTrack.IsVisible = false; _mainWindow.AdvanceSettingsTrack.IsVisible = false; _mainWindow.ManualControlTrack.IsVisible = true; _mainWindow.ManualControlPolygon.Stroke = Avalonia.Media.Brushes.Black; } else { // Original logic for other callers //Set Track Up _mainWindow.HomeTrack.IsVisible = true; //_mainWindow.HomePolygon.Stroke = Avalonia.Media.Brushes.Black; _mainWindow.RecipeSelTrack.IsVisible = false; _mainWindow.RunInterfaceTrack.IsVisible = false; _mainWindow.RecipePanelTrack.IsVisible = false; _mainWindow.RecipeEditTrack.IsVisible = false; if (_isAdvSettings) { _mainWindow.SettingTrack.IsVisible = false; _mainWindow.AdvanceSettingsTrack.IsVisible = true; _mainWindow.AdvanceSettingsPolygon.Stroke = Avalonia.Media.Brushes.Black; } else { _mainWindow.SettingTrack.IsVisible = true; _mainWindow.SettingPolygon.Stroke = Avalonia.Media.Brushes.Black; _mainWindow.AdvanceSettingsTrack.IsVisible = false; } } _mainWindow.DiagnosticsTrack.IsVisible = true; _mainWindow.DiagnosticsPolygon.Stroke = Brush.Parse("#A4275D"); // Remove the button from its current position stackPanel.Children.Remove(_mainWindow.DiagnosticsTrack); // Add it back at the end of the StackPanel stackPanel.Children.Add(_mainWindow.DiagnosticsTrack); _mainWindow.TitleBtn.IsVisible = false; _mainWindow.TitleBtn.IsVisible = true; _mainWindow.Title.Text = "DMC7A"; //Set Footer _mainWindow.footerMsg.IsVisible = true; _mainWindow.footerMsg.Text= "Read Values, And Control Outputs Manually"; _mainWindow.footerMsg.Foreground= Brush.Parse("#A4275D"); _mainWindow.footer.Background = Avalonia.Media.Brushes.WhiteSmoke; _mainWindow.footerDate.Text = DateTime.Now.ToString("dd/MM/yyyy"); _mainWindow.footerTime.Text = DateTime.Now.ToString("hh:mm tt"); _mainWindow.footerDateContainer.IsVisible = true; _mainWindow.footerStartBtn.IsVisible = false; _mainWindow.adminBtns.IsVisible = false; } // KP Slider and Button Event Handlers private void KpSliderValueChanged(object? sender, RoutedEventArgs e) { if (kpSliderValue != null && sender is Slider slider) { kpSliderValue.Text = ((int)slider.Value).ToString(); } } private void KpMinusClick(object? sender, RoutedEventArgs e) { if (kpSlider.Value > kpSlider.Minimum) { kpSlider.Value--; } } private void KpPlusClick(object? sender, RoutedEventArgs e) { if (kpSlider.Value < kpSlider.Maximum) { kpSlider.Value++; } } // KI Slider and Button Event Handlers private void KiSliderValueChanged(object? sender, RoutedEventArgs e) { if (kiSliderValue != null && sender is Slider slider) { kiSliderValue.Text = ((int)slider.Value).ToString(); } } private void KiMinusClick(object? sender, RoutedEventArgs e) { if (kiSlider.Value > kiSlider.Minimum) { kiSlider.Value--; } } private void KiPlusClick(object? sender, RoutedEventArgs e) { if (kiSlider.Value < kiSlider.Maximum) { kiSlider.Value++; } } // KD Slider and Button Event Handlers private void KdSliderValueChanged(object? sender, RoutedEventArgs e) { if (kdSliderValue != null && sender is Slider slider) { kdSliderValue.Text = ((int)slider.Value).ToString(); } } private void KdMinusClick(object? sender, RoutedEventArgs e) { if (kdSlider.Value > kdSlider.Minimum) { kdSlider.Value--; } } private void KdPlusClick(object? sender, RoutedEventArgs e) { if (kdSlider.Value < kdSlider.Maximum) { kdSlider.Value++; } } // KL Slider and Button Event Handlers private void KlSliderValueChanged(object? sender, RoutedEventArgs e) { if (klSliderValue != null && sender is Slider slider) { klSliderValue.Text = ((int)slider.Value).ToString(); } } private void KlMinusClick(object? sender, RoutedEventArgs e) { if (klSlider.Value > klSlider.Minimum) { klSlider.Value--; } } private void KlPlusClick(object? sender, RoutedEventArgs e) { if (klSlider.Value < klSlider.Maximum) { klSlider.Value++; } } }