🧑‍💻 Combine G60-G61 (#28149)

This commit is contained in:
Scott Lahteine 2025-10-31 20:17:18 -05:00 committed by GitHub
parent 1c19cfcbc7
commit 5d59779a80
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 81 additions and 127 deletions

View file

@ -1,103 +0,0 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2020 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 <https://www.gnu.org/licenses/>.
*
*/
#include "../../../inc/MarlinConfig.h"
#if SAVED_POSITIONS
#include "../../gcode.h"
#include "../../../module/motion.h"
#define DEBUG_OUT ENABLED(SAVED_POSITIONS_DEBUG)
#include "../../../core/debug_out.h"
bool report_stored_position(const uint8_t slot) {
if (!did_save_position[slot]) return false;
const xyze_pos_t &pos = stored_position[slot];
SERIAL_ECHO(STR_SAVED_POSITION, slot, C(':'));
#if NUM_AXES
SERIAL_ECHOPGM_P(LOGICAL_AXIS_PAIRED_LIST(
SP_E_LBL, pos.e,
SP_X_LBL, pos.x, SP_Y_LBL, pos.y, SP_Z_LBL, pos.z,
SP_I_LBL, pos.i, SP_J_LBL, pos.j, SP_K_LBL, pos.k,
SP_U_LBL, pos.u, SP_V_LBL, pos.v, SP_W_LBL, pos.w
));
#endif
SERIAL_EOL();
return true;
}
/**
* G60: Saved Positions
*
* S<slot> - Save to a memory slot. (default 0)
* Q<slot> - Restore from a memory slot. (default 0)
* D<slot> - Delete a memory slot. With no number, delete all.
*/
void GcodeSuite::G60() {
// With no parameters report any saved positions
if (!parser.seen_any()) {
uint8_t count = 0;
for (uint8_t s = 0; s < SAVED_POSITIONS; ++s)
if (report_stored_position(s)) ++count;
if (!count) SERIAL_ECHOLNPGM("No Saved Positions");
return;
}
// Only one of these parameters is permitted
const uint8_t seenD = parser.seen_test('D'),
seenQ = parser.seen_test('Q'),
seenS = parser.seen_test('S');
if (seenD + seenQ + seenS > 1) return;
// G60 D : Delete all saved positions
if (seenD && !parser.seenval('D')) {
did_save_position.reset();
return;
}
// G60 Dn / Q / S : Get the slot value
const uint8_t slot = parser.byteval(seenD ? 'D' : seenQ ? 'Q' : 'S');
// G60 Q : Redirect to G61(slot)
if (seenQ) return G61(slot);
// Valid slot number?
if (SAVED_POSITIONS < 256 && slot >= SAVED_POSITIONS) {
SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS));
return;
}
// G60 Dn
if (seenD) {
SERIAL_ECHOLNPGM(STR_SAVED_POSITION, slot, ": DELETED");
did_save_position.clear(slot);
return;
}
// G60 S
stored_position[slot] = current_position;
did_save_position.set(slot);
report_stored_position(slot);
}
#endif // SAVED_POSITIONS

View file

@ -24,7 +24,6 @@
#if SAVED_POSITIONS
#include "../../../module/planner.h"
#include "../../gcode.h"
#include "../../../module/motion.h"
#include "../../../module/planner.h"
@ -32,6 +31,79 @@
#define DEBUG_OUT ENABLED(SAVED_POSITIONS_DEBUG)
#include "../../../core/debug_out.h"
Flags<SAVED_POSITIONS> did_save_position;
xyze_pos_t stored_position[SAVED_POSITIONS];
bool report_stored_position(const uint8_t slot) {
if (!did_save_position[slot]) return false;
const xyze_pos_t &pos = stored_position[slot];
SERIAL_ECHO(STR_SAVED_POSITION, slot, C(':'));
#if NUM_AXES
SERIAL_ECHOPGM_P(LOGICAL_AXIS_PAIRED_LIST(
SP_E_LBL, pos.e,
SP_X_LBL, pos.x, SP_Y_LBL, pos.y, SP_Z_LBL, pos.z,
SP_I_LBL, pos.i, SP_J_LBL, pos.j, SP_K_LBL, pos.k,
SP_U_LBL, pos.u, SP_V_LBL, pos.v, SP_W_LBL, pos.w
));
#endif
SERIAL_EOL();
return true;
}
/**
* G60: Saved Positions
*
* S<slot> - Save to a memory slot. (default 0)
* Q<slot> - Restore from a memory slot. (default 0)
* D<slot> - Delete a memory slot. With no number, delete all.
*/
void GcodeSuite::G60() {
// With no parameters report any saved positions
if (!parser.seen_any()) {
uint8_t count = 0;
for (uint8_t s = 0; s < SAVED_POSITIONS; ++s)
if (report_stored_position(s)) ++count;
if (!count) SERIAL_ECHOLNPGM("No Saved Positions");
return;
}
// Only one of these parameters is permitted
const uint8_t seenD = parser.seen_test('D'),
seenQ = parser.seen_test('Q'),
seenS = parser.seen_test('S');
if (seenD + seenQ + seenS > 1) return;
// G60 D : Delete all saved positions
if (seenD && !parser.seenval('D')) {
did_save_position.reset();
return;
}
// G60 Dn / Q / S : Get the slot value
const uint8_t slot = parser.byteval(seenD ? 'D' : seenQ ? 'Q' : 'S');
// G60 Q : Redirect to G61(slot)
if (seenQ) return G61(slot);
// Valid slot number?
if (SAVED_POSITIONS < 256 && slot >= SAVED_POSITIONS) {
SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS));
return;
}
// G60 Dn
if (seenD) {
SERIAL_ECHOLNPGM(STR_SAVED_POSITION, slot, ": DELETED");
did_save_position.clear(slot);
return;
}
// G60 S
stored_position[slot] = current_position;
did_save_position.set(slot);
report_stored_position(slot);
}
/**
* G61: Return to saved position
*

View file

@ -107,12 +107,6 @@ xyze_pos_t current_position = LOGICAL_AXIS_ARRAY(0, X_HOME_POS, Y_HOME_POS, Z_IN
*/
xyze_pos_t destination; // {0}
// G60/G61 Position Save and Return
#if SAVED_POSITIONS
Flags<SAVED_POSITIONS> did_save_position;
xyze_pos_t stored_position[SAVED_POSITIONS];
#endif
// The active extruder (tool). Set with T<extruder> command.
#if HAS_MULTI_EXTRUDER
uint8_t active_extruder = 0; // = 0

