Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ jobs:

- name: Publish portable x64
shell: powershell
run: .\ArIED61850Tester\scripts\publish-windows-portable.ps1 -Version 1.6.6 -EngineProject "$env:GITHUB_WORKSPACE\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj"
run: .\ArIED61850Tester\scripts\publish-windows-portable.ps1 -Version 1.6.7 -EngineProject "$env:GITHUB_WORKSPACE\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj"

- name: Upload portable package
uses: actions/upload-artifact@v4
Expand Down
33 changes: 33 additions & 0 deletions App.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,39 @@
</Setter>
</Style>

<Style x:Key="CommandConfirmButton" TargetType="Button">
<Setter Property="Background" Value="#ECFDF3"/>
<Setter Property="Foreground" Value="#067647"/>
<Setter Property="BorderBrush" Value="#ABEFC6"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="14,6"/>
<Setter Property="MinWidth" Value="108"/>
<Setter Property="MinHeight" Value="31"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Chrome" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="11">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="{TemplateBinding Padding}" TextElement.Foreground="{TemplateBinding Foreground}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True"><Setter TargetName="Chrome" Property="Opacity" Value="0.90"/></Trigger>
<Trigger Property="IsPressed" Value="True"><Setter TargetName="Chrome" Property="Opacity" Value="0.74"/></Trigger>
<Trigger Property="IsEnabled" Value="False"><Setter TargetName="Chrome" Property="Opacity" Value="0.42"/><Setter Property="Cursor" Value="Arrow"/></Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding ControlPendingAction}" Value="Close">
<Setter Property="Background" Value="#FEF3F2"/>
<Setter Property="Foreground" Value="#B42318"/>
<Setter Property="BorderBrush" Value="#FECDCA"/>
</DataTrigger>
</Style.Triggers>
</Style>

<Style x:Key="IedIconButton" TargetType="Button">
<Setter Property="Width" Value="31"/>
<Setter Property="Height" Value="31"/>
Expand Down
6 changes: 3 additions & 3 deletions ArIED61850Tester.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
<Product>ArIED 61850</Product>
<AssemblyTitle>ArIED 61850 — IEC 61850 Engineering Workstation</AssemblyTitle>
<Description>Windows IEC 61850 engineering workstation for SCL-assisted project setup, live MMS model discovery, independent multi-IED monitoring, reporting diagnostics, sequence of events, and guarded Smart Control.</Description>
<Version>1.6.6</Version>
<AssemblyVersion>1.6.6.0</AssemblyVersion>
<FileVersion>1.6.6.0</FileVersion>
<Version>1.6.7</Version>
<AssemblyVersion>1.6.7.0</AssemblyVersion>
<FileVersion>1.6.7.0</FileVersion>
<PackageTags>iec61850;iec-61850;mms;scl;ied-explorer;multi-ied-monitoring;relay-testing;substation-automation;digital-substation;report-control-block;sequence-of-events;smart-control;wpf;dotnet</PackageTags>
<PackageLicenseExpression>GPL-3.0-or-later</PackageLicenseExpression>
<ArIec61850Project Condition="'$(ArIec61850Project)' == '' and '$(ARIEC61850_PROJECT)' != ''">$(ARIEC61850_PROJECT)</ArIec61850Project>
Expand Down
20 changes: 12 additions & 8 deletions MainWindow.CommandPanelUx.cs
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ private async Task PreloadControlModelsAsync()
{
// One MMS association is serialized. Do not queue background ctlModel
// inspection while an operator command owns the session.
if (device.CommandSignals.Any(signal => signal.ControlIsBusy))
if (device.CommandSignals.Any(signal => signal.ControlCommandBusy))
continue;

var candidates = device.Signals
Expand All @@ -272,18 +272,21 @@ private async Task PreloadControlModelsAsync()
await Task.WhenAll(candidates.Select(async signal =>
{
await throttle.WaitAsync(_applicationCancellation.Token);
signal.ControlIsBusy = true;
signal.ControlInspectionBusy = true;
try
{
var capabilities = await _runtime.InspectControlAsync(
device.DeviceId,
signal,
_applicationCancellation.Token);

signal.ControlCurrentValue = capabilities.CurrentValue;
signal.ControlLastResult = capabilities.SupportsOperate
? string.Empty
: "Not available";
if (!signal.ControlCommandBusy)
{
signal.ControlCurrentValue = capabilities.CurrentValue;
signal.ControlLastResult = capabilities.SupportsOperate
? string.Empty
: "Not available";
}
}
catch (OperationCanceledException)
{
Expand All @@ -293,11 +296,12 @@ await Task.WhenAll(candidates.Select(async signal =>
{
// SignalDefinition parses ctlModel evidence from this message. In
// particular, ctlModel=StatusOnly resolves the row as read-only.
signal.ControlLastResult = $"Control model unavailable: {ex.Message}";
if (!signal.ControlCommandBusy)
signal.ControlLastResult = $"Control model unavailable: {ex.Message}";
}
finally
{
signal.ControlIsBusy = false;
signal.ControlInspectionBusy = false;
throttle.Release();
}
}));
Expand Down
6 changes: 3 additions & 3 deletions MainWindow.ControlDiagnostics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ private void HandlePositionCommandPropertyChanged(ActivePositionCommand state, s
{
state.StableConfirmed = true;
SetStableFeedbackResult(state);
if (!state.Signal.ControlIsBusy)
if (!state.Signal.ControlCommandBusy)
RemovePositionCommand(state.Key);
return;
}
Expand Down Expand Up @@ -413,8 +413,8 @@ private void HandlePositionCommandPropertyChanged(ActivePositionCommand state, s
return;
}

if (propertyName == nameof(SignalDefinition.ControlIsBusy) &&
!state.Signal.ControlIsBusy && state.StableConfirmed)
if (propertyName == nameof(SignalDefinition.ControlCommandBusy) &&
!state.Signal.ControlCommandBusy && state.StableConfirmed)
{
SetStableFeedbackResult(state);
RemovePositionCommand(state.Key);
Expand Down
29 changes: 3 additions & 26 deletions MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -544,32 +544,9 @@
</Style.Triggers>
</Style>
</StackPanel.Style>
<Button Content="Confirm Open" Tag="{Binding}" Click="ControlConfirmAction_Click"
IsEnabled="{Binding ControlCanConfirm}" Margin="0,0,7,0">
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource CommandOpenButton}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ControlPendingAction}" Value="Open">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
<Button Content="Confirm Close" Tag="{Binding}" Click="ControlConfirmAction_Click"
IsEnabled="{Binding ControlCanConfirm}" Margin="0,0,7,0">
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource CommandCloseButton}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ControlPendingAction}" Value="Close">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
<Button Content="{Binding ControlPendingConfirmationLabel}" Tag="{Binding}" Click="ControlConfirmAction_Click"
Style="{StaticResource CommandConfirmButton}"
IsEnabled="{Binding ControlCanConfirm}" Margin="0,0,7,0"/>
<Button Content="Cancel" Tag="{Binding}" Click="ControlCancelAction_Click"
Style="{StaticResource SoftButton}" Padding="12,6"/>
</StackPanel>
Expand Down
Loading
Loading