185 lines
7.1 KiB
C#
185 lines
7.1 KiB
C#
|
||
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);
|
||
}
|
||
}
|
||
} |