Example #1
0
        public void ShowPosition()
        {
            GrblViewModel model = (GrblViewModel)DataContext;

            Machine.ToolPosition = null;

            positionPoints.Clear();

            if (Machine.Limits.X == 0d)
            {
                Machine.SetLimits(GrblSettings.GetDouble(GrblSetting.AxisSetting_XMaxTravel),
                                  GrblSettings.GetDouble(GrblSetting.AxisSetting_YMaxTravel),
                                  GrblSettings.GetDouble(GrblSetting.AxisSetting_ZMaxTravel));
            }

            positionPoints.Add(new Point3D(Math.Min(model.Position.X, model.ProgramLimits.MinX) - 5d, model.Position.Y, model.Position.Z));
            positionPoints.Add(new Point3D(Machine.Limits.X, model.Position.Y, model.Position.Z));

            positionPoints.Add(new Point3D(model.Position.X, Math.Min(model.Position.Y, model.ProgramLimits.MinY) - 5d, model.Position.Z));
            positionPoints.Add(new Point3D(model.Position.X, Machine.Limits.Y, model.Position.Z));

            positionPoints.Add(new Point3D(model.Position.X, model.Position.Y, Math.Min(model.Position.Z, model.ProgramLimits.MinZ) - 5d));
            positionPoints.Add(new Point3D(model.Position.X, model.Position.Y, Machine.Limits.Z));

            Machine.ToolPosition = positionPoints;
            var orgpos = Machine.StartPosition;

            Machine.SetStartPosition(model.Position.X, model.Position.Y, model.Position.Z);

            if (Machine.RapidLines != null && Machine.RapidLines.Count > 0 && Machine.RapidLines[0].Equals(orgpos))
            {
                Machine.RapidLines.RemoveAt(0);
                Machine.RapidLines.Insert(0, Machine.StartPosition);
            }
        }
