using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using SimpleCore.Library; namespace StandardScene.ExtendDevice.ButtonBox { /// /// 按钮状态枚举 /// public enum ButtonState { /// /// 未按下 /// Released = 0, /// /// 已按下 /// Pressed = 1, /// /// 未知状态 /// Unknown = 2 } /// /// 按钮盒状态枚举 /// public enum ButtonBoxState { /// /// 离线 /// Offline = 0, /// /// 在线 /// Online = 1, /// /// 连接中 /// Connecting = 2, /// /// 错误 /// Error = 3 } /// /// 基础按钮盒类,包含状态机 /// public abstract class BasicButtonBox { /// /// 按钮盒索引 /// public int Index { get; set; } /// /// IP地址 /// public string Ip { get; set; } = string.Empty; /// /// 端口 /// public int Port { get; set; } /// /// 按钮盒状态 /// public ButtonBoxState State { get; protected set; } = ButtonBoxState.Offline; /// /// 是否在线 /// public bool IsOnline => State == ButtonBoxState.Online; /// /// 按钮状态字典,键为按钮索引 /// public Dictionary ButtonStates { get; protected set; } = new Dictionary(); /// /// 按钮配置信息字典,键为按钮索引 /// public Dictionary ButtonConfigs { get; protected set; } = new Dictionary(); /// /// 按钮动作执行后清零对应寄存器:默认空实现,具体盒型(如 Azowie)按需重写。 /// 用于解耦 ButtonMission 对具体盒型的 is 判断,便于驱动外移至卫星 dll。 /// public virtual void ClearButtonRegister(int buttonIndex) { } /// /// 最后更新时间 /// public DateTime LastUpdateTime { get; protected set; } = DateTime.Now; /// /// 错误信息 /// public string ErrorMessage { get; protected set; } = string.Empty; /// /// 更新按钮盒状态 /// public virtual void UpdateState(ButtonBoxState newState, string errorMessage = "") { State = newState; ErrorMessage = errorMessage; LastUpdateTime = DateTime.Now; } /// /// 更新按钮状态 /// /// 按钮索引 /// 按钮状态 public virtual void UpdateButtonState(int buttonIndex, ButtonState state) { bool hadPrev = ButtonStates.TryGetValue(buttonIndex, out var previous); if (hadPrev && previous == state) return; ButtonStates[buttonIndex] = state; if (hadPrev) Diagnosis.Post($"按钮盒{Index}_按钮{buttonIndex}:状态变更为{state}", "ButtonBox", false); LastUpdateTime = DateTime.Now; } /// /// 获取按钮状态 /// /// 按钮索引 /// 按钮状态,如果不存在则返回Unknown public virtual ButtonState GetButtonState(int buttonIndex) { return ButtonStates.TryGetValue(buttonIndex, out var state) ? state : ButtonState.Unknown; } /// /// 初始化按钮状态 /// /// 按钮索引列表 public virtual void InitializeButtons(List buttonIndices) { ButtonStates.Clear(); foreach (var index in buttonIndices) { ButtonStates[index] = ButtonState.Released; } } /// /// 初始化按钮配置信息 /// /// 按钮配置列表 public virtual void InitializeButtonConfigs(List buttonConfigs) { ButtonConfigs.Clear(); if (buttonConfigs != null) { foreach (var config in buttonConfigs) { ButtonConfigs[config.Index] = new ButtonModel { Index = config.Index, TriggerMission = config.TriggerMission, TriggerMethod = config.TriggerMethod, TriggerMethodParams = config.TriggerMethodParams, TriggerState = config.TriggerState, TriggerDelay = config.TriggerDelay }; } } } /// /// 更新按钮配置信息 /// /// 按钮配置列表 public virtual void UpdateButtonConfigs(List buttonConfigs) { if (buttonConfigs == null) { ButtonConfigs.Clear(); return; } // 创建配置字典 var configDict = buttonConfigs.ToDictionary(b => b.Index); // 删除配置中不存在的按钮 var toRemove = ButtonConfigs.Keys.Where(k => !configDict.ContainsKey(k)).ToList(); foreach (var key in toRemove) { ButtonConfigs.Remove(key); } // 添加或更新按钮配置 foreach (var config in buttonConfigs) { ButtonConfigs[config.Index] = new ButtonModel { Index = config.Index, TriggerMission = config.TriggerMission, TriggerMethod = config.TriggerMethod, TriggerMethodParams = config.TriggerMethodParams, TriggerState = config.TriggerState, TriggerDelay = config.TriggerDelay }; } } /// /// 获取按钮配置信息 /// /// 按钮索引 /// 按钮配置信息,如果不存在则返回null public virtual ButtonModel GetButtonConfig(int buttonIndex) { return ButtonConfigs.TryGetValue(buttonIndex, out var config) ? config : null; } /// /// 连接按钮盒 /// public virtual void Connect() { UpdateState(ButtonBoxState.Connecting); } /// /// 断开连接 /// public virtual void Disconnect() { UpdateState(ButtonBoxState.Offline); } /// /// 当与此按钮盒绑定的业务方法执行完成后触发的回调。 /// 子类可重写以实现按钮灯反馈、蜂鸣等效果。 /// /// 触发本次调用的按钮配置 /// 业务方法是否执行成功 public virtual void OnActionExecuted(ButtonModel buttonConfig, bool isSuccess) { // 基类默认不做任何事,由具体实现按需要重写 } } }