diff --git a/MainWindow.IedBrowser.cs b/MainWindow.IedBrowser.cs index cd58ea5a6..fd277a8c7 100644 --- a/MainWindow.IedBrowser.cs +++ b/MainWindow.IedBrowser.cs @@ -287,7 +287,7 @@ private async void IedBrowserReadValues_Click(object sender, RoutedEventArgs e) } var model = device.LiveDiscoveryModel ?? device.SclWorkspace?.DesignModel; var currentPage = _iedBrowserNavigation.Current; - var selectedDo = !readAll && + var selectedDo = !readAll && sender is not Button { Tag: "LN" } && ReferenceEquals(_iedBrowserRenderedPage, currentPage) && currentPage?.Payload is LiveIedLogicalNodeModel ? _iedBrowserSelectedDoReference : null; @@ -463,6 +463,15 @@ await _runtime.ReadBrowserValuesAsync(device, targets, } + private void IedBrowserGooseSubscribe_Click(object sender, RoutedEventArgs e) + { + if (SelectedDevice is not { IsDemo: false } device || + _iedBrowserRenderedPage?.Kind != "GoCB") + return; + // Shared Npcap-based subscriber, no second GOOSE receive/decoder path. + OpenIedGooseSubscriber(device); + } + private void RefreshIedBrowserReadButtons() { if (IedBrowserReadPageButton == null) return; @@ -476,6 +485,16 @@ private void RefreshIedBrowserReadButtons() // Opening a browsed SCL is always offline-safe. Explicit Read can then // open a cached-model MMS association; no background connect or polling. var selectedKind = IedBrowserReadPlan.SelectionKind(_iedBrowserNavigation.Current); + if (IedBrowserGooseSubscribeButton is not null) + { + IedBrowserGooseSubscribeButton.Visibility = + _iedBrowserRenderedPage?.Kind == "GoCB" + ? Visibility.Visible : Visibility.Collapsed; + IedBrowserGooseSubscribeButton.IsEnabled = + device is { IsDemo: false } && _iedBrowserReadOperation == null; + IedBrowserGooseSubscribeButton.Content = IsGooseCapturing + ? "View GOOSE Capture" : "Subscribe GOOSE"; + } IedBrowserReadPageButton.Content = selectedKind == IedBrowserReadSelectionKind.ReadOnlyRcb ? "Inspect RCB" : connected ? "Read" : "Connect & Read"; @@ -490,6 +509,25 @@ private void RefreshIedBrowserReadButtons() : connected ? "Read this model-verified object through bounded MMS reads." : "Connect using this IED model and read selected values on demand; no RCB or cyclic polling."; + var focusedDo = selectedKind == IedBrowserReadSelectionKind.FcAttributes && + _iedBrowserNavigation.Current?.Payload is LiveIedLogicalNodeModel && + !string.IsNullOrWhiteSpace(_iedBrowserSelectedDoReference); + if (IedBrowserReadLnButton is not null) + { + IedBrowserReadLnButton.Visibility = + focusedDo ? Visibility.Visible : Visibility.Collapsed; + IedBrowserReadLnButton.IsEnabled = ready; + } + if (focusedDo) + { + IedBrowserReadPageButton.Content = "Read DO"; + IedBrowserReadPageButton.ToolTip = "Read only " + + _iedBrowserSelectedDoReference + + "; choose Read LN for the entire Logical Node."; + } + else if (selectedKind == IedBrowserReadSelectionKind.FcAttributes && + _iedBrowserNavigation.Current?.Payload is LiveIedLogicalNodeModel) + IedBrowserReadPageButton.Content = "Read LN"; IedBrowserReadPageButton.IsEnabled = ready; IedBrowserReadAllButton.IsEnabled = ready; IedBrowserCancelReadButton.IsEnabled = _iedBrowserReadOperation != null; @@ -1209,9 +1247,7 @@ private void IedBrowserDetailRow_MouseUp( _iedBrowserNavigation.Current?.Payload is LiveIedLogicalNodeModel) { _iedBrowserSelectedDoReference = detail.ReadObjectReference; - IedBrowserReadPageButton.ToolTip = - "Read all model-proven safe FC attributes in selected DO " + - detail.ReadObjectReference + "; no writes or automatic polling."; + RefreshIedBrowserReadButtons(); // expose separate Read DO and Read LN scope } if (!detail.HasChildren) return; ToggleIedBrowserDetails(detail); @@ -1392,6 +1428,7 @@ private void RenderIedBrowserSelection( connected, SelectedDevice?.SclWorkspace?.DesignModel)); _iedBrowserLastLiveVersion = -1; RefreshIedBrowserVisibleValues(); + RefreshIedBrowserReadButtons(); // Folder entry opens at its first child, regardless of the scroll // position in the previously inspected RCB, LN or DataSet. if (_iedBrowserDetails.Rows.Count > 0) diff --git a/MainWindow.xaml b/MainWindow.xaml index 47027820e..2bcd87084 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -1983,10 +1983,18 @@ Style="{StaticResource SoftButton}" Margin="0,0,6,0" Click="IedBrowserReadValues_Click" ToolTip="Read values for the current Browser object over MMS. Live monitoring uses the report stream."/> +