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

---
 DeviceService/ServiceManager/ServiceManager.cs |  130 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 130 insertions(+), 0 deletions(-)

diff --git a/DeviceService/ServiceManager/ServiceManager.cs b/DeviceService/ServiceManager/ServiceManager.cs
new file mode 100644
index 0000000..a5acb4e
--- /dev/null
+++ b/DeviceService/ServiceManager/ServiceManager.cs
@@ -0,0 +1,130 @@
+锘縰sing DeviceService.Device;
+using DeviceService.Entity;
+using DeviceService.Logging;
+using DeviceService.Service.NamePipe;
+using System.Windows;
+
+namespace DeviceService.Service
+{
+    public enum ServiceStatus
+    {
+        Idle = 0,
+        Running = 1,
+        Error = 2,
+    }
+
+    public class ServiceStateMachine : NotifyBase
+    {
+        public static ServiceStateMachine GlobalState = new ServiceStateMachine();
+
+        private ServiceStateMachine()
+        {
+
+        }
+
+        private ServiceStatus _state;
+        public ServiceStatus State
+        {
+            get => _state;
+            set
+            {
+                SetProperty(ref _state, value);
+            }
+        }
+
+        private bool _isRunning;
+        public bool IsRunning
+        {
+            get => _isRunning;
+            set
+            {
+                SetProperty(ref _isRunning, value);
+            }
+        }
+
+    }
+
+    public class ServiceManager
+    {
+        private static IService _serviceImpl;
+
+        private const string PipeName = "DeviceService";
+
+        public static void Start()
+        {
+            if (ServiceStateMachine.GlobalState.State == ServiceStatus.Running)
+            {
+                MessageBox.Show("宸插惎鍔�");
+                return;
+            }
+            _serviceImpl = new NamePipeService(PipeName);
+            _serviceImpl.DataReceived += PipeService_DataReceived;
+            _serviceImpl.ClientConnected += PipeService_ClientConnected;
+            _serviceImpl.ClientDisConnected += PipeService_ClientDisConnected;
+
+            string err = string.Empty;
+            bool allDone = true;
+
+            foreach (var device in DeviceHelper.AllDevices)
+            {
+                if (!DeviceManager.Register(device, out string fail))
+                {
+                    allDone = false;
+                    err += $"{fail}\r\n";
+                }
+            }
+
+            if (!allDone && MessageBox.Show(err, "鎻愮ず", MessageBoxButton.OKCancel) == MessageBoxResult.Cancel)
+            {
+                DeviceManager.UnRegisterAll();
+                ServiceStateMachine.GlobalState.State = ServiceStatus.Error;
+                return;
+            }
+
+
+            if (!_serviceImpl.Start(out string msg))
+            {
+                GlobalLogger.Logger.Error("ServiceManager", $"[鏈嶅姟] 绠¢亾鏈嶅姟鍚姩澶辫触锛歿msg}");
+                Stop();
+                // Stop 浼氭妸鐘舵�佺疆涓� Idle锛岃繖閲屽啀鏍囪涓哄紓甯革紝渚涚晫闈㈡樉绀�
+                ServiceStateMachine.GlobalState.State = ServiceStatus.Error;
+                throw new Exception(msg);
+            }
+            ServiceStateMachine.GlobalState.State = ServiceStatus.Running;
+        }
+
+        public static void Stop()
+        {
+            if (_serviceImpl == null)
+            {
+                return;
+            }
+
+            _serviceImpl.DataReceived -= PipeService_DataReceived;
+            _serviceImpl.ClientConnected -= PipeService_ClientConnected;
+            _serviceImpl.ClientDisConnected -= PipeService_ClientDisConnected;
+            _serviceImpl.Stop(out _);
+            _serviceImpl.Dispose();
+            _serviceImpl = null;
+            ServiceStateMachine.GlobalState.State = ServiceStatus.Idle;
+        }
+
+
+        private static void PipeService_DataReceived(object? sender, RequestArg e)
+        {
+            // 鏁版嵁鍒拌揪浜嬩欢鏉ヨ嚜鍚庡彴绾跨▼锛岄渶瑕佸垏鎹㈠埌 UI 绾跨▼鏄剧ず
+            DeviceManager.HandleClientMessage(e);
+        }
+
+        private static void PipeService_ClientConnected(object? sender, IClient client)
+        {
+            // 杩炴帴/鏂紑浜嬩欢鏉ヨ嚜鍚庡彴绾跨▼锛屽垪琛ㄦ洿鏂伴渶鍒囨崲鍒� UI 绾跨▼
+
+        }
+
+        private static void PipeService_ClientDisConnected(object? sender, IClient client)
+        {
+
+        }
+    }
+}

--
Gitblit v1.9.1