Skip to content

Commit 0478e7d

Browse files
⛙ Merge w/Marlin
2 parents 4ff87ce + 09e943a commit 0478e7d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+590
-471
lines changed

Marlin/Configuration_adv.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,7 +1168,10 @@
11681168
//#define FT_MOTION_MENU // Provide a MarlinUI menu to set M493 and M494 parameters
11691169
//#define FTM_HOME_AND_PROBE // Use FT Motion for homing / probing. Disable if FT Motion breaks these functions.
11701170

1171-
#define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (DISABLED, Z_BASED, MASS_BASED)
1171+
//#define FTM_DYNAMIC_FREQ // Enable for linear adjustment of XY shaping frequency according to Z or E
1172+
#if ENABLED(FTM_DYNAMIC_FREQ)
1173+
#define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (DISABLED, Z_BASED, MASS_BASED)
1174+
#endif
11721175

11731176
#define FTM_DEFAULT_SHAPER_X ftMotionShaper_NONE // Default shaper mode on X axis (NONE, ZV, ZVD, ZVDD, ZVDDD, EI, 2HEI, 3HEI, MZV)
11741177
#define FTM_SHAPING_DEFAULT_FREQ_X 37.0f // (Hz) Default peak frequency used by input shapers
@@ -1225,7 +1228,6 @@
12251228
#define FTM_BUFFER_SIZE 128 // Window size for trajectory generation, must be a power of 2 (e.g 64, 128, 256, ...)
12261229
// The total buffered time in seconds is (FTM_BUFFER_SIZE/FTM_FS)
12271230
#define FTM_FS 1000 // (Hz) Frequency for trajectory generation.
1228-
#define FTM_STEPPER_FS 2'000'000 // (Hz) Time resolution of stepper I/O update. Shouldn't affect CPU much (slower board testing needed)
12291231
#define FTM_MIN_SHAPE_FREQ 20 // (Hz) Minimum shaping frequency, lower consumes more RAM
12301232

12311233
#endif // FT_MOTION

Marlin/Version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
* here we define this default string as the date where the latest release
4242
* version was tagged.
4343
*/
44-
//#define STRING_DISTRIBUTION_DATE "2025-12-01"
44+
//#define STRING_DISTRIBUTION_DATE "2025-12-03"
4545

4646
#define STRING_DISTRIBUTION_DATE __DATE__
4747
#define STRING_DISTRIBUTION_TIME __TIME__

Marlin/src/HAL/STM32/timers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
#define TEMP_TIMER_FREQUENCY 1000 // Temperature::isr() is expected to be called at around 1kHz
5252

5353
/// TODO: get rid of manual rate/prescale/ticks/cycles taken for procedures in stepper.cpp
54-
#define STEPPER_TIMER_RATE 2000000 // 2 Mhz
54+
#define STEPPER_TIMER_RATE 2'000'000 // 2 Mhz
5555
extern uint32_t GetStepperTimerClkFreq();
5656
#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / (STEPPER_TIMER_RATE))
5757
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000UL) // (MHz) Stepper Timer ticks per µs

Marlin/src/feature/e_parser.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ class EmergencyParser {
8686

8787
static void update(State &state, const uint8_t c);
8888

89+
static bool isEnabled() { return enabled; }
90+
8991
private:
9092
static bool enabled;
9193
};

