Browse Source

Merge pull request #6254 from thinkyhead/rc_ubl_rename

Group all UBL files via a common prefix
Scott Lahteine 7 years ago
parent
commit
7dfe2cc132

+ 1
- 2
Marlin/G26_Mesh_Validation_Tool.cpp View File

@@ -28,12 +28,11 @@
28 28
 
29 29
 #if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(UBL_G26_MESH_EDITING)
30 30
 
31
+  #include "ubl.h"
31 32
   #include "Marlin.h"
32
-  #include "Configuration.h"
33 33
   #include "planner.h"
34 34
   #include "stepper.h"
35 35
   #include "temperature.h"
36
-  #include "UBL.h"
37 36
   #include "ultralcd.h"
38 37
 
39 38
   #define EXTRUSION_MULTIPLIER 1.0

+ 1
- 1
Marlin/Marlin_main.cpp View File

@@ -297,7 +297,7 @@
297 297
 #endif
298 298
 
299 299
 #if ENABLED(AUTO_BED_LEVELING_UBL)
300
-  #include "UBL.h"
300
+  #include "ubl.h"
301 301
   unified_bed_leveling ubl;
302 302
   #define UBL_MESH_VALID !( ( ubl.z_values[0][0] == ubl.z_values[0][1] && ubl.z_values[0][1] == ubl.z_values[0][2] \
303 303
                            && ubl.z_values[1][0] == ubl.z_values[1][1] && ubl.z_values[1][1] == ubl.z_values[1][2] \

+ 0
- 339
Marlin/UBL.h View File

