Esempio n. 1
0
        static public void VerticalSquare(Robot bot)
        {
            // Message
            bot.Message("Starting vertical square");

            // A 100 mm long tool with no TCP rotation
            Tool rod = new Tool("rod", new Point(0, 0, 100), new Orientation(1, 0, 0, 0, 1, 0), 1, new Point(0, 0, 50));

            bot.Attach(rod);

            // Home
            bot.SpeedTo(500.023);
            bot.PrecisionTo(10.4);
            bot.AxesTo(0, 0, 0, 0, 90, 0);

            // Joint move and rotate to starting point
            bot.PushSettings();
            bot.MotionMode(MotionType.Joint);
            bot.AccelerationTo(2000);
            bot.RotationSpeedTo(45);
            bot.SpeedTo(300.2);
            bot.JointSpeedTo(45);
            bot.JointAccelerationTo(90);
            bot.PrecisionTo(5);
            bot.TransformTo(new Point(300, 300, 300), new Orientation(-1, 0, 0, 0, 1, 0));
            bot.Rotate(0, 1, 0, -90);
            bot.PopSettings();
            bot.Wait(500);

            // Turn on "DO_15"
            //bot.SetIOName("DO_15", 1, true);
            bot.WriteDigital("DO_15", true);

            // Slow MoveL a square with precision
            bot.SpeedTo(100.3);
            bot.PrecisionTo(0.1);
            bot.AccelerationTo(2000);
            bot.Move(0, 50, 0);
            bot.Move(0, 0, 50);
            bot.Move(0, -50, 0);
            bot.Move(0, 0, -50);
            bot.Wait(500);

            // Turn off "DO_15"
            bot.WriteDigital(1, false);

            // No tool and back home
            bot.Detach();
            bot.SpeedTo(500);
            bot.PrecisionTo(5);
            bot.AxesTo(0, 0, 0, 0, 90, 0);
        }
