My Marlin configs for Fabrikator Mini and CTC i3 Pro B
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

menu_configuration.cpp 12KB

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