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

Follow up fixes to various PRs. (#13334)

- Ensure `MarlinUI:get_progress` is defined for `ExtUI`.
- Fix for `BACKLASH_SMOOTHING` with small segments.
  `BACKLASH_SMOOTHING` with extremely small segments failed to fully correct due to the correction factor being rounded down. Rounding up ensures the entire backlash will converge to zero even for small segments.
- Add pinout for the beta revision `EINSY_RETRO`.
- Update soft endstops with tool offsets (for toolchange et. al. move clamping) (#12568)
Marcio Teixeira пре 6 година
родитељ
комит
00fc43144a

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

143
 }
143
 }
144
 
144
 
145
 #if HOTENDS > 1
145
 #if HOTENDS > 1
146
-
147
   inline void set_nozzle(measurements_t &m, const uint8_t extruder) {
146
   inline void set_nozzle(measurements_t &m, const uint8_t extruder) {
148
     if (extruder != active_extruder) {
147
     if (extruder != active_extruder) {
149
       park_above_object(m, CALIBRATION_MEASUREMENT_UNKNOWN);
148
       park_above_object(m, CALIBRATION_MEASUREMENT_UNKNOWN);
150
       tool_change(extruder);
149
       tool_change(extruder);
151
     }
150
     }
152
   }
151
   }
152
+#endif
153
 
153
 
154
-  inline void reset_nozzle_offsets() {
155
-    constexpr float tmp[XYZ][HOTENDS] = { HOTEND_OFFSET_X, HOTEND_OFFSET_Y, HOTEND_OFFSET_Z };
156
-    LOOP_XYZ(i) HOTEND_LOOP() hotend_offset[i][e] = tmp[i][e];
157
-  }
154
+#if HAS_HOTEND_OFFSET
158
 
155
 
