示例#1
0
        //Initalize the control mode to a safe, disabled state
        public ControlModeHandler()
        {
            mode          = ControlMode.DISABLED;
            isRobotActive = false;

            autonState = AutonomousState.STARTUP;


            orient = new Orient();
        }
        public void Reset()
        {
            _timeSinceLastColourSample  = Stopwatch.StartNew();
            _timeSinceLastFaceSample    = Stopwatch.StartNew();
            _timeSinceLastSmoothPursuit = Stopwatch.StartNew();

            _internalState = AutonomousState.Waiting;

            _random = new Random();

            DecideNextSmoothPursuit();
        }
示例#3
0
        private void AttemptToRecognizeStartSituation()
        {
            SpecialSituationDescription = "";
            List <ScreenpartSample> scrSamples = new List <ScreenpartSample>();

            lock (bot.Database.DatabaseLock)
            {
                foreach (var smpl in bot.Database.Database.OfType <ScreenpartSample>())
                {
                    if (!smpl.Scanned)
                    {
                        smpl.ColorData = bot.PresageAndRecognize.SimplifyOtherBitmap(smpl.Bitmap, new System.Drawing.Rectangle(0, 0, smpl.Bitmap.Width, smpl.Bitmap.Height));
                        smpl.Scanned   = true;
                    }
                    scrSamples.Add(smpl);
                }
            }

            int THRESHOLD             = 1000;
            var snap                  = bot.Scan.LastSnapshot;
            int closest               = Int32.MaxValue;
            ScreenpartSample closestS = null;

            foreach (var scrSample in scrSamples)
            {
                var compareData = snap.ColorDataScreenparts[scrSample.Screenpart];
                int dist        = (bot.PresageAndRecognize.GetDistance(scrSample.ColorData, compareData));
                if (dist < closest)
                {
                    closest  = dist;
                    closestS = scrSample;
                }
            }
            SpecialSituationDescription = "Recognized screenpart: " + closestS.Screenpart + " (distance " + closest + ")";
            if (closest < THRESHOLD)
            {
                switch (closestS.Screenpart)
                {
                case Scan.Screenpart.TREASURE_CHEST_TOP_ROW:
                    for (char i = 'A'; i <= 'Z'; i++)
                    {
                        bot.Injection.PressChar(i);
                    }

                    AfterPauseState = AutonomousState.ReadingLetters;
                    State           = AutonomousState.WakingUp;
                    TimeUntilAction = TimeSpan.FromMilliseconds(DELAY_AFTER_TREASURE_ROW_COMPLETE);
                    break;
                }
            }
        }
示例#4
0
        public ProcessingMode AcceptInput(CameraProcessInput input)
        {
            if (_timeSinceLastFaceSample.Elapsed > _sampleFaceEvery)
            {
                if (IsFaceFound(input))
                {
                    return(ProcessingMode.FaceDetection);
                }
                _timeSinceLastFaceSample.Restart();
            }

            if (_timeSinceLastColourSample.Elapsed > _sampleColourEvery)
            {
                if (IsColourFullFrame(input))
                {
                    return(ProcessingMode.ColourObjectTrack);
                }
                _timeSinceLastColourSample.Restart();
            }

            if (_internalState == AutonomousState.Waiting && _timeSinceLastSmoothPursuit.Elapsed > _nextSmoothPursuit)
            {
                _timeTarget.Start(_panTiltController.CurrentSetting);
                _screen.WriteLine($"Starting smooth pursuit {_timeTarget.Original} to {_timeTarget.Target} over {_timeTarget.TimeSpan.ToHumanReadable()}");
                _internalState = AutonomousState.SmoothPursuit;
            }

            if (_internalState == AutonomousState.SmoothPursuit)
            {
                var nextPosition = _timeTarget.GetNextPosition();
                _panTiltController.MoveAbsolute(nextPosition);

                if (_timeTarget.Ticks % 25 == 0)
                {
                    _screen.WriteLine($"{nextPosition}");
                }

                if (_timeTarget.TimeTargetReached)
                {
                    DecideNextSmoothPursuit();
                    _screen.WriteLine("Smooth pursuit target reached");
                    _internalState = AutonomousState.Waiting;
                }
            }

            return(ProcessingMode.Autonomous);
        }
