Skip to content

Commit

Permalink
update scan ads host function
Browse files Browse the repository at this point in the history
- by parse StaticRoutes.xml to get routes info
  • Loading branch information
randolfly committed Oct 23, 2024
1 parent 425a01e commit b9d43dc
Show file tree
Hide file tree
Showing 9 changed files with 143 additions and 14 deletions.
2 changes: 1 addition & 1 deletion src/TwincatToolbox/Controls/LogConfigControl.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
xmlns:vm="using:TwincatToolbox.ViewModels"
x:Class="TwincatToolbox.LogConfigControl"
x:DataType="vm:LogConfigViewModel"
mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="200">
mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="300">
<Border Margin="10">
<DockPanel>
<Grid DockPanel.Dock="Top" ShowGridLines="False"
Expand Down
39 changes: 39 additions & 0 deletions src/TwincatToolbox/Controls/ScanAdsRouteControl.axaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<suki:SukiWindow xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:materialIcons="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
xmlns:suki="clr-namespace:SukiUI.Controls;assembly=SukiUI"
xmlns:p1="https://github.com/kikipoulet/SukiUI"
xmlns:vm="using:TwincatToolbox.ViewModels"
x:Class="TwincatToolbox.ScanAdsRouteControl"
x:DataType="vm:ScanAdsRouteViewModel"
Title="Scan and Select AdsRoute"
Width="400" Height="300" BackgroundStyle="BubbleStrong"
mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="300">
<Design.DataContext>
<vm:ScanAdsRouteViewModel/>
</Design.DataContext>
<DockPanel>
<Grid DockPanel.Dock="Top" Margin="10, 5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0">Scan and select target ads route</TextBlock>
<Button Grid.Column="1" Content="Close" Classes="Flat" Click="CloseDialog"/>
</Grid>
<DataGrid Margin="5" ItemsSource="{Binding AdsRoutes}"
SelectedItem="{Binding SelectedAdsRoute}"
GridLinesVisibility="All"
IsReadOnly="True"
BorderThickness="2" BorderBrush="Gray">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Width="80" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Address" Width="160" Binding="{Binding Address}"/>
<DataGridTextColumn Header="NetId" Width="120" Binding="{Binding NetId}"/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>

</suki:SukiWindow>
21 changes: 21 additions & 0 deletions src/TwincatToolbox/Controls/ScanAdsRouteControl.axaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;

using SukiUI.Controls;

using TwincatToolbox.ViewModels;

namespace TwincatToolbox;

public partial class ScanAdsRouteControl : SukiWindow
{
public ScanAdsRouteControl()
{
InitializeComponent();
}

private void CloseDialog(object? sender, Avalonia.Interactivity.RoutedEventArgs e) {
Close(((ScanAdsRouteViewModel)DataContext!).SelectedAdsRoute?.NetId);
}
}
29 changes: 29 additions & 0 deletions src/TwincatToolbox/Controls/ScanAdsRouteViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

using ScottPlot;

using TwincatToolbox.Controls;
using TwincatToolbox.Services;
using TwincatToolbox.Services.IService;

namespace TwincatToolbox.ViewModels;
public partial class ScanAdsRouteViewModel : ControlModelBase
{
public ObservableCollection<AdsRouteInfo> AdsRoutes { get; }

[ObservableProperty]
private AdsRouteInfo? _selectedAdsRoute = null;

public ScanAdsRouteViewModel() {
var routes = AdsComService.ScanAdsRoutes();
AdsRoutes = new ObservableCollection<AdsRouteInfo>(routes);
}
}
28 changes: 21 additions & 7 deletions src/TwincatToolbox/Services/AdsComService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Xml.Linq;

using TwinCAT;
using TwinCAT.Ads;
Expand Down Expand Up @@ -92,13 +93,6 @@ public void Dispose() {
adsClient.Dispose();
}

public List<AmsNetId> ScanAdsNetwork() {
// todo: 没有现成的API可以扫描本地网络上的Ads服务器(PowerShell可以实现)
var adsServers = new List<AmsNetId>();

return adsServers;
}