@@ -1,339 +0,0 @@
1
-/**
2
- * Marlin 3D Printer Firmware
3
- * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
- *
5
- * Based on Sprinter and grbl.
6
- * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
7
- *
8
- * This program is free software: you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License as published by
10
- * the Free Software Foundation, either version 3 of the License, or
11
- * (at your option) any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU General Public License for more details.
17
- *
18
- * You should have received a copy of the GNU General Public License
19
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- */
22
-
23
-#include "Marlin.h"
24
-#include "math.h"
25
-#include "vector_3.h"
26
-
27
-#ifndef UNIFIED_BED_LEVELING_H
28
-#define UNIFIED_BED_LEVELING_H
29
-
30
-  #if ENABLED(AUTO_BED_LEVELING_UBL)
31
-
32
-    #define UBL_VERSION "1.00"
33
-    #define UBL_OK false
34
-    #define UBL_ERR true
35
-
36
-    typedef struct {
37
-      int8_t x_index, y_index;
38
-      float distance; // When populated, the distance from the search location
39
-    } mesh_index_pair;
40
-
41
-    enum MeshPointType { INVALID, REAL, SET_IN_BITMAP };
42
-
43
-    void dump(char * const str, const float &f);
44
-    bool ubl_lcd_clicked();
45
-    void probe_entire_mesh(const float&, const float&, const bool, const bool, const bool);
46
-    void debug_current_and_destination(char *title);
47
-    void ubl_line_to_destination(const float&, uint8_t);
48
-    void manually_probe_remaining_mesh(const float&, const float&, const float&, const float&, const bool);
49
-    vector_3 tilt_mesh_based_on_3pts(const float&, const float&, const float&);
50
-    float measure_business_card_thickness(const float&);
51
-    mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const float&, const float&, const bool, unsigned int[16], bool);
52
-    void find_mean_mesh_height();
53
-    void shift_mesh_height();
54
-    bool g29_parameter_parsing();
55
-    void g29_what_command();
56
-    void g29_eeprom_dump();
57
-    void g29_compare_current_mesh_to_stored_mesh();
58
-    void fine_tune_mesh(const float&, const float&, const bool);
59
-    void bit_clear(uint16_t bits[16], uint8_t x, uint8_t y);
60
-    void bit_set(uint16_t bits[16], uint8_t x, uint8_t y);
61
-    bool is_bit_set(uint16_t bits[16], uint8_t x, uint8_t y);
62
-    char *ftostr43sign(const float&, char);
63
-
64
-    void gcode_G26();
65
-    void gcode_G28();
66
-    void gcode_G29();
67
-    extern char conv[9];
68
-
69
-    void save_ubl_active_state_and_disable();
70
-    void restore_ubl_active_state_and_leave();
71
-
72
-    ///////////////////////////////////////////////////////////////////////////////////////////////////////
73
-
74
-    #if ENABLED(ULTRA_LCD)
75
-      extern char lcd_status_message[];
76
-      void lcd_quick_feedback();
77
-    #endif
78
-
79
-    enum MBLStatus { MBL_STATUS_NONE = 0, MBL_STATUS_HAS_MESH_BIT = 0, MBL_STATUS_ACTIVE_BIT = 1 };
80
-
81
-    #define MESH_X_DIST (float(UBL_MESH_MAX_X - (UBL_MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1))
82
-    #define MESH_Y_DIST (float(UBL_MESH_MAX_Y - (UBL_MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1))
83
-
84
-    typedef struct {
85
-      bool active = false;
86
-      float z_offset = 0.0;
87
-      int8_t eeprom_storage_slot = -1,
88
-             n_x = GRID_MAX_POINTS_X,
89
-             n_y = GRID_MAX_POINTS_Y;
90
-
91
-      float mesh_x_min = UBL_MESH_MIN_X,
92
-            mesh_y_min = UBL_MESH_MIN_Y,
93
-            mesh_x_max = UBL_MESH_MAX_X,
94
-            mesh_y_max = UBL_MESH_MAX_Y,
95
-            mesh_x_dist = MESH_X_DIST,
96
-            mesh_y_dist = MESH_Y_DIST;
97
-
98
-      #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
99
-        float g29_correction_fade_height = 10.0,
100
-              g29_fade_height_multiplier = 1.0 / 10.0; // It's cheaper to do a floating point multiply than divide,
101
-                                                       // so keep this value and its reciprocal.
102
-      #endif
103
-
104
-      // If you change this struct, adjust TOTAL_STRUCT_SIZE
105
-
106
-      #define TOTAL_STRUCT_SIZE 40 // Total size of the above fields
107
-
108
-      // padding provides space to add state variables without
109
-      // changing the location of data structures in the EEPROM.
110
-      // This is for compatibility with future versions to keep
111
-      // users from having to regenerate their mesh data.
112
-      unsigned char padding[64 - TOTAL_STRUCT_SIZE];
113
-
114
-    } ubl_state;
115
-
116
-    class unified_bed_leveling {
117
-      private:
118
-
119
-        static float last_specified_z;
120
-
121
-      public:
122
-
123
-        static ubl_state state, pre_initialized;
124
-
125
-        static float z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y],
126
-                     mesh_index_to_xpos[GRID_MAX_POINTS_X + 1], // +1 safety margin for now, until determinism prevails
127
-                     mesh_index_to_ypos[GRID_MAX_POINTS_Y + 1];
128
-
129
-        static bool g26_debug_flag,
130
-                    has_control_of_lcd_panel;
131
-
132
-        static int8_t eeprom_start;
133
-
134
-        static volatile int encoder_diff; // Volatile because it's changed at interrupt time.
135
-
136
-        unified_bed_leveling();
137
-
138
-        static void display_map(const int);
139
-
140
-        static void reset();
141
-        static void invalidate();
142
-
143
-        static void store_state();
144
-        static void load_state();
145
-        static void store_mesh(const int16_t);
146
-        static void load_mesh(const int16_t);
147
-
148
-        static bool sanity_check();
149
-
150
-        static FORCE_INLINE void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; }
151
-
152
-        static int8_t get_cell_index_x(const float &x) {
153
-          const int8_t cx = (x - (UBL_MESH_MIN_X)) * (1.0 / (MESH_X_DIST));
154
-          return constrain(cx, 0, (GRID_MAX_POINTS_X) - 1);   // -1 is appropriate if we want all movement to the X_MAX
155
-        }                                                         // position. But with this defined this way, it is possible
156
-                                                                  // to extrapolate off of this point even further out. Probably
157
-                                                                  // that is OK because something else should be keeping that from
158
-                                                                  // happening and should not be worried about at this level.
159
-        static int8_t get_cell_index_y(const float &y) {
160
-          const int8_t cy = (y - (UBL_MESH_MIN_Y)) * (1.0 / (MESH_Y_DIST));
161
-          return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 1);   // -1 is appropriate if we want all movement to the Y_MAX
162
-        }                                                         // position. But with this defined this way, it is possible
163
-                                                                  // to extrapolate off of this point even further out. Probably
164
-                                                                  // that is OK because something else should be keeping that from
165
-                                                                  // happening and should not be worried about at this level.
166
-
167
-        static int8_t find_closest_x_index(const float &x) {
168
-          const int8_t px = (x - (UBL_MESH_MIN_X) + (MESH_X_DIST) * 0.5) * (1.0 / (MESH_X_DIST));
169
-          return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1;
170
-        }
171
-
172
-        static int8_t find_closest_y_index(const float &y) {
173
-          const int8_t py = (y - (UBL_MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * (1.0 / (MESH_Y_DIST));
174
-          return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1;
175
-        }
176
-
177
-        /**
178
-         *                           z2   --|
179
-         *                 z0        |      |
180
-         *                  |        |      + (z2-z1)
181
-         *   z1             |        |      |
182
-         * ---+-------------+--------+--  --|
183
-         *   a1            a0        a2
184
-         *    |<---delta_a---------->|
185
-         *
186
-         *  calc_z0 is the basis for all the Mesh Based correction. It is used to
187
-         *  find the expected Z Height at a position between two known Z-Height locations.
188
-         *
189
-         *  It is fairly expensive with its 4 floating point additions and 2 floating point
190
-         *  multiplications.
191
-         */
192
-        static FORCE_INLINE float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) {
193
-          return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1);
194
-        }
195
-
196
-        /**
197
-         * z_correction_for_x_on_horizontal_mesh_line is an optimization for
198
-         * the rare occasion when a point lies exactly on a Mesh line (denoted by index yi).
199
-         */
200
-        static inline float z_correction_for_x_on_horizontal_mesh_line(const float &lx0, const int x1_i, const int yi) {
201
-          if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) {
202
-            SERIAL_ECHOPAIR("? in z_correction_for_x_on_horizontal_mesh_line(lx0=", lx0);
203
-            SERIAL_ECHOPAIR(",x1_i=", x1_i);
204
-            SERIAL_ECHOPAIR(",yi=", yi);
205
-            SERIAL_CHAR(')');
206
-            SERIAL_EOL;
207
-            return NAN;
208
-          }
209
-
210
-          const float xratio = (RAW_X_POSITION(lx0) - mesh_index_to_xpos[x1_i]) * (1.0 / (MESH_X_DIST)),
211
-                      z1 = z_values[x1_i][yi];
212
-
213
-          return z1 + xratio * (z_values[x1_i + 1][yi] - z1);
214
-        }
215
-
216
-        //
217
-        // See comments above for z_correction_for_x_on_horizontal_mesh_line
218
-        //
219
-        static inline float z_correction_for_y_on_vertical_mesh_line(const float &ly0, const int xi, const int y1_i) {
220
-          if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) {
221
-            SERIAL_ECHOPAIR("? in get_z_correction_along_vertical_mesh_line_at_specific_x(ly0=", ly0);
222
-            SERIAL_ECHOPAIR(", x1_i=", xi);
223
-            SERIAL_ECHOPAIR(", yi=", y1_i);
224
-            SERIAL_CHAR(')');
225
-            SERIAL_EOL;
226
-            return NAN;
227
-          }
228
-
229
-          const float yratio = (RAW_Y_POSITION(ly0) - mesh_index_to_ypos[y1_i]) * (1.0 / (MESH_Y_DIST)),
230
-                      z1 = z_values[xi][y1_i];
231
-
232
-          return z1 + yratio * (z_values[xi][y1_i + 1] - z1);
233
-        }
234
-
235
-        /**
236
-         * This is the generic Z-Correction. It works anywhere within a Mesh Cell. It first
237
-         * does a linear interpolation along both of the bounding X-Mesh-Lines to find the
238
-         * Z-Height at both ends. Then it does a linear interpolation of these heights based
239
-         * on the Y position within the cell.
240
-         */
241
-        static float get_z_correction(const float &lx0, const float &ly0) {
242
-          const int8_t cx = get_cell_index_x(RAW_X_POSITION(lx0)),
243
-                       cy = get_cell_index_y(RAW_Y_POSITION(ly0));
244
-
245
-          if (!WITHIN(cx, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(cy, 0, GRID_MAX_POINTS_Y - 1)) {
246
-
247
-            SERIAL_ECHOPAIR("? in get_z_correction(lx0=", lx0);
248
-            SERIAL_ECHOPAIR(", ly0=", ly0);
249
-            SERIAL_CHAR(')');
250
-            SERIAL_EOL;
251
-
252
-            #if ENABLED(ULTRA_LCD)
253
-              strcpy(lcd_status_message, "get_z_correction() indexes out of range.");
254
-              lcd_quick_feedback();
255
-            #endif
256
-            return 0.0; // this used to return state.z_offset
257
-          }
258
-
259
-          const float z1 = calc_z0(RAW_X_POSITION(lx0),
260
-                        mesh_index_to_xpos[cx], z_values[cx][cy],
261
-                        mesh_index_to_xpos[cx + 1], z_values[cx + 1][cy]),
262
-                      z2 = calc_z0(RAW_X_POSITION(lx0),
263
-                        mesh_index_to_xpos[cx], z_values[cx][cy + 1],
264
-                        mesh_index_to_xpos[cx + 1], z_values[cx + 1][cy + 1]);
265
-                float z0 = calc_z0(RAW_Y_POSITION(ly0),
266
-                    mesh_index_to_ypos[cy], z1,
267
-                    mesh_index_to_ypos[cy + 1], z2);
268
-
269
-          #if ENABLED(DEBUG_LEVELING_FEATURE)
270
-            if (DEBUGGING(MESH_ADJUST)) {
271
-              SERIAL_ECHOPAIR(" raw get_z_correction(", lx0);
272
-              SERIAL_CHAR(',')
273
-              SERIAL_ECHO(ly0);
274
-              SERIAL_ECHOPGM(") = ");
275
-              SERIAL_ECHO_F(z0, 6);
276
-            }
277
-          #endif
278
-
279
-          #if ENABLED(DEBUG_LEVELING_FEATURE)
280
-            if (DEBUGGING(MESH_ADJUST)) {
281
-              SERIAL_ECHOPGM(" >>>---> ");
282
-              SERIAL_ECHO_F(z0, 6);
283
-              SERIAL_EOL;
284
-            }
285
-          #endif
286
-
287
-          if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN
288
-            z0 = 0.0;      // in ubl.z_values[][] and propagate through the
289
-                           // calculations. If our correction is NAN, we throw it out
290
-                           // because part of the Mesh is undefined and we don't have the
291
-                           // information we need to complete the height correction.
292
-
293
-            #if ENABLED(DEBUG_LEVELING_FEATURE)
294
-              if (DEBUGGING(MESH_ADJUST)) {
295
-                SERIAL_ECHOPAIR("??? Yikes!  NAN in get_z_correction(", lx0);
296
-                SERIAL_CHAR(',');
297
-                SERIAL_ECHO(ly0);
298
-                SERIAL_CHAR(')');
299
-                SERIAL_EOL;
300
-              }
301
-            #endif
302
-          }
303
-          return z0; // there used to be a +state.z_offset on this line
304
-        }
305
-
306
-        /**
307
-         * This function sets the Z leveling fade factor based on the given Z height,
308
-         * only re-calculating when necessary.
309
-         *
310
-         *  Returns 1.0 if g29_correction_fade_height is 0.0.
311
-         *  Returns 0.0 if Z is past the specified 'Fade Height'.
312
-         */
313
-        #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
314
-
315
-          static FORCE_INLINE float fade_scaling_factor_for_z(const float &lz) {
316
-            if (state.g29_correction_fade_height == 0.0) return 1.0;
317
-
318
-            static float fade_scaling_factor = 1.0;
319
-            const float rz = RAW_Z_POSITION(lz);
320
-            if (last_specified_z != rz) {
321
-              last_specified_z = rz;
322
-              fade_scaling_factor =
323
-                rz < state.g29_correction_fade_height
324
-                  ? 1.0 - (rz * state.g29_fade_height_multiplier)
325
-                  : 0.0;
326
-            }
327
-            return fade_scaling_factor;
328
-          }
329
-
330
-        #endif
331
-
332
-    }; // class unified_bed_leveling
333
-
334
-    extern unified_bed_leveling ubl;
335
-
336
-    #define UBL_LAST_EEPROM_INDEX (E2END - sizeof(unified_bed_leveling::state))
337
-
338
-  #endif // AUTO_BED_LEVELING_UBL
339
-#endif // UNIFIED_BED_LEVELING_H

