Add cross-platform OPC UA client stack: shared library, CLI tool, and Avalonia UI

Implements Client.Shared (IOpcUaClientService with connection lifecycle, failover,
browse, read/write, subscriptions, alarms, history, redundancy), Client.CLI (8 CliFx
commands mirroring tools/opcuacli-dotnet), and Client.UI (Avalonia desktop app with
tree browser, read/write, subscriptions, alarms, and history tabs). All three target
.NET 10 and are covered by 249 unit tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Joseph Doherty
2026-03-30 15:49:42 -04:00
parent 50b85d41bd
commit a2883b82d9
109 changed files with 8571 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ZB.MOM.WW.LmxOpcUa.Client.UI.ViewModels"
x:Class="ZB.MOM.WW.LmxOpcUa.Client.UI.Views.SubscriptionsView"
x:DataType="vm:SubscriptionsViewModel">
<DockPanel Margin="8">
<!-- Add/Remove Controls -->
<StackPanel DockPanel.Dock="Top" Spacing="8">
<TextBlock Text="Subscriptions" FontWeight="Bold" />
<StackPanel Orientation="Horizontal" Spacing="8">
<TextBox Text="{Binding NewNodeIdText}" Width="250" Watermark="Node ID (e.g., ns=2;s=MyNode)" />
<NumericUpDown Value="{Binding NewInterval}" Minimum="100" Maximum="60000" Width="120" />
<Button Content="Add" Command="{Binding AddSubscriptionCommand}" />
<Button Content="Remove" Command="{Binding RemoveSubscriptionCommand}" />
</StackPanel>
</StackPanel>
<!-- Active Subscriptions List -->
<DataGrid ItemsSource="{Binding ActiveSubscriptions}"
SelectedItem="{Binding SelectedSubscription}"
AutoGenerateColumns="False"
IsReadOnly="True"
Margin="0,8,0,0">
<DataGrid.Columns>
<DataGridTextColumn Header="Node ID" Binding="{Binding NodeId}" Width="250" />
<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="150" />
<DataGridTextColumn Header="Status" Binding="{Binding Status}" Width="120" />
<DataGridTextColumn Header="Timestamp" Binding="{Binding Timestamp}" Width="200" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</UserControl>