private void AxisEnabled_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (AxisEnabled.Value.ToString().Length == 1) { Comms.com.WriteString(string.Format("M122{0}S1\r", AxisEnabled.Value.ToString())); SGValue = GrblSettings.GetInteger(grblHALSetting.StallGuardBase + GrblInfo.AxisLetterToIndex(AxisEnabled.Value.ToString())); } }
void cvOffset_Click(object sender, RoutedEventArgs e) { if (selectedTool != null) { string axisletter = (string)((CoordValueSetControl)sender).Tag; int axis = GrblInfo.AxisLetterToIndex(axisletter); selectedTool.Values[axis] = offset.Values[axis]; saveOffset(axisletter); } }
public DROControl() { InitializeComponent(); foreach (DROBaseControl axis in UIUtils.FindLogicalChildren <DROBaseControl>(this)) { axis.Tag = GrblInfo.AxisLetterToIndex(axis.Label); axis.txtReadout.GotFocus += TxtReadout_GotFocus; axis.txtReadout.LostFocus += txtPos_LostFocus; axis.txtReadout.PreviewKeyUp += txtPos_KeyPress; axis.btnZero.Click += btnZero_Click; } }
private void Window_Loaded(object sender, RoutedEventArgs e) { System.Threading.Thread.Sleep(50); Comms.com.PurgeQueue(); using (new UIUtils.WaitCursor()) { GrblInfo.Get(); GrblSettings.Get(); } configView.Activate(true, ViewType.Startup); }
private void About_Load(object sender, System.EventArgs e) { GrblInfo.Get(); txtGrblVersion.Content = GrblInfo.Version; txtGrblOptions.Content = GrblInfo.Options; txtGrblNewOpts.Content = GrblInfo.NewOptions; grpGrbl.Header = GrblSettings.IsGrblHAL ? "grblHAL" : "grbl"; if (GrblInfo.Identity != "") { grpGrbl.Header += ": " + GrblInfo.Identity; } }
// G10 L1 P- axes <R- I- J- Q-> Set Tool Table // L10 - ref G5x + G92 - useful for probe (G38) // L11 - ref g59.3 only // Q: 1 - 8: 1: 135, 2: 45, 3: 315, 4: 225, 5: 180, 6: 90, 7: 0, 8: 270 void saveOffset(string axis) { string s, axes = string.Empty; string[] soffset = new string[6]; if (axis == "All") { int i = 0, axisflags = GrblInfo.AxisFlags; while (axisflags != 0) { if ((axisflags & 0x01) != 0) { axes += string.Format("{0}{{{1}}}", GrblInfo.AxisIndexToLetter(i), i + 1); } i++; axisflags >>= 1; } } else { axes = axis + "{" + (GrblInfo.AxisLetterToIndex(axis) + 1).ToString() + "}"; } for (int i = 0; i < selectedOffset.Values.Length; i++) { if (i == 0) { soffset[i] = GrblWorkParameters.ConvertX(GrblWorkParameters.LatheMode, GrblParserState.LatheMode, selectedOffset.X).ToInvariantString(); } else { soffset[i] = selectedOffset.Values[i].ToInvariantString(); } } string xOffset = GrblWorkParameters.ConvertX(GrblWorkParameters.LatheMode, GrblParserState.LatheMode, selectedOffset.X).ToInvariantString(); if (selectedOffset.Id == 0) { string code = selectedOffset.Code == "G28" || selectedOffset.Code == "G30" ? selectedOffset.Code + ".1" : selectedOffset.Code; s = string.Format("G90{0}" + axes, code, soffset[0], soffset[1], soffset[2], soffset[3], soffset[4], soffset[5]); } else { s = string.Format("G90G10L2P{0}" + axes, selectedOffset.Id, soffset[0], soffset[1], soffset[2], soffset[3], soffset[4], soffset[5]); } Comms.com.WriteCommand(s); }
public UserUI() { string PortParams = ""; InitializeComponent(); try { XmlDocument config = new XmlDocument(); config.Load(Application.StartupPath + "\\App.config"); foreach (XmlNode N in config.SelectNodes("Config/*")) { switch (N.Name) { case "PortParams": PortParams = N.InnerText; break; } } } catch { MessageBox.Show("Config file not found or invalid.", this.Text); System.Environment.Exit(1); } #if DEBUG PortParams = "com29:115200,N,8,1,P"; #endif new SerialComms(PortParams, Comms.ResetMode.None); if (!Comms.com.IsOpen) { this.com = null; MessageBox.Show("Unable to open serial port!", this.Text); System.Environment.Exit(2); } GrblLanguage.language = "en_US"; GrblInfo.Get(); GrblSettings.Load(); this.Text += ", Grbl version " + GrblInfo.Version; }
void AxisPositionChanged(string axis, double position) { if (axis == "ALL") { string s = "G90G10L20P0"; foreach (int i in GrblInfo.AxisFlags.ToIndices()) { s += GrblInfo.AxisIndexToLetter(i) + "{0}"; } (DataContext as GrblViewModel).ExecuteCommand(string.Format(s, position.ToInvariantString("F3"))); } else { (DataContext as GrblViewModel).ExecuteCommand(string.Format("G10L20P0{0}{1}", axis, position.ToInvariantString("F3"))); } }
private void txtPos_KeyPress(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { NumericTextBox axis = (NumericTextBox)sender; if (axis.Value != orgpos) { AxisPositionChanged(GrblInfo.AxisIndexToLetter((int)axis.Tag), axis.Value); } axis.IsReadOnly = true; DROEnabledChanged?.Invoke(false); } }
public void SetNumAxes(int numAxes) { if (numAxes <= 3 || numAxes > 6) { return; } string axes = "XYZ"; for (int axis = 3; axis < numAxes; axis++) { axes += GrblInfo.AxisIndexToLetter(axis); } Config(axes + baseSignals); }
void AxisPositionChanged(string axis, double position) { if (axis == "ALL") { string s = "G90G10L20P0"; for (int i = 0; i < GrblInfo.NumAxes; i++) { s += GrblInfo.AxisIndexToLetter(i) + "{0}"; } Grbl.MDICommand(DataContext, string.Format(s, position.ToInvariantString("F3"))); } else { Grbl.MDICommand(DataContext, string.Format("G10L20P0{0}{1}", axis, position.ToInvariantString("F3"))); } }
private void Window_Loaded(object sender, RoutedEventArgs e) { System.Threading.Thread.Sleep(50); Comms.com.PurgeQueue(); using (new UIUtils.WaitCursor()) { GrblInfo.Get(); GrblSettings.Load(); } halsettings.IsEnabled = grblsettings.IsEnabled = GrblInfo.IsGrblHAL && GrblInfo.Build >= 20210819; grblalarms.IsEnabled = grblerrors.IsEnabled = GrblInfo.IsGrblHAL && GrblInfo.Build >= 20210823; configView.Activate(true, ViewType.Startup); }
// G10 L1 P- axes <R- I- J- Q-> Set Tool Table // L10 - ref G5x + G92 - useful for probe (G38) // L11 - ref g59.3 only // Q: 1 - 8: 1: 135, 2: 45, 3: 315, 4: 225, 5: 180, 6: 90, 7: 0, 8: 270 void saveOffset(string axis) { string s; string axes = axis == "All" ? "X{1}Y{2}Z{3}" : (axis + "{" + (GrblInfo.AxisLetterToIndex(axis) + 1).ToString() + "}"); string xOffset = GrblWorkParameters.ConvertX(GrblWorkParameters.LatheMode, GrblParserState.LatheMode, selectedOffset.X).ToInvariantString(); if (selectedOffset.Id == 0) { string code = selectedOffset.Code == "G28" || selectedOffset.Code == "G30" ? selectedOffset.Code + ".1" : selectedOffset.Code; s = string.Format("G90{0}" + axes, code, xOffset, selectedOffset.Y.ToInvariantString(), selectedOffset.Z.ToInvariantString()); } else { s = string.Format("G90G10L2P{0}" + axes, selectedOffset.Id, xOffset, selectedOffset.Y.ToInvariantString(), selectedOffset.Z.ToInvariantString()); } Comms.com.WriteCommand(s); }
public void Activate(bool activate, ViewType chgMode) { Comms.com.WriteString(string.Format("M122S{0}H{1}\r", activate ? 1 : 0, SFiltEnabled == true ? 1 : 0)); if (activate) { DataContext = model; model.OnResponseReceived += ProcessSGValue; model.PropertyChanged += OnDataContextPropertyChanged; SGValue = GrblSettings.GetInteger(GrblSetting.StallGuardBase + GrblInfo.AxisLetterToIndex(AxisEnabled.Value.ToString())); } else { model.OnResponseReceived -= ProcessSGValue; model.PropertyChanged -= OnDataContextPropertyChanged; DataContext = null; } model.Poller.SetState(activate ? AppConfig.Settings.Base.PollInterval : 0); }
private void About_Load(object sender, System.EventArgs e) { Title = version; if (CNC.Core.Resources.IsLegacyController) { Title += " (legacy mode)"; } GrblInfo.Get(); txtGrblVersion.Content = GrblInfo.Version; txtGrblOptions.Content = GrblInfo.Options; txtGrblNewOpts.Content = GrblInfo.NewOptions; txtGrblConnection.Content = AppConfig.Settings.Base.PortParams; grpGrbl.Header = GrblInfo.Firmware; if (GrblInfo.Identity != "") { grpGrbl.Header += ": " + GrblInfo.Identity; } }
private void AddEdge(ProbingViewModel probing, char axisletter, bool negative, double XYClearance) { int axis = GrblInfo.AxisLetterToIndex(axisletter); af[axis] = negative ? -1d : 1d; axisflags = GrblInfo.AxisLetterToFlag(axisletter); var rapidto = new Position(probing.StartPosition); rapidto.Values[axis] -= XYClearance * af[axis]; rapidto.Z -= probing.Depth; probing.Program.AddRapidToMPos(rapidto, axisflags); probing.Program.AddRapidToMPos(rapidto, AxisFlags.Z); probing.Program.AddProbingAction(axisflags, negative); rapidto.Values[axis] = probing.StartPosition.Values[axis] - XYClearance * af[axis]; probing.Program.AddRapidToMPos(rapidto, axisflags); probing.Program.AddRapidToMPos(probing.StartPosition, AxisFlags.Z); }
private void AddEdge(ProbingViewModel probing, int offsetAxis, int clearanceAxis, double XYClearance) { AxisFlags probeAxis = GrblInfo.AxisIndexToFlag(clearanceAxis); Position rapidto = new Position(probing.StartPosition); rapidto.Values[clearanceAxis] -= XYClearance * af[clearanceAxis]; rapidto.Z -= probing.Depth; probing.Program.AddRapidToMPos(rapidto, probeAxis); probing.Program.AddRapidToMPos(rapidto, AxisFlags.Z); probing.Program.AddProbingAction(probeAxis, af[clearanceAxis] == -1.0d); probing.Program.AddRapidToMPos(rapidto, probeAxis); rapidto.Values[offsetAxis] = probing.StartPosition.Values[offsetAxis] + probing.Offset * af[offsetAxis]; probing.Program.AddRapidToMPos(rapidto, GrblInfo.AxisIndexToFlag(offsetAxis)); probing.Program.AddProbingAction(probeAxis, af[clearanceAxis] == -1.0d); probing.Program.AddRapidToMPos(rapidto, probeAxis); probing.Program.AddRapidToMPos(probing.StartPosition, AxisFlags.Z); probing.Program.AddRapidToMPos(probing.StartPosition, AxisFlags.XY); }
public void Activate(bool activate, ViewType chgMode) { Comms.com.WriteString(string.Format("M122S{0}H{1}\r", activate ? 1 : 0, SFiltEnabled == true ? 1 : 0)); if (activate) { DataContext = model; model.OnResponseReceived += ProcessSGValue; model.PropertyChanged += OnDataContextPropertyChanged; var sgdetails = GrblSettings.Get(grblHALSetting.StallGuardBase + GrblInfo.AxisLetterToIndex(AxisEnabled.Value.ToString())); SGValue = int.Parse(sgdetails.Value); SGValueMin = (int)sgdetails.Min; SGValueMax = (int)sgdetails.Max; grbl_reset = false; } else { model.OnResponseReceived -= ProcessSGValue; model.PropertyChanged -= OnDataContextPropertyChanged; DataContext = null; } model.Poller.SetState(activate ? AppConfig.Settings.Base.PollInterval : 0); }
// G10 L1 P- axes <R- I- J- Q-> Set Tool Table // L10 - ref G5x + G92 - useful for probe (G38) // L11 - ref g59.3 only // Q: 1 - 8: 1: 135, 2: 45, 3: 315, 4: 225, 5: 180, 6: 90, 7: 0, 8: 270 void saveOffset(string axis) { string axes; Position newpos = new Position(offset); newpos.X = GrblWorkParameters.ConvertX(GrblWorkParameters.LatheMode, GrblParserState.LatheMode, selectedTool.X); switch (axis) { case "R": axes = "R{4}"; break; case "All": axes = newpos.ToString(GrblInfo.AxisFlags); break; default: axes = newpos.ToString(GrblInfo.AxisLetterToFlag(axis)); break; } Comms.com.WriteCommand(string.Format("G10L1P{0}{1}", selectedTool.Code, axes)); }
// G10 L1 P- axes <R- I- J- Q-> Set Tool Table // L10 - ref G5x + G92 - useful for probe (G38) // L11 - ref g59.3 only // Q: 1 - 8: 1: 135, 2: 45, 3: 315, 4: 225, 5: 180, 6: 90, 7: 0, 8: 270 void saveOffset(string axis) { string s, axes; string xOffset = GrblWorkParameters.ConvertX(GrblWorkParameters.LatheMode, GrblParserState.LatheMode, selectedTool.X).ToInvariantString(); switch (axis) { case "R": axes = "R{4}"; break; case "All": axes = "X{1}Y{2}Z{3}R{4}"; break; default: axes = (axis + "{" + (GrblInfo.AxisLetterToIndex(axis) + 1).ToString() + "}"); break; } s = string.Format("G10L1P{0}" + axes, selectedTool.Code, xOffset, selectedTool.Y.ToInvariantString(), selectedTool.Z.ToInvariantString(), selectedTool.R.ToInvariantString()); Comms.com.WriteCommand(s); }
public RestartResult Restart() { Message = model.Message; model.Message = string.Format(LibStrings.FindResource("MsgWaiting"), AppConfig.Settings.Base.PortParams); string response = GrblInfo.Startup(model); if (response.StartsWith("<")) { if (model.GrblState.State != GrblStates.Unknown) { switch (model.GrblState.State) { case GrblStates.Alarm: model.Poller.SetState(AppConfig.Settings.Base.PollInterval); switch (model.GrblState.Substate) { case 1: // Hard limits if (!GrblInfo.IsLoaded) { if (model.LimitTriggered) { MessageBox.Show(string.Format(LibStrings.FindResource("MsgNoCommAlarm"), model.GrblState.Substate.ToString()), "ioSender"); if (AttemptReset()) { model.ExecuteCommand(GrblConstants.CMD_UNLOCK); } else { MessageBox.Show(LibStrings.FindResource("MsgResetFailed"), "ioSender"); return(RestartResult.Close); } } else if (AttemptReset()) { model.ExecuteCommand(GrblConstants.CMD_UNLOCK); } } else { response = string.Empty; } break; case 2: // Soft limits if (!GrblInfo.IsLoaded) { MessageBox.Show(string.Format(LibStrings.FindResource("MsgNoCommAlarm"), model.GrblState.Substate.ToString()), "ioSender"); if (AttemptReset()) { model.ExecuteCommand(GrblConstants.CMD_UNLOCK); } else { MessageBox.Show(LibStrings.FindResource("MsgResetFailed"), "ioSender"); return(RestartResult.Close); } } else { response = string.Empty; } break; case 10: // EStop if (GrblInfo.IsGrblHAL && model.Signals.Value.HasFlag(Signals.EStop)) { MessageBox.Show(LibStrings.FindResource("MsgEStop"), "ioSender", MessageBoxButton.OK, MessageBoxImage.Warning); while (!AttemptReset() && model.GrblState.State == GrblStates.Alarm) { if (MessageBox.Show(LibStrings.FindResource("MsgEStopExit"), "ioSender", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { return(RestartResult.Close); } } ; } else { AttemptReset(); } if (!GrblInfo.IsLoaded) { model.ExecuteCommand(GrblConstants.CMD_UNLOCK); } break; case 11: // Homing required if (GrblInfo.IsLoaded) { response = string.Empty; } else { Message = LibStrings.FindResource("MsgHome"); } break; } break; case GrblStates.Tool: Comms.com.WriteByte(GrblConstants.CMD_STOP); break; case GrblStates.Door: if (!GrblInfo.IsLoaded) { if (MessageBox.Show(LibStrings.FindResource("MsgDoorOpen"), "ioSender", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { return(RestartResult.Close); } else { bool exit = false; do { Comms.com.PurgeQueue(); bool?res = null; CancellationToken cancellationToken = new CancellationToken(); new Thread(() => { res = WaitFor.SingleEvent <string>( cancellationToken, s => TrapReset(s), a => model.OnGrblReset += a, a => model.OnGrblReset -= a, 200, () => Comms.com.WriteByte(GrblConstants.CMD_STATUS_REPORT)); }).Start(); while (res == null) { EventUtils.DoEvents(); } if (!(exit = !model.Signals.Value.HasFlag(Signals.SafetyDoor))) { if (MessageBox.Show(LibStrings.FindResource("MsgDoorExit"), "ioSender", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { exit = true; return(RestartResult.Close); } } } while (!exit); } } else { MessageBox.Show(LibStrings.FindResource("MsgDoorPersist"), "ioSender", MessageBoxButton.YesNo, MessageBoxImage.Exclamation); response = string.Empty; } break; case GrblStates.Hold: case GrblStates.Sleep: if (MessageBox.Show(string.Format(LibStrings.FindResource("MsgNoComm"), model.GrblState.State.ToString()), "ioSender", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { return(RestartResult.Close); } else if (!AttemptReset()) { MessageBox.Show(LibStrings.FindResource("MsgResetExit"), "ioSender"); return(RestartResult.Close); } break; case GrblStates.Idle: if (response.Contains("|SD:Pending")) { AttemptReset(); } break; } } } else { MessageBox.Show(response == string.Empty ? "No respone received from controller, exiting." : string.Format("Unexpected response received from controller: \"{0}\", exiting.", response), "ioSender", MessageBoxButton.OK, MessageBoxImage.Stop); return(RestartResult.Exit); } return(response == string.Empty ? RestartResult.NoResponse : RestartResult.Ok); }
bool InitSystem() { initOK = true; int timeout = 5; using (new UIUtils.WaitCursor()) { GCodeSender.EnablePolling(false); while (!GrblInfo.Get()) { if (--timeout == 0) { model.Message = (string)FindResource("MsgNoResponse"); return(false); } Thread.Sleep(500); } GrblAlarms.Get(); GrblErrors.Get(); GrblSettings.Load(); if (GrblInfo.IsGrblHAL) { GrblParserState.Get(); GrblWorkParameters.Get(); } else { GrblParserState.Get(true); } GCodeSender.EnablePolling(true); } GrblCommand.ToolChange = GrblInfo.ManualToolChange ? "M61Q{0}" : "T{0}"; showProgramLimits(); if (!AppConfig.Settings.GCodeViewer.IsEnabled) { tabGCode.Items.Remove(tab3D); } if (GrblInfo.NumAxes > 3) { limitsControl.Visibility = Visibility.Collapsed; } if (GrblInfo.LatheModeEnabled) { MainWindow.EnableView(true, ViewType.Turning); // MainWindow.EnableView(true, ViewType.Parting); // MainWindow.EnableView(true, ViewType.Facing); MainWindow.EnableView(true, ViewType.G76Threading); } else { MainWindow.ShowView(false, ViewType.Turning); MainWindow.ShowView(false, ViewType.Parting); MainWindow.ShowView(false, ViewType.Facing); MainWindow.ShowView(false, ViewType.G76Threading); } if (GrblInfo.HasSDCard) { MainWindow.EnableView(true, ViewType.SDCard); } else { MainWindow.ShowView(false, ViewType.SDCard); } if (GrblInfo.HasPIDLog) { MainWindow.EnableView(true, ViewType.PIDTuner); } else { MainWindow.ShowView(false, ViewType.PIDTuner); } if (GrblInfo.NumTools > 0) { MainWindow.EnableView(true, ViewType.Tools); } else { MainWindow.ShowView(false, ViewType.Tools); } if (GrblInfo.HasProbe && GrblSettings.ReportProbeCoordinates) { MainWindow.EnableView(true, ViewType.Probing); } MainWindow.EnableView(true, ViewType.Offsets); MainWindow.EnableView(true, ViewType.GRBLConfig); if (!string.IsNullOrEmpty(GrblInfo.TrinamicDrivers)) { MainWindow.EnableView(true, ViewType.TrinamicTuner); } else { MainWindow.ShowView(false, ViewType.TrinamicTuner); } return(true); }
private void InitSystem() { initOK = true; // TODO: check if grbl is in a state that allows replies using (new UIUtils.WaitCursor()) { GCodeSender.EnablePolling(false); GrblInfo.Get(); GrblSettings.Get(); GrblParserState.Get(); GrblWorkParameters.Get(); GCodeSender.EnablePolling(true); } model.Message = ""; GrblCommand.ToolChange = GrblInfo.ManualToolChange ? "M61Q{0}" : "T{0}"; GCodeSender.Config(MainWindow.UIViewModel.Profile.Config); if (GrblInfo.NumAxes > 3) { limitsControl.Visibility = Visibility.Collapsed; } if (GrblInfo.LatheModeEnabled) { MainWindow.EnableView(true, ViewType.Turning); MainWindow.EnableView(true, ViewType.Facing); MainWindow.EnableView(true, ViewType.G76Threading); } else { MainWindow.ShowView(false, ViewType.Turning); MainWindow.ShowView(false, ViewType.Facing); MainWindow.ShowView(false, ViewType.G76Threading); } if (GrblInfo.HasSDCard) { MainWindow.EnableView(true, ViewType.SDCard); } else { MainWindow.ShowView(false, ViewType.SDCard); } if (GrblInfo.HasPIDLog) { MainWindow.EnableView(true, ViewType.PIDTuner); } else { MainWindow.ShowView(false, ViewType.PIDTuner); } if (GrblInfo.NumTools > 0) { MainWindow.EnableView(true, ViewType.Tools); } else { MainWindow.ShowView(false, ViewType.Tools); } MainWindow.EnableView(true, ViewType.Offsets); MainWindow.EnableView(true, ViewType.GRBLConfig); if (!string.IsNullOrEmpty(GrblInfo.TrinamicDrivers)) { MainWindow.EnableView(true, ViewType.TrinamicTuner); } else { MainWindow.ShowView(false, ViewType.TrinamicTuner); } MainWindow.GCodePush += GCode.File.AddBlock; }
// G10 L1 P- axes <R- I- J- Q-> Set Tool Table // L10 - ref G5x + G92 - useful for probe (G38) // L11 - ref g59.3 only // Q: 1 - 8: 1: 135, 2: 45, 3: 315, 4: 225, 5: 180, 6: 90, 7: 0, 8: 270 void saveOffset(string axis) { string cmd; Position newpos = new Position(Offset); newpos.X = GrblWorkParameters.ConvertX(GrblWorkParameters.LatheMode, GrblParserState.LatheMode, selectedOffset.X); if (selectedOffset.Id == 0) { string code = selectedOffset.Code == "G28" || selectedOffset.Code == "G30" ? selectedOffset.Code + ".1" : selectedOffset.Code; if (axis == "ClearAll" || IsPredefined) { cmd = selectedOffset.Code + ".1"; } else { cmd = string.Format("G90{0}{1}", code, newpos.ToString(axis == "All" ? GrblInfo.AxisFlags : GrblInfo.AxisLetterToFlag(axis))); } } else { cmd = string.Format("G90G10L2P{0}{1}", selectedOffset.Id, newpos.ToString(axis == "All" || axis == "ClearAll" ? GrblInfo.AxisFlags : GrblInfo.AxisLetterToFlag(axis))); } Comms.com.WriteCommand(cmd); }
public void Activate(bool activate, ViewType chgMode) { if (activate) { GCodeSender.RewindFile(); GCodeSender.CallHandler(GCode.File.IsLoaded ? StreamingState.Idle : (sdStream ? StreamingState.Start : StreamingState.NoFile), false); sdStream = false; model.ResponseLogFilterOk = AppConfig.Settings.Base.FilterOkResponse; if (initOK != true) { focusedControl = this; var message = model.Message; model.Message = string.Format("Waiting for controller ({0})...", AppConfig.Settings.Base.PortParams); string response = GrblInfo.Startup(model); if (response.StartsWith("<")) { if (model.GrblState.State != GrblStates.Unknown) { switch (model.GrblState.State) { case GrblStates.Alarm: model.Poller.SetState(AppConfig.Settings.Base.PollInterval); switch (model.GrblState.Substate) { case 1: // Hard limits if (!GrblInfo.IsLoaded) { if (model.LimitTriggered) { MessageBox.Show(string.Format("Controller is not able to communicate due to alarm {0}, attempting a soft reset.", model.GrblState.Substate.ToString()), "ioSender"); if (AttemptReset()) { model.ExecuteCommand(GrblConstants.CMD_UNLOCK); } else { MessageBox.Show("Controller soft reset failed, exiting.", "ioSender"); MainWindow.ui.Close(); } } else if (AttemptReset()) { model.ExecuteCommand(GrblConstants.CMD_UNLOCK); } } else { response = string.Empty; } break; case 2: // Soft limits if (!GrblInfo.IsLoaded) { MessageBox.Show(string.Format("Controller is not able to communicate due to alarm {0}, attempting a soft reset.", model.GrblState.Substate.ToString()), "ioSender"); if (AttemptReset()) { model.ExecuteCommand(GrblConstants.CMD_UNLOCK); } else { MessageBox.Show("Controller soft reset failed, exiting.", "ioSender"); MainWindow.ui.Close(); } } else { response = string.Empty; } break; case 10: // EStop if (GrblInfo.IsGrblHAL && model.Signals.Value.HasFlag(Signals.EStop)) { MessageBox.Show("E-Stop active! - clear before continuing.", "ioSender", MessageBoxButton.OK, MessageBoxImage.Warning); while (!AttemptReset() && model.GrblState.State == GrblStates.Alarm) { if (MessageBox.Show("E-Stop still active, exit?", "ioSender", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { MainWindow.ui.Close(); } } ; } else { AttemptReset(); } if (!GrblInfo.IsLoaded) { model.ExecuteCommand(GrblConstants.CMD_UNLOCK); } break; case 11: // Homing required if (GrblInfo.IsLoaded) { response = string.Empty; } else { message = "Homing cycle required, <Home> to continue"; } break; } break; case GrblStates.Tool: Comms.com.WriteByte(GrblConstants.CMD_STOP); break; case GrblStates.Door: if (!GrblInfo.IsLoaded) { if (MessageBox.Show("Door is open, close door and continue?", "ioSender", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { MainWindow.ui.Close(); } else { bool exit = false; do { Comms.com.PurgeQueue(); bool?res = null; CancellationToken cancellationToken = new CancellationToken(); new Thread(() => { res = WaitFor.SingleEvent <string>( cancellationToken, s => TrapReset(s), a => model.OnGrblReset += a, a => model.OnGrblReset -= a, 200, () => Comms.com.WriteByte(GrblConstants.CMD_STATUS_REPORT)); }).Start(); while (res == null) { EventUtils.DoEvents(); } if (!(exit = !model.Signals.Value.HasFlag(Signals.SafetyDoor))) { if (MessageBox.Show("Door is still open, exit?", "ioSender", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { exit = true; MainWindow.ui.Close(); } } } while (!exit); } } else { MessageBox.Show("Door state cannot be cleared with <Reset>", "ioSender", MessageBoxButton.YesNo, MessageBoxImage.Exclamation); response = string.Empty; } break; case GrblStates.Hold: case GrblStates.Sleep: if (MessageBox.Show(string.Format("Controller is in {0} state and cannot respond, try a soft reset?", model.GrblState.State.ToString()), "ioSender", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { MainWindow.ui.Close(); } else if (!AttemptReset()) { MessageBox.Show("Controller soft reset failed, exiting.", "ioSender"); MainWindow.ui.Close(); } break; } } } if (response != string.Empty) { InitSystem(); } model.Message = message; } if (initOK == null) { initOK = false; } #if ADD_CAMERA if (MainWindow.UIViewModel.Camera != null) { MainWindow.UIViewModel.Camera.MoveOffset += Camera_MoveOffset; MainWindow.UIViewModel.Camera.Opened += Camera_Opened; } #endif //if (viewer == null) // viewer = new Viewer(); if (GCode.File.IsLoaded) { MainWindow.ui.WindowTitle = ((GrblViewModel)DataContext).FileName; } } else if (ViewType != ViewType.Shutdown) { DRO.IsFocusable = false; #if ADD_CAMERA if (MainWindow.UIViewModel.Camera != null) { MainWindow.UIViewModel.Camera.MoveOffset -= Camera_MoveOffset; } #endif focusedControl = AppConfig.Settings.Base.KeepMdiFocus && Keyboard.FocusedElement is TextBox && (string)(Keyboard.FocusedElement as TextBox).Tag == "MDI" ? Keyboard.FocusedElement : this; } if (GCodeSender.Activate(activate)) { Task.Delay(500).ContinueWith(t => DRO.EnableFocus()); Application.Current.Dispatcher.BeginInvoke(new System.Action(() => { focusedControl.Focus(); }), DispatcherPriority.Render); } }
private void JogCommand(string cmd) { GrblViewModel model = DataContext as GrblViewModel; if (cmd == "stop") { cmd = ((char)GrblConstants.CMD_JOG_CANCEL).ToString(); } else { var distance = cmd[1] == '-' ? -JogData.Distance : JogData.Distance; if (softLimits) { int axis = GrblInfo.AxisLetterToIndex(cmd[0]); if (jogAxis != -1 && axis != jogAxis) { return; } if (axis != jogAxis) { position = distance + model.MachinePosition.Values[axis]; } else { position += distance; } if (GrblInfo.ForceSetOrigin) { if (!GrblInfo.HomingDirection.HasFlag(GrblInfo.AxisIndexToFlag(axis))) { if (position > 0d) { position = 0d; } else if (position < (-GrblInfo.MaxTravel.Values[axis] + limitSwitchesClearance)) { position = (-GrblInfo.MaxTravel.Values[axis] + limitSwitchesClearance); } } else { if (position < 0d) { position = 0d; } else if (position > (GrblInfo.MaxTravel.Values[axis] - limitSwitchesClearance)) { position = GrblInfo.MaxTravel.Values[axis] - limitSwitchesClearance; } } } else { if (position > -limitSwitchesClearance) { position = -limitSwitchesClearance; } else if (position < -(GrblInfo.MaxTravel.Values[axis] - limitSwitchesClearance)) { position = -(GrblInfo.MaxTravel.Values[axis] - limitSwitchesClearance); } } if (position == 0d) { return; } jogAxis = axis; cmd = string.Format("$J=G53{0}{1}{2}F{3}", mode, cmd.Substring(0, 1), position.ToInvariantString(), Math.Ceiling(JogData.FeedRate).ToInvariantString()); } else { cmd = string.Format("$J=G91{0}{1}{2}F{3}", mode, cmd.Substring(0, 1), distance.ToInvariantString(), Math.Ceiling(JogData.FeedRate).ToInvariantString()); } } model.ExecuteCommand(cmd); }
private void InitSystem() { initOK = true; int timeout = 5; using (new UIUtils.WaitCursor()) { GCodeSender.EnablePolling(false); while (!GrblInfo.Get()) { if (--timeout == 0) { model.Message = "Controller is not responding!"; initOK = false; } Thread.Sleep(500); } GrblAlarms.Get(); GrblErrors.Get(); GrblSettings.Get(); GrblParserState.Get(); GrblWorkParameters.Get(); GCodeSender.EnablePolling(true); } GrblCommand.ToolChange = GrblInfo.ManualToolChange ? "M61Q{0}" : "T{0}"; if (keyboard == null) { keyboard = new KeypressHandler(model); GCodeSender.Configure(keyboard); gcodeRenderer.Configure(); } showProgramLimits(); if (!AppConfig.Settings.GCodeViewer.IsEnabled) { tabGCode.Items.Remove(tab3D); } if (GrblInfo.NumAxes > 3) { limitsControl.Visibility = Visibility.Collapsed; } if (GrblInfo.LatheModeEnabled) { MainWindow.EnableView(true, ViewType.Turning); // MainWindow.EnableView(true, ViewType.Parting); // MainWindow.EnableView(true, ViewType.Facing); MainWindow.EnableView(true, ViewType.G76Threading); } else { MainWindow.ShowView(false, ViewType.Turning); MainWindow.ShowView(false, ViewType.Parting); MainWindow.ShowView(false, ViewType.Facing); MainWindow.ShowView(false, ViewType.G76Threading); } if (GrblInfo.HasSDCard) { MainWindow.EnableView(true, ViewType.SDCard); } else { MainWindow.ShowView(false, ViewType.SDCard); } if (GrblInfo.HasPIDLog) { MainWindow.EnableView(true, ViewType.PIDTuner); } else { MainWindow.ShowView(false, ViewType.PIDTuner); } if (GrblInfo.NumTools > 0) { MainWindow.EnableView(true, ViewType.Tools); } else { MainWindow.ShowView(false, ViewType.Tools); } if (GrblInfo.HasProbe && GrblSettings.ReportProbeCoordinates) { MainWindow.EnableView(true, ViewType.Probing); } MainWindow.EnableView(true, ViewType.Offsets); MainWindow.EnableView(true, ViewType.GRBLConfig); if (!string.IsNullOrEmpty(GrblInfo.TrinamicDrivers)) { MainWindow.EnableView(true, ViewType.TrinamicTuner); } else { MainWindow.ShowView(false, ViewType.TrinamicTuner); } }
void btnConfigureSGVal_Click(object sender, EventArgs e) { Comms.com.WriteString(string.Format("${0}={1}\r", (int)(grblHALSetting.StallGuardBase + GrblInfo.AxisLetterToIndex(AxisEnabled.Value.ToString())), SGValue)); }
void btnZero_Click(object sender, EventArgs e) { AxisPositionChanged(GrblInfo.AxisIndexToLetter((int)(sender as Button).Tag), 0.0d); }
private void InitSystem() { initOK = true; // TODO: check if grbl is in a state that allows replies using (new UIUtils.WaitCursor()) { GCodeSender.EnablePolling(false); GrblInfo.Get(); GrblSettings.Get(); GrblParserState.Get(); GrblWorkParameters.Get(); GCodeSender.EnablePolling(true); } model.Message = string.Empty; GrblCommand.ToolChange = GrblInfo.ManualToolChange ? "M61Q{0}" : "T{0}"; if (keyboard == null) { keyboard = new KeypressHandler(model); GCodeSender.Configure(keyboard); gcodeRenderer.Configure(); } showProgramLimits(); if (!AppConfig.Settings.GCodeViewer.IsEnabled) { tabGCode.Items.Remove(tab3D); } if (GrblInfo.NumAxes > 3) { limitsControl.Visibility = Visibility.Collapsed; } if (GrblInfo.LatheModeEnabled) { MainWindow.EnableView(true, ViewType.Turning); MainWindow.EnableView(true, ViewType.Facing); MainWindow.EnableView(true, ViewType.G76Threading); } else { MainWindow.ShowView(false, ViewType.Turning); MainWindow.ShowView(false, ViewType.Facing); MainWindow.ShowView(false, ViewType.G76Threading); } if (GrblInfo.HasSDCard) { MainWindow.EnableView(true, ViewType.SDCard); } else { MainWindow.ShowView(false, ViewType.SDCard); } if (GrblInfo.HasPIDLog) { MainWindow.EnableView(true, ViewType.PIDTuner); } else { MainWindow.ShowView(false, ViewType.PIDTuner); } if (GrblInfo.NumTools > 0) { MainWindow.EnableView(true, ViewType.Tools); } else { MainWindow.ShowView(false, ViewType.Tools); } MainWindow.EnableView(true, ViewType.Probing); MainWindow.EnableView(true, ViewType.Offsets); MainWindow.EnableView(true, ViewType.GRBLConfig); if (!string.IsNullOrEmpty(GrblInfo.TrinamicDrivers)) { MainWindow.EnableView(true, ViewType.TrinamicTuner); } else { MainWindow.ShowView(false, ViewType.TrinamicTuner); } }