using ActiveProtect.SimulationEnvironment; using System; namespace ActiveProtect.Models { /// /// 激光告警器类,用于检测激光照射并发出警报 /// public class LaserWarner : SimulationElement { /// /// 是否正在发出警报 /// public bool IsAlarming { get; private set; } /// /// 警报持续时间(秒) /// private readonly double alarmDuration; /// /// 当前警报计时器 /// private double alarmTimer = 0; /// /// 被监视实体的ID /// public string MonitoredEntityId { get; private set; } /// /// 构造函数 /// /// 激光告警器ID /// 初始位置 /// 初始朝向 /// 仿真管理器 /// 被监视实体的ID /// 激光告警器配置 public LaserWarner(string id, Vector3D position, Orientation orientation, ISimulationManager simulationManager, string monitoredEntityId, LaserWarnerConfig config) : base(id, position, orientation, 0, simulationManager) { MonitoredEntityId = monitoredEntityId; IsAlarming = false; alarmDuration = config.AlarmDuration; SimulationManager.SubscribeToEvent(OnLaserIlluminationStart); SimulationManager.SubscribeToEvent(OnLaserIlluminationStop); } /// /// 更新激光告警器状态 /// /// 时间步长 public override void Update(double deltaTime) { if (!IsActive) return; var tank = SimulationManager.GetEntityById(MonitoredEntityId) as Tank; if (tank != null) { Position = tank.Position; Orientation = tank.Orientation; } if (IsAlarming) { alarmTimer += deltaTime; if (alarmTimer >= alarmDuration) { StopAlarm(); } } } /// /// 处理激光照射事件 /// /// 激光照射事件 private void OnLaserIlluminationStart(LaserIlluminationStartEvent evt) { if (evt?.Target != null && evt.Target.Id == MonitoredEntityId) { TriggerAlarm(); } } /// /// 处理激光照射停止事件 /// /// 激光照射停止事件 private void OnLaserIlluminationStop(LaserIlluminationStopEvent evt) { if (evt?.Target != null && evt.Target.Id == MonitoredEntityId) { StopAlarm(); } } /// /// 触发警报 /// public void TriggerAlarm() { if (!IsAlarming) { IsAlarming = true; alarmTimer = 0; PublishEvent(new LaserWarnerAlarmEvent() { TargetId = MonitoredEntityId }); Console.WriteLine($"激光告警器 {Id} 发出警报!"); } } /// /// 停止警报 /// public void StopAlarm() { if (IsAlarming) { IsAlarming = false; alarmTimer = 0; PublishEvent(new LaserWarnerAlarmStopEvent() { TargetId = MonitoredEntityId }); Console.WriteLine($"激光告警器 {Id} 停止警报"); } } /// /// 获取激光告警器状态信息 /// /// 状态信息字符串 public override string GetStatus() { return $"激光告警器 {Id}:\n" + $" 监视实体: {MonitoredEntityId}\n" + $" 警报状态: {(IsAlarming ? "警报中" : "正常")}\n" + $" 警报持续时间: {(IsAlarming ? alarmTimer : 0):F2}/{alarmDuration:F2}"; } /// /// 激活激光告警器 /// public override void Activate() { base.Activate(); SimulationManager.SubscribeToEvent(OnLaserIlluminationStart); SimulationManager.SubscribeToEvent(OnLaserIlluminationStop); } /// /// 停用激光告警器 /// public override void Deactivate() { base.Deactivate(); SimulationManager.UnsubscribeFromEvent(OnLaserIlluminationStart); SimulationManager.UnsubscribeFromEvent(OnLaserIlluminationStop); } } }