|
@@ -25,21 +25,24 @@
|
25
|
25
|
|
26
|
26
|
#ifdef FTDI_BED_MESH_SCREEN
|
27
|
27
|
|
|
28
|
+#include "../ftdi_eve_lib/extras/adjuster_widget.h"
|
|
29
|
+
|
28
|
30
|
using namespace FTDI;
|
29
|
31
|
using namespace Theme;
|
30
|
32
|
using namespace ExtUI;
|
31
|
33
|
|
32
|
34
|
constexpr static BedMeshScreenData &mydata = screen_data.BedMeshScreen;
|
|
35
|
+constexpr static float gaugeThickness = 0.25;
|
33
|
36
|
|
34
|
37
|
#if ENABLED(TOUCH_UI_PORTRAIT)
|
35
|
|
- #define GRID_COLS 2
|
|
38
|
+ #define GRID_COLS 3
|
36
|
39
|
#define GRID_ROWS 10
|
37
|
40
|
|
38
|
|
- #define MESH_POS BTN_POS(1, 2), BTN_SIZE(2,5)
|
39
|
|
- #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(2,1)
|
|
41
|
+ #define MESH_POS BTN_POS(1, 2), BTN_SIZE(3,5)
|
|
42
|
+ #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(3,1)
|
40
|
43
|
#define Z_LABEL_POS BTN_POS(1, 8), BTN_SIZE(1,1)
|
41
|
|
- #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(1,1)
|
42
|
|
- #define OKAY_POS BTN_POS(1,10), BTN_SIZE(2,1)
|
|
44
|
+ #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(2,1)
|
|
45
|
+ #define OKAY_POS BTN_POS(1,10), BTN_SIZE(3,1)
|
43
|
46
|
#else
|
44
|
47
|
#define GRID_COLS 5
|
45
|
48
|
#define GRID_ROWS 5
|
|
@@ -198,12 +201,12 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::
|
198
|
201
|
|
199
|
202
|
if (opts & USE_HIGHLIGHT) {
|
200
|
203
|
const uint8_t tag = mydata.highlightedTag;
|
201
|
|
- uint8_t x, y;
|
202
|
|
- if (tagToPoint(tag, x, y)) {
|
|
204
|
+ xy_uint8_t pt;
|
|
205
|
+ if (tagToPoint(tag, pt)) {
|
203
|
206
|
cmd.cmd(COLOR_A(128))
|
204
|
207
|
.cmd(POINT_SIZE(basePointSize * 6))
|
205
|
208
|
.cmd(BEGIN(POINTS))
|
206
|
|
- .tag(tag).cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y))));
|
|
209
|
+ .tag(tag).cmd(VERTEX2F(TRANSFORM(pt.x, pt.y, HEIGHT(pt.x, pt.y))));
|
207
|
210
|
}
|
208
|
211
|
}
|
209
|
212
|
cmd.cmd(END());
|
|
@@ -214,43 +217,68 @@ uint8_t BedMeshScreen::pointToTag(uint8_t x, uint8_t y) {
|
214
|
217
|
return y * (GRID_MAX_POINTS_X) + x + 10;
|
215
|
218
|
}
|
216
|
219
|
|
217
|
|
-bool BedMeshScreen::tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y) {
|
|
220
|
+bool BedMeshScreen::tagToPoint(uint8_t tag, xy_uint8_t &pt) {
|
218
|
221
|
if (tag < 10) return false;
|
219
|
|
- x = (tag - 10) % (GRID_MAX_POINTS_X);
|
220
|
|
- y = (tag - 10) / (GRID_MAX_POINTS_X);
|
|
222
|
+ pt.x = (tag - 10) % (GRID_MAX_POINTS_X);
|
|
223
|
+ pt.y = (tag - 10) / (GRID_MAX_POINTS_X);
|
221
|
224
|
return true;
|
222
|
225
|
}
|
223
|
226
|
|
224
|
227
|
void BedMeshScreen::onEntry() {
|
225
|
228
|
mydata.highlightedTag = 0;
|
|
229
|
+ mydata.zAdjustment = 0;
|
226
|
230
|
mydata.count = GRID_MAX_POINTS;
|
227
|
231
|
mydata.message = mydata.MSG_NONE;
|
228
|
232
|
BaseScreen::onEntry();
|
229
|
233
|
}
|
230
|
234
|
|
231
|
|
-float BedMeshScreen::getHightlightedValue() {
|
232
|
|
- if (mydata.highlightedTag) {
|
233
|
|
- xy_uint8_t pt;
|
234
|
|
- tagToPoint(mydata.highlightedTag, pt.x, pt.y);
|
235
|
|
- return ExtUI::getMeshPoint(pt);
|
|
235
|
+float BedMeshScreen::getHighlightedValue(bool nanAsZero) {
|
|
236
|
+ xy_uint8_t pt;
|
|
237
|
+ if (tagToPoint(mydata.highlightedTag, pt)) {
|
|
238
|
+ const float val = ExtUI::getMeshPoint(pt);
|
|
239
|
+ return (isnan(val) && nanAsZero) ? 0 : val;
|
236
|
240
|
}
|
237
|
241
|
return NAN;
|
238
|
242
|
}
|
239
|
243
|
|
240
|
|
-void BedMeshScreen::drawHighlightedPointValue() {
|
241
|
|
- char str[16];
|
242
|
|
- const float val = getHightlightedValue();
|
243
|
|
- const bool isGood = !isnan(val);
|
244
|
|
- if (isGood)
|
245
|
|
- dtostrf(val, 5, 3, str);
|
246
|
|
- else
|
247
|
|
- strcpy_P(str, PSTR("-"));
|
|
244
|
+void BedMeshScreen::setHighlightedValue(float value) {
|
|
245
|
+ xy_uint8_t pt;
|
|
246
|
+ if (tagToPoint(mydata.highlightedTag, pt))
|
|
247
|
+ ExtUI::setMeshPoint(pt, value);
|
|
248
|
+}
|
|
249
|
+
|
|
250
|
+void BedMeshScreen::moveToHighlightedValue() {
|
|
251
|
+ xy_uint8_t pt;
|
|
252
|
+ if (tagToPoint(mydata.highlightedTag, pt))
|
|
253
|
+ ExtUI::moveToMeshPoint(pt, gaugeThickness + mydata.zAdjustment);
|
|
254
|
+}
|
|
255
|
+
|
|
256
|
+void BedMeshScreen::adjustHighlightedValue(float increment) {
|
|
257
|
+ mydata.zAdjustment += increment;
|
|
258
|
+ moveToHighlightedValue();
|
|
259
|
+}
|
|
260
|
+
|
|
261
|
+void BedMeshScreen::saveAdjustedHighlightedValue() {
|
|
262
|
+ if(mydata.zAdjustment) {
|
|
263
|
+ BedMeshScreen::setHighlightedValue(BedMeshScreen::getHighlightedValue(true) + mydata.zAdjustment);
|
|
264
|
+ mydata.zAdjustment = 0;
|
|
265
|
+ }
|
|
266
|
+}
|
248
|
267
|
|
|
268
|
+void BedMeshScreen::changeHighlightedValue(uint8_t tag) {
|
|
269
|
+ saveAdjustedHighlightedValue();
|
|
270
|
+ mydata.highlightedTag = tag;
|
|
271
|
+ moveToHighlightedValue();
|
|
272
|
+}
|
|
273
|
+
|
|
274
|
+void BedMeshScreen::drawHighlightedPointValue() {
|
249
|
275
|
CommandProcessor cmd;
|
250
|
276
|
cmd.font(Theme::font_medium)
|
|
277
|
+ .colors(normal_btn)
|
251
|
278
|
.text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z))
|
252
|
|
- .text(Z_VALUE_POS, str)
|
253
|
|
- .colors(action_btn)
|
|
279
|
+ .font(font_small);
|
|
280
|
+ draw_adjuster(cmd, Z_VALUE_POS, 2, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3);
|
|
281
|
+ cmd.colors(action_btn)
|
254
|
282
|
.tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY))
|
255
|
283
|
.tag(0);
|
256
|
284
|
|
|
@@ -292,19 +320,23 @@ void BedMeshScreen::onRedraw(draw_mode_t what) {
|
292
|
320
|
}
|
293
|
321
|
}
|
294
|
322
|
|
295
|
|
-bool BedMeshScreen::onTouchStart(uint8_t tag) {
|
296
|
|
- mydata.highlightedTag = tag;
|
297
|
|
- return true;
|
298
|
|
-}
|
299
|
|
-
|
300
|
323
|
bool BedMeshScreen::onTouchEnd(uint8_t tag) {
|
|
324
|
+ constexpr float increment = 0.01;
|
301
|
325
|
switch (tag) {
|
302
|
326
|
case 1:
|
|
327
|
+ saveAdjustedHighlightedValue();
|
|
328
|
+ injectCommands_P(PSTR("G29 S1"));
|
303
|
329
|
GOTO_PREVIOUS();
|
304
|
330
|
return true;
|
|
331
|
+ case 2: adjustHighlightedValue(-increment); break;
|
|
332
|
+ case 3: adjustHighlightedValue( increment); break;
|
305
|
333
|
default:
|
306
|
|
- return false;
|
|
334
|
+ if (tag >= 10)
|
|
335
|
+ changeHighlightedValue(tag);
|
|
336
|
+ else
|
|
337
|
+ return false;
|
307
|
338
|
}
|
|
339
|
+ return true;
|
308
|
340
|
}
|
309
|
341
|
|
310
|
342
|
void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) {
|
|
@@ -341,4 +373,11 @@ void BedMeshScreen::startMeshProbe() {
|
341
|
373
|
injectCommands_P(PSTR(BED_LEVELING_COMMANDS));
|
342
|
374
|
}
|
343
|
375
|
|
|
376
|
+void BedMeshScreen::showMeshEditor() {
|
|
377
|
+ SpinnerDialogBox::enqueueAndWait_P(ExtUI::isMachineHomed() ? F("M420 S1") : F("G28\nM420 S1"));
|
|
378
|
+ // After the spinner, go to this screen.
|
|
379
|
+ current_screen.forget();
|
|
380
|
+ PUSH_SCREEN(BedMeshScreen);
|
|
381
|
+}
|
|
382
|
+
|
344
|
383
|
#endif // FTDI_BED_MESH_SCREEN
|