diff --git a/ActionBar/HelpTextWidget.cs b/ActionBar/HelpTextWidget.cs index e66fe7429..01ee812a7 100644 --- a/ActionBar/HelpTextWidget.cs +++ b/ActionBar/HelpTextWidget.cs @@ -130,8 +130,10 @@ namespace MatterHackers.MatterControl { case PrinterCommunication.CommunicationStates.Disconnected: return new LocalizedString("Not connected. Press 'Connect' to enable printing.").Translated; - case PrinterCommunication.CommunicationStates.AttemptingToConnect: - return new LocalizedString("Attempting to connect...").Translated; + case PrinterCommunication.CommunicationStates.AttemptingToConnect: + string attemptToConnect = new LocalizedString ("Attempting to Connect").Translated; + string attemptToConnectFull = string.Format ("{0}...", attemptToConnect); + return attemptToConnectFull; case PrinterCommunication.CommunicationStates.ConnectionLost: case PrinterCommunication.CommunicationStates.FailedToConnect: return new LocalizedString("Unable to communicate with printer.").Translated; diff --git a/ActionBar/PrintStatusRow.cs b/ActionBar/PrintStatusRow.cs index f13819fbe..f51d37ef1 100644 --- a/ActionBar/PrintStatusRow.cs +++ b/ActionBar/PrintStatusRow.cs @@ -92,19 +92,54 @@ namespace MatterHackers.MatterControl.ActionBar temperatureWidgets.AddChild(extruderTemperatureWidget); temperatureWidgets.AddChild(bedTemperatureWidget); } - temperatureWidgets.VAnchor = VAnchor.ParentTop; + temperatureWidgets.VAnchor |= VAnchor.ParentTop; + temperatureWidgets.Margin = new BorderDouble(left: 6); FlowLayoutWidget printStatusContainer = getActivePrinterInfo(); - printStatusContainer.VAnchor = VAnchor.ParentTop; + printStatusContainer.VAnchor |= VAnchor.ParentTop; + + FlowLayoutWidget iconContainer = new FlowLayoutWidget(FlowDirection.TopToBottom); + iconContainer.Name = "PrintStatusRow.IconContainer"; + iconContainer.VAnchor |= VAnchor.ParentTop; + iconContainer.Margin = new BorderDouble(top: 3); + iconContainer.AddChild(GetAutoLevelIndicator()); this.AddChild(activePrintPreviewImage); this.AddChild(printStatusContainer); + this.AddChild(iconContainer); this.AddChild(temperatureWidgets); UpdatePrintStatus(); UpdatePrintItemName(); } + private Button GetAutoLevelIndicator() + { + ImageButtonFactory imageButtonFactory = new ImageButtonFactory(); + string notifyIconPath = Path.Combine("Icons", "PrintStatusControls", "leveling-16x16.png"); + string notifyHoverIconPath = Path.Combine("Icons", "PrintStatusControls", "leveling-16x16.png"); + Button notifyButton = imageButtonFactory.Generate(notifyIconPath, notifyHoverIconPath); + notifyButton.Cursor = Cursors.Hand; + notifyButton.Margin = new Agg.BorderDouble(top: 3); + notifyButton.MouseEnterBounds += (sender, mouseEvent) => { HelpTextWidget.Instance.ShowHoverText("Print leveling is enabled."); }; + notifyButton.MouseLeaveBounds += (sender, mouseEvent) => { HelpTextWidget.Instance.HideHoverText(); }; + notifyButton.Visible = ActivePrinterProfile.Instance.DoPrintLeveling; + + ActivePrinterProfile.Instance.ActivePrinterChanged.RegisterEvent((sender, e) => + { + notifyButton.Visible = ActivePrinterProfile.Instance.DoPrintLeveling; + + }, ref unregisterEvents); + + ActivePrinterProfile.Instance.DoPrintLevelingChanged.RegisterEvent((sender, e) => + { + notifyButton.Visible = ActivePrinterProfile.Instance.DoPrintLeveling; + + }, ref unregisterEvents); + + return notifyButton; + } + private FlowLayoutWidget getActivePrinterInfo() { FlowLayoutWidget container = new FlowLayoutWidget(FlowDirection.TopToBottom); @@ -123,9 +158,9 @@ namespace MatterHackers.MatterControl.ActionBar topRow.AddChild(activePrintLabel); - activePrintName = getPrintStatusLabel(new LocalizedString("this is the biggest name we will allow").Translated, pointSize: 14); + activePrintName = getPrintStatusLabel("this is the biggest name we will allow", pointSize: 14); activePrintName.AutoExpandBoundsToText = false; - activePrintStatus = getPrintStatusLabel(new LocalizedString("this is the biggest label we will allow - bigger").Translated, pointSize: 11); + activePrintStatus = getPrintStatusLabel("this is the biggest label we will allow - bigger", pointSize: 11); activePrintStatus.AutoExpandBoundsToText = false; activePrintStatus.Text = ""; activePrintStatus.Margin = new BorderDouble(top: 3); @@ -200,73 +235,41 @@ namespace MatterHackers.MatterControl.ActionBar { if (PrinterCommunication.Instance.ActivePrintItem != null) { - - int secondsPrinted = PrinterCommunication.Instance.SecondsPrinted; - int hoursPrinted = (int)(secondsPrinted / (60 * 60)); - int minutesPrinted = (int)(secondsPrinted / 60 - hoursPrinted * 60); - secondsPrinted = secondsPrinted % 60; - string timePrintedText; - if (hoursPrinted > 0) - { - string printTimeLbl = new LocalizedString ("Print Time").Translated; - timePrintedText = string.Format("{3}: {0}:{1:00}:{2:00}", - hoursPrinted, - minutesPrinted, - secondsPrinted, - printTimeLbl); - } - else - { - string printTimeLbl = new LocalizedString ("Print Time").Translated; - timePrintedText = string.Format("{2}: {0:00}:{1:00}", - minutesPrinted, - secondsPrinted, - printTimeLbl); - } + int totalSecondsInPrint = PrinterCommunication.Instance.TotalSecondsInPrint; - int secondsRemaining = PrinterCommunication.Instance.SecondsRemaining; - int hoursRemaining = (int)(secondsRemaining / (60 * 60)); - int minutesRemaining = (int)(secondsRemaining / 60 - hoursRemaining * 60); - secondsRemaining = secondsRemaining % 60; - string timeRemainingText; - if (secondsRemaining > 0) + int totalHoursInPrint = (int)(totalSecondsInPrint / (60 * 60)); + int totalMinutesInPrint = (int)(totalSecondsInPrint / 60 - totalHoursInPrint * 60); + totalSecondsInPrint = totalSecondsInPrint % 60; + + string totalTimeLabel = new LocalizedString("Est. Print Time").Translated; + string calculatingLabel = new LocalizedString("Calculating...").Translated; + string totalPrintTimeText; + + if (totalSecondsInPrint > 0) { - if (hoursRemaining > 0) + + if (totalHoursInPrint > 0) { - string timeRemainingLbl = new LocalizedString ("Remaining").Translated; - timeRemainingText = string.Format("{3} (est): {0}:{1:00}:{2:00}", - hoursRemaining, - minutesRemaining, - secondsRemaining, - timeRemainingLbl); + + totalPrintTimeText = string.Format("{3} {0}h {1:00}m {2:00}s", + totalHoursInPrint, + totalMinutesInPrint, + totalSecondsInPrint, + totalTimeLabel); } else { - string timeRemainingLbl = new LocalizedString ("Remaining").Translated; - timeRemainingText = string.Format("{2} (est): {0:00}:{1:00}", - minutesRemaining, - secondsRemaining, - timeRemainingLbl); + totalPrintTimeText = string.Format("{2} {0}m {1:00}s", + totalMinutesInPrint, + totalSecondsInPrint, + totalTimeLabel); } } - else if (PrinterCommunication.Instance.PrintIsFinished) - { - timeRemainingText = ""; - } else { - string timeRemainingLbl = new LocalizedString ("Remaining").Translated; - timeRemainingText = string.Format("{0} (est): --:--", - timeRemainingLbl, - secondsPrinted / 60, - secondsPrinted % 60); + totalPrintTimeText = string.Format("{0}: {1}", totalTimeLabel, calculatingLabel); } - string printTimeInfoText = timePrintedText; - if (timeRemainingText != "") - { - printTimeInfoText += ", " + timeRemainingText; - } //GC.WaitForFullGCComplete(); string printPercentRemainingText; @@ -286,7 +289,7 @@ namespace MatterHackers.MatterControl.ActionBar case PrinterCommunication.CommunicationStates.Printing: { activePrintLabel.Text = PrinterCommunication.Instance.PrintingStateString; - ActivePrintStatusText = printPercentRemainingText; + ActivePrintStatusText = totalPrintTimeText; } break; @@ -295,7 +298,7 @@ namespace MatterHackers.MatterControl.ActionBar string activePrintLblTxt = new LocalizedString ("Printing Paused").Translated; string activePrintLblTxtFull = string.Format("{0}:", activePrintLblTxt); activePrintLabel.Text = activePrintLblTxtFull; - ActivePrintStatusText = printPercentRemainingText; + ActivePrintStatusText = totalPrintTimeText; } break; @@ -303,7 +306,7 @@ namespace MatterHackers.MatterControl.ActionBar string donePrintingTxt = new LocalizedString ("Done Printing").Translated; string donePrintingTxtFull = string.Format ("{0}:", donePrintingTxt); activePrintLabel.Text = donePrintingTxtFull; - ActivePrintStatusText = printPercentRemainingText; + ActivePrintStatusText = totalPrintTimeText; break; default: diff --git a/ControlElements/TextImageButtonFactory.cs b/ControlElements/TextImageButtonFactory.cs index f274e8320..5a38b07b1 100644 --- a/ControlElements/TextImageButtonFactory.cs +++ b/ControlElements/TextImageButtonFactory.cs @@ -190,9 +190,9 @@ namespace MatterHackers.MatterControl HelpTextWidget.Instance.HideHoverText(); } - public CheckBox GenerateCheckBoxButton(string label, string normalImageName = null, string normalToPressedImageName = null, string pressedImageName = null, string pressedToNormalImageName = null) + public CheckBox GenerateCheckBoxButton(string label, string normalImageName = null, string normalToPressedImageName = null, string pressedImageName = null, string pressedToNormalImageName = null, string pressedLabel = null) { - CheckBoxViewStates checkBoxButtonViewWidget = getCheckBoxButtonView(label, normalImageName, normalToPressedImageName, pressedImageName, pressedToNormalImageName); + CheckBoxViewStates checkBoxButtonViewWidget = getCheckBoxButtonView(label, normalImageName, normalToPressedImageName, pressedImageName, pressedToNormalImageName, pressedLabel); //Override the width if requested if (this.FixedWidth != 0) @@ -290,12 +290,18 @@ namespace MatterHackers.MatterControl return buttonViewWidget; } - private CheckBoxViewStates getCheckBoxButtonView(string label, string normalImageName = null, string normalToPressedImageName = null, string pressedImageName = null, string pressedToNormalImageName = null) + private CheckBoxViewStates getCheckBoxButtonView(string label, string normalImageName = null, string normalToPressedImageName = null, string pressedImageName = null, string pressedToNormalImageName = null, string pressedLabel = null) { ImageBuffer normalImage = new ImageBuffer(); ImageBuffer pressedImage = new ImageBuffer(); ImageBuffer normalToPressedImage = new ImageBuffer(); ImageBuffer pressedToNormalImage = new ImageBuffer(); + string pressedText = pressedLabel; + + if (pressedLabel == null) + { + pressedText = label; + } if (normalImageName != null) { @@ -345,7 +351,7 @@ namespace MatterHackers.MatterControl GuiWidget normal = new TextImageWidget(label, normalFillColor, normalBorderColor, normalTextColor, borderWidth, Margin, normalImage, flowDirection: flowDirection, fontSize: this.fontSize, height: this.FixedHeight); GuiWidget normalHover = new TextImageWidget(label, hoverFillColor, normalBorderColor, hoverTextColor, borderWidth, Margin, normalImage, flowDirection: flowDirection, fontSize: this.fontSize, height: this.FixedHeight); GuiWidget switchNormalToPressed = new TextImageWidget(label, pressedFillColor, normalBorderColor, pressedTextColor, borderWidth, Margin, normalToPressedImage, flowDirection: flowDirection, fontSize: this.fontSize, height: this.FixedHeight); - GuiWidget pressed = new TextImageWidget(label, pressedFillColor, pressedBorderColor, pressedTextColor, borderWidth, Margin, pressedImage, flowDirection: flowDirection, fontSize: this.fontSize, height: this.FixedHeight); + GuiWidget pressed = new TextImageWidget(pressedText, pressedFillColor, pressedBorderColor, pressedTextColor, borderWidth, Margin, pressedImage, flowDirection: flowDirection, fontSize: this.fontSize, height: this.FixedHeight); GuiWidget pressedHover = new TextImageWidget(label, hoverFillColor, pressedBorderColor, hoverTextColor, borderWidth, Margin, pressedImage, flowDirection: flowDirection, fontSize: this.fontSize, height: this.FixedHeight); GuiWidget switchPressedToNormal = new TextImageWidget(label, normalFillColor, pressedBorderColor, normalTextColor, borderWidth, Margin, pressedToNormalImage, flowDirection: flowDirection, fontSize: this.fontSize, height: this.FixedHeight); GuiWidget disabled = new TextImageWidget(label, disabledFillColor, disabledBorderColor, disabledTextColor, borderWidth, Margin, normalImage, flowDirection: flowDirection, fontSize: this.fontSize, height: this.FixedHeight); diff --git a/CustomWidgets/ExportQueueItemWindow.cs b/CustomWidgets/ExportQueueItemWindow.cs index 79e84524f..c4c2e5381 100644 --- a/CustomWidgets/ExportQueueItemWindow.cs +++ b/CustomWidgets/ExportQueueItemWindow.cs @@ -80,10 +80,11 @@ namespace MatterHackers.MatterControl if(showExportGCodeButton) { - string exportGCodeTxt = new LocalizedString ("Export as").Translated; - string exportGCodeTxtFull = string.Format ("{0} GCode", exportGCodeTxt); + string exportGCodeText = new LocalizedString("Export as").Translated; + string exportGCodeTextFull = string.Format("{0} GCode", exportGCodeText); + + Button exportGCode = textImageButtonFactory.Generate(exportGCodeTextFull); - Button exportGCode = textImageButtonFactory.Generate(exportGCodeTxtFull); //exportGCode.HAnchor = Agg.UI.HAnchor.ParentCenter; exportGCode.Click += new ButtonBase.ButtonEventHandler(exportGCode_Click); topToBottom.AddChild(exportGCode); diff --git a/CustomWidgets/PrintProgressBarWidget.cs b/CustomWidgets/PrintProgressBarWidget.cs index 73afad7ee..847a42060 100644 --- a/CustomWidgets/PrintProgressBarWidget.cs +++ b/CustomWidgets/PrintProgressBarWidget.cs @@ -21,26 +21,23 @@ namespace MatterHackers.MatterControl public PrintProgressBar() { - MinimumSize = new Vector2(0, 30); + MinimumSize = new Vector2(0, 24); HAnchor = HAnchor.ParentLeftRight; BackgroundColor = ActiveTheme.Instance.SecondaryAccentColor; Margin = new BorderDouble(0); FlowLayoutWidget container = new FlowLayoutWidget(FlowDirection.LeftToRight); container.AnchorAll(); - container.Padding = new BorderDouble(7,0); + container.Padding = new BorderDouble(6,0); - RGBA_Bytes labelColor = ActiveTheme.Instance.PrimaryAccentColor; - //labelColor.alpha = 220; - - printTimeElapsed = new TextWidget("2:30:00"); + printTimeElapsed = new TextWidget("", pointSize:11); + printTimeElapsed.AutoExpandBoundsToText = true; printTimeElapsed.VAnchor = Agg.UI.VAnchor.ParentCenter; - printTimeElapsed.TextColor = labelColor; - - printTimeRemaining = new TextWidget("4:50:30"); + + printTimeRemaining = new TextWidget("", pointSize: 11); + printTimeRemaining.AutoExpandBoundsToText = true; printTimeRemaining.VAnchor = Agg.UI.VAnchor.ParentCenter; - printTimeRemaining.TextColor = labelColor; GuiWidget spacer = new GuiWidget(); spacer.HAnchor = Agg.UI.HAnchor.ParentLeftRight; @@ -51,7 +48,8 @@ namespace MatterHackers.MatterControl AddChild(container); AddHandlers(); - UpdatePrintStatus(); + SetThemedColors(); + UpdatePrintStatus(); UiThread.RunOnIdle(OnIdle); } @@ -74,12 +72,17 @@ namespace MatterHackers.MatterControl base.OnClosed(e); } - private void onThemeChanged(object sender, EventArgs e) + private void SetThemedColors() { - //Set background color to new theme this.printTimeElapsed.TextColor = ActiveTheme.Instance.PrimaryAccentColor; this.printTimeRemaining.TextColor = ActiveTheme.Instance.PrimaryAccentColor; this.BackgroundColor = ActiveTheme.Instance.SecondaryAccentColor; + } + + private void onThemeChanged(object sender, EventArgs e) + { + //Set background color to new theme + SetThemedColors(); this.Invalidate(); } @@ -158,26 +161,11 @@ namespace MatterHackers.MatterControl printTimeElapsed.Text = string.Format(""); } - int secondsRemaining = PrinterCommunication.Instance.SecondsRemaining; - int hoursRemaining = (int)(secondsRemaining / (60 * 60)); - int minutesRemaining = (int)(secondsRemaining / 60 - hoursRemaining * 60); - secondsRemaining = secondsRemaining % 60; + string printPercentRemainingText = string.Format("{0:0.0}%", currentPercent); - if (secondsRemaining > 0) + if (PrinterCommunication.Instance.PrinterIsPrinting || PrinterCommunication.Instance.PrinterIsPaused) { - if (hoursRemaining > 0) - { - printTimeRemaining.Text = string.Format("{0}:{1:00}:{2:00}", - hoursRemaining, - minutesRemaining, - secondsRemaining); - } - else - { - printTimeRemaining.Text = string.Format("{0}:{1:00}", - minutesRemaining, - secondsRemaining); - } + printTimeRemaining.Text = printPercentRemainingText; } else if (PrinterCommunication.Instance.PrintIsFinished) { diff --git a/DataStorage/Datastore.cs b/DataStorage/Datastore.cs index df80b9406..499b965ee 100644 --- a/DataStorage/Datastore.cs +++ b/DataStorage/Datastore.cs @@ -110,14 +110,18 @@ namespace MatterHackers.MatterControl.DataStorage { return "StaticData"; } - else - { - return Path.Combine(ApplicationPath, "StaticData"); - } + else if(Directory.Exists(Path.Combine(ApplicationPath, "StaticData"))) + { + return Path.Combine(ApplicationPath, "StaticData"); + } + else + { + return Path.Combine("..", "..", "StaticData"); + } default: throw new NotImplementedException(); - } + } } } diff --git a/EeProm/EePromMarlinSettings.cs b/EeProm/EePromMarlinSettings.cs new file mode 100644 index 000000000..e2f4dab81 --- /dev/null +++ b/EeProm/EePromMarlinSettings.cs @@ -0,0 +1,432 @@ +/* +Copyright (c) 2014, Lars Brubaker +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using MatterHackers.Agg.UI; + +namespace MatterHackers.MatterControl.EeProm +{ + public class EePromMarlinSettings : EventArgs + { + public event EventHandler eventAdded = null; + + public string sx = "0"; + public string sy = "0"; + public string sz = "0"; + public string se = "0"; + public string fx = "0"; + public string fy = "0"; + public string fz = "0"; + public string fe = "0"; + public string ax = "0"; + public string ay = "0"; + public string az = "0"; + public string ae = "0"; + public string acc = "0"; + public string racc = "0"; + public string avs = "0"; + public string avt = "0"; + public string avb = "0"; + public string avx = "0"; + public string avz = "0"; + public string ppid = "0"; + public string ipid = "0"; + public string dpid = "0"; + public string hox = "0"; + public string hoy = "0"; + public string hoz = "0"; + public bool hasPID = false; + + bool changed = false; + + public bool update(string line) + { + bool foundSetting = false; + // string[] lines = line.Substring(5).Split(' '); + string[] test = line.Split(' '); + string mode = ""; + foreach (string token in test) + { + if ((token != " ") && ((token == "M92") || (mode == "M92"))) + { + foundSetting = true; + mode = "M92"; + if (token[0] == 'X') + { + sx = token.Substring(1); + } + if (token[0] == 'Y') + { + sy = token.Substring(1); + } + if (token[0] == 'Z') + { + sz = token.Substring(1); + } + if (token[0] == 'E') + { + se = token.Substring(1); + } + } + if ((token != " ") && ((token == "M203") || (mode == "M203"))) + { + foundSetting = true; + mode = "M203"; + if (token[0] == 'X') + { + fx = token.Substring(1); + } + if (token[0] == 'Y') + { + fy = token.Substring(1); + } + if (token[0] == 'Z') + { + fz = token.Substring(1); + } + if (token[0] == 'E') + { + fe = token.Substring(1); + } + } + if ((token != " ") && ((token == "M201") || (mode == "M201"))) + { + foundSetting = true; + mode = "M201"; + if (token[0] == 'X') + { + ax = token.Substring(1); + } + if (token[0] == 'Y') + { + ay = token.Substring(1); + } + if (token[0] == 'Z') + { + az = token.Substring(1); + } + if (token[0] == 'E') + { + ae = token.Substring(1); + } + } + if ((token != " ") && ((token == "M204") || (mode == "M204"))) + { + foundSetting = true; + mode = "M204"; + if (token[0] == 'S') + { + acc = token.Substring(1); + } + if (token[0] == 'T') + { + racc = token.Substring(1); + } + } + if ((token != " ") && ((token == "M205") || (mode == "M205"))) + { + foundSetting = true; + mode = "M205"; + if (token[0] == 'S') + { + avs = token.Substring(1); + } + if (token[0] == 'T') + { + avt = token.Substring(1); + } + if (token[0] == 'B') + { + avb = token.Substring(1); + } + if (token[0] == 'X') + { + avx = token.Substring(1); + } + if (token[0] == 'Z') + { + avz = token.Substring(1); + } + } + if ((token != " ") && ((token == "M301") || (mode == "M301"))) + { + foundSetting = true; + mode = "M301"; + hasPID = true; + if (token[0] == 'P') + { + ppid = token.Substring(1); + } + if (token[0] == 'I') + { + ipid = token.Substring(1); + } + if (token[0] == 'D') + { + dpid = token.Substring(1); + } + } + if ((token != " ") && ((token == "M206") || (mode == "M206"))) + { + foundSetting = true; + mode = "M206"; + hasPID = true; + if (token[0] == 'X') + { + hox = token.Substring(1); + } + if (token[0] == 'Y') + { + hoy = token.Substring(1); + } + if (token[0] == 'Z') + { + hoz = token.Substring(1); + } + } + } + changed = false; + + return foundSetting; + } + + public void Save() + { + if (!changed) return; // nothing changed + string cmdsteps = "M92 X" + sx + " Y" + sy + " Z" + sz + " E" + se; + string cmdfeed = "M203 X" + fx + " Y" + fy + " Z" + fz + " E" + fe; + string cmdmacc = "M201 X" + ax + " Y" + ay + " Z" + az + " E" + ae; + string cmdacc = "M204 S" + acc + " T" + racc; + string cmdav = "M205 S" + avs + " T" + avt + " B" + avb + " X" + avx + " Z" + avz; + string cmdho = "M206 X" + hox + " Y" + hoy + " Z" + hoz; + string cmdpid = "M301 P" + ppid + " I" + ipid + " D" + dpid; + + PrinterCommunication.Instance.QueueLineToPrinter(cmdsteps); + PrinterCommunication.Instance.QueueLineToPrinter(cmdfeed); + PrinterCommunication.Instance.QueueLineToPrinter(cmdmacc); + PrinterCommunication.Instance.QueueLineToPrinter(cmdacc); + PrinterCommunication.Instance.QueueLineToPrinter(cmdav); + PrinterCommunication.Instance.QueueLineToPrinter(cmdho); + if (hasPID) + { + PrinterCommunication.Instance.QueueLineToPrinter(cmdpid); + } + + changed = false; + } + + public string SX + { + get { return sx; } + set { if (sx.Equals(value)) return; sx = value; changed = true; } + } + + public string SY + { + get { return sy; } + set { if (sy.Equals(value)) return; sy = value; changed = true; } + } + + public string SZ + { + get { return sz; } + set { if (sz.Equals(value)) return; sz = value; changed = true; } + } + + public string SE + { + get { return se; } + set { if (se.Equals(value)) return; se = value; changed = true; } + } + + public string FX + { + get { return fx; } + set { if (fx.Equals(value)) return; fx = value; changed = true; } + } + + public string FY + { + get { return fy; } + set { if (fy.Equals(value)) return; fy = value; changed = true; } + } + + public string FZ + { + get { return fz; } + set { if (fz.Equals(value)) return; fz = value; changed = true; } + } + + public string FE + { + get { return fe; } + set { if (fe.Equals(value)) return; fe = value; changed = true; } + } + public string AX + { + get { return ax; } + set { if (ax.Equals(value)) return; ax = value; changed = true; } + } + public string AY + { + get { return ay; } + set { if (ay.Equals(value)) return; ay = value; changed = true; } + } + + public string AZ + { + get { return az; } + set { if (az.Equals(value)) return; az = value; changed = true; } + } + + public string AE + { + get { return ae; } + set { if (ae.Equals(value)) return; ae = value; changed = true; } + } + + public string ACC + { + get { return acc; } + set { if (acc.Equals(value)) return; acc = value; changed = true; } + } + + public string RACC + { + get { return racc; } + set { if (racc.Equals(value)) return; racc = value; changed = true; } + } + + public string AVS + { + get { return avs; } + set { if (avs.Equals(value)) return; avs = value; changed = true; } + } + + public string AVT + { + get { return avt; } + set { if (avt.Equals(value)) return; avt = value; changed = true; } + } + + public string AVB + { + get { return avb; } + set { if (avb.Equals(value)) return; avb = value; changed = true; } + } + + public string AVX + { + get { return avx; } + set { if (avx.Equals(value)) return; avx = value; changed = true; } + } + + public string AVZ + { + get { return avz; } + set { if (avz.Equals(value)) return; avz = value; changed = true; } + } + + public string PPID + { + get { return ppid; } + set { if (ppid.Equals(value)) return; ppid = value; changed = true; } + } + + public string IPID + { + get { return ipid; } + set { if (ipid.Equals(value)) return; ipid = value; changed = true; } + } + + public string DPID + { + get { return dpid; } + set { if (dpid.Equals(value)) return; dpid = value; changed = true; } + } + + public string HOX + { + get { return hox; } + set { if (hox.Equals(value)) return; hox = value; changed = true; } + } + + public string HOY + { + get { return hoy; } + set { if (hoy.Equals(value)) return; hoy = value; changed = true; } + } + + public string HOZ + { + get { return hoz; } + set { if (hoz.Equals(value)) return; hoz = value; changed = true; } + } + + public void SaveToEeProm() + { + PrinterCommunication.Instance.QueueLineToPrinter("M500"); + } + + // this does not save them to eeprom + public void SetPrinterToFactorySettings() + { + hasPID = false; + PrinterCommunication.Instance.QueueLineToPrinter("M502"); + } + + public void Add(object sender, EventArgs e) + { + StringEventArgs lineString = e as StringEventArgs; + + if (e == null) + { + return; + } + + if (update(lineString.Data)) + { + if (eventAdded != null) + { + eventAdded(this, lineString); + } + } + } + + public void Update() + { + hasPID = false; + PrinterCommunication.Instance.QueueLineToPrinter("M503"); + } + } +} diff --git a/EeProm/EePromMarlinWidget.cs b/EeProm/EePromMarlinWidget.cs new file mode 100644 index 000000000..47dc71bad --- /dev/null +++ b/EeProm/EePromMarlinWidget.cs @@ -0,0 +1,424 @@ +/* +Copyright (c) 2014, Lars Brubaker +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using MatterHackers.Agg; +using MatterHackers.Agg.UI; +using MatterHackers.Localizations; + +namespace MatterHackers.MatterControl.EeProm +{ + public partial class EePromMarlinWidget : SystemWindow + { + EePromMarlinSettings currentEePromSettings; + bool reinit = true; + + MHNumberEdit stepsPerMmX; + MHNumberEdit stepsPerMmY; + MHNumberEdit stepsPerMmZ; + MHNumberEdit stepsPerMmE; + + MHNumberEdit maxFeedrateMmPerSX; + MHNumberEdit maxFeedrateMmPerSY; + MHNumberEdit maxFeedrateMmPerSZ; + MHNumberEdit maxFeedrateMmPerSE; + + MHNumberEdit maxAccelerationMmPerSSqrdX; + MHNumberEdit maxAccelerationMmPerSSqrdY; + MHNumberEdit maxAccelerationMmPerSSqrdZ; + MHNumberEdit maxAccelerationMmPerSSqrdE; + + MHNumberEdit acceleration; + MHNumberEdit retractAcceleration; + + MHNumberEdit pidP; + MHNumberEdit pidI; + MHNumberEdit pidD; + + MHNumberEdit homingOffsetX; + MHNumberEdit homingOffsetY; + MHNumberEdit homingOffsetZ; + + MHNumberEdit minFeedrate; + MHNumberEdit minTravelFeedrate; + MHNumberEdit minSegmentTime; + + MHNumberEdit maxXYJerk; + MHNumberEdit maxZJerk; + + Button buttonAbort; + Button buttonReLoadSettings; + Button buttonSetActive; + Button buttonSetToFactorySettings; + Button buttonSave; + + event EventHandler unregisterEvents; + + TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory(); + double maxWidthOfLeftStuff = 0; + List leftStuffToSize = new List(); + + public EePromMarlinWidget() + : base(700, 480) + { + Title = new LocalizedString("Marlin Firmware EEPROM Settings").Translated; + + currentEePromSettings = new EePromMarlinSettings(); + currentEePromSettings.eventAdded += SetUiToPrinterSettings; + + FlowLayoutWidget mainContainer = new FlowLayoutWidget (FlowDirection.TopToBottom); + mainContainer.VAnchor = Agg.UI.VAnchor.Max_FitToChildren_ParentHeight; + mainContainer.HAnchor = Agg.UI.HAnchor.ParentLeftRight; + mainContainer.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + mainContainer.Padding = new BorderDouble (3, 0); + + FlowLayoutWidget topToBottom = new FlowLayoutWidget(FlowDirection.TopToBottom); + topToBottom.VAnchor = Agg.UI.VAnchor.Max_FitToChildren_ParentHeight; + topToBottom.HAnchor = Agg.UI.HAnchor.ParentLeftRight; + topToBottom.BackgroundColor = ActiveTheme.Instance.SecondaryBackgroundColor; + topToBottom.Padding = new BorderDouble (top: 3); + + // the top button bar + { + FlowLayoutWidget topButtonBar = new FlowLayoutWidget(); + topButtonBar.HAnchor = Agg.UI.HAnchor.ParentLeftRight; + topButtonBar.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + + CreateMainButton(ref buttonReLoadSettings, topButtonBar, "Re-Load Default Settings"); + buttonReLoadSettings.Click += buttonReLoadSettings_Click; + + topButtonBar.Margin = new BorderDouble (0, 3); + + CreateMainButton(ref buttonSetToFactorySettings, topButtonBar, "Set Default To Factory Settings"); + buttonSetToFactorySettings.Click += SetToFactorySettings; + + mainContainer.AddChild(topButtonBar); + } + + topToBottom.AddChild(Create4FieldSet("Steps per mm:", + "X:", ref stepsPerMmX, + "Y:", ref stepsPerMmY, + "Z:", ref stepsPerMmZ, + "E:", ref stepsPerMmE)); + + topToBottom.AddChild(Create4FieldSet("Maximum feedrates [mm/s]:", + "X:", ref maxFeedrateMmPerSX, + "Y:", ref maxFeedrateMmPerSY, + "Z:", ref maxFeedrateMmPerSZ, + "E:", ref maxFeedrateMmPerSE)); + + topToBottom.AddChild(Create4FieldSet("Maximum Acceleration [mm/s²]:", + "X:", ref maxAccelerationMmPerSSqrdX, + "Y:", ref maxAccelerationMmPerSSqrdY, + "Z:", ref maxAccelerationMmPerSSqrdZ, + "E:", ref maxAccelerationMmPerSSqrdE)); + + topToBottom.AddChild(CreateField("Acceleration:", ref acceleration)); + topToBottom.AddChild(CreateField("Retract Acceleration:", ref retractAcceleration)); + + topToBottom.AddChild(Create3FieldSet("PID settings:", + "P:", ref pidP, + "I:", ref pidI, + "D:", ref pidD)); + + topToBottom.AddChild(Create3FieldSet("Homing Offset:", + "X:", ref homingOffsetX, + "Y:", ref homingOffsetY, + "Z:", ref homingOffsetZ)); + + topToBottom.AddChild(CreateField("Min feedrate [mm/s]:", ref minFeedrate)); + topToBottom.AddChild(CreateField("Min travel feedrate [mm/s]:", ref minTravelFeedrate)); + topToBottom.AddChild(CreateField("Minimum segment time [ms]:", ref minSegmentTime)); + topToBottom.AddChild(CreateField("Maximum X-Y jerk [mm/s]:", ref maxXYJerk)); + topToBottom.AddChild(CreateField("Maximum Z jerk [mm/s]:", ref maxZJerk)); + + GuiWidget topBottomSpacer = new GuiWidget(1, 1); + topBottomSpacer.VAnchor = VAnchor.ParentBottomTop; + topToBottom.AddChild(topBottomSpacer); + + mainContainer.AddChild (topToBottom); + + // the bottom button bar + { + FlowLayoutWidget bottomButtonBar = new FlowLayoutWidget(); + bottomButtonBar.HAnchor = Agg.UI.HAnchor.Max_FitToChildren_ParentWidth; + bottomButtonBar.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + bottomButtonBar.Margin = new BorderDouble (0, 3); + + CreateMainButton(ref buttonSetActive, bottomButtonBar, "Make Settings Active"); + buttonSetActive.Click += buttonSetActive_Click; + + CreateMainButton(ref buttonSave, bottomButtonBar, "Make Settings Active\nAnd Save To Default"); + buttonSave.Click += buttonSave_Click; + + CreateSpacer(bottomButtonBar); + + CreateMainButton(ref buttonAbort, bottomButtonBar, "Cancel"); + buttonAbort.Click += buttonAbort_Click; + + mainContainer.AddChild(bottomButtonBar); + } + + PrinterCommunication.Instance.CommunicationUnconditionalFromPrinter.RegisterEvent(currentEePromSettings.Add, ref unregisterEvents); + + currentEePromSettings.eventAdded += SetUiToPrinterSettings; + + AddChild(mainContainer); + + ShowAsSystemWindow(); + + // and ask the printer to send the settings + currentEePromSettings.Update(); + + foreach (GuiWidget widget in leftStuffToSize) + { + widget.Width = maxWidthOfLeftStuff; + } + } + + private GuiWidget CreateMHNumEdit(ref MHNumberEdit numberEditToCreate) + { + numberEditToCreate = new MHNumberEdit(0, pixelWidth: 80, allowNegatives: true, allowDecimals: true); + numberEditToCreate.VAnchor = Agg.UI.VAnchor.ParentCenter; + numberEditToCreate.Margin = new BorderDouble(3, 0); + return numberEditToCreate; + } + + private GuiWidget CreateField(string label, ref MHNumberEdit field1) + { + MHNumberEdit none = null; + + return Create4FieldSet(label, + "", ref field1, + null, ref none, + null, ref none, + null, ref none); + } + + private GuiWidget Create3FieldSet(string label, + string field1Label, ref MHNumberEdit field1, + string field2Label, ref MHNumberEdit field2, + string field3Label, ref MHNumberEdit field3) + { + MHNumberEdit none = null; + + return Create4FieldSet(label, + field1Label, ref field1, + field2Label, ref field2, + field3Label, ref field3, + null, ref none); + } + + GuiWidget CreateTextField(string label) + { + GuiWidget textWidget = new TextWidget(label, textColor: ActiveTheme.Instance.PrimaryTextColor); + textWidget.VAnchor = VAnchor.ParentCenter; + textWidget.HAnchor = HAnchor.ParentRight; + GuiWidget container = new GuiWidget(textWidget.Height, 24); + container.AddChild(textWidget); + return container; + } + + private GuiWidget Create4FieldSet(string label, + string field1Label, ref MHNumberEdit field1, + string field2Label, ref MHNumberEdit field2, + string field3Label, ref MHNumberEdit field3, + string field4Label, ref MHNumberEdit field4) + { + FlowLayoutWidget row = new FlowLayoutWidget(); + row.Margin = new BorderDouble(3); + row.HAnchor = Agg.UI.HAnchor.ParentLeftRight; + + TextWidget labelWidget = new TextWidget(new LocalizedString(label).Translated, textColor: ActiveTheme.Instance.PrimaryTextColor); + labelWidget.VAnchor = VAnchor.ParentCenter; + maxWidthOfLeftStuff = Math.Max(maxWidthOfLeftStuff, labelWidget.Width); + GuiWidget holder = new GuiWidget(labelWidget.Width, labelWidget.Height); + holder.Margin = new BorderDouble(3, 0); + holder.AddChild(labelWidget); + leftStuffToSize.Add(holder); + row.AddChild(holder); + + row.AddChild(CreateTextField(field1Label)); + row.AddChild(CreateMHNumEdit(ref field1)); + + if (field2Label != null) + { + row.AddChild(CreateTextField(field2Label)); + row.AddChild(CreateMHNumEdit(ref field2)); + } + + if (field3Label != null) + { + row.AddChild(CreateTextField(field3Label)); + row.AddChild(CreateMHNumEdit(ref field3)); + } + + if (field4Label != null) + { + row.AddChild(CreateTextField(field4Label)); + row.AddChild(CreateMHNumEdit(ref field4)); + } + + return row; + } + + private static void CreateSpacer(FlowLayoutWidget buttonBar) + { + GuiWidget spacer = new GuiWidget(1, 1); + spacer.HAnchor = Agg.UI.HAnchor.ParentLeftRight; + buttonBar.AddChild(spacer); + } + + private void CreateMainButton(ref Button button, FlowLayoutWidget buttonBar, string text) + { + button = textImageButtonFactory.Generate(new LocalizedString(text).Translated); + buttonBar.AddChild(button); + } + + private void buttonReLoadSettings_Click(object sender, EventArgs e) + { + reinit = false; + currentEePromSettings.Update(); + } + + private void SetToFactorySettings(object sender, EventArgs e) + { + reinit = true; + currentEePromSettings.SetPrinterToFactorySettings(); + currentEePromSettings.Update(); + } + + private void buttonAbort_Click(object sender, EventArgs e) + { + UiThread.RunOnIdle(DoButtonAbort_Click); + } + + private void DoButtonAbort_Click(object state) + { + Close(); + } + + public override void OnClosed(EventArgs e) + { + if (unregisterEvents != null) + { + unregisterEvents(this, null); + } + base.OnClosed(e); + } + + private void SetUiToPrinterSettings(object sender, EventArgs e) + { + stepsPerMmX.Text = currentEePromSettings.SX; + stepsPerMmY.Text = currentEePromSettings.SY; + stepsPerMmZ.Text = currentEePromSettings.SZ; + stepsPerMmE.Text = currentEePromSettings.SE; + maxFeedrateMmPerSX.Text = currentEePromSettings.FX; + maxFeedrateMmPerSY.Text = currentEePromSettings.FY; + maxFeedrateMmPerSZ.Text = currentEePromSettings.FZ; + maxFeedrateMmPerSE.Text = currentEePromSettings.FE; + maxAccelerationMmPerSSqrdX.Text = currentEePromSettings.AX; + maxAccelerationMmPerSSqrdY.Text = currentEePromSettings.AY; + maxAccelerationMmPerSSqrdZ.Text = currentEePromSettings.AZ; + maxAccelerationMmPerSSqrdE.Text = currentEePromSettings.AE; + acceleration.Text = currentEePromSettings.ACC; + retractAcceleration.Text = currentEePromSettings.RACC; + minFeedrate.Text = currentEePromSettings.AVS; + minTravelFeedrate.Text = currentEePromSettings.AVT; + minSegmentTime.Text = currentEePromSettings.AVB; + maxXYJerk.Text = currentEePromSettings.AVX; + maxZJerk.Text = currentEePromSettings.AVZ; + pidP.Enabled = pidI.Enabled = pidD.Enabled = currentEePromSettings.hasPID; + pidP.Text = currentEePromSettings.PPID; + pidI.Text = currentEePromSettings.IPID; + pidD.Text = currentEePromSettings.DPID; + homingOffsetX.Text = currentEePromSettings.hox; + homingOffsetY.Text = currentEePromSettings.hoy; + homingOffsetZ.Text = currentEePromSettings.hoz; + } + + private void buttonSave_Click(object sender, EventArgs e) + { + UiThread.RunOnIdle(DoButtonSave_Click); + } + + private void DoButtonSave_Click(object state) + { + SaveSettingsToActive(); + currentEePromSettings.SaveToEeProm(); + Close(); + } + + void buttonSetActive_Click(object sender, EventArgs e) + { + UiThread.RunOnIdle(DoButtonSetActive_Click); + } + + void DoButtonSetActive_Click(object state) + { + SaveSettingsToActive(); + Close(); + } + + void SaveSettingsToActive() + { + currentEePromSettings.SX = stepsPerMmX.Text; + currentEePromSettings.SY = stepsPerMmY.Text; + currentEePromSettings.SZ = stepsPerMmZ.Text; + currentEePromSettings.SE = stepsPerMmE.Text; + currentEePromSettings.FX = maxFeedrateMmPerSX.Text; + currentEePromSettings.FY = maxFeedrateMmPerSY.Text; + currentEePromSettings.FZ = maxFeedrateMmPerSZ.Text; + currentEePromSettings.FE = maxFeedrateMmPerSE.Text; + currentEePromSettings.AX = maxAccelerationMmPerSSqrdX.Text; + currentEePromSettings.AY = maxAccelerationMmPerSSqrdY.Text; + currentEePromSettings.AZ = maxAccelerationMmPerSSqrdZ.Text; + currentEePromSettings.AE = maxAccelerationMmPerSSqrdE.Text; + currentEePromSettings.ACC = acceleration.Text; + currentEePromSettings.RACC = retractAcceleration.Text; + currentEePromSettings.AVS = minFeedrate.Text; + currentEePromSettings.AVT = minTravelFeedrate.Text; + currentEePromSettings.AVB = minSegmentTime.Text; + currentEePromSettings.AVX = maxXYJerk.Text; + currentEePromSettings.AVZ = maxZJerk.Text; + currentEePromSettings.PPID = pidP.Text; + currentEePromSettings.IPID = pidI.Text; + currentEePromSettings.DPID = pidD.Text; + currentEePromSettings.HOX = homingOffsetX.Text; + currentEePromSettings.HOY = homingOffsetY.Text; + currentEePromSettings.HOZ = homingOffsetZ.Text; + + currentEePromSettings.Save(); + } + } +} \ No newline at end of file diff --git a/EeProm/EePromRepetierParameter.cs b/EeProm/EePromRepetierParameter.cs new file mode 100644 index 000000000..9bd656fc2 --- /dev/null +++ b/EeProm/EePromRepetierParameter.cs @@ -0,0 +1,92 @@ +/* +Copyright (c) 2014, Lars Brubaker +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MatterHackers.MatterControl.EeProm +{ + public class EePromRepetierParameter : EventArgs + { + public string description; + public int type; + public int position; + string val = ""; + bool changed = false; + + public EePromRepetierParameter(string line) + { + update(line); + } + + public void update(string line) + { + string[] lines = line.Substring(4).Split(' '); + int.TryParse(lines[0], out type); + int.TryParse(lines[1], out position); + val = lines[2]; + description = line.Substring(7 + lines[0].Length + lines[1].Length + lines[2].Length); + changed = false; + } + + public void save() + { + if (!changed) + { + return; + } + + string cmd = "M206 T" + type + " P" + position + " "; + if (type == 3) cmd += "X" + val; + else cmd += "S" + val; + PrinterCommunication.Instance.QueueLineToPrinter(cmd); + changed = false; + } + + public string Description + { + get { return description; } + set { description = value; } + } + + public string Value + { + get { return val; } + set + { + value = value.Replace(',', '.').Trim(); + if (val.Equals(value)) return; + val = value; + changed = true; + } + } + } +} diff --git a/EeProm/EePromRepetierStorage.cs b/EeProm/EePromRepetierStorage.cs new file mode 100644 index 000000000..d1963d4d8 --- /dev/null +++ b/EeProm/EePromRepetierStorage.cs @@ -0,0 +1,98 @@ +/* +Copyright (c) 2014, Lars Brubaker +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using MatterHackers.Agg.UI; + +namespace MatterHackers.MatterControl.EeProm +{ + public delegate void OnEePromRepetierAdded(EePromRepetierParameter param); + + public class EePromRepetierStorage + { + public Dictionary eePromSettingsList; + public event EventHandler eventAdded = null; + + public EePromRepetierStorage() + { + eePromSettingsList = new Dictionary(); + } + + public void Clear() + { + eePromSettingsList.Clear(); + } + + public void Save() + { + foreach (EePromRepetierParameter p in eePromSettingsList.Values) + { + p.save(); + } + } + + public void Add(object sender, EventArgs e) + { + StringEventArgs lineString = e as StringEventArgs; + + if (e == null) + { + return; + } + + string line = lineString.Data; + + if (!line.StartsWith("EPR:")) + { + return; + } + + EePromRepetierParameter parameter = new EePromRepetierParameter(line); + if (eePromSettingsList.ContainsKey(parameter.position)) + { + eePromSettingsList.Remove(parameter.position); + } + + eePromSettingsList.Add(parameter.position, parameter); + if (eventAdded != null) + { + eventAdded(this, parameter); + } + } + + public void AskPrinterForSettings() + { + PrinterCommunication.Instance.QueueLineToPrinter("M205"); + } + } +} \ No newline at end of file diff --git a/EeProm/EePromRepetierWidget.cs b/EeProm/EePromRepetierWidget.cs new file mode 100644 index 000000000..6ea20c92d --- /dev/null +++ b/EeProm/EePromRepetierWidget.cs @@ -0,0 +1,227 @@ +/* +Copyright (c) 2014, Lars Brubaker +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +using MatterHackers.Agg; +using MatterHackers.Agg.UI; +using MatterHackers.Localizations; + +namespace MatterHackers.MatterControl.EeProm +{ + public partial class EePromRepetierWidget : SystemWindow + { + protected TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory(); + + EePromRepetierStorage currentEePromSettings; + BindingList data = new BindingList(); + FlowLayoutWidget settingsColmun; + + event EventHandler unregisterEvents; + + Button buttonCancel; + Button buttonSave; + + public EePromRepetierWidget() + : base(540, 480) + { + BackgroundColor = ActiveTheme.Instance.SecondaryBackgroundColor; + + currentEePromSettings = new EePromRepetierStorage(); + + FlowLayoutWidget topToBottom = new FlowLayoutWidget(FlowDirection.TopToBottom); + topToBottom.VAnchor = Agg.UI.VAnchor.Max_FitToChildren_ParentHeight; + topToBottom.HAnchor = Agg.UI.HAnchor.ParentLeftRight; + topToBottom.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + topToBottom.Padding = new BorderDouble (3, 0); + + FlowLayoutWidget row = new FlowLayoutWidget(); + row.HAnchor = Agg.UI.HAnchor.ParentLeftRight; + row.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + GuiWidget descriptionWidget = AddDescription(new LocalizedString("Description").Translated); + descriptionWidget.Margin = new BorderDouble(left: 3); + row.AddChild(descriptionWidget); + + CreateSpacer(row); + + GuiWidget valueText = new TextWidget(new LocalizedString("Value").Translated, textColor: ActiveTheme.Instance.PrimaryTextColor); + valueText.VAnchor = Agg.UI.VAnchor.ParentCenter; + valueText.Margin = new BorderDouble(left: 5, right: 60); + row.AddChild(valueText); + topToBottom.AddChild(row); + + { + ScrollableWidget settingsAreaScrollBox = new ScrollableWidget(true); + settingsAreaScrollBox.ScrollArea.HAnchor |= Agg.UI.HAnchor.ParentLeftRight; + settingsAreaScrollBox.AnchorAll(); + settingsAreaScrollBox.BackgroundColor = ActiveTheme.Instance.SecondaryBackgroundColor; + topToBottom.AddChild(settingsAreaScrollBox); + + settingsColmun = new FlowLayoutWidget(FlowDirection.TopToBottom); + settingsColmun.HAnchor = Agg.UI.HAnchor.Max_FitToChildren_ParentWidth; + + settingsAreaScrollBox.AddChild(settingsColmun); + } + + FlowLayoutWidget buttonBar = new FlowLayoutWidget(); + buttonBar.HAnchor = Agg.UI.HAnchor.Max_FitToChildren_ParentWidth; + buttonBar.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; + buttonSave = textImageButtonFactory.Generate(new LocalizedString("Save To EEPROM").Translated); + buttonSave.Margin = new BorderDouble(0,3); + buttonBar.AddChild(buttonSave); + + CreateSpacer(buttonBar); + + buttonCancel = textImageButtonFactory.Generate(new LocalizedString("Cancel").Translated); + buttonCancel.Margin = new BorderDouble(3); + buttonBar.AddChild(buttonCancel); + + topToBottom.AddChild(buttonBar); + + this.AddChild(topToBottom); + + translate(); + //MatterControlApplication.Instance.LanguageChanged += translate; + + ShowAsSystemWindow(); + + currentEePromSettings.Clear(); + PrinterCommunication.Instance.CommunicationUnconditionalFromPrinter.RegisterEvent(currentEePromSettings.Add, ref unregisterEvents); + currentEePromSettings.eventAdded += NewSettingReadFromPrinter; + currentEePromSettings.AskPrinterForSettings(); + } + + private static void CreateSpacer(FlowLayoutWidget buttonBar) + { + GuiWidget spacer = new GuiWidget(1, 1); + spacer.HAnchor = Agg.UI.HAnchor.ParentLeftRight; + buttonBar.AddChild(spacer); + } + + public override void OnClosed(EventArgs e) + { + if (unregisterEvents != null) + { + unregisterEvents(this, null); + } + base.OnClosed(e); + } + + public void translate() + { + Title = new LocalizedString("Firmware EEPROM Settings").Translated; + buttonCancel.Text = new LocalizedString("Cancel").Translated; + buttonCancel.Click += buttonAbort_Click; + + buttonSave.Text = new LocalizedString("Save to EEPROM").Translated; + buttonSave.Click += buttonSave_Click; + } + + private void NewSettingReadFromPrinter(object sender, EventArgs e) + { + EePromRepetierParameter newSetting = e as EePromRepetierParameter; + if (newSetting != null) + { + data.Add(newSetting); + + UiThread.RunOnIdle(AddItemToUi, newSetting); + } + } + + void AddItemToUi(object state) + { + EePromRepetierParameter newSetting = state as EePromRepetierParameter; + if (newSetting != null) + { + FlowLayoutWidget row = new FlowLayoutWidget(); + row.HAnchor = Agg.UI.HAnchor.Max_FitToChildren_ParentWidth; + row.AddChild(AddDescription(newSetting.Description)); + row.Padding = new BorderDouble(5, 0); + if ((settingsColmun.Children.Count % 2) == 1) + { + row.BackgroundColor = new RGBA_Bytes(0, 0, 0, 50); + } + + CreateSpacer(row); + + double currentValue; + double.TryParse(newSetting.Value, out currentValue); + MHNumberEdit valueEdit = new MHNumberEdit(currentValue, pixelWidth: 80, allowNegatives: true, allowDecimals: true); + valueEdit.VAnchor = Agg.UI.VAnchor.ParentCenter; + valueEdit.ActuallNumberEdit.EditComplete += (sender, e) => + { + newSetting.Value = valueEdit.ActuallNumberEdit.Value.ToString(); + }; + row.AddChild(valueEdit); + + settingsColmun.AddChild(row); + } + } + + private GuiWidget AddDescription(string description) + { + GuiWidget holder = new GuiWidget(340, 40); + TextWidget textWidget = new TextWidget(description, textColor: ActiveTheme.Instance.PrimaryTextColor); + textWidget.VAnchor = Agg.UI.VAnchor.ParentCenter; + holder.AddChild(textWidget); + + return holder; + } + + private void buttonSave_Click(object sender, EventArgs e) + { + UiThread.RunOnIdle(DoButtonSave_Click); + } + + private void DoButtonSave_Click(object state) + { + currentEePromSettings.Save(); + currentEePromSettings.Clear(); + currentEePromSettings.eventAdded -= NewSettingReadFromPrinter; + Close(); + } + + private void buttonAbort_Click(object sender, EventArgs e) + { + UiThread.RunOnIdle(DoButtonAbort_Click); + } + + private void DoButtonAbort_Click(object state) + { + currentEePromSettings.Clear(); + data.Clear(); + currentEePromSettings.eventAdded -= NewSettingReadFromPrinter; + Close(); + } + } +} diff --git a/Localizations/LocalizedString.cs b/Localizations/LocalizedString.cs index f7bb8bfb6..8b64adb51 100644 --- a/Localizations/LocalizedString.cs +++ b/Localizations/LocalizedString.cs @@ -1,4 +1,4 @@ -#define DEBUG_SHOW_TRANSLATED_STRINGS +//#define DEBUG_SHOW_TRANSLATED_STRINGS using System; using System.Collections.Generic; diff --git a/MatterControl.csproj b/MatterControl.csproj index 176b1e5ce..ad0289bea 100644 --- a/MatterControl.csproj +++ b/MatterControl.csproj @@ -38,6 +38,7 @@ 1.0.0.%2a false true + 0.8.2 True @@ -74,6 +75,7 @@ + @@ -90,7 +92,7 @@ - + @@ -184,6 +186,10 @@ + + + + @@ -276,10 +282,6 @@ {D3ABF72C-64C2-4E51-A119-E077210FA990} SerialPortCommunication - - {A526DC5D-65F3-461B-805F-D3AC9665F5C9} - WindowsFileDialogs - {F1653F20-D47D-4F29-8C55-3C835542AF5F} Community.CsharpSqlite @@ -320,7 +322,7 @@ {865172A0-A1A9-49C2-9386-F2FDB4E141B7} MatterControlPluginSystem - + {657DBC6D-C3EA-4398-A3FA-DDB73C14F71B} Agg diff --git a/MatterControl.userprefs b/MatterControl.userprefs index 4e970df75..78a05af8a 100644 --- a/MatterControl.userprefs +++ b/MatterControl.userprefs @@ -1,19 +1,30 @@  - + - - - - - - - - + + + + + + + + + + + - + + + + + + + + + \ No newline at end of file diff --git a/PartPreviewWindow/GcodeViewBasic.cs b/PartPreviewWindow/GcodeViewBasic.cs index 0ced2aaf4..895aae343 100644 --- a/PartPreviewWindow/GcodeViewBasic.cs +++ b/PartPreviewWindow/GcodeViewBasic.cs @@ -510,13 +510,16 @@ namespace MatterHackers.MatterControl.PartPreviewWindow navigationWidget.Margin = new BorderDouble(0, 0, 20, 0); layerSelectionButtonsPannel.AddChild(navigationWidget); - - selectLayerSlider = new Slider(new Vector2(), 10, 0, gcodeViewWidget.gCodeView.NumLayers - 1, Orientation.Vertical); + selectLayerSlider = new Slider(new Vector2(), 10, 0, gcodeViewWidget.LoadedGCode.NumChangesInZ - 1, Orientation.Vertical); selectLayerSlider.ValueChanged += new EventHandler(selectLayerSlider_ValueChanged); gcodeViewWidget.ActiveLayerChanged += new EventHandler(gcodeViewWidget_ActiveLayerChanged); AddChild(selectLayerSlider); SetSliderSize(); + // let's change the active layer so that it is set to the first layer with data + gcodeViewWidget.ActiveLayerIndex = gcodeViewWidget.ActiveLayerIndex + 1; + gcodeViewWidget.ActiveLayerIndex = gcodeViewWidget.ActiveLayerIndex - 1; + BoundsChanged += new EventHandler(PartPreviewGCode_BoundsChanged); } } @@ -719,7 +722,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { if (gcodeViewWidget.LoadedGCode != null) { - layerCountTextWidget.Text = string.Format("{0} / {1}", gcodeViewWidget.ActiveLayerIndex + 1, gcodeViewWidget.gCodeView.NumLayers.ToString()); + layerCountTextWidget.Text = string.Format("{0} / {1}", gcodeViewWidget.ActiveLayerIndex + 1, gcodeViewWidget.LoadedGCode.NumChangesInZ.ToString()); } base.OnDraw(graphics2D); } diff --git a/PartPreviewWindow/PartPreviewMainWindow.cs b/PartPreviewWindow/PartPreviewMainWindow.cs index 36c6dcee1..f77e65ca6 100644 --- a/PartPreviewWindow/PartPreviewMainWindow.cs +++ b/PartPreviewWindow/PartPreviewMainWindow.cs @@ -79,11 +79,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow tabControl.AddTab(new SimpleTextTabWidget(layerView, 16, ActiveTheme.Instance.TabLabelSelected, new RGBA_Bytes(), ActiveTheme.Instance.TabLabelUnselected, new RGBA_Bytes())); - if (Path.GetExtension(printItem.FileLocation).ToUpper() == ".GCODE") - { - tabControl.TabBar.SwitchToPage(layerView); - } - this.AddChild(tabControl); this.AnchorAll(); @@ -94,6 +89,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow ShowAsSystemWindow(); MinimumSize = new Vector2(400, 300); + + // We do this after showing the system window so that when we try and take fucus the parent window (the system window) + // exists and can give the fucus to its child the gecode window. + if (Path.GetExtension(printItem.FileLocation).ToUpper() == ".GCODE") + { + tabControl.TabBar.SwitchToPage(layerView); + partGcodeView.Focus(); + } } PerformanceFeedbackWindow timingWindow = null; diff --git a/PrintLibrary/ExportLibraryItemWindow.cs b/PrintLibrary/ExportLibraryItemWindow.cs index 34ee06e7f..5f0038f26 100644 --- a/PrintLibrary/ExportLibraryItemWindow.cs +++ b/PrintLibrary/ExportLibraryItemWindow.cs @@ -80,10 +80,11 @@ namespace MatterHackers.MatterControl.PrintLibrary if (showExportGCodeButton) { - string exportGCodeTxt = new LocalizedString ("Export as").Translated; - string exportGCodeTxtFull = string.Format ("{0} GCode", exportGCodeTxt); + string exportGCodeText = new LocalizedString("Export as").Translated; + string exportGCodeTextFull = string.Format ("{0} GCode", exportGCodeText); + + Button exportGCode = textImageButtonFactory.Generate(exportGCodeTextFull); - Button exportGCode = textImageButtonFactory.Generate(exportGCodeTxtFull); //exportGCode.HAnchor = Agg.UI.HAnchor.ParentCenter; exportGCode.Click += new ButtonBase.ButtonEventHandler(exportGCode_Click); topToBottom.AddChild(exportGCode); diff --git a/PrintLibrary/RegisteredCreatort.cs b/PrintLibrary/RegisteredCreators.cs similarity index 100% rename from PrintLibrary/RegisteredCreatort.cs rename to PrintLibrary/RegisteredCreators.cs diff --git a/PrinterCommunication.cs b/PrinterCommunication.cs index 2675e1219..89cc0aff4 100644 --- a/PrinterCommunication.cs +++ b/PrinterCommunication.cs @@ -98,6 +98,14 @@ namespace MatterHackers.MatterControl [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] internal static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, IntPtr securityAttrs, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile); + public enum FirmwareTypes { Unknown, Repetier, Marlin, Sprinter }; + FirmwareTypes firmwareType = FirmwareTypes.Unknown; + + public FirmwareTypes FirmwareType + { + get { return firmwareType; } + } + static PrinterCommunication globalInstance; string connectionFailureMessage = "Unknown Reason"; @@ -106,7 +114,8 @@ namespace MatterHackers.MatterControl public RootedObjectEventHandler ActivePrintItemChanged = new RootedObjectEventHandler(); public RootedObjectEventHandler BedTemperatureRead = new RootedObjectEventHandler(); public RootedObjectEventHandler BedTemperatureSet = new RootedObjectEventHandler(); - public RootedObjectEventHandler CommunicationUnconditional = new RootedObjectEventHandler(); + public RootedObjectEventHandler CommunicationUnconditionalFromPrinter = new RootedObjectEventHandler(); + public RootedObjectEventHandler CommunicationUnconditionalToPrinter = new RootedObjectEventHandler(); public RootedObjectEventHandler ConnectionFailed = new RootedObjectEventHandler(); public RootedObjectEventHandler ConnectionStateChanged = new RootedObjectEventHandler(); public RootedObjectEventHandler ConnectionSucceeded = new RootedObjectEventHandler(); @@ -373,7 +382,7 @@ namespace MatterHackers.MatterControl ReadLineStartCallBacks.AddCallBackToKey("ok", PrintingCanContinue); - ReadLineStartCallBacks.AddCallBackToKey("ok T:", ReadTemperatures); // marline + ReadLineStartCallBacks.AddCallBackToKey("ok T:", ReadTemperatures); // marlin ReadLineStartCallBacks.AddCallBackToKey("T:", ReadTemperatures); // repatier ReadLineStartCallBacks.AddCallBackToKey("C:", ReadPositions); @@ -381,6 +390,7 @@ namespace MatterHackers.MatterControl ReadLineContainsCallBacks.AddCallBackToKey("RS:", PrinterRequestsResend); ReadLineContainsCallBacks.AddCallBackToKey("Resend:", PrinterRequestsResend); + ReadLineContainsCallBacks.AddCallBackToKey("FIRMWARE_NAME:", PrinterStatesFirmware); WriteLineStartCallBacks.AddCallBackToKey("G28", HomeWasWritenToPrinter); @@ -476,8 +486,9 @@ namespace MatterHackers.MatterControl return new LocalizedString("Not Connected").Translated; case CommunicationStates.Disconnecting: return new LocalizedString("Disconnecting").Translated; - case CommunicationStates.AttemptingToConnect: - return "Connecting..."; + case CommunicationStates.AttemptingToConnect: + string connectingMessageTxt = new LocalizedString ("Connecting").Translated; + return string.Format("{0}...",connectingMessageTxt); case CommunicationStates.ConnectionLost: return new LocalizedString("Connection Lost").Translated; case CommunicationStates.FailedToConnect: @@ -933,6 +944,29 @@ namespace MatterHackers.MatterControl firstLineToResendIndex = int.Parse(splitOnColon[1]) - 1; } + public void PrinterStatesFirmware(object sender, EventArgs e) + { + FoundStringEventArgs foundStringEventArgs = e as FoundStringEventArgs; + + string firmwareName = ""; + if (GCodeFile.GetFirstStringAfter("FIRMWARE_NAME:", foundStringEventArgs.LineToCheck, " ", ref firmwareName)) + { + firmwareName = firmwareName.ToLower(); + if (firmwareName.Contains("repetier")) + { + firmwareType = FirmwareTypes.Repetier; + } + else if (firmwareName.Contains("marlin")) + { + firmwareType = FirmwareTypes.Marlin; + } + else if (firmwareName.Contains("sprinter")) + { + firmwareType = FirmwareTypes.Sprinter; + } + } + } + public void FoundStart(object sender, EventArgs e) { FoundStringEventArgs foundStringEventArgs = e as FoundStringEventArgs; @@ -1029,6 +1063,7 @@ namespace MatterHackers.MatterControl //Attempt connecting to a specific printer CommunicationState = CommunicationStates.AttemptingToConnect; this.stopTryingToConnect = false; + firmwareType = FirmwareTypes.Unknown; if (SerialPortIsAvailable(this.ActivePrinter.ComPort)) { @@ -1399,7 +1434,7 @@ namespace MatterHackers.MatterControl // write data to communication { StringEventArgs currentEvent = new StringEventArgs(lineToWrite); - CommunicationUnconditional.CallEvents(this, new StringEventArgs("->" + currentEvent.Data)); + CommunicationUnconditionalToPrinter.CallEvents(this, currentEvent); if (lineWithoutChecksum != null) { @@ -1758,7 +1793,7 @@ namespace MatterHackers.MatterControl // process this command { StringEventArgs currentEvent = new StringEventArgs(lastLineRead); - CommunicationUnconditional.CallEvents(this, new StringEventArgs("<-" + currentEvent.Data)); + CommunicationUnconditionalFromPrinter.CallEvents(this, currentEvent); FoundStringEventArgs foundResponse = new FoundStringEventArgs(currentEvent.Data); ReadLineStartCallBacks.CheckForKeys(foundResponse); diff --git a/PrinterControls/EditMacrosWindow.cs b/PrinterControls/EditMacrosWindow.cs index 5fc89c939..2470b7af1 100644 --- a/PrinterControls/EditMacrosWindow.cs +++ b/PrinterControls/EditMacrosWindow.cs @@ -335,7 +335,12 @@ namespace MatterHackers.MatterControl addMacroButton.Click += new ButtonBase.ButtonEventHandler(addMacro_Click); Button cancelPresetsButton = textImageButtonFactory.Generate(new LocalizedString("Close").Translated); - cancelPresetsButton.Click += (sender, e) => { this.windowController.Close(); }; + cancelPresetsButton.Click += (sender, e) => { + UiThread.RunOnIdle((state) => + { + this.windowController.Close(); + }); + }; FlowLayoutWidget buttonRow = new FlowLayoutWidget(); buttonRow.HAnchor = HAnchor.ParentLeftRight; diff --git a/PrinterControls/EditManualMovementSpeedsWindow.cs b/PrinterControls/EditManualMovementSpeedsWindow.cs index 6beadeae6..43b764fae 100644 --- a/PrinterControls/EditManualMovementSpeedsWindow.cs +++ b/PrinterControls/EditManualMovementSpeedsWindow.cs @@ -173,7 +173,12 @@ namespace MatterHackers.MatterControl savePresetsButton.Click += new ButtonBase.ButtonEventHandler(save_Click); Button cancelPresetsButton = textImageButtonFactory.Generate(new LocalizedString("Cancel").Translated); - cancelPresetsButton.Click += (sender, e) => { Close(); }; + cancelPresetsButton.Click += (sender, e) => { + UiThread.RunOnIdle((state) => + { + Close(); + }); + }; FlowLayoutWidget buttonRow = new FlowLayoutWidget(); buttonRow.HAnchor = HAnchor.ParentLeftRight; diff --git a/PrinterControls/ManualPrinterControls.cs b/PrinterControls/ManualPrinterControls.cs index e5c03f2f3..243dbc127 100644 --- a/PrinterControls/ManualPrinterControls.cs +++ b/PrinterControls/ManualPrinterControls.cs @@ -53,11 +53,11 @@ namespace MatterHackers.MatterControl } } - public class DisablablableWidget : GuiWidget + public class DisableableWidget : GuiWidget { public GuiWidget disableOverlay; - public DisablablableWidget() + public DisableableWidget() { HAnchor = Agg.UI.HAnchor.ParentLeftRight; VAnchor = Agg.UI.VAnchor.FitToChildren; @@ -118,16 +118,19 @@ namespace MatterHackers.MatterControl Button homeXButton; Button homeYButton; Button homeZButton; + Button enablePrintLevelingButton; + Button disablePrintLevelingButton; - DisablablableWidget extruderTemperatureControlWidget; - DisablablableWidget bedTemperatureControlWidget; - DisablablableWidget movementControlsContainer; - DisablablableWidget fanControlsContainer; - DisablablableWidget tuningAdjustmentControlsContainer; - DisablablableWidget terminalCommunicationsContainer; - DisablablableWidget sdCardManagerContainer; - DisablablableWidget printLevelContainer; - DisablablableWidget macroControls; + DisableableWidget extruderTemperatureControlWidget; + DisableableWidget bedTemperatureControlWidget; + DisableableWidget movementControlsContainer; + DisableableWidget fanControlsContainer; + DisableableWidget eePromControlsContainer; + DisableableWidget tuningAdjustmentControlsContainer; + DisableableWidget terminalCommunicationsContainer; + DisableableWidget sdCardManagerContainer; + DisableableWidget printLevelContainer; + DisableableWidget macroControls; TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory(); @@ -198,37 +201,54 @@ namespace MatterHackers.MatterControl controlsTopToBottomLayout.Padding = new BorderDouble(3, 0); - terminalCommunicationsContainer = new DisablablableWidget(); + terminalCommunicationsContainer = new DisableableWidget(); terminalCommunicationsContainer.AddChild(CreateTerminalControlsContainer()); - controlsTopToBottomLayout.AddChild(terminalCommunicationsContainer); + AddTemperatureControls(controlsTopToBottomLayout); - AddMovementControls(controlsTopToBottomLayout); - printLevelContainer = new DisablablableWidget(); - printLevelContainer.AddChild(CreatePrintLevelingControlsContainer()); - controlsTopToBottomLayout.AddChild(printLevelContainer); + FlowLayoutWidget centerControlsContainer = new FlowLayoutWidget (); + centerControlsContainer.HAnchor = HAnchor.ParentLeftRight; - sdCardManagerContainer = new DisablablableWidget(); + FlowLayoutWidget rightColumnContainer = new FlowLayoutWidget (FlowDirection.TopToBottom); + rightColumnContainer.AddChild (terminalCommunicationsContainer); + rightColumnContainer.Width = 230; + rightColumnContainer.VAnchor |= VAnchor.ParentTop; + + AddMovementControls(centerControlsContainer); + + AddFanControls(rightColumnContainer); + AddEePromControls(rightColumnContainer); + + centerControlsContainer.AddChild(rightColumnContainer); + + controlsTopToBottomLayout.AddChild (centerControlsContainer); + + + + sdCardManagerContainer = new DisableableWidget(); sdCardManagerContainer.AddChild(CreateSdCardManagerContainer()); if (false)// || ActivePrinterProfile.Instance.ActivePrinter == null || ActivePrinterProfile.Instance.ActivePrinter.GetFeatures().HasSdCard()) { controlsTopToBottomLayout.AddChild(sdCardManagerContainer); } - macroControls = new DisablablableWidget(); + macroControls = new DisableableWidget(); macroControls.AddChild(new MacroControls()); controlsTopToBottomLayout.AddChild(macroControls); - PutInFanControls(controlsTopToBottomLayout); AddAdjustmentControls(controlsTopToBottomLayout); + printLevelContainer = new DisableableWidget(); + printLevelContainer.AddChild(CreatePrintLevelingControlsContainer()); + controlsTopToBottomLayout.AddChild(printLevelContainer); + this.AddChild(controlsTopToBottomLayout); AddHandlers(); SetVisibleControls(); } - private void PutInFanControls(FlowLayoutWidget controlsTopToBottomLayout) + private void AddFanControls(FlowLayoutWidget controlsTopToBottomLayout) { GroupBox fanControlsGroupBox = new GroupBox(new LocalizedString("Fan Controls").Translated); @@ -250,7 +270,7 @@ namespace MatterHackers.MatterControl fanControlsGroupBox.AddChild(fanControlsLayout); } - fanControlsContainer = new DisablablableWidget(); + fanControlsContainer = new DisableableWidget(); fanControlsContainer.AddChild(fanControlsGroupBox); if (ActivePrinterProfile.Instance.ActivePrinter == null @@ -260,6 +280,65 @@ namespace MatterHackers.MatterControl } } + private void AddEePromControls(FlowLayoutWidget controlsTopToBottomLayout) + { + GroupBox eePromControlsGroupBox = new GroupBox(new LocalizedString("EEProm Settings").Translated); + + eePromControlsGroupBox.Margin = new BorderDouble(0); + eePromControlsGroupBox.TextColor = ActiveTheme.Instance.PrimaryTextColor; + eePromControlsGroupBox.BorderColor = ActiveTheme.Instance.PrimaryTextColor; + eePromControlsGroupBox.HAnchor |= Agg.UI.HAnchor.ParentLeftRight; + eePromControlsGroupBox.VAnchor = Agg.UI.VAnchor.FitToChildren; + eePromControlsGroupBox.Height = 68; + + { + FlowLayoutWidget eePromControlsLayout = new FlowLayoutWidget(); + eePromControlsLayout.HAnchor |= HAnchor.ParentLeftRight; + eePromControlsLayout.VAnchor |= Agg.UI.VAnchor.ParentCenter; + eePromControlsLayout.Margin = new BorderDouble(3, 0, 3, 6); + eePromControlsLayout.Padding = new BorderDouble(0); + { + Agg.Image.ImageBuffer eePromImage = new Agg.Image.ImageBuffer(); + ImageBMPIO.LoadImageData(Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath,"Icons", "PrintStatusControls", "leveling-24x24.png"), eePromImage); + ImageWidget eePromIcon = new ImageWidget(eePromImage); + eePromIcon.Margin = new BorderDouble (right: 6); + + Button openEePromWindow = textImageButtonFactory.Generate(new LocalizedString("CONFIGURE").Translated); + openEePromWindow.Click += (sender, e) => + { + switch(PrinterCommunication.Instance.FirmwareType) + { + case PrinterCommunication.FirmwareTypes.Repetier: + new MatterHackers.MatterControl.EeProm.EePromRepetierWidget(); + break; + + case PrinterCommunication.FirmwareTypes.Marlin: + new MatterHackers.MatterControl.EeProm.EePromMarlinWidget(); + break; + + default: + UiThread.RunOnIdle((state) => + { + string message = new LocalizedString("Oops! There is no eeprom mapping for your printer's firmware.").Translated; + StyledMessageBox.ShowMessageBox(message, "Warning no eeprom mapping", StyledMessageBox.MessageType.OK); + } + ); + break; + } + }; + //eePromControlsLayout.AddChild(eePromIcon); + eePromControlsLayout.AddChild(openEePromWindow); + } + + eePromControlsGroupBox.AddChild(eePromControlsLayout); + } + + eePromControlsContainer = new DisableableWidget(); + eePromControlsContainer.AddChild(eePromControlsGroupBox); + + controlsTopToBottomLayout.AddChild(eePromControlsContainer); + } + private void AddMovementControls(FlowLayoutWidget controlsTopToBottomLayout) { Button editButton; @@ -290,20 +369,16 @@ namespace MatterHackers.MatterControl manualControlsLayout.Padding = new BorderDouble(3, 5, 3, 0); { manualControlsLayout.AddChild(GetHomeButtonBar()); - manualControlsLayout.AddChild(CreateSeparatorLine()); - manualControlsLayout.AddChild(new JogControls(new XYZColors())); - manualControlsLayout.AddChild(CreateSeparatorLine()); - //manualControlsLayout.AddChild(GetManualMoveBar()); } movementControlsGroupBox.AddChild(manualControlsLayout); } - movementControlsContainer = new DisablablableWidget(); + movementControlsContainer = new DisableableWidget(); movementControlsContainer.AddChild(movementControlsGroupBox); controlsTopToBottomLayout.AddChild(movementControlsContainer); } @@ -312,12 +387,13 @@ namespace MatterHackers.MatterControl { FlowLayoutWidget temperatureControlContainer = new FlowLayoutWidget(); temperatureControlContainer.HAnchor = Agg.UI.HAnchor.ParentLeftRight; + temperatureControlContainer.Margin = new BorderDouble (top: 10); - extruderTemperatureControlWidget = new DisablablableWidget(); + extruderTemperatureControlWidget = new DisableableWidget(); extruderTemperatureControlWidget.AddChild(new ExtruderTemperatureControlWidget()); temperatureControlContainer.AddChild(extruderTemperatureControlWidget); - bedTemperatureControlWidget = new DisablablableWidget(); + bedTemperatureControlWidget = new DisableableWidget(); bedTemperatureControlWidget.AddChild(new BedTemperatureControlWidget()); if (ActivePrinterProfile.Instance.ActivePrinter == null @@ -460,7 +536,7 @@ namespace MatterHackers.MatterControl adjustmentControlsGroupBox.AddChild(tuningRatiosLayout); } - tuningAdjustmentControlsContainer = new DisablablableWidget(); + tuningAdjustmentControlsContainer = new DisableableWidget(); tuningAdjustmentControlsContainer.AddChild(adjustmentControlsGroupBox); controlsTopToBottomLayout.AddChild(tuningAdjustmentControlsContainer); } @@ -487,6 +563,8 @@ namespace MatterHackers.MatterControl feedRateValue.Value = ((int)(PrinterCommunication.Instance.FeedRateRatio * 100 + .5)) / 100.0; } + TextWidget printLevelingStatusLabel; + private GuiWidget CreatePrintLevelingControlsContainer() { GroupBox printLevelingControlsContainer; @@ -512,13 +590,41 @@ namespace MatterHackers.MatterControl runPrintLevelingButton.VAnchor = VAnchor.ParentCenter; runPrintLevelingButton.Click += new ButtonBase.ButtonEventHandler(runPrintLeveling_Click); + Agg.Image.ImageBuffer levelingImage = new Agg.Image.ImageBuffer(); + ImageBMPIO.LoadImageData(Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath,"Icons", "PrintStatusControls", "leveling-24x24.png"), levelingImage); + ImageWidget levelingIcon = new ImageWidget(levelingImage); + levelingIcon.Margin = new BorderDouble (right: 6); + + enablePrintLevelingButton = textImageButtonFactory.Generate(new LocalizedString("ENABLE").Translated); + enablePrintLevelingButton.Margin = new BorderDouble(left:6); + enablePrintLevelingButton.VAnchor = VAnchor.ParentCenter; + enablePrintLevelingButton.Click += new ButtonBase.ButtonEventHandler(enablePrintLeveling_Click); + + disablePrintLevelingButton = textImageButtonFactory.Generate(new LocalizedString("DISABLE").Translated); + disablePrintLevelingButton.Margin = new BorderDouble(left:6); + disablePrintLevelingButton.VAnchor = VAnchor.ParentCenter; + disablePrintLevelingButton.Click += new ButtonBase.ButtonEventHandler(disablePrintLeveling_Click); + CheckBox doLevelingCheckBox = new CheckBox(new LocalizedString("Enable Automatic Print Leveling").Translated); doLevelingCheckBox.Margin = new BorderDouble(left: 3); doLevelingCheckBox.TextColor = ActiveTheme.Instance.PrimaryTextColor; doLevelingCheckBox.VAnchor = VAnchor.ParentCenter; doLevelingCheckBox.Checked = ActivePrinterProfile.Instance.DoPrintLeveling; - buttonBar.AddChild(doLevelingCheckBox); + printLevelingStatusLabel = new TextWidget (""); + printLevelingStatusLabel.AutoExpandBoundsToText = true; + printLevelingStatusLabel.TextColor = ActiveTheme.Instance.PrimaryTextColor; + printLevelingStatusLabel.VAnchor = VAnchor.ParentCenter; + + GuiWidget hSpacer = new GuiWidget (); + hSpacer.HAnchor = HAnchor.ParentLeftRight; + + buttonBar.AddChild(levelingIcon); + //buttonBar.AddChild(doLevelingCheckBox); + buttonBar.AddChild (printLevelingStatusLabel); + buttonBar.AddChild (hSpacer); + buttonBar.AddChild(enablePrintLevelingButton); + buttonBar.AddChild(disablePrintLevelingButton); buttonBar.AddChild(runPrintLevelingButton); doLevelingCheckBox.CheckedStateChanged += (sender, e) => { @@ -526,17 +632,13 @@ namespace MatterHackers.MatterControl }; ActivePrinterProfile.Instance.DoPrintLevelingChanged.RegisterEvent((sender, e) => { - doLevelingCheckBox.Checked = ActivePrinterProfile.Instance.DoPrintLeveling; - if (doLevelingCheckBox.Checked && ActivePrinterProfile.Instance.ActivePrinter.PrintLevelingProbePositions == null) - { - //OpenPrintLevelWizard(); - } + SetPrintLevelButtonVisiblity(); }, ref unregisterEvents); printLevelingControlsContainer.AddChild(buttonBar); } - + SetPrintLevelButtonVisiblity (); return printLevelingControlsContainer; } @@ -562,7 +664,7 @@ namespace MatterHackers.MatterControl GroupBox terminalControlsContainer; terminalControlsContainer = new GroupBox(new LocalizedString("Printer Communications").Translated); - terminalControlsContainer.Margin = new BorderDouble(top: 10); + terminalControlsContainer.Margin = new BorderDouble(0); terminalControlsContainer.TextColor = ActiveTheme.Instance.PrimaryTextColor; terminalControlsContainer.BorderColor = ActiveTheme.Instance.PrimaryTextColor; terminalControlsContainer.HAnchor = Agg.UI.HAnchor.ParentLeftRight; @@ -572,17 +674,24 @@ namespace MatterHackers.MatterControl FlowLayoutWidget buttonBar = new FlowLayoutWidget(); buttonBar.HAnchor |= HAnchor.ParentLeftRight; buttonBar.VAnchor |= Agg.UI.VAnchor.ParentCenter; - buttonBar.Margin = new BorderDouble(3, 0, 3, 6); + buttonBar.Margin = new BorderDouble(3, 0, 3, 6); buttonBar.Padding = new BorderDouble(0); this.textImageButtonFactory.FixedHeight = TallButtonHeight; + Agg.Image.ImageBuffer terminalImage = new Agg.Image.ImageBuffer(); + ImageBMPIO.LoadImageData(Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath,"Icons", "PrintStatusControls", "terminal-24x24.png"), terminalImage); + ImageWidget terminalIcon = new ImageWidget(terminalImage); + terminalIcon.Margin = new BorderDouble (right: 6); + Button showTerminal = textImageButtonFactory.Generate(new LocalizedString("SHOW TERMINAL").Translated); showTerminal.Margin = new BorderDouble(0); showTerminal.Click += (sender, e) => { OutputScrollWindow.Show(); }; + + //buttonBar.AddChild(terminalIcon); buttonBar.AddChild(showTerminal); terminalControlsContainer.AddChild(buttonBar); @@ -646,15 +755,16 @@ namespace MatterHackers.MatterControl if (ActivePrinterProfile.Instance.ActivePrinter == null) { // no printer selected - extruderTemperatureControlWidget.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - bedTemperatureControlWidget.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - movementControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - fanControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - tuningAdjustmentControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - terminalCommunicationsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - printLevelContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - sdCardManagerContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - macroControls.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); + extruderTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + bedTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + movementControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + fanControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + tuningAdjustmentControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + printLevelContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + sdCardManagerContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + macroControls.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); } else // we at least have a printer selected { @@ -665,28 +775,30 @@ namespace MatterHackers.MatterControl case PrinterCommunication.CommunicationStates.Disconnected: case PrinterCommunication.CommunicationStates.AttemptingToConnect: case PrinterCommunication.CommunicationStates.FailedToConnect: - extruderTemperatureControlWidget.SetEnableLevel(DisablablableWidget.EnableLevel.ConfigOnly); - bedTemperatureControlWidget.SetEnableLevel(DisablablableWidget.EnableLevel.ConfigOnly); - movementControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.ConfigOnly); - fanControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - tuningAdjustmentControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - terminalCommunicationsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - printLevelContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - sdCardManagerContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - macroControls.SetEnableLevel(DisablablableWidget.EnableLevel.ConfigOnly); + extruderTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.ConfigOnly); + bedTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.ConfigOnly); + movementControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.ConfigOnly); + fanControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + tuningAdjustmentControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + printLevelContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + sdCardManagerContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + macroControls.SetEnableLevel(DisableableWidget.EnableLevel.ConfigOnly); break; case PrinterCommunication.CommunicationStates.FinishedPrint: case PrinterCommunication.CommunicationStates.Connected: - extruderTemperatureControlWidget.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - bedTemperatureControlWidget.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - movementControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - fanControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - terminalCommunicationsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - printLevelContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - sdCardManagerContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - macroControls.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - tuningAdjustmentControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); + extruderTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + bedTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + movementControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + fanControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + printLevelContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + sdCardManagerContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + macroControls.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + tuningAdjustmentControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); break; case PrinterCommunication.CommunicationStates.PreparingToPrint: @@ -697,15 +809,16 @@ namespace MatterHackers.MatterControl case PrinterCommunication.DetailedPrintingState.HeatingBed: case PrinterCommunication.DetailedPrintingState.HeatingExtruder: case PrinterCommunication.DetailedPrintingState.Printing: - extruderTemperatureControlWidget.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - bedTemperatureControlWidget.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - movementControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.ConfigOnly); - fanControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - tuningAdjustmentControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - terminalCommunicationsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - printLevelContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - sdCardManagerContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - macroControls.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); + extruderTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + bedTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + movementControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.ConfigOnly); + fanControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + tuningAdjustmentControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + printLevelContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + sdCardManagerContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + macroControls.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); break; default: @@ -714,15 +827,16 @@ namespace MatterHackers.MatterControl break; case PrinterCommunication.CommunicationStates.Paused: - extruderTemperatureControlWidget.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - bedTemperatureControlWidget.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - movementControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - fanControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - tuningAdjustmentControlsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - terminalCommunicationsContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - printLevelContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Disabled); - sdCardManagerContainer.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); - macroControls.SetEnableLevel(DisablablableWidget.EnableLevel.Enabled); + extruderTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + bedTemperatureControlWidget.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + movementControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + fanControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + eePromControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + tuningAdjustmentControlsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + terminalCommunicationsContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + printLevelContainer.SetEnableLevel(DisableableWidget.EnableLevel.Disabled); + sdCardManagerContainer.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); + macroControls.SetEnableLevel(DisableableWidget.EnableLevel.Enabled); break; default: @@ -864,6 +978,31 @@ namespace MatterHackers.MatterControl this.Invalidate(); } + void enablePrintLeveling_Click(object sender, MouseEventArgs mouseEvent) + { + ActivePrinterProfile.Instance.DoPrintLeveling = true; + } + + void disablePrintLeveling_Click(object sender, MouseEventArgs mouseEvent) + { + ActivePrinterProfile.Instance.DoPrintLeveling = false; + } + + void SetPrintLevelButtonVisiblity() + { + enablePrintLevelingButton.Visible = !ActivePrinterProfile.Instance.DoPrintLeveling; + disablePrintLevelingButton.Visible = ActivePrinterProfile.Instance.DoPrintLeveling; + + if (ActivePrinterProfile.Instance.DoPrintLeveling) { + printLevelingStatusLabel.Text = new LocalizedString ("Automatic Print Leveling (enabled)").Translated; + } + else + { + printLevelingStatusLabel.Text = new LocalizedString ("Automatic Print Leveling (disabled)").Translated; + } + } + + void disableMotors_Click(object sender, MouseEventArgs mouseEvent) { PrinterCommunication.Instance.ReleaseMotors(); diff --git a/PrinterControls/OutputScrollWindow.cs b/PrinterControls/OutputScrollWindow.cs index 330e8d876..b7692fdf3 100644 --- a/PrinterControls/OutputScrollWindow.cs +++ b/PrinterControls/OutputScrollWindow.cs @@ -252,16 +252,30 @@ namespace MatterHackers.MatterControl { if (filterOutput.Checked) { - PrinterCommunication.Instance.CommunicationUnconditional.UnregisterEvent(outputScrollWidget.WriteLine, ref unregisterEvents); + PrinterCommunication.Instance.CommunicationUnconditionalFromPrinter.UnregisterEvent(FromPrinter, ref unregisterEvents); + PrinterCommunication.Instance.CommunicationUnconditionalToPrinter.UnregisterEvent(ToPrinter, ref unregisterEvents); PrinterCommunication.Instance.ReadLine.RegisterEvent(outputScrollWidget.WriteLine, ref unregisterEvents); } else { - PrinterCommunication.Instance.CommunicationUnconditional.RegisterEvent(outputScrollWidget.WriteLine, ref unregisterEvents); + PrinterCommunication.Instance.CommunicationUnconditionalFromPrinter.RegisterEvent(FromPrinter, ref unregisterEvents); + PrinterCommunication.Instance.CommunicationUnconditionalToPrinter.RegisterEvent(ToPrinter, ref unregisterEvents); PrinterCommunication.Instance.ReadLine.UnregisterEvent(outputScrollWidget.WriteLine, ref unregisterEvents); } } + void FromPrinter(Object sender, EventArgs e) + { + StringEventArgs lineString = e as StringEventArgs; + outputScrollWidget.WriteLine(sender, new StringEventArgs("<-" + lineString.Data)); + } + + void ToPrinter(Object sender, EventArgs e) + { + StringEventArgs lineString = e as StringEventArgs; + outputScrollWidget.WriteLine(sender, new StringEventArgs("->" + lineString.Data)); + } + void Instance_ConnectionFailed(object sender, EventArgs e) { outputScrollWidget.WriteLine(sender, new StringEventArgs("Lost connection to printer.")); diff --git a/PrinterControls/PrinterConnections/ChooseConnectionWidget.cs b/PrinterControls/PrinterConnections/ChooseConnectionWidget.cs index cdb906f16..3b8c60ce7 100644 --- a/PrinterControls/PrinterConnections/ChooseConnectionWidget.cs +++ b/PrinterControls/PrinterConnections/ChooseConnectionWidget.cs @@ -83,7 +83,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections { printerListContainer.HAnchor = HAnchor.ParentLeftRight; printerListContainer.VAnchor = VAnchor.ParentBottomTop; - printerListContainer.Padding = new BorderDouble(3); + printerListContainer.Padding = new BorderDouble(3); printerListContainer.BackgroundColor = ActiveTheme.Instance.SecondaryBackgroundColor; //Get a list of printer records and add them to radio button list diff --git a/PrinterControls/PrinterConnections/SetupConnectionWidgetBase.cs b/PrinterControls/PrinterConnections/SetupConnectionWidgetBase.cs index f4e0185ff..b2b0b8ceb 100644 --- a/PrinterControls/PrinterConnections/SetupConnectionWidgetBase.cs +++ b/PrinterControls/PrinterConnections/SetupConnectionWidgetBase.cs @@ -126,7 +126,7 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections //Create the main container GuiWidget mainContainer = new FlowLayoutWidget(FlowDirection.TopToBottom); mainContainer.AnchorAll(); - mainContainer.Padding = new BorderDouble(3, 0, 3, 5); + mainContainer.Padding = new BorderDouble(3, 5, 3, 5); mainContainer.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor; //Create the header row for the widget diff --git a/PrinterControls/XYZJogControls.cs b/PrinterControls/XYZJogControls.cs index 7aeba47a9..386790244 100644 --- a/PrinterControls/XYZJogControls.cs +++ b/PrinterControls/XYZJogControls.cs @@ -97,7 +97,8 @@ namespace MatterHackers.MatterControl { TextImageButtonFactory buttonFactory = new TextImageButtonFactory(); buttonFactory.FixedHeight = 20; - buttonFactory.FixedWidth = 35; + buttonFactory.FixedWidth = 30; + buttonFactory.fontSize = 10; buttonFactory.Margin = new BorderDouble(0); FlowLayoutWidget moveRadioButtons = new FlowLayoutWidget(); @@ -123,11 +124,11 @@ namespace MatterHackers.MatterControl moveRadioButtons.AddChild(oneHundredButton); tenButton.Checked = true; - moveRadioButtons.Margin = new BorderDouble(3); + moveRadioButtons.Margin = new BorderDouble(0,3); setMoveDistanceControl.AddChild(moveRadioButtons); } - TextWidget mmLabel = new TextWidget("mm", textColor: RGBA_Bytes.White); + TextWidget mmLabel = new TextWidget("mm", textColor: RGBA_Bytes.White, pointSize:10); mmLabel.VAnchor = Agg.UI.VAnchor.ParentCenter; setMoveDistanceControl.AddChild(mmLabel); setMoveDistanceControl.HAnchor = Agg.UI.HAnchor.ParentLeft; @@ -227,7 +228,8 @@ namespace MatterHackers.MatterControl { TextImageButtonFactory buttonFactory = new TextImageButtonFactory(); buttonFactory.FixedHeight = 20; - buttonFactory.FixedWidth = 35; + buttonFactory.FixedWidth = 30; + buttonFactory.fontSize = 10; buttonFactory.Margin = new BorderDouble(0); FlowLayoutWidget moveRadioButtons = new FlowLayoutWidget(); @@ -244,11 +246,11 @@ namespace MatterHackers.MatterControl oneHundredButton.CheckedStateChanged += (sender, e) => { if (((RadioButton)sender).Checked) SetEMoveAmount(100); }; moveRadioButtons.AddChild(oneHundredButton); tenButton.Checked = true; - moveRadioButtons.Margin = new BorderDouble(3); + moveRadioButtons.Margin = new BorderDouble(0,3); setMoveDistanceControl.AddChild(moveRadioButtons); } - TextWidget mmLabel = new TextWidget("mm", textColor: RGBA_Bytes.White); + TextWidget mmLabel = new TextWidget("mm", textColor: RGBA_Bytes.White, pointSize:10); mmLabel.VAnchor = Agg.UI.VAnchor.ParentCenter; setMoveDistanceControl.AddChild(mmLabel); setMoveDistanceControl.HAnchor = Agg.UI.HAnchor.ParentLeft; diff --git a/SlicerConfiguration/SlicerMapping/EngineMappingSlic3r.cs b/SlicerConfiguration/SlicerMapping/EngineMappingSlic3r.cs index dd847659f..312243561 100644 --- a/SlicerConfiguration/SlicerMapping/EngineMappingSlic3r.cs +++ b/SlicerConfiguration/SlicerMapping/EngineMappingSlic3r.cs @@ -57,6 +57,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration hideItems.Add("cool_extruder_lift"); hideItems.Add("support_material_create_internal_support"); hideItems.Add("min_extrusion_before_retract"); + hideItems.Add("support_material_xy_distance"); + hideItems.Add("support_material_z_distance"); } return instance; } diff --git a/StaticData/Icons/PrintStatusControls/leveling-16x16.png b/StaticData/Icons/PrintStatusControls/leveling-16x16.png new file mode 100644 index 000000000..2ff387255 Binary files /dev/null and b/StaticData/Icons/PrintStatusControls/leveling-16x16.png differ diff --git a/StaticData/Icons/PrintStatusControls/leveling-24x24.png b/StaticData/Icons/PrintStatusControls/leveling-24x24.png new file mode 100644 index 000000000..9c4ee060b Binary files /dev/null and b/StaticData/Icons/PrintStatusControls/leveling-24x24.png differ diff --git a/StaticData/Icons/PrintStatusControls/terminal-24x24.png b/StaticData/Icons/PrintStatusControls/terminal-24x24.png new file mode 100644 index 000000000..af811b51f Binary files /dev/null and b/StaticData/Icons/PrintStatusControls/terminal-24x24.png differ