26
26
27
27
#include " ../../gcode.h"
28
28
#include " ../../../module/ft_motion.h"
29
+ #include " ../../../module/stepper.h"
29
30
30
31
void say_shaping () {
31
32
// FT Enabled
@@ -39,6 +40,8 @@ void say_shaping() {
39
40
default : break ;
40
41
case ftMotionMode_ZV: SERIAL_ECHOPGM (" ZV" ); break ;
41
42
case ftMotionMode_ZVD: SERIAL_ECHOPGM (" ZVD" ); break ;
43
+ case ftMotionMode_ZVDD: SERIAL_ECHOPGM (" ZVDD" ); break ;
44
+ case ftMotionMode_ZVDDD: SERIAL_ECHOPGM (" ZVDDD" ); break ;
42
45
case ftMotionMode_EI: SERIAL_ECHOPGM (" EI" ); break ;
43
46
case ftMotionMode_2HEI: SERIAL_ECHOPGM (" 2 Hump EI" ); break ;
44
47
case ftMotionMode_3HEI: SERIAL_ECHOPGM (" 3 Hump EI" ); break ;
@@ -155,20 +158,19 @@ void GcodeSuite::M493() {
155
158
156
159
if (!parser.seen_any ())
157
160
flag.report_h = true ;
158
- else
159
- planner.synchronize ();
160
161
161
162
// Parse 'S' mode parameter.
162
163
if (parser.seenval (' S' )) {
163
- const ftMotionMode_t oldmm = ftMotion.cfg .mode ,
164
- newmm = (ftMotionMode_t)parser.value_byte ();
164
+ const ftMotionMode_t newmm = (ftMotionMode_t)parser.value_byte ();
165
165
166
- if (newmm != oldmm ) {
166
+ if (newmm != ftMotion. cfg . mode ) {
167
167
switch (newmm) {
168
168
default : SERIAL_ECHOLNPGM (" ?Invalid control mode [S] value." ); return ;
169
169
#if HAS_X_AXIS
170
170
case ftMotionMode_ZV:
171
171
case ftMotionMode_ZVD:
172
+ case ftMotionMode_ZVDD:
173
+ case ftMotionMode_ZVDDD:
172
174
case ftMotionMode_EI:
173
175
case ftMotionMode_2HEI:
174
176
case ftMotionMode_3HEI:
@@ -177,11 +179,10 @@ void GcodeSuite::M493() {
177
179
// case ftMotionMode_DISCTF:
178
180
flag.update_n = flag.update_a = true ;
179
181
#endif
180
- case ftMotionMode_DISABLED:
182
+ case ftMotionMode_DISABLED: flag. reset_ft = true ;
181
183
case ftMotionMode_ENABLED:
182
184
ftMotion.cfg .mode = newmm;
183
185
flag.report_h = true ;
184
- if (oldmm == ftMotionMode_DISABLED) flag.reset_ft = true ;
185
186
break ;
186
187
}
187
188
}
@@ -193,6 +194,7 @@ void GcodeSuite::M493() {
193
194
if (parser.seen (' P' )) {
194
195
const bool val = parser.value_bool ();
195
196
ftMotion.cfg .linearAdvEna = val;
197
+ flag.report_h = true ;
196
198
SERIAL_ECHO_TERNARY (val, " Linear Advance " , " en" , " dis" , " abled.\n " );
197
199
}
198
200
@@ -216,22 +218,16 @@ void GcodeSuite::M493() {
216
218
if (ftMotion.cfg .modeHasShaper ()) {
217
219
const dynFreqMode_t val = dynFreqMode_t (parser.value_byte ());
218
220
switch (val) {
219
- case dynFreqMode_DISABLED:
220
- ftMotion.cfg .dynFreqMode = val;
221
- flag.report_h = true ;
222
- break ;
223
221
#if HAS_DYNAMIC_FREQ_MM
224
222
case dynFreqMode_Z_BASED:
225
- ftMotion.cfg .dynFreqMode = val;
226
- flag.report_h = true ;
227
- break ;
228
223
#endif
229
224
#if HAS_DYNAMIC_FREQ_G
230
225
case dynFreqMode_MASS_BASED:
231
- ftMotion.cfg .dynFreqMode = val;
232
- flag.report_h = true ;
233
- break ;
234
226
#endif
227
+ case dynFreqMode_DISABLED:
228
+ ftMotion.cfg .dynFreqMode = val;
229
+ flag.report_h = true ;
230
+ break ;
235
231
default :
236
232
SERIAL_ECHOLNPGM (" ?Invalid Dynamic Frequency Mode [D] value." );
237
233
break ;
@@ -279,6 +275,36 @@ void GcodeSuite::M493() {
279
275
}
280
276
#endif
281
277
278
+ // Parse zeta parameter (X axis).
279
+ if (parser.seenval (' I' )) {
280
+ const float val = parser.value_float ();
281
+ if (ftMotion.cfg .modeHasShaper ()) {
282
+ if (WITHIN (val, 0 .01f , 1 .0f )) {
283
+ ftMotion.cfg .zeta [0 ] = val;
284
+ flag.update_n = flag.update_a = true ;
285
+ }
286
+ else
287
+ SERIAL_ECHOLNPGM (" Invalid X zeta [" , AS_CHAR (' I' ), " ] value." ); // Zeta out of range.
288
+ }
289
+ else
290
+ SERIAL_ECHOLNPGM (" Wrong mode for zeta parameter." );
291
+ }
292
+
293
+ // Parse vtol parameter (X axis).
294
+ if (parser.seenval (' Q' )) {
295
+ const float val = parser.value_float ();
296
+ if (ftMotion.cfg .modeHasShaper () && IS_EI_MODE (ftMotion.cfg .mode )) {
297
+ if (WITHIN (val, 0 .00f , 1 .0f )) {
298
+ ftMotion.cfg .vtol [0 ] = val;
299
+ flag.update_a = true ;
300
+ }
301
+ else
302
+ SERIAL_ECHOLNPGM (" Invalid X vtol [" , AS_CHAR (' Q' ), " ] value." ); // VTol out of range.
303
+ }
304
+ else
305
+ SERIAL_ECHOLNPGM (" Wrong mode for vtol parameter." );
306
+ }
307
+
282
308
#endif // HAS_X_AXIS
283
309
284
310
#if HAS_Y_AXIS
@@ -310,15 +336,50 @@ void GcodeSuite::M493() {
310
336
}
311
337
#endif
312
338
339
+ // Parse zeta parameter (Y axis).
340
+ if (parser.seenval (' J' )) {
341
+ const float val = parser.value_float ();
342
+ if (ftMotion.cfg .modeHasShaper ()) {
343
+ if (WITHIN (val, 0 .01f , 1 .0f )) {
344
+ ftMotion.cfg .zeta [1 ] = val;
345
+ flag.update_n = flag.update_a = true ;
346
+ }
347
+ else
348
+ SERIAL_ECHOLNPGM (" Invalid Y zeta [" , AS_CHAR (' J' ), " ] value." ); // Zeta Out of range
349
+ }
350
+ else
351
+ SERIAL_ECHOLNPGM (" Wrong mode for zeta parameter." );
352
+ }
353
+
354
+ // Parse vtol parameter (Y axis).
355
+ if (parser.seenval (' R' )) {
356
+ const float val = parser.value_float ();
357
+ if (ftMotion.cfg .modeHasShaper () && IS_EI_MODE (ftMotion.cfg .mode )) {
358
+ if (WITHIN (val, 0 .00f , 1 .0f )) {
359
+ ftMotion.cfg .vtol [1 ] = val;
360
+ flag.update_a = true ;
361
+ }
362
+ else
363
+ SERIAL_ECHOLNPGM (" Invalid Y vtol [" , AS_CHAR (' R' ), " ] value." ); // VTol out of range.
364
+ }
365
+ else
366
+ SERIAL_ECHOLNPGM (" Wrong mode for vtol parameter." );
367
+ }
368
+
313
369
#endif // HAS_Y_AXIS
314
370
315
- #if HAS_X_AXIS
316
- if (flag.update_n ) ftMotion.refreshShapingN ();
317
- if (flag.update_a ) ftMotion.updateShapingA ();
318
- #endif
319
- if (flag.reset_ft ) ftMotion.reset ();
320
- if (flag.report_h ) say_shaping ();
371
+ planner.synchronize ();
321
372
373
+ if (flag.update_n ) ftMotion.refreshShapingN ();
374
+
375
+ if (flag.update_a ) ftMotion.updateShapingA ();
376
+
377
+ if (flag.reset_ft ) {
378
+ stepper.ftMotion_syncPosition ();
379
+ ftMotion.reset ();
380
+ }
381
+
382
+ if (flag.report_h ) say_shaping ();
322
383
}
323
384
324
385
#endif // FT_MOTION
0 commit comments