+ 1
- 1
Marlin/configuration_store.cpp View File

@@ -165,7 +165,7 @@
165 165
 #endif
166 166
 
167 167
 #if ENABLED(AUTO_BED_LEVELING_UBL)
168
-  #include "UBL.h"
168
+  #include "ubl.h"
169 169
 #endif
170 170
 
171 171
 #if ENABLED(ABL_BILINEAR_SUBDIVISION)

Marlin/UBL_Bed_Leveling.cpp → Marlin/ubl.cpp View File

@@ -25,7 +25,7 @@
25 25
 
26 26
 #if ENABLED(AUTO_BED_LEVELING_UBL)
27 27
 
28
-  #include "UBL.h"
28
+  #include "ubl.h"
29 29
   #include "hex_print_routines.h"
30 30
 
31 31
   /**

+ 341
- 0
Marlin/ubl.h View File

@@ -0,0 +1,341 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+#ifndef UNIFIED_BED_LEVELING_H
24
+#define UNIFIED_BED_LEVELING_H
25
+
26
+#include "MarlinConfig.h"
27
+
28
+#if ENABLED(AUTO_BED_LEVELING_UBL)
29
+
30
+  #include "Marlin.h"
31
+  #include "math.h"
32
+  #include "vector_3.h"
33
+
34
+  #define UBL_VERSION "1.00"
35
+  #define UBL_OK false
36
+  #define UBL_ERR true
37
+
38
+  typedef struct {
39
+    int8_t x_index, y_index;
40
+    float distance; // When populated, the distance from the search location
41
+  } mesh_index_pair;
42
+
43
+  enum MeshPointType { INVALID, REAL, SET_IN_BITMAP };
44
+
45
+  void dump(char * const str, const float &f);
46
+  bool ubl_lcd_clicked();
47
+  void probe_entire_mesh(const float&, const float&, const bool, const bool, const bool);
48
+  void debug_current_and_destination(char *title);
49
+  void ubl_line_to_destination(const float&, uint8_t);
50
+  void manually_probe_remaining_mesh(const float&, const float&, const float&, const float&, const bool);
51
+  vector_3 tilt_mesh_based_on_3pts(const float&, const float&, const float&);
52
+  float measure_business_card_thickness(const float&);
53
+  mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const float&, const float&, const bool, unsigned int[16], bool);
54
+  void find_mean_mesh_height();
55
+  void shift_mesh_height();
56
+  bool g29_parameter_parsing();
57
+  void g29_what_command();
58
+  void g29_eeprom_dump();
59
+  void g29_compare_current_mesh_to_stored_mesh();
60
+  void fine_tune_mesh(const float&, const float&, const bool);
61
+  void bit_clear(uint16_t bits[16], uint8_t x, uint8_t y);
62
+  void bit_set(uint16_t bits[16], uint8_t x, uint8_t y);
63
+  bool is_bit_set(uint16_t bits[16], uint8_t x, uint8_t y);
64
+  char *ftostr43sign(const float&, char);
65
+
66
+  void gcode_G26();
67
+  void gcode_G28();
68
+  void gcode_G29();
69
+  extern char conv[9];
70
+
71
+  void save_ubl_active_state_and_disable();
72
+  void restore_ubl_active_state_and_leave();
73
+
74
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////
75
+
76
+  #if ENABLED(ULTRA_LCD)
77
+    extern char lcd_status_message[];
78
+    void lcd_quick_feedback();
79
+  #endif
80
+
81
+  enum MBLStatus { MBL_STATUS_NONE = 0, MBL_STATUS_HAS_MESH_BIT = 0, MBL_STATUS_ACTIVE_BIT = 1 };
82
+
83
+  #define MESH_X_DIST (float(UBL_MESH_MAX_X - (UBL_MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1))
84
+  #define MESH_Y_DIST (float(UBL_MESH_MAX_Y - (UBL_MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1))
85
+
86
+  typedef struct {
87
+    bool active = false;
88
+    float z_offset = 0.0;
89
+    int8_t eeprom_storage_slot = -1,
90
+           n_x = GRID_MAX_POINTS_X,
91
+           n_y = GRID_MAX_POINTS_Y;
92
+
93
+    float mesh_x_min = UBL_MESH_MIN_X,
94
+          mesh_y_min = UBL_MESH_MIN_Y,
95
+          mesh_x_max = UBL_MESH_MAX_X,
96
+          mesh_y_max = UBL_MESH_MAX_Y,
97
+          mesh_x_dist = MESH_X_DIST,
98
+          mesh_y_dist = MESH_Y_DIST;
99
+
100
+    #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
101
+      float g29_correction_fade_height = 10.0,
102
+            g29_fade_height_multiplier = 1.0 / 10.0; // It's cheaper to do a floating point multiply than divide,
103
+                                                     // so keep this value and its reciprocal.
104
+    #endif
105
+
106
+    // If you change this struct, adjust TOTAL_STRUCT_SIZE
107
+
108
+    #define TOTAL_STRUCT_SIZE 40 // Total size of the above fields
109
+
110
+    // padding provides space to add state variables without
111
+    // changing the location of data structures in the EEPROM.
112
+    // This is for compatibility with future versions to keep
113
+    // users from having to regenerate their mesh data.
114
+    unsigned char padding[64 - TOTAL_STRUCT_SIZE];
115
+
116
+  } ubl_state;
117
+
118
+  class unified_bed_leveling {
119
+    private:
120
+
121
+      static float last_specified_z;
122
+
123
+    public:
124
+
125
+      static ubl_state state, pre_initialized;
126
+
127
+      static float z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y],
128
+                   mesh_index_to_xpos[GRID_MAX_POINTS_X + 1], // +1 safety margin for now, until determinism prevails
129
+                   mesh_index_to_ypos[GRID_MAX_POINTS_Y + 1];
130
+
131
+      static bool g26_debug_flag,
132
+                  has_control_of_lcd_panel;
133
+
134
+      static int8_t eeprom_start;
135
+
136
+      static volatile int encoder_diff; // Volatile because it's changed at interrupt time.
137
+
138
+      unified_bed_leveling();
139
+
140
+      static void display_map(const int);
141
+
142
+      static void reset();
143
+      static void invalidate();
144
+
145
+      static void store_state();
146
+      static void load_state();
147
+      static void store_mesh(const int16_t);
148
+      static void load_mesh(const int16_t);
149
+
150
+      static bool sanity_check();
151
+
152
+      static FORCE_INLINE void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; }
153
+
154
+      static int8_t get_cell_index_x(const float &x) {
155
+        const int8_t cx = (x - (UBL_MESH_MIN_X)) * (1.0 / (MESH_X_DIST));
156
+        return constrain(cx, 0, (GRID_MAX_POINTS_X) - 1);   // -1 is appropriate if we want all movement to the X_MAX
157
+      }                                                     // position. But with this defined this way, it is possible
158
+                                                            // to extrapolate off of this point even further out. Probably
159
+                                                            // that is OK because something else should be keeping that from
160
+                                                            // happening and should not be worried about at this level.
161
+      static int8_t get_cell_index_y(const float &y) {
162
+        const int8_t cy = (y - (UBL_MESH_MIN_Y)) * (1.0 / (MESH_Y_DIST));
163
+        return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 1);   // -1 is appropriate if we want all movement to the Y_MAX
164
+      }                                                     // position. But with this defined this way, it is possible
165
+                                                            // to extrapolate off of this point even further out. Probably
166
+                                                            // that is OK because something else should be keeping that from
167
+                                                            // happening and should not be worried about at this level.
168
+
169
+      static int8_t find_closest_x_index(const float &x) {
170
+        const int8_t px = (x - (UBL_MESH_MIN_X) + (MESH_X_DIST) * 0.5) * (1.0 / (MESH_X_DIST));
171
+        return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1;
172
+      }
173
+
174
+      static int8_t find_closest_y_index(const float &y) {
175
+        const int8_t py = (y - (UBL_MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * (1.0 / (MESH_Y_DIST));
176
+        return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1;
177
+      }
178
+
179
+      /**
180
+       *                           z2   --|
181
+       *                 z0        |      |
182
+       *                  |        |      + (z2-z1)
183
+       *   z1             |        |      |
184
+       * ---+-------------+--------+--  --|
185
+       *   a1            a0        a2
186
+       *    |<---delta_a---------->|
187
+       *
188
+       *  calc_z0 is the basis for all the Mesh Based correction. It is used to
189
+       *  find the expected Z Height at a position between two known Z-Height locations.
190
+       *
191
+       *  It is fairly expensive with its 4 floating point additions and 2 floating point
192
+       *  multiplications.
193
+       */
194
+      static FORCE_INLINE float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) {
195
+        return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1);
196
+      }
197
+
198
+      /**
199
+       * z_correction_for_x_on_horizontal_mesh_line is an optimization for
200
+       * the rare occasion when a point lies exactly on a Mesh line (denoted by index yi).
201
+       */
202
+      static inline float z_correction_for_x_on_horizontal_mesh_line(const float &lx0, const int x1_i, const int yi) {
203
+        if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) {
204
+          SERIAL_ECHOPAIR("? in z_correction_for_x_on_horizontal_mesh_line(lx0=", lx0);
205
+          SERIAL_ECHOPAIR(",x1_i=", x1_i);
206
+          SERIAL_ECHOPAIR(",yi=", yi);
207
+          SERIAL_CHAR(')');
208
+          SERIAL_EOL;
209
+          return NAN;
210
+        }
211
+
212
+        const float xratio = (RAW_X_POSITION(lx0) - mesh_index_to_xpos[x1_i]) * (1.0 / (MESH_X_DIST)),
213
+                    z1 = z_values[x1_i][yi];
214
+
215
+        return z1 + xratio * (z_values[x1_i + 1][yi] - z1);
216
+      }
217
+
218
+      //
219
+      // See comments above for z_correction_for_x_on_horizontal_mesh_line
220
+      //
221
+      static inline float z_correction_for_y_on_vertical_mesh_line(const float &ly0, const int xi, const int y1_i) {
222
+        if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) {
223
+          SERIAL_ECHOPAIR("? in get_z_correction_along_vertical_mesh_line_at_specific_x(ly0=", ly0);
224
+          SERIAL_ECHOPAIR(", x1_i=", xi);
225
+          SERIAL_ECHOPAIR(", yi=", y1_i);
226
+          SERIAL_CHAR(')');
227
+          SERIAL_EOL;
228
+          return NAN;
229
+        }
230
+
231
+        const float yratio = (RAW_Y_POSITION(ly0) - mesh_index_to_ypos[y1_i]) * (1.0 / (MESH_Y_DIST)),
232
+                    z1 = z_values[xi][y1_i];
233
+
234
+        return z1 + yratio * (z_values[xi][y1_i + 1] - z1);
235
+      }
236
+
237
+      /**
238
+       * This is the generic Z-Correction. It works anywhere within a Mesh Cell. It first
239
+       * does a linear interpolation along both of the bounding X-Mesh-Lines to find the
240
+       * Z-Height at both ends. Then it does a linear interpolation of these heights based
241
+       * on the Y position within the cell.
242
+       */
243
+      static float get_z_correction(const float &lx0, const float &ly0) {
244
+        const int8_t cx = get_cell_index_x(RAW_X_POSITION(lx0)),
245
+                     cy = get_cell_index_y(RAW_Y_POSITION(ly0));
246
+
247
+        if (!WITHIN(cx, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(cy, 0, GRID_MAX_POINTS_Y - 1)) {
248
+
249
+          SERIAL_ECHOPAIR("? in get_z_correction(lx0=", lx0);
250
+          SERIAL_ECHOPAIR(", ly0=", ly0);
251
+          SERIAL_CHAR(')');
252
+          SERIAL_EOL;
253
+
254
+          #if ENABLED(ULTRA_LCD)
255
+            strcpy(lcd_status_message, "get_z_correction() indexes out of range.");
256
+            lcd_quick_feedback();
257
+          #endif
258
+          return 0.0; // this used to return state.z_offset
259
+        }
260
+
261
+        const float z1 = calc_z0(RAW_X_POSITION(lx0),
262
+                      mesh_index_to_xpos[cx], z_values[cx][cy],
263
+                      mesh_index_to_xpos[cx + 1], z_values[cx + 1][cy]),
264
+                    z2 = calc_z0(RAW_X_POSITION(lx0),
265
+                      mesh_index_to_xpos[cx], z_values[cx][cy + 1],
266
+                      mesh_index_to_xpos[cx + 1], z_values[cx + 1][cy + 1]);
267
+              float z0 = calc_z0(RAW_Y_POSITION(ly0),
268
+                  mesh_index_to_ypos[cy], z1,
269
+                  mesh_index_to_ypos[cy + 1], z2);
270
+
271
+        #if ENABLED(DEBUG_LEVELING_FEATURE)
272
+          if (DEBUGGING(MESH_ADJUST)) {
273
+            SERIAL_ECHOPAIR(" raw get_z_correction(", lx0);
274
+            SERIAL_CHAR(',')
275
+            SERIAL_ECHO(ly0);
276
+            SERIAL_ECHOPGM(") = ");
277
+            SERIAL_ECHO_F(z0, 6);
278
+          }
279
+        #endif
280
+
281
+        #if ENABLED(DEBUG_LEVELING_FEATURE)
282
+          if (DEBUGGING(MESH_ADJUST)) {
283
+            SERIAL_ECHOPGM(" >>>---> ");
284
+            SERIAL_ECHO_F(z0, 6);
285
+            SERIAL_EOL;
286
+          }
287
+        #endif
288
+
289
+        if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN
290
+          z0 = 0.0;      // in ubl.z_values[][] and propagate through the
291
+                         // calculations. If our correction is NAN, we throw it out
292
+                         // because part of the Mesh is undefined and we don't have the
293
+                         // information we need to complete the height correction.
294
+
295
+          #if ENABLED(DEBUG_LEVELING_FEATURE)
296
+            if (DEBUGGING(MESH_ADJUST)) {
297
+              SERIAL_ECHOPAIR("??? Yikes!  NAN in get_z_correction(", lx0);
298
+              SERIAL_CHAR(',');
299
+              SERIAL_ECHO(ly0);
300
+              SERIAL_CHAR(')');
301
+              SERIAL_EOL;
302
+            }
303
+          #endif
304
+        }
305
+        return z0; // there used to be a +state.z_offset on this line
306
+      }
307
+
308
+      /**
309
+       * This function sets the Z leveling fade factor based on the given Z height,
310
+       * only re-calculating when necessary.
311
+       *
312
+       *  Returns 1.0 if g29_correction_fade_height is 0.0.
313
+       *  Returns 0.0 if Z is past the specified 'Fade Height'.
314
+       */
315
+      #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
316
+
317
+        static FORCE_INLINE float fade_scaling_factor_for_z(const float &lz) {
318
+          if (state.g29_correction_fade_height == 0.0) return 1.0;
319
+
320
+          static float fade_scaling_factor = 1.0;
321
+          const float rz = RAW_Z_POSITION(lz);
322
+          if (last_specified_z != rz) {
323
+            last_specified_z = rz;
324
+            fade_scaling_factor =
325
+              rz < state.g29_correction_fade_height
326
+                ? 1.0 - (rz * state.g29_fade_height_multiplier)
327
+                : 0.0;
328
+          }
329
+          return fade_scaling_factor;
330
+        }
331
+
332
+      #endif
333
+
334
+  }; // class unified_bed_leveling
335
+
336
+  extern unified_bed_leveling ubl;
337
+
338
+  #define UBL_LAST_EEPROM_INDEX (E2END - sizeof(unified_bed_leveling::state))
339
+
340
+#endif // AUTO_BED_LEVELING_UBL
341
+#endif // UNIFIED_BED_LEVELING_H