View file

@ -48,12 +48,6 @@ extern bool relative_mode;
extern xyze_pos_t current_position, // High-level current tool position
destination; // Destination for a move
// G60/G61 Position Save and Return
#if SAVED_POSITIONS
extern Flags<SAVED_POSITIONS> did_save_position;
extern xyze_pos_t stored_position[SAVED_POSITIONS];
#endif
// Scratch space for a cartesian result
extern xyz_pos_t cartes;

View file

@ -1378,14 +1378,7 @@ void CardReader::cdroot() {
#endif
#endif
#else // !SDSORT_USES_RAM
// By default re-read the names from SD for every compare
// retaining only two filenames at a time. This is very
// slow but is safest and uses minimal RAM.
char name1[LONG_FILENAME_LENGTH];
#endif
#endif // SDSORT_USES_RAM
if (fileCnt > 1) {

View file

@ -149,14 +149,18 @@ if pioutil.is_pio_build():
# Check for old files indicating an entangled Marlin (mixing old and new code)
#
mixedin = []
p = project_dir / "Marlin/src/lcd/dogm"
p = mpath / "src/lcd/dogm"
for f in [ "ultralcd_DOGM.cpp", "ultralcd_DOGM.h", "u8g_dev_ssd1306_sh1106_128x64_I2C.cpp", "u8g_dev_ssd1309_12864.cpp", "u8g_dev_st7565_64128n_HAL.cpp", "u8g_dev_st7920_128x64_HAL.cpp", "u8g_dev_tft_upscale_from_128x64.cpp", "u8g_dev_uc1701_mini12864_HAL.cpp", "ultralcd_st7920_u8glib_rrd_AVR.cpp" ]:
if (p / f).is_file():
mixedin += [ f ]
p = project_dir / "Marlin/src/feature/bedlevel/abl"
p = mpath / "src/feature/bedlevel/abl"
for f in [ "abl.cpp", "abl.h" ]:
if (p / f).is_file():
mixedin += [ f ]
f = mpath / "src/gcode/feature/pause"
for f in [ "G60.cpp", "G61.cpp" ]:
if (p / f).is_file():
mixedin += [ f ]
if mixedin:
err = "ERROR: Old files fell into your Marlin folder. Remove %s and try again" % ", ".join(mixedin)
raise SystemExit(err)

View file

@ -319,7 +319,7 @@ HAS_ZV_SHAPING = build_src_filter=+<src/gcode/feature/in
GCODE_MACROS = build_src_filter=+<src/gcode/feature/macro>
GRADIENT_MIX = build_src_filter=+<src/gcode/feature/mixing/M166.cpp>
NONLINEAR_EXTRUSION = build_src_filter=+<src/gcode/feature/nonlinear>
HAS_SAVED_POSITIONS = build_src_filter=+<src/gcode/feature/pause/G60.cpp> +<src/gcode/feature/pause/G61.cpp>
HAS_SAVED_POSITIONS = build_src_filter=+<src/gcode/feature/pause/G60_G61.cpp>
PARK_HEAD_ON_PAUSE = build_src_filter=+<src/gcode/feature/pause/M125.cpp>
FILAMENT_LOAD_UNLOAD_GCODES = build_src_filter=+<src/gcode/feature/pause/M701_M702.cpp>
HAS_STEALTHCHOP = build_src_filter=+<src/gcode/feature/trinamic/M569.cpp>