private void RegisterAngleAreaNotification(AngleArea area) { var antennaLeaveAngleAreaSubject = TargetManagerFactory.CreateAntennaLeaveAngleAreaSubject(); _modifiedSection = _rotateController.CalAntiInertiaSection(area); antennaLeaveAngleAreaSubject.RegisterAngleArea(this, _modifiedSection); }
protected void StopSectionSweep() { _sweepSection = null; _isSectionSweeping = false; UnregisterAngleAreaNotification(); AzimuthCellFilter.PassArea = null; }
public bool LeavingAngleArea(AngleArea area) { var isPreAngleInArea = area.IsAngleInArea(_preciousAntennaAngle); var isCurAngleInArea = area.IsAngleInArea(_currentAntennaAngle); return(isPreAngleInArea && !isCurAngleInArea); }
private void BeginSectionSweep(AngleArea area) { _isSectionSweeping = true; _sweepSection = area; UnregisterAngleAreaNotification(); RegisterAngleAreaNotification(area); AzimuthCellFilter.PassArea = area; }
public void SetSectionSweepMode(AngleArea area) //扇扫模式 { if (_isSectionSweeping) { StopSectionSweep(); //先停止扇扫 } BeginSectionSweep(area); NotifySweepModeChange(); }
public void UnregisterAngleArea(ILeaveAngleAreaObserver ob, AngleArea area) { foreach (var p in Areas) { if (p.Key != ob || p.Value != area) { continue; } Areas.Remove(p); break; } }
public void NotifyLeaveAngleArea(AngleArea sector) => ProcessSector(sector); //获得角度区域监听器的通知,天线刚刚扫过一个扇区sector public void DeleteOutRangedTargets(AngleArea area) //删除角度范围外的所有目标 { lock (_locker) { foreach (Sector s in Sectors) { if (area.IsAngleInArea(s.BeginAngle) || area.IsAngleInArea(s.EndAngle)) continue; _viewDeleter.DeleteViews(s, true); //删除所有目标视图,包括目标航迹 s.ClearAllTargets(); //清空无关扇区的所有数据 } } }
public void SetRotationRate(uint countPerMinute) //不改变方向,只改变转速,界面 { SetAntennaSweepState(_intentionalDirection, countPerMinute); if (!_isSectionSweeping) { return; //不是扇扫状态 } var angleAreaSurveillance = TargetManagerFactory.CreateAngleAreaSurveillance(); angleAreaSurveillance.UnregisterAngleArea(this, _modifiedSection); _modifiedSection = CalAntiInertiaSection(_sweepSection); angleAreaSurveillance.RegisterAngleArea(this, _modifiedSection); }
public void RegisterAngleArea(ILeaveAngleAreaObserver ob, AngleArea area) { foreach (var p in Areas) { if (p.Key == ob && p.Value == area) //已经注册过 { return; } } var pair = new KeyValuePair <ILeaveAngleAreaObserver, AngleArea>(ob, area); Areas.Add(pair); }
public void SetSectionSweepMode(AngleArea area) //扇扫模式 { if (_isSectionSweeping) { StopSectionSweep(); //先停止扇扫 } _isSectionSweeping = true; _sweepSection = area; var angleAreaSurveillance = TargetManagerFactory.CreateAngleAreaSurveillance(); _modifiedSection = CalAntiInertiaSection(_sweepSection); angleAreaSurveillance.RegisterAngleArea(this, _modifiedSection); NotifySweepModeChange(); }
public void NotifyLeaveAngleArea(AngleArea area) { WaveGate gate = (WaveGate)area; gate.SweepCount = gate.SweepCount + 1; //该波门扫过计数加一 if (gate.SweepCount < SemiAutoWaveGateLife) { return; } Subject.UnregisterAngleArea(this, gate); NotifyAllObservers(gate, WaveGateSubjectNotifyState.Delete); waveGates.Remove(gate); } //获得天线离开波门通知
private AngleArea CalAntiInertiaSection(AngleArea area) { if (_rotationRate == 2) { return(new AngleArea(area.BeginAngle - 20, area.EndAngle + 20)); } if (_rotationRate == 5) { return(new AngleArea(area.BeginAngle - 10, area.EndAngle + 10)); } if (_rotationRate == 10) { return(new AngleArea(area.BeginAngle + 14, area.EndAngle - 14)); } return(new AngleArea(area.BeginAngle, area.EndAngle)); }
public static List <AngleArea> SpliteNorthAcrossingAngleArea(AngleArea area) { List <AngleArea> ret = new List <AngleArea>(); if (!IsZeroDegreeAcrossingAngleArea(area)) { ret.Add(area); } else { AngleArea angleArea = new AngleArea(area.BeginAngle, 360); ret.Add(angleArea); angleArea = new AngleArea(0, area.EndAngle); ret.Add(angleArea); } return(ret); }
public AzimuthCell ModifyOriginalData(AzimuthCell originalData) { originalData.DisCells.Clear(); AngleArea testAngleArea = new AngleArea(0f, 33.75f); AngleArea testAngleArea1 = new AngleArea(20f, 25f); //if (testAngleArea.IsAngleInArea(realData.Angle) /*|| testAngleArea1.IsAngleInArea(realData.Angle)*/) if (!testAngleArea1.IsAngleInArea(originalData.Angle)) { DistanceCell distanceCell = new DistanceCell() { index = 300, sumAM = 100000, az = originalData.Angle }; originalData.DisCells.Add(300, distanceCell); return(originalData); } return(null); }
public AngleArea CalAntiInertiaSection(AngleArea area) { return(area); //switch (Rate) //{ // case RotateRate.Rpm0: // return area; // case RotateRate.Rpm2: // return new AngleArea(area.BeginAngle + 2 , area.EndAngle - 2 ); // case RotateRate.Rpm5: // return new AngleArea(area.BeginAngle - 2, area.EndAngle + 2); // case RotateRate.Rpm10: // return new AngleArea(area.BeginAngle + 14, area.EndAngle - 14); // case RotateRate.Rpm20: // return new AngleArea(area.BeginAngle + 14, area.EndAngle - 14); // default: // return null; //} }
protected void StopSectionSweep() { _sweepSection = null; _isSectionSweeping = false; TargetManagerFactory.CreateAngleAreaSurveillance().UnregisterAngleArea(this, _modifiedSection); }
public static bool IsZeroDegreeAcrossingAngleArea(AngleArea area) => area.BeginAngle > area.EndAngle;
public void NotifyLeaveAngleArea(AngleArea area) => AntennaLeaveSectionSweepAngleArea();//天线扫过了扇扫区域,需要翻转天线
private RotateDirection _intentionalDirection = RotateDirection.ClockWise; //期望的天线扫描方向,由于惯性的存在,可能与真实方向不一致 public AntennaManager() { _sweepModeObs = new List <ISweepModeObserver>(); _sweepSection = null; _servoController = ServoControllerFactory.CreateServoController(); }
public void NotifyLeaveAngleArea(AngleArea sector) => ProcessSector(sector); //获得角度区域监听器的通知,天线刚刚扫过一个扇区sector
public AzimuthCell[] AzimuthCellsInAngleArea(AngleArea area) //返回角度在begin和end之间的周期数据集合 { //没有保存过周期数据,返回一个0长度数组 return(Matrix.Length == 0 ? new AzimuthCell[0] : Matrix.Where(cell => cell != null).Where(cell => area.IsAngleInArea(cell.Angle)).ToArray()); }
private readonly AntennaRotateController _rotateController; // public AntennaSectionSweepController() { _sweepModeObs = new List <ISweepModeObserver>(); _sweepSection = null; _rotateController = new AntennaRotateController(); }
public static List<TargetArea> GetTargetAreas(List<AzimuthCell> azCells) { azCells.Sort(); //按方位排序 List<AzimuthCell> moreAzimuthCells = new List<AzimuthCell>(); //获取下个扇区的数据,准备将本扇区的TargetArea向下个扇区扩展 if (TargetManagerFactory.CreateAntennaDataProvider().GetAntennaDirection() == RotateDirection.ClockWise) { if (azCells.Count > 0) { AngleArea angleArea = new AngleArea(azCells[azCells.Count - 1].Angle, azCells[azCells.Count - 1].Angle + 20.25f); moreAzimuthCells = new List<AzimuthCell>(CycleDataMatrix.CreateCycleDataMatrix().AzimuthCellsInAngleArea(angleArea)); moreAzimuthCells.Sort(); } } else { azCells.Reverse(); //沿着天线转动方向凝聚 if (azCells.Count > 0) { AngleArea angleArea = new AngleArea(azCells[azCells.Count - 1].Angle - 20.25f, azCells[azCells.Count - 1].Angle); moreAzimuthCells = new List<AzimuthCell>(CycleDataMatrix.CreateCycleDataMatrix().AzimuthCellsInAngleArea(angleArea)); moreAzimuthCells.Sort(); moreAzimuthCells.Reverse(); } } List<TargetArea> areas = new List<TargetArea>(); foreach (AzimuthCell azimuthCell in azCells) { List<TargetAreaEdge> edges = FourSevenClotter.GetAzCellTargetAreaEdges(azimuthCell); foreach (TargetArea area in areas) //先延伸现有的区域 { if (area.ExtentionEnd) continue; //已经终止延伸的区域不处理 area.Extend(ref edges); //延伸区域 } foreach (TargetAreaEdge edge in edges) //将未合并的edge升级为area,供下一循环延伸 { if (edge.IsInArea) continue; areas.Add(new TargetArea(new List<TargetAreaEdge>() { edge })); edge.IsInArea = true; } } int extendingCount = 0; for (int i = areas.Count - 1; i >= 0; i--) { if (!areas[i].ExtentionEnd) //尚未结束的区域 extendingCount++; } if (extendingCount == 0) return areas; //所有区域都已经结束扩展 //未完成扩展的区域继续向下个扇区扩展 foreach (TargetArea extendingArea in areas) { if (extendingArea.ExtentionEnd) continue; foreach (TargetAreaEdge edge in extendingArea.RigthMostEdges) { foreach (AzimuthCell azimuthCell in moreAzimuthCells) { List<TargetAreaEdge> edges = new List<TargetAreaEdge>(); foreach (DistanceCell disCell in azimuthCell.DisCells.Values) { if (!edge.IsDistanceCellAdjacentDistanceWise(disCell) || disCell.Occupied) continue; disCell.Occupied = true; List<DistanceCell> distanceCells = new List<DistanceCell>() { disCell }; TargetAreaEdge tae = new TargetAreaEdge(distanceCells); edges.Add(tae); } extendingArea.Extend(ref edges); } } } return areas; }
public TargetSimulator(AngleArea targetMovementArea) { _lastRefreshTime = DateTime.Now; TargetSpeed = 10; movementArea = targetMovementArea; }
public AzimuthCell[] GetAzimuthCellsInSectorSpan(Sector previous, Sector next) { AngleArea area = CalCoveredAngleArea(previous, next); return(AzimuthCellsInAngleArea(area)); }