From e57938fbda9bff702004038f76d009422968bff5 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期五, 06 十一月 2026 18:05:07 +0800
Subject: [PATCH] 提交代码

---
 DeviceService/MainWindow.xaml.cs |  218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 218 insertions(+), 0 deletions(-)

diff --git a/DeviceService/MainWindow.xaml.cs b/DeviceService/MainWindow.xaml.cs
new file mode 100644
index 0000000..3ca094d
--- /dev/null
+++ b/DeviceService/MainWindow.xaml.cs
@@ -0,0 +1,218 @@
+using DeviceService.Core;
+using DeviceService.Device;
+using DeviceService.Driver;
+using DeviceService.Logging;
+using DeviceService.Service;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Threading;
+
+namespace DeviceService;
+
+/// <summary>
+/// 璁惧鏍戝垎缁勮妭鐐癸紙鎸� IDevice.Type 鍒嗙粍锛夈��
+/// </summary>
+public class DeviceGroupNode
+{
+    public DeviceGroupNode(string type, IEnumerable<DeviceNode> children)
+    {
+        Type = type;
+        Children = new ObservableCollection<DeviceNode>(children);
+    }
+
+    public string Type { get; }
+
+    public ObservableCollection<DeviceNode> Children { get; }
+}
+
+/// <summary>
+/// 璁惧鏍戝彾瀛愯妭鐐广��
+/// </summary>
+public class DeviceNode
+{
+    public DeviceNode(IDevice device)
+    {
+        Device = device;
+    }
+
+    public IDevice Device { get; }
+
+    public string DisplayName => $"{Device.DeviceId}锛坽Device.Brand}锛�";
+}
+
+/// <summary>
+/// Interaction logic for MainWindow.xaml
+/// </summary>
+public partial class MainWindow : Window
+{
+    private readonly DriverManager _manager = DriverManager.Instance;
+    private readonly ObservableCollection<DeviceGroupNode> _groups = new ObservableCollection<DeviceGroupNode>();
+
+    public MainWindow()
+    {
+        InitializeComponent();
+        DeviceTree.ItemsSource = _groups;
+        Loaded += MainWindow_Loaded;
+    }
+
+    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
+    {
+        // 鍔犺浇椹卞姩鍖咃紝渚涜澶� Init 鏃舵煡鎵鹃┍鍔�
+        _manager.Scan(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Driver"), s => { });
+
+        // 鎵弿 DeviceDesc 娉ㄨВ锛屽~鍏� AllDeviceType
+        DeviceHelper.ScanDeviceTypes();
+
+        // 浠ユ暟鎹簱涓哄噯鎭㈠璁惧鍒楄〃锛堜笉璋冪敤 Init锛岄伩鍏嶅惎鍔ㄥ嵆鍗犵敤纭欢锛�
+        ReloadDeviceList();
+
+        RefreshDeviceTree();
+    }
+
+    private void RefreshButton_Click(object sender, RoutedEventArgs e)
+    {
+        RefreshDeviceTree();
+    }
+
+    private void AddDeviceButton_Click(object sender, RoutedEventArgs e)
+    {
+        var dialog = new AddDeviceWindow { Owner = this };
+        if (dialog.ShowDialog() != true || dialog.Device == null)
+        {
+            return;
+        }
+
+        IDevice device = dialog.Device;
+        if (!DeviceHelper.SaveDevice(device))
+        {
+            HeaderText.Text = $"璁惧 {device.DeviceId} 淇濆瓨澶辫触";
+            return;
+        }
+
+        // 淇濆瓨鎴愬姛鍚庝粠鏁版嵁搴撻噸鏂拌鍙栬澶囧垪琛紝鑰屼笉鏄妸寮圭獥閲屾柊寤虹殑瀹炰緥鐩存帴濉炶繘鍒楄〃
+        ReloadDeviceList();
+        RefreshDeviceTree();
+
+        HeaderText.Text = $"宸叉坊鍔犺澶� {device.DeviceId}";
+    }
+
+    /// <summary>浠� Config\Devices.db 涓哄噯鍒锋柊鍐呭瓨涓殑璁惧鍒楄〃锛堜笉璋冪敤 Init锛夈��</summary>
+    private static void ReloadDeviceList()
+    {
+        DeviceManager.Refresh(DeviceHelper.LoadDevices());
+    }
+
+    private void StartService_Click(object sender, RoutedEventArgs e)
+    {
+        // 杩愯涓偣鍑诲嵆涓衡�滃仠姝⑩��
+        if (ServiceStateMachine.GlobalState.State == ServiceStatus.Running)
+        {
+            ServiceManager.Stop();
+            HeaderText.Text = "鏈嶅姟宸插仠姝�";
+            return;
+        }
+
+        try
+        {
+            ServiceManager.Start();
+        }
+        catch (Exception ex)
+        {
+            MessageBox.Show(ex.Message);
+        }
+    }
+
+    private void DebugWindowButton_Click(object sender, RoutedEventArgs e)
+    {
+        var debug = new DebugWindow { Owner = this };
+        debug.Show();
+    }
+
+    private void LogWindowButton_Click(object sender, RoutedEventArgs e)
+    {
+        var log = new LogWindow { Owner = this };
+        log.Show();
+    }
+
+    private void DeviceTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
+    {
+        if (e.NewValue is DeviceNode node)
+        {
+            ShowDeviceConfig(node.Device);
+        }
+        else
+        {
+            ConfigHost.Content = null;
+            HeaderText.Text = "璁惧閰嶇疆";
+        }
+    }
+
+    private void ShowDeviceConfig(IDevice device)
+    {
+        HeaderText.Text = $"{device.Type} - {device.DeviceId}";
+
+        UserControl? control = DeviceConfigControlFactory.Create(device);
+        if (control == null)
+        {
+            // 鏈寜鍛藉悕瑙勫垯鎵惧埌瀵瑰簲閰嶇疆鎺т欢
+            ConfigHost.Content = new TextBlock
+            {
+                Text = $"鏈壘鍒� {device.GetType().Name}ConfigControl锛屾棤娉曟樉绀鸿璁惧鐨勯厤缃晫闈€��",
+                Margin = new Thickness(8),
+                TextWrapping = TextWrapping.Wrap,
+                TextAlignment = TextAlignment.Center,
+                VerticalAlignment = VerticalAlignment.Center
+            };
+            return;
+        }
+
+        control.DataContext = device;
+        ConfigHost.Content = control;
+    }
+
+    private void RefreshDeviceTree()
+    {
+        string? selectedId = (DeviceTree.SelectedItem as DeviceNode)?.Device.DeviceId;
+
+        _groups.Clear();
+        foreach (var group in DeviceManager.Devices
+                     .GroupBy(d => d.Type)
+                     .OrderBy(g => g.Key, StringComparer.Ordinal))
+        {
+            _groups.Add(new DeviceGroupNode(group.Key, group.Select(d => new DeviceNode(d))));
+        }
+
+        // 瀹瑰櫒鍦ㄦ湰娆″竷灞�涔嬪悗鎵嶇敓鎴愶紝寤跺悗灞曞紑锛岀‘淇濇柊澧炶妭鐐硅兘鏄剧ず鍑烘潵
+        Dispatcher.BeginInvoke(new Action(ExpandAllGroups), DispatcherPriority.Loaded);
+    }
+
+    /// <summary>灞曞紑鎵�鏈夊垎缁勮妭鐐广��</summary>
+    private void ExpandAllGroups()
+    {
+        if (DeviceTree.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
+        {
+            EventHandler? handler = null;
+            handler = (s, e) =>
+            {
+                if (DeviceTree.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
+                {
+                    DeviceTree.ItemContainerGenerator.StatusChanged -= handler;
+                    ExpandAllGroups();
+                }
+            };
+            DeviceTree.ItemContainerGenerator.StatusChanged += handler;
+            return;
+        }
+
+        for (int i = 0; i < DeviceTree.Items.Count; i++)
+        {
+            if (DeviceTree.ItemContainerGenerator.ContainerFromIndex(i) is TreeViewItem item)
+            {
+                item.IsExpanded = true;
+            }
+        }
+    }
+}

--
Gitblit v1.9.1