159
   inline void normalize_hotend_offsets() {
156
   inline void normalize_hotend_offsets() {
160
     for (uint8_t e = 1; e < HOTENDS; e++) {
157
     for (uint8_t e = 1; e < HOTENDS; e++) {
167
     hotend_offset[Z_AXIS][0] = 0;
164
     hotend_offset[Z_AXIS][0] = 0;
168
   }
165
   }
169
 
166
 
170
-#endif // HOTENDS > 1
167
+#endif
171
 
168
 
172
 inline bool read_calibration_pin() {
169
 inline bool read_calibration_pin() {
173
   #if HAS_CALIBRATION_PIN
170
   #if HAS_CALIBRATION_PIN
526
   probe_sides(m, uncertainty);
523
   probe_sides(m, uncertainty);
527
 
524
 
528
   // Adjust the hotend offset
525
   // Adjust the hotend offset
529
-  #if HOTENDS > 1
526
+  #if HAS_HOTEND_OFFSET
530
     #if HAS_X_CENTER
527
     #if HAS_X_CENTER
531
       hotend_offset[X_AXIS][extruder] += m.pos_error[X_AXIS];
528
       hotend_offset[X_AXIS][extruder] += m.pos_error[X_AXIS];
532
     #endif
529
     #endif
534
       hotend_offset[Y_AXIS][extruder] += m.pos_error[Y_AXIS];
531
       hotend_offset[Y_AXIS][extruder] += m.pos_error[Y_AXIS];
535
     #endif
532
     #endif
536
     hotend_offset[Z_AXIS][extruder] += m.pos_error[Z_AXIS];
533
     hotend_offset[Z_AXIS][extruder] += m.pos_error[Z_AXIS];
537
-
538
     normalize_hotend_offsets();
534
     normalize_hotend_offsets();
539
   #endif
535
   #endif
540
 
536
 
565
 
561
 
566
   HOTEND_LOOP() calibrate_toolhead(m, uncertainty, e);
562
   HOTEND_LOOP() calibrate_toolhead(m, uncertainty, e);
567
 
563
 
568
-  #if HOTENDS > 1
564
+  #if HAS_HOTEND_OFFSET
569
     normalize_hotend_offsets();
565
     normalize_hotend_offsets();
566
+  #endif
567
+
568
+  #if HOTENDS > 1
570
     set_nozzle(m, 0);
569
     set_nozzle(m, 0);
571
   #endif
570
   #endif
572
 }
571
 }
585
 inline void calibrate_all() {
584
 inline void calibrate_all() {
586
   measurements_t m;
585
   measurements_t m;
587
 
586
 
588
-  #if HOTENDS > 1
589
-    reset_nozzle_offsets();
587
+  #if HAS_HOTEND_OFFSET
588
+    reset_hotend_offsets();
590
   #endif
589
   #endif
591
 
590
 
592
   TEMPORARY_BACKLASH_CORRECTION(1.0f);
591
   TEMPORARY_BACKLASH_CORRECTION(1.0f);

+ 2
- 2
Marlin/src/gcode/feature/pause/M125.cpp Прегледај датотеку

68
   if (parser.seenval('Z')) park_point.z = parser.linearval('Z');
68
   if (parser.seenval('Z')) park_point.z = parser.linearval('Z');
69
 
69
 
70
   #if HAS_HOTEND_OFFSET && DISABLED(DUAL_X_CARRIAGE) && DISABLED(DELTA)
70
   #if HAS_HOTEND_OFFSET && DISABLED(DUAL_X_CARRIAGE) && DISABLED(DELTA)
71
-    park_point.x += (active_extruder ? hotend_offset[X_AXIS][active_extruder] : 0);
72
-    park_point.y += (active_extruder ? hotend_offset[Y_AXIS][active_extruder] : 0);
71
+    park_point.x += hotend_offset[X_AXIS][active_extruder];
72
+    park_point.y += hotend_offset[Y_AXIS][active_extruder];
73
   #endif
73
   #endif
74
 
74
 
75
   #if ENABLED(SDSUPPORT)
75
   #if ENABLED(SDSUPPORT)

+ 2
- 2
Marlin/src/gcode/feature/pause/M600.cpp Прегледај датотеку

110
   if (parser.seenval('Y')) park_point.y = parser.linearval('Y');
110
   if (parser.seenval('Y')) park_point.y = parser.linearval('Y');
111
 
111
 
112
   #if HAS_HOTEND_OFFSET && DISABLED(DUAL_X_CARRIAGE) && DISABLED(DELTA)
112
   #if HAS_HOTEND_OFFSET && DISABLED(DUAL_X_CARRIAGE) && DISABLED(DELTA)
113
-    park_point.x += (active_extruder ? hotend_offset[X_AXIS][active_extruder] : 0);
114
-    park_point.y += (active_extruder ? hotend_offset[Y_AXIS][active_extruder] : 0);
113
+    park_point.x += hotend_offset[X_AXIS][active_extruder];
114
+    park_point.y += hotend_offset[Y_AXIS][active_extruder];
115
   #endif
115
   #endif
116
 
116
 
117
   #if ENABLED(MMU2_MENUS)
117
   #if ENABLED(MMU2_MENUS)

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

397
   #endif
397
   #endif
398
 #endif
398
 #endif
399
 
399
 
400
-#if HAS_PRINT_PROGRESS
401
-  uint8_t MarlinUI::get_progress() {
402
-    #if ENABLED(LCD_SET_PROGRESS_MANUALLY)
403
-      uint8_t &progress = progress_bar_percent;
404
-    #else
405
-      uint8_t progress = 0;
406
-    #endif
407
-    #if ENABLED(SDSUPPORT)
408
-      if (IS_SD_PRINTING()) progress = card.percentDone();
409
-    #endif
410
-    return progress;
411
-  }
412
-#endif
413
-
414
 void MarlinUI::status_screen() {
400
 void MarlinUI::status_screen() {
415
 
401
 
416
   #if HAS_LCD_MENU
402
   #if HAS_LCD_MENU
1321
     set_status_P(msg, -1);
1307
     set_status_P(msg, -1);
1322
   }
1308
   }
1323
 
1309
 
1310
+  #if HAS_PRINT_PROGRESS
1311
+    uint8_t MarlinUI::get_progress() {
1312
+      #if ENABLED(LCD_SET_PROGRESS_MANUALLY)
1313
+        uint8_t &progress = progress_bar_percent;
1314
+      #else
1315
+        uint8_t progress = 0;
1316
+      #endif
1317
+      #if ENABLED(SDSUPPORT)
1318
+        if (IS_SD_PRINTING()) progress = card.percentDone();
1319
+      #endif
1320
+      return progress;
1321
+    }
1322
+  #endif
1323
+
1324
 #endif // HAS_SPI_LCD || EXTENSIBLE_UI
1324
 #endif // HAS_SPI_LCD || EXTENSIBLE_UI

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

2028
   #endif
2028
   #endif
2029
 
2029
 
2030
   #if HAS_HOTEND_OFFSET
2030
   #if HAS_HOTEND_OFFSET
2031
-    constexpr float tmp4[XYZ][HOTENDS] = { HOTEND_OFFSET_X, HOTEND_OFFSET_Y, HOTEND_OFFSET_Z };
2032
-    static_assert(
2033
-      tmp4[X_AXIS][0] == 0 && tmp4[Y_AXIS][0] == 0 && tmp4[Z_AXIS][0] == 0,
2034
-      "Offsets for the first hotend must be 0.0."
2035
-    );
2036
-    LOOP_XYZ(i) HOTEND_LOOP() hotend_offset[i][e] = tmp4[i][e];
2037
-    #if ENABLED(DUAL_X_CARRIAGE)
2038
-      hotend_offset[X_AXIS][1] = MAX(X2_HOME_POS, X2_MAX_POS);
2039
-    #endif
2031
+    reset_hotend_offsets();
2040
   #endif
2032
   #endif
2041
 
2033
 
2042
   #if EXTRUDERS > 1
2034
   #if EXTRUDERS > 1

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

106
 // Extruder offsets
106
 // Extruder offsets
107
 #if HAS_HOTEND_OFFSET
107
 #if HAS_HOTEND_OFFSET
108
   float hotend_offset[XYZ][HOTENDS]; // Initialized by settings.load()
108
   float hotend_offset[XYZ][HOTENDS]; // Initialized by settings.load()
109
+  void reset_hotend_offsets() {
110
+    constexpr float tmp[XYZ][HOTENDS] = { HOTEND_OFFSET_X, HOTEND_OFFSET_Y, HOTEND_OFFSET_Z };
111
+    static_assert(
112
+      tmp[X_AXIS][0] == 0 && tmp[Y_AXIS][0] == 0 && tmp[Z_AXIS][0] == 0,
113
+      "Offsets for the first hotend must be 0.0."
114
+    );
115
+    LOOP_XYZ(i) HOTEND_LOOP() hotend_offset[i][e] = tmp[i][e];
116
+    #if ENABLED(DUAL_X_CARRIAGE)
117
+      hotend_offset[X_AXIS][1] = MAX(X2_HOME_POS, X2_MAX_POS);
118
+    #endif
119
+  }
109
 #endif
120
 #endif
110
 
121
 
111
 // The feedrate for the current move, often used as the default if
122
 // The feedrate for the current move, often used as the default if
130
 float cartes[XYZ];
141
 float cartes[XYZ];
131
 
142
 
132
 #if IS_KINEMATIC
143
 #if IS_KINEMATIC
144
+
133
   float delta[ABC];
145
   float delta[ABC];
134
-#endif
135
 
146
 
136
-#if HAS_SCARA_OFFSET
137
-  float scara_home_offset[ABC];
147
+  #if HAS_SCARA_OFFSET
148
+    float scara_home_offset[ABC];
149
+  #endif
150
+
151
+  #if HAS_SOFTWARE_ENDSTOPS
152
+    float soft_endstop_radius, soft_endstop_radius_2;
153
+  #elif IS_SCARA
154
+    constexpr float soft_endstop_radius = SCARA_PRINTABLE_RADIUS,
155
+                    soft_endstop_radius_2 = sq(SCARA_PRINTABLE_RADIUS);
156
+  #else // DELTA
157
+    constexpr float soft_endstop_radius = DELTA_PRINTABLE_RADIUS,
158
+                    soft_endstop_radius_2 = sq(DELTA_PRINTABLE_RADIUS);
159
+  #endif
160
+
138
 #endif
161
 #endif
139
 
162
 
140
 /**
163
 /**
440
   float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
463
   float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
441
         soft_endstop_max[XYZ] = { X_MAX_BED, Y_MAX_BED, Z_MAX_POS };
464
         soft_endstop_max[XYZ] = { X_MAX_BED, Y_MAX_BED, Z_MAX_POS };
442
 
465
 
443
-  #if IS_KINEMATIC
444
-    float soft_endstop_radius, soft_endstop_radius_2;
445
-  #endif
446
-
447
-  /**
448
-   * Constrain the given coordinates to the software endstops.
449
-   *
450
-   * For DELTA/SCARA the XY constraint is based on the smallest
451
-   * radius within the set software endstops.
452
-   */
453
-  void clamp_to_software_endstops(float target[XYZ]) {
454
-    if (!soft_endstops_enabled) return;
455
-    #if IS_KINEMATIC
456
-      const float dist_2 = HYPOT2(target[X_AXIS], target[Y_AXIS]);
457
-      if (dist_2 > soft_endstop_radius_2) {
458
-        const float ratio = soft_endstop_radius / SQRT(dist_2); // 200 / 300 = 0.66
459
-        target[X_AXIS] *= ratio;
460
-        target[Y_AXIS] *= ratio;
461
-      }
462
-    #else
463
-      #if ENABLED(MIN_SOFTWARE_ENDSTOP_X)
464
-        NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]);
465
-      #endif
466
-      #if ENABLED(MIN_SOFTWARE_ENDSTOP_Y)
467
-        NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]);
468
-      #endif
469
-      #if ENABLED(MAX_SOFTWARE_ENDSTOP_X)
470
-        NOMORE(target[X_AXIS], soft_endstop_max[X_AXIS]);
471
-      #endif
472
-      #if ENABLED(MAX_SOFTWARE_ENDSTOP_Y)
473
-        NOMORE(target[Y_AXIS], soft_endstop_max[Y_AXIS]);
474
-      #endif
475
-    #endif
476
-    #if ENABLED(MIN_SOFTWARE_ENDSTOP_Z)
477
-      NOLESS(target[Z_AXIS], soft_endstop_min[Z_AXIS]);
478
-    #endif
479
-    #if ENABLED(MAX_SOFTWARE_ENDSTOP_Z)
480
-      NOMORE(target[Z_AXIS], soft_endstop_max[Z_AXIS]);
481
-    #endif
482
-  }
483
-
484
   /**
466
   /**
485
    * Software endstops can be used to monitor the open end of
467
    * Software endstops can be used to monitor the open end of
486
    * an axis that has a hardware endstop on the other end. Or
468
    * an axis that has a hardware endstop on the other end. Or
490
    * the software endstop positions must be refreshed to remain
472
    * the software endstop positions must be refreshed to remain
491
    * at the same positions relative to the machine.
473
    * at the same positions relative to the machine.
492
    */
