init commit

This commit is contained in:
zhaowei.huang
2026-06-14 11:19:15 +08:00
parent e79a3815a5
commit c8e540d272
174 changed files with 60830 additions and 39 deletions
@@ -0,0 +1,263 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SimpleCore.Library;
namespace StandardScene.ExtendDevice.ButtonBox
{
/// <summary>
/// 按钮状态枚举
/// </summary>
public enum ButtonState
{
/// <summary>
/// 未按下
/// </summary>
Released = 0,
/// <summary>
/// 已按下
/// </summary>
Pressed = 1,
/// <summary>
/// 未知状态
/// </summary>
Unknown = 2
}
/// <summary>
/// 按钮盒状态枚举
/// </summary>
public enum ButtonBoxState
{
/// <summary>
/// 离线
/// </summary>
Offline = 0,
/// <summary>
/// 在线
/// </summary>
Online = 1,
/// <summary>
/// 连接中
/// </summary>
Connecting = 2,
/// <summary>
/// 错误
/// </summary>
Error = 3
}
/// <summary>
/// 基础按钮盒类,包含状态机
/// </summary>
public abstract class BasicButtonBox
{
/// <summary>
/// 按钮盒索引
/// </summary>
public int Index { get; set; }
/// <summary>
/// IP地址
/// </summary>
public string Ip { get; set; } = string.Empty;
/// <summary>
/// 端口
/// </summary>
public int Port { get; set; }
/// <summary>
/// 按钮盒状态
/// </summary>
public ButtonBoxState State { get; protected set; } = ButtonBoxState.Offline;
/// <summary>
/// 是否在线
/// </summary>
public bool IsOnline => State == ButtonBoxState.Online;
/// <summary>
/// 按钮状态字典,键为按钮索引
/// </summary>
public Dictionary<int, ButtonState> ButtonStates { get; protected set; } = new Dictionary<int, ButtonState>();
/// <summary>
/// 按钮配置信息字典,键为按钮索引
/// </summary>
public Dictionary<int, ButtonModel> ButtonConfigs { get; protected set; } = new Dictionary<int, ButtonModel>();
/// <summary>
/// 按钮动作执行后清零对应寄存器:默认空实现,具体盒型(如 Azowie)按需重写。
/// 用于解耦 ButtonMission 对具体盒型的 is 判断,便于驱动外移至卫星 dll。
/// </summary>
public virtual void ClearButtonRegister(int buttonIndex)
{
}
/// <summary>
/// 最后更新时间
/// </summary>
public DateTime LastUpdateTime { get; protected set; } = DateTime.Now;
/// <summary>
/// 错误信息
/// </summary>
public string ErrorMessage { get; protected set; } = string.Empty;
/// <summary>
/// 更新按钮盒状态
/// </summary>
public virtual void UpdateState(ButtonBoxState newState, string errorMessage = "")
{
State = newState;
ErrorMessage = errorMessage;
LastUpdateTime = DateTime.Now;
}
/// <summary>
/// 更新按钮状态
/// </summary>
/// <param name="buttonIndex">按钮索引</param>
/// <param name="state">按钮状态</param>
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;
}
/// <summary>
/// 获取按钮状态
/// </summary>
/// <param name="buttonIndex">按钮索引</param>
/// <returns>按钮状态,如果不存在则返回Unknown</returns>
public virtual ButtonState GetButtonState(int buttonIndex)
{
return ButtonStates.TryGetValue(buttonIndex, out var state) ? state : ButtonState.Unknown;
}
/// <summary>
/// 初始化按钮状态
/// </summary>
/// <param name="buttonIndices">按钮索引列表</param>
public virtual void InitializeButtons(List<int> buttonIndices)
{
ButtonStates.Clear();
foreach (var index in buttonIndices)
{
ButtonStates[index] = ButtonState.Released;
}
}
/// <summary>
/// 初始化按钮配置信息
/// </summary>
/// <param name="buttonConfigs">按钮配置列表</param>
public virtual void InitializeButtonConfigs(List<ButtonModel> 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
};
}
}
}
/// <summary>
/// 更新按钮配置信息
/// </summary>
/// <param name="buttonConfigs">按钮配置列表</param>
public virtual void UpdateButtonConfigs(List<ButtonModel> 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
};
}
}
/// <summary>
/// 获取按钮配置信息
/// </summary>
/// <param name="buttonIndex">按钮索引</param>
/// <returns>按钮配置信息,如果不存在则返回null</returns>
public virtual ButtonModel GetButtonConfig(int buttonIndex)
{
return ButtonConfigs.TryGetValue(buttonIndex, out var config) ? config : null;
}
/// <summary>
/// 连接按钮盒
/// </summary>
public virtual void Connect()
{
UpdateState(ButtonBoxState.Connecting);
}
/// <summary>
/// 断开连接
/// </summary>
public virtual void Disconnect()
{
UpdateState(ButtonBoxState.Offline);
}
/// <summary>
/// 当与此按钮盒绑定的业务方法执行完成后触发的回调。
/// 子类可重写以实现按钮灯反馈、蜂鸣等效果。
/// </summary>
/// <param name="buttonConfig">触发本次调用的按钮配置</param>
/// <param name="isSuccess">业务方法是否执行成功</param>
public virtual void OnActionExecuted(ButtonModel buttonConfig, bool isSuccess)
{
// 基类默认不做任何事,由具体实现按需要重写
}
}
}