Browse Source

Have "back" menu items go to the previous item

Scott Lahteine 8 years ago
parent
commit
056b80dc53

+ 1
- 1
Marlin/dogm_lcd_implementation.h View File

@@ -599,7 +599,7 @@ void lcd_implementation_drawedit(const char* pstr, const char* value) {
599 599
 
600 600
 #endif //SDSUPPORT
601 601
 
602
-#define lcd_implementation_drawmenu_back(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
602
+#define lcd_implementation_drawmenu_back(sel, row, pstr) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
603 603
 #define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0])
604 604
 #define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
605 605
 #define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')

+ 60
- 40
Marlin/ultralcd.cpp View File

@@ -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
   }

+ 1
- 1
Marlin/ultralcd_implementation_hitachi_HD44780.h View File

@@ -899,7 +899,7 @@ void lcd_implementation_drawedit(const char* pstr, const char* value) {
899 899
 
900 900
 #endif //SDSUPPORT
901 901
 
902
-#define lcd_implementation_drawmenu_back(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
902
+#define lcd_implementation_drawmenu_back(sel, row, pstr) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
903 903
 #define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0])
904 904
 #define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
905 905
 #define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')

Loading…
Cancel
Save