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;
 }
Esempio n. 3
0
        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();
 }
Esempio n. 6
0
 public void UnregisterAngleArea(ILeaveAngleAreaObserver ob, AngleArea area)
 {
     foreach (var p in Areas)
     {
         if (p.Key != ob || p.Value != area)
         {
             continue;
         }
         Areas.Remove(p);
         break;
     }
 }
Esempio n. 7
0
        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();                //清空无关扇区的所有数据
                }
            }
        }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        public void SetSectionSweepMode(AngleArea area) //扇扫模式
        {
            if (_isSectionSweeping)
            {
                StopSectionSweep();     //先停止扇扫
            }
            _isSectionSweeping = true;
            _sweepSection      = area;
            var angleAreaSurveillance = TargetManagerFactory.CreateAngleAreaSurveillance();

            _modifiedSection = CalAntiInertiaSection(_sweepSection);
            angleAreaSurveillance.RegisterAngleArea(this, _modifiedSection);
            NotifySweepModeChange();
        }
Esempio n. 11
0
        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);
        }   //获得天线离开波门通知
Esempio n. 12
0
 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));
 }
Esempio n. 13
0
        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);
        }
Esempio n. 14
0
        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);
        }
Esempio n. 15
0
 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;
     //}
 }
Esempio n. 16
0
 protected void StopSectionSweep()
 {
     _sweepSection      = null;
     _isSectionSweeping = false;
     TargetManagerFactory.CreateAngleAreaSurveillance().UnregisterAngleArea(this, _modifiedSection);
 }
Esempio n. 17
0
 public static bool IsZeroDegreeAcrossingAngleArea(AngleArea area) => area.BeginAngle > area.EndAngle;
 public void NotifyLeaveAngleArea(AngleArea area) => AntennaLeaveSectionSweepAngleArea();//天线扫过了扇扫区域,需要翻转天线
Esempio n. 19
0
        private RotateDirection _intentionalDirection = RotateDirection.ClockWise; //期望的天线扫描方向,由于惯性的存在,可能与真实方向不一致

        public AntennaManager()
        {
            _sweepModeObs    = new List <ISweepModeObserver>();
            _sweepSection    = null;
            _servoController = ServoControllerFactory.CreateServoController();
        }
Esempio n. 20
0
 public void NotifyLeaveAngleArea(AngleArea sector) => ProcessSector(sector);  //获得角度区域监听器的通知,天线刚刚扫过一个扇区sector
Esempio n. 21
0
 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();
        }
Esempio n. 23
0
        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;
        }
Esempio n. 24
0
 public TargetSimulator(AngleArea targetMovementArea)
 {
     _lastRefreshTime = DateTime.Now;
     TargetSpeed      = 10;
     movementArea     = targetMovementArea;
 }
Esempio n. 25
0
        public AzimuthCell[] GetAzimuthCellsInSectorSpan(Sector previous, Sector next)
        {
            AngleArea area = CalCoveredAngleArea(previous, next);

            return(AzimuthCellsInAngleArea(area));
        }