474
    */
493
-  void update_software_endstops(const AxisEnum axis) {
475
+  void update_software_endstops(const AxisEnum axis
476
+    #if HAS_HOTEND_OFFSET
477
+      , const uint8_t old_tool_index/*=0*/, const uint8_t new_tool_index/*=0*/
478
+    #endif
479
+  ) {
494
 
480
 
495
     #if ENABLED(DUAL_X_CARRIAGE)
481
     #if ENABLED(DUAL_X_CARRIAGE)
496
 
482
 
499
         // In Dual X mode hotend_offset[X] is T1's home position
485
         // In Dual X mode hotend_offset[X] is T1's home position
500
         const float dual_max_x = MAX(hotend_offset[X_AXIS][1], X2_MAX_POS);
486
         const float dual_max_x = MAX(hotend_offset[X_AXIS][1], X2_MAX_POS);
501
 
487
 
502
-        if (active_extruder != 0) {
488
+        if (new_tool_index != 0) {
503
           // T1 can move from X2_MIN_POS to X2_MAX_POS or X2 home position (whichever is larger)
489
           // T1 can move from X2_MIN_POS to X2_MAX_POS or X2 home position (whichever is larger)
504
           soft_endstop_min[X_AXIS] = X2_MIN_POS;
490
           soft_endstop_min[X_AXIS] = X2_MIN_POS;
505
           soft_endstop_max[X_AXIS] = dual_max_x;
491
           soft_endstop_max[X_AXIS] = dual_max_x;
538
         default: break;
524
         default: break;
539
       }
525
       }
540
 
526
 
527
+    #elif HAS_HOTEND_OFFSET
528
+
529
+      // Software endstops are relative to the tool 0 workspace, so
530
+      // the movement limits must be shifted by the tool offset to
531
+      // retain the same physical limit when other tools are selected.
532
+      if (old_tool_index != new_tool_index) {
533
+        const float offs = hotend_offset[axis][new_tool_index] - hotend_offset[axis][old_tool_index];
534
+        soft_endstop_min[axis] += offs;
535
+        soft_endstop_max[axis] += offs;
536
+      }
537
+      else {
538
+        const float offs = hotend_offset[axis][active_extruder];
539
+        soft_endstop_min[axis] = base_min_pos(axis) + offs;
540
+        soft_endstop_max[axis] = base_max_pos(axis) + offs;
541
+      }
542
+
541
     #else
543
     #else
542
 
544
 
543
       soft_endstop_min[axis] = base_min_pos(axis);
545
       soft_endstop_min[axis] = base_min_pos(axis);
554
     #endif
556
     #endif
555
   }
557
   }
