/// <summary> /// Back off algorithm /// </summary> public CleaningRobotActionResult Algorithm() { // Sequence 1 _commandQueue.Clear(); _commandQueue.Enqueue(_turnRightCommand); _commandQueue.Enqueue(_advanceCommand); CleaningRobotActionResult result = ProcessCommandQueue(); // Sequence 2 if (result == CleaningRobotActionResult.Obstacle) { _commandQueue.Clear(); _commandQueue.Enqueue(_turnLeftCommand); _commandQueue.Enqueue(_backCommand); _commandQueue.Enqueue(_turnRightCommand); _commandQueue.Enqueue(_advanceCommand); result = ProcessCommandQueue(); } // Sequence 3 if (result == CleaningRobotActionResult.Obstacle) { _commandQueue.Clear(); _commandQueue.Enqueue(_turnLeftCommand); _commandQueue.Enqueue(_turnLeftCommand); _commandQueue.Enqueue(_advanceCommand); result = ProcessCommandQueue(); } // Sequence 4 if (result == CleaningRobotActionResult.Obstacle) { _commandQueue.Clear(); _commandQueue.Enqueue(_turnRightCommand); _commandQueue.Enqueue(_backCommand); _commandQueue.Enqueue(_turnRightCommand); _commandQueue.Enqueue(_advanceCommand); result = ProcessCommandQueue(); } // Sequence 5 if (result == CleaningRobotActionResult.Obstacle) { _commandQueue.Clear(); _commandQueue.Enqueue(_turnLeftCommand); _commandQueue.Enqueue(_turnLeftCommand); _commandQueue.Enqueue(_advanceCommand); result = ProcessCommandQueue(); } return(result); }
/// <summary> /// Run controller /// </summary> public void Run() { CleaningRobotActionResult result = _givenStrategy.Algorithm(); while (result == CleaningRobotActionResult.Obstacle) { result = _backOffStrategy.Algorithm(); if (result != CleaningRobotActionResult.BatteryDrained) { result = _givenStrategy.Algorithm(); } } }
// Processing command queue private CleaningRobotActionResult ProcessCommandQueue() { CleaningRobotActionResult result = CleaningRobotActionResult.Success; while (_commandQueue.Count > 0) { ICleaningRobotCommand command = _commandQueue.Dequeue(); result = command.Run(); if (result != CleaningRobotActionResult.Success) { break; } } return(result); }