瀏覽代碼

Move Configuration Menu to its own file

Scott Lahteine 6 年之前
父節點
當前提交
3a9ad9f2b1
共有 2 個檔案被更改,包括 385 行新增395 行删除
  1. 14
    395
      Marlin/src/lcd/menu/menu.cpp
  2. 371
    0
      Marlin/src/lcd/menu/menu_configuration.cpp

+ 14
- 395
Marlin/src/lcd/menu/menu.cpp 查看文件

@@ -30,7 +30,6 @@
30 30
 #include "../../sd/cardreader.h"
31 31
 #include "../../module/temperature.h"
32 32
 #include "../../module/planner.h"
33
-#include "../../module/stepper.h"
34 33
 #include "../../module/motion.h"
35 34
 #include "../../module/probe.h"
36 35
 #include "../../module/printcounter.h"
@@ -66,10 +65,6 @@
66 65
   #include "../../feature/leds/leds.h"
67 66
 #endif
68 67
 
69
-#if ENABLED(FILAMENT_RUNOUT_SENSOR)
70
-  #include "../../feature/runout.h"
71
-#endif
72
-
73 68
 ////////////////////////////////////////////
74 69
 ///////////// Global Variables /////////////
75 70
 ////////////////////////////////////////////
@@ -256,13 +251,6 @@ void menu_action_setting_edit_callback_bool(PGM_P pstr, bool* ptr, screenFunc_t
256 251
 ///////////////// Menu Tree ////////////////
257 252
 ////////////////////////////////////////////
258 253
 
259
-void menu_advanced_settings();
260
-
261
-#if DISABLED(SLIM_LCD_MENUS)
262
-  void menu_preheat_material1_settings();
263
-  void menu_preheat_material2_settings();
264
-#endif
265
-
266 254
 #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE)
267 255
   void menu_advanced_filament();
268 256
 #endif
@@ -283,22 +271,6 @@ void menu_advanced_settings();
283 271
   #endif
284 272
 #endif
285 273
 
286
-#if ENABLED(DAC_STEPPER_CURRENT)
287
-  void dac_driver_commit();
288
-  void dac_driver_getValues();
289
-  void menu_dac();
290
-  void lcd_dac_write_eeprom();
291
-#endif
292
-
293
-#if ENABLED(FWRETRACT)
294
-  #include "../../feature/fwretract.h"
295
-  void menu_config_retract();
296
-#endif
297
-
298
-#if ENABLED(DELTA_CALIBRATION_MENU) || ENABLED(DELTA_AUTO_CALIBRATION)
299
-  void menu_delta_calibrate();
300
-#endif
301
-
302 274
 #if ENABLED(MESH_BED_LEVELING) && ENABLED(LCD_BED_LEVELING)
303 275
   #include "../../feature/bedlevel/mbl/mesh_bed_leveling.h"
304 276
 #endif
@@ -558,127 +530,6 @@ void line_to_z(const float &z) {
558 530
 
559 531
 #endif // POWER_LOSS_RECOVERY
560 532
 
561
-#if EXTRUDERS > 1
562
-  void menu_tool_change() {
563
-    START_MENU();
564
-    MENU_BACK(MSG_MAIN);
565
-    #if ENABLED(SINGLENOZZLE)
566
-      MENU_ITEM_EDIT(float3, MSG_FILAMENT_SWAP_LENGTH, &toolchange_settings.swap_length, 0, 200);
567
-      MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_RETRACT_SPD, &toolchange_settings.retract_speed, 10, 5400);
568
-      MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_PRIME_SPD, &toolchange_settings.prime_speed, 10, 5400);
569
-    #endif
570
-    MENU_ITEM_EDIT(float3, MSG_TOOL_CHANGE_ZLIFT, &toolchange_settings.z_raise, 0, 10);
571
-    END_MENU();
572
-  }
573
-#endif
574
-
575
-#if ENABLED(MENU_ITEM_CASE_LIGHT)
576
-
577
-  #include "../../feature/caselight.h"
578
-
579
-  void menu_case_light() {
580
-    START_MENU();
581
-    MENU_BACK(MSG_MAIN);
582
-    MENU_ITEM_EDIT_CALLBACK(int8, MSG_CASE_LIGHT_BRIGHTNESS, &case_light_brightness, 0, 255, update_case_light, true);
583
-    MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light);
584
-    END_MENU();
585
-  }
586
-#endif // MENU_ITEM_CASE_LIGHT
587
-
588
-#if ENABLED(BLTOUCH)
589
-
590
-  /**
591
-   *
592
-   * "BLTouch" submenu
593
-   *
594
-   */
595
-  static void menu_bltouch() {
596
-    START_MENU();
597
-    MENU_BACK(MSG_MAIN);
598
-    MENU_ITEM(gcode, MSG_BLTOUCH_RESET, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_RESET)));
599
-    MENU_ITEM(gcode, MSG_BLTOUCH_SELFTEST, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_SELFTEST)));
600
-    MENU_ITEM(gcode, MSG_BLTOUCH_DEPLOY, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_DEPLOY)));
601
-    MENU_ITEM(gcode, MSG_BLTOUCH_STOW, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_STOW)));
602
-    END_MENU();
603
-  }
604
-
605
-#endif // BLTOUCH
606
-
607
-#if ENABLED(LCD_PROGRESS_BAR_TEST)
608
-
609
-  static void progress_bar_test() {
610
-    static int8_t bar_percent = 0;
611
-    if (use_click()) {
612
-      lcd_goto_previous_menu();
613
-      lcd_set_custom_characters(CHARSET_MENU);
614
-      return;
615
-    }
616
-    bar_percent += (int8_t)encoderPosition;
617
-    bar_percent = constrain(bar_percent, 0, 100);
618
-    encoderPosition = 0;
619
-    lcd_implementation_drawmenu_static(0, PSTR(MSG_PROGRESS_BAR_TEST), true, true);
620
-    lcd_moveto((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2);
621
-    lcd_put_u8str(int(bar_percent)); lcd_put_wchar('%');
622
-    lcd_moveto(0, LCD_HEIGHT - 1); lcd_draw_progress_bar(bar_percent);
623
-  }
624
-
625
-  void _progress_bar_test() {
626
-    lcd_goto_screen(progress_bar_test);
627
-    lcd_set_custom_characters();
628
-  }
629
-
630
-#endif // LCD_PROGRESS_BAR_TEST
631
-
632
-#if HAS_DEBUG_MENU
633
-
634
-  void menu_debug() {
635
-    START_MENU();
636
-
637
-    MENU_BACK(MSG_MAIN);
638
-
639
-    #if ENABLED(LCD_PROGRESS_BAR_TEST)
640
-      MENU_ITEM(submenu, MSG_PROGRESS_BAR_TEST, _progress_bar_test);
641
-    #endif
642
-
643
-    END_MENU();
644
-  }
645
-
646
-#endif // HAS_DEBUG_MENU
647
-
648
-/**
649
- * IDEX submenu
650
- */
651
-#if ENABLED(DUAL_X_CARRIAGE)
652
-  static void _recalc_IDEX_settings() {
653
-    if (active_extruder) {                      // For the 2nd extruder re-home so the next tool-change gets the new offsets.
654
-      enqueue_and_echo_commands_P(PSTR("G28")); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary.
655
-      active_extruder = 0;
656
-    }
657
-  }
658
-
659
-  static void menu_IDEX() {
660
-    START_MENU();
661
-    MENU_BACK(MSG_MAIN);
662
-
663
-    MENU_ITEM(gcode, MSG_IDEX_MODE_AUTOPARK,  PSTR("M605 S1\nG28 X\nG1 X100"));
664
-    const bool need_g28 = !(TEST(axis_known_position, Y_AXIS) && TEST(axis_known_position, Z_AXIS));
665
-    MENU_ITEM(gcode, MSG_IDEX_MODE_DUPLICATE, need_g28
666
-      ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100")                // If Y or Z is not homed, do a full G28 first
667
-      : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100")
668
-    );
669
-    //MENU_ITEM(gcode, MSG_IDEX_MODE_SCALED_COPY, need_g28
670
-    //  ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200")  // If Y or Z is not homed, do a full G28 first
671
-    //  : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200")
672
-    //);
673
-    MENU_ITEM(gcode, MSG_IDEX_MODE_FULL_CTRL, PSTR("M605 S0\nG28 X"));
674
-    MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_X_OFFSET , &hotend_offset[X_AXIS][1], MIN(X2_HOME_POS, X2_MAX_POS) - 25.0, MAX(X2_HOME_POS, X2_MAX_POS) + 25.0, _recalc_IDEX_settings);
675
-    MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_Y_OFFSET , &hotend_offset[Y_AXIS][1], -10.0, 10.0, _recalc_IDEX_settings);
676
-    MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_Z_OFFSET , &hotend_offset[Z_AXIS][1], -10.0, 10.0, _recalc_IDEX_settings);
677
-    MENU_ITEM(gcode, MSG_IDEX_SAVE_OFFSETS, PSTR("M500"));
678
-    END_MENU();
679
-  }
680
-#endif // DUAL_X_CARRIAGE
681
-
682 533
 #if ENABLED(CUSTOM_USER_MENUS)
