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(); } } }