Example #2
0
        // Configure to match Grbl settings (if loaded)
        public bool Config(Config config)
        {
            bool useFirmwareJog = false;

            if (GrblSettings.Loaded)
            {
                double val;
                if ((useFirmwareJog = !(val = GrblSettings.GetDouble(GrblSetting.JogStepDistance)).Equals(double.NaN)))
                {
                    jogDistance[(int)JogMode.Step] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowDistance)).Equals(double.NaN))
                {
                    jogDistance[(int)JogMode.Slow] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastDistance)).Equals(double.NaN))
                {
                    jogDistance[(int)JogMode.Fast] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogStepSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Step] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Slow] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Fast] = val;
                }

                model.IsMetric = GrblSettings.GetString(GrblSetting.ReportInches) != "1";
            }

            if (!useFirmwareJog)
            {
                jogDistance[(int)JogMode.Step] = config.Jog.StepDistance;
                jogDistance[(int)JogMode.Slow] = config.Jog.SlowDistance;
                jogDistance[(int)JogMode.Fast] = config.Jog.SlowDistance;
                jogSpeed[(int)JogMode.Step]    = config.Jog.StepFeedrate;
                jogSpeed[(int)JogMode.Slow]    = config.Jog.SlowFeedrate;
                jogSpeed[(int)JogMode.Fast]    = config.Jog.FastFeedrate;
            }

            GCodeParser.IgnoreM6 = config.IgnoreM6;
            GCodeParser.IgnoreM7 = config.IgnoreM7;
            GCodeParser.IgnoreM8 = config.IgnoreM8;

            useBuffering = config.UseBuffering && GrblSettings.IsGrblHAL;

            return(GrblSettings.Loaded);
        }
        public KeypressHandler(GrblViewModel model)
        {
            grbl = model;

            bool useFirmwareJog = false;

            if (GrblSettings.IsLoaded)
            {
                double val;
                if ((useFirmwareJog = !(val = GrblSettings.GetDouble(GrblSetting.JogStepDistance)).Equals(double.NaN)))
                {
                    jogDistance[(int)JogMode.Step] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowDistance)).Equals(double.NaN))
                {
                    jogDistance[(int)JogMode.Slow] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastDistance)).Equals(double.NaN))
                {
                    jogDistance[(int)JogMode.Fast] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogStepSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Step] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Slow] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Fast] = val;
                }

                model.IsMetric = GrblSettings.GetString(GrblSetting.ReportInches) != "1";
            }

            if (!useFirmwareJog)
            {
                model.JogStep = jogDistance[(int)JogMode.Step] = AppConfig.Settings.Jog.StepDistance;
                jogDistance[(int)JogMode.Slow] = AppConfig.Settings.Jog.SlowDistance;
                jogDistance[(int)JogMode.Fast] = AppConfig.Settings.Jog.SlowDistance;
                jogSpeed[(int)JogMode.Step]    = AppConfig.Settings.Jog.StepFeedrate;
                jogSpeed[(int)JogMode.Slow]    = AppConfig.Settings.Jog.SlowFeedrate;
                jogSpeed[(int)JogMode.Fast]    = AppConfig.Settings.Jog.FastFeedrate;
            }

            fullJog = AppConfig.Settings.Jog.KeyboardEnable || GrblSettings.IsGrblHAL;
        }
        public void ShowPosition()
        {
            GrblViewModel model = (GrblViewModel)DataContext;

            foreach (var path in position)
            {
                viewport.Children.Remove(path);
            }

            position.Clear();

            double maxX = GrblSettings.GetDouble(GrblSetting.AxisSetting_XMaxTravel);
            double maxY = GrblSettings.GetDouble(GrblSetting.AxisSetting_YMaxTravel);
            double maxZ = GrblSettings.GetDouble(GrblSetting.AxisSetting_ZMaxTravel);

            var positionX = new LinesVisual3D();

            positionX.Color     = Colors.Green;
            positionX.Thickness = 1;
            positionX.Points.Add(new Point3D(model.ProgramLimits.MinX - 5d, model.Position.Y, model.Position.Z));
            positionX.Points.Add(new Point3D(maxX, model.Position.Y, model.Position.Z));
            position.Add(positionX);

            var positionY = new LinesVisual3D();

            positionY.Color     = Colors.Green;
            positionY.Thickness = 1;
            positionY.Points.Add(new Point3D(model.Position.X, model.ProgramLimits.MinY - 5d, model.Position.Z));
            positionY.Points.Add(new Point3D(model.Position.X, maxY, model.Position.Z));
            position.Add(positionY);

            var positionZ = new LinesVisual3D();

            positionZ.Color     = Colors.Green;
            positionZ.Thickness = 1;
            positionZ.Points.Add(new Point3D(model.Position.X, model.Position.Y, model.ProgramLimits.MinZ - 5d));
            positionZ.Points.Add(new Point3D(model.Position.X, model.Position.Y, maxZ));
            position.Add(positionZ);

            foreach (var path in position)
            {
                viewport.Children.Add(path);
            }
        }
Example #5
0
        public KeypressHandler(GrblViewModel model)
        {
            grbl = model;

            bool useFirmwareJog = false;

            if (GrblSettings.IsLoaded)
            {
                double val;
                if ((useFirmwareJog = !(val = GrblSettings.GetDouble(GrblSetting.JogStepDistance)).Equals(double.NaN)))
                {
                    jogDistance[(int)JogMode.Step] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowDistance)).Equals(double.NaN))
                {
                    jogDistance[(int)JogMode.Slow] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastDistance)).Equals(double.NaN))
                {
                    jogDistance[(int)JogMode.Fast] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogStepSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Step] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Slow] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Fast] = val;
                }

                fullJog        = GrblSettings.IsGrblHAL;
                model.IsMetric = GrblSettings.GetString(GrblSetting.ReportInches) != "1";
            }

            if (!useFirmwareJog)
            {
                AppConfig.Settings.Jog.PropertyChanged += Jog_PropertyChanged;
                updateConfig();
            }
        }
Example #6
0
        // Configure to match Grbl settings (if loaded)
        public bool Config()
        {
            if (GrblSettings.Loaded)
            {
                double val;
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogStepDistance)).Equals(double.NaN))
                {
                    jogDistance[(int)JogMode.Step] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowDistance)).Equals(double.NaN))
                {
                    jogDistance[(int)JogMode.Slow] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastDistance)).Equals(double.NaN))
                {
                    jogDistance[(int)JogMode.Fast] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogStepSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Step] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Slow] = val;
                }
                if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastSpeed)).Equals(double.NaN))
                {
                    jogSpeed[(int)JogMode.Fast] = val;
                }

                if (GrblSettings.GetString(GrblSetting.ReportInches) == "1")
                {
                    model.Unit   = "in";
                    model.Format = GrblConstants.FORMAT_IMPERIAL;
                }
            }

            return(GrblSettings.Loaded);
        }
