using ThreatSource.Jammable; using ThreatSource.Jammer; using ThreatSource.Simulation; namespace ThreatSource.Sensor { /// /// 定义传感器的基本接口,规范了所有传感器的通用功能 /// /// /// 该接口提供了传感器的基本功能规范: /// - 激活和停用控制 /// - 状态更新机制 /// - 数据采集接口 /// 是所有具体传感器实现的基础 /// public interface ISensor { /// /// 获取传感器采集的最新数据 /// /// 包含传感器测量结果的数据对象 /// /// 返回数据: /// - 测量的物理量 /// - 时间戳信息 /// - 状态标志 /// SensorData GetSensorData(); } /// /// 传感器的抽象基类,实现了ISensor接口的基本功能 /// /// /// 该类提供了传感器的通用实现: /// - 位置和姿态管理 /// - 激活状态控制 /// - 数据采集框架 /// - 干扰处理机制 /// 是具体传感器类的实现基础 /// public abstract class BaseSensor : SimulationElement, ISensor, IJammable { /// /// 干扰处理组件 /// protected readonly JammableComponent _jammingComponent; /// /// 获取设备支持的干扰类型 /// /// /// 定义传感器可以被哪些类型的干扰影响 /// 子类需要重写此属性以指定支持的干扰类型 /// public abstract IEnumerable SupportedJammingTypes { get; } /// /// 获取设备支持的阻塞干扰类型 /// public abstract IEnumerable SupportedBlockingJammingTypes { get; } /// /// 获取设备当前是否处于被干扰状态 /// public bool IsJammed => _jammingComponent.IsJammed; /// /// 获取设备当前是否正受到有效的阻塞式干扰 /// public bool IsBlockingJammed => _jammingComponent.IsBlockingJammed; /// /// 初始化传感器的新实例 /// /// 传感器的ID /// 传感器的初始运动参数 /// 仿真管理器实例 /// /// 构造过程: /// - 设置初始位置 /// - 设置初始朝向 /// - 设置初始速度 /// - 初始化工作状态 /// - 创建干扰处理组件 /// protected BaseSensor(string id, MotionParameters motionParameters, ISimulationManager simulationManager) : base(id, motionParameters, simulationManager) { IsActive = false; // 初始化干扰处理组件 _jammingComponent = new JammableComponent( positionProvider: () => Position ); // Subscribe to the events instead _jammingComponent.JammingApplied += HandleJammingApplied; _jammingComponent.JammingCleared += HandleJammingCleared; } /// /// 初始化干扰阈值和支持的干扰类型 /// /// 干扰抗性阈值,单位:瓦特 /// 支持的干扰类型 /// 支持的阻塞干扰类型 protected void InitializeJamming(double jammingResistanceThreshold, IEnumerable supportedTypes, IEnumerable supportedBlockingTypes) { _jammingComponent.LoadJammingConfigFromThreshold(jammingResistanceThreshold, supportedBlockingTypes); foreach (var type in supportedTypes) { _jammingComponent.AddSupportedJammingType(type); } } /// /// 处理传感器被干扰的事件 /// /// 干扰参数 /// /// 当传感器受到干扰时调用 /// 子类可以重写以实现特定的干扰响应 /// protected virtual void HandleJammingApplied(JammingParameters parameters) { // 子类可以重写此方法以实现特定的干扰响应 System.Diagnostics.Debug.WriteLine($"传感器受到{parameters.Type}类型干扰,功率:{parameters.Power}W"); } /// /// 处理传感器干扰被清除的事件 /// /// 干扰参数 /// /// 当干扰被清除时调用 /// 子类可以重写以实现干扰清除后的特定行为 /// protected virtual void HandleJammingCleared(JammingParameters parameters) { // 子类可以重写此方法以实现干扰清除后的特定行为 System.Diagnostics.Debug.WriteLine($"传感器{parameters.Type}类型干扰已清除"); } /// /// 更新传感器状态 /// /// 时间步长,单位:秒 /// /// 更新过程: /// - 更新干扰状态 /// - 如果激活且未被干扰,调用UpdateSensor /// /// 注意:子类应当重写UpdateSensor方法而非覆盖此方法。 /// 如果确实需要覆盖此方法,应确保调用base.Update(deltaTime) /// public override void Update(double deltaTime) { // 更新干扰状态 _jammingComponent.UpdateJammingStatus(deltaTime); if (IsActive) { UpdateSensor(deltaTime); } } /// /// 更新传感器特定功能 /// /// 时间步长,单位:秒 /// /// 子类必须重写此方法以实现特定的更新逻辑。 /// 该方法只有在传感器激活且未被干扰时才会被调用。 /// /// 实现指南: /// 1. 在此方法中执行传感器特有的更新逻辑 /// 2. 更新数据采集和处理 /// 3. 不需要检查IsActive或IsJammed,基类已处理 /// 4. 不需要调用基类实现,此方法在基类中为空实现 /// protected virtual void UpdateSensor(double deltaTime) { // 子类中实现具体的传感器更新逻辑 } /// /// 处理干扰事件 /// /// 干扰事件 protected virtual void HandleJammingEvent(JammingEvent evt) { if (evt != null) { // 在应用干扰前检查是否应该处理此干扰 if (ShouldHandleJamming(evt.Parameters)) { ApplyJamming(evt.Parameters); } } } /// /// 处理干扰停止事件 /// /// 干扰停止事件 protected virtual void HandleJammingStoppedEvent(JammingStoppedEvent evt) { if (evt != null) { ClearJamming(evt.Parameters); } } /// /// 判断是否应该处理传入的干扰参数(可被子类重写以添加特定检查) /// /// 干扰参数 /// 如果应该处理则返回 true,否则返回 false protected virtual bool ShouldHandleJamming(JammingParameters parameters) { // 基类默认处理所有受支持类型的干扰 // 子类可以重写此方法添加额外检查,如波段匹配 return SupportedJammingTypes.Contains(parameters.Type); } /// /// 应用干扰 /// /// 干扰参数 /// /// 处理对传感器的干扰影响 /// 只有支持的干扰类型才会被处理 /// public virtual void ApplyJamming(JammingParameters parameters) { _jammingComponent.ApplyJamming(parameters); } /// /// 清除干扰 /// /// 干扰参数 /// /// 移除特定类型的干扰影响 /// 恢复传感器的正常工作状态 /// public virtual void ClearJamming(JammingParameters parameters) { _jammingComponent.ClearJamming(parameters); } /// /// 获取传感器数据(需要在子类中实现) /// /// 包含传感器测量结果的数据对象 /// /// 数据要求: /// - 包含最新测量结果 /// - 附加时间戳信息 /// - 提供状态标志 /// - 确保数据有效性 /// public abstract SensorData GetSensorData(); /// /// 激活传感器 /// public override void Activate() { if (!IsActive) { IsActive = true; // 订阅 HandleJammingEvent SimulationManager.SubscribeToEvent(HandleJammingEvent); SimulationManager.SubscribeToEvent(HandleJammingStoppedEvent); } base.Activate(); } /// /// 停用传感器 /// public override void Deactivate() { if (IsActive) { IsActive = false; // 取消订阅 HandleJammingEvent SimulationManager.UnsubscribeFromEvent(HandleJammingEvent); SimulationManager.UnsubscribeFromEvent(HandleJammingStoppedEvent); } base.Deactivate(); } /// /// 获取传感器状态 /// /// 传感器状态 public override ElementStatusInfo GetStatusInfo() { // 获取基础状态信息 var statusInfo = base.GetStatusInfo(); // 添加传感器状态 statusInfo.ExtendedProperties["IsJammed"] = IsJammed.ToString(); statusInfo.ExtendedProperties["IsBlockingJammed"] = IsBlockingJammed.ToString(); statusInfo.ExtendedProperties["SensorData"] = GetSensorData().ToString() ?? "无数据"; return statusInfo; } } }