KCSLightProtocol.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System;
  2. using System.Text;
  3. namespace TeamAAS.Communication.LightSources
  4. {
  5. /// <summary>
  6. /// KCS 光源协议命令构造器
  7. /// 适用于 KDC-12V60W-4T / KDC3-24V300W-8T 等型号
  8. /// </summary>
  9. public static class KCSLightProtocol
  10. {
  11. /// <summary>
  12. /// 读取指定通道亮度
  13. /// KDC4: SA# KDC8: SRA#
  14. /// </summary>
  15. public static string BuildReadCommand(int channelIndex, bool useSR = false)
  16. {
  17. char ch = (char)('A' + channelIndex);
  18. return useSR ? $"SR{ch}#" : $"S{ch}#";
  19. }
  20. /// <summary>
  21. /// 设置指定通道亮度
  22. /// SA0120# (通道A, 亮度120)
  23. /// </summary>
  24. public static string BuildSetBrightnessCommand(int channelIndex, int brightness)
  25. {
  26. char ch = (char)('A' + channelIndex);
  27. int br = Math.Max(0, Math.Min(999, brightness));
  28. return $"S{ch}0{br.ToString("D3")}#";
  29. }
  30. /// <summary>
  31. /// 全开所有通道(使用当前亮度值)
  32. /// S{DDD}T{DDD}T...C#
  33. /// </summary>
  34. public static string BuildTurnOnAllCommand(int channelCount, int defaultBrightness = 120)
  35. {
  36. var sb = new StringBuilder("S");
  37. int br = Math.Max(0, Math.Min(999, defaultBrightness));
  38. for (int i = 0; i < channelCount; i++)
  39. {
  40. sb.Append(br.ToString("D3"));
  41. sb.Append("T");
  42. }
  43. sb.Append("C#");
  44. return sb.ToString();
  45. }
  46. /// <summary>
  47. /// 全关所有通道
  48. /// S000F000F...C#
  49. /// </summary>
  50. public static string BuildTurnOffAllCommand(int channelCount)
  51. {
  52. var sb = new StringBuilder("S");
  53. for (int i = 0; i < channelCount; i++)
  54. {
  55. sb.Append("000");
  56. sb.Append("F");
  57. }
  58. sb.Append("C#");
  59. return sb.ToString();
  60. }
  61. /// <summary>
  62. /// 解析读取响应,返回亮度值
  63. /// 响应格式: ?XDDD (5字符) 或 7字符
  64. /// </summary>
  65. public static int ParseReadResponse(string response)
  66. {
  67. if (string.IsNullOrEmpty(response)) return 0;
  68. try
  69. {
  70. if (response.Length == 5)
  71. {
  72. string val = response.Substring(2, 3);
  73. if (int.TryParse(val, out int br)) return br;
  74. }
  75. else if (response.Length == 7)
  76. {
  77. string val = response.Substring(3, 3);
  78. if (int.TryParse(val, out int br)) return br;
  79. }
  80. }
  81. catch { }
  82. return 0;
  83. }
  84. /// <summary>
  85. /// 验证设置响应是否成功
  86. /// 成功: 返回通道字母 (如 "A") 或 "!"
  87. /// </summary>
  88. public static bool VerifySetResponse(string response, int channelIndex)
  89. {
  90. if (string.IsNullOrEmpty(response)) return false;
  91. string trimmed = response.Trim();
  92. if (trimmed == "!") return true;
  93. return trimmed == ((char)('A' + channelIndex)).ToString();
  94. }
  95. /// <summary>
  96. /// 验证全开/全关响应
  97. /// 成功: 返回 "!"
  98. /// </summary>
  99. public static bool VerifyAllResponse(string response)
  100. {
  101. return !string.IsNullOrEmpty(response) && response.Trim() == "!";
  102. }
  103. }
  104. }