Marlin/src/feature/pause.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,10 +300,10 @@ bool load_filament(const float slow_load_length/*=0*/, const float fast_load_len
300300
// Show "Purge More" / "Resume" menu and wait for reply
301301
KEEPALIVE_STATE(PAUSED_FOR_USER);
302302
marlin.user_resume();
303+
pause_menu_response = PAUSE_RESPONSE_WAIT_FOR;
303304
#if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_LCD_PROUI)
304305
ui.pause_show_message(PAUSE_MESSAGE_OPTION); // MarlinUI and MKS UI also set PAUSE_RESPONSE_WAIT_FOR
305306
#else
306-
pause_menu_response = PAUSE_RESPONSE_WAIT_FOR;
307307
TERN_(SOVOL_SV06_RTS, rts.gotoPage(ID_PurgeMore_L, ID_PurgeMore_D));
308308
#endif
309309
while (pause_menu_response == PAUSE_RESPONSE_WAIT_FOR) marlin.idle_no_sleep();

Marlin/src/gcode/calibrate/G28.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,15 +129,14 @@
129129
#if ENABLED(Z_SAFE_HOMING)
130130

131131
inline void home_z_safely() {
132-
133-
// Potentially disable Fixed-Time Motion for homing
134-
TERN_(FT_MOTION, FTM_DISABLE_IN_SCOPE());
135-
136132
DEBUG_SECTION(log_G28, "home_z_safely", DEBUGGING(LEVELING));
137133

138134
// Disallow Z homing if X or Y homing is needed
139135
if (homing_needed_error(_BV(X_AXIS) | _BV(Y_AXIS))) return;
140136

137+
// Potentially disable Fixed-Time Motion for homing
138+
TERN_(FT_MOTION, FTM_DISABLE_IN_SCOPE());
139+
141140
sync_plan_position();
142141

143142
/**

Marlin/src/gcode/control/M108_M112_M410.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@
2121
*/
2222

2323
#include "../../inc/MarlinConfig.h"
24-
25-
#if DISABLED(EMERGENCY_PARSER)
26-
2724
#include "../gcode.h"
2825
#include "../../module/motion.h" // for quickstop_stepper
2926

@@ -50,5 +47,3 @@ void GcodeSuite::M112() {
5047
void GcodeSuite::M410() {
5148
quickstop_stepper();
5249
}
53-
54-
#endif // !EMERGENCY_PARSER

Marlin/src/gcode/feature/ft_motion/M493.cpp

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -208,12 +208,14 @@ void GcodeSuite::M493() {
208208
if (!parser.seen_any())
209209
flag.report = true;
210210

211+
ft_config_t &c = ftMotion.cfg;
212+
211213
// Parse 'S' mode parameter.
212214
if (parser.seen('S')) {
213215
const bool active = parser.value_bool();
214-
if (active != ftMotion.cfg.active) {
216+
if (active != c.active) {
215217
stepper.ftMotion_syncPosition();
216-
ftMotion.cfg.active = active;
218+
c.active = active;
217219
flag.report = true;
218220
}
219221
}
@@ -228,8 +230,8 @@ void GcodeSuite::M493() {
228230
return;
229231
}
230232
auto set_shaper = [&](const AxisEnum axis, ftMotionShaper_t newsh) {
231-
if (newsh != ftMotion.cfg.shaper[axis]) {
232-
ftMotion.cfg.shaper[axis] = newsh;
233+
if (newsh != c.shaper[axis]) {
234+
c.shaper[axis] = newsh;
233235
flag.update = flag.report = true;
234236
}
235237
};
@@ -243,8 +245,8 @@ void GcodeSuite::M493() {
243245
// Parse 'H' Axis Synchronization parameter.
244246
if (parser.seenval('H')) {
245247
const bool enabled = parser.value_bool();
246-
if (enabled != ftMotion.cfg.axis_sync_enabled) {
247-
ftMotion.cfg.axis_sync_enabled = enabled;
248+
if (enabled != c.axis_sync_enabled) {
249+
c.axis_sync_enabled = enabled;
248250
flag.report = true;
249251
}
250252
}
@@ -263,30 +265,26 @@ void GcodeSuite::M493() {
263265
case dynFreqMode_MASS_BASED:
264266
#endif
265267
case dynFreqMode_DISABLED:
266-
ftMotion.cfg.dynFreqMode = val;
268+
c.dynFreqMode = val;
267269
flag.report = true;
268270
break;
269271
default:
270272
SERIAL_ECHOLN(F("?Invalid "), F("(D)ynamic Frequency Mode value."));
271273
break;
272274
}
273275
}
274-
else {
275-
SERIAL_ECHOLNPGM("?Wrong shaper for (D)ynamic Frequency Mode ", ftMotion.cfg.dynFreqMode, ".");
276-
}
276+
else
277+
SERIAL_ECHOLNPGM("?Shaper required for (D)ynamic Frequency Mode ", c.dynFreqMode, ".");
277278
}
278279

279-
const bool modeUsesDynFreq = (
280-
TERN0(HAS_DYNAMIC_FREQ_MM, ftMotion.cfg.dynFreqMode == dynFreqMode_Z_BASED)
281-
|| TERN0(HAS_DYNAMIC_FREQ_G, ftMotion.cfg.dynFreqMode == dynFreqMode_MASS_BASED)
282-
);
280+
const bool modeUsesDynFreq = c.modeUsesDynFreq();
283281

284282
#endif // HAS_DYNAMIC_FREQ
285283

286284
// Frequency parameter
287285
const bool seenA = parser.seenval('A');
288286
const float baseFreqVal = seenA ? parser.value_float() : 0.0f;
289-
const bool goodBaseFreq = seenA && WITHIN(baseFreqVal, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2);
287+
const bool goodBaseFreq = seenA && c.goodBaseFreq(baseFreqVal);
290288
if (seenA && !goodBaseFreq)
291289
SERIAL_ECHOLN(F("?Invalid "), F("(A) Base Frequency value. ("), int(FTM_MIN_SHAPE_FREQ), C('-'), int((FTM_FS) / 2), C(')'));
292290

@@ -301,14 +299,14 @@ void GcodeSuite::M493() {
301299
// Zeta parameter
302300
const bool seenI = parser.seenval('I');
303301
const float zetaVal = seenI ? parser.value_float() : 0.0f;
304-
const bool goodZeta = seenI && WITHIN(zetaVal, 0.01f, 1.0f);
302+
const bool goodZeta = seenI && c.goodZeta(zetaVal);
305303
if (seenI && !goodZeta)
306304
SERIAL_ECHOLN(F("?Invalid "), F("(I) Zeta value. (0.01-1.0)")); // Zeta out of range
307305

308306
// Vibration Tolerance parameter
309307
const bool seenQ = parser.seenval('Q');
310308
const float vtolVal = seenQ ? parser.value_float() : 0.0f;
311-
const bool goodVtol = seenQ && WITHIN(vtolVal, 0.00f, 1.0f);
309+
const bool goodVtol = seenQ && c.goodVtol(vtolVal);
312310
if (seenQ && !goodVtol)
313311
SERIAL_ECHOLN(F("?Invalid "), F("(Q) Vibration Tolerance value. (0.0-1.0)")); // VTol out of range
314312

@@ -323,18 +321,18 @@ void GcodeSuite::M493() {
323321
if (AXIS_IS_SHAPING(X)) {
324322
// TODO: Frequency minimum is dependent on the shaper used; the above check isn't always correct.
325323
if (goodBaseFreq) {
326-
ftMotion.cfg.baseFreq.x = baseFreqVal;
324+
c.baseFreq.x = baseFreqVal;
327325
flag.update = flag.report = true;
328326
}
329327
}
330328
else // Mode doesn't use frequency.
331-
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_A_NAME), " [A] frequency.");
329+
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_A_NAME), " (A) frequency.");
332330
}
333331

334332
#if HAS_DYNAMIC_FREQ
335333
// Parse X frequency scaling parameter
336334
if (seenF && modeUsesDynFreq) {
337-
ftMotion.cfg.dynFreqK.x = baseDynFreqVal;
335+
c.dynFreqK.x = baseDynFreqVal;
338336
flag.report = true;
339337
}
340338
#endif
@@ -343,24 +341,24 @@ void GcodeSuite::M493() {
343341
if (seenI) {
344342
if (AXIS_IS_SHAPING(X)) {
345343
if (goodZeta) {
346-
ftMotion.cfg.zeta.x = zetaVal;
344+
c.zeta.x = zetaVal;
347345
flag.update = true;
348346
}
349347
}
350348
else
351-
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_A_NAME), " zeta parameter.");
349+
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_A_NAME), " (I) zeta parameter.");
352350
}
353351

