init commit
This commit is contained in:
@@ -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)
|
||||
{
|
||||
// 基类默认不做任何事,由具体实现按需要重写
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user