556
 
558
 
557
-#endif
559
+#endif // HAS_SOFTWARE_ENDSTOPS
560
+
561
+/**
562
+ * Constrain the given coordinates to the software endstops.
563
+ *
564
+ * For DELTA/SCARA the XY constraint is based on the smallest
565
+ * radius within the set software endstops.
566
+ */
567
+void clamp_to_software_endstops(float target[XYZ]) {
568
+
569
+  if (!soft_endstops_enabled) return;
570
+
571
+  #if IS_KINEMATIC
572
+
573
+    #if HAS_HOTEND_OFFSET && ENABLED(DELTA)
574
+      // The effector center position will be the target minus the hotend offset.
575
+      const float offx = hotend_offset[X_AXIS][active_extruder], offy = hotend_offset[Y_AXIS][active_extruder];
576
+    #else
577
+      // SCARA needs to consider the angle of the arm through the entire move, so for now use no tool offset.
578
+      constexpr float offx = 0, offy = 0;
579
+    #endif
580
+
581
+    const float dist_2 = HYPOT2(target[X_AXIS] - offx, target[Y_AXIS] - offy);
582
+    if (dist_2 > soft_endstop_radius_2) {
583
+      const float ratio = (soft_endstop_radius) / SQRT(dist_2); // 200 / 300 = 0.66
584
+      target[X_AXIS] *= ratio;
585
+      target[Y_AXIS] *= ratio;
586
+    }
587
+
588
+  #else
589
+
590
+    #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X)
591
+      NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]);
592
+    #endif
593
+    #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_X)
594
+      NOMORE(target[X_AXIS], soft_endstop_max[X_AXIS]);
595
+    #endif
596
+    #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Y)
597
+      NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]);
598
+    #endif
599
+    #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Y)
600
+      NOMORE(target[Y_AXIS], soft_endstop_max[Y_AXIS]);
601
+    #endif
602
+
603
+  #endif
604
+
605
+  #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Z)
606
+    NOLESS(target[Z_AXIS], soft_endstop_min[Z_AXIS]);
607
+  #endif
608
+  #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Z)
609
+    NOMORE(target[Z_AXIS], soft_endstop_max[Z_AXIS]);
610
+  #endif
611
+}
558
 