public void AddNotificationHandler(EventHandler<AdsNotificationEventArgs> handler) {
adsClient.AdsNotification += handler;
}
Expand All @@ -115,4 +109,24 @@ public uint AddDeviceNotification(string path, int byteSize, NotificationSetting
public void RemoveDeviceNotification(uint notificationHandle) {
adsClient.TryDeleteDeviceNotification(notificationHandle);
}

public static List<AdsRouteInfo> ScanAdsRoutes() {
var xmlPath = "C:\\TwinCAT\\3.1\\Target\\StaticRoutes.xml";
var xml = XDocument.Load(xmlPath);
var routeList = xml?.Root?.Element("RemoteConnections")?.Elements()
.Select(route => new AdsRouteInfo
{
Name = route.Element("Name")?.Value ?? string.Empty,
Address = route.Element("Address")?.Value ?? string.Empty,
NetId = route.Element("NetId")?.Value ?? string.Empty
}).ToList()!;

routeList.Add(new AdsRouteInfo
{
Name = "Local",
Address = AmsNetId.Local.ToString(),
NetId = AmsNetId.Local.ToString()
});
return routeList;
}
}
10 changes: 5 additions & 5 deletions src/TwincatToolbox/Services/IService/IAdsComService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ public interface IAdsComService : IDisposable
public uint AddDeviceNotification(string path, int byteSize, NotificationSettings settings);

public void RemoveDeviceNotification(uint notificationHandle);
}

/// <summary>
/// 扫描本地网络上的Ads服务器
/// </summary>
/// <returns>服务器地址(key: NetId, value: PortId)</returns>
public List<AmsNetId> ScanAdsNetwork();
public class AdsRouteInfo {
public string Name { get; set; }
public string Address { get; set; }
public string NetId { get; set; }
}
3 changes: 3 additions & 0 deletions src/TwincatToolbox/TwincatToolbox.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@
</ItemGroup>

<ItemGroup>
<Compile Update="Controls\ScanAdsRouteControl.axaml.cs">
<DependentUpon>ScanAdsRouteControl.axaml</DependentUpon>
</Compile>
<Compile Update="Controls\LogConfigControl.axaml.cs">
<DependentUpon>LogConfigControl.axaml</DependentUpon>
</Compile>
Expand Down
19 changes: 19 additions & 0 deletions src/TwincatToolbox/ViewModels/MainViewModel.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

using Avalonia.Collections;
using Avalonia.Controls.ApplicationLifetimes;

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

using SukiUI.Controls;

using TwinCAT.Ads;

using TwincatToolbox.Models;
Expand Down Expand Up @@ -63,4 +67,19 @@ private void OnDisconnectAdsServer()
private void OnCheckAdsState() {
AdsStateText = _adsComService.GetAdsState().ToString();
}

[RelayCommand]
private async Task ScanAndSelectAdsRouteAsync() {
var dialog = new ScanAdsRouteControl
{
DataContext = new ScanAdsRouteViewModel()
};

if (App.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
var dialogResult = await dialog.ShowDialog<string>(desktop?.MainWindow);
if(dialogResult != null) NetId = dialogResult;
Debug.WriteLine($"Selected NetId: {NetId}");
}
}
}
6 changes: 5 additions & 1 deletion src/TwincatToolbox/Views/MainView.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
<TextBox Text="{Binding PortId}" Watermark="PortId" />

<StackPanel HorizontalAlignment="Center" Orientation="Horizontal"
Spacing="10">
Spacing="0">
<Button Classes="Basic" ToolTip.Tip="Connecte Ads"
Command="{Binding ConnectAdsServerCommand}">
<materialIcons:MaterialIcon Kind="Connection"/>
Expand All @@ -59,6 +59,10 @@
Command="{Binding CheckAdsStateCommand}">
<materialIcons:MaterialIcon Kind="Check"/>
</Button>
<Button Classes="Basic" ToolTip.Tip="Scan AdsRoute"
Command="{Binding ScanAndSelectAdsRouteCommand}">
<materialIcons:MaterialIcon Kind="RadioTower"/>
</Button>
</StackPanel>
</StackPanel>
</suki:GlassCard>
Expand Down

0 comments on commit b9d43dc

Please sign in to comment.