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;
}
}
}