G60/G61 Position Save/Restore (#16557)
This commit is contained in:
parent
a0a93e35ae
commit
e2eef1256a
10 changed files with 183 additions and 14 deletions
|
@ -1576,6 +1576,11 @@
|
||||||
|
|
||||||
// @section extras
|
// @section extras
|
||||||
|
|
||||||
|
//
|
||||||
|
// G60/G61 Position Save and Return
|
||||||
|
//
|
||||||
|
//#define SAVED_POSITIONS 1 // Each saved position slot costs 12 bytes
|
||||||
|
|
||||||
//
|
//
|
||||||
// G2/G3 Arc Support
|
// G2/G3 Arc Support
|
||||||
//
|
//
|
||||||
|
|
|
@ -61,8 +61,6 @@
|
||||||
|
|
||||||
#define HAL_TIMER_RATE (F_CPU / 2) // frequency of timer peripherals
|
#define HAL_TIMER_RATE (F_CPU / 2) // frequency of timer peripherals
|
||||||
|
|
||||||
// STM32F401 only has timers 1-5 & 9-11 with timers 4 & 5 usually assigned to TIMER_SERVO and TIMER_TONE
|
|
||||||
|
|
||||||
#ifndef STEP_TIMER
|
#ifndef STEP_TIMER
|
||||||
#define STEP_TIMER 9
|
#define STEP_TIMER 9
|
||||||
#endif
|
#endif
|
||||||
|
@ -76,11 +74,11 @@
|
||||||
#define HAL_TIMER_RATE (F_CPU / 2) // frequency of timer peripherals
|
#define HAL_TIMER_RATE (F_CPU / 2) // frequency of timer peripherals
|
||||||
|
|
||||||
#ifndef STEP_TIMER
|
#ifndef STEP_TIMER
|
||||||
#define STEP_TIMER 6
|
#define STEP_TIMER 6 // STM32F401 has no TIM6, TIM7, or TIM8
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef TEMP_TIMER
|
#ifndef TEMP_TIMER
|
||||||
#define TEMP_TIMER 14
|
#define TEMP_TIMER 14 // TIM7 is consumed by Software Serial if used.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(STM32F7xx)
|
#elif defined(STM32F7xx)
|
||||||
|
@ -88,7 +86,7 @@
|
||||||
#define HAL_TIMER_RATE (F_CPU / 2) // frequency of timer peripherals
|
#define HAL_TIMER_RATE (F_CPU / 2) // frequency of timer peripherals
|
||||||
|
|
||||||
#ifndef STEP_TIMER
|
#ifndef STEP_TIMER
|
||||||
#define STEP_TIMER 6
|
#define STEP_TIMER 6 // the RIGHT timer!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef TEMP_TIMER
|
#ifndef TEMP_TIMER
|
||||||
|
|
|
@ -222,6 +222,10 @@
|
||||||
#define MSG_SOFT_MIN " Min: "
|
#define MSG_SOFT_MIN " Min: "
|
||||||
#define MSG_SOFT_MAX " Max: "
|
#define MSG_SOFT_MAX " Max: "
|
||||||
|
|
||||||
|
#define MSG_SAVED_POS "Position saved"
|
||||||
|
#define MSG_RESTORING_POS "Restoring position"
|
||||||
|
#define MSG_INVALID_POS_SLOT "Invalid slot. Total: "
|
||||||
|
|
||||||
#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir "
|
#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir "
|
||||||
#define MSG_SD_INIT_FAIL "SD init fail"
|
#define MSG_SD_INIT_FAIL "SD init fail"
|
||||||
#define MSG_SD_VOL_INIT_FAIL "volume.init failed"
|
#define MSG_SD_VOL_INIT_FAIL "volume.init failed"
|
||||||
|
|
59
Marlin/src/gcode/feature/pause/G60.cpp
Normal file
59
Marlin/src/gcode/feature/pause/G60.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
|
#if SAVED_POSITIONS
|
||||||
|
|
||||||
|
#include "../../../core/language.h"
|
||||||
|
#include "../../gcode.h"
|
||||||
|
#include "../../../module/motion.h"
|
||||||
|
|
||||||
|
#define DEBUG_OUT ENABLED(SAVED_POSITIONS_DEBUG)
|
||||||
|
#include "../../../core/debug_out.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* G60: Save current position
|
||||||
|
*
|
||||||
|
* S<slot> - Memory slot # (0-based) to save into (default 0)
|
||||||
|
*/
|
||||||
|
void GcodeSuite::G60() {
|
||||||
|
const uint8_t slot = parser.byteval('S');
|
||||||
|
|
||||||
|
if (slot >= SAVED_POSITIONS) {
|
||||||
|
SERIAL_ERROR_MSG(MSG_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
stored_position[slot] = current_position;
|
||||||
|
SBI(saved_slots, slot);
|
||||||
|
|
||||||
|
#if ENABLED(SAVED_POSITIONS_DEBUG)
|
||||||
|
const xyze_pos_t &pos = stored_position[slot];
|
||||||
|
DEBUG_ECHOPAIR_F(MSG_SAVED_POS " S", slot);
|
||||||
|
DEBUG_ECHOPAIR_F(" : X", pos.x);
|
||||||
|
DEBUG_ECHOPAIR_F_P(SP_Y_STR, pos.y);
|
||||||
|
DEBUG_ECHOLNPAIR_F_P(SP_Z_STR, pos.z);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // SAVED_POSITIONS
|
71
Marlin/src/gcode/feature/pause/G61.cpp
Normal file
71
Marlin/src/gcode/feature/pause/G61.cpp
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
|
#if SAVED_POSITIONS
|
||||||
|
|
||||||
|
#include "../../../core/language.h"
|
||||||
|
#include "../../module/planner.h"
|
||||||
|
#include "../../gcode.h"
|
||||||
|
#include "../../../module/motion.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* G61: Return to saved position
|
||||||
|
*
|
||||||
|
* F<rate> - Feedrate (optional) for the move back.
|
||||||
|
* S<slot> - Slot # (0-based) to restore from (default 0).
|
||||||
|
* X Y Z - Axes to restore. At least one is required.
|
||||||
|
*/
|
||||||
|
void GcodeSuite::G61(void) {
|
||||||
|
|
||||||
|
const uint8_t slot = parser.byteval('S');
|
||||||
|
|
||||||
|
#if SAVED_POSITIONS < 256
|
||||||
|
if (slot >= SAVED_POSITIONS) {
|
||||||
|
SERIAL_ERROR_MSG(MSG_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// No saved position? No axes being restored?
|
||||||
|
if (!TEST(saved_slots, slot) || !parser.seen("XYZ")) return;
|
||||||
|
|
||||||
|
// Apply any given feedrate over 0.0
|
||||||
|
const float fr = parser.linearval('F');
|
||||||
|
if (fr > 0.0) feedrate_mm_s = MMM_TO_MMS(fr);
|
||||||
|
|
||||||
|
SERIAL_ECHOPAIR(MSG_RESTORING_POS " S", int(slot));
|
||||||
|
LOOP_XYZ(i) {
|
||||||
|
destination[i] = parser.seen(axis_codes[i])
|
||||||
|
? stored_position[slot][i] + parser.value_axis_units((AxisEnum)i)
|
||||||
|
: current_position[i];
|
||||||
|
SERIAL_CHAR(' ', axis_codes[i]);
|
||||||
|
SERIAL_ECHO_F(destination[i]);
|
||||||
|
}
|
||||||
|
SERIAL_EOL();
|
||||||
|
|
||||||
|
// Move to the saved position
|
||||||
|
prepare_move_to_destination();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // SAVED_POSITIONS
|
|
@ -314,19 +314,27 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(CNC_COORDINATE_SYSTEMS)
|
#if ENABLED(CNC_COORDINATE_SYSTEMS)
|
||||||
case 53: G53(); break;
|
case 53: G53(); break; // G53: (prefix) Apply native workspace
|
||||||
case 54: G54(); break;
|
case 54: G54(); break; // G54: Switch to Workspace 1
|
||||||
case 55: G55(); break;
|
case 55: G55(); break; // G55: Switch to Workspace 2
|
||||||
case 56: G56(); break;
|
case 56: G56(); break; // G56: Switch to Workspace 3
|
||||||
case 57: G57(); break;
|
case 57: G57(); break; // G57: Switch to Workspace 4
|
||||||
case 58: G58(); break;
|
case 58: G58(); break; // G58: Switch to Workspace 5
|
||||||
case 59: G59(); break;
|
case 59: G59(); break; // G59.0 - G59.3: Switch to Workspace 6-9
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if SAVED_POSITIONS
|
||||||
|
case 60: G60(); break; // G60: save current position
|
||||||
|
case 61: G61(); break; // G61: Apply/restore saved coordinates.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(PROBE_TEMP_COMPENSATION)
|
#if ENABLED(PROBE_TEMP_COMPENSATION)
|
||||||
case 76: G76(); break; // G76: Calibrate first layer compensation values
|
case 76: G76(); break; // G76: Calibrate first layer compensation values
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
case 60: G60(); break; // G60: save current position
|
||||||
|
case 61: G61(); break; // G61: Apply/restore saved coordinates.
|
||||||
|
|
||||||
#if ENABLED(GCODE_MOTION_MODES)
|
#if ENABLED(GCODE_MOTION_MODES)
|
||||||
case 80: G80(); break; // G80: Reset the current motion mode
|
case 80: G80(); break; // G80: Reset the current motion mode
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -67,6 +67,8 @@
|
||||||
* G34 - Z Stepper automatic alignment using probe: I<iterations> T<accuracy> A<amplification> (Requires Z_STEPPER_AUTO_ALIGN)
|
* G34 - Z Stepper automatic alignment using probe: I<iterations> T<accuracy> A<amplification> (Requires Z_STEPPER_AUTO_ALIGN)
|
||||||
* G38 - Probe in any direction using the Z_MIN_PROBE (Requires G38_PROBE_TARGET)
|
* G38 - Probe in any direction using the Z_MIN_PROBE (Requires G38_PROBE_TARGET)
|
||||||
* G42 - Coordinated move to a mesh point (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BLINEAR, or AUTO_BED_LEVELING_UBL)
|
* G42 - Coordinated move to a mesh point (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BLINEAR, or AUTO_BED_LEVELING_UBL)
|
||||||
|
* G60 - Save current position. (Requires SAVED_POSITIONS)
|
||||||
|
* G61 - Apply/restore saved coordinates. (Requires SAVED_POSITIONS)
|
||||||
* G76 - Calibrate first layer temperature offsets. (Requires PROBE_TEMP_COMPENSATION)
|
* G76 - Calibrate first layer temperature offsets. (Requires PROBE_TEMP_COMPENSATION)
|
||||||
* G80 - Cancel current motion mode (Requires GCODE_MOTION_MODES)
|
* G80 - Cancel current motion mode (Requires GCODE_MOTION_MODES)
|
||||||
* G90 - Use Absolute Coordinates
|
* G90 - Use Absolute Coordinates
|
||||||
|
@ -471,6 +473,11 @@ private:
|
||||||
static void G76();
|
static void G76();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if SAVED_POSITIONS
|
||||||
|
static void G60();
|
||||||
|
static void G61();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(GCODE_MOTION_MODES)
|
#if ENABLED(GCODE_MOTION_MODES)
|
||||||
static void G80();
|
static void G80();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -142,3 +142,8 @@
|
||||||
#if ENABLED(JOYSTICK)
|
#if ENABLED(JOYSTICK)
|
||||||
#define POLL_JOG
|
#define POLL_JOG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// G60/G61 Position Save
|
||||||
|
#if SAVED_POSITIONS > 256
|
||||||
|
#error "SAVED_POSITIONS must be an integer from 0 to 256."
|
||||||
|
#endif
|
||||||
|
|
|
@ -109,9 +109,15 @@ xyze_pos_t current_position = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS };
|
||||||
*/
|
*/
|
||||||
xyze_pos_t destination; // {0}
|
xyze_pos_t destination; // {0}
|
||||||
|
|
||||||
|
// G60/G61 Position Save and Return
|
||||||
|
#if SAVED_POSITIONS
|
||||||
|
uint8_t saved_slots;
|
||||||
|
xyz_pos_t stored_position[SAVED_POSITIONS];
|
||||||
|
#endif
|
||||||
|
|
||||||
// The active extruder (tool). Set with T<extruder> command.
|
// The active extruder (tool). Set with T<extruder> command.
|
||||||
#if EXTRUDERS > 1
|
#if EXTRUDERS > 1
|
||||||
uint8_t active_extruder; // = 0
|
uint8_t active_extruder = 0; // = 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(LCD_SHOW_E_TOTAL)
|
#if ENABLED(LCD_SHOW_E_TOTAL)
|
||||||
|
|
|
@ -65,6 +65,12 @@ extern bool relative_mode;
|
||||||
extern xyze_pos_t current_position, // High-level current tool position
|
extern xyze_pos_t current_position, // High-level current tool position
|
||||||
destination; // Destination for a move
|
destination; // Destination for a move
|
||||||
|
|
||||||
|
// G60/G61 Position Save and Return
|
||||||
|
#if SAVED_POSITIONS
|
||||||
|
extern uint8_t saved_slots;
|
||||||
|
extern xyz_pos_t stored_position[SAVED_POSITIONS];
|
||||||
|
#endif
|
||||||
|
|
||||||
// Scratch space for a cartesian result
|
// Scratch space for a cartesian result
|
||||||
extern xyz_pos_t cartes;
|
extern xyz_pos_t cartes;
|
||||||
|
|
||||||
|
|
Reference in a new issue