Ejemplo n.º 1
0
        public IDisposable AddTarget(ITargetBlock <T> block, bool unlinkAfterOne)
        {
            TargetWaiter w = new TargetWaiter(block, unlinkAfterOne, targetWaiters);

            targetWaiters.Enqueue(w);

            return(w);
        }
Ejemplo n.º 2
0
        public void CancelSearch()
        {
            while (IsSearching)
            {
                Canceled = true;

                DriveSearch?.CancelSearch();
                BestSearch?.CancelSearch();
                WorstSearch?.CancelSearch();

                RobotSearchWaiter?.PulseAll();
                MoveWaiter?.PulseAll();
                TargetWaiter?.PulseAll();

                Task.Delay(20).Wait(20);
            }

            Canceled = false;
        }
Ejemplo n.º 3
0
        private void Search()
        {
            UpdateLearnLabyrinth(Position);
            WorstSearch.BeginSearch().Wait();
            BestSearch.BeginSearch().Wait();
            DriveSearch.BeginSearch().Wait();

            int robotSearchIndex = 0;

            do
            {
                if (UpdateLearnLabyrinth(Position))
                {
                    WorstSearch.BeginSearch().Wait();
                }
                if (IsRouteBlocked(BestSearch.Route))
                {
                    BestSearch.BeginSearch().Wait();
                }

                if (IsRouteBlocked(DriveSearch.Route) || DriveSearch.Route.Length - robotSearchIndex <= 1)
                {
                    DriveSearch.Start  = Position;
                    DriveSearch.Target = GetTarget();
                    DriveSearch.BeginSearch().Wait();

                    robotSearchIndex = 0;
                    Direction        = GetDirection(true, robotSearchIndex);

                    RobotSearchWaiter?.Wait();

                    if (Canceled)
                    {
                        break;
                    }
                }

                robotSearchIndex++;
                Position = DriveSearch.Route[robotSearchIndex];

                Direction = GetDirection(false, robotSearchIndex);

                HasChanges = true;
                MoveWaiter?.Wait();

                if (!Canceled && GetTarget().Is(Position))
                {
                    toTarget   = !toTarget;
                    HasChanges = true;
                    TargetWaiter?.Wait();
                }

                if (Canceled)
                {
                    break;
                }
            }while (WorstSearch.Route.PossibleLength <= 0 || WorstSearch.Route.PossibleLength > BestSearch.Route.PossibleLength);

            System.Diagnostics.Debug.WriteLine("RobotEndSearch: worstLen: {0}, bestLen: {1}",
                                               WorstSearch.Route.PossibleLength, BestSearch.Route.PossibleLength);

            IsSearching = false;
        }