354352
// Parse X vtol parameter
355353
if (seenQ) {
356354
if (AXIS_IS_EISHAPING(X)) {
357355
if (goodVtol) {
358-
ftMotion.cfg.vtol.x = vtolVal;
356+
c.vtol.x = vtolVal;
359357
flag.update = true;
360358
}
361359
}
362360
else
363-
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_A_NAME), " vtol parameter.");
361+
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_A_NAME), " (Q) vtol parameter.");
364362
}
365363
}
366364

@@ -374,18 +372,18 @@ void GcodeSuite::M493() {
374372
if (seenA) {
375373
if (AXIS_IS_SHAPING(Y)) {
376374
if (goodBaseFreq) {
377-
ftMotion.cfg.baseFreq.y = baseFreqVal;
375+
c.baseFreq.y = baseFreqVal;
378376
flag.update = flag.report = true;
379377
}
380378
}
381379
else // Mode doesn't use frequency.
382-
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_B_NAME), " [A] frequency.");
380+
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_B_NAME), " (A) frequency.");
383381
}
384382

385383
#if HAS_DYNAMIC_FREQ
386384
// Parse Y frequency scaling parameter
387385
if (seenF && modeUsesDynFreq) {
388-
ftMotion.cfg.dynFreqK.y = baseDynFreqVal;
386+
c.dynFreqK.y = baseDynFreqVal;
389387
flag.report = true;
390388
}
391389
#endif
@@ -394,24 +392,24 @@ void GcodeSuite::M493() {
394392
if (seenI) {
395393
if (AXIS_IS_SHAPING(Y)) {
396394
if (goodZeta) {
397-
ftMotion.cfg.zeta.y = zetaVal;
395+
c.zeta.y = zetaVal;
398396
flag.update = true;
399397
}
400398
}
401399
else
402-
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_B_NAME), " zeta parameter.");
400+
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_B_NAME), " (I) zeta parameter.");
403401
}
404402

