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); } }