Преглед изворни кода

Merge pull request #11001 from thinkyhead/bf2_junction_deviation_fix

[2.0.x] Updates for junction_deviation_mm
Scott Lahteine пре 7 година
родитељ
комит
12689f2470
No account linked to committer's email address

+ 1
- 1
Marlin/src/Marlin.cpp Прегледај датотеку

@@ -161,7 +161,7 @@ bool Running = true;
161 161
  *   Flags that the position is known in each linear axis. Set when homed.
162 162
  *   Cleared whenever a stepper powers off, potentially losing its position.
163 163
  */
164
-bool axis_homed[XYZ] = { false }, axis_known_position[XYZ] = { false };
164
+uint8_t axis_homed, axis_known_position; // = 0
165 165
 
166 166
 #if ENABLED(TEMPERATURE_UNITS_SUPPORT)
167 167
   TempUnit input_temp_units = TEMPUNIT_C;

+ 12
- 8
Marlin/src/Marlin.h Прегледај датотеку

@@ -44,10 +44,10 @@ void manage_inactivity(const bool ignore_stepper_queue=false);
44 44
 
45 45
 #if HAS_X2_ENABLE
46 46
   #define  enable_X() do{ X_ENABLE_WRITE( X_ENABLE_ON); X2_ENABLE_WRITE( X_ENABLE_ON); }while(0)
47
-  #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }while(0)
47
+  #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); CBI(axis_known_position, X_AXIS); }while(0)
48 48
 #elif HAS_X_ENABLE
49 49
   #define  enable_X() X_ENABLE_WRITE( X_ENABLE_ON)
50
-  #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }while(0)
50
+  #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); CBI(axis_known_position, X_AXIS); }while(0)
51 51
 #else
52 52
   #define  enable_X() NOOP
53 53
   #define disable_X() NOOP
@@ -55,10 +55,10 @@ void manage_inactivity(const bool ignore_stepper_queue=false);
55 55
 
56 56
 #if HAS_Y2_ENABLE
57 57
   #define  enable_Y() do{ Y_ENABLE_WRITE( Y_ENABLE_ON); Y2_ENABLE_WRITE(Y_ENABLE_ON); }while(0)
58
-  #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }while(0)
58
+  #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); CBI(axis_known_position, Y_AXIS); }while(0)
59 59
 #elif HAS_Y_ENABLE
60 60
   #define  enable_Y() Y_ENABLE_WRITE( Y_ENABLE_ON)
61
-  #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }while(0)
61
+  #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); CBI(axis_known_position, Y_AXIS); }while(0)
62 62
 #else
63 63
   #define  enable_Y() NOOP
64 64
   #define disable_Y() NOOP
@@ -66,10 +66,10 @@ void manage_inactivity(const bool ignore_stepper_queue=false);
66 66
 
67 67
 #if HAS_Z2_ENABLE
68 68
   #define  enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }while(0)
69
-  #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }while(0)
69
+  #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0)
70 70
 #elif HAS_Z_ENABLE
71 71
   #define  enable_Z() Z_ENABLE_WRITE( Z_ENABLE_ON)
72
-  #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }while(0)
72
+  #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0)
73 73
 #else
74 74
   #define  enable_Z() NOOP
75 75
   #define disable_Z() NOOP
@@ -169,8 +169,12 @@ extern bool Running;
169 169
 inline bool IsRunning() { return  Running; }
170 170
 inline bool IsStopped() { return !Running; }
171 171
 
172
-extern bool axis_known_position[XYZ];
173
-extern bool axis_homed[XYZ];
172
+extern uint8_t axis_homed, axis_known_position;
173
+
174
+constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS);
175
+FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; }
176
+FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; }
177
+
174 178
 extern volatile bool wait_for_heatup;
175 179
 
176 180
 #if HAS_RESUME_CONTINUE

+ 3
- 3
Marlin/src/gcode/calibrate/G28.cpp Прегледај датотеку

