using System; using System.Collections.Generic; namespace IvfTl.Hardware { /// /// 统一硬件访问层(D2)。全进程唯一持有每个 COM 口与每台相机句柄。 /// operate 调试 / control 采集 / 自动对焦三方都通过本层借用,不再各自 new ComBin/SerialPort/Camera。 /// 实现为单例(进程级),内部维护 portName→ISerialChannel、cameraIndex→ICamera 字典(字典缓存 + 锁)。 /// 接口签名权威:项目文档/需求文档/13-统一硬件访问层接口定义.md §3.1。 /// public interface IHardwareAccessLayer { /// 开机设备发现:枚举相机 0..9 读 SN、扫 COM 握手得 houseSn+CCDSN、按 CCDSN 配对。 /// 复刻 DeviceScanner.ScanAll / control SerialBin.UpdataCamera+Start。index/COM 每次开机可变,必须现场重扫,禁止写死。 IReadOnlyList ScanDevices(); /// 取(或惰性创建)某 COM 口的唯一串口通道持有者。重复调用返回同一实例。 ISerialChannel GetSerial(string portName); /// 取(或惰性创建)某 COM 口的唯一串口通道持有者,首次创建时关联 houseId(仅用于日志)。 /// 已存在则忽略 houseId 返回缓存实例(唯一持有,杜绝同口重复 Open)。 ISerialChannel GetSerial(int houseId, string portName); /// 取(或惰性创建)某相机 index 的唯一相机持有者。重复调用返回同一实例。 ICamera GetCamera(int cameraIndex); /// 取(或惰性创建)某相机 index 的唯一相机持有者,首次创建时用指定分辨率/曝光。 /// 已存在则忽略入参返回缓存实例(唯一持有)。采集/调试端按各舱实际参数取相机用此重载。 ICamera GetCamera(int cameraIndex, int width, int height, int exposure); /// 按舱取设备句柄组(串口 + 配对相机),调试/对焦/采集统一从这里拿。 IHouseHandle GetHouse(int houseSn); /// 取某舱的借用闸门。前台(调试/对焦)优先于后台(采集)。 IHouseGate GetHouseGate(int houseSn); /// 全进程统一相机原生调用锁(替代三套各自 static locker)。 ICameraGate CameraGate { get; } /// 采集端补登记一个舱的设备信息(houseSn→port→相机 index)到 _houses。 /// ScanDevices()(登录后由 MainWindow 调)现场枚举若漏扫某舱(握手失败),采集端用服务器配置补登记, /// 使该舱按舱借用 GetHouse/GetHouseGate 仍可用(T1.4 双保险;已被 ScanDevices 发现的舱不覆盖)。 void RegisterHouse(int houseSn, string portName, int ccdIndex); /// 统一关闭路径:关闭并释放所有串口/相机句柄,杜绝句柄泄漏(替代各调试页自己的 ClosePort/UnInit)。 void ShutdownAll(); } /// 设备发现结果(对应 af DeviceScanner 的 HouseDevice)。 public sealed class HouseDeviceInfo { public int HouseSn { get; init; } // 握手返回的舱号 public string PortName { get; init; } // COM 口 public string CcdSn { get; init; } // 该舱 EEPROM 记录的相机序列号 public int CcdIndex { get; init; } = -1; // 配对到的相机枚举 index(-1=未配对) } /// 一个舱的句柄聚合:串口 + 相机,外加该舱的借用闸门(见 Concurrency.cs)。 public interface IHouseHandle { int HouseSn { get; } ISerialChannel Serial { get; } ICamera Camera { get; } IHouseGate Gate { get; } } }