Example #7
0
        public bool Update()
        {
            if (GrblSettings.IsLoaded)
            {
                XMaxFeedRate  = GrblSettings.GetDouble(GrblSetting.AxisSetting_XMaxRate);
                XAcceleration = GrblSettings.GetDouble(GrblSetting.AxisSetting_XAcceleration);
                ZMaxFeedRate  = GrblSettings.GetDouble(GrblSetting.AxisSetting_ZMaxRate);
                ZAcceleration = GrblSettings.GetDouble(GrblSetting.AxisSetting_ZAcceleration);
                RpmMin        = GrblSettings.GetDouble(GrblSetting.RpmMin);
                RpmMax        = GrblSettings.GetDouble(GrblSetting.RpmMax);

                GrblParserState.Get();

                if (!xmodelock)
                {
                    xmode = GrblParserState.LatheMode;
                }

                SetLimits();
            }

            return(GrblSettings.IsLoaded);
        }
Example #8
0
        public bool Update()
        {
            if (GrblSettings.IsLoaded)
            {
                XMaxFeedRate  = GrblSettings.GetDouble(GrblSetting.MaxFeedRateBase);
                XAcceleration = GrblSettings.GetDouble(GrblSetting.AccelerationBase);
                ZMaxFeedRate  = GrblSettings.GetDouble(GrblSetting.MaxFeedRateBase + GrblConstants.Z_AXIS);
                ZAcceleration = GrblSettings.GetDouble(GrblSetting.AccelerationBase + GrblConstants.Z_AXIS);
                RpmMin        = GrblSettings.GetDouble(GrblSetting.RpmMin);
                RpmMax        = GrblSettings.GetDouble(GrblSetting.RpmMax);

                GrblParserState.Get();

                if (!xmodelock)
                {
                    xmode = GrblParserState.LatheMode;
                }

                SetLimits();
            }

            return(GrblSettings.IsLoaded);
        }