683 534
 
684 535
   #ifdef USER_SCRIPT_DONE
@@ -885,55 +736,6 @@ void watch_temp_callback_bed() {
885 736
 
886 737
 /**
887 738
  *
888
- * "Driver current control" submenu items
889
- *
890
- */
891
-#if ENABLED(DAC_STEPPER_CURRENT)
892
-
893
-  #include "../../feature/dac/stepper_dac.h" //was dac_mcp4728.h MarlinMain uses stepper dac for the m-codes
894
-  uint8_t driverPercent[XYZE];
895
-
896
-  void dac_driver_getValues() { LOOP_XYZE(i) driverPercent[i] = dac_current_get_percent((AxisEnum)i); }
897
-
898
-  void dac_driver_commit() { dac_current_set_percents(driverPercent); }
899
-
900
-  void dac_driver_eeprom_write() { dac_commit_eeprom(); }
901
-
902
-  void menu_dac() {
903
-    dac_driver_getValues();
904
-    START_MENU();
905
-    MENU_BACK(MSG_CONTROL);
906
-    MENU_ITEM_EDIT_CALLBACK(int8, MSG_X " " MSG_DAC_PERCENT, &driverPercent[X_AXIS], 0, 100, dac_driver_commit);
907
-    MENU_ITEM_EDIT_CALLBACK(int8, MSG_Y " " MSG_DAC_PERCENT, &driverPercent[Y_AXIS], 0, 100, dac_driver_commit);
908
-    MENU_ITEM_EDIT_CALLBACK(int8, MSG_Z " " MSG_DAC_PERCENT, &driverPercent[Z_AXIS], 0, 100, dac_driver_commit);
909
-    MENU_ITEM_EDIT_CALLBACK(int8, MSG_E " " MSG_DAC_PERCENT, &driverPercent[E_AXIS], 0, 100, dac_driver_commit);
910
-    MENU_ITEM(function, MSG_DAC_EEPROM_WRITE, dac_driver_eeprom_write);
911
-    END_MENU();
912
-  }
913
-
914
-#endif // DAC_STEPPER_CURRENT
915
-
916
-#if HAS_MOTOR_CURRENT_PWM
917
-
918
-  void menu_pwm() {
919
-    START_MENU();
920
-    MENU_BACK(MSG_CONTROL);
921
-    #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
922
-      MENU_ITEM_EDIT_CALLBACK(long5, MSG_X MSG_Y, &stepper.motor_current_setting[0], 100, 2000, Stepper::refresh_motor_power);
923
-    #endif
924
-    #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
925
-      MENU_ITEM_EDIT_CALLBACK(long5, MSG_Z, &stepper.motor_current_setting[1], 100, 2000, Stepper::refresh_motor_power);
926
-    #endif
927
-    #if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
928
-      MENU_ITEM_EDIT_CALLBACK(long5, MSG_E, &stepper.motor_current_setting[2], 100, 2000, Stepper::refresh_motor_power);
929
-    #endif
930
-    END_MENU();
931
-  }
932
-
933
-#endif // HAS_MOTOR_CURRENT_PWM
934
-
935
-/**
936
- *
937 739
  * "Temperature" submenu items
938 740
  *
939 741
  */
@@ -1204,8 +1006,20 @@ void lcd_cooldown() {
1204 1006
 #endif
1205 1007
 
1206 1008
 #if ENABLED(EEPROM_SETTINGS)
1207
-  static void lcd_store_settings()   { lcd_completion_feedback(settings.save()); }
1208
-  static void lcd_load_settings()    { lcd_completion_feedback(settings.load()); }
1009
+  void lcd_store_settings()   { lcd_completion_feedback(settings.save()); }
1010
+  void lcd_load_settings()    { lcd_completion_feedback(settings.load()); }
1011
+  #if DISABLED(SLIM_LCD_MENUS)
1012
+    static void lcd_init_eeprom() {
1013
+      lcd_completion_feedback(settings.init_eeprom());
1014
+      lcd_goto_previous_menu();
1015
+    }
1016
+    static void lcd_init_eeprom_confirm() {
1017
+      START_MENU();
1018
+      MENU_BACK(MSG_ADVANCED_SETTINGS);
1019
+      MENU_ITEM(function, MSG_INIT_EEPROM, lcd_init_eeprom);
1020
+      END_MENU();
1021
+    }
1022
+  #endif
1209 1023
 #endif
1210 1024
 
1211 1025
 void _lcd_draw_homing() {
@@ -2599,120 +2413,6 @@ void menu_move() {
2599 2413
 
2600 2414
 /**
2601 2415
  *
2602
- * "Configuration" submenu
2603
- *
2604
- */
2605
-
2606
-#if HAS_LCD_CONTRAST
2607
-  void lcd_callback_set_contrast() { set_lcd_contrast(lcd_contrast); }
2608
-#endif
2609
-
2610
-static void lcd_factory_settings() {
2611
-  settings.reset();
2612
-  lcd_completion_feedback();
2613
-}
2614
-
2615
-#if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS)
2616
-
2617
-  static void lcd_init_eeprom() {
2618
-    lcd_completion_feedback(settings.init_eeprom());
2619
-    lcd_goto_previous_menu();
2620
-  }
2621
-
2622
-  static void lcd_init_eeprom_confirm() {
2623
-    START_MENU();
2624
-    MENU_BACK(MSG_ADVANCED_SETTINGS);
2625
-    MENU_ITEM(function, MSG_INIT_EEPROM, lcd_init_eeprom);
2626
-    END_MENU();
2627
-  }
2628
-
2629
-#endif
2630
-
2631
-void menu_configuration() {
2632
-  START_MENU();
2633
-  MENU_BACK(MSG_MAIN);
2634
-
2635
-  //
2636
-  // Debug Menu when certain options are enabled
2637
-  //
2638
-  #if HAS_DEBUG_MENU
2639
-    MENU_ITEM(submenu, MSG_DEBUG_MENU, menu_debug);
2640
-  #endif
2641
-
2642
-  MENU_ITEM(submenu, MSG_ADVANCED_SETTINGS, menu_advanced_settings);
2643
-
2644
-  const bool busy = printer_busy();
2645
-  if (!busy) {
2646
-    //
2647
-    // Delta Calibration
2648
-    //
2649
-    #if ENABLED(DELTA_CALIBRATION_MENU) || ENABLED(DELTA_AUTO_CALIBRATION)
2650
-      MENU_ITEM(submenu, MSG_DELTA_CALIBRATE, menu_delta_calibrate);
2651
-    #endif
2652
-
2653
-    #if ENABLED(DUAL_X_CARRIAGE)
2654
-      MENU_ITEM(submenu, MSG_IDEX_MENU, menu_IDEX);
2655
-    #endif
2656
-
2657
-    #if ENABLED(BLTOUCH)
2658
-      MENU_ITEM(submenu, MSG_BLTOUCH, menu_bltouch);
2659
-    #endif
2660
-  }
2661
-
2662
-  //
2663
-  // Set single nozzle filament retract and prime length
2664
-  //
2665
-  #if EXTRUDERS > 1
2666
-    MENU_ITEM(submenu, MSG_TOOL_CHANGE, menu_tool_change);
2667
-  #endif
2668
-
2669
-  //
2670
-  // Set Case light on/off/brightness
2671
-  //
2672
-  #if ENABLED(MENU_ITEM_CASE_LIGHT)
2673
-    if (USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN))
2674
-      MENU_ITEM(submenu, MSG_CASE_LIGHT, menu_case_light);
2675
-    else
2676
-      MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light);
2677
-  #endif
2678
-
2679
-  #if HAS_LCD_CONTRAST
2680
-    MENU_ITEM_EDIT_CALLBACK(int3, MSG_CONTRAST, &lcd_contrast, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX, lcd_callback_set_contrast, true);
2681
-  #endif
2682
-  #if ENABLED(FWRETRACT)
2683
-    MENU_ITEM(submenu, MSG_RETRACT, menu_config_retract);
2684
-  #endif
2685
-  #if ENABLED(DAC_STEPPER_CURRENT)
2686
-    MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, menu_dac);
2687
-  #endif
2688
-  #if HAS_MOTOR_CURRENT_PWM
2689
-    MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, menu_pwm);
2690
-  #endif
2691
-
2692
-  #if ENABLED(FILAMENT_RUNOUT_SENSOR)
2693
-    MENU_ITEM_EDIT(bool, MSG_RUNOUT_SENSOR_ENABLE, &runout.enabled);
2694
-  #endif
2695
-
2696
-  #if DISABLED(SLIM_LCD_MENUS)
2697
-    // Preheat configurations
2698
-    MENU_ITEM(submenu, MSG_PREHEAT_1_SETTINGS, menu_preheat_material1_settings);
2699
-    MENU_ITEM(submenu, MSG_PREHEAT_2_SETTINGS, menu_preheat_material2_settings);
2700
-  #endif
2701
-
2702
-  #if ENABLED(EEPROM_SETTINGS)
2703
-    MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings);
2704
-    if (!busy)
2705
-      MENU_ITEM(function, MSG_LOAD_EEPROM, lcd_load_settings);
2706
-  #endif
2707
-
2708
-  if (!busy)
2709
-    MENU_ITEM(function, MSG_RESTORE_FAILSAFE, lcd_factory_settings);
2710
-
2711
-  END_MENU();
2712
-}
2713
-
2714
-/**
2715
- *
2716 2416
  * "Temperature" submenu
2717 2417
  *
2718 2418
  */