@@ -88,7 +88,7 @@
88 88
   inline void home_z_safely() {
89 89
 
90 90
     // Disallow Z homing if X or Y are unknown
91
-    if (!axis_known_position[X_AXIS] || !axis_known_position[Y_AXIS]) {
91
+    if (!TEST(axis_known_position, X_AXIS) || !TEST(axis_known_position, Y_AXIS)) {
92 92
       LCD_MESSAGEPGM(MSG_ERR_Z_HOMING);
93 93
       SERIAL_ECHO_START();
94 94
       SERIAL_ECHOLNPGM(MSG_ERR_Z_HOMING);
@@ -172,7 +172,7 @@ void GcodeSuite::G28(const bool always_home_all) {
172 172
     }
173 173
   #endif
174 174
 
175
-  if ((axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS]) && parser.boolval('O')) { // home only if needed
175
+  if (all_axes_known() && parser.boolval('O')) { // home only if needed
176 176
     #if ENABLED(DEBUG_LEVELING_FEATURE)
177 177
       if (DEBUGGING(LEVELING)) {
178 178
         SERIAL_ECHOLNPGM("> homing not needed, skip");
@@ -246,7 +246,7 @@ void GcodeSuite::G28(const bool always_home_all) {
246 246
 
247 247
     const float z_homing_height = (
248 248
       #if ENABLED(UNKNOWN_Z_NO_RAISE)
249
-        !axis_known_position[Z_AXIS] ? 0 :
249
+        !TEST(axis_known_position, Z_AXIS) ? 0 :
250 250
       #endif
251 251
           (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT)
252 252
     );

+ 3
- 3
Marlin/src/gcode/config/M200-M205.cpp Прегледај датотеку

@@ -134,8 +134,10 @@ void GcodeSuite::M205() {
134 134
   #if ENABLED(JUNCTION_DEVIATION)
135 135
     if (parser.seen('J')) {
136 136
       const float junc_dev = parser.value_linear_units();
137
-      if (WITHIN(junc_dev, 0.01, 0.3))
137
+      if (WITHIN(junc_dev, 0.01, 0.3)) {
138 138
         planner.junction_deviation_mm = junc_dev;
139
+        planner.recalculate_max_e_jerk_factor();
140
+      }
139 141
       else {
140 142
         SERIAL_ERROR_START();
141 143
         SERIAL_ERRORLNPGM("?J out of range (0.01 to 0.3)");
@@ -151,8 +153,6 @@ void GcodeSuite::M205() {
151 153
           SERIAL_ECHOLNPGM("WARNING! Low Z Jerk may lead to unwanted pauses.");
152 154
       #endif
153 155
     }
154
-  #endif
155
-  #if DISABLED(JUNCTION_DEVIATION) || ENABLED(LIN_ADVANCE)
156 156
     if (parser.seen('E')) planner.max_jerk[E_AXIS] = parser.value_linear_units();
157 157
   #endif
158 158
 }

+ 3
- 1
Marlin/src/gcode/config/M92.cpp Прегледај датотеку

@@ -39,7 +39,9 @@ void GcodeSuite::M92() {
39 39
         const float value = parser.value_per_axis_unit((AxisEnum)(E_AXIS + TARGET_EXTRUDER));
40 40
         if (value < 20.0) {
41 41
           float factor = planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] / value; // increase e constants if M92 E14 is given for netfab.
42
-          planner.max_jerk[E_AXIS] *= factor;
42
+          #if DISABLED(JUNCTION_DEVIATION)
43
+            planner.max_jerk[E_AXIS] *= factor;
44
+          #endif
43 45
           planner.max_feedrate_mm_s[E_AXIS + TARGET_EXTRUDER] *= factor;
44 46
           planner.max_acceleration_steps_per_s2[E_AXIS + TARGET_EXTRUDER] *= factor;
45 47
         }

+ 1
- 1
Marlin/src/gcode/feature/trinamic/M911-M915.cpp Прегледај датотеку

@@ -332,7 +332,7 @@ void GcodeSuite::M912() {
332 332
     const uint16_t _rms = parser.seenval('S') ? parser.value_int() : CALIBRATION_CURRENT,
333 333
                    _z = parser.seenval('Z') ? parser.value_linear_units() : CALIBRATION_EXTRA_HEIGHT;
334 334
 
335
-    if (!axis_known_position[Z_AXIS]) {
335
+    if (!TEST(axis_known_position, Z_AXIS)) {
336 336
       SERIAL_ECHOLNPGM("\nPlease home Z axis first");
337 337
       return;
338 338
     }

+ 2
- 2
Marlin/src/lcd/dogm/status_screen_DOGM.h Прегледај датотеку

@@ -108,11 +108,11 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
108 108
   if (blink)
109 109
     lcd_put_u8str(value);
110 110
   else {
111
-    if (!axis_homed[axis])
111
+    if (!TEST(axis_homed, axis))
112 112
       while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?');
113 113
     else {
114 114
       #if DISABLED(HOME_AFTER_DEACTIVATE) && DISABLED(DISABLE_REDUCED_ACCURACY_WARNING)
115
-        if (!axis_known_position[axis])
115
+        if (!TEST(axis_known_position, axis))
116 116
           lcd_put_u8str_P(axis == Z_AXIS ? PSTR("      ") : PSTR("    "));
117 117
         else
118 118
       #endif

+ 1
- 3
Marlin/src/lcd/dogm/status_screen_lite_ST7920.h Прегледај датотеку

@@ -868,9 +868,7 @@ void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) {
868 868
         #if ENABLED(DISABLE_REDUCED_ACCURACY_WARNING)
869 869
           true
870 870
         #else
871
-          axis_known_position[X_AXIS] &&
872
-          axis_known_position[Y_AXIS] &&
873
-          axis_known_position[Z_AXIS]
871
+          all_axes_known()
874 872
         #endif
875 873
       );
876 874
     }

+ 16
- 18
Marlin/src/lcd/ultralcd.cpp Прегледај датотеку

@@ -2026,8 +2026,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
2026 2026
     void _lcd_level_bed_homing() {
2027 2027
       if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_HOMING), NULL);
2028 2028
       lcdDrawUpdate = LCDVIEW_CALL_NO_REDRAW;
2029
-      if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS])
2030
-        lcd_goto_screen(_lcd_level_bed_homing_done);
2029
+      if (all_axes_homed()) lcd_goto_screen(_lcd_level_bed_homing_done);
2031 2030
     }
2032 2031
 
2033 2032
     #if ENABLED(PROBE_MANUALLY)
@@ -2039,7 +2038,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
2039 2038
      */
2040 2039
     void _lcd_level_bed_continue() {
2041 2040
       defer_return_to_status = true;
2042
-      axis_homed[X_AXIS] = axis_homed[Y_AXIS] = axis_homed[Z_AXIS] = false;
2041
+      axis_homed = 0;
2043 2042
       lcd_goto_screen(_lcd_level_bed_homing);
2044 2043
       enqueue_and_echo_commands_P(PSTR("G28"));
2045 2044
     }
@@ -2369,7 +2368,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
2369 2368
       defer_return_to_status = true;
2370 2369
       if (lcdDrawUpdate) lcd_implementation_drawmenu_static(LCD_HEIGHT < 3 ? 0 : (LCD_HEIGHT > 4 ? 2 : 1), PSTR(MSG_LEVEL_BED_HOMING));
2371 2370
       lcdDrawUpdate = LCDVIEW_CALL_NO_REDRAW;
2372
-      if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) {
2371
+      if (all_axes_homed()) {
2373 2372
         ubl.lcd_map_control = true; // Return to the map screen
2374 2373
         lcd_goto_screen(_lcd_ubl_output_map_lcd);
2375 2374
       }
@@ -2414,7 +2413,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
2414 2413
     void _lcd_ubl_output_map_lcd() {
2415 2414
       static int16_t step_scaler = 0;
2416 2415
 
2417
-      if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS]))
2416
+      if (!all_axes_known())
2418 2417
         return lcd_goto_screen(_lcd_ubl_map_homing);
2419 2418
 
2420 2419
       if (use_click()) return _lcd_ubl_map_lcd_edit_cmd();
@@ -2463,8 +2462,8 @@ void lcd_quick_feedback(const bool clear_buttons) {
2463 2462
      * UBL Homing before LCD map
2464 2463
      */
2465 2464
     void _lcd_ubl_output_map_lcd_cmd() {
2466
-      if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])) {
2467
-        axis_homed[X_AXIS] = axis_homed[Y_AXIS] = axis_homed[Z_AXIS] = false;
2465
+      if (!all_axes_known()) {
2466
+        axis_homed = 0;
2468 2467
         enqueue_and_echo_commands_P(PSTR("G28"));
2469 2468
       }
2470 2469
       lcd_goto_screen(_lcd_ubl_map_homing);
@@ -2592,7 +2591,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
2592 2591
       START_MENU();
2593 2592
       MENU_BACK(MSG_PREPARE);
2594 2593
 
2595
-      const bool is_homed = axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS];
2594
+      const bool is_homed = all_axes_known();
2596 2595
 
2597 2596
       // Auto Home if not using manual probing
2598 2597
       #if DISABLED(PROBE_MANUALLY) && DISABLED(MESH_BED_LEVELING)
@@ -2634,8 +2633,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
2634 2633
 
2635 2634
       #if ENABLED(LEVEL_BED_CORNERS)
2636 2635
         // Move to the next corner for leveling
2637
-        if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS])
2638
-          MENU_ITEM(submenu, MSG_LEVEL_CORNERS, _lcd_level_bed_corners);
2636
+        if (all_axes_homed()) MENU_ITEM(submenu, MSG_LEVEL_CORNERS, _lcd_level_bed_corners);
2639 2637
       #endif
2640 2638
 
2641 2639
       #if ENABLED(EEPROM_SETTINGS)
@@ -2665,7 +2663,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
2665 2663
     // Move Axis
2666 2664
     //
2667 2665
     #if ENABLED(DELTA)
2668
-      if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS])
2666
+      if (all_axes_homed())
2669 2667
     #endif
