ActiveProtect/src/Models/Jammer/InfraredJammer.cs

185 lines
7.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using ActiveProtect.Simulation;
using ActiveProtect.Utility;
namespace ActiveProtect.Models
{
/// <summary>
/// 红外干扰器类,用于对抗红外制导武器
/// </summary>
/// <remarks>
/// 该类实现了针对红外制导武器的主动干扰功能:
/// - 支持特定波长范围的红外干扰
/// - 自动响应红外告警器的告警信号
/// - 提供可调节的干扰功率输出
/// - 实现干扰功率的动态调整
/// - 支持自动冷却管理
/// </remarks>
public class InfraredJammer : JammerBase
{
/// <summary>
/// 获取干扰波长范围
/// </summary>
/// <value>
/// 一个元组,包含最小和最大波长值
/// Min最小波长单位微米(μm)
/// Max最大波长单位微米(μm)
/// </value>
private readonly (double Min, double Max) wavelengthRange;
/// <summary>
/// 初始化红外干扰器的新实例
/// </summary>
/// <param name="id">红外干扰器的唯一标识符</param>
/// <param name="position">干扰器的初始位置</param>
/// <param name="orientation">干扰器的初始朝向</param>
/// <param name="manager">仿真管理器实例</param>
/// <param name="tankId">所属坦克的ID</param>
/// <param name="maxJammingPower">最大干扰功率,单位:瓦特(W)</param>
/// <param name="initialJammingPower">初始干扰功率,单位:瓦特(W)</param>
/// <param name="powerIncreaseRate">功率增长率,单位:瓦特/秒(W/s)</param>
/// <param name="maxCooldownTime">最大冷却时间,单位:秒(s)</param>
/// <param name="wavelengthRange">干扰波长范围,单位:微米(μm)</param>
/// <remarks>
/// 构造函数完成以下初始化工作:
/// 1. 调用基类构造函数设置基本参数
/// 2. 设置红外干扰波长范围
/// 3. 订阅红外告警器的告警事件
/// </remarks>
public InfraredJammer(string id, Vector3D position, Orientation orientation,
ISimulationManager manager, string tankId, double maxJammingPower,
double initialJammingPower, double powerIncreaseRate, double maxCooldownTime,
(double Min, double Max) wavelengthRange)
: base(id, position, orientation, manager, tankId, maxJammingPower,
initialJammingPower, powerIncreaseRate, maxCooldownTime)
{
this.wavelengthRange = wavelengthRange;
SimulationManager.SubscribeToEvent<InfraredWarnerAlarmEvent>(OnInfraredWarnerAlarm);
SimulationManager.SubscribeToEvent<InfraredWarnerAlarmStopEvent>(OnInfraredWarnerAlarmStop);
}
/// <summary>
/// 处理来自红外告警器的告警事件
/// </summary>
/// <param name="evt">红外告警事件参数</param>
/// <remarks>
/// 当收到针对本装甲车的红外告警时,自动启动干扰
/// </remarks>
private void OnInfraredWarnerAlarm(InfraredWarnerAlarmEvent evt)
{
if (evt?.TargetId == TankId)
{
StartJamming();
}
}
/// <summary>
/// 处理来自红外告警器的告警停止事件
/// </summary>
/// <param name="evt">红外告警停止事件参数</param>
/// <remarks>
/// 当收到告警停止信号时,停止干扰并进入冷却状态
/// </remarks>
private void OnInfraredWarnerAlarmStop(InfraredWarnerAlarmStopEvent evt)
{
if (evt?.TargetId == TankId)
{
StopJamming();
}
}
/// <summary>
/// 更新干扰功率
/// </summary>
/// <param name="deltaTime">距离上次更新的时间间隔(秒)</param>
/// <remarks>
/// 在干扰状态下,按照设定的增长率逐步提升功率,直到达到最大功率
/// </remarks>
protected override void UpdateJammingPower(double deltaTime)
{
if (IsJamming)
{
CurrentJammingPower = Math.Min(MaxJammingPower,
CurrentJammingPower + PowerIncreaseRate * deltaTime);
}
}
/// <summary>
/// 发布红外干扰事件
/// </summary>
/// <remarks>
/// 当处于干扰状态时,向仿真系统发布红外干扰事件,包含:
/// - 发送者ID
/// - 时间戳
/// - 目标ID
/// - 当前干扰功率
/// - 干扰波长范围
/// </remarks>
protected override void PublishJammingEvent()
{
if (IsJamming)
{
SimulationManager.PublishEvent(new InfraredJammingEvent
{
SenderId = Id,
Timestamp = SimulationManager.CurrentTime,
TargetId = TankId,
JammingPower = CurrentJammingPower,
WavelengthMin = wavelengthRange.Min,
WavelengthMax = wavelengthRange.Max
});
}
}
/// <summary>
/// 获取红外干扰器的当前状态信息
/// </summary>
/// <returns>
/// 返回包含以下信息的状态描述字符串:
/// - 干扰器ID和类型
/// - 当前干扰状态
/// - 当前功率和最大功率
/// - 当前冷却时间和最大冷却时间
/// - 干扰波长范围
/// </returns>
public override string GetJammingStatus()
{
return $"红外干扰器 {Id}:\n" +
$" 干扰状态: {(IsJamming ? "" : "")}\n" +
$" 当前功率: {CurrentJammingPower:F2}/{MaxJammingPower:F2}\n" +
$" 冷却时间: {CurrentCooldownTime:F2}/{MaxCooldownTime:F2}\n" +
$" 波长范围: {wavelengthRange.Min:F2}-{wavelengthRange.Max:F2}微米";
}
/// <summary>
/// 激活红外干扰器
/// </summary>
/// <remarks>
/// 激活时执行以下操作:
/// 1. 调用基类的激活方法
/// 2. 重新订阅红外告警事件
/// </remarks>
public override void Activate()
{
base.Activate();
SimulationManager.SubscribeToEvent<InfraredWarnerAlarmEvent>(OnInfraredWarnerAlarm);
SimulationManager.SubscribeToEvent<InfraredWarnerAlarmStopEvent>(OnInfraredWarnerAlarmStop);
}
/// <summary>
/// 停用红外干扰器
/// </summary>
/// <remarks>
/// 停用时执行以下操作:
/// 1. 调用基类的停用方法
/// 2. 取消订阅红外告警事件
/// </remarks>
public override void Deactivate()
{
base.Deactivate();
SimulationManager.UnsubscribeFromEvent<InfraredWarnerAlarmEvent>(OnInfraredWarnerAlarm);
SimulationManager.UnsubscribeFromEvent<InfraredWarnerAlarmStopEvent>(OnInfraredWarnerAlarmStop);
}
}
}