using System;
using System.Collections.Generic;
using System.Linq;
using SimpleCore.Library;
namespace StandardScene.ExtendDevice.Door
{
///
/// 门状态枚举
///
public enum DoorState
{
///
/// 关闭
///
Closed = 0,
///
/// 打开
///
Open = 1,
///
/// 未知状态
///
Unknown = 2
}
///
/// 门控制器状态枚举
///
public enum DoorControllerState
{
///
/// 离线
///
Offline = 0,
///
/// 在线
///
Online = 1,
///
/// 连接中
///
Connecting = 2,
///
/// 错误
///
Error = 3
}
///
/// 基础门控制器类
///
public abstract class BasicDoorController
{
///
/// 控制器索引
///
public int Index { get; set; }
///
/// IP地址
///
public string Ip { get; set; } = string.Empty;
///
/// 端口
///
public int Port { get; set; } = 502;
///
/// 控制器状态
///
public DoorControllerState State { get; protected set; } = DoorControllerState.Offline;
///
/// 是否在线
///
public bool IsOnline => State == DoorControllerState.Online;
///
/// 门状态字典,键为门索引
///
public Dictionary DoorStates { get; protected set; } = new Dictionary();
///
/// 门目标控制字典,键为门索引,值为期望的开关状态(true=打开,false=关闭)
/// 仅作为指令缓存,实际通信由具体门控制器内部线程完成
///
public Dictionary DoorControlTargets { get; protected set; } = new Dictionary();
///
/// 门配置信息字典,键为门索引
///
public Dictionary DoorConfigs { get; protected set; } = new Dictionary();
///
/// 最后更新时间
///
public DateTime LastUpdateTime { get; protected set; } = DateTime.Now;
///
/// 错误信息
///
public string ErrorMessage { get; protected set; } = string.Empty;
///
/// 更新控制器状态
///
public virtual void UpdateState(DoorControllerState newState, string errorMessage = "")
{
State = newState;
ErrorMessage = errorMessage;
LastUpdateTime = DateTime.Now;
}
///
/// 更新门状态
///
/// 门索引
/// 门状态
public virtual void UpdateDoorState(int doorIndex, DoorState state)
{
if (!DoorStates.ContainsKey(doorIndex))
{
Diagnosis.Post($"门控制器{Index}不存在门{doorIndex}");
}
DoorStates[doorIndex] = state;
LastUpdateTime = DateTime.Now;
}
///
/// 获取门状态
///
/// 门索引
/// 门状态,如果不存在则返回Unknown
public virtual DoorState GetDoorState(int doorIndex)
{
return DoorStates.TryGetValue(doorIndex, out var state) ? state : DoorState.Unknown;
}
///
/// 初始化门状态
///
/// 门索引列表
public virtual void InitializeDoors(List doorIndices)
{
DoorStates.Clear();
DoorControlTargets.Clear();
foreach (var index in doorIndices)
{
DoorStates[index] = DoorState.Closed;
DoorControlTargets[index] = false;
}
}
///
/// 初始化门配置信息
///
/// 门配置列表
public virtual void InitializeDoorConfigs(List doorConfigs)
{
DoorConfigs.Clear();
if (doorConfigs != null)
{
foreach (var config in doorConfigs)
{
DoorConfigs[config.Index] = new DoorModel
{
Index = config.Index,
ControlAddress = config.ControlAddress,
OpenStatusAddress = config.OpenStatusAddress,
NoControl = config.NoControl
};
}
}
}
///
/// 更新门配置信息
///
/// 门配置列表
public virtual void UpdateDoorConfigs(List doorConfigs)
{
if (doorConfigs == null)
{
DoorConfigs.Clear();
return;
}
// 创建配置字典
var configDict = doorConfigs.ToDictionary(d => d.Index);
// 删除配置中不存在的门
var toRemove = DoorConfigs.Keys.Where(k => !configDict.ContainsKey(k)).ToList();
foreach (var key in toRemove)
{
DoorConfigs.Remove(key);
}
// 添加或更新门配置
foreach (var config in doorConfigs)
{
DoorConfigs[config.Index] = new DoorModel
{
Index = config.Index,
ControlAddress = config.ControlAddress,
OpenStatusAddress = config.OpenStatusAddress,
NoControl = config.NoControl
};
}
}
///
/// 获取门配置信息
///
/// 门索引
/// 门配置信息,如果不存在则返回null
public virtual DoorModel GetDoorConfig(int doorIndex)
{
return DoorConfigs.TryGetValue(doorIndex, out var config) ? config : null;
}
///
/// 设置门的目标控制状态(仅修改内存字段,不直接进行通信)
/// 实际的通信写入由具体门控制器在内部线程中根据该目标状态执行
///
/// 门索引
/// true=打开,false=关闭
public virtual void SetDoorControlTarget(int doorIndex, bool open)
{
// 统一支持 NoControl:当门被配置为不允许发送任何控制指令时,
// 强制将目标置为 false,并避免为其它控制器留下“需要开门”的目标。
if (DoorConfigs.TryGetValue(doorIndex, out var cfg) && cfg != null && cfg.NoControl)
{
DoorControlTargets[doorIndex] = false;
LastUpdateTime = DateTime.Now;
return;
}
DoorControlTargets[doorIndex] = open;
LastUpdateTime = DateTime.Now;
}
///
/// 连接门控制器
///
public virtual void Connect()
{
UpdateState(DoorControllerState.Connecting);
}
///
/// 断开连接
///
public virtual void Disconnect()
{
UpdateState(DoorControllerState.Offline);
}
///
/// 读取门状态(开到位信号)
///
/// 门索引
/// 门状态
public abstract bool ReadDoorState(int doorIndex);
///
/// 写入门控制信号(开关控制)
///
/// 门索引
/// true=打开,false=关闭
public abstract void WriteDoorControl(int doorIndex, bool open);
}
}