using System; namespace StandardScene { /// /// 磁条管控区放行判定结果。由信号插件「磁条交管进程」填写,Mag2Car 在 StartStop=12 停稳后消费。 /// public sealed class MagControlReleaseDecision { /// 当前触发点在交管表里有启用规则。false 时 Mag2Car 回退地图 Fass2_ControlArea 字段。 public bool RuleFound { get; set; } public bool CanRelease { get; set; } public string AreaId { get; set; } = string.Empty; public int Capacity { get; set; } = 1; public int OthersInArea { get; set; } /// 放行后写入本车报文的 StartStop,通常 11(管控启动)或 1(过站)。 public byte ReleaseStartStop { get; set; } = 11; public string Reason { get; set; } = string.Empty; } /// /// Mag2Car 与信号插件之间的管控放行钩子。不让 Magnetic / Signal 互相引用。 /// /// /// 磁条交管进程启动时 ,停止时 。 /// Mag2Car 在管控停止点调用 :有规则用表判定,没有则用地图字段。 /// public static class MagControlReleaseHook { private static readonly object Sync = new object(); private static object _owner; private static Func _check; /// 注册判定函数。 用于停止时只清自己的注册。 public static void Register(object owner, Func check) { if (owner == null) throw new ArgumentNullException(nameof(owner)); lock (Sync) { _owner = owner; _check = check; } } public static void Unregister(object owner) { if (owner == null) return; lock (Sync) { if (!ReferenceEquals(_owner, owner)) return; _owner = null; _check = null; } } /// /// 询问当前注册的交管进程。未注册返回 null;已注册但该触发点无规则时 /// 返回 = false。 /// public static MagControlReleaseDecision TryCheck(int carId, int triggerSiteId) { Func check; lock (Sync) check = _check; return check?.Invoke(carId, triggerSiteId); } } }