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

+ 1
- 1
Marlin/ultralcd_implementation_hitachi_HD44780.h View File

899
 
899
 
900
 #endif //SDSUPPORT
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
 #define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0])
903
 #define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0])
904
 #define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
904
 #define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
905
 #define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
905
 #define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')

Loading…
Cancel
Save