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
{
///
/// LeegKey设备实例
///
private LeegKeyDevice _device;
///
/// 同步锁
///
private readonly object _syncLock = new object();
///
/// 是否已启动
///
private bool _isStarted = false;
///
/// 连接按钮盒
///
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;
}
}
}
///
/// 断开连接
///
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}");
}
}
}
///
/// LeegKey事件回调
///
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}");
}
}
///
/// 处理按键按下事件
///
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;
}
}
///
/// 处理状态报告事件
///
private void HandleStatusReport(LeegKeyMsgStatus msg)
{
// 状态报告表示设备在线
UpdateState(ButtonBoxState.Online);
}
///
/// 处理日志事件
///
private void HandleLogEvent(LeegKeyMsgLog msg)
{
// 可以根据日志内容更新状态
// 这里可以根据实际需求实现
}
///
/// 设置按钮灯光
///
/// 按钮索引
/// RGB颜色值
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);
}
}
}
///
/// 控制IO输出
///
/// IO控制内容
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);
}
}
}
///
/// 析构函数,确保资源释放
///
~LeegButtonBox()
{
Disconnect();
}
}
}