@@ -2962,55 +2662,6 @@ void menu_advanced_temperature() {
2962 2662
 
2963 2663
 #if DISABLED(SLIM_LCD_MENUS)
2964 2664
 
2965
-  void _menu_configuration_preheat_settings(const uint8_t material) {
2966
-    #if HOTENDS > 5
2967
-      #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP, HEATER_5_MINTEMP)
2968
-      #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP)
2969
-    #elif HOTENDS > 4
2970
-      #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP)
2971
-      #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP)
2972
-    #elif HOTENDS > 3
2973
-      #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP)
2974
-      #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP)
2975
-    #elif HOTENDS > 2
2976
-      #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP)
2977
-      #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP)
2978
-    #elif HOTENDS > 1
2979
-      #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP)
2980
-      #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP)
2981
-    #else
2982
-      #define MINTEMP_ALL HEATER_0_MINTEMP
2983
-      #define MAXTEMP_ALL HEATER_0_MAXTEMP
2984
-    #endif
2985
-    START_MENU();
2986
-    MENU_BACK(MSG_CONFIGURATION);
2987
-    MENU_ITEM_EDIT(int8, MSG_FAN_SPEED, &lcd_preheat_fan_speed[material], 0, 255);
2988
-    #if HAS_TEMP_HOTEND
2989
-      MENU_ITEM_EDIT(int3, MSG_NOZZLE, &lcd_preheat_hotend_temp[material], MINTEMP_ALL, MAXTEMP_ALL - 15);
2990
-    #endif
2991
-    #if HAS_HEATED_BED
2992
-      MENU_ITEM_EDIT(int3, MSG_BED, &lcd_preheat_bed_temp[material], BED_MINTEMP, BED_MAXTEMP - 15);
2993
-    #endif
2994
-    #if ENABLED(EEPROM_SETTINGS)
2995
-      MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings);
2996
-    #endif
2997
-    END_MENU();
2998
-  }
2999
-
3000
-  /**
3001
-   *
3002
-   * "Temperature" > "Preheat Material 1 conf" submenu
3003
-   *
3004
-   */
3005
-  void menu_preheat_material1_settings() { _menu_configuration_preheat_settings(0); }
3006
-
3007
-  /**
3008
-   *
3009
-   * "Temperature" > "Preheat Material 2 conf" submenu
3010
-   *
3011
-   */
3012
-  void menu_preheat_material2_settings() { _menu_configuration_preheat_settings(1); }
3013
-
3014 2665
   void _reset_acceleration_rates() { planner.reset_acceleration_rates(); }
