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;
}
}
}