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