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 { /// /// 供料器 IP 自动搜索弹窗:UDP 广播扫描局域网内的 Feeder, /// 选中后可回填到当前供料器(IP/端口),或直接下发设置 Feeder 的 IP。 /// public partial class SearchFeederWindow { /// 用户选中并确认回填的 Feeder 网络信息。 public FeederNetworkInfo SelectedResult { get; private set; } private readonly ObservableCollection _results = new ObservableCollection(); 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; } } }