Browse Source

Merge pull request #3446 from thinkyhead/rc_fixup_M206_and_mesh

Fix home_offset handling and account for it in G29
Scott Lahteine 8 years ago
parent
commit
c5a2ce4366
2 changed files with 45 additions and 35 deletions
  1. 43
    33
      Marlin/Marlin_main.cpp
  2. 2
    2
      Marlin/planner.cpp

+ 43
- 33
Marlin/Marlin_main.cpp View File

2847
         }
2847
         }
2848
         if (probe_point == 0) {
2848
         if (probe_point == 0) {
2849
           // Set Z to a positive value before recording the first Z.
2849
           // Set Z to a positive value before recording the first Z.
2850
-          current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
2850
+          current_position[Z_AXIS] = MESH_HOME_SEARCH_Z + home_offset[Z_AXIS];
2851
           sync_plan_position();
2851
           sync_plan_position();
2852
         }
2852
         }
2853
         else {
2853
         else {
2856
           iy = (probe_point - 1) / (MESH_NUM_X_POINTS);
2856
           iy = (probe_point - 1) / (MESH_NUM_X_POINTS);
2857
           if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // zig-zag
2857
           if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // zig-zag
2858
           mbl.set_z(ix, iy, current_position[Z_AXIS]);
2858
           mbl.set_z(ix, iy, current_position[Z_AXIS]);
2859
-          current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
2859
+          current_position[Z_AXIS] = MESH_HOME_SEARCH_Z + home_offset[Z_AXIS];
2860
           plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS] / 60, active_extruder);
2860
           plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS] / 60, active_extruder);
2861
           st_synchronize();
2861
           st_synchronize();
2862
         }
2862
         }
2865
           ix = probe_point % (MESH_NUM_X_POINTS);
2865
           ix = probe_point % (MESH_NUM_X_POINTS);
2866
           iy = probe_point / (MESH_NUM_X_POINTS);
2866
           iy = probe_point / (MESH_NUM_X_POINTS);
2867
           if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // zig-zag
2867
           if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // zig-zag
2868
-          current_position[X_AXIS] = mbl.get_x(ix);
2869
-          current_position[Y_AXIS] = mbl.get_y(iy);
2868
+          current_position[X_AXIS] = mbl.get_x(ix) + home_offset[X_AXIS];
2869
+          current_position[Y_AXIS] = mbl.get_y(iy) + home_offset[Y_AXIS];
2870
           plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS] / 60, active_extruder);
2870
           plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS] / 60, active_extruder);
2871
           st_synchronize();
2871
           st_synchronize();
2872
           probe_point++;
2872
           probe_point++;
3155
 
3155
 
3156
           // raise extruder
3156
           // raise extruder
3157
           float measured_z,
3157
           float measured_z,
3158
-                z_before = probePointCounter ? Z_RAISE_BETWEEN_PROBINGS + current_position[Z_AXIS] : Z_RAISE_BEFORE_PROBING;
3158
+                z_before = probePointCounter ? Z_RAISE_BETWEEN_PROBINGS + current_position[Z_AXIS] : Z_RAISE_BEFORE_PROBING + home_offset[Z_AXIS];
3159
 
3159
 
