From d3dea3e9a001a9cf6298b3d4a1ee4402c4d74009 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Fri, 7 Aug 2026 12:48:51 +0200 Subject: [PATCH] Add ability to override clearances --- PamhagenSysCtrl/Helpers/PamhagenGraph.cs | 4 +- PamhagenSysCtrl/Helpers/PamhagenPlant.cs | 75 +++++++++++-------- .../Windows/ManualControlWindow.xaml.cs | 4 +- .../Windows/PlantSchemeWindow.xaml | 4 + .../Windows/PlantSchemeWindow.xaml.cs | 12 ++- 5 files changed, 61 insertions(+), 38 deletions(-) diff --git a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs index 7554fbd..857adb2 100644 --- a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs +++ b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs @@ -386,8 +386,8 @@ namespace PamhagenSysCtrl.Helpers { CreatePipe(xp5, xp6); CreatePipe(xp7, xp8); - var zv1 = new CenterValve("ZV1", pr1cX, prY - 40, () => App.Plant?.Press1HasClerance ?? false); - var zv2 = new CenterValve("ZV2", pr2cX, prY - 40, () => App.Plant?.Press2HasClerance ?? false); + var zv1 = new CenterValve("ZV1", pr1cX, prY - 40, () => App.Plant?.Press1HasClearance ?? false); + var zv2 = new CenterValve("ZV2", pr2cX, prY - 40, () => App.Plant?.Press2HasClearance ?? false); CreatePipe(xp6, zv1, true); CreatePipe(xp8, zv2, true); CreateInlet(zv1, press1, true); diff --git a/PamhagenSysCtrl/Helpers/PamhagenPlant.cs b/PamhagenSysCtrl/Helpers/PamhagenPlant.cs index faf16b3..d010b98 100644 --- a/PamhagenSysCtrl/Helpers/PamhagenPlant.cs +++ b/PamhagenSysCtrl/Helpers/PamhagenPlant.cs @@ -9,6 +9,9 @@ namespace PamhagenSysCtrl.Helpers { protected bool IsRunning = true; protected Thread? BackgroundThread; + public bool OverridePathClearances { get; set; } + public bool OverrideDryRunClearances { get; set; } + public event EventHandler? Update; protected bool ActuatorsChanged = false; @@ -30,8 +33,8 @@ namespace PamhagenSysCtrl.Helpers { public bool IsMW2Selected => Sensors.TroughSelector == 2; public FillState FillLevelMW1 => Sensors.FillingLevelMW1; public FillState FillLevelMW2 => Sensors.FillingLevelMW2; - public bool Press1HasClerance => Sensors.ClearancePress1; - public bool Press2HasClerance => Sensors.ClearancePress2; + public bool Press1HasClearance => Sensors.ClearancePress1; + public bool Press2HasClearance => Sensors.ClearancePress2; public FillState FillLevelT1 => Sensors.FillingLevelTanks[0]; public FillState FillLevelT2 => Sensors.FillingLevelTanks[1]; public FillState FillLevelT3 => Sensors.FillingLevelTanks[2]; @@ -210,19 +213,20 @@ namespace PamhagenSysCtrl.Helpers { (a && ((HasWTClearanceAA && HasT9ClearanceA) || (HasWTClearanceAB && HasT9ClearanceB))) || (b && ((HasWTClearanceBA && HasT9ClearanceA) || (HasWTClearanceBB && HasT9ClearanceB))); - public bool MP1HasClearance => FillLevelMW1 != FillState.Empty && ( - (MP1HasClearancePress1 && Press1HasClerance) || - (MP1HasClearancePress2 && Press2HasClerance) || - (HasClearanceTank1(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT1 != FillState.Full) || - (HasClearanceTank2(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT2 != FillState.Full) || - (HasClearanceTank3(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT3 != FillState.Full) || - (HasClearanceTank4(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT4 != FillState.Full) || - (HasClearanceTank5(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT5 != FillState.Full) || - (HasClearanceTank6(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT6 != FillState.Full) || - (HasClearanceTank7(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT7 != FillState.Full) || - (HasClearanceTank8(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT8 != FillState.Full) || - (HasClearanceTank9(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT9 != FillState.Full) || - false); + public bool MP1HasClearance => (OverrideDryRunClearances || FillLevelMW1 != FillState.Empty) && ( + OverridePathClearances || + (MP1HasClearancePress1 && Press1HasClearance) || + (MP1HasClearancePress2 && Press2HasClearance) || + (HasClearanceTank1(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT1 != FillState.Full) || + (HasClearanceTank2(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT2 != FillState.Full) || + (HasClearanceTank3(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT3 != FillState.Full) || + (HasClearanceTank4(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT4 != FillState.Full) || + (HasClearanceTank5(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT5 != FillState.Full) || + (HasClearanceTank6(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT6 != FillState.Full) || + (HasClearanceTank7(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT7 != FillState.Full) || + (HasClearanceTank8(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT8 != FillState.Full) || + (HasClearanceTank9(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT9 != FillState.Full) || + false); protected bool MP1HasClearancePress1 => (AreValvesOpen(1, 6, 51) && AreValvesClosed(3, 4, 5, 50, 52, 53, 55)) || (AreValvesOpen(4, 8, 52) && AreValvesClosed(1, 2, 7, 50, 51, 53, 56)); @@ -237,9 +241,10 @@ namespace PamhagenSysCtrl.Helpers { set => Actuators.MP1 = (value != MotorState.Halt && value != MotorState.Forward && value != MotorState.Backward) ? throw new ArgumentException("Invalid state for MP1") : value; } - public bool MP2HasClearance => FillLevelMW2 != FillState.Empty && ( - (MP2HasClearancePress1 && Press1HasClerance) || - (MP2HasClearancePress2 && Press2HasClerance) || + public bool MP2HasClearance => (OverrideDryRunClearances || FillLevelMW2 != FillState.Empty) && ( + OverridePathClearances || + (MP2HasClearancePress1 && Press1HasClearance) || + (MP2HasClearancePress2 && Press2HasClearance) || (HasClearanceTank1(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT1 != FillState.Full) || (HasClearanceTank2(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT2 != FillState.Full) || (HasClearanceTank3(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT3 != FillState.Full) || @@ -264,9 +269,10 @@ namespace PamhagenSysCtrl.Helpers { set => Actuators.MP2 = (value != MotorState.Halt && value != MotorState.Forward && value != MotorState.Backward) ? throw new ArgumentException("Invalid state for MP2") : value; } - public bool P12HasClearance => (FillLevelT1 != FillState.Empty || FillLevelT2 != FillState.Empty) && ( - (P12HasClearancePress1 && Press1HasClerance) || - (P12HasClearancePress2 && Press2HasClerance) || + public bool P12HasClearance => (OverrideDryRunClearances || FillLevelT1 != FillState.Empty || FillLevelT2 != FillState.Empty) && ( + OverridePathClearances || + (P12HasClearancePress1 && Press1HasClearance) || + (P12HasClearancePress2 && Press2HasClearance) || (HasClearanceTank1(false, P12HasClearanceTanksB) && FillLevelT1 != FillState.Full) || (HasClearanceTank2(false, P12HasClearanceTanksB) && FillLevelT2 != FillState.Full) || (HasClearanceTank3(false, P12HasClearanceTanksB) && FillLevelT3 != FillState.Full) || @@ -286,9 +292,10 @@ namespace PamhagenSysCtrl.Helpers { set => Actuators.P12 = (value != MotorState.Halt && value != MotorState.Forward) ? throw new ArgumentException("Invalid state for P12") : value; } - public bool P3HasClearance => FillLevelT3 != FillState.Empty && ( - (P3HasClearancePress1 && Press1HasClerance) || - (P3HasClearancePress2 && Press2HasClerance) || + public bool P3HasClearance => (OverrideDryRunClearances || FillLevelT3 != FillState.Empty) && ( + OverridePathClearances || + (P3HasClearancePress1 && Press1HasClearance) || + (P3HasClearancePress2 && Press2HasClearance) || (HasClearanceTank1(false, P3HasClearanceTanksB) && FillLevelT1 != FillState.Full) || (HasClearanceTank2(false, P3HasClearanceTanksB) && FillLevelT2 != FillState.Full) || (HasClearanceTank3(false, P3HasClearanceTanksB) && FillLevelT3 != FillState.Full) || @@ -308,9 +315,10 @@ namespace PamhagenSysCtrl.Helpers { set => Actuators.P3 = (value != MotorState.Halt && value != MotorState.Forward) ? throw new ArgumentException("Invalid state for P3") : value; } - public bool P4HasClearance => FillLevelT4 != FillState.Empty && ( - (P4HasClearancePress1 && Press1HasClerance) || - (P4HasClearancePress2 && Press2HasClerance) || + public bool P4HasClearance => (OverrideDryRunClearances || FillLevelT4 != FillState.Empty) && ( + OverridePathClearances || + (P4HasClearancePress1 && Press1HasClearance) || + (P4HasClearancePress2 && Press2HasClearance) || (HasClearanceTank1(false, P4HasClearanceTanksB) && FillLevelT1 != FillState.Full) || (HasClearanceTank2(false, P4HasClearanceTanksB) && FillLevelT2 != FillState.Full) || (HasClearanceTank3(false, P4HasClearanceTanksB) && FillLevelT3 != FillState.Full) || @@ -330,9 +338,10 @@ namespace PamhagenSysCtrl.Helpers { set => Actuators.P4 = (value != MotorState.Halt && value != MotorState.Forward) ? throw new ArgumentException("Invalid state for P4") : value; } - public bool P5HasClearance => FillLevelT5 != FillState.Empty && ( - (P5HasClearancePress1 && Press1HasClerance) || - (P5HasClearancePress2 && Press2HasClerance) || + public bool P5HasClearance => (OverrideDryRunClearances || FillLevelT5 != FillState.Empty) && ( + OverridePathClearances || + (P5HasClearancePress1 && Press1HasClearance) || + (P5HasClearancePress2 && Press2HasClearance) || (HasClearanceTank1(false, P5HasClearanceTanksB) && FillLevelT1 != FillState.Full) || (HasClearanceTank2(false, P5HasClearanceTanksB) && FillLevelT2 != FillState.Full) || (HasClearanceTank3(false, P5HasClearanceTanksB) && FillLevelT3 != FillState.Full) || @@ -352,9 +361,9 @@ namespace PamhagenSysCtrl.Helpers { set => Actuators.P5 = (value != MotorState.Halt && value != MotorState.Forward) ? throw new ArgumentException("Invalid state for P5") : value; } - public bool P6HasClearance => - (AreValvesOpen(53) && AreValvesClosed(50, 51, 52, 57) && Press1HasClerance) || - (AreValvesOpen(57) && AreValvesClosed(53, 54, 55, 56) && Press2HasClerance); + public bool P6HasClearance => OverridePathClearances || + (AreValvesOpen(53) && AreValvesClosed(50, 51, 52, 57) && Press1HasClearance) || + (AreValvesOpen(57) && AreValvesClosed(53, 54, 55, 56) && Press2HasClearance); public MotorState P6 { get => Actuators.P6; diff --git a/PamhagenSysCtrl/Windows/ManualControlWindow.xaml.cs b/PamhagenSysCtrl/Windows/ManualControlWindow.xaml.cs index 4113363..448de45 100644 --- a/PamhagenSysCtrl/Windows/ManualControlWindow.xaml.cs +++ b/PamhagenSysCtrl/Windows/ManualControlWindow.xaml.cs @@ -134,8 +134,8 @@ namespace PamhagenSysCtrl { Füllstände: Maischewanne 1: {plant.FillLevelMW1} (ausgewählt: {plant.WantMW1Selected}, Status: {plant.IsMWSelected}) Maischewanne 2: {plant.FillLevelMW2} (ausgewählt: {plant.WantMW2Selected}, Status: {plant.IsMW2Selected}) - Presse 1: {plant.Press1HasClerance} - Presse 2: {plant.Press2HasClerance} + Presse 1: {plant.Press1HasClearance} + Presse 2: {plant.Press2HasClearance} Tank 1: {plant.FillLevelT1} Tank 2: {plant.FillLevelT2} Tank 3: {plant.FillLevelT3} diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml index a031226..7d2ee91 100644 --- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml +++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml @@ -19,6 +19,10 @@ + + diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs index ac70ccc..747b8cc 100644 --- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs +++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs @@ -26,6 +26,16 @@ namespace PamhagenSysCtrl.Windows { w.Show(); } + private void Menu_Settings_OverridePathClearances_Click(object sender, RoutedEventArgs evt) { + App.Plant?.OverridePathClearances = Menu_Settings_OverridePathClearances.IsChecked; + OnUpdate(null, null); + } + + private void Menu_Settings_OverrideDryRunClearances_Click(object sender, RoutedEventArgs evt) { + App.Plant?.OverrideDryRunClearances = Menu_Settings_OverrideDryRunClearances.IsChecked; + OnUpdate(null, null); + } + private void Menu_Settings_Directory_Click(object sender, RoutedEventArgs evt) { try { Process.Start("explorer.exe", App.DataPath); @@ -219,7 +229,7 @@ namespace PamhagenSysCtrl.Windows { return _hover; } - public void OnUpdate(object? sender, PlantEventArgs evt) { + public void OnUpdate(object? sender, PlantEventArgs? evt) { if (sender is not PamhagenPlant plant) return; UpdateScheme(Mouse.GetPosition(SchemeCanvas), Mouse.LeftButton == MouseButtonState.Pressed); }