612
 
559
 #if !UBL_SEGMENTED
613
 #if !UBL_SEGMENTED
560
 #if IS_KINEMATIC
614
 #if IS_KINEMATIC

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

90
   constexpr uint8_t active_extruder = 0;
90
   constexpr uint8_t active_extruder = 0;
91
 #endif
91
 #endif
92
 
92
 
93
-#if HAS_HOTEND_OFFSET
94
-  extern float hotend_offset[XYZ][HOTENDS];
95
-#endif
96
-
97
 FORCE_INLINE float pgm_read_any(const float *p) { return pgm_read_float(p); }
93
 FORCE_INLINE float pgm_read_any(const float *p) { return pgm_read_float(p); }
98
 FORCE_INLINE signed char pgm_read_any(const signed char *p) { return pgm_read_byte(p); }
94
 FORCE_INLINE signed char pgm_read_any(const signed char *p) { return pgm_read_byte(p); }
99
 
95
 
115
   #define update_workspace_offset(x) NOOP
111
   #define update_workspace_offset(x) NOOP
116
 #endif
112
 #endif
117
 
113
 
114
+#if HAS_HOTEND_OFFSET
115
+  extern float hotend_offset[XYZ][HOTENDS];
116
+  void reset_hotend_offsets();
117
+#else
118
+  constexpr float hotend_offset[XYZ][HOTENDS] = { { 0 }, { 0 }, { 0 } };
119
+#endif
120
+
118
 #if HAS_SOFTWARE_ENDSTOPS
