diff --git a/App.xaml b/App.xaml
index 0acc91dc..29dca019 100644
--- a/App.xaml
+++ b/App.xaml
@@ -597,13 +597,6 @@
-
-
-
-
-
-
diff --git a/MainWindow.CommandPanelUx.cs b/MainWindow.CommandPanelUx.cs
index 4589d1a6..0b78eaf2 100644
--- a/MainWindow.CommandPanelUx.cs
+++ b/MainWindow.CommandPanelUx.cs
@@ -7,6 +7,7 @@
using System.Windows.Media;
using System.Windows.Threading;
using ArIED61850Tester.Models;
+using ArIED61850Tester.Services;
namespace ArIED61850Tester;
@@ -31,7 +32,18 @@ public object Convert(object[] values, Type targetType, object parameter, Cultur
var testMode = values.ElementAtOrDefault(1) is true;
var busy = values.ElementAtOrDefault(2) is true;
var supportsOperate = values.ElementAtOrDefault(3) is true;
- return (liveArmed || testMode) && supportsOperate && !busy;
+ var current = values.ElementAtOrDefault(4)?.ToString() ?? string.Empty;
+ var command = parameter?.ToString() ?? string.Empty;
+ return (liveArmed || testMode) && supportsOperate && !busy && (testMode || !AlreadyActive(command, current));
+ }
+
+ private static bool AlreadyActive(string command, string current)
+ {
+ if (string.IsNullOrWhiteSpace(command) || string.IsNullOrWhiteSpace(current) || current.Trim() == "-") return false;
+ if (Iec61850ValueFormatter.TryNormalizeDbpos(command, out var requested) &&
+ Iec61850ValueFormatter.TryNormalizeDbpos(current, out var actual)) return requested == actual;
+ if (bool.TryParse(command, out var requestedBool) && bool.TryParse(current, out var actualBool)) return requestedBool == actualBool;
+ return command.Trim().Equals(current.Trim(), StringComparison.OrdinalIgnoreCase);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
@@ -51,17 +63,10 @@ public object Convert(object value, Type targetType, object parameter, CultureIn
return "Status only";
}
- if (text.Contains("select before operate", StringComparison.OrdinalIgnoreCase) ||
- text.Contains("SBO", StringComparison.OrdinalIgnoreCase))
- {
- return "SBO";
- }
-
- if (text.Contains("direct operate", StringComparison.OrdinalIgnoreCase) ||
- text.Contains("(DO)", StringComparison.OrdinalIgnoreCase))
- {
- return "DO";
- }
+ if ((text.Contains("select before operate", StringComparison.OrdinalIgnoreCase) || text.Contains("SBO", StringComparison.OrdinalIgnoreCase)) && text.Contains("enhanced", StringComparison.OrdinalIgnoreCase)) return "SBO • Enhanced security";
+ if (text.Contains("select before operate", StringComparison.OrdinalIgnoreCase) || text.Contains("SBO", StringComparison.OrdinalIgnoreCase)) return "SBO • Normal security";
+ if ((text.Contains("direct operate", StringComparison.OrdinalIgnoreCase) || text.Contains("(DO)", StringComparison.OrdinalIgnoreCase)) && text.Contains("enhanced", StringComparison.OrdinalIgnoreCase)) return "Direct • Enhanced security";
+ if (text.Contains("direct operate", StringComparison.OrdinalIgnoreCase) || text.Contains("(DO)", StringComparison.OrdinalIgnoreCase)) return "Direct • Normal security";
if (text.Contains("auto-detect", StringComparison.OrdinalIgnoreCase) ||
string.IsNullOrWhiteSpace(text))
@@ -105,7 +110,7 @@ private void InstallCommandPanelUx()
_commandPanelUxTimer = new DispatcherTimer(DispatcherPriority.Background)
{
- Interval = TimeSpan.FromMilliseconds(500)
+ Interval = TimeSpan.FromMilliseconds(1500)
};
_commandPanelUxTimer.Tick += CommandPanelUxTimer_Tick;
_commandPanelUxTimer.Start();
@@ -210,12 +215,14 @@ private void ConfigureCommandPanelButton(Button button)
var enabledBinding = new MultiBinding
{
Converter = CommandButtonEnabledConverter.Instance,
+ ConverterParameter = content,
Mode = BindingMode.OneWay
};
enabledBinding.Bindings.Add(new Binding(nameof(LiveControlArmed)) { Source = this });
enabledBinding.Bindings.Add(new Binding(nameof(CommandTestMode)) { Source = this });
enabledBinding.Bindings.Add(new Binding(nameof(SignalDefinition.ControlIsBusy)));
enabledBinding.Bindings.Add(new Binding(nameof(SignalDefinition.ControlSupportsOperate)));
+ enabledBinding.Bindings.Add(new Binding(nameof(SignalDefinition.ControlCurrentValue)));
BindingOperations.SetBinding(button, UIElement.IsEnabledProperty, enabledBinding);
_configuredCommandButtons.Add(button, new Marker());
diff --git a/MainWindow.xaml b/MainWindow.xaml
index 95dbd49c..dd34dc31 100644
--- a/MainWindow.xaml
+++ b/MainWindow.xaml
@@ -111,20 +111,17 @@
-
+
-
-
-
-
-
-
-
+
+
+
+
@@ -136,13 +133,13 @@
-
+
-
-