示例#5
0
        public void Tick()
        {
            TimeSpan elapsedTime = DateTime.Now - LastTick;

            LastTick = DateTime.Now;
            if (!IsAutonomous)
            {
                Status = "Turned off";
                return;
            }
            switch (State)
            {
            case AutonomousState.WakingUp:
                TimeUntilAction -= elapsedTime;
                Status           = "Will: (" + AfterPauseState + ") " + (int)TimeUntilAction.TotalMilliseconds + " milliseconds remaining";
                if (TimeUntilAction < TimeSpan.Zero)
                {
                    State = AfterPauseState;
                }
                return;

            case AutonomousState.ReadingLetters:
                if (bot.Vocabulary.LastScrabbleResult != null)
                {
                    if (bot.Recognizator.LastRecognitionResults.Keyboard.Count(rl => rl.IsRecognized) < 15 - MaximumUnrecognizedLettersToContinuePlaying)
                    {
                        Status = "Too few letters recognized.";
                        if (LastBackspace.AddSeconds(0.5) < DateTime.Now)
                        {
                            LastBackspace = DateTime.Now;
                            bot.Injection.PressButton(ByteKey.VK_BACK);
                        }
                        AttemptToRecognizeStartSituation();
                        return;
                    }
                    Word word = bot.Vocabulary.LastScrabbleResult.BestWord;
                    if (word != null)
                    {
                        AfterPauseState  = AutonomousState.ConstructingWord;
                        State            = AutonomousState.WakingUp;
                        TimeUntilAction  = TimeSpan.FromMilliseconds(DELAY_BEFORE_SPELLING);
                        Status           = "Constructing " + word.Text + "!";
                        ConstructingWord = word.Text.ToList();
                    }
                    else
                    {
                        Status = "No word found.";
                    }
                }
                AttemptToRecognizeStartSituation();
                return;

            case AutonomousState.ConstructingWord:
                if (ConstructingWord.Count == 0)
                {
                    TimeUntilAction = TimeSpan.FromMilliseconds(DELAY_BEFORE_ATTACKING);
                    State           = AutonomousState.WakingUp;
                    AfterPauseState = AutonomousState.FireTheWord;
                    return;
                }
                char nowchar = ConstructingWord[0];
                ConstructingWord.RemoveAt(0);
                Status = "Pressing " + nowchar + "!";
                bot.Injection.PressChar(nowchar);
                AfterPauseState = AutonomousState.ConstructingWord;
                TimeUntilAction = TimeSpan.FromMilliseconds(DELAY_BEFORE_NEXT_LETTER);
                State           = AutonomousState.WakingUp;
                return;

            case AutonomousState.FireTheWord:
                Status = "Pressing Enter!";
                bot.Injection.PressButton(ByteKey.VK_RETURN);
                AfterPauseState = AutonomousState.ReadingLetters;
                TimeUntilAction = TimeSpan.FromMilliseconds(DELAY_AFTER_ATTACKING);
                State           = AutonomousState.WakingUp;
                return;
            }
        }
示例#6
0
 public void WakeUp()
 {
     TimeUntilAction = TimeSpan.FromMilliseconds(500);
     State           = AutonomousState.WakingUp;
     AfterPauseState = AutonomousState.ReadingLetters;
 }
        public ProcessingMode AcceptInput(CameraProcessInput input)
        {
            if (_timeSinceLastFaceSample.Elapsed > _sampleFaceEvery)
            {
                if (IsFaceFound(input))
                {
                    return ProcessingMode.FaceDetection;
                }
                _timeSinceLastFaceSample.Restart();
            }

            if (_timeSinceLastColourSample.Elapsed > _sampleColourEvery)
            {
                if (IsColourFullFrame(input))
                {
                    return ProcessingMode.ColourObjectTrack;
                }
                _timeSinceLastColourSample.Restart();
            }

            if (_internalState == AutonomousState.Waiting && _timeSinceLastSmoothPursuit.Elapsed > _nextSmoothPursuit)
            {
                _timeTarget.Start(_panTiltController.CurrentSetting);
                _screen.WriteLine($"Starting smooth pursuit {_timeTarget.Original} to {_timeTarget.Target} over {_timeTarget.TimeSpan.ToHumanReadable()}");
                _internalState = AutonomousState.SmoothPursuit;
            }

            if (_internalState == AutonomousState.SmoothPursuit)
            {
                var nextPosition = _timeTarget.GetNextPosition();
                _panTiltController.MoveAbsolute(nextPosition);

                if (_timeTarget.Ticks % 25 == 0)
                {
                    _screen.WriteLine($"{nextPosition}");
                }

                if (_timeTarget.TimeTargetReached)
                {
                    DecideNextSmoothPursuit();
                    _screen.WriteLine("Smooth pursuit target reached");
                    _internalState = AutonomousState.Waiting;
                }
            }

            return ProcessingMode.Autonomous;
        }
        public void Reset()
        {
            _timeSinceLastColourSample = Stopwatch.StartNew();
            _timeSinceLastFaceSample = Stopwatch.StartNew();
            _timeSinceLastSmoothPursuit = Stopwatch.StartNew();

            _internalState = AutonomousState.Waiting;

            _random = new Random();

            DecideNextSmoothPursuit();
        }