2670 2668
         MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu);
2671 2669
 
@@ -2709,7 +2707,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
2709 2707
     #endif
2710 2708
 
2711 2709
     #if ENABLED(LEVEL_BED_CORNERS) && DISABLED(LCD_BED_LEVELING)
2712
-      if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS])
2710
+      if (all_axes_homed())
2713 2711
         MENU_ITEM(function, MSG_LEVEL_CORNERS, _lcd_level_bed_corners);
2714 2712
     #endif
2715 2713
 
@@ -2839,7 +2837,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
2839 2837
     void _lcd_calibrate_homing() {
2840 2838
       if (lcdDrawUpdate) lcd_implementation_drawmenu_static(LCD_HEIGHT >= 4 ? 1 : 0, PSTR(MSG_LEVEL_BED_HOMING));
2841 2839
       lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT;
2842
-      if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS])
2840
+      if (all_axes_homed())
2843 2841
         lcd_goto_previous_menu();
2844 2842
     }
2845 2843
 
@@ -2894,7 +2892,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
2894 2892
       MENU_ITEM(submenu, MSG_DELTA_SETTINGS, lcd_delta_settings);
2895 2893
       #if ENABLED(DELTA_CALIBRATION_MENU)
2896 2894
         MENU_ITEM(submenu, MSG_AUTO_HOME, _lcd_delta_calibrate_home);