Example #9
0
        public bool LoadFile(CNC.Controls.GCode job, string filename)
        {
            bool ok = true;

            this.job = job;

            if (filename.EndsWith("Edge_Cuts.plt") || filename.EndsWith("Paste.plt"))
            {
                isCut = !filename.EndsWith("Paste.plt");
            }
            else
            {
                isCut = (GrblMode)GrblSettings.GetDouble(GrblSetting.Mode) != GrblMode.Laser;
            }

            settings.EnableToolSelection = true;
            settings.Profile             = "HPGL" + (isCut ? "" : "Laser");

            if (new JobParametersDialog(settings)
            {
                Owner = Application.Current.MainWindow
            }.ShowDialog() != true)
            {
                return(false);
            }

            FileInfo     file = new FileInfo(filename);
            StreamReader sr   = file.OpenText();

            using (new UIUtils.WaitCursor()) {
                string s = sr.ReadLine();

                while (s != null)
                {
                    foreach (string cmd in s.Split(';'))
                    {
                        try
                        {
                            switch (cmd.Substring(0, 2))
                            {
                            case "PM":
                                if ((inPolygon = dbl.Parse(cmd.Substring(2)) == 0d))
                                {
                                    pm0.Clear();
                                    HPGLCommand hpgl = new HPGLCommand();
                                    hpgl.Command = commands.Last().Command;
                                    hpgl.Pos.X   = commands.Last().Pos.X;
                                    hpgl.Pos.Y   = commands.Last().Pos.Y;
                                    pm0.Add(hpgl);
                                }
                                else if (pm0.Count > 0)
                                {
                                    Polygon polygon;
                                    toVectors(pm0);
                                    if ((polygon = Polygon.findPolygon(vectors, tolerance)) != null)
                                    {
                                        polygons.Add(polygon);
                                    }
                                }
                                break;

                            case "PT":
                                scaleFix = 0.025d;
                                break;

                            case "PA":
                            {
                                var args = cmd.Substring(2).Split(',');
                                if (args.Length > 1)
                                {
                                    HPGLCommand hpgl = new HPGLCommand();
                                    hpgl.Command = cmd.Substring(0, 2);
                                    hpgl.Pos.X   = dbl.Parse(args[0]) * scaleFix;
                                    hpgl.Pos.Y   = dbl.Parse(args[1]) * scaleFix;
                                    offset.X     = Math.Min(offset.X, hpgl.Pos.X);
                                    offset.Y     = Math.Min(offset.Y, hpgl.Pos.Y);
                                    if (inPolygon)
                                    {
                                        pm0.Add(hpgl);
                                    }
                                    else
                                    {
                                        commands.Add(hpgl);
                                    }
                                }
                            }
                            break;

                            case "AA":
                            {
                                var args = cmd.Substring(2).Split(',');
                                if (args.Length > 2)
                                {
                                    HPGLCommand hpgl = new HPGLCommand();
                                    hpgl.Command = cmd.Substring(0, 2);
                                    hpgl.Pos.X   = dbl.Parse(args[0]) * scaleFix;
                                    hpgl.Pos.Y   = dbl.Parse(args[1]) * scaleFix;
                                    hpgl.R       = dbl.Parse(args[2]) * scaleFix;
                                    offset.X     = Math.Min(offset.X, hpgl.Pos.X);
                                    offset.Y     = Math.Min(offset.Y, hpgl.Pos.Y);
                                    if (inPolygon)
                                    {
                                        pm0.Add(hpgl);
                                    }
                                    else
                                    {
                                        commands.Add(hpgl);
                                    }
                                }
                            }
                            break;

                            case "PD":
                            case "PU":
                            {
                                HPGLCommand hpgl = new HPGLCommand();
                                hpgl.Command = cmd.Substring(0, 2);
                                if (inPolygon)
                                {
                                    pm0.Add(hpgl);
                                }
                                else
                                {
                                    isDown = hpgl.Command == "PD";
                                    commands.Add(hpgl);
                                }
                            }
                            break;

                            default:
                            {
                                HPGLCommand hpgl = new HPGLCommand();
                                hpgl.Command = cmd.Substring(0, 2);
                                commands.Add(hpgl);
                            }
                            break;
                            }
                        }
                        catch
                        {
                        }
                    }

                    s = sr.ReadLine();
                }

                sr.Close();

                for (int i = 0; i < commands.Count; i++)
                {
                    var cmd = commands[i];

                    try {
                        switch (cmd.Command)
                        {
                        case "IN":
                            pos.X  = cmd.Pos.X = 0d;
                            pos.Y  = cmd.Pos.Y = 0d;
                            isDown = cmd.isDown = false;
                            break;

                        case "PU":
                            if (isDown)
                            {
                                cmd.Pos.X = pos.X;
                                cmd.Pos.Y = pos.Y;
                                isDown    = false;
                            }
                            break;

                        case "PD":
                            if (!isDown)
                            {
                                cmd.Pos.X = pos.X;
                                cmd.Pos.Y = pos.Y;
                                isDown    = true;
                            }
                            break;

                        case "PA":
                            cmd.Pos.X -= offset.X;
                            cmd.Pos.Y -= offset.Y;
                            if ((cmd.isDown = isDown))
                            {
                                var v = new Vector();
                                v.IsArc = false;
                                v.Start = pos;
                                v.End.X = cmd.Pos.X;
                                v.End.Y = cmd.Pos.Y;
                                vectors.Add(v);
                            }
                            break;

                        case "AA":
                        {
                            cmd.Pos.X = cmd.Pos.X - offset.X;
                            cmd.Pos.Y = cmd.Pos.Y - offset.X;
                            if ((cmd.isDown = isDown))
                            {
                                var v = new Vector();
                                v.IsArc = true;
                                v.Start = pos;
                                v.End.X = cmd.Pos.X + (cmd.Pos.X - pos.X);
                                v.End.Y = cmd.Pos.Y + (cmd.Pos.Y - pos.Y);
                                vectors.Add(v);
                            }
                        }
                        break;
                        }
                        pos.X = cmd.Pos.X;
                        pos.Y = cmd.Pos.Y;
                    }
                    catch
                    {
                    }
                }

                {
                    Polygon polygon;

                    while ((polygon = Polygon.findPolygon(vectors, tolerance)) != null)
                    {
                        polygons.Add(polygon);
                    }
                }

                job.AddBlock(filename, CNC.Core.Action.New);
                job.AddBlock("(Translated by HPGL to GCode converter)");
                job.AddBlock(string.Format("(Tool diameter: {0} mm)", settings.ToolDiameter.ToInvariantString()));
                job.AddBlock("G90G91.1G17G21G50");

                if (settings.ScaleX != 1d || settings.ScaleY != 1d)
                {
                    job.AddBlock(string.Format("G51X{0}Y{1}", settings.ScaleX.ToInvariantString(), settings.ScaleY.ToInvariantString()));
                }

                job.AddBlock("G0Z" + settings.ZRapids.ToInvariantString());
                job.AddBlock("X0Y0");

                if (isCut)
                {
                    job.AddBlock(string.Format("M3S{0}", settings.RPM.ToInvariantString()));
                    job.AddBlock("G4P2");
                }
                else
                {
                    job.AddBlock("M122P1");     // Enable laser
                    job.AddBlock("M123P800");   // PPI
                    job.AddBlock("M124P1500");  // Pulse width
                    job.AddBlock("M125Q1P2");   // Enable tube coolant
                    job.AddBlock("M4S90");
                    job.AddBlock("M7");
                    job.AddBlock("M8");
                }

                foreach (var polygon in polygons)
                {
                    if (settings.ToolDiameter != 0d)
                    {
                        polygon.Offset((isCut ? -settings.ToolDiameter : settings.ToolDiameter) / 2d);
                    }
                    cutPolygon(polygon);
                }

                job.AddBlock("G0X0Y0Z" + settings.ZHome.ToInvariantString());
                job.AddBlock("M30", CNC.Core.Action.End);
            }

            return(ok);
        }
