using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Protocol376Simulator.Interfaces;
using Protocol376Simulator.Simulators;
using Serilog;
namespace Protocol376Simulator.Factory
{
///
/// 模拟器工厂类,负责创建和管理模拟器实例
///
public class SimulatorFactory
{
private static readonly Dictionary _simulators = new Dictionary();
private static string _serverAddress = "127.0.0.1";
private static int _serverPort = 10502;
private static int _addressCounter = 1;
///
/// 设置服务器地址和端口
///
/// 服务器地址
/// 服务器端口
public static void SetServerConfig(string serverAddress, int serverPort)
{
_serverAddress = serverAddress;
_serverPort = serverPort;
Log.Information("服务器配置已更新: {ServerAddress}:{ServerPort}", _serverAddress, _serverPort);
}
///
/// 创建集中器模拟器
///
/// 集中器地址
/// 创建的模拟器实例
public static ISimulator CreateConcentrator(string address)
{
// 检查地址是否已存在
if (_simulators.ContainsKey(address))
{
Log.Warning("集中器地址 {Address} 已存在", address);
return _simulators[address];
}
// 创建新的模拟器实例
var simulator = new ConcentratorSimulator(address, _serverAddress, _serverPort);
// 订阅事件
simulator.StatusChanged += (sender, status) => {
Log.Information("集中器 (地址: {Address}) 状态变更: {Status}", address, status);
};
// 添加到集合
_simulators[address] = simulator;
Log.Information("已创建集中器 (地址: {Address})", address);
return simulator;
}
///
/// 创建带自动生成地址的集中器模拟器
///
/// 创建的模拟器实例
public static ISimulator CreateConcentratorWithAutoAddress()
{
string address = GenerateNextAddress();
return CreateConcentrator(address);
}
///
/// 批量创建集中器模拟器
///
/// 创建数量
/// 创建的模拟器地址列表
public static List BatchCreateConcentrators(int count)
{
var addresses = new List();
for (int i = 0; i < count; i++)
{
string address = GenerateNextAddress();
CreateConcentrator(address);
addresses.Add(address);
}
Log.Information("已批量创建 {Count} 个集中器", count);
return addresses;
}
///
/// 生成下一个集中器地址
///
/// 生成的地址
private static string GenerateNextAddress()
{
// 生成9位十六进制地址,格式如:312001001
string address = $"31{_addressCounter:D7}";
_addressCounter++;
return address;
}
///
/// 获取模拟器实例
///
/// 集中器地址
/// 模拟器实例,如果不存在则返回null
public static ISimulator GetSimulator(string address)
{
if (_simulators.TryGetValue(address, out var simulator))
{
return simulator;
}
Log.Warning("集中器地址 {Address} 不存在", address);
return null;
}
///
/// 获取所有模拟器实例
///
/// 模拟器实例列表
public static Dictionary GetAllSimulators()
{
return _simulators;
}
///
/// 按范围获取模拟器地址
///
/// 范围表达式
/// 模拟器地址列表
public static List GetAddressesInRange(string range)
{
var addresses = new List();
// 如果是"all",返回所有地址
if (range.ToLower() == "all")
{
addresses.AddRange(_simulators.Keys);
return addresses;
}
// 解析范围表达式
string[] parts = range.Split(',');
foreach (var part in parts)
{
if (part.Contains("-"))
{
// 处理范围形式:"1-5"
string[] rangeParts = part.Trim().Split('-');
if (rangeParts.Length == 2 && int.TryParse(rangeParts[0], out int start) && int.TryParse(rangeParts[1], out int end))
{
// 将索引转换为地址
for (int i = start; i <= end; i++)
{
string address = $"31{i:D7}";
if (_simulators.ContainsKey(address))
{
addresses.Add(address);
}
}
}
}
else
{
// 处理单个地址形式
string address = part.Trim();
if (_simulators.ContainsKey(address))
{
addresses.Add(address);
}
}
}
return addresses;
}
///
/// 按范围批量操作模拟器
///
/// 范围表达式
/// 操作委托
/// 操作任务
public static async Task BatchOperationAsync(string range, Func action)
{
var addresses = GetAddressesInRange(range);
Log.Information("批量操作 {Count} 个集中器", addresses.Count);
foreach (var address in addresses)
{
if (_simulators.TryGetValue(address, out var simulator))
{
try
{
await action(simulator);
}
catch (Exception ex)
{
Log.Error(ex, "批量操作集中器 {Address} 时发生错误: {ErrorMessage}",
address, ex.Message);
}
}
}
}
///
/// 删除模拟器
///
/// 集中器地址
/// 是否成功删除
public static async Task RemoveSimulatorAsync(string address)
{
if (_simulators.TryGetValue(address, out var simulator))
{
try
{
// 停止模拟器
await simulator.StopAsync();
// 从集合中移除
_simulators.Remove(address);
Log.Information("已删除集中器 (地址: {Address})", address);
return true;
}
catch (Exception ex)
{
Log.Error(ex, "删除集中器 {Address} 时发生错误: {ErrorMessage}",
address, ex.Message);
return false;
}
}
return false;
}
///
/// 清空所有模拟器
///
public static async Task ClearAllSimulatorsAsync()
{
// 停止所有模拟器
foreach (var simulator in _simulators.Values)
{
try
{
await simulator.StopAsync();
}
catch (Exception ex)
{
Log.Error(ex, "停止模拟器时发生错误: {ErrorMessage}", ex.Message);
}
}
// 清空集合
_simulators.Clear();
// 重置地址计数器
_addressCounter = 1;
Log.Information("已清空所有模拟器");
}
}
}