//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(); }
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; } } }
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 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; } }
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; }