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)
{
// 基类默认不做任何事,由具体实现按需要重写
}
}
}