| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- using System;
- using System.Collections.ObjectModel;
- using System.ComponentModel;
- using System.Net;
- using System.Threading.Tasks;
- using System.Windows;
- using TeamAAS.Dialogs;
- using TeamAAS.Feeder.Network;
- namespace TeamAAS.Views
- {
- /// <summary>
- /// 供料器 IP 自动搜索弹窗:UDP 广播扫描局域网内的 Feeder,
- /// 选中后可回填到当前供料器(IP/端口),或直接下发设置 Feeder 的 IP。
- /// </summary>
- public partial class SearchFeederWindow
- {
- /// <summary>用户选中并确认回填的 Feeder 网络信息。</summary>
- public FeederNetworkInfo SelectedResult { get; private set; }
- private readonly ObservableCollection<FeederNetworkInfo> _results = new ObservableCollection<FeederNetworkInfo>();
- private readonly FeederIpScanner _scanner = new FeederIpScanner();
- public SearchFeederWindow()
- {
- InitializeComponent();
- UiScaler.Attach(this); // 分辨率/DPI 自适应
- ResultListBox.ItemsSource = _results;
- }
- private void Window_Loaded(object sender, RoutedEventArgs e)
- {
- // 打开即自动搜索一次
- _ = ScanAsync();
- }
- private async void Search_Click(object sender, RoutedEventArgs e)
- {
- await ScanAsync();
- }
- private async Task ScanAsync()
- {
- LoadingIndicator.Visibility = Visibility.Visible;
- StatusText.Text = "正在搜索 Feeder...";
- _results.Clear();
- FillButton.IsEnabled = false;
- SetIpButton.IsEnabled = false;
- try
- {
- var list = await _scanner.ScanAsync();
- foreach (var f in list) _results.Add(f);
- StatusText.Text = $"搜索完成,找到 {list.Count} 个 Feeder";
- }
- catch (Exception ex)
- {
- StatusText.Text = $"搜索失败: {ex.Message}";
- }
- finally
- {
- LoadingIndicator.Visibility = Visibility.Collapsed;
- }
- }
- private void Result_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
- {
- bool has = ResultListBox.SelectedItem != null;
- FillButton.IsEnabled = has;
- SetIpButton.IsEnabled = has;
- }
- private void Fill_Click(object sender, RoutedEventArgs e)
- {
- SelectedResult = ResultListBox.SelectedItem as FeederNetworkInfo;
- if (SelectedResult == null) return;
- DialogResult = true;
- Close();
- }
- private async void SetIp_Click(object sender, RoutedEventArgs e)
- {
- var feeder = ResultListBox.SelectedItem as FeederNetworkInfo;
- if (feeder == null) return;
- string newIp = DialogHelper.Input("新 IP 地址", "设置 Feeder IP", feeder.IP);
- if (string.IsNullOrWhiteSpace(newIp)) return;
- newIp = newIp.Trim();
- StatusText.Text = $"正在设置 {feeder.MAC} -> {newIp} ...";
- bool ok = await _scanner.SetFeederIpAsync(feeder.MAC, newIp, feeder.Port, feeder.Subnet, feeder.Network);
- StatusText.Text = ok ? $"设置成功: {newIp}" : "设置失败(设备未回应)";
- if (ok)
- {
- feeder.IP = newIp;
- if (feeder.Network?.IPv4Address != null && IPAddress.TryParse(newIp, out var nip))
- feeder.IsAccessible = _scanner.AreFirstThreeOctetsEqual(nip, feeder.Network.IPv4Address);
- ResultListBox.Items.Refresh();
- }
- }
- private void Close_Click(object sender, RoutedEventArgs e)
- {
- Close();
- }
- private void Window_Closing(object sender, CancelEventArgs e)
- {
- _scanner.Dispose();
- if (!DialogResult.HasValue) DialogResult = false;
- }
- }
- }
|