KCSLightChannel.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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. /// <summary>
  9. /// 表示单个 KCS 灯光通道的封装,用于读取/设置通道亮度并维护本地状态缓存。
  10. /// 与底层 <see cref="KCSLightController"/> 交互以执行实际的硬件操作。
  11. /// </summary>
  12. public class KCSLightChannel : ILightChannel
  13. {
  14. /// <summary>
  15. /// 对应的控制器实例,用于执行底层 IO 操作。由构造函数注入。
  16. /// </summary>
  17. private readonly KCSLightController _controller;
  18. /// <summary>
  19. /// 本地缓存的亮度值,范围 0-255。
  20. /// </summary>
  21. private int _brightness;
  22. /// <summary>
  23. /// 本地缓存的开/关状态,基于 <see cref="_brightness"/> 判定(>0 为开)。
  24. /// </summary>
  25. private bool _isOn;
  26. /// <summary>
  27. /// 通道索引(只读),对应控制器中的通道序号(从 0 开始)。
  28. /// </summary>
  29. public int ChannelIndex { get; }
  30. /// <summary>
  31. /// 通道名称(可读写),用于 UI 或日志显示。
  32. /// 默认为 "Channel {index + 1}"。
  33. /// </summary>
  34. public string ChannelName { get; set; }
  35. /// <summary>
  36. /// 当前本地缓存的亮度值(0-255)。
  37. /// 注意:此值可能不是实时的硬件状态,若需最新值请调用 <see cref="GetBrightnessAsync"/>。
  38. /// </summary>
  39. public int Brightness => _brightness;
  40. /// <summary>
  41. /// 当前本地缓存的开/关状态。若需实时状态请调用 <see cref="GetStatusAsync"/>。
  42. /// </summary>
  43. public bool IsOn => _isOn;
  44. /// <summary>
  45. /// 内部访问器,返回当前缓存亮度(供同程序集使用)。
  46. /// </summary>
  47. internal int CurrentBrightness => _brightness;
  48. /// <summary>
  49. /// 使用指定的通道索引和控制器实例创建一个新的 <see cref="KCSLightChannel"/>。
  50. /// </summary>
  51. /// <param name="index">通道索引(从 0 开始)。</param>
  52. /// <param name="controller">用于与硬件交互的 <see cref="KCSLightController"/> 实例,不能为空。</param>
  53. /// <exception cref="ArgumentNullException">当 <paramref name="controller"/> 为 null 时抛出。</exception>
  54. public KCSLightChannel(int index, KCSLightController controller)
  55. {
  56. if (controller == null)
  57. throw new ArgumentNullException(nameof(controller));
  58. ChannelIndex = index;
  59. ChannelName = $"Channel {index + 1}";
  60. _controller = controller;
  61. }
  62. /// <summary>
  63. /// 异步设置通道亮度(0-255)。
  64. /// 如果设置成功,将更新本地缓存的亮度与开/关状态。
  65. /// </summary>
  66. /// <param name="brightness">目标亮度,范围 0-255。</param>
  67. /// <returns>如果控制器成功应用了亮度返回 true,否则返回 false。</returns>
  68. /// <exception cref="ArgumentOutOfRangeException">当 <paramref name="brightness"/> 不在 0-255 范围内时抛出。</exception>
  69. public async Task<bool> SetBrightnessAsync(int brightness)
  70. {
  71. if (brightness < 0 || brightness > 255)
  72. throw new ArgumentOutOfRangeException(nameof(brightness));
  73. // 向控制器请求设置亮度,控制器负责具体的通信/协议实现。
  74. var result = await _controller.SetChannelBrightnessInternal(ChannelIndex, brightness);
  75. if (result)
  76. {
  77. // 仅在控制器确认成功后更新本地缓存状态。
  78. _brightness = brightness;
  79. _isOn = brightness > 0;
  80. }
  81. return result;
  82. }
  83. /// <summary>
  84. /// 异步开启通道。如果当前有缓存亮度且大于 0,则使用该亮度;否则使用默认亮度 100。
  85. /// 该方法会调用 <see cref="SetBrightnessAsync"/> 并返回控制器操作结果。
  86. /// </summary>
  87. /// <returns>如果成功开启返回 true,否则返回 false。</returns>
  88. public async Task<bool> TurnOnAsync()
  89. {
  90. // 若有缓存亮度且大于 0,则恢复该亮度;否则使用默认亮度 100。
  91. return await SetBrightnessAsync(_brightness > 0 ? _brightness : 100);
  92. }
  93. /// <summary>
  94. /// 异步关闭通道(将亮度设置为 0)。
  95. /// </summary>
  96. /// <returns>如果成功关闭返回 true,否则返回 false。</returns>
  97. public async Task<bool> TurnOffAsync()
  98. {
  99. return await SetBrightnessAsync(0);
  100. }
  101. /// <summary>
  102. /// 异步从控制器获取当前通道亮度并更新本地缓存。
  103. /// </summary>
  104. /// <returns>读取到的亮度值(0-255)。</returns>
  105. public async Task<int> GetBrightnessAsync()
  106. {
  107. // 从控制器读取最新亮度值并更新本地缓存与开/关状态。
  108. _brightness = await _controller.GetChannelBrightnessInternal(ChannelIndex);
  109. _isOn = _brightness > 0;
  110. return _brightness;
  111. }
  112. /// <summary>
  113. /// 异步获取当前通道开/关状态。
  114. /// 该方法会触发一次亮度读取以确保状态是最新的。
  115. /// </summary>
  116. /// <returns>如果通道处于开启状态返回 true,否则返回 false。</returns>
  117. public async Task<bool> GetStatusAsync()
  118. {
  119. await GetBrightnessAsync();
  120. return _isOn;
  121. }
  122. }
  123. }