121
 #if HAS_SOFTWARE_ENDSTOPS
119
   extern bool soft_endstops_enabled;
122
   extern bool soft_endstops_enabled;
120
   extern float soft_endstop_min[XYZ], soft_endstop_max[XYZ];
123
   extern float soft_endstop_min[XYZ], soft_endstop_max[XYZ];
121
-  void clamp_to_software_endstops(float target[XYZ]);
122
-  void update_software_endstops(const AxisEnum axis);
124
+  void update_software_endstops(const AxisEnum axis
125
+    #if HAS_HOTEND_OFFSET
126
+      , const uint8_t old_tool_index=0, const uint8_t new_tool_index=0
127
+    #endif
128
+  );
123
 #else
129
 #else
124
-  constexpr bool soft_endstops_enabled = false;
125
-  constexpr float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
126
-                  soft_endstop_max[XYZ] = { X_MAX_BED, Y_MAX_BED, Z_MAX_POS };
127
-  #define clamp_to_software_endstops(x) NOOP
128
-  #define update_software_endstops(x) NOOP
130
+  constexpr bool soft_endstops_enabled = true;
131
+  constexpr float soft_endstop_min[XYZ] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS },
132
+                  soft_endstop_max[XYZ] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS };
133
+  #define update_software_endstops(...) NOOP
129
 #endif
134
 #endif
130
 
135
 
136
+void clamp_to_software_endstops(float target[XYZ]);
137
+
131
 void report_current_position();
138
 void report_current_position();
132
 
139
 
133
 inline void set_current_from_destination() { COPY(current_position, destination); }
140
 inline void set_current_from_destination() { COPY(current_position, destination); }

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

