using 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)
|
{
|
|
}
|
}
|
}
|