using System; namespace IvfTl.Hardware { /// 使用者身份,用于优先级与日志归因。 public enum HardwareUser { ControlCapture, OperateDebug, AutoFocus } /// /// 按舱借用闸门。同一舱同一时刻只有一个使用者持有 IHardwareLease。 /// 优先级/抢占策略: /// · OperateDebug / AutoFocus 是【前台显式操作】,优先级高于 ControlCapture【后台节拍采集】; /// · 申请前台借用时,HAL 通知 control 暂停该舱采集(PauseCapture),归还后恢复(ResumeCapture); /// · 同为前台的 Debug 与 AutoFocus 互斥排队(不可同时操作同一舱电机/相机)。 /// 接口签名权威:13 文档 §3.4。 /// public interface IHouseGate { int HouseSn { get; } /// 申请独占借用该舱(串口+相机)。阻塞直到拿到或超时。拿不到返回 null。 /// 拿到 lease 期间,HAL 已暂停其它使用者对本舱的访问。Dispose(lease) 即归还。 IHardwareLease Acquire(HardwareUser user, int timeoutMs = 30000); /// 尝试借用,不阻塞。拿不到立即返回 false。 bool TryAcquire(HardwareUser user, out IHardwareLease lease); /// 暂停 control 对本舱的后台采集(前台借用时由 HAL 调用;也可供宿主显式调)。 void PauseCapture(); void ResumeCapture(); /// 本舱采集是否处于暂停态(采集线程每节拍据此让路)。 bool IsCapturePaused { get; } /// 宿主注册采集暂停/恢复回调(control 采集线程订阅,前台借用时被通知挂起本舱)。 event Action OnPauseCapture; event Action OnResumeCapture; } /// 借用凭证。Dispose 即归还闸门并触发 ResumeCapture。务必 using 包裹。 public interface IHardwareLease : IDisposable { HardwareUser Owner { get; } ISerialChannel Serial { get; } // 借用期内安全独占 ICamera Camera { get; } } /// /// 全进程统一相机原生调用锁。替代现状 control/operate/af 各自的 static locker(三把不互斥的锁)。 /// 所有 ICamera 实现的 native 调用都必须经此锁串行化(mvcapi.dll 非线程安全,跨相机也走同一把锁)。 /// 接口签名权威:13 文档 §3.4。 /// public interface ICameraGate { /// 在全局相机锁内执行 native 操作。 T Invoke(Func nativeCall); void Invoke(Action nativeCall); } }