3015 2666
   #if ENABLED(DISTINCT_E_FACTORS)
3016 2667
     void _reset_e_acceleration_rate(const uint8_t e) { if (e == active_extruder) _reset_acceleration_rates(); }
@@ -3423,38 +3074,6 @@ void menu_advanced_settings() {
3423 3074
   }
3424 3075
 #endif // !NO_VOLUMETRICS || ADVANCED_PAUSE_FEATURE
3425 3076
 
3426
-/**
3427
- *
3428
- * "Configuration" > "Retract" submenu
3429
- *
3430
- */
3431
-#if ENABLED(FWRETRACT)
3432
-
3433
-  void menu_config_retract() {
3434
-    START_MENU();
3435
-    MENU_BACK(MSG_CONTROL);
3436
-    #if ENABLED(FWRETRACT_AUTORETRACT)
3437
-      MENU_ITEM_EDIT_CALLBACK(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract);
3438
-    #endif
3439
-    MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100);
3440
-    #if EXTRUDERS > 1
3441
-      MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100);
3442
-    #endif
3443
-    MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999);
3444
-    MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_ZHOP, &fwretract.settings.retract_zraise, 0, 999);
3445
-    MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_length, -100, 100);
3446
-    #if EXTRUDERS > 1
3447
-      MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_length, -100, 100);
3448
-    #endif
3449
-    MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999);
3450
-    #if EXTRUDERS > 1
3451
-      MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999);
3452
-    #endif
3453
-    END_MENU();
3454
-  }
3455
-
3456
-#endif // FWRETRACT
3457
-
3458 3077
 #if ENABLED(SDSUPPORT)