Marlin/UBL_G29.cpp → Marlin/ubl_G29.cpp View File

@@ -26,7 +26,7 @@
26 26
   //#include "vector_3.h"
27 27
   //#include "qr_solve.h"
28 28
 
29
-  #include "UBL.h"
29
+  #include "ubl.h"
30 30
   #include "Marlin.h"
31 31
   #include "hex_print_routines.h"
32 32
   #include "configuration_store.h"

Marlin/UBL_line_to_destination.cpp → Marlin/ubl_motion.cpp View File

@@ -24,7 +24,7 @@
24 24
 #if ENABLED(AUTO_BED_LEVELING_UBL)
25 25
 
26 26
   #include "Marlin.h"
27
-  #include "UBL.h"
27
+  #include "ubl.h"
28 28
   #include "planner.h"
29 29
   #include <avr/io.h>
30 30
   #include <math.h>

+ 1
- 1
Marlin/ultralcd.cpp View File

@@ -122,7 +122,7 @@ uint16_t max_display_update_time = 0;
122 122
   int32_t lastEncoderMovementMillis;
123 123
 
124 124
   #if ENABLED(AUTO_BED_LEVELING_UBL)
125
-    #include "UBL.h"
125
+    #include "ubl.h"
126 126
   #endif
127 127
 
128 128
   #if HAS_POWER_SWITCH

Loading…
Cancel
Save