Example #10
0
        public void Apply()
        {
            double            arcTolerance = GrblSettings.GetDouble(GrblSetting.ArcTolerance);
            GCodeEmulator     emu          = new GCodeEmulator();
            List <GCodeToken> toolPath     = new List <GCodeToken>();

            uint lnr = 0, lnroffset = 0;

            using (new UIUtils.WaitCursor())
            {
                toolPath.Add(new GCComment(Commands.Comment, 0, "Arcs to lines transform applied"));

                foreach (var cmd in emu.Execute(GCode.File.Tokens))
                {
                    switch (cmd.Token.Command)
                    {
                    case Commands.G2:
                    case Commands.G3:
                    {
                        var arc = cmd.Token as GCArc;
                        lnroffset++;
                        lnr = arc.LineNumber;
                        toolPath.Add(new GCComment(Commands.Comment, arc.LineNumber + lnroffset, "Arc to lines start: " + arc.ToString()));

                        List <Point3D> points = arc.GeneratePoints(emu.Plane, ToPos(cmd.Start, emu.IsImperial), arcTolerance, emu.DistanceMode == DistanceMode.Incremental);        // Dynamic resolution
                        foreach (Point3D point in points)
                        {
                            lnroffset++;
                            toolPath.Add(new GCLinearMotion(Commands.G1, arc.LineNumber + lnroffset, ToPos(point, emu.IsImperial), AxisFlags.XYZ));
                        }
                        lnroffset++;
                        toolPath.Add(new GCComment(Commands.Comment, arc.LineNumber + lnroffset, "Arc to lines end"));
                    }
                    break;

                    case Commands.G5:
                    {
                        var spline = cmd.Token as GCSpline;
                        lnroffset++;
                        lnr = spline.LineNumber;
                        toolPath.Add(new GCComment(Commands.Comment, spline.LineNumber + lnroffset, "Spline to lines start: " + spline.ToString()));

                        List <Point3D> points = spline.GeneratePoints(ToPos(cmd.Start, emu.IsImperial), arcTolerance, emu.DistanceMode == DistanceMode.Incremental);        // Dynamic resolution
                        foreach (Point3D point in points)
                        {
                            lnroffset++;
                            toolPath.Add(new GCLinearMotion(Commands.G1, spline.LineNumber + lnroffset, ToPos(point, emu.IsImperial), AxisFlags.XYZ));
                        }
                        lnroffset++;
                        toolPath.Add(new GCComment(Commands.Comment, lnr, "Spline to lines end"));
                    }
                    break;

                    default:
                        cmd.Token.LineNumber += lnroffset;
                        toolPath.Add(cmd.Token);
                        lnr = cmd.Token.LineNumber;
                        break;
                    }
                }

                List <string> gc = GCodeParser.TokensToGCode(toolPath, AppConfig.Settings.Base.AutoCompress);

                GCode.File.AddBlock(string.Format("Arcs to lines transform applied: {0}", GCode.File.Model.FileName), Core.Action.New);

                foreach (string block in gc)
                {
                    GCode.File.AddBlock(block, Core.Action.Add);
                }

                GCode.File.AddBlock("", Core.Action.End);
            }
        }
