|
@@ -117,7 +117,7 @@ static void lcd_status_screen();
|
117
|
117
|
#endif
|
118
|
118
|
|
119
|
119
|
/* Different types of actions that can be used in menu items. */
|
120
|
|
- static void menu_action_back(menuFunc_t data);
|
|
120
|
+ static void menu_action_back();
|
121
|
121
|
static void menu_action_submenu(menuFunc_t data);
|
122
|
122
|
static void menu_action_gcode(const char* pgcode);
|
123
|
123
|
static void menu_action_function(menuFunc_t data);
|
|
@@ -188,9 +188,9 @@ static void lcd_status_screen();
|
188
|
188
|
* menu_action_[type](arg3...)
|
189
|
189
|
*
|
190
|
190
|
* Examples:
|
191
|
|
- * MENU_ITEM(back, MSG_WATCH, lcd_status_screen)
|
192
|
|
- * lcd_implementation_drawmenu_back(sel, row, PSTR(MSG_WATCH), lcd_status_screen)
|
193
|
|
- * menu_action_back(lcd_status_screen)
|
|
191
|
+ * MENU_ITEM(back, MSG_WATCH)
|
|
192
|
+ * lcd_implementation_drawmenu_back(sel, row, PSTR(MSG_WATCH))
|
|
193
|
+ * menu_action_back()
|
194
|
194
|
*
|
195
|
195
|
* MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause)
|
196
|
196
|
* lcd_implementation_drawmenu_function(sel, row, PSTR(MSG_PAUSE_PRINT), lcd_sdcard_pause)
|
|
@@ -267,14 +267,25 @@ static void lcd_status_screen();
|
267
|
267
|
uint8_t currentMenuViewOffset; /* scroll offset in the current menu */
|
268
|
268
|
millis_t next_button_update_ms;
|
269
|
269
|
uint8_t lastEncoderBits;
|
270
|
|
- uint32_t encoderPosition, prevEncoderPosition;
|
|
270
|
+ uint32_t encoderPosition;
|
271
|
271
|
#if PIN_EXISTS(SD_DETECT)
|
272
|
272
|
uint8_t lcd_sd_status;
|
273
|
273
|
#endif
|
274
|
274
|
|
275
|
275
|
#endif // ULTIPANEL
|
276
|
276
|
|
277
|
|
-menuFunc_t currentMenu = lcd_status_screen; /* function pointer to the currently active menu */
|
|
277
|
+typedef struct {
|
|
278
|
+ menuFunc_t menu_function;
|
|
279
|
+ #if ENABLED(ULTIPANEL)
|
|
280
|
+ uint32_t encoder_position;
|
|
281
|
+ #endif
|
|
282
|
+} menuPosition;
|
|
283
|
+
|
|
284
|
+menuFunc_t currentMenu = lcd_status_screen; // pointer to the currently active menu handler
|
|
285
|
+
|
|
286
|
+menuPosition menu_history[10];
|
|
287
|
+uint8_t menu_history_depth = 0;
|
|
288
|
+
|
278
|
289
|
millis_t next_lcd_update_ms;
|
279
|
290
|
uint8_t lcd_status_update_delay;
|
280
|
291
|
bool ignore_click = false;
|
|
@@ -294,7 +305,6 @@ uint8_t lcdDrawUpdate = LCD_DRAW_UPDATE_CLEAR_CALL_REDRAW; // Set 1 or 2 when th
|
294
|
305
|
const char* editLabel;
|
295
|
306
|
void* editValue;
|
296
|
307
|
int32_t minEditValue, maxEditValue;
|
297
|
|
-menuFunc_t prevMenu = NULL; // return here after editing (also prevEncoderPosition)
|
298
|
308
|
menuFunc_t callbackFunc; // call this after editing
|
299
|
309
|
|
300
|
310
|
// place-holders for Ki and Kd edits
|
|
@@ -302,6 +312,7 @@ float raw_Ki, raw_Kd;
|
302
|
312
|
|
303
|
313
|
/**
|
304
|
314
|
* General function to go directly to a menu
|
|
315
|
+ * Remembers the previous position
|
305
|
316
|
*/
|
306
|
317
|
static void lcd_goto_menu(menuFunc_t menu, const bool feedback = false, const uint32_t encoder = 0) {
|
307
|
318
|
if (currentMenu != menu) {
|
|
@@ -311,26 +322,40 @@ static void lcd_goto_menu(menuFunc_t menu, const bool feedback = false, const ui
|
311
|
322
|
encoderPosition = encoder;
|
312
|
323
|
if (feedback) lcd_quick_feedback();
|
313
|
324
|
#endif
|
314
|
|
- // For LCD_PROGRESS_BAR re-initialize the custom characters
|
|
325
|
+ if (menu == lcd_status_screen) menu_history_depth = 0;
|
315
|
326
|
#if ENABLED(LCD_PROGRESS_BAR)
|
|
327
|
+ // For LCD_PROGRESS_BAR re-initialize custom characters
|
316
|
328
|
lcd_set_custom_characters(menu == lcd_status_screen);
|
317
|
329
|
#endif
|
318
|
330
|
}
|
319
|
331
|
}
|
320
|
332
|
|
321
|
|
-inline void lcd_save_previous_menu() {
|
322
|
|
- prevMenu = currentMenu;
|
323
|
|
- #if ENABLED(ULTIPANEL)
|
324
|
|
- prevEncoderPosition = encoderPosition;
|
325
|
|
- #endif
|
|
333
|
+static void lcd_return_to_status() {
|
|
334
|
+ defer_return_to_status = false;
|
|
335
|
+ lcd_goto_menu(lcd_status_screen);
|
326
|
336
|
}
|
327
|
337
|
|
328
|
|
-static void lcd_goto_previous_menu() {
|
329
|
|
- lcd_goto_menu(prevMenu, true
|
|
338
|
+inline void lcd_save_previous_menu() {
|
|
339
|
+ if (menu_history_depth < COUNT(menu_history)) {
|
|
340
|
+ menu_history[menu_history_depth].menu_function = currentMenu;
|
330
|
341
|
#if ENABLED(ULTIPANEL)
|
331
|
|
- , prevEncoderPosition
|
|
342
|
+ menu_history[menu_history_depth].encoder_position = encoderPosition;
|
332
|
343
|
#endif
|
333
|
|
- );
|
|
344
|
+ ++menu_history_depth;
|
|
345
|
+ }
|
|
346
|
+}
|
|
347
|
+
|
|
348
|
+static void lcd_goto_previous_menu() {
|
|
349
|
+ if (menu_history_depth > 0) {
|
|
350
|
+ --menu_history_depth;
|
|
351
|
+ lcd_goto_menu(menu_history[menu_history_depth].menu_function, true
|
|
352
|
+ #if ENABLED(ULTIPANEL)
|
|
353
|
+ , menu_history[menu_history_depth].encoder_position
|
|
354
|
+ #endif
|
|
355
|
+ );
|
|
356
|
+ }
|
|
357
|
+ else
|
|
358
|
+ lcd_return_to_status();
|
334
|
359
|
}
|
335
|
360
|
|
336
|
361
|
/**
|
|
@@ -439,11 +464,6 @@ static void lcd_status_screen() {
|
439
|
464
|
|
440
|
465
|
#if ENABLED(ULTIPANEL)
|
441
|
466
|
|
442
|
|
-static void lcd_return_to_status() {
|
443
|
|
- defer_return_to_status = false;
|
444
|
|
- lcd_goto_menu(lcd_status_screen);
|
445
|
|
-}
|
446
|
|
-
|
447
|
467
|
#if ENABLED(SDSUPPORT)
|
448
|
468
|
|
449
|
469
|
static void lcd_sdcard_pause() { card.pauseSDPrint(); }
|
|
@@ -469,7 +489,7 @@ static void lcd_return_to_status() {
|
469
|
489
|
|
470
|
490
|
static void lcd_main_menu() {
|
471
|
491
|
START_MENU();
|
472
|
|
- MENU_ITEM(back, MSG_WATCH, lcd_status_screen);
|
|
492
|
+ MENU_ITEM(back, MSG_WATCH);
|
473
|
493
|
if (movesplanned() || IS_SD_PRINTING) {
|
474
|
494
|
MENU_ITEM(submenu, MSG_TUNE, lcd_tune_menu);
|
475
|
495
|
}
|
|
@@ -612,7 +632,7 @@ static void lcd_tune_menu() {
|
612
|
632
|
//
|
613
|
633
|
// ^ Main
|
614
|
634
|
//
|
615
|
|
- MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
|
|
635
|
+ MENU_ITEM(back, MSG_MAIN);
|
616
|
636
|
|
617
|
637
|
//
|
618
|
638
|
// Speed:
|
|
@@ -778,7 +798,7 @@ void _lcd_preheat(int endnum, const float temph, const float tempb, const int fa
|
778
|
798
|
|
779
|
799
|
static void lcd_preheat_pla_menu() {
|
780
|
800
|
START_MENU();
|
781
|
|
- MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu);
|
|
801
|
+ MENU_ITEM(back, MSG_PREPARE);
|
782
|
802
|
#if EXTRUDERS == 1
|
783
|
803
|
MENU_ITEM(function, MSG_PREHEAT_PLA, lcd_preheat_pla0);
|
784
|
804
|
#else
|
|
@@ -800,7 +820,7 @@ void _lcd_preheat(int endnum, const float temph, const float tempb, const int fa
|
800
|
820
|
|
801
|
821
|
static void lcd_preheat_abs_menu() {
|
802
|
822
|
START_MENU();
|
803
|
|
- MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu);
|
|
823
|
+ MENU_ITEM(back, MSG_PREPARE);
|
804
|
824
|
#if EXTRUDERS == 1
|
805
|
825
|
MENU_ITEM(function, MSG_PREHEAT_ABS, lcd_preheat_abs0);
|
806
|
826
|
#else
|
|
@@ -842,7 +862,7 @@ static void lcd_prepare_menu() {
|
842
|
862
|
//
|
843
|
863
|
// ^ Main
|
844
|
864
|
//
|
845
|
|
- MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
|
|
865
|
+ MENU_ITEM(back, MSG_MAIN);
|
846
|
866
|
|
847
|
867
|
//
|
848
|
868
|
// Auto Home
|
|
@@ -918,7 +938,7 @@ static void lcd_prepare_menu() {
|
918
|
938
|
|
919
|
939
|
static void lcd_delta_calibrate_menu() {
|
920
|
940
|
START_MENU();
|
921
|
|
- MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
|
|
941
|
+ MENU_ITEM(back, MSG_MAIN);
|
922
|
942
|
MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28"));
|
923
|
943
|
MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_X, PSTR("G0 F8000 X-77.94 Y-45 Z0"));
|
924
|
944
|
MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_Y, PSTR("G0 F8000 X77.94 Y-45 Z0"));
|
|
@@ -1030,7 +1050,7 @@ static void lcd_move_e(
|
1030
|
1050
|
|
1031
|
1051
|
static void lcd_move_menu_axis() {
|
1032
|
1052
|
START_MENU();
|
1033
|
|
- MENU_ITEM(back, MSG_MOVE_AXIS, lcd_move_menu);
|
|
1053
|
+ MENU_ITEM(back, MSG_MOVE_AXIS);
|
1034
|
1054
|
MENU_ITEM(submenu, MSG_MOVE_X, lcd_move_x);
|
1035
|
1055
|
MENU_ITEM(submenu, MSG_MOVE_Y, lcd_move_y);
|
1036
|
1056
|
if (move_menu_scale < 10.0) {
|
|
@@ -1072,7 +1092,7 @@ static void lcd_move_menu_01mm() {
|
1072
|
1092
|
|
1073
|
1093
|
static void lcd_move_menu() {
|
1074
|
1094
|
START_MENU();
|
1075
|
|
- MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu);
|
|
1095
|
+ MENU_ITEM(back, MSG_PREPARE);
|
1076
|
1096
|
MENU_ITEM(submenu, MSG_MOVE_10MM, lcd_move_menu_10mm);
|
1077
|
1097
|
MENU_ITEM(submenu, MSG_MOVE_1MM, lcd_move_menu_1mm);
|
1078
|
1098
|
MENU_ITEM(submenu, MSG_MOVE_01MM, lcd_move_menu_01mm);
|
|
@@ -1088,7 +1108,7 @@ static void lcd_move_menu() {
|
1088
|
1108
|
|
1089
|
1109
|
static void lcd_control_menu() {
|
1090
|
1110
|
START_MENU();
|
1091
|
|
- MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
|
|
1111
|
+ MENU_ITEM(back, MSG_MAIN);
|
1092
|
1112
|
MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_control_temperature_menu);
|
1093
|
1113
|
MENU_ITEM(submenu, MSG_MOTION, lcd_control_motion_menu);
|
1094
|
1114
|
MENU_ITEM(submenu, MSG_VOLUMETRIC, lcd_control_volumetric_menu);
|
|
@@ -1191,7 +1211,7 @@ static void lcd_control_temperature_menu() {
|
1191
|
1211
|
//
|
1192
|
1212
|
// ^ Control
|
1193
|
1213
|
//
|
1194
|
|
- MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
|
|
1214
|
+ MENU_ITEM(back, MSG_CONTROL);
|
1195
|
1215
|
|
1196
|
1216
|
//
|
1197
|
1217
|
// Nozzle:
|
|
@@ -1323,7 +1343,7 @@ static void lcd_control_temperature_menu() {
|
1323
|
1343
|
*/
|
1324
|
1344
|
static void lcd_control_temperature_preheat_pla_settings_menu() {
|
1325
|
1345
|
START_MENU();
|
1326
|
|
- MENU_ITEM(back, MSG_TEMPERATURE, lcd_control_temperature_menu);
|
|
1346
|
+ MENU_ITEM(back, MSG_TEMPERATURE);
|
1327
|
1347
|
MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &plaPreheatFanSpeed, 0, 255);
|
1328
|
1348
|
#if TEMP_SENSOR_0 != 0
|
1329
|
1349
|
MENU_ITEM_EDIT(int3, MSG_NOZZLE, &plaPreheatHotendTemp, HEATER_0_MINTEMP, HEATER_0_MAXTEMP - 15);
|
|
@@ -1344,7 +1364,7 @@ static void lcd_control_temperature_preheat_pla_settings_menu() {
|
1344
|
1364
|
*/
|
1345
|
1365
|
static void lcd_control_temperature_preheat_abs_settings_menu() {
|
1346
|
1366
|
START_MENU();
|
1347
|
|
- MENU_ITEM(back, MSG_TEMPERATURE, lcd_control_temperature_menu);
|
|
1367
|
+ MENU_ITEM(back, MSG_TEMPERATURE);
|
1348
|
1368
|
MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &absPreheatFanSpeed, 0, 255);
|
1349
|
1369
|
#if TEMP_SENSOR_0 != 0
|
1350
|
1370
|
MENU_ITEM_EDIT(int3, MSG_NOZZLE, &absPreheatHotendTemp, HEATER_0_MINTEMP, HEATER_0_MAXTEMP - 15);
|
|
@@ -1365,7 +1385,7 @@ static void lcd_control_temperature_preheat_abs_settings_menu() {
|
1365
|
1385
|
*/
|
1366
|
1386
|
static void lcd_control_motion_menu() {
|
1367
|
1387
|
START_MENU();
|
1368
|
|
- MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
|
|
1388
|
+ MENU_ITEM(back, MSG_CONTROL);
|
1369
|
1389
|
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
|
1370
|
1390
|
MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
|
1371
|
1391
|
#endif
|
|
@@ -1418,7 +1438,7 @@ static void lcd_control_motion_menu() {
|
1418
|
1438
|
*/
|
1419
|
1439
|
static void lcd_control_volumetric_menu() {
|
1420
|
1440
|
START_MENU();
|
1421
|
|
- MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
|
|
1441
|
+ MENU_ITEM(back, MSG_CONTROL);
|
1422
|
1442
|
|
1423
|
1443
|
MENU_ITEM_EDIT_CALLBACK(bool, MSG_VOLUMETRIC_ENABLED, &volumetric_enabled, calculate_volumetric_multipliers);
|
1424
|
1444
|
|
|
@@ -1479,7 +1499,7 @@ static void lcd_control_volumetric_menu() {
|
1479
|
1499
|
#if ENABLED(FWRETRACT)
|
1480
|
1500
|
static void lcd_control_retract_menu() {
|
1481
|
1501
|
START_MENU();
|
1482
|
|
- MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
|
|
1502
|
+ MENU_ITEM(back, MSG_CONTROL);
|
1483
|
1503
|
MENU_ITEM_EDIT(bool, MSG_AUTORETRACT, &autoretract_enabled);
|
1484
|
1504
|
MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT, &retract_length, 0, 100);
|
1485
|
1505
|
#if EXTRUDERS > 1
|
|
@@ -1520,7 +1540,7 @@ static void lcd_control_volumetric_menu() {
|
1520
|
1540
|
if (lcdDrawUpdate == 0 && LCD_CLICKED == 0) return; // nothing to do (so don't thrash the SD card)
|
1521
|
1541
|
uint16_t fileCnt = card.getnrfilenames();
|
1522
|
1542
|
START_MENU();
|
1523
|
|
- MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
|
|
1543
|
+ MENU_ITEM(back, MSG_MAIN);
|
1524
|
1544
|
card.getWorkDirName();
|
1525
|
1545
|
if (card.filename[0] == '/') {
|
1526
|
1546
|
#if !PIN_EXISTS(SD_DETECT)
|
|
@@ -1712,7 +1732,7 @@ void lcd_quick_feedback() {
|
1712
|
1732
|
* Menu actions
|
1713
|
1733
|
*
|
1714
|
1734
|
*/
|
1715
|
|
-static void menu_action_back(menuFunc_t func) { lcd_goto_menu(func); }
|
|
1735
|
+static void menu_action_back() { lcd_goto_previous_menu(); }
|
1716
|
1736
|
static void menu_action_submenu(menuFunc_t func) { lcd_save_previous_menu(); lcd_goto_menu(func); }
|
1717
|
1737
|
static void menu_action_gcode(const char* pgcode) { enqueue_and_echo_commands_P(pgcode); }
|
1718
|
1738
|
static void menu_action_function(menuFunc_t func) { (*func)(); }
|
|
@@ -2600,7 +2620,7 @@ char* ftostr52(const float& x) {
|
2600
|
2620
|
*/
|
2601
|
2621
|
static void lcd_level_bed() {
|
2602
|
2622
|
START_MENU();
|
2603
|
|
- MENU_ITEM(back, MSG_LEVEL_BED_CANCEL, lcd_prepare_menu);
|
|
2623
|
+ MENU_ITEM(back, MSG_LEVEL_BED_CANCEL);
|
2604
|
2624
|
MENU_ITEM(submenu, MSG_LEVEL_BED, _lcd_level_bed_continue);
|
2605
|
2625
|
END_MENU();
|
2606
|
2626
|
}
|