using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TeamAAS_VP.Models.Lights; namespace TeamAAS_VP.Core.Lights { /// /// 光源控制器基类。 /// 提供通用的光源控制和通道管理能力,具体控制器应从此类继承并实现硬件相关逻辑。 /// public abstract class LightControllerBase : ILightController { /// /// 控制器唯一标识(只读)。 /// public int Id { get; } /// /// 控制器名称,可用于显示或日志记录。 /// public string Name { get; set; } /// /// 光源模型信息(只读),用于指示此控制器对应的光源类型或型号。 /// public LightModel Model { get; } /// /// 控制器支持的通道数量(只读)。 /// public int ChannelCount { get; } /// /// 控制器配置(只读)。 /// public LightControllerConfig Config { get; } /// /// 指示控制器当前是否与设备连接。派生类应在连接/断开时维护此状态。 /// public bool IsConnected { get; protected set; } /// /// 内部维护的通道列表(可变)。派生类或内部实现可通过此集合管理通道。 /// protected List ChannelsInternal { get; } /// /// 对外只读的通道集合,外部调用者只能读取,不可修改通道集合本身。 /// public IReadOnlyList Channels => ChannelsInternal; /// /// 构造函数:根据指定的 id 和通道数量初始化控制器实例并创建通道集合。 /// /// 控制器标识符。 /// 通道数量,必须为非负整数。 /// 控制器配置。 protected LightControllerBase(int id,int channelCount, LightControllerConfig config) { Id = id; ChannelCount = channelCount; ChannelsInternal = new List(); Config = config; InitializeChannels(); } /// /// 初始化通道集合,根据 调用 创建每个通道。 /// 私有方法,在构造期间调用以确保通道列表已准备就绪。 /// private void InitializeChannels() { for (int i = 0; i < ChannelCount; i++) { ChannelsInternal.Add(CreateChannel(i, Config.ChannelConfigs[i].Name)); } } /// /// 创建指定索引处的通道实例。 /// 派生类必须实现此方法以返回实际的 对象。 /// /// 通道索引(从 0 开始)。 /// 通道名称。 /// 新创建的 实例。 protected abstract ILightChannel CreateChannel(int index,string channelName); /// /// 异步连接到控制器对应的硬件或服务。 /// 在成功连接后,派生类应将 设置为 true。 /// /// 表示连接是否成功的任务(true 表示成功)。 public abstract Task ConnectAsync(); /// /// 异步断开与硬件或服务的连接。 /// 在断开后,派生类应将 设置为 false。 /// /// 表示断开操作完成的任务。 public abstract Task DisconnectAsync(); /// /// 异步初始化控制器(例如加载配置、检测硬件状态等)。 /// 在调用任何控制或通道相关操作前应先调用此方法。 /// /// 表示初始化是否成功的任务(true 表示成功)。 public abstract Task InitializeAsync(); /// /// 异步打开所有通道的光源。 /// 实现应保证在并发场景下的线程安全或在文档中说明限制。 /// /// 表示操作是否成功的任务(true 表示成功)。 public abstract Task TurnOnAllAsync(); /// /// 异步关闭所有通道的光源。 /// /// 表示操作是否成功的任务(true 表示成功)。 public abstract Task TurnOffAllAsync(); /// /// 释放托管资源的虚拟方法实现。 /// 派生类在覆盖时应调用 base.Dispose(disposing) 以确保基类资源被正确释放。 /// /// 若为 true,则同时释放托管资源;若为 false,仅释放非托管资源。 protected virtual void Dispose(bool disposing) { if (disposing) { foreach (var channel in ChannelsInternal) { (channel as IDisposable)?.Dispose(); } ChannelsInternal.Clear(); } } /// /// 释放当前实例占用的资源并通知垃圾回收器不再调用终结器。 /// 建议在不再使用控制器时显式调用此方法以尽早释放资源。 /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } } }