using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TeamAAS_VP.Core.Lights { public class KCSLightController : LightControllerBase { private readonly ICommunicationProtocol _protocol; private readonly Encoding _encoding; public KCSLightController(int id, ICommunicationProtocol protocol,int channelCount) : base(id, channelCount) { _protocol = protocol; _encoding = Encoding.ASCII; } protected override ILightChannel CreateChannel(int index) { return new KCSLightChannel(index, this); } public override async Task ConnectAsync() { var connected = await _protocol.ConnectAsync(); if (connected) { IsConnected = true; await InitializeAsync(); } return connected; } public override async Task DisconnectAsync() { await _protocol.DisconnectAsync(); IsConnected = false; } public override async Task InitializeAsync() { try { // 初始化操作 await GetChannelBrightnessInternal(0); // 测试通信 return true; } catch { return false; } } public override async Task TurnOnAllAsync() { StringBuilder commandBuilder = new StringBuilder("S"); for (int i = 0; i < ChannelCount; i++) { var channel = (KCSLightChannel)ChannelsInternal[i]; commandBuilder.Append(channel.CurrentBrightness.ToString("D3")); commandBuilder.Append("T"); } commandBuilder.Append("C#"); var response = await SendCommandAsync(commandBuilder.ToString()); return response?.Trim() == "!"; } public override async Task TurnOffAllAsync() { StringBuilder commandBuilder = new StringBuilder("S"); for (int i = 0; i < ChannelCount; i++) { commandBuilder.Append("000"); commandBuilder.Append("F"); } commandBuilder.Append("C#"); var response = await SendCommandAsync(commandBuilder.ToString()); return response?.Trim() == "!"; } internal async Task SendCommandAsync(string command) { var data = _encoding.GetBytes(command); var response = await _protocol.SendAndReceiveAsync(data, 1000); return _encoding.GetString(response); } internal async Task GetChannelBrightnessInternal(int channelIndex) { string command = $"S{(char)('A' + channelIndex)}#"; var response = await SendCommandAsync(command); if (response.Length == 5) { string valueStr = response.Substring(2, 3); if (int.TryParse(valueStr, out int brightness)) { return brightness; } } return 0; } internal async Task SetChannelBrightnessInternal(int channelIndex, int brightness) { string command = $"S{(char)('A' + channelIndex)}0{brightness.ToString("D3")}#"; var response = await SendCommandAsync(command); return response?.Trim() == ((char)('A' + channelIndex)).ToString(); } } }