2897
-        if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) {
2895
+        if (all_axes_homed()) {
2898 2896
           MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_X, _goto_tower_x);
2899 2897
           MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_Y, _goto_tower_y);
2900 2898
           MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_Z, _goto_tower_z);
@@ -3190,7 +3188,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
3190 3188
    */
3191 3189
 
3192 3190
   #if IS_KINEMATIC || ENABLED(NO_MOTION_BEFORE_HOMING)
3193
-    #define _MOVE_XYZ_ALLOWED (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS])
3191
+    #define _MOVE_XYZ_ALLOWED (all_axes_homed())
3194 3192
   #else
3195 3193
     #define _MOVE_XYZ_ALLOWED true
3196 3194
   #endif
@@ -3754,7 +3752,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
3754 3752
       MENU_BACK(MSG_MOTION);
3755 3753
 
3756 3754
       #if ENABLED(JUNCTION_DEVIATION)
3757
-        MENU_ITEM_EDIT(float3, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01, 0.3);
3755
+        MENU_ITEM_EDIT_CALLBACK(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01, 0.3, planner.recalculate_max_e_jerk_factor);
3758 3756
       #else
3759 3757
         MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VA_JERK, &planner.max_jerk[A_AXIS], 1, 990);
3760 3758
         MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VB_JERK, &planner.max_jerk[B_AXIS], 1, 990);
@@ -3763,8 +3761,8 @@ void lcd_quick_feedback(const bool clear_buttons) {
3763 3761
         #else
3764 3762
           MENU_MULTIPLIER_ITEM_EDIT(float52sign, MSG_VC_JERK, &planner.max_jerk[C_AXIS], 0.1, 990);
3765 3763
         #endif
3764
+        MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VE_JERK, &planner.max_jerk[E_AXIS], 1, 990);
3766 3765
       #endif
3767
-      MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VE_JERK, &planner.max_jerk[E_AXIS], 1, 990);
3768 3766
 
3769 3767
       END_MENU();
3770 3768
     }
@@ -4930,7 +4928,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
4930 4928
           if (REPRAPWORLD_KEYPAD_MOVE_Z_UP)     reprapworld_keypad_move_z_up();
4931 4929
         #endif
4932 4930
 