3160
           if (probePointCounter) {
3160
           if (probePointCounter) {
3161
             #if ENABLED(DEBUG_LEVELING_FEATURE)
3161
             #if ENABLED(DEBUG_LEVELING_FEATURE)
3168
           else {
3168
           else {
3169
             #if ENABLED(DEBUG_LEVELING_FEATURE)
3169
             #if ENABLED(DEBUG_LEVELING_FEATURE)
3170
               if (DEBUGGING(LEVELING)) {
3170
               if (DEBUGGING(LEVELING)) {
3171
-                SERIAL_ECHOPAIR("z_before = (before) ", Z_RAISE_BEFORE_PROBING);
3171
+                SERIAL_ECHOPAIR("z_before = (before) ", Z_RAISE_BEFORE_PROBING + home_offset[Z_AXIS]);
3172
                 SERIAL_EOL;
3172
                 SERIAL_EOL;
3173
               }
3173
               }
3174
             #endif
3174
             #endif
3329
         p1 = ProbeDeploy, p2 = ProbeStay, p3 = ProbeStow;
3329
         p1 = ProbeDeploy, p2 = ProbeStay, p3 = ProbeStow;
3330
 
3330
 
3331
       // Probe at 3 arbitrary points
3331
       // Probe at 3 arbitrary points
3332
-      float z_at_pt_1 = probe_pt(ABL_PROBE_PT_1_X, ABL_PROBE_PT_1_Y, Z_RAISE_BEFORE_PROBING, p1, verbose_level),
3333
-            z_at_pt_2 = probe_pt(ABL_PROBE_PT_2_X, ABL_PROBE_PT_2_Y, current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS, p2, verbose_level),
3334
-            z_at_pt_3 = probe_pt(ABL_PROBE_PT_3_X, ABL_PROBE_PT_3_Y, current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS, p3, verbose_level);
3332
+      float z_at_pt_1 = probe_pt( ABL_PROBE_PT_1_X + home_offset[X_AXIS],
3333
+                                  ABL_PROBE_PT_1_Y + home_offset[Y_AXIS],
3334
+                                  Z_RAISE_BEFORE_PROBING + home_offset[Z_AXIS],
3335
+                                  p1, verbose_level),
3336
+            z_at_pt_2 = probe_pt( ABL_PROBE_PT_2_X + home_offset[X_AXIS],
3337
+                                  ABL_PROBE_PT_2_Y + home_offset[Y_AXIS],
3338
+                                  current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS,
3339
+                                  p2, verbose_level),
3340
+            z_at_pt_3 = probe_pt( ABL_PROBE_PT_3_X + home_offset[X_AXIS],
3341
+                                  ABL_PROBE_PT_3_Y + home_offset[Y_AXIS],
3342
+                                  current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS,
3343
+                                  p3, verbose_level);
3335
       clean_up_after_endstop_move();
3344
       clean_up_after_endstop_move();
3336
       if (!dryrun) set_bed_level_equation_3pts(z_at_pt_1, z_at_pt_2, z_at_pt_3);
3345
       if (!dryrun) set_bed_level_equation_3pts(z_at_pt_1, z_at_pt_2, z_at_pt_3);
3337
 
3346
 
4986
   if (code_seen('E')) max_e_jerk = code_value();
4995
   if (code_seen('E')) max_e_jerk = code_value();
4987
 }
4996
 }
4988
 
4997
 
4998
+static void set_home_offset(AxisEnum axis, float v) {
4999
+  min_pos[axis] = base_min_pos(axis) + v;
5000
+  max_pos[axis] = base_max_pos(axis) + v;
5001
+  current_position[axis] += v - home_offset[axis];
5002
+  home_offset[axis] = v;
5003
+}
5004
+
4989
 /**
5005
 /**
4990
  * M206: Set Additional Homing Offset (X Y Z). SCARA aliases T=X, P=Y
5006
  * M206: Set Additional Homing Offset (X Y Z). SCARA aliases T=X, P=Y
4991
  */
5007
  */
4992
 inline void gcode_M206() {
5008
 inline void gcode_M206() {
4993
-  for (int8_t i = X_AXIS; i <= Z_AXIS; i++) {
4994
-    if (code_seen(axis_codes[i])) {
4995
-      home_offset[i] = code_value();
4996
-    }
4997
-  }
5009
+  for (int8_t i = X_AXIS; i <= Z_AXIS; i++)
5010
+    if (code_seen(axis_codes[i]))
5011
+      set_home_offset((AxisEnum)i, code_value());
5012
+
4998
   #if ENABLED(SCARA)
5013
   #if ENABLED(SCARA)
4999
-    if (code_seen('T')) home_offset[X_AXIS] = code_value(); // Theta
5000
-    if (code_seen('P')) home_offset[Y_AXIS] = code_value(); // Psi
5014
+    if (code_seen('T')) set_home_offset(X_AXIS, code_value()); // Theta
5015
+    if (code_seen('P')) set_home_offset(Y_AXIS, code_value()); // Psi
5001
   #endif
5016
   #endif
5017
+  sync_plan_position();
5002
 }
5018
 }
5003
 
5019
 
5004
 #if ENABLED(DELTA)
5020
 #if ENABLED(DELTA)
5685
  */
5701
  */
5686
 inline void gcode_M428() {
5702
 inline void gcode_M428() {
5687
   bool err = false;
5703
   bool err = false;
5688
-  float new_offs[3], new_pos[3];
5689
-  memcpy(new_pos, current_position, sizeof(new_pos));
5690
-  memcpy(new_offs, home_offset, sizeof(new_offs));
5691
   for (int8_t i = X_AXIS; i <= Z_AXIS; i++) {
5704
   for (int8_t i = X_AXIS; i <= Z_AXIS; i++) {
5692
     if (axis_homed[i]) {
5705
     if (axis_homed[i]) {
5693
-      float base = (new_pos[i] > (min_pos[i] + max_pos[i]) / 2) ? base_home_pos(i) : 0,
5694
-            diff = new_pos[i] - base;
5706
+      float base = (current_position[i] > (min_pos[i] + max_pos[i]) / 2) ? base_home_pos(i) : 0,
5707
+            diff = current_position[i] - base;
5695
       if (diff > -20 && diff < 20) {
5708
       if (diff > -20 && diff < 20) {
5696
-        new_offs[i] -= diff;
5697
-        new_pos[i] = base;
5709
+        set_home_offset((AxisEnum)i, home_offset[i] - diff);
5698
       }
5710
       }
5699
       else {
5711
       else {
5700
         SERIAL_ERROR_START;
5712
         SERIAL_ERROR_START;
5710
   }
5722
   }
5711
 
5723
 
5712
   if (!err) {
5724
   if (!err) {
5713
-    memcpy(current_position, new_pos, sizeof(new_pos));
5714
-    memcpy(home_offset, new_offs, sizeof(new_offs));
5715
     sync_plan_position();
5725
     sync_plan_position();
5716
     LCD_ALERTMESSAGEPGM(MSG_HOME_OFFSETS_APPLIED);
5726
     LCD_ALERTMESSAGEPGM(MSG_HOME_OFFSETS_APPLIED);
5717
     #if HAS_BUZZER
5727
     #if HAS_BUZZER
6980
     set_current_to_destination();
6990
     set_current_to_destination();
6981
     return;
6991
     return;
6982
   }
6992
   }
6983
-  int pix = mbl.select_x_index(current_position[X_AXIS]);
6984
-  int piy = mbl.select_y_index(current_position[Y_AXIS]);
6985
-  int ix = mbl.select_x_index(x);
6986
-  int iy = mbl.select_y_index(y);
6993
+  int pix = mbl.select_x_index(current_position[X_AXIS] - home_offset[X_AXIS]);
6994
+  int piy = mbl.select_y_index(current_position[Y_AXIS] - home_offset[Y_AXIS]);
6995
+  int ix = mbl.select_x_index(x - home_offset[X_AXIS]);
6996
+  int iy = mbl.select_y_index(y - home_offset[Y_AXIS]);
6987
   pix = min(pix, MESH_NUM_X_POINTS - 2);
6997
   pix = min(pix, MESH_NUM_X_POINTS - 2);
6988
   piy = min(piy, MESH_NUM_Y_POINTS - 2);
6998
   piy = min(piy, MESH_NUM_Y_POINTS - 2);
6989
   ix = min(ix, MESH_NUM_X_POINTS - 2);
6999
   ix = min(ix, MESH_NUM_X_POINTS - 2);
6996
   }
7006
   }
6997
   float nx, ny, nz, ne, normalized_dist;
7007
   float nx, ny, nz, ne, normalized_dist;
6998
   if (ix > pix && TEST(x_splits, ix)) {
7008
   if (ix > pix && TEST(x_splits, ix)) {
6999
-    nx = mbl.get_x(ix);
7009
+    nx = mbl.get_x(ix) + home_offset[X_AXIS];
7000
     normalized_dist = (nx - current_position[X_AXIS]) / (x - current_position[X_AXIS]);
7010
     normalized_dist = (nx - current_position[X_AXIS]) / (x - current_position[X_AXIS]);
7001
     ny = current_position[Y_AXIS] + (y - current_position[Y_AXIS]) * normalized_dist;
7011
     ny = current_position[Y_AXIS] + (y - current_position[Y_AXIS]) * normalized_dist;
7002
     nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist;
7012
     nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist;
7004
     CBI(x_splits, ix);
7014
     CBI(x_splits, ix);
7005
   }
7015
   }
7006
   else if (ix < pix && TEST(x_splits, pix)) {
7016
   else if (ix < pix && TEST(x_splits, pix)) {
7007
-    nx = mbl.get_x(pix);
7017
+    nx = mbl.get_x(pix) + home_offset[X_AXIS];
7008
     normalized_dist = (nx - current_position[X_AXIS]) / (x - current_position[X_AXIS]);
7018
     normalized_dist = (nx - current_position[X_AXIS]) / (x - current_position[X_AXIS]);
7009
     ny = current_position[Y_AXIS] + (y - current_position[Y_AXIS]) * normalized_dist;
7019
     ny = current_position[Y_AXIS] + (y - current_position[Y_AXIS]) * normalized_dist;
7010
     nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist;
7020
     nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist;
7012
     CBI(x_splits, pix);
7022
     CBI(x_splits, pix);
7013
   }
7023
   }
7014
   else if (iy > piy && TEST(y_splits, iy)) {
7024
   else if (iy > piy && TEST(y_splits, iy)) {
7015
-    ny = mbl.get_y(iy);
7025
+    ny = mbl.get_y(iy) + home_offset[Y_AXIS];
7016
     normalized_dist = (ny - current_position[Y_AXIS]) / (y - current_position[Y_AXIS]);
7026
     normalized_dist = (ny - current_position[Y_AXIS]) / (y - current_position[Y_AXIS]);
7017
     nx = current_position[X_AXIS] + (x - current_position[X_AXIS]) * normalized_dist;
7027
     nx = current_position[X_AXIS] + (x - current_position[X_AXIS]) * normalized_dist;
7018
     nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist;
7028
     nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist;
7020
     CBI(y_splits, iy);
7030
     CBI(y_splits, iy);
7021
   }
7031
   }
7022
   else if (iy < piy && TEST(y_splits, piy)) {
7032
   else if (iy < piy && TEST(y_splits, piy)) {
7023
-    ny = mbl.get_y(piy);
7033
+    ny = mbl.get_y(piy) + home_offset[Y_AXIS];
7024
     normalized_dist = (ny - current_position[Y_AXIS]) / (y - current_position[Y_AXIS]);
7034
     normalized_dist = (ny - current_position[Y_AXIS]) / (y - current_position[Y_AXIS]);
7025
     nx = current_position[X_AXIS] + (x - current_position[X_AXIS]) * normalized_dist;
7035
     nx = current_position[X_AXIS] + (x - current_position[X_AXIS]) * normalized_dist;
7026
     nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist;
7036
     nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist;

+ 2
- 2
Marlin/planner.cpp View File

568
   while (block_buffer_tail == next_buffer_head) idle();
568
   while (block_buffer_tail == next_buffer_head) idle();
569
 
569
 
570
   #if ENABLED(MESH_BED_LEVELING)
570
   #if ENABLED(MESH_BED_LEVELING)
571
-    if (mbl.active) z += mbl.get_z(x, y);
571
+    if (mbl.active) z += mbl.get_z(x - home_offset[X_AXIS], y - home_offset[Y_AXIS]);
572
   #elif ENABLED(AUTO_BED_LEVELING_FEATURE)
572
   #elif ENABLED(AUTO_BED_LEVELING_FEATURE)
573
     apply_rotation_xyz(plan_bed_level_matrix, x, y, z);
573
     apply_rotation_xyz(plan_bed_level_matrix, x, y, z);
574
   #endif
574
   #endif
1123
 #endif // AUTO_BED_LEVELING_FEATURE || MESH_BED_LEVELING
1123
 #endif // AUTO_BED_LEVELING_FEATURE || MESH_BED_LEVELING
1124
   {
1124
   {
1125
     #if ENABLED(MESH_BED_LEVELING)
1125
     #if ENABLED(MESH_BED_LEVELING)
1126
-      if (mbl.active) z += mbl.get_z(x, y);
1126
+      if (mbl.active) z += mbl.get_z(x - home_offset[X_AXIS], y - home_offset[Y_AXIS]);
1127
     #elif ENABLED(AUTO_BED_LEVELING_FEATURE)
1127
     #elif ENABLED(AUTO_BED_LEVELING_FEATURE)
1128
       apply_rotation_xyz(plan_bed_level_matrix, x, y, z);
1128
       apply_rotation_xyz(plan_bed_level_matrix, x, y, z);
1129
     #endif
1129
     #endif

Loading…
Cancel
Save