405403
// Parse Y vtol parameter
406404
if (seenQ) {
407405
if (AXIS_IS_EISHAPING(Y)) {
408406
if (goodVtol) {
409-
ftMotion.cfg.vtol.y = vtolVal;
407+
c.vtol.y = vtolVal;
410408
flag.update = true;
411409
}
412410
}
413411
else
414-
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_B_NAME), " vtol parameter.");
412+
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_B_NAME), " (Q) vtol parameter.");
415413
}
416414
}
417415

@@ -425,18 +423,18 @@ void GcodeSuite::M493() {
425423
if (seenA) {
426424
if (AXIS_IS_SHAPING(Z)) {
427425
if (goodBaseFreq) {
428-
ftMotion.cfg.baseFreq.z = baseFreqVal;
426+
c.baseFreq.z = baseFreqVal;
429427
flag.update = flag.report = true;
430428
}
431429
}
432430
else // Mode doesn't use frequency.
433-
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_C_NAME), " [A] frequency.");
431+
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_C_NAME), " (A) frequency.");
434432
}
435433

436434
#if HAS_DYNAMIC_FREQ
437435
// Parse Z frequency scaling parameter
438436
if (seenF && modeUsesDynFreq) {
439-
ftMotion.cfg.dynFreqK.z = baseDynFreqVal;
437+
c.dynFreqK.z = baseDynFreqVal;
440438
flag.report = true;
441439
}
442440
#endif
@@ -445,24 +443,24 @@ void GcodeSuite::M493() {
445443
if (seenI) {
446444
if (AXIS_IS_SHAPING(Z)) {
447445
if (goodZeta) {
448-
ftMotion.cfg.zeta.z = zetaVal;
446+
c.zeta.z = zetaVal;
449447
flag.update = true;
450448
}
451449
}
452450
else
453-
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_C_NAME), " zeta parameter.");
451+
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_C_NAME), " (I) zeta parameter.");
454452
}
455453

456454
// Parse Z vtol parameter
457455
if (seenQ) {
458456
if (AXIS_IS_EISHAPING(Z)) {
459457
if (goodVtol) {
460-
ftMotion.cfg.vtol.z = vtolVal;
458+
c.vtol.z = vtolVal;
461459
flag.update = true;
462460
}
463461
}
464462
else
465-
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_C_NAME), " vtol parameter.");
463+
SERIAL_ECHOLNPGM("?Wrong mode for ", C(STEPPER_C_NAME), " (Q) vtol parameter.");
466464
}
467465
}
468466

@@ -476,18 +474,18 @@ void GcodeSuite::M493() {
476474
if (seenA) {
477475
if (AXIS_IS_SHAPING(E)) {
478476
if (goodBaseFreq) {
479-
ftMotion.cfg.baseFreq.e = baseFreqVal;
477+
c.baseFreq.e = baseFreqVal;
480478
flag.update = flag.report = true;
481479
}
482480
}
483481
else // Mode doesn't use frequency.
484-
SERIAL_ECHOLNPGM("?Wrong mode for ", C('E'), " [A] frequency.");
482+
SERIAL_ECHOLNPGM("?Wrong mode for ", C('E'), " (A) frequency.");
485483
}
486484

487485
#if HAS_DYNAMIC_FREQ
488486
// Parse E frequency scaling parameter
489487
if (seenF && modeUsesDynFreq) {
490-
ftMotion.cfg.dynFreqK.e = baseDynFreqVal;
488+
c.dynFreqK.e = baseDynFreqVal;
491489
flag.report = true;
492490
}
493491
#endif
@@ -496,24 +494,24 @@ void GcodeSuite::M493() {
496494
if (seenI) {
497495
if (AXIS_IS_SHAPING(E)) {
498496
if (goodZeta) {
499-
ftMotion.cfg.zeta.e = zetaVal;
497+
c.zeta.e = zetaVal;
500498
flag.update = true;
501499
}
502500
}
503501
else
504-
SERIAL_ECHOLNPGM("?Wrong mode for ", C('E'), " zeta parameter.");
502+
SERIAL_ECHOLNPGM("?Wrong mode for ", C('E'), " (I) zeta parameter.");
505503
}
506504

507505
// Parse E vtol parameter
508506
if (seenQ) {
509507
if (AXIS_IS_EISHAPING(E)) {
510508
if (goodVtol) {
511-
ftMotion.cfg.vtol.e = vtolVal;
509+
c.vtol.e = vtolVal;
512510
flag.update = true;
513511
}
514512
}
515513
else
516-
SERIAL_ECHOLNPGM("?Wrong mode for ", C('E'), " vtol parameter.");
514+
SERIAL_ECHOLNPGM("?Wrong mode for ", C('E'), " (Q) vtol parameter.");
517515
}
518516
}
519517

0 commit comments

Comments
 (0)