Making hot end heat up before probing the bed with the tip
Refactoring - moving classes to individual files
This commit is contained in:
parent
b7918347d6
commit
4cb61563d3
24 changed files with 1363 additions and 807 deletions
174
ConfigurationPage/PrintLeveling/WizardPages/AutoProbeFeedback.cs
Normal file
174
ConfigurationPage/PrintLeveling/WizardPages/AutoProbeFeedback.cs
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
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 MatterControl.Printing;
|
||||
using MatterHackers.Agg;
|
||||
using MatterHackers.Agg.UI;
|
||||
using MatterHackers.MatterControl.PrinterCommunication;
|
||||
using MatterHackers.MatterControl.PrinterCommunication.Io;
|
||||
using MatterHackers.MatterControl.SlicerConfiguration;
|
||||
using MatterHackers.VectorMath;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling
|
||||
{
|
||||
public class AutoProbeFeedback : InstructionsPage
|
||||
{
|
||||
private Vector3 lastReportedPosition;
|
||||
private List<ProbePosition> probePositions;
|
||||
int probePositionsBeingEditedIndex;
|
||||
|
||||
private EventHandler unregisterEvents;
|
||||
protected Vector3 probeStartPosition;
|
||||
protected WizardControl container;
|
||||
|
||||
public AutoProbeFeedback(PrinterConfig printer, WizardControl container, Vector3 probeStartPosition, string pageDescription, List<ProbePosition> probePositions, int probePositionsBeingEditedIndex, ThemeConfig theme)
|
||||
: base(printer, pageDescription, pageDescription, theme)
|
||||
{
|
||||
this.container = container;
|
||||
this.probeStartPosition = probeStartPosition;
|
||||
|
||||
this.probePositions = probePositions;
|
||||
|
||||
this.lastReportedPosition = printer.Connection.LastReportedPosition;
|
||||
this.probePositionsBeingEditedIndex = probePositionsBeingEditedIndex;
|
||||
|
||||
GuiWidget spacer = new GuiWidget(15, 15);
|
||||
topToBottomControls.AddChild(spacer);
|
||||
|
||||
FlowLayoutWidget textFields = new FlowLayoutWidget(FlowDirection.TopToBottom);
|
||||
}
|
||||
|
||||
private void GetZProbeHeight(object sender, EventArgs e)
|
||||
{
|
||||
StringEventArgs currentEvent = e as StringEventArgs;
|
||||
if (currentEvent != null)
|
||||
{
|
||||
double sampleRead = double.MinValue;
|
||||
if (currentEvent.Data.StartsWith("Bed")) // marlin G30 return code (looks like: 'Bed Position X:20 Y:32 Z:.01')
|
||||
{
|
||||
probePositions[probePositionsBeingEditedIndex].position.X = probeStartPosition.X;
|
||||
probePositions[probePositionsBeingEditedIndex].position.Y = probeStartPosition.Y;
|
||||
GCodeFile.GetFirstNumberAfter("Z:", currentEvent.Data, ref sampleRead);
|
||||
}
|
||||
else if (currentEvent.Data.StartsWith("Z:")) // smoothie G30 return code (looks like: 'Z:10.01')
|
||||
{
|
||||
probePositions[probePositionsBeingEditedIndex].position.X = probeStartPosition.X;
|
||||
probePositions[probePositionsBeingEditedIndex].position.Y = probeStartPosition.Y;
|
||||
// smoothie returns the position relative to the start position
|
||||
double reportedProbeZ = 0;
|
||||
GCodeFile.GetFirstNumberAfter("Z:", currentEvent.Data, ref reportedProbeZ);
|
||||
sampleRead = probeStartPosition.Z - reportedProbeZ;
|
||||
}
|
||||
|
||||
if (sampleRead != double.MinValue)
|
||||
{
|
||||
samples.Add(sampleRead);
|
||||
|
||||
int numberOfSamples = printer.Settings.GetValue<int>(SettingsKey.z_probe_samples);
|
||||
if (samples.Count == numberOfSamples)
|
||||
{
|
||||
samples.Sort();
|
||||
if (samples.Count > 3)
|
||||
{
|
||||
// drop the high and low values
|
||||
samples.RemoveAt(0);
|
||||
samples.RemoveAt(samples.Count - 1);
|
||||
}
|
||||
|
||||
probePositions[probePositionsBeingEditedIndex].position.Z = Math.Round(samples.Average(), 2);
|
||||
UiThread.RunOnIdle(() => container.nextButton.OnClick(null));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnClosed(ClosedEventArgs e)
|
||||
{
|
||||
unregisterEvents?.Invoke(this, null);
|
||||
base.OnClosed(e);
|
||||
}
|
||||
|
||||
List<double> samples = new List<double>();
|
||||
|
||||
public override void PageIsBecomingActive()
|
||||
{
|
||||
// always make sure we don't have print leveling turned on
|
||||
PrintLevelingStream.AllowLeveling = false;
|
||||
|
||||
base.PageIsBecomingActive();
|
||||
|
||||
if (printer.Settings.GetValue<bool>(SettingsKey.has_z_probe)
|
||||
&& printer.Settings.GetValue<bool>(SettingsKey.use_z_probe)
|
||||
&& printer.Settings.GetValue<bool>(SettingsKey.has_z_servo))
|
||||
{
|
||||
// make sure the servo is deployed
|
||||
var servoDeploy = printer.Settings.GetValue<double>(SettingsKey.z_servo_depolyed_angle);
|
||||
printer.Connection.QueueLine($"M280 P0 S{servoDeploy}");
|
||||
}
|
||||
|
||||
var feedRates = printer.Settings.Helpers.ManualMovementSpeeds();
|
||||
|
||||
var adjustedProbePosition = probeStartPosition;
|
||||
// subtract out the probe offset
|
||||
var probeOffset = printer.Settings.GetValue<Vector2>(SettingsKey.z_probe_xy_offset);
|
||||
adjustedProbePosition -= new Vector3(probeOffset);
|
||||
|
||||
printer.Connection.MoveAbsolute(PrinterConnection.Axis.Z, probeStartPosition.Z, feedRates.Z);
|
||||
printer.Connection.MoveAbsolute(adjustedProbePosition, feedRates.X);
|
||||
|
||||
int numberOfSamples = printer.Settings.GetValue<int>(SettingsKey.z_probe_samples);
|
||||
for (int i = 0; i < numberOfSamples; i++)
|
||||
{
|
||||
// probe the current position
|
||||
printer.Connection.QueueLine("G30");
|
||||
// raise the probe after each sample
|
||||
printer.Connection.MoveAbsolute(adjustedProbePosition, feedRates.X);
|
||||
}
|
||||
|
||||
container.backButton.Enabled = false;
|
||||
container.nextButton.Enabled = false;
|
||||
|
||||
if (printer.Connection.IsConnected
|
||||
&& !(printer.Connection.PrinterIsPrinting
|
||||
|| printer.Connection.PrinterIsPaused))
|
||||
{
|
||||
printer.Connection.LineReceived.RegisterEvent(GetZProbeHeight, ref unregisterEvents);
|
||||
}
|
||||
}
|
||||
|
||||
public override void PageIsBecomingInactive()
|
||||
{
|
||||
printer.Connection.LineReceived.UnregisterEvent(GetZProbeHeight, ref unregisterEvents);
|
||||
base.PageIsBecomingInactive();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue