public void Execute() { if (!CanExecute) { throw new InvalidOperationException("Cannot execute in the current state"); } if (CurrentLine != null) { Command cmd; switch (CurrentLine.Instruction) { case MoveInstruction _: cmd = new MoveCommand(this); break; case ArithmeticInstruction _: cmd = new ArithmeticCommand(this); break; case BranchInstruction _: cmd = new BranchCommand(this); break; case HaltInstruction _: cmd = new HaltCommand(this); break; case StoreInstruction _: cmd = new StoreCommand(this); break; case LoadInstruction _: cmd = new LoadCommand(this); break; case NoOperation _: cmd = new NoCommand(this); break; default: throw new ArgumentOutOfRangeException(); } cmd.Execute(); } }
public abstract void Visit(HaltCommand command);
public override void Visit(HaltCommand command) { Console.WriteLine("Halt"); }
public virtual T Visit(HaltCommand command) { return(default(T)); }
/// <summary> /// When certain commands are trigered, we might want to do something else like trigger an event /// </summary> /// <param name="command"></param> /// <param name="callback"></param> private async void HandleRobotCommand(object sender, RobotCommandDetails details) { var command = details.RobotCommand; switch (command.MessageType) { //These commands trigger events if the skill is regisered case MessageType.Stop: if (_locomotionCommandEventDetails != null) { MockedRobot.TriggerRobotEvent(new LocomotionCommandEvent(0, 0, _locomotionCommandEventDetails.EventId)); } break; case MessageType.Drive: if (_locomotionCommandEventDetails != null) { DriveCommand newCommand = (DriveCommand)command; MockedRobot.TriggerRobotEvent(new LocomotionCommandEvent(newCommand.LinearVelocity, newCommand.AngularVelocity, _locomotionCommandEventDetails.EventId)); } break; case MessageType.DriveTime: if (_locomotionCommandEventDetails != null) { DriveTimeCommand newCommand = (DriveTimeCommand)command; MockedRobot.TriggerRobotEvent(new LocomotionCommandEvent(newCommand.LinearVelocity, newCommand.AngularVelocity, _locomotionCommandEventDetails.EventId)); } break; case MessageType.Halt: if (_haltCommandEventDetails != null) { HaltCommand newCommand = (HaltCommand)command; MockedRobot.TriggerRobotEvent(new HaltCommandEvent(newCommand.MotorMasks, _haltCommandEventDetails.EventId)); } break; case MessageType.PlayAudio: if (_audioPlayCompleteCommandEventDetails != null) { PlayAudioCommand newCommand = (PlayAudioCommand)command; await Task.Delay(3000); //send an event 3 seconds after started playing for now... MockedRobot.TriggerRobotEvent(new AudioPlayCompleteEvent(newCommand.FileName, _audioPlayCompleteCommandEventDetails.EventId)); } break; //Update state flag so know if events should really be sent case MessageType.StartKeyPhraseRecognition: _keyPhraseRecRunning = true; break; case MessageType.StopKeyPhraseRecognition: _keyPhraseRecRunning = false; break; case MessageType.StartFaceDetection: _faceDetectRunning = true; break; case MessageType.StartFaceRecognition: _faceRecRunning = true; break; case MessageType.StopFaceDetection: _faceDetectRunning = false; break; case MessageType.StopFaceRecognition: _faceRecRunning = false; break; } }
private ICommand CommandFromString(string name, string[] arguments) { ICommand command = null; switch (name) { case "SET": { Register register = Registers[arguments[0]]; int value = int.Parse(arguments[1]); command = new SetCommand(register, value); break; } case "ADD": { Register registerOne = Registers[arguments[0]]; Register registerTwo = Registers[arguments[1]]; Register registerOut = Registers[arguments[2]]; command = new AddCommand(registerOne, registerTwo, registerOut); break; } case "SUB": { Register registerOne = Registers[arguments[0]]; Register registerTwo = Registers[arguments[1]]; Register registerOut = Registers[arguments[2]]; command = new SubtractCommand(registerOne, registerTwo, registerOut); break; } case "MUL": { Register registerOne = Registers[arguments[0]]; Register registerTwo = Registers[arguments[1]]; Register registerOut = Registers[arguments[2]]; command = new MultiplyCommand(registerOne, registerTwo, registerOut); break; } case "DIV": { Register registerOne = Registers[arguments[0]]; Register registerTwo = Registers[arguments[1]]; Register registerOut = Registers[arguments[2]]; command = new DivideCommand(registerOne, registerTwo, registerOut); break; } case "OUT": { if (Registers.ContainsKey(arguments[0])) { Register register = Registers[arguments[0]]; command = new OutCommand(register); } else { command = new OutCommand(arguments[0]); } break; } case "HLT": { command = new HaltCommand(); break; } case "JMP": { string label = arguments[0]; command = new JumpCommand(label); break; } case "JIF": { Register registerOne = Registers[arguments[0]]; Register registerTwo = Registers[arguments[2]]; string conditionString = arguments[1]; JumpCondition jumpCondition = JumpCondition.Undefined; switch (conditionString) { case "==": jumpCondition = JumpCondition.Equal; break; case "<": jumpCondition = JumpCondition.LessThan; break; case "<=": jumpCondition = JumpCondition.LessThanOrEqual; break; case ">": jumpCondition = JumpCondition.GreaterThan; break; case ">=": jumpCondition = JumpCondition.GreaterThanOrEqual; break; case "!=": jumpCondition = JumpCondition.NotEqual; break; } string label = arguments[3]; command = new JumpIfCommand(registerOne, registerTwo, label, jumpCondition); break; } case "CPY": { Register registerOne = Registers[arguments[0]]; Register registerTwo = Registers[arguments[1]]; command = new CopyCommand(registerOne, registerTwo); break; } default: if (name == "str:") { string stringKey = arguments[0]; string stringValue = string.Empty; for (int i = 1; i < arguments.Length; i++) { stringValue += arguments[i]; if (i < arguments.Length) { stringValue += " "; } } Program.RegisterString(stringKey, stringValue); } else if (name.Length > 1 && name.EndsWith(":")) { Program.MakeLabel(name.Substring(0, name.Length - 1)); break; } break; } return(command); }