IHardwareAccessLayer.cs 3.9 KB

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