Esempio n. 2
0
        public bool ExecuteInstruction(string instruction)
        {
            string[] args = Machina.Utilities.Parsing.ParseStatement(instruction);
            if (args == null || args.Length == 0)
            {
                Machina.Logger.Error($"I don't understand \"{instruction}\"...");
                return(false);
            }

            // This is horrible, but oh well...
            if (args[0].Equals("MotionMode", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.MotionMode(args[1]));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Speed", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Speed(Convert.ToDouble(args[1])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("SpeedTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.SpeedTo(Convert.ToDouble(args[1])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Acceleration", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Acceleration(Convert.ToDouble(args[1])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("AccelerationTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.AccelerationTo(Convert.ToDouble(args[1])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Precision", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Precision(Convert.ToDouble(args[1])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("PrecisionTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.PrecisionTo(Convert.ToDouble(args[1])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Coordinates", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is still not implemented.");
                return(false);
            }
            else if (args[0].Equals("Temperature", StringComparison.CurrentCultureIgnoreCase) || args[0].Equals("TemperatureTo", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is still not implemented.");
                return(false);
            }
            else if (args[0].Equals("ExtrusionRate", StringComparison.CurrentCultureIgnoreCase) || args[0].Equals("ExtrusionRateTo", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is still not implemented.");
                return(false);
            }
            else if (args[0].Equals("PushSettings", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.PushSettings();
                return(true);
            }
            else if (args[0].Equals("PopSettings", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.PopSettings();
                return(true);
            }
            else if (args[0].Equals("Move", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Move(Convert.ToDouble(args[1]), Convert.ToDouble(args[2]), Convert.ToDouble(args[3])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("MoveTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.MoveTo(Convert.ToDouble(args[1]), Convert.ToDouble(args[2]), Convert.ToDouble(args[3])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Rotate", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Rotate(Convert.ToDouble(args[1]), Convert.ToDouble(args[2]), Convert.ToDouble(args[3]), Convert.ToDouble(args[4])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("RotateTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.RotateTo(Convert.ToDouble(args[1]), Convert.ToDouble(args[2]), Convert.ToDouble(args[3]),
                                        Convert.ToDouble(args[4]), Convert.ToDouble(args[5]), Convert.ToDouble(args[6])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Transform", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is still not implemented.");
                return(false);
            }
            else if (args[0].Equals("TransformTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.TransformTo(Convert.ToDouble(args[1]), Convert.ToDouble(args[2]), Convert.ToDouble(args[3]),
                                           Convert.ToDouble(args[4]), Convert.ToDouble(args[5]), Convert.ToDouble(args[6]),
                                           Convert.ToDouble(args[7]), Convert.ToDouble(args[8]), Convert.ToDouble(args[9])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Axes", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Axes(Convert.ToDouble(args[1]), Convert.ToDouble(args[2]), Convert.ToDouble(args[3]),
                                    Convert.ToDouble(args[4]), Convert.ToDouble(args[5]), Convert.ToDouble(args[6])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("AxesTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.AxesTo(Convert.ToDouble(args[1]), Convert.ToDouble(args[2]), Convert.ToDouble(args[3]),
                                      Convert.ToDouble(args[4]), Convert.ToDouble(args[5]), Convert.ToDouble(args[6])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("ExternalAxis", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    int    axisNumber;
                    double increment;
                    if (!Int32.TryParse(args[1], out axisNumber) || axisNumber < 1 || axisNumber > 6)
                    {
                        Logger.Error($"Invalid axis number");
                        return(false);
                    }

                    if (!Double.TryParse(args[2], out increment))
                    {
                        Logger.Error($"Invalid increment value");
                        return(false);
                    }

                    string target = "All";
                    if (args.Length > 3)
                    {
                        target = args[3];
                    }

                    return(bot.ExternalAxis(axisNumber, increment, target));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("ExternalAxisTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    int    axisNumber;
                    double val;
                    if (!Int32.TryParse(args[1], out axisNumber) || axisNumber < 1 || axisNumber > 6)
                    {
                        Logger.Error($"Invalid axis number");
                        return(false);
                    }

                    if (!Double.TryParse(args[2], out val))
                    {
                        Logger.Error($"Invalid value " + args[2]);
                        return(false);
                    }

                    string target = "All";
                    if (args.Length > 3)
                    {
                        target = args[3];
                    }

                    return(bot.ExternalAxisTo(axisNumber, val, target));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("ArmAngle", StringComparison.CurrentCultureIgnoreCase))
            {
                Logger.Warning(
                    "Relative `ArmAngle` is temporarily disabled, please use the absolute `ArmAngleTo` version instead.");
                //try
                //{
                //    double val;

                //    if (!Double.TryParse(args[1], out val))
                //    {
                //        Console.WriteLine($"ERROR: Invalid value " + args[1]);
                //        return false;
                //    }

                //    return bot.ArmAngle(val);
                //}
                //catch (Exception ex)
                //{
                //    BadFormatInstruction(instruction, ex);
                //    return false;
                //}
            }
            else if (args[0].Equals("ArmAngleTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    double val;

                    if (!Double.TryParse(args[1], out val))
                    {
                        Logger.Error($"Invalid value " + args[1]);
                        return(false);
                    }

                    return(bot.ArmAngleTo(val));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Wait", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Wait(Convert.ToInt32(args[1])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Message", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Message(args[1]));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Comment", StringComparison.CurrentCultureIgnoreCase))
            {
                // Do noLightg here, just go through with it.
                return(true);
            }
            else if (args[0].Equals("CustomCode", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Warning("\"CustomCode\" can lead to unexpected results, use with caution and only if you know what you are doing.");

                try
                {
                    string statement = args[1];
                    bool   dec       = false;
                    if (args.Length > 2)
                    {
                        dec = bool.Parse(args[2]);  // if not good, throw and explain
                    }

                    return(bot.CustomCode(statement, dec));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                }

                return(false);
            }
            else if (args[0].Equals("new Tool", StringComparison.CurrentCultureIgnoreCase) ||
                     args[0].Equals("Tool.Create", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is deprecated, please update your client and use \"DefineTool\" instead. Action will have no effect.");
                return(false);
            }
            else if (args[0].Equals("DefineTool", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.DefineTool(args[1],
                                          Convert.ToDouble(args[2]), Convert.ToDouble(args[3]), Convert.ToDouble(args[4]),
                                          Convert.ToDouble(args[5]), Convert.ToDouble(args[6]), Convert.ToDouble(args[7]),
                                          Convert.ToDouble(args[8]), Convert.ToDouble(args[9]), Convert.ToDouble(args[10]),
                                          Convert.ToDouble(args[11]),
                                          Convert.ToDouble(args[12]), Convert.ToDouble(args[13]), Convert.ToDouble(args[14])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Attach", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is deprecated, please update your client and use \"AttachTool\" instead. Action will have no effect.");
                return(false);
            }
            else if (args[0].Equals("AttachTool", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.AttachTool(args[1]));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Detach", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Warning($"\"{args[0]}\" is deprecated, please update your client and use \"DetachTool\" instead.");
                return(bot.DetachTool());
            }
            else if (args[0].Equals("DetachTool", StringComparison.CurrentCultureIgnoreCase))
            {
                return(bot.DetachTool());
            }
            else if (args[0].Equals("WriteDigital", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    int  count      = args.Length;
                    int  pin        = 0;
                    bool digitalPin = Int32.TryParse(args[1], out pin);

                    // Numeric pins
                    if (digitalPin)
                    {
                        switch (count)
                        {
                        case 3: return(bot.WriteDigital(pin, Convert.ToBoolean(args[2])));

                        case 4: return(bot.WriteDigital(pin, Convert.ToBoolean(args[2]), Convert.ToBoolean(args[3])));
                        }
                    }
                    // Named pins (ABB)
                    else
                    {
                        switch (count)
                        {
                        case 3: return(bot.WriteDigital(args[1], Convert.ToBoolean(args[2])));

                        case 4: return(bot.WriteDigital(args[1], Convert.ToBoolean(args[2]), Convert.ToBoolean(args[3])));
                        }
                    }

                    // If here, something went wrong...
                    Machina.Logger.Error($"Badly formatted instruction: \"{instruction}\"");
                    return(false);
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("WriteAnalog", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    int  count      = args.Length;
                    int  pin        = 0;
                    bool digitalPin = Int32.TryParse(args[1], out pin);

                    if (digitalPin)
                    {
                        switch (count)
                        {
                        case 3: return(bot.WriteAnalog(pin, Convert.ToDouble(args[2])));

                        case 4: return(bot.WriteAnalog(pin, Convert.ToDouble(args[2]), Convert.ToBoolean(args[3])));
                        }
                    }
                    else
                    {
                        switch (count)
                        {
                        case 3: return(bot.WriteAnalog(args[1], Convert.ToDouble(args[2])));

                        case 4: return(bot.WriteAnalog(args[1], Convert.ToDouble(args[2]), Convert.ToBoolean(args[3])));
                        }
                    }

                    // If here, something went wrong...
                    Machina.Logger.Error($"Badly formatted instruction: \"{instruction}\"");
                    return(false);
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Extrude", StringComparison.CurrentCultureIgnoreCase))
            {
                return(bot.Extrude());
            }

            // If here, instruction is not available or something went wrong...
            Machina.Logger.Error($"I don't understand \"{instruction}\"...");
            return(false);
        }
Esempio n. 3
0
        public bool ExecuteInstruction(string instruction)
        {
            string[] args = Machina.Utilities.Parsing.ParseStatement(instruction);
            if (args == null || args.Length == 0)
            {
                Machina.Logger.Error($"I don't understand \"{instruction}\"...");
                return(false);
            }

            //  ███╗   ███╗██╗   ██╗     ██████╗ ██╗    ██╗███╗   ██╗
            //  ████╗ ████║╚██╗ ██╔╝    ██╔═══██╗██║    ██║████╗  ██║
            //  ██╔████╔██║ ╚████╔╝     ██║   ██║██║ █╗ ██║██╔██╗ ██║
            //  ██║╚██╔╝██║  ╚██╔╝      ██║   ██║██║███╗██║██║╚██╗██║
            //  ██║ ╚═╝ ██║   ██║       ╚██████╔╝╚███╔███╔╝██║ ╚████║
            //  ╚═╝     ╚═╝   ╚═╝        ╚═════╝  ╚══╝╚══╝ ╚═╝  ╚═══╝

            if (args[0].Equals("Test1", StringComparison.CurrentCultureIgnoreCase))
            {
                return(bot.Test1());
            }
            else if (args[0].Equals("Test2", StringComparison.CurrentCultureIgnoreCase))
            {
                return(bot.Test2());
            }
            // easy way to define tool
            else if (args[0].Equals("tool", StringComparison.CurrentCultureIgnoreCase))
            {
                if (args[1].Equals("pallet", StringComparison.CurrentCultureIgnoreCase))
                {
                    return(bot.DefineTool("pallet", new Machina.Point(-63, 0, 70), Machina.Orientation.WorldXY));
                }
                if (args[1].Equals("vacuum", StringComparison.CurrentCultureIgnoreCase))
                {
                    return(bot.DefineTool("vacuum", new Machina.Point(83, 0, 50), Machina.Orientation.WorldXY));
                }

                // print error with line number.
                ErrorWithLineNum(args[1]);

                return(false);
            }
            else if (args[0].Equals("MoveToRobTarget", StringComparison.CurrentCultureIgnoreCase))
            {
                // action MoveToRobTarget is only available in ABB robots
                // further testing for UR robots is needed (have no UR Robot)
                if (bot.Brand == RobotType.ABB)
                {
                    try
                    {
                        return(bot.MoveToRobTarget(
                                   Convert.ToDouble(args[1], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[3], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[4], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[5], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[6], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[7], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[8], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[9], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[10], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[11], CultureInfo.InvariantCulture)
                                   ));
                    }
                    catch (Exception ex)
                    {
                        BadFormatInstruction(instruction, ex);
                        return(false);
                    }
                }
            }
            else if (args[0].Equals("MoveCToRobTarget", StringComparison.CurrentCultureIgnoreCase))
            {
                // Action MovecToRobTarget is only available to ABB robots
                // further testing for UR robots is needed (have no UR Robot)
                if (bot.Brand == RobotType.ABB)
                {
                    try
                    {
                        return(bot.MovecToRobTarget(
                                   Convert.ToDouble(args[1], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[3], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[4], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[5], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[6], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[7], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[8], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[9], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[10], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[11], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[12], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[13], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[14], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[15], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[16], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[17], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[18], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[19], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[20], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[21], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[22], CultureInfo.InvariantCulture)
                                   ));
                    }
                    catch (Exception ex)
                    {
                        BadFormatInstruction(instruction, ex);
                        return(false);
                    }
                }
            }
            else if (args[0].Equals("abbDefineTool", StringComparison.CurrentCultureIgnoreCase))
            {
                if (bot.Brand == RobotType.ABB)
                {
                    try
                    {
                        return(bot.AbbDefineTool(
                                   args[1],
                                   Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[3], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[4], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[5], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[6], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[7], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[8], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[9], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[10], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[11], CultureInfo.InvariantCulture),
                                   Convert.ToDouble(args[12], CultureInfo.InvariantCulture)
                                   ));
                    }
                    catch (Exception ex)
                    {
                        BadFormatInstruction(instruction, ex);
                        return(false);
                    }
                }
            }
            else if (args[0].Equals("abbAttachTool", StringComparison.CurrentCultureIgnoreCase))
            {
                if (bot.Brand == RobotType.ABB)
                {
                    try
                    {
                        return(bot.AbbAttachTool(args[1]));
                    }
                    catch (Exception ex)
                    {
                        BadFormatInstruction(instruction, ex);
                        return(false);
                    }
                }
            }

            //  ███████╗██╗  ██╗██╗███████╗████████╗██╗███╗   ██╗ ██████╗
            //  ██╔════╝╚██╗██╔╝██║██╔════╝╚══██╔══╝██║████╗  ██║██╔════╝
            //  █████╗   ╚███╔╝ ██║███████╗   ██║   ██║██╔██╗ ██║██║  ███╗
            //  ██╔══╝   ██╔██╗ ██║╚════██║   ██║   ██║██║╚██╗██║██║   ██║
            //  ███████╗██╔╝ ██╗██║███████║   ██║   ██║██║ ╚████║╚██████╔╝
            //  ╚══════╝╚═╝  ╚═╝╚═╝╚══════╝   ╚═╝   ╚═╝╚═╝  ╚═══╝ ╚═════╝

            // This is horrible, but oh well...
            if (args[0].Equals("MotionMode", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.MotionMode(args[1]));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Speed", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Speed(Convert.ToDouble(args[1], CultureInfo.InvariantCulture)));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("SpeedTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.SpeedTo(Convert.ToDouble(args[1], CultureInfo.InvariantCulture)));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Acceleration", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Acceleration(Convert.ToDouble(args[1], CultureInfo.InvariantCulture)));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("AccelerationTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.AccelerationTo(Convert.ToDouble(args[1], CultureInfo.InvariantCulture)));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Precision", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Precision(Convert.ToDouble(args[1], CultureInfo.InvariantCulture)));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("PrecisionTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.PrecisionTo(Convert.ToDouble(args[1], CultureInfo.InvariantCulture)));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Coordinates", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is still not implemented.");
                return(false);
            }
            else if (args[0].Equals("Temperature", StringComparison.CurrentCultureIgnoreCase) || args[0].Equals("TemperatureTo", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is still not implemented.");
                return(false);
            }
            else if (args[0].Equals("ExtrusionRate", StringComparison.CurrentCultureIgnoreCase) || args[0].Equals("ExtrusionRateTo", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is still not implemented.");
                return(false);
            }
            else if (args[0].Equals("PushSettings", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.PushSettings();
                return(true);
            }
            else if (args[0].Equals("PopSettings", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.PopSettings();
                return(true);
            }
            else if (args[0].Equals("Move", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Move(
                               Convert.ToDouble(args[1], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[3], CultureInfo.InvariantCulture)
                               ));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("MoveTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.MoveTo(
                               Convert.ToDouble(args[1], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[3], CultureInfo.InvariantCulture)
                               ));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Rotate", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Rotate(
                               Convert.ToDouble(args[1], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[3], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[4], CultureInfo.InvariantCulture)
                               ));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("RotateTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.RotateTo(
                               Convert.ToDouble(args[1], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[3], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[4], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[5], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[6], CultureInfo.InvariantCulture)
                               ));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Transform", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is still not implemented.");
                return(false);
            }
            else if (args[0].Equals("TransformTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.TransformTo(
                               Convert.ToDouble(args[1], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[3], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[4], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[5], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[6], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[7], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[8], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[9], CultureInfo.InvariantCulture)
                               ));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Axes", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Axes(
                               Convert.ToDouble(args[1], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[3], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[4], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[5], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[6], CultureInfo.InvariantCulture)
                               ));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("AxesTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.AxesTo(
                               Convert.ToDouble(args[1], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[3], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[4], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[5], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[6], CultureInfo.InvariantCulture)
                               ));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("ExternalAxis", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    int axisNumber;
                    try
                    {
                        axisNumber = Convert.ToInt32(args[1]);
                        if (axisNumber < 1 || axisNumber > 6)
                        {
                            Logger.Error($"Axis number must be between 1 and 6");
                            return(false);
                        }
                    }
                    catch
                    {
                        Logger.Error($"Axis number must be an integer");
                        return(false);
                    }

                    double increment;
                    try
                    {
                        increment = Convert.ToDouble(args[2], CultureInfo.InvariantCulture);
                    }
                    catch
                    {
                        Logger.Error($"Invalid increment value " + args[2]);
                        return(false);
                    }

                    string target = "All";
                    if (args.Length > 3)
                    {
                        target = args[3];
                    }

                    return(bot.ExternalAxis(axisNumber, increment, target));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("ExternalAxisTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    int axisNumber;
                    try
                    {
                        axisNumber = Convert.ToInt32(args[1]);
                        if (axisNumber < 1 || axisNumber > 6)
                        {
                            Logger.Error($"Axis number must be between 1 and 6");
                            return(false);
                        }
                    }
                    catch
                    {
                        Logger.Error($"Axis number must be an integer");
                        return(false);
                    }

                    double val;
                    try
                    {
                        val = Convert.ToDouble(args[2], CultureInfo.InvariantCulture);
                    }
                    catch
                    {
                        Logger.Error($"Invalid value " + args[2]);
                        return(false);
                    }

                    string target = "All";
                    if (args.Length > 3)
                    {
                        target = args[3];
                    }

                    return(bot.ExternalAxisTo(axisNumber, val, target));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("ArmAngle", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error("Relative `ArmAngle` is temporarily disabled, please use the absolute `ArmAngleTo` version instead.");
                return(false);

                //Logger.Warning(
                //"Relative `ArmAngle` is temporarily disabled, please use the absolute `ArmAngleTo` version instead.");
            }
            else if (args[0].Equals("ArmAngleTo", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    double val;
                    try
                    {
                        val = Convert.ToDouble(args[1], CultureInfo.InvariantCulture);
                    }
                    catch
                    {
                        Logger.Error($"Invalid value " + args[1]);
                        return(false);
                    }

                    //double val;
                    //if (!Double.TryParse(args[1], out val))
                    //{
                    //    Logger.Error($"Invalid value " + args[1]);
                    //    return false;
                    //}

                    return(bot.ArmAngleTo(val));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Wait", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Wait(Convert.ToInt32(args[1])));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Message", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.Message(args[1]));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Comment", StringComparison.CurrentCultureIgnoreCase))
            {
                // Do nothing here, just go through with it.
                return(true);
            }
            else if (args[0].Equals("CustomCode", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Warning("\"CustomCode\" can lead to unexpected results, use with caution and only if you REALLY know what you are doing.");

                try
                {
                    string statement = args[1];
                    bool   dec       = false;
                    if (args.Length > 2)
                    {
                        dec = bool.Parse(args[2]);  // if not good, throw and explain
                    }

                    return(bot.CustomCode(statement, dec));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                }

                return(false);
            }
            else if (args[0].Equals("new Tool", StringComparison.CurrentCultureIgnoreCase) ||
                     args[0].Equals("Tool.Create", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is deprecated, please update your client and use \"DefineTool\" instead. Action will have no effect.");
                return(false);
            }
            else if (args[0].Equals("DefineTool", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.DefineTool(
                               args[1],
                               Convert.ToDouble(args[2], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[3], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[4], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[5], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[6], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[7], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[8], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[9], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[10], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[11], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[12], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[13], CultureInfo.InvariantCulture),
                               Convert.ToDouble(args[14], CultureInfo.InvariantCulture)
                               ));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Attach", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Error($"\"{args[0]}\" is deprecated, please update your client and use \"AttachTool\" instead. Action will have no effect.");
                return(false);
            }
            else if (args[0].Equals("AttachTool", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    return(bot.AttachTool(args[1]));
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Detach", StringComparison.CurrentCultureIgnoreCase))
            {
                bot.Logger.Warning($"\"{args[0]}\" is deprecated, please update your client and use \"DetachTool\" instead.");
                return(bot.DetachTool());
            }
            else if (args[0].Equals("DetachTool", StringComparison.CurrentCultureIgnoreCase))
            {
                return(bot.DetachTool());
            }
            else if (args[0].Equals("WriteDigital", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    int  count      = args.Length;
                    int  pin        = 0;
                    bool digitalPin = Int32.TryParse(args[1], out pin);

                    // Numeric pins
                    if (digitalPin)
                    {
                        switch (count)
                        {
                        case 3: return(bot.WriteAnalog(pin, Convert.ToDouble(args[2], CultureInfo.InvariantCulture)));

                        case 4: return(bot.WriteAnalog(pin, Convert.ToDouble(args[2], CultureInfo.InvariantCulture), Convert.ToBoolean(args[3])));
                        }
                    }
                    // Named pins (ABB)
                    else
                    {
                        switch (count)
                        {
                        case 3: return(bot.WriteAnalog(args[1], Convert.ToDouble(args[2], CultureInfo.InvariantCulture)));

                        case 4: return(bot.WriteAnalog(args[1], Convert.ToDouble(args[2], CultureInfo.InvariantCulture), Convert.ToBoolean(args[3])));
                        }
                    }

                    // If here, something went wrong...
                    // why is this hear and not a call to BadFormatInstruction?
                    Machina.Logger.Error($"Badly formatted instruction: \"{instruction}\"");
                    return(false);
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("WriteAnalog", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    int  count      = args.Length;
                    int  pin        = 0;
                    bool digitalPin = Int32.TryParse(args[1], out pin);

                    if (digitalPin)
                    {
                        switch (count)
                        {
                        case 3: return(bot.WriteAnalog(pin, Convert.ToDouble(args[2])));

                        case 4: return(bot.WriteAnalog(pin, Convert.ToDouble(args[2]), Convert.ToBoolean(args[3])));
                        }
                    }
                    else
                    {
                        switch (count)
                        {
                        case 3: return(bot.WriteAnalog(args[1], Convert.ToDouble(args[2])));

                        case 4: return(bot.WriteAnalog(args[1], Convert.ToDouble(args[2]), Convert.ToBoolean(args[3])));
                        }
                    }

                    // If here, something went wrong...
                    Machina.Logger.Error($"Badly formatted instruction: \"{instruction}\"");
                    return(false);
                }
                catch (Exception ex)
                {
                    BadFormatInstruction(instruction, ex);
                    return(false);
                }
            }
            else if (args[0].Equals("Extrude", StringComparison.CurrentCultureIgnoreCase))
            {
                return(bot.Extrude());
            }

            // If here, instruction is not available or something went wrong...
            Machina.Logger.Error($"I don't understand \"{instruction}\"...");
            return(false);
        }