using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TeamAAS_VP.Core.Lights { /// /// 表示单个 KCS 灯光通道的封装,用于读取/设置通道亮度并维护本地状态缓存。 /// 与底层 交互以执行实际的硬件操作。 /// public class KCSLightChannel : ILightChannel { /// /// 对应的控制器实例,用于执行底层 IO 操作。由构造函数注入。 /// private readonly KCSLightController _controller; /// /// 本地缓存的亮度值,范围 0-255。 /// private int _brightness; /// /// 本地缓存的开/关状态,基于 判定(>0 为开)。 /// private bool _isOn; /// /// 通道索引(只读),对应控制器中的通道序号(从 0 开始)。 /// public int ChannelIndex { get; } /// /// 通道名称(可读写),用于 UI 或日志显示。 /// 默认为 "Channel {index + 1}"。 /// public string ChannelName { get; set; } /// /// 当前本地缓存的亮度值(0-255)。 /// 注意:此值可能不是实时的硬件状态,若需最新值请调用 。 /// public int Brightness => _brightness; /// /// 当前本地缓存的开/关状态。若需实时状态请调用 。 /// public bool IsOn => _isOn; /// /// 内部访问器,返回当前缓存亮度(供同程序集使用)。 /// internal int CurrentBrightness => _brightness; /// /// 使用指定的通道索引和控制器实例创建一个新的 。 /// /// 通道索引(从 0 开始)。 /// 用于与硬件交互的 实例,不能为空。 /// 为 null 时抛出。 /// 通道名称。 public KCSLightChannel(int index, KCSLightController controller,string channelName) { if (controller == null) throw new ArgumentNullException(nameof(controller)); ChannelIndex = index; ChannelName = channelName; _controller = controller; } /// /// 异步设置通道亮度(0-255)。 /// 如果设置成功,将更新本地缓存的亮度与开/关状态。 /// /// 目标亮度,范围 0-255。 /// 如果控制器成功应用了亮度返回 true,否则返回 false。 /// 不在 0-255 范围内时抛出。 public async Task SetBrightnessAsync(int brightness) { if (brightness < 0 || brightness > 255) throw new ArgumentOutOfRangeException(nameof(brightness)); // 向控制器请求设置亮度,控制器负责具体的通信/协议实现。 var result = await _controller.SetChannelBrightnessInternal(ChannelIndex, brightness); if (result) { // 仅在控制器确认成功后更新本地缓存状态。 _brightness = brightness; _isOn = brightness > 0; } return result; } /// /// 异步开启通道。如果当前有缓存亮度且大于 0,则使用该亮度;否则使用默认亮度 100。 /// 该方法会调用 并返回控制器操作结果。 /// /// 如果成功开启返回 true,否则返回 false。 public async Task TurnOnAsync() { // 若有缓存亮度且大于 0,则恢复该亮度;否则使用默认亮度 100。 return await SetBrightnessAsync(_brightness > 0 ? _brightness : 100); } /// /// 异步关闭通道(将亮度设置为 0)。 /// /// 如果成功关闭返回 true,否则返回 false。 public async Task TurnOffAsync() { return await SetBrightnessAsync(0); } /// /// 异步从控制器获取当前通道亮度并更新本地缓存。 /// /// 读取到的亮度值(0-255)。 public async Task GetBrightnessAsync() { // 从控制器读取最新亮度值并更新本地缓存与开/关状态。 _brightness = await _controller.GetChannelBrightnessInternal(ChannelIndex); _isOn = _brightness > 0; return _brightness; } /// /// 异步获取当前通道开/关状态。 /// 该方法会触发一次亮度读取以确保状态是最新的。 /// /// 如果通道处于开启状态返回 true,否则返回 false。 public async Task GetStatusAsync() { await GetBrightnessAsync(); return _isOn; } } }