KCSLightController.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace TeamAAS_VP.Core.Lights
  7. {
  8. public class KCSLightController : LightControllerBase
  9. {
  10. private readonly ICommunicationProtocol _protocol;
  11. private readonly Encoding _encoding;
  12. public KCSLightController(int id, ICommunicationProtocol protocol,int channelCount)
  13. : base(id, channelCount)
  14. {
  15. _protocol = protocol;
  16. _encoding = Encoding.ASCII;
  17. }
  18. protected override ILightChannel CreateChannel(int index)
  19. {
  20. return new KCSLightChannel(index, this);
  21. }
  22. public override async Task<bool> ConnectAsync()
  23. {
  24. var connected = await _protocol.ConnectAsync();
  25. if (connected)
  26. {
  27. IsConnected = true;
  28. await InitializeAsync();
  29. }
  30. return connected;
  31. }
  32. public override async Task DisconnectAsync()
  33. {
  34. await _protocol.DisconnectAsync();
  35. IsConnected = false;
  36. }
  37. public override async Task<bool> InitializeAsync()
  38. {
  39. try
  40. {
  41. // 初始化操作
  42. await GetChannelBrightnessInternal(0); // 测试通信
  43. return true;
  44. }
  45. catch
  46. {
  47. return false;
  48. }
  49. }
  50. public override async Task<bool> TurnOnAllAsync()
  51. {
  52. StringBuilder commandBuilder = new StringBuilder("S");
  53. for (int i = 0; i < ChannelCount; i++)
  54. {
  55. var channel = (KCSLightChannel)ChannelsInternal[i];
  56. commandBuilder.Append(channel.CurrentBrightness.ToString("D3"));
  57. commandBuilder.Append("T");
  58. }
  59. commandBuilder.Append("C#");
  60. var response = await SendCommandAsync(commandBuilder.ToString());
  61. return response?.Trim() == "!";
  62. }
  63. public override async Task<bool> TurnOffAllAsync()
  64. {
  65. StringBuilder commandBuilder = new StringBuilder("S");
  66. for (int i = 0; i < ChannelCount; i++)
  67. {
  68. commandBuilder.Append("000");
  69. commandBuilder.Append("F");
  70. }
  71. commandBuilder.Append("C#");
  72. var response = await SendCommandAsync(commandBuilder.ToString());
  73. return response?.Trim() == "!";
  74. }
  75. internal async Task<string> SendCommandAsync(string command)
  76. {
  77. var data = _encoding.GetBytes(command);
  78. var response = await _protocol.SendAndReceiveAsync(data, 1000);
  79. return _encoding.GetString(response);
  80. }
  81. internal async Task<int> GetChannelBrightnessInternal(int channelIndex)
  82. {
  83. string command = $"S{(char)('A' + channelIndex)}#";
  84. var response = await SendCommandAsync(command);
  85. if (response.Length == 5)
  86. {
  87. string valueStr = response.Substring(2, 3);
  88. if (int.TryParse(valueStr, out int brightness))
  89. {
  90. return brightness;
  91. }
  92. }
  93. return 0;
  94. }
  95. internal async Task<bool> SetChannelBrightnessInternal(int channelIndex, int brightness)
  96. {
  97. string command = $"S{(char)('A' + channelIndex)}0{brightness.ToString("D3")}#";
  98. var response = await SendCommandAsync(command);
  99. return response?.Trim() == ((char)('A' + channelIndex)).ToString();
  100. }
  101. }
  102. }