My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

menu_configuration.cpp 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (c) 2020 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 <https://www.gnu.org/licenses/>.
  20. *
  21. */
  22. //
  23. // Configuration Menu
  24. //
  25. #include "../../inc/MarlinConfigPre.h"
  26. #if HAS_MARLINUI_MENU
  27. #include "menu_item.h"
  28. #include "../../MarlinCore.h"
  29. #if HAS_FILAMENT_SENSOR
  30. #include "../../feature/runout.h"
  31. #endif
  32. #if HAS_FANCHECK
  33. #include "../../feature/fancheck.h"
  34. #endif
  35. #if ENABLED(POWER_LOSS_RECOVERY)
  36. #include "../../feature/powerloss.h"
  37. #endif
  38. #if HAS_BED_PROBE
  39. #include "../../module/probe.h"
  40. #if ENABLED(BLTOUCH)
  41. #include "../../feature/bltouch.h"
  42. #endif
  43. #endif
  44. #if ENABLED(SOUND_MENU_ITEM)
  45. #include "../../libs/buzzer.h"
  46. #endif
  47. #include "../../core/debug_out.h"
  48. #define HAS_DEBUG_MENU ENABLED(LCD_PROGRESS_BAR_TEST)
  49. void menu_advanced_settings();
  50. #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION)
  51. void menu_delta_calibrate();
  52. #endif
  53. #if ENABLED(LCD_PROGRESS_BAR_TEST)
  54. #include "../lcdprint.h"
  55. static void progress_bar_test() {
  56. static int8_t bar_percent = 0;
  57. if (ui.use_click()) {
  58. ui.goto_previous_screen();
  59. TERN_(HAS_MARLINUI_HD44780, ui.set_custom_characters(CHARSET_MENU));
  60. return;
  61. }
  62. bar_percent += (int8_t)ui.encoderPosition;
  63. LIMIT(bar_percent, 0, 100);
  64. ui.encoderPosition = 0;
  65. MenuItem_static::draw(0, GET_TEXT_F(MSG_PROGRESS_BAR_TEST), SS_DEFAULT|SS_INVERT);
  66. lcd_put_int((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2, bar_percent); lcd_put_lchar('%');
  67. lcd_moveto(0, LCD_HEIGHT - 1); ui.draw_progress_bar(bar_percent);
  68. }
  69. void _progress_bar_test() {
  70. ui.goto_screen(progress_bar_test);
  71. TERN_(HAS_MARLINUI_HD44780, ui.set_custom_characters(CHARSET_INFO));
  72. }
  73. #endif // LCD_PROGRESS_BAR_TEST
  74. #if HAS_DEBUG_MENU
  75. void menu_debug() {
  76. START_MENU();
  77. BACK_ITEM(MSG_CONFIGURATION);
  78. #if ENABLED(LCD_PROGRESS_BAR_TEST)
  79. SUBMENU(MSG_PROGRESS_BAR_TEST, _progress_bar_test);
  80. #endif
  81. END_MENU();
  82. }
  83. #endif
  84. #if HAS_MULTI_EXTRUDER
  85. #include "../../module/tool_change.h"
  86. void menu_tool_change() {
  87. START_MENU();
  88. BACK_ITEM(MSG_CONFIGURATION);
  89. #if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
  90. static constexpr float max_extrude = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 500);
  91. #if ENABLED(TOOLCHANGE_PARK)
  92. EDIT_ITEM(bool, MSG_FILAMENT_PARK_ENABLED, &toolchange_settings.enable_park);
  93. #endif
  94. EDIT_ITEM(float3, MSG_FILAMENT_SWAP_LENGTH, &toolchange_settings.swap_length, 0, max_extrude);
  95. EDIT_ITEM(float41sign, MSG_FILAMENT_SWAP_EXTRA, &toolchange_settings.extra_resume, -10, 10);
  96. EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_RETRACT_SPEED, &toolchange_settings.retract_speed, 10, 5400);
  97. EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_UNRETRACT_SPEED, &toolchange_settings.unretract_speed, 10, 5400);
  98. EDIT_ITEM(float3, MSG_FILAMENT_PURGE_LENGTH, &toolchange_settings.extra_prime, 0, max_extrude);
  99. EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_PRIME_SPEED, &toolchange_settings.prime_speed, 10, 5400);
  100. EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_WIPE_RETRACT, &toolchange_settings.wipe_retract, 0, 100);
  101. EDIT_ITEM_FAST(uint8, MSG_SINGLENOZZLE_FAN_SPEED, &toolchange_settings.fan_speed, 0, 255);
  102. EDIT_ITEM_FAST(uint8, MSG_SINGLENOZZLE_FAN_TIME, &toolchange_settings.fan_time, 1, 30);
  103. #endif
  104. EDIT_ITEM(float3, MSG_TOOL_CHANGE_ZLIFT, &toolchange_settings.z_raise, 0, 10);
  105. END_MENU();
  106. }
  107. #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
  108. #include "../../module/motion.h" // for active_extruder
  109. #include "../../gcode/queue.h"
  110. void menu_toolchange_migration() {
  111. FSTR_P const msg_migrate = GET_TEXT_F(MSG_TOOL_MIGRATION_SWAP);
  112. START_MENU();
  113. BACK_ITEM(MSG_CONFIGURATION);
  114. // Auto mode ON/OFF
  115. EDIT_ITEM(bool, MSG_TOOL_MIGRATION_AUTO, &migration.automode);
  116. EDIT_ITEM(uint8, MSG_TOOL_MIGRATION_END, &migration.last, 0, EXTRUDERS - 1);
  117. // Migrate to a chosen extruder
  118. EXTRUDER_LOOP() {
  119. if (e != active_extruder) {
  120. ACTION_ITEM_N_F(e, msg_migrate, []{
  121. char cmd[12];
  122. sprintf_P(cmd, PSTR("M217 T%i"), int(MenuItemBase::itemIndex));
  123. queue.inject(cmd);
  124. });
  125. }
  126. }
  127. END_MENU();
  128. }
  129. #endif
  130. #endif
  131. #if HAS_HOTEND_OFFSET
  132. #include "../../module/motion.h"
  133. #include "../../gcode/queue.h"
  134. void menu_tool_offsets() {
  135. auto _recalc_offsets = []{
  136. if (active_extruder && all_axes_trusted()) { // For the 2nd extruder re-home so the next tool-change gets the new offsets.
  137. queue.inject_P(G28_STR); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary.
  138. active_extruder = 0;
  139. }
  140. };
  141. START_MENU();
  142. BACK_ITEM(MSG_CONFIGURATION);
  143. #if ENABLED(DUAL_X_CARRIAGE)
  144. EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_HOTEND_OFFSET_A, &hotend_offset[1].x, float(X2_HOME_POS - 25), float(X2_HOME_POS + 25), _recalc_offsets);
  145. #else
  146. EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_HOTEND_OFFSET_A, &hotend_offset[1].x, -99.0, 99.0, _recalc_offsets);
  147. #endif
  148. EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_HOTEND_OFFSET_A, &hotend_offset[1].y, -99.0, 99.0, _recalc_offsets);
  149. EDIT_ITEM_FAST_N(float42_52, Z_AXIS, MSG_HOTEND_OFFSET_A, &hotend_offset[1].z, Z_PROBE_LOW_POINT, 10.0, _recalc_offsets);
  150. #if ENABLED(EEPROM_SETTINGS)
  151. ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
  152. #endif
  153. END_MENU();
  154. }
  155. #endif
  156. #if ENABLED(DUAL_X_CARRIAGE)
  157. void menu_idex() {
  158. const bool need_g28 = axes_should_home(_BV(Y_AXIS)|_BV(Z_AXIS));
  159. START_MENU();
  160. BACK_ITEM(MSG_CONFIGURATION);
  161. GCODES_ITEM(MSG_IDEX_MODE_AUTOPARK, F("M605S1\nG28X\nG1X0"));
  162. GCODES_ITEM(MSG_IDEX_MODE_DUPLICATE, need_g28
  163. ? F("M605S1\nT0\nG28\nM605S2\nG28X\nG1X0") // If Y or Z is not homed, do a full G28 first
  164. : F("M605S1\nT0\nM605S2\nG28X\nG1X0")
  165. );
  166. GCODES_ITEM(MSG_IDEX_MODE_MIRRORED_COPY, need_g28
  167. ? F("M605S1\nT0\nG28\nM605S2\nG28X\nG1X0\nM605S3") // If Y or Z is not homed, do a full G28 first
  168. : F("M605S1\nT0\nM605S2\nG28 X\nG1X0\nM605S3")
  169. );
  170. GCODES_ITEM(MSG_IDEX_MODE_FULL_CTRL, F("M605S0\nG28X"));
  171. EDIT_ITEM(float42_52, MSG_IDEX_DUPE_GAP, &duplicate_extruder_x_offset, (X2_MIN_POS) - (X1_MIN_POS), (X_BED_SIZE) - 20);
  172. END_MENU();
  173. }
  174. #endif
  175. #if ENABLED(BLTOUCH)
  176. #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU)
  177. void bltouch_report() {
  178. PGMSTR(mode0, "OD");
  179. PGMSTR(mode1, "5V");
  180. DEBUG_ECHOPGM("BLTouch Mode: ");
  181. DEBUG_ECHOPGM_P(bltouch.od_5v_mode ? mode1 : mode0);
  182. DEBUG_ECHOLNPGM(" (Default " TERN(BLTOUCH_SET_5V_MODE, "5V", "OD") ")");
  183. char mess[21];
  184. strcpy_P(mess, PSTR("BLTouch Mode: "));
  185. strcpy_P(&mess[15], bltouch.od_5v_mode ? mode1 : mode0);
  186. ui.set_status(mess);
  187. ui.return_to_status();
  188. }
  189. #endif
  190. void menu_bltouch() {
  191. START_MENU();
  192. BACK_ITEM(MSG_CONFIGURATION);
  193. ACTION_ITEM(MSG_BLTOUCH_RESET, bltouch._reset);
  194. ACTION_ITEM(MSG_BLTOUCH_SELFTEST, bltouch._selftest);
  195. ACTION_ITEM(MSG_BLTOUCH_DEPLOY, bltouch._deploy);
  196. ACTION_ITEM(MSG_BLTOUCH_STOW, bltouch._stow);
  197. ACTION_ITEM(MSG_BLTOUCH_SW_MODE, bltouch._set_SW_mode);
  198. #ifdef BLTOUCH_HS_MODE
  199. EDIT_ITEM(bool, MSG_BLTOUCH_SPEED_MODE, &bltouch.high_speed_mode);
  200. #endif
  201. #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU)
  202. CONFIRM_ITEM(MSG_BLTOUCH_5V_MODE, MSG_BLTOUCH_5V_MODE, MSG_BUTTON_CANCEL, bltouch._set_5V_mode, nullptr, GET_TEXT_F(MSG_BLTOUCH_MODE_CHANGE));
  203. CONFIRM_ITEM(MSG_BLTOUCH_OD_MODE, MSG_BLTOUCH_OD_MODE, MSG_BUTTON_CANCEL, bltouch._set_OD_mode, nullptr, GET_TEXT_F(MSG_BLTOUCH_MODE_CHANGE));
  204. ACTION_ITEM(MSG_BLTOUCH_MODE_STORE, bltouch._mode_store);
  205. CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_5V, MSG_BLTOUCH_MODE_STORE_5V, MSG_BUTTON_CANCEL, bltouch.mode_conv_5V, nullptr, GET_TEXT_F(MSG_BLTOUCH_MODE_CHANGE));
  206. CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_OD, MSG_BLTOUCH_MODE_STORE_OD, MSG_BUTTON_CANCEL, bltouch.mode_conv_OD, nullptr, GET_TEXT_F(MSG_BLTOUCH_MODE_CHANGE));
  207. ACTION_ITEM(MSG_BLTOUCH_MODE_ECHO, bltouch_report);
  208. #endif
  209. END_MENU();
  210. }
  211. #endif
  212. #if ENABLED(TOUCH_MI_PROBE)
  213. void menu_touchmi() {
  214. ui.defer_status_screen();
  215. START_MENU();
  216. BACK_ITEM(MSG_CONFIGURATION);
  217. GCODES_ITEM(MSG_TOUCHMI_INIT, F("M851 Z0\nG28\nG1 F200 Z0"));
  218. SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
  219. GCODES_ITEM(MSG_TOUCHMI_SAVE, F("M500\nG1 F200 Z10"));
  220. GCODES_ITEM(MSG_TOUCHMI_ZTEST, F("G28\nG1 F200 Z0"));
  221. END_MENU();
  222. }
  223. #endif
  224. #if ENABLED(CONTROLLER_FAN_MENU)
  225. #include "../../feature/controllerfan.h"
  226. void menu_controller_fan() {
  227. START_MENU();
  228. BACK_ITEM(MSG_CONFIGURATION);
  229. EDIT_ITEM_FAST(percent, MSG_CONTROLLER_FAN_IDLE_SPEED, &controllerFan.settings.idle_speed, CONTROLLERFAN_SPEED_MIN, 255);
  230. EDIT_ITEM(bool, MSG_CONTROLLER_FAN_AUTO_ON, &controllerFan.settings.auto_mode);
  231. if (controllerFan.settings.auto_mode) {
  232. EDIT_ITEM_FAST(percent, MSG_CONTROLLER_FAN_SPEED, &controllerFan.settings.active_speed, CONTROLLERFAN_SPEED_MIN, 255);
  233. EDIT_ITEM(uint16_4, MSG_CONTROLLER_FAN_DURATION, &controllerFan.settings.duration, 0, 4800);
  234. }
  235. END_MENU();
  236. }
  237. #endif
  238. #if ENABLED(FWRETRACT)
  239. #include "../../feature/fwretract.h"
  240. void menu_config_retract() {
  241. START_MENU();
  242. BACK_ITEM(MSG_CONFIGURATION);
  243. #if ENABLED(FWRETRACT_AUTORETRACT)
  244. EDIT_ITEM(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract);
  245. #endif
  246. EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100);
  247. #if HAS_MULTI_EXTRUDER
  248. EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100);
  249. #endif
  250. EDIT_ITEM(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999);
  251. EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_ZHOP, &fwretract.settings.retract_zraise, 0, 999);
  252. EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_extra, -100, 100);
  253. #if HAS_MULTI_EXTRUDER
  254. EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_extra, -100, 100);
  255. #endif
  256. EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999);
  257. #if HAS_MULTI_EXTRUDER
  258. EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999);
  259. #endif
  260. END_MENU();
  261. }
  262. #endif
  263. #if HAS_PREHEAT && DISABLED(SLIM_LCD_MENUS)
  264. void _menu_configuration_preheat_settings() {
  265. #define _MINTEMP_ITEM(N) HEATER_##N##_MINTEMP,
  266. #define _MAXTEMP_ITEM(N) HEATER_##N##_MAXTEMP,
  267. #define MINTEMP_ALL _MIN(REPEAT(HOTENDS, _MINTEMP_ITEM) 999)
  268. #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0)
  269. const uint8_t m = MenuItemBase::itemIndex;
  270. START_MENU();
  271. STATIC_ITEM_F(ui.get_preheat_label(m), SS_DEFAULT|SS_INVERT);
  272. BACK_ITEM(MSG_CONFIGURATION);
  273. #if HAS_FAN
  274. editable.uint8 = uint8_t(ui.material_preset[m].fan_speed);
  275. EDIT_ITEM_N(percent, m, MSG_FAN_SPEED, &editable.uint8, 0, 255, []{ ui.material_preset[MenuItemBase::itemIndex].fan_speed = editable.uint8; });
  276. #endif
  277. #if HAS_TEMP_HOTEND
  278. EDIT_ITEM(int3, MSG_NOZZLE, &ui.material_preset[m].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - (HOTEND_OVERSHOOT));
  279. #endif
  280. #if HAS_HEATED_BED
  281. EDIT_ITEM(int3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET);
  282. #endif
  283. #if ENABLED(EEPROM_SETTINGS)
  284. ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
  285. #endif
  286. END_MENU();
  287. }
  288. #endif
  289. #if ENABLED(CUSTOM_MENU_CONFIG)
  290. void _lcd_custom_menus_configuration_gcode(FSTR_P const fstr) {
  291. queue.inject(fstr);
  292. TERN_(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback());
  293. TERN_(CUSTOM_MENU_CONFIG_SCRIPT_RETURN, ui.return_to_status());
  294. }
  295. void custom_menus_configuration() {
  296. START_MENU();
  297. BACK_ITEM(MSG_MAIN);
  298. #define HAS_CUSTOM_ITEM_CONF(N) (defined(CONFIG_MENU_ITEM_##N##_DESC) && defined(CONFIG_MENU_ITEM_##N##_GCODE))
  299. #ifdef CUSTOM_MENU_CONFIG_SCRIPT_DONE
  300. #define _DONE_SCRIPT "\n" CUSTOM_MENU_CONFIG_SCRIPT_DONE
  301. #else
  302. #define _DONE_SCRIPT ""
  303. #endif
  304. #define GCODE_LAMBDA_CONF(N) []{ _lcd_custom_menus_configuration_gcode(F(CONFIG_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); }
  305. #define _CUSTOM_ITEM_CONF(N) ACTION_ITEM_F(F(CONFIG_MENU_ITEM_##N##_DESC), GCODE_LAMBDA_CONF(N));
  306. #define _CUSTOM_ITEM_CONF_CONFIRM(N) \
  307. SUBMENU_F(F(CONFIG_MENU_ITEM_##N##_DESC), []{ \
  308. MenuItem_confirm::confirm_screen( \
  309. GCODE_LAMBDA_CONF(N), nullptr, \
  310. F(CONFIG_MENU_ITEM_##N##_DESC "?") \
  311. ); \
  312. })
  313. #define CUSTOM_ITEM_CONF(N) do{ \
  314. constexpr char c = CONFIG_MENU_ITEM_##N##_GCODE[strlen(CONFIG_MENU_ITEM_##N##_GCODE) - 1]; \
  315. static_assert(c != '\n' && c != '\r', "CONFIG_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \
  316. if (ENABLED(CONFIG_MENU_ITEM_##N##_CONFIRM)) \
  317. _CUSTOM_ITEM_CONF_CONFIRM(N); \
  318. else \
  319. _CUSTOM_ITEM_CONF(N); \
  320. }while(0)
  321. #if HAS_CUSTOM_ITEM_CONF(1)
  322. CUSTOM_ITEM_CONF(1);
  323. #endif
  324. #if HAS_CUSTOM_ITEM_CONF(2)
  325. CUSTOM_ITEM_CONF(2);
  326. #endif
  327. #if HAS_CUSTOM_ITEM_CONF(3)
  328. CUSTOM_ITEM_CONF(3);
  329. #endif
  330. #if HAS_CUSTOM_ITEM_CONF(4)
  331. CUSTOM_ITEM_CONF(4);
  332. #endif
  333. #if HAS_CUSTOM_ITEM_CONF(5)
  334. CUSTOM_ITEM_CONF(5);
  335. #endif
  336. #if HAS_CUSTOM_ITEM_CONF(6)
  337. CUSTOM_ITEM_CONF(6);
  338. #endif
  339. #if HAS_CUSTOM_ITEM_CONF(7)
  340. CUSTOM_ITEM_CONF(7);
  341. #endif
  342. #if HAS_CUSTOM_ITEM_CONF(8)
  343. CUSTOM_ITEM_CONF(8);
  344. #endif
  345. #if HAS_CUSTOM_ITEM_CONF(9)
  346. CUSTOM_ITEM_CONF(9);
  347. #endif
  348. #if HAS_CUSTOM_ITEM_CONF(10)
  349. CUSTOM_ITEM_CONF(10);
  350. #endif
  351. #if HAS_CUSTOM_ITEM_CONF(11)
  352. CUSTOM_ITEM_CONF(11);
  353. #endif
  354. #if HAS_CUSTOM_ITEM_CONF(12)
  355. CUSTOM_ITEM_CONF(12);
  356. #endif
  357. #if HAS_CUSTOM_ITEM_CONF(13)
  358. CUSTOM_ITEM_CONF(13);
  359. #endif
  360. #if HAS_CUSTOM_ITEM_CONF(14)
  361. CUSTOM_ITEM_CONF(14);
  362. #endif
  363. #if HAS_CUSTOM_ITEM_CONF(15)
  364. CUSTOM_ITEM_CONF(15);
  365. #endif
  366. #if HAS_CUSTOM_ITEM_CONF(16)
  367. CUSTOM_ITEM_CONF(16);
  368. #endif
  369. #if HAS_CUSTOM_ITEM_CONF(17)
  370. CUSTOM_ITEM_CONF(17);
  371. #endif
  372. #if HAS_CUSTOM_ITEM_CONF(18)
  373. CUSTOM_ITEM_CONF(18);
  374. #endif
  375. #if HAS_CUSTOM_ITEM_CONF(19)
  376. CUSTOM_ITEM_CONF(19);
  377. #endif
  378. #if HAS_CUSTOM_ITEM_CONF(20)
  379. CUSTOM_ITEM_CONF(20);
  380. #endif
  381. #if HAS_CUSTOM_ITEM_CONF(21)
  382. CUSTOM_ITEM_CONF(21);
  383. #endif
  384. #if HAS_CUSTOM_ITEM_CONF(22)
  385. CUSTOM_ITEM_CONF(22);
  386. #endif
  387. #if HAS_CUSTOM_ITEM_CONF(23)
  388. CUSTOM_ITEM_CONF(23);
  389. #endif
  390. #if HAS_CUSTOM_ITEM_CONF(24)
  391. CUSTOM_ITEM_CONF(24);
  392. #endif
  393. #if HAS_CUSTOM_ITEM_CONF(25)
  394. CUSTOM_ITEM_CONF(25);
  395. #endif
  396. END_MENU();
  397. }
  398. #endif // CUSTOM_MENU_CONFIG
  399. void menu_configuration() {
  400. const bool busy = printer_busy();
  401. START_MENU();
  402. BACK_ITEM(MSG_MAIN);
  403. //
  404. // Debug Menu when certain options are enabled
  405. //
  406. #if HAS_DEBUG_MENU
  407. SUBMENU(MSG_DEBUG_MENU, menu_debug);
  408. #endif
  409. #if ENABLED(CUSTOM_MENU_CONFIG)
  410. if (TERN1(CUSTOM_MENU_CONFIG_ONLY_IDLE, !busy)) {
  411. #ifdef CUSTOM_MENU_CONFIG_TITLE
  412. SUBMENU_F(F(CUSTOM_MENU_CONFIG_TITLE), custom_menus_configuration);
  413. #else
  414. SUBMENU(MSG_CUSTOM_COMMANDS, custom_menus_configuration);
  415. #endif
  416. }
  417. #endif
  418. SUBMENU(MSG_ADVANCED_SETTINGS, menu_advanced_settings);
  419. #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
  420. SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
  421. #elif HAS_BED_PROBE
  422. EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
  423. #endif
  424. //
  425. // Set Fan Controller speed
  426. //
  427. #if ENABLED(CONTROLLER_FAN_MENU)
  428. SUBMENU(MSG_CONTROLLER_FAN, menu_controller_fan);
  429. #endif
  430. if (!busy) {
  431. #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION)
  432. SUBMENU(MSG_DELTA_CALIBRATE, menu_delta_calibrate);
  433. #endif
  434. #if HAS_HOTEND_OFFSET
  435. SUBMENU(MSG_OFFSETS_MENU, menu_tool_offsets);
  436. #endif
  437. #if ENABLED(DUAL_X_CARRIAGE)
  438. SUBMENU(MSG_IDEX_MENU, menu_idex);
  439. #endif
  440. #if ENABLED(BLTOUCH)
  441. SUBMENU(MSG_BLTOUCH, menu_bltouch);
  442. #endif
  443. #if ENABLED(TOUCH_MI_PROBE)
  444. SUBMENU(MSG_TOUCHMI_PROBE, menu_touchmi);
  445. #endif
  446. }
  447. //
  448. // Set single nozzle filament retract and prime length
  449. //
  450. #if HAS_MULTI_EXTRUDER
  451. SUBMENU(MSG_TOOL_CHANGE, menu_tool_change);
  452. #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
  453. SUBMENU(MSG_TOOL_MIGRATION, menu_toolchange_migration);
  454. #endif
  455. #endif
  456. #if HAS_LCD_BRIGHTNESS
  457. EDIT_ITEM_FAST(uint8, MSG_BRIGHTNESS, &ui.brightness, LCD_BRIGHTNESS_MIN, LCD_BRIGHTNESS_MAX, ui.refresh_brightness, true);
  458. #endif
  459. #if HAS_LCD_CONTRAST && LCD_CONTRAST_MIN < LCD_CONTRAST_MAX
  460. EDIT_ITEM_FAST(uint8, MSG_CONTRAST, &ui.contrast, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX, ui.refresh_contrast, true);
  461. #endif
  462. //
  463. // Set display backlight / sleep timeout
  464. //
  465. #if LCD_BACKLIGHT_TIMEOUT_MINS
  466. EDIT_ITEM(uint8, MSG_SCREEN_TIMEOUT, &ui.backlight_timeout_minutes, ui.backlight_timeout_min, ui.backlight_timeout_max, ui.refresh_backlight_timeout);
  467. #elif HAS_DISPLAY_SLEEP && DISABLED(TFT_COLOR_UI)
  468. EDIT_ITEM(uint8, MSG_SCREEN_TIMEOUT, &ui.sleep_timeout_minutes, ui.sleep_timeout_min, ui.sleep_timeout_max, ui.refresh_screen_timeout);
  469. #endif
  470. #if ENABLED(FWRETRACT)
  471. SUBMENU(MSG_RETRACT, menu_config_retract);
  472. #endif
  473. #if HAS_FILAMENT_SENSOR
  474. EDIT_ITEM(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset);
  475. #endif
  476. #if HAS_FANCHECK
  477. EDIT_ITEM(bool, MSG_FANCHECK, &fan_check.enabled);
  478. #endif
  479. #if ENABLED(POWER_LOSS_RECOVERY)
  480. EDIT_ITEM(bool, MSG_OUTAGE_RECOVERY, &recovery.enabled, recovery.changed);
  481. #endif
  482. // Preheat configurations
  483. #if HAS_PREHEAT && DISABLED(SLIM_LCD_MENUS)
  484. LOOP_L_N(m, PREHEAT_COUNT)
  485. SUBMENU_N_f(m, ui.get_preheat_label(m), MSG_PREHEAT_M_SETTINGS, _menu_configuration_preheat_settings);
  486. #endif
  487. #if ENABLED(SOUND_MENU_ITEM)
  488. EDIT_ITEM(bool, MSG_SOUND, &ui.sound_on, []{ ui.chirp(); });
  489. #endif
  490. #if ENABLED(EEPROM_SETTINGS)
  491. ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
  492. if (!busy) ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings);
  493. #endif
  494. if (!busy) ACTION_ITEM(MSG_RESTORE_DEFAULTS, ui.reset_settings);
  495. END_MENU();
  496. }
  497. #endif // HAS_MARLINUI_MENU