1626
             if (reversing == (error_correction < 0)) {
1626
             if (reversing == (error_correction < 0)) {
1627
               if (segment_proportion == 0)
1627
               if (segment_proportion == 0)
1628
                 segment_proportion = MIN(1.0f, block->millimeters / backlash_smoothing_mm);
1628
                 segment_proportion = MIN(1.0f, block->millimeters / backlash_smoothing_mm);
1629
-              error_correction *= segment_proportion;
1629
+              error_correction = ceil(segment_proportion * error_correction);
1630
             }
1630
             }
1631
             else
1631
             else
1632
               error_correction = 0; // Don't take up any backlash in this segment, as it would subtract steps
1632
               error_correction = 0; // Don't take up any backlash in this segment, as it would subtract steps

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

735
       const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s;
735
       const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s;
736
       feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S;
736
       feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S;
737
 
737
 
738
-      #if ENABLED(DUAL_X_CARRIAGE)
739
-
740
-        #if HAS_SOFTWARE_ENDSTOPS
741
-          // Update the X software endstops early
742
-          active_extruder = tmp_extruder;
743
-          update_software_endstops(X_AXIS);
744
-          active_extruder = !tmp_extruder;
745
-          const float minx = soft_endstop_min[X_AXIS], maxx = soft_endstop_max[X_AXIS];
746
-        #else
747
-          // No software endstops? Use the configured limits
748
-          const float minx = tmp_extruder ? X2_MIN_POS : X1_MIN_POS,
749
-                      maxx = tmp_extruder ? X2_MAX_POS : X1_MAX_POS;
750
-        #endif
751
-
752
-        // Don't move the new extruder out of bounds
753
-        if (!WITHIN(current_position[X_AXIS], minx, maxx)) no_move = true;
754
-
738
+      #if HAS_SOFTWARE_ENDSTOPS && ENABLED(DUAL_X_CARRIAGE)
739
+        update_software_endstops(X_AXIS, active_extruder, tmp_extruder);
755
       #endif
740
       #endif
756
 
741
 
757
       set_destination_from_current();
742
       set_destination_from_current();
772
         planner.synchronize();
757
         planner.synchronize();
773
       }
758
       }
774
 
759
 
775
-      #if HOTENDS > 1
760
+      #if HAS_HOTEND_OFFSET
776
         #if ENABLED(DUAL_X_CARRIAGE)
761
         #if ENABLED(DUAL_X_CARRIAGE)
777
           constexpr float xdiff = 0;
762
           constexpr float xdiff = 0;
778
         #else
763
         #else
914
       enable_solenoid_on_active_extruder();
899
       enable_solenoid_on_active_extruder();
915
     #endif
900
     #endif
916
 
901
 
917
-    #if HAS_SOFTWARE_ENDSTOPS && ENABLED(DUAL_X_CARRIAGE)
918
-      update_software_endstops(X_AXIS);
919
-    #endif
920
-
921
     #if ENABLED(MK2_MULTIPLEXER)
902
     #if ENABLED(MK2_MULTIPLEXER)
922
       if (tmp_extruder >= E_STEPPERS) return invalid_extruder_error(tmp_extruder);
903
       if (tmp_extruder >= E_STEPPERS) return invalid_extruder_error(tmp_extruder);
923
       select_multiplexed_stepper(tmp_extruder);
904
       select_multiplexed_stepper(tmp_extruder);

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

176
       #define BTN_EN2         19
176
       #define BTN_EN2         19
177
     #else
177
     #else
178
       #define LCD_PINS_RS     82
178
       #define LCD_PINS_RS     82
179
-      #define LCD_PINS_ENABLE 18
180
-      #define LCD_PINS_D4     19
179
+      #define LCD_PINS_ENABLE 18   // On 0.6b, use 61
180
+      #define LCD_PINS_D4     19   // On 0.6b, use 59
181
       #define LCD_PINS_D5     70
181
       #define LCD_PINS_D5     70
182
       #define LCD_PINS_D6     85
182
       #define LCD_PINS_D6     85
183
       #define LCD_PINS_D7     71
183
       #define LCD_PINS_D7     71

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