162 lines
5.7 KiB
C#
162 lines
5.7 KiB
C#
|
|
using System;
|
|
using ActiveProtect.Simulation;
|
|
using ActiveProtect.Utility;
|
|
|
|
namespace ActiveProtect.Models
|
|
{
|
|
/// <summary>
|
|
/// 紫外告警器类,用于检测紫外辐射并发出警报
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 该类实现了以下功能:
|
|
/// - 检测特定波长范围内的紫外辐射
|
|
/// - 根据设定的灵敏度阈值判断是否需要告警
|
|
/// - 自动处理告警持续时间
|
|
/// - 发布告警事件供其他系统响应
|
|
/// - 支持实时状态监控
|
|
/// </remarks>
|
|
public class UltravioletWarner : WarnerBase
|
|
{
|
|
/// <summary>
|
|
/// 获取告警灵敏度阈值
|
|
/// </summary>
|
|
/// <value>
|
|
/// 触发告警的最小紫外辐射强度阈值
|
|
/// 单位:瓦特/平方米(W/m²)
|
|
/// </value>
|
|
private readonly double _sensitivityThreshold;
|
|
|
|
/// <summary>
|
|
/// 获取最小检测波长
|
|
/// </summary>
|
|
/// <value>
|
|
/// 告警器可以检测的最小紫外波长
|
|
/// 单位:纳米(nm)
|
|
/// </value>
|
|
private readonly double _wavelengthMin;
|
|
|
|
/// <summary>
|
|
/// 获取最大检测波长
|
|
/// </summary>
|
|
/// <value>
|
|
/// 告警器可以检测的最大紫外波长
|
|
/// 单位:纳米(nm)
|
|
/// </value>
|
|
private readonly double _wavelengthMax;
|
|
|
|
/// <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="config">紫外告警器配置参数</param>
|
|
/// <remarks>
|
|
/// 构造函数完成以下初始化工作:
|
|
/// 1. 调用基类构造函数设置基本参数
|
|
/// 2. 设置告警器的检测参数
|
|
/// 3. 订阅紫外检测事件
|
|
/// </remarks>
|
|
public UltravioletWarner(string id, Vector3D position, Orientation orientation,
|
|
ISimulationManager manager, string tankId, UltravioletWarnerConfig config)
|
|
: base(id, position, orientation, manager, tankId, config.SensitivityThreshold,
|
|
(config.WavelengthMin, config.WavelengthMax), config.AlarmDuration)
|
|
{
|
|
_sensitivityThreshold = config.SensitivityThreshold;
|
|
_wavelengthMin = config.WavelengthMin;
|
|
_wavelengthMax = config.WavelengthMax;
|
|
SimulationManager.SubscribeToEvent<UltravioletDetectionEvent>(OnUltravioletDetection);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 处理紫外检测事件
|
|
/// </summary>
|
|
/// <param name="evt">紫外检测事件参数</param>
|
|
/// <remarks>
|
|
/// 当满足以下条件时触发告警:
|
|
/// 1. 检测到的目标ID匹配
|
|
/// 2. 辐射强度超过灵敏度阈值
|
|
/// </remarks>
|
|
private void OnUltravioletDetection(UltravioletDetectionEvent evt)
|
|
{
|
|
if (evt?.TargetId == TankId && evt.Intensity >= _sensitivityThreshold)
|
|
{
|
|
StartWarning();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取紫外告警器的当前状态信息
|
|
/// </summary>
|
|
/// <returns>
|
|
/// 返回包含以下信息的状态描述字符串:
|
|
/// - 告警器ID和类型
|
|
/// - 当前告警状态
|
|
/// - 告警持续时间
|
|
/// - 检测波长范围
|
|
/// </returns>
|
|
public override string GetWarningStatus()
|
|
{
|
|
return $"紫外告警器 {Id}:\n" +
|
|
$" 告警状态: {(IsWarning ? "告警中" : "正常")}\n" +
|
|
$" 告警持续时间: {CurrentWarningTime:F2}/{WarningDuration:F2}\n" +
|
|
$" 波长范围: {_wavelengthMin:F2}-{_wavelengthMax:F2}纳米";
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新紫外告警器的状态
|
|
/// </summary>
|
|
/// <param name="deltaTime">距离上次更新的时间间隔(秒)</param>
|
|
/// <remarks>
|
|
/// 更新过程包括:
|
|
/// 1. 调用基类的更新方法处理基本状态
|
|
/// 2. 在告警状态下发布告警事件
|
|
/// </remarks>
|
|
public override void Update(double deltaTime)
|
|
{
|
|
base.Update(deltaTime);
|
|
|
|
if (IsWarning && IsActive)
|
|
{
|
|
// 发布告警事件
|
|
SimulationManager.PublishEvent(new UltravioletWarnerAlarmEvent
|
|
{
|
|
SenderId = Id,
|
|
Timestamp = SimulationManager.CurrentTime,
|
|
TargetId = TankId
|
|
});
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 激活紫外告警器
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 激活时执行以下操作:
|
|
/// 1. 调用基类的激活方法
|
|
/// 2. 订阅紫外检测事件
|
|
/// </remarks>
|
|
public override void Activate()
|
|
{
|
|
base.Activate();
|
|
SimulationManager.SubscribeToEvent<UltravioletDetectionEvent>(OnUltravioletDetection);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 停用紫外告警器
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 停用时执行以下操作:
|
|
/// 1. 调用基类的停用方法
|
|
/// 2. 取消订阅紫外检测事件
|
|
/// </remarks>
|
|
public override void Deactivate()
|
|
{
|
|
base.Deactivate();
|
|
SimulationManager.UnsubscribeFromEvent<UltravioletDetectionEvent>(OnUltravioletDetection);
|
|
}
|
|
}
|
|
} |