3459 3078
 
3460 3079
   #if !PIN_EXISTS(SD_DETECT)

+ 371
- 0
Marlin/src/lcd/menu/menu_configuration.cpp 查看文件

@@ -0,0 +1,371 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (C) 2016 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
+//
24
+// Configuration Menu
25
+//
26
+
27
+#include "../../inc/MarlinConfigPre.h"
28
+
29
+#if HAS_LCD_MENU
30
+
31
+#include "menu.h"
32
+
33
+#include "../../module/configuration_store.h"
34
+
35
+#if ENABLED(FILAMENT_RUNOUT_SENSOR)
36
+  #include "../../feature/runout.h"
37
+#endif
38
+
39
+void menu_advanced_settings();
40
+void menu_delta_calibrate();
41
+
42
+#if HAS_LCD_CONTRAST
43
+  void lcd_callback_set_contrast() { set_lcd_contrast(lcd_contrast); }
44
+#endif
45
+
46
+static void lcd_factory_settings() {
47
+  settings.reset();
48
+  lcd_completion_feedback();
49
+}
50
+
51
+#if ENABLED(LCD_PROGRESS_BAR_TEST)
52
+
53
+  static void progress_bar_test() {
54
+    static int8_t bar_percent = 0;
55
+    if (use_click()) {
56
+      lcd_goto_previous_menu();
57
+      lcd_set_custom_characters(CHARSET_MENU);
58
+      return;
59
+    }
60
+    bar_percent += (int8_t)encoderPosition;
61
+    bar_percent = constrain(bar_percent, 0, 100);
62
+    encoderPosition = 0;
63
+    lcd_implementation_drawmenu_static(0, PSTR(MSG_PROGRESS_BAR_TEST), true, true);
64
+    lcd_moveto((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2);
65
+    lcd_put_u8str(int(bar_percent)); lcd_put_wchar('%');
66
+    lcd_moveto(0, LCD_HEIGHT - 1); lcd_draw_progress_bar(bar_percent);
67
+  }
68
+
69
+  void _progress_bar_test() {
70
+    lcd_goto_screen(progress_bar_test);
71
+    lcd_set_custom_characters();
72
+  }
73
+
74
+#endif // LCD_PROGRESS_BAR_TEST
75
+
76
+#if HAS_DEBUG_MENU
77
+
78
+  void menu_debug() {
79
+    START_MENU();
80
+
81
+    MENU_BACK(MSG_MAIN);
82
+
83
+    #if ENABLED(LCD_PROGRESS_BAR_TEST)
84
+      MENU_ITEM(submenu, MSG_PROGRESS_BAR_TEST, _progress_bar_test);
85
+    #endif
86
+
87
+    END_MENU();
88
+  }
89
+
90
+#endif
91
+
92
+#if EXTRUDERS > 1
93
+
94
+  #include "../../module/tool_change.h"
95
+
96
+  void menu_tool_change() {
97
+    START_MENU();
98
+    MENU_BACK(MSG_MAIN);
99
+    #if ENABLED(SINGLENOZZLE)
100
+      MENU_ITEM_EDIT(float3, MSG_FILAMENT_SWAP_LENGTH, &toolchange_settings.swap_length, 0, 200);
101
+      MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_RETRACT_SPD, &toolchange_settings.retract_speed, 10, 5400);
102
+      MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_PRIME_SPD, &toolchange_settings.prime_speed, 10, 5400);
103
+    #endif
104
+    MENU_ITEM_EDIT(float3, MSG_TOOL_CHANGE_ZLIFT, &toolchange_settings.z_raise, 0, 10);
105
+    END_MENU();
106
+  }
107
+
108
+#endif
109
+
110
+#if ENABLED(DUAL_X_CARRIAGE)
111
+
112
+  #include "../../module/motion.h"
113
+  #include "../../gcode/queue.h"
114
+
115
+  void _recalc_IDEX_settings() {
116
+    if (active_extruder) {                      // For the 2nd extruder re-home so the next tool-change gets the new offsets.
117
+      enqueue_and_echo_commands_P(PSTR("G28")); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary.
118
+      active_extruder = 0;
119
+    }
120
+  }
121
+
122
+  void menu_IDEX() {
123
+    START_MENU();
124
+    MENU_BACK(MSG_MAIN);
125
+
126
+    MENU_ITEM(gcode, MSG_IDEX_MODE_AUTOPARK,  PSTR("M605 S1\nG28 X\nG1 X100"));
127
+    const bool need_g28 = !(TEST(axis_known_position, Y_AXIS) && TEST(axis_known_position, Z_AXIS));
128
+    MENU_ITEM(gcode, MSG_IDEX_MODE_DUPLICATE, need_g28
129
+      ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100")                // If Y or Z is not homed, do a full G28 first
130
+      : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100")
131
+    );
132
+    //MENU_ITEM(gcode, MSG_IDEX_MODE_SCALED_COPY, need_g28
133
+    //  ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200")  // If Y or Z is not homed, do a full G28 first
134
+    //  : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200")
135
+    //);
136
+    MENU_ITEM(gcode, MSG_IDEX_MODE_FULL_CTRL, PSTR("M605 S0\nG28 X"));
137
+    MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_X_OFFSET , &hotend_offset[X_AXIS][1], MIN(X2_HOME_POS, X2_MAX_POS) - 25.0, MAX(X2_HOME_POS, X2_MAX_POS) + 25.0, _recalc_IDEX_settings);
138
+    MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_Y_OFFSET , &hotend_offset[Y_AXIS][1], -10.0, 10.0, _recalc_IDEX_settings);
139
+    MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_Z_OFFSET , &hotend_offset[Z_AXIS][1], -10.0, 10.0, _recalc_IDEX_settings);
140
+    MENU_ITEM(gcode, MSG_IDEX_SAVE_OFFSETS, PSTR("M500"));
141
+    END_MENU();
142
+  }
143
+
144
+#endif
145
+
146
+#if ENABLED(BLTOUCH)
147
+
148
+  void menu_bltouch() {
149
+    START_MENU();
150
+    MENU_BACK(MSG_MAIN);
151
+    MENU_ITEM(gcode, MSG_BLTOUCH_RESET, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_RESET)));
152
+    MENU_ITEM(gcode, MSG_BLTOUCH_SELFTEST, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_SELFTEST)));
153
+    MENU_ITEM(gcode, MSG_BLTOUCH_DEPLOY, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_DEPLOY)));
154
+    MENU_ITEM(gcode, MSG_BLTOUCH_STOW, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_STOW)));
155
+    END_MENU();
156
+  }
157
+
158
+#endif
159
+
160
+#if ENABLED(MENU_ITEM_CASE_LIGHT)
161
+
162
+  #include "../../feature/caselight.h"
163
+
164
+  void menu_case_light() {
165
+    START_MENU();
166
+    MENU_BACK(MSG_MAIN);
167
+    MENU_ITEM_EDIT_CALLBACK(int8, MSG_CASE_LIGHT_BRIGHTNESS, &case_light_brightness, 0, 255, update_case_light, true);
168
+    MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light);
169
+    END_MENU();
170
+  }
171
+
172
+#endif
173
+
174
+#if ENABLED(FWRETRACT)
175
+
176
+  #include "../../feature/fwretract.h"
177
+
178
+  void menu_config_retract() {
179
+    START_MENU();
180
+    MENU_BACK(MSG_CONTROL);
181
+    #if ENABLED(FWRETRACT_AUTORETRACT)
182
+      MENU_ITEM_EDIT_CALLBACK(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract);
183
+    #endif
184
+    MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100);
185
+    #if EXTRUDERS > 1
186
+      MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100);
187
+    #endif
188
+    MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999);
189
+    MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_ZHOP, &fwretract.settings.retract_zraise, 0, 999);
190
+    MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_length, -100, 100);
191
+    #if EXTRUDERS > 1
192
+      MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_length, -100, 100);
193
+    #endif
194
+    MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999);
195
+    #if EXTRUDERS > 1
196
+      MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999);
197
+    #endif
198
+    END_MENU();
199
+  }
200
+
201
+#endif
202
+
203
+#if ENABLED(DAC_STEPPER_CURRENT)
204
+
205
+  #include "../../feature/dac/stepper_dac.h"
206
+
207
+  uint8_t driverPercent[XYZE];
208
+  inline void dac_driver_getValues() { LOOP_XYZE(i) driverPercent[i] = dac_current_get_percent((AxisEnum)i); }
209
+  static void dac_driver_commit() { dac_current_set_percents(driverPercent); }
210
+
211
+  void menu_dac() {
212
+    dac_driver_getValues();
213
+    START_MENU();
214
+    MENU_BACK(MSG_CONTROL);
215
+    MENU_ITEM_EDIT_CALLBACK(int8, MSG_X " " MSG_DAC_PERCENT, &driverPercent[X_AXIS], 0, 100, dac_driver_commit);
216
+    MENU_ITEM_EDIT_CALLBACK(int8, MSG_Y " " MSG_DAC_PERCENT, &driverPercent[Y_AXIS], 0, 100, dac_driver_commit);
217
+    MENU_ITEM_EDIT_CALLBACK(int8, MSG_Z " " MSG_DAC_PERCENT, &driverPercent[Z_AXIS], 0, 100, dac_driver_commit);
218
+    MENU_ITEM_EDIT_CALLBACK(int8, MSG_E " " MSG_DAC_PERCENT, &driverPercent[E_AXIS], 0, 100, dac_driver_commit);
219
+    MENU_ITEM(function, MSG_DAC_EEPROM_WRITE, dac_commit_eeprom);
220
+    END_MENU();
221
+  }
222
+
223
+#endif
224
+
225
+#if HAS_MOTOR_CURRENT_PWM
226
+
227
+  #include "../../module/stepper.h"
228
+
229
+  void menu_pwm() {
230
+    START_MENU();
231
+    MENU_BACK(MSG_CONTROL);
232
+    #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
233
+      MENU_ITEM_EDIT_CALLBACK(long5, MSG_X MSG_Y, &stepper.motor_current_setting[0], 100, 2000, stepper.refresh_motor_power);
234
+    #endif
235
+    #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
236
+      MENU_ITEM_EDIT_CALLBACK(long5, MSG_Z, &stepper.motor_current_setting[1], 100, 2000, stepper.refresh_motor_power);
237
+    #endif
238
+    #if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
239
+      MENU_ITEM_EDIT_CALLBACK(long5, MSG_E, &stepper.motor_current_setting[2], 100, 2000, stepper.refresh_motor_power);
240
+    #endif
241
+    END_MENU();
242
+  }
243
+
244
+#endif
245
+
246
+#if DISABLED(SLIM_LCD_MENUS)
247
+
248
+  void _menu_configuration_preheat_settings(const uint8_t material) {
249
+    #if HOTENDS > 5
250
+      #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP, HEATER_5_MINTEMP)
251
+      #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP)
252
+    #elif HOTENDS > 4
253
+      #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP)
254
+      #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP)
255
+    #elif HOTENDS > 3
256
+      #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP)
257
+      #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP)
258
+    #elif HOTENDS > 2
259
+      #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP)
260
+      #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP)
261
+    #elif HOTENDS > 1
262
+      #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP)
263
+      #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP)
264
+    #else
265
+      #define MINTEMP_ALL HEATER_0_MINTEMP
266
+      #define MAXTEMP_ALL HEATER_0_MAXTEMP
267
+    #endif
268
+    START_MENU();
269
+    MENU_BACK(MSG_CONFIGURATION);
270
+    MENU_ITEM_EDIT(int8, MSG_FAN_SPEED, &lcd_preheat_fan_speed[material], 0, 255);
271
+    #if HAS_TEMP_HOTEND
272
+      MENU_ITEM_EDIT(int3, MSG_NOZZLE, &lcd_preheat_hotend_temp[material], MINTEMP_ALL, MAXTEMP_ALL - 15);
273
+    #endif
274
+    #if HAS_HEATED_BED
275
+      MENU_ITEM_EDIT(int3, MSG_BED, &lcd_preheat_bed_temp[material], BED_MINTEMP, BED_MAXTEMP - 15);
276
+    #endif
277
+    #if ENABLED(EEPROM_SETTINGS)
278
+      MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings);
279
+    #endif
280
+    END_MENU();
281
+  }
282
+
283
+  void menu_preheat_material1_settings() { _menu_configuration_preheat_settings(0); }
284
+  void menu_preheat_material2_settings() { _menu_configuration_preheat_settings(1); }
285
+
286
+#endif
287
+
288
+void menu_configuration() {
289
+  START_MENU();
290
+  MENU_BACK(MSG_MAIN);
291
+
292
+  //
293
+  // Debug Menu when certain options are enabled
294
+  //
295
+  #if HAS_DEBUG_MENU
296
+    MENU_ITEM(submenu, MSG_DEBUG_MENU, menu_debug);
297
+  #endif
298
+
299
+  MENU_ITEM(submenu, MSG_ADVANCED_SETTINGS, menu_advanced_settings);
300
+
301
+  const bool busy = printer_busy();
302
+  if (!busy) {
303
+    //
304
+    // Delta Calibration
305
+    //
306
+    #if ENABLED(DELTA_CALIBRATION_MENU) || ENABLED(DELTA_AUTO_CALIBRATION)
307
+      MENU_ITEM(submenu, MSG_DELTA_CALIBRATE, menu_delta_calibrate);
308
+    #endif
309
+
310
+    #if ENABLED(DUAL_X_CARRIAGE)
311
+      MENU_ITEM(submenu, MSG_IDEX_MENU, menu_IDEX);
312
+    #endif
313
+
314
+    #if ENABLED(BLTOUCH)
315
+      MENU_ITEM(submenu, MSG_BLTOUCH, menu_bltouch);
316
+    #endif
317
+  }
318
+
319
+  //
320
+  // Set single nozzle filament retract and prime length
321
+  //
322
+  #if EXTRUDERS > 1
323
+    MENU_ITEM(submenu, MSG_TOOL_CHANGE, menu_tool_change);
324
+  #endif
325
+
326
+  //
327
+  // Set Case light on/off/brightness
328
+  //
329
+  #if ENABLED(MENU_ITEM_CASE_LIGHT)
330
+    if (USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN))
331
+      MENU_ITEM(submenu, MSG_CASE_LIGHT, menu_case_light);
332
+    else
333
+      MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light);
334
+  #endif
335
+
336
+  #if HAS_LCD_CONTRAST
337
+    MENU_ITEM_EDIT_CALLBACK(int3, MSG_CONTRAST, &lcd_contrast, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX, lcd_callback_set_contrast, true);
338
+  #endif
339
+  #if ENABLED(FWRETRACT)
340
+    MENU_ITEM(submenu, MSG_RETRACT, menu_config_retract);
341
+  #endif
342
+  #if ENABLED(DAC_STEPPER_CURRENT)
343
+    MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, menu_dac);
344
+  #endif
345
+  #if HAS_MOTOR_CURRENT_PWM
346
+    MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, menu_pwm);
347
+  #endif
348
+
349
+  #if ENABLED(FILAMENT_RUNOUT_SENSOR)
350
+    MENU_ITEM_EDIT(bool, MSG_RUNOUT_SENSOR_ENABLE, &runout.enabled);
351
+  #endif
352
+
353
+  #if DISABLED(SLIM_LCD_MENUS)
354
+    // Preheat configurations
355
+    MENU_ITEM(submenu, MSG_PREHEAT_1_SETTINGS, menu_preheat_material1_settings);
356
+    MENU_ITEM(submenu, MSG_PREHEAT_2_SETTINGS, menu_preheat_material2_settings);
357
+  #endif
358
+
359
+  #if ENABLED(EEPROM_SETTINGS)
360
+    MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings);
361
+    if (!busy)
362
+      MENU_ITEM(function, MSG_LOAD_EEPROM, lcd_load_settings);
363
+  #endif
364
+
365
+  if (!busy)
366
+    MENU_ITEM(function, MSG_RESTORE_FAILSAFE, lcd_factory_settings);
367
+
368
+  END_MENU();
369
+}
370
+
371
+#endif // HAS_LCD_MENU

Loading…
取消
儲存