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