Esempio n. 1
0
        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();
            }
        }
Esempio n. 2
0
 public abstract void Visit(HaltCommand command);
 public override void Visit(HaltCommand command)
 {
     Console.WriteLine("Halt");
 }
Esempio n. 4
0
 public virtual T Visit(HaltCommand command)
 {
     return(default(T));
 }
Esempio n. 5
0
        /// <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;
            }
        }
Esempio n. 6
0
        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);
        }