Example #11
0
        private void JogControl_Loaded(object sender, RoutedEventArgs e)
        {
            if (DataContext is GrblViewModel)
            {
                mode                   = GrblSettings.GetInteger(GrblSetting.ReportInches) == 0 ? "G21" : "G20";
                softLimits             = !(GrblInfo.IsGrblHAL && GrblSettings.GetInteger(grblHALSetting.SoftLimitJogging) == 1) && GrblSettings.GetInteger(GrblSetting.SoftLimitsEnable) == 1;
                limitSwitchesClearance = GrblSettings.GetDouble(GrblSetting.HomingPulloff);

                JogData.SetMetric(mode == "G21");

                if (!keyboardMappingsOk)
                {
                    if (!GrblInfo.HasFirmwareJog || AppConfig.Settings.Jog.LinkStepJogToUI)
                    {
                        JogData.PropertyChanged += JogData_PropertyChanged;
                    }

                    if (softLimits)
                    {
                        (DataContext as GrblViewModel).PropertyChanged += Model_PropertyChanged;
                    }

                    keyboard = (DataContext as GrblViewModel).Keyboard;

                    keyboardMappingsOk = true;

                    if (AppConfig.Settings.Jog.Mode == JogConfig.JogMode.UI)
                    {
                        keyboard.AddHandler(Key.PageUp, ModifierKeys.None, cursorKeyJog, false);
                        keyboard.AddHandler(Key.PageDown, ModifierKeys.None, cursorKeyJog, false);
                        keyboard.AddHandler(Key.Left, ModifierKeys.None, cursorKeyJog, false);
                        keyboard.AddHandler(Key.Up, ModifierKeys.None, cursorKeyJog, false);
                        keyboard.AddHandler(Key.Right, ModifierKeys.None, cursorKeyJog, false);
                        keyboard.AddHandler(Key.Down, ModifierKeys.None, cursorKeyJog, false);
                    }

                    keyboard.AddHandler(xplus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false);
                    keyboard.AddHandler(xminus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false);
                    keyboard.AddHandler(yplus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false);
                    keyboard.AddHandler(yminus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false);
                    keyboard.AddHandler(zplus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false);
                    keyboard.AddHandler(zminus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false);
                    if (GrblInfo.AxisFlags.HasFlag(AxisFlags.A))
                    {
                        keyboard.AddHandler(aplus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false);
                        keyboard.AddHandler(aminus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false);
                    }

                    if (AppConfig.Settings.Jog.Mode != JogConfig.JogMode.Keypad)
                    {
                        keyboard.AddHandler(Key.End, ModifierKeys.None, endJog, false);

                        keyboard.AddHandler(Key.NumPad0, ModifierKeys.Control, adjustJog);
                        keyboard.AddHandler(Key.NumPad1, ModifierKeys.Control, adjustJog);
                        keyboard.AddHandler(Key.NumPad2, ModifierKeys.Control, adjustJog);
                        keyboard.AddHandler(Key.NumPad3, ModifierKeys.Control, adjustJog);
                        keyboard.AddHandler(Key.NumPad4, ModifierKeys.Control, adjustJog);
                        keyboard.AddHandler(Key.NumPad5, ModifierKeys.Control, adjustJog);
                        keyboard.AddHandler(Key.NumPad6, ModifierKeys.Control, adjustJog);
                        keyboard.AddHandler(Key.NumPad7, ModifierKeys.Control, adjustJog);

                        keyboard.AddHandler(Key.NumPad2, ModifierKeys.None, adjustJog2);
                        keyboard.AddHandler(Key.NumPad4, ModifierKeys.None, adjustJog2);
                        keyboard.AddHandler(Key.NumPad6, ModifierKeys.None, adjustJog2);
                        keyboard.AddHandler(Key.NumPad8, ModifierKeys.None, adjustJog2);
                    }
                }
            }
        }