226 lines
6.3 KiB
C#
226 lines
6.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using leegiot;
|
|
using SimpleCore;
|
|
using SimpleCore.Library;
|
|
|
|
namespace StandardScene.ExtendDevice.ButtonBox
|
|
{
|
|
public class LeegButtonBox : BasicButtonBox
|
|
{
|
|
/// <summary>
|
|
/// LeegKey设备实例
|
|
/// </summary>
|
|
private LeegKeyDevice _device;
|
|
|
|
/// <summary>
|
|
/// 同步锁
|
|
/// </summary>
|
|
private readonly object _syncLock = new object();
|
|
|
|
/// <summary>
|
|
/// 是否已启动
|
|
/// </summary>
|
|
private bool _isStarted = false;
|
|
|
|
/// <summary>
|
|
/// 连接按钮盒
|
|
/// </summary>
|
|
public override void Connect()
|
|
{
|
|
lock (_syncLock)
|
|
{
|
|
if (_isStarted)
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
UpdateState(ButtonBoxState.Connecting);
|
|
|
|
// 创建LeegKey设备实例
|
|
_device = new LeegKeyDevice(Ip, Port);
|
|
|
|
// 设置事件回调,使用Index作为userData
|
|
_device.setEventCallback(OnLeegKeyEvent, Index);
|
|
_device.autoHeartbeatEnable(2,5);
|
|
// 启动设备
|
|
_device.start(true);
|
|
|
|
_isStarted = true;
|
|
UpdateState(ButtonBoxState.Online);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
UpdateState(ButtonBoxState.Error, $"连接失败: {ex.Message}");
|
|
_isStarted = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 断开连接
|
|
/// </summary>
|
|
public override void Disconnect()
|
|
{
|
|
lock (_syncLock)
|
|
{
|
|
if (!_isStarted || _device == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
_device.stop();
|
|
_device = null;
|
|
_isStarted = false;
|
|
UpdateState(ButtonBoxState.Offline);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
UpdateState(ButtonBoxState.Error, $"断开连接失败: {ex.Message}");
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// LeegKey事件回调
|
|
/// </summary>
|
|
private void OnLeegKeyEvent(LeegKeyEvent evt, object msg, object userData)
|
|
{
|
|
try
|
|
{
|
|
switch (evt)
|
|
{
|
|
case LeegKeyEvent.KEY_HIT:
|
|
HandleKeyHit((LeegKeyMsgKey)msg);
|
|
break;
|
|
|
|
case LeegKeyEvent.STATUS_REP:
|
|
HandleStatusReport((LeegKeyMsgStatus)msg);
|
|
break;
|
|
|
|
case LeegKeyEvent.TIME:
|
|
// 时间同步事件,可以用于保持连接状态
|
|
UpdateState(ButtonBoxState.Online);
|
|
break;
|
|
|
|
case LeegKeyEvent.LOG:
|
|
// 日志事件,可以用于调试
|
|
HandleLogEvent((LeegKeyMsgLog)msg);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
UpdateState(ButtonBoxState.Error, $"处理事件失败: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 处理按键按下事件
|
|
/// </summary>
|
|
private void HandleKeyHit(LeegKeyMsgKey msg)
|
|
{
|
|
var keyTag= msg.content.keys[0].First();
|
|
var buttonIndexStr = keyTag.Key.Substring(3);
|
|
if(!int.TryParse(buttonIndexStr,out var buttonIndex))
|
|
return;
|
|
switch (keyTag.Value)
|
|
{
|
|
case "up":
|
|
UpdateButtonState(buttonIndex,ButtonState.Released);
|
|
break;
|
|
case "down":
|
|
UpdateButtonState(buttonIndex,ButtonState.Pressed);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 处理状态报告事件
|
|
/// </summary>
|
|
private void HandleStatusReport(LeegKeyMsgStatus msg)
|
|
{
|
|
// 状态报告表示设备在线
|
|
UpdateState(ButtonBoxState.Online);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 处理日志事件
|
|
/// </summary>
|
|
private void HandleLogEvent(LeegKeyMsgLog msg)
|
|
{
|
|
// 可以根据日志内容更新状态
|
|
// 这里可以根据实际需求实现
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 设置按钮灯光
|
|
/// </summary>
|
|
/// <param name="buttonIndex">按钮索引</param>
|
|
/// <param name="rgb">RGB颜色值</param>
|
|
public void SetButtonLight(int buttonIndex, Rgb rgb)
|
|
{
|
|
lock (_syncLock)
|
|
{
|
|
if (!_isStarted || _device == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
_device.lightSet(rgb, buttonIndex);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Diagnosis.Log($"设置按钮灯光失败: {ExceptionFormatter.FormatEx(ex)}", "LeegButtonBox", true);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 控制IO输出
|
|
/// </summary>
|
|
/// <param name="content">IO控制内容</param>
|
|
public void ControlIO(IoctrlContent content)
|
|
{
|
|
lock (_syncLock)
|
|
{
|
|
if (!_isStarted || _device == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
_device.ioctrl(content);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Diagnosis.Log($"控制IO失败: {ExceptionFormatter.FormatEx(ex)}", "LeegButtonBox", true);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 析构函数,确保资源释放
|
|
/// </summary>
|
|
~LeegButtonBox()
|
|
{
|
|
Disconnect();
|
|
}
|
|
}
|
|
}
|