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 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (C) 2019 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. // Configuration Menu
  24. //
  25. #include "../../inc/MarlinConfigPre.h"
  26. #if HAS_LCD_MENU
  27. #include "menu.h"
  28. #include "../../module/configuration_store.h"
  29. #if HAS_FILAMENT_SENSOR
  30. #include "../../feature/runout.h"
  31. #endif
  32. #if ENABLED(POWER_LOSS_RECOVERY)
  33. #include "../../feature/power_loss_recovery.h"
  34. #endif
  35. #if HAS_BED_PROBE
  36. #include "../../module/probe.h"
  37. #endif
  38. #define HAS_DEBUG_MENU ENABLED(LCD_PROGRESS_BAR_TEST)
  39. void menu_advanced_settings();
  40. void menu_delta_calibrate();
  41. static void lcd_factory_settings() {
  42. settings.reset();
  43. ui.completion_feedback();
  44. }
  45. #if ENABLED(LCD_PROGRESS_BAR_TEST)
  46. #include "../lcdprint.h"
  47. static void progress_bar_test() {
  48. ui.encoder_direction_normal();
  49. static int8_t bar_percent = 0;
  50. if (ui.use_click()) {
  51. ui.goto_previous_screen();
  52. ui.set_custom_characters(CHARSET_MENU);
  53. return;
  54. }
  55. bar_percent += (int8_t)ui.encoderPosition;
  56. bar_percent = constrain(bar_percent, 0, 100);
  57. ui.encoderPosition = 0;
  58. draw_menu_item_static(0, PSTR(MSG_PROGRESS_BAR_TEST), true, true);
  59. lcd_moveto((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2);
  60. lcd_put_int(bar_percent); lcd_put_wchar('%');
  61. lcd_moveto(0, LCD_HEIGHT - 1); ui.draw_progress_bar(bar_percent);
  62. }
  63. void _progress_bar_test() {
  64. ui.goto_screen(progress_bar_test);
  65. ui.set_custom_characters(CHARSET_INFO);
  66. }
  67. #endif // LCD_PROGRESS_BAR_TEST
  68. #if HAS_DEBUG_MENU
  69. void menu_debug() {
  70. START_MENU();
  71. MENU_BACK(MSG_MAIN);
  72. #if ENABLED(LCD_PROGRESS_BAR_TEST)
  73. MENU_ITEM(submenu, MSG_PROGRESS_BAR_TEST, _progress_bar_test);
  74. #endif
  75. END_MENU();
  76. }
  77. #endif
  78. #if EXTRUDERS > 1
  79. #include "../../module/tool_change.h"
  80. void menu_tool_change() {
  81. START_MENU();
  82. MENU_BACK(MSG_MAIN);
  83. #if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
  84. MENU_ITEM_EDIT(float3, MSG_FILAMENT_SWAP_LENGTH, &toolchange_settings.swap_length, 0, 200);
  85. MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_RETRACT_SPD, &toolchange_settings.retract_speed, 10, 5400);
  86. MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_PRIME_SPD, &toolchange_settings.prime_speed, 10, 5400);
  87. #endif
  88. MENU_ITEM_EDIT(float3, MSG_TOOL_CHANGE_ZLIFT, &toolchange_settings.z_raise, 0, 10);
  89. END_MENU();
  90. }
  91. #endif
  92. #if ENABLED(DUAL_X_CARRIAGE)
  93. #include "../../module/motion.h"
  94. #include "../../gcode/queue.h"
  95. void _recalc_IDEX_settings() {
  96. if (active_extruder) { // For the 2nd extruder re-home so the next tool-change gets the new offsets.
  97. enqueue_and_echo_commands_P(PSTR("G28")); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary.
  98. active_extruder = 0;
  99. }
  100. }
  101. void menu_IDEX() {
  102. START_MENU();
  103. MENU_BACK(MSG_MAIN);
  104. MENU_ITEM(gcode, MSG_IDEX_MODE_AUTOPARK, PSTR("M605 S1\nG28 X\nG1 X100"));
  105. const bool need_g28 = !(TEST(axis_known_position, Y_AXIS) && TEST(axis_known_position, Z_AXIS));
  106. MENU_ITEM(gcode, MSG_IDEX_MODE_DUPLICATE, need_g28
  107. ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100") // If Y or Z is not homed, do a full G28 first
  108. : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100")
  109. );
  110. MENU_ITEM(gcode, MSG_IDEX_MODE_MIRRORED_COPY, need_g28
  111. ? 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
  112. : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200")
  113. );
  114. MENU_ITEM(gcode, MSG_IDEX_MODE_FULL_CTRL, PSTR("M605 S0\nG28 X"));
  115. 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);
  116. MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_Y_OFFSET , &hotend_offset[Y_AXIS][1], -10.0, 10.0, _recalc_IDEX_settings);
  117. MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_Z_OFFSET , &hotend_offset[Z_AXIS][1], -10.0, 10.0, _recalc_IDEX_settings);
  118. MENU_ITEM(gcode, MSG_IDEX_SAVE_OFFSETS, PSTR("M500"));
  119. END_MENU();
  120. }
  121. #endif
  122. #if ENABLED(BLTOUCH)
  123. void menu_bltouch() {
  124. START_MENU();
  125. MENU_BACK(MSG_MAIN);
  126. MENU_ITEM(gcode, MSG_BLTOUCH_RESET, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_RESET)));
  127. MENU_ITEM(gcode, MSG_BLTOUCH_SELFTEST, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_SELFTEST)));
  128. MENU_ITEM(gcode, MSG_BLTOUCH_DEPLOY, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_DEPLOY)));
  129. MENU_ITEM(gcode, MSG_BLTOUCH_STOW, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_STOW)));
  130. #if ENABLED(BLTOUCH_V3)
  131. MENU_ITEM(gcode, MSG_BLTOUCH_SW_MODE, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_SW_MODE)));
  132. MENU_ITEM(gcode, MSG_BLTOUCH_5V_MODE, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_5V_MODE)));
  133. MENU_ITEM(gcode, MSG_BLTOUCH_OD_MODE, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_OD_MODE)));
  134. #endif
  135. END_MENU();
  136. }
  137. #endif
  138. #if ENABLED(MENU_ITEM_CASE_LIGHT)
  139. #include "../../feature/caselight.h"
  140. void menu_case_light() {
  141. START_MENU();
  142. MENU_BACK(MSG_MAIN);
  143. MENU_ITEM_EDIT_CALLBACK(uint8, MSG_CASE_LIGHT_BRIGHTNESS, &case_light_brightness, 0, 255, update_case_light, true);
  144. MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light);
  145. END_MENU();
  146. }
  147. #endif
  148. #if ENABLED(FWRETRACT)
  149. #include "../../feature/fwretract.h"
  150. void menu_config_retract() {
  151. START_MENU();
  152. MENU_BACK(MSG_CONTROL);
  153. #if ENABLED(FWRETRACT_AUTORETRACT)
  154. MENU_ITEM_EDIT_CALLBACK(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract);
  155. #endif
  156. MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100);
  157. #if EXTRUDERS > 1
  158. MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100);
  159. #endif
  160. MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999);
  161. MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_ZHOP, &fwretract.settings.retract_zraise, 0, 999);
  162. MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_extra, -100, 100);
  163. #if EXTRUDERS > 1
  164. MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_extra, -100, 100);
  165. #endif
  166. MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999);
  167. #if EXTRUDERS > 1
  168. MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999);
  169. #endif
  170. END_MENU();
  171. }
  172. #endif
  173. #if DISABLED(SLIM_LCD_MENUS)
  174. void _menu_configuration_preheat_settings(const uint8_t material) {
  175. #if HOTENDS > 5
  176. #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP, HEATER_5_MINTEMP)
  177. #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP)
  178. #elif HOTENDS > 4
  179. #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP)
  180. #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP)
  181. #elif HOTENDS > 3
  182. #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP)
  183. #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP)
  184. #elif HOTENDS > 2
  185. #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP)
  186. #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP)
  187. #elif HOTENDS > 1
  188. #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP)
  189. #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP)
  190. #else
  191. #define MINTEMP_ALL HEATER_0_MINTEMP
  192. #define MAXTEMP_ALL HEATER_0_MAXTEMP
  193. #endif
  194. START_MENU();
  195. MENU_BACK(MSG_CONFIGURATION);
  196. MENU_ITEM_EDIT(uint8, MSG_FAN_SPEED, &ui.preheat_fan_speed[material], 0, 255);
  197. #if HAS_TEMP_HOTEND
  198. MENU_ITEM_EDIT(int3, MSG_NOZZLE, &ui.preheat_hotend_temp[material], MINTEMP_ALL, MAXTEMP_ALL - 15);
  199. #endif
  200. #if HAS_HEATED_BED
  201. MENU_ITEM_EDIT(int3, MSG_BED, &ui.preheat_bed_temp[material], BED_MINTEMP, BED_MAXTEMP - 10);
  202. #endif
  203. #if ENABLED(EEPROM_SETTINGS)
  204. MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings);
  205. #endif
  206. END_MENU();
  207. }
  208. void menu_preheat_material1_settings() { _menu_configuration_preheat_settings(0); }
  209. void menu_preheat_material2_settings() { _menu_configuration_preheat_settings(1); }
  210. #endif
  211. void menu_configuration() {
  212. START_MENU();
  213. MENU_BACK(MSG_MAIN);
  214. //
  215. // Debug Menu when certain options are enabled
  216. //
  217. #if HAS_DEBUG_MENU
  218. MENU_ITEM(submenu, MSG_DEBUG_MENU, menu_debug);
  219. #endif
  220. MENU_ITEM(submenu, MSG_ADVANCED_SETTINGS, menu_advanced_settings);
  221. #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
  222. MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
  223. #elif HAS_BED_PROBE
  224. MENU_ITEM_EDIT(float52, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
  225. #endif
  226. const bool busy = printer_busy();
  227. if (!busy) {
  228. //
  229. // Delta Calibration
  230. //
  231. #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION)
  232. MENU_ITEM(submenu, MSG_DELTA_CALIBRATE, menu_delta_calibrate);
  233. #endif
  234. #if ENABLED(DUAL_X_CARRIAGE)
  235. MENU_ITEM(submenu, MSG_IDEX_MENU, menu_IDEX);
  236. #endif
  237. #if ENABLED(BLTOUCH)
  238. MENU_ITEM(submenu, MSG_BLTOUCH, menu_bltouch);
  239. #endif
  240. }
  241. //
  242. // Set single nozzle filament retract and prime length
  243. //
  244. #if EXTRUDERS > 1
  245. MENU_ITEM(submenu, MSG_TOOL_CHANGE, menu_tool_change);
  246. #endif
  247. //
  248. // Set Case light on/off/brightness
  249. //
  250. #if ENABLED(MENU_ITEM_CASE_LIGHT)
  251. if (PWM_PIN(CASE_LIGHT_PIN))
  252. MENU_ITEM(submenu, MSG_CASE_LIGHT, menu_case_light);
  253. else
  254. MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light);
  255. #endif
  256. #if HAS_LCD_CONTRAST
  257. MENU_ITEM_EDIT_CALLBACK(int3, MSG_CONTRAST, &ui.contrast, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX, ui.refresh_contrast, true);
  258. #endif
  259. #if ENABLED(FWRETRACT)
  260. MENU_ITEM(submenu, MSG_RETRACT, menu_config_retract);
  261. #endif
  262. #if HAS_FILAMENT_SENSOR
  263. MENU_ITEM_EDIT_CALLBACK(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset);
  264. #endif
  265. #if ENABLED(POWER_LOSS_RECOVERY)
  266. MENU_ITEM_EDIT_CALLBACK(bool, MSG_OUTAGE_RECOVERY, &recovery.enabled, recovery.changed);
  267. #endif
  268. #if DISABLED(SLIM_LCD_MENUS)
  269. // Preheat configurations
  270. MENU_ITEM(submenu, MSG_PREHEAT_1_SETTINGS, menu_preheat_material1_settings);
  271. MENU_ITEM(submenu, MSG_PREHEAT_2_SETTINGS, menu_preheat_material2_settings);
  272. #endif
  273. #if ENABLED(EEPROM_SETTINGS)
  274. MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings);
  275. if (!busy)
  276. MENU_ITEM(function, MSG_LOAD_EEPROM, lcd_load_settings);
  277. #endif
  278. if (!busy)
  279. MENU_ITEM(function, MSG_RESTORE_FAILSAFE, lcd_factory_settings);
  280. END_MENU();
  281. }
  282. #endif // HAS_LCD_MENU