4933
-        if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) {
4931
+        if (all_axes_homed()) {
4934 4932
           #if ENABLED(DELTA) || Z_HOME_DIR != -1
4935 4933
             if (REPRAPWORLD_KEYPAD_MOVE_Z_UP)   reprapworld_keypad_move_z_up();
4936 4934
           #endif

+ 2
- 2
Marlin/src/lcd/ultralcd_impl_HD44780.h Прегледај датотеку

@@ -493,11 +493,11 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
493 493
   if (blink)
494 494
     lcd_put_u8str(value);
495 495
   else {
496
-    if (!axis_homed[axis])
496
+    if (!TEST(axis_homed, axis))
497 497
       while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?');
498 498
     else {
499 499
       #if DISABLED(HOME_AFTER_DEACTIVATE) && DISABLED(DISABLE_REDUCED_ACCURACY_WARNING)
500
-        if (!axis_known_position[axis])
500
+        if (!TEST(axis_known_position, axis))
501 501
           lcd_put_u8str_P(axis == Z_AXIS ? PSTR("      ") : PSTR("    "));
502 502
         else
503 503
       #endif

+ 14
- 8
Marlin/src/module/configuration_store.cpp Прегледај датотеку

@@ -330,6 +330,10 @@ void MarlinSettings::postprocess() {
330 330
     fwretract.refresh_autoretract();
331 331
   #endif
332 332
 
333
+  #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE)
334
+    planner.recalculate_max_e_jerk_factor();
335
+  #endif
336
+
333 337
   // Refresh steps_to_mm with the reciprocal of axis_steps_per_mm
334 338
   // and init stepper.count[], planner.position[] with current_position
335 339
   planner.refresh_positioning();
@@ -411,11 +415,13 @@ void MarlinSettings::postprocess() {
411 415
     EEPROM_WRITE(planner.travel_acceleration);
412 416
     EEPROM_WRITE(planner.min_feedrate_mm_s);
413 417
     EEPROM_WRITE(planner.min_travel_feedrate_mm_s);
414
-    EEPROM_WRITE(planner.max_jerk);
415 418
 
416 419
     #if ENABLED(JUNCTION_DEVIATION)
420
+      const float planner_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK };
421
+      EEPROM_WRITE(planner_max_jerk);
417 422
       EEPROM_WRITE(planner.junction_deviation_mm);
418 423
     #else
424
+      EEPROM_WRITE(planner.max_jerk);
419 425
       dummy = 0.02;
420 426
       EEPROM_WRITE(dummy);
421 427
     #endif
@@ -1008,11 +1014,12 @@ void MarlinSettings::postprocess() {
1008 1014
       EEPROM_READ(planner.travel_acceleration);
1009 1015
       EEPROM_READ(planner.min_feedrate_mm_s);
1010 1016
       EEPROM_READ(planner.min_travel_feedrate_mm_s);
1011
-      EEPROM_READ(planner.max_jerk);
1012 1017
 
1013 1018
       #if ENABLED(JUNCTION_DEVIATION)
1019
+        for (uint8_t q = 4; q--;) EEPROM_READ(dummy);
1014 1020
         EEPROM_READ(planner.junction_deviation_mm);
1015 1021
       #else
1022
+        EEPROM_READ(planner.max_jerk);
1016 1023
         EEPROM_READ(dummy);
1017 1024
       #endif
1018 1025
 
@@ -1724,13 +1731,14 @@ void MarlinSettings::reset(PORTARG_SOLO) {
1724 1731
   planner.travel_acceleration = DEFAULT_TRAVEL_ACCELERATION;
1725 1732
   planner.min_feedrate_mm_s = DEFAULT_MINIMUMFEEDRATE;
1726 1733
   planner.min_travel_feedrate_mm_s = DEFAULT_MINTRAVELFEEDRATE;
1727
-  planner.max_jerk[X_AXIS] = DEFAULT_XJERK;
1728
-  planner.max_jerk[Y_AXIS] = DEFAULT_YJERK;
1729
-  planner.max_jerk[Z_AXIS] = DEFAULT_ZJERK;
1730
-  planner.max_jerk[E_AXIS] = DEFAULT_EJERK;
1731 1734
 
1732 1735
   #if ENABLED(JUNCTION_DEVIATION)
1733 1736
     planner.junction_deviation_mm = JUNCTION_DEVIATION_MM;
1737
+  #else
1738
+    planner.max_jerk[X_AXIS] = DEFAULT_XJERK;
1739
+    planner.max_jerk[Y_AXIS] = DEFAULT_YJERK;
1740
+    planner.max_jerk[Z_AXIS] = DEFAULT_ZJERK;
1741
+    planner.max_jerk[E_AXIS] = DEFAULT_EJERK;
1734 1742
   #endif
1735 1743
 
1736 1744
   #if HAS_HOME_OFFSET
@@ -2135,8 +2143,6 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2135 2143
       SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(planner.max_jerk[X_AXIS]));
2136 2144
       SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_jerk[Y_AXIS]));
2137 2145
       SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_jerk[Z_AXIS]));
2138
-    #endif
2139
-    #if DISABLED(JUNCTION_DEVIATION) || ENABLED(LIN_ADVANCE)
2140 2146
       SERIAL_ECHOPAIR_P(port, " E", LINEAR_UNIT(planner.max_jerk[E_AXIS]));
2141 2147
     #endif
2142 2148
 

+ 1
- 1
Marlin/src/module/delta.cpp Прегледај датотеку

@@ -73,7 +73,7 @@ void recalc_delta_settings() {
73 73
   delta_diagonal_rod_2_tower[B_AXIS] = sq(delta_diagonal_rod + drt[B_AXIS]);
74 74
   delta_diagonal_rod_2_tower[C_AXIS] = sq(delta_diagonal_rod + drt[C_AXIS]);
75 75
   update_software_endstops(Z_AXIS);
76
-  axis_homed[X_AXIS] = axis_homed[Y_AXIS] = axis_homed[Z_AXIS] = false;
76
+  axis_homed = 0;
77 77
 }
78 78
 
79 79
 /**

+ 8
- 7
Marlin/src/module/motion.cpp Прегледај датотеку

@@ -957,13 +957,13 @@ void prepare_move_to_destination() {
957 957
 
958 958
   bool axis_unhomed_error(const bool x/*=true*/, const bool y/*=true*/, const bool z/*=true*/) {
959 959
     #if ENABLED(HOME_AFTER_DEACTIVATE)
960
-      const bool xx = x && !axis_known_position[X_AXIS],
961
-                 yy = y && !axis_known_position[Y_AXIS],
962
-                 zz = z && !axis_known_position[Z_AXIS];
960
+      const bool xx = x && !TEST(axis_known_position, X_AXIS),
961
+                 yy = y && !TEST(axis_known_position, Y_AXIS),
962
+                 zz = z && !TEST(axis_known_position, Z_AXIS);
963 963
     #else
964
-      const bool xx = x && !axis_homed[X_AXIS],
965
-                 yy = y && !axis_homed[Y_AXIS],
966
-                 zz = z && !axis_homed[Z_AXIS];
964
+      const bool xx = x && !TEST(axis_homed, X_AXIS),
965
+                 yy = y && !TEST(axis_homed, Y_AXIS),
966
+                 zz = z && !TEST(axis_homed, Z_AXIS);
967 967
     #endif
968 968
     if (xx || yy || zz) {
969 969
       SERIAL_ECHO_START();
@@ -1173,7 +1173,8 @@ void set_axis_is_at_home(const AxisEnum axis) {
1173 1173
     }
1174 1174
   #endif
1175 1175
 
1176
-  axis_known_position[axis] = axis_homed[axis] = true;
1176
+  SBI(axis_known_position, axis);
1177
+  SBI(axis_homed, axis);
1177 1178
 
1178 1179
   #if HAS_POSITION_SHIFT
1179 1180
     position_shift[axis] = 0;

+ 17
- 7
Marlin/src/module/planner.cpp Прегледај датотеку

@@ -121,11 +121,15 @@ float Planner::max_feedrate_mm_s[XYZE_N],     // (mm/s) M203 XYZE - Max speeds
121 121
       Planner::acceleration,                  // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves.
122 122
       Planner::retract_acceleration,          // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes
123 123
       Planner::travel_acceleration,           // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves.
124
-      Planner::max_jerk[XYZE],                // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration.
125 124
       Planner::min_travel_feedrate_mm_s;      // (mm/s) M205 T - Minimum travel feedrate
126 125
 
127 126
 #if ENABLED(JUNCTION_DEVIATION)
128 127
   float Planner::junction_deviation_mm;       // (mm) M205 J
128
+  #if ENABLED(LIN_ADVANCE)
129
+    float Planner::max_e_jerk_factor;         // Calculated from junction_deviation_mm
130
+  #endif
131
+#else
132
+  float Planner::max_jerk[XYZE];              // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration.
129 133
 #endif
130 134
 
131 135
 #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)
@@ -134,6 +138,9 @@ float Planner::max_feedrate_mm_s[XYZE_N],     // (mm/s) M203 XYZE - Max speeds
134 138
 
135 139
 #if ENABLED(DISTINCT_E_FACTORS)
136 140
   uint8_t Planner::last_extruder = 0;     // Respond to extruder change
141
+  #define _EINDEX (E_AXIS + active_extruder)
142
+#else
143
+  #define _EINDEX E_AXIS
137 144
 #endif
138 145
 
139 146
 int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder
@@ -2021,6 +2028,13 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
2021 2028
     accel = CEIL((esteps ? acceleration : travel_acceleration) * steps_per_mm);
2022 2029
 
2023 2030
     #if ENABLED(LIN_ADVANCE)
2031
+
2032
+      #if ENABLED(JUNCTION_DEVIATION)
2033
+        #define MAX_E_JERK (max_e_jerk_factor * max_acceleration_mm_per_s2[_EINDEX])
2034
+      #else
2035
+        #define MAX_E_JERK max_jerk[E_AXIS]
2036
+      #endif
2037
+
2024 2038
       /**
2025 2039
        *
2026 2040
        * Use LIN_ADVANCE for blocks if all these are true:
@@ -2051,10 +2065,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
2051 2065
         if (block->e_D_ratio > 3.0)
2052 2066
           block->use_advance_lead = false;
2053 2067
         else {
2054
-          const uint32_t max_accel_steps_per_s2 = max_jerk[E_AXIS] / (extruder_advance_K * block->e_D_ratio) * steps_per_mm;
2068
+          const uint32_t max_accel_steps_per_s2 = MAX_E_JERK / (extruder_advance_K * block->e_D_ratio) * steps_per_mm;
2055 2069
           #if ENABLED(LA_DEBUG)
2056
-            if (accel > max_accel_steps_per_s2)
2057
-              SERIAL_ECHOLNPGM("Acceleration limited.");
2070
+            if (accel > max_accel_steps_per_s2) SERIAL_ECHOLNPGM("Acceleration limited.");
2058 2071
           #endif
2059 2072
           NOMORE(accel, max_accel_steps_per_s2);
2060 2073
         }
@@ -2459,10 +2472,7 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con
2459 2472
 
2460 2473
 void Planner::_set_position_mm(const float &a, const float &b, const float &c, const float &e) {
2461 2474
   #if ENABLED(DISTINCT_E_FACTORS)
2462
-    #define _EINDEX (E_AXIS + active_extruder)
2463 2475
     last_extruder = active_extruder;
2464
-  #else
2465
-    #define _EINDEX E_AXIS
2466 2476
   #endif
2467 2477
   position[A_AXIS] = LROUND(a * axis_steps_per_mm[A_AXIS]),
2468 2478
   position[B_AXIS] = LROUND(b * axis_steps_per_mm[B_AXIS]),

+ 25
- 13
Marlin/src/module/planner.h Прегледај датотеку

@@ -195,21 +195,25 @@ class Planner {
195 195
                                                       // May be auto-adjusted by a filament width sensor
196 196
     #endif
197 197
 
198
-    static uint32_t max_acceleration_steps_per_s2[XYZE_N],
199
-                    max_acceleration_mm_per_s2[XYZE_N], // Use M201 to override
200
-                    min_segment_time_us; // Use 'M205 B<µs>' to override
201
-    static float max_feedrate_mm_s[XYZE_N],         // Max speeds in mm per second
202
-                 axis_steps_per_mm[XYZE_N],
203
-                 steps_to_mm[XYZE_N],
204
-                 min_feedrate_mm_s,
205
-                 acceleration,         // Normal acceleration mm/s^2  DEFAULT ACCELERATION for all printing moves. M204 SXXXX
206
-                 retract_acceleration, // Retract acceleration mm/s^2 filament pull-back and push-forward while standing still in the other axes M204 TXXXX
207
-                 travel_acceleration,  // Travel acceleration mm/s^2  DEFAULT ACCELERATION for all NON printing moves. M204 MXXXX
208
-                 max_jerk[XYZE],       // The largest speed change requiring no acceleration
209
-                 min_travel_feedrate_mm_s;
198
+    static uint32_t max_acceleration_mm_per_s2[XYZE_N],    // (mm/s^2) M201 XYZE
199
+                    max_acceleration_steps_per_s2[XYZE_N], // (steps/s^2) Derived from mm_per_s2
200
+                    min_segment_time_us;                   // (µs) M205 B
201
+    static float max_feedrate_mm_s[XYZE_N],     // (mm/s) M203 XYZE - Max speeds
202
+                 axis_steps_per_mm[XYZE_N],     // (steps) M92 XYZE - Steps per millimeter
203
+                 steps_to_mm[XYZE_N],           // (mm) Millimeters per step
204
+                 min_feedrate_mm_s,             // (mm/s) M205 S - Minimum linear feedrate
205
+                 acceleration,                  // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves.
206
+                 retract_acceleration,          // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes
207
+                 travel_acceleration,           // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves.
208
+                 min_travel_feedrate_mm_s;      // (mm/s) M205 T - Minimum travel feedrate
210 209
 
211 210
     #if ENABLED(JUNCTION_DEVIATION)
212
-      static float junction_deviation_mm; // Initialized by EEPROM
211
+      static float junction_deviation_mm;       // (mm) M205 J
212
+      #if ENABLED(LIN_ADVANCE)
213
+        static float max_e_jerk_factor;         // Calculated from junction_deviation_mm
214
+      #endif
215
+    #else
216
+      static float max_jerk[XYZE];              // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration.
213 217
     #endif
214 218
 
215 219
     #if HAS_LEVELING
@@ -745,6 +749,14 @@ class Planner {
745 749
       static void autotemp_M104_M109();
746 750
     #endif
747 751
 
752
+    #if ENABLED(JUNCTION_DEVIATION)
753
+      FORCE_INLINE static void recalculate_max_e_jerk_factor() {
754
+        #if ENABLED(LIN_ADVANCE)
755
+          max_e_jerk_factor = SQRT(SQRT(0.5) * junction_deviation_mm) * RECIPROCAL(1.0 - SQRT(0.5));
756
+        #endif
757
+      }
758
+    #endif
759
+
748 760
   private:
749 761
 
750 762
     /**

+ 2
- 2
Marlin/src/module/probe.cpp Прегледај датотеку

@@ -386,7 +386,7 @@ bool set_probe_deployed(const bool deploy) {
386 386
 
387 387
   // For beds that fall when Z is powered off only raise for trusted Z
388 388
   #if ENABLED(UNKNOWN_Z_NO_RAISE)
389
-    const bool unknown_condition = axis_known_position[Z_AXIS];
389
+    const bool unknown_condition = TEST(axis_known_position, Z_AXIS);
390 390
   #else
391 391
     constexpr float unknown_condition = true;
392 392
   #endif
@@ -562,7 +562,7 @@ static float run_z_probe() {
562 562
 
563 563
   // Stop the probe before it goes too low to prevent damage.
564 564
   // If Z isn't known then probe to -10mm.
565
-  const float z_probe_low_point = axis_known_position[Z_AXIS] ? -zprobe_zoffset + Z_PROBE_LOW_POINT : -10.0;
565
+  const float z_probe_low_point = TEST(axis_known_position, Z_AXIS) ? -zprobe_zoffset + Z_PROBE_LOW_POINT : -10.0;
566 566
 
567 567
   // Double-probing does a fast probe followed by a slow probe
568 568
   #if MULTIPLE_PROBING == 2

+ 2
- 2
Marlin/src/module/temperature.h Прегледај датотеку

@@ -31,7 +31,7 @@
31 31
 #include "../inc/MarlinConfig.h"
32 32
 
33 33
 #if ENABLED(BABYSTEPPING)
34
-  extern bool axis_known_position[XYZ];
34
+  extern uint8_t axis_known_position;
35 35
 #endif
36 36
 
37 37
 #if ENABLED(AUTO_POWER_CONTROL)
@@ -504,7 +504,7 @@ class Temperature {
504 504
     #if ENABLED(BABYSTEPPING)
505 505
 
506 506
       static void babystep_axis(const AxisEnum axis, const int16_t distance) {
507
-        if (axis_known_position[axis]) {
507
+        if (TEST(axis_known_position, axis)) {
508 508
           #if IS_CORE
509 509
             #if ENABLED(BABYSTEP_XY)
510 510
               switch (axis) {

+ 1
- 1
Marlin/src/module/tool_change.cpp Прегледај датотеку

@@ -80,7 +80,7 @@
80 80
     }
81 81
   }
82 82
 
83
-#endif // SWITCHING_EXTRUDER
83
+#endif // DO_SWITCH_EXTRUDER
84 84
 
85 85
 #if ENABLED(SWITCHING_NOZZLE)
86 86
 

Loading…
Откажи
Сачувај