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.

M569.cpp 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. #include "../../../inc/MarlinConfig.h"
  23. #if HAS_STEALTHCHOP
  24. #include "../../gcode.h"
  25. #include "../../../feature/tmc_util.h"
  26. #include "../../../module/stepper/indirection.h"
  27. template<typename TMC>
  28. void tmc_say_stealth_status(TMC &st) {
  29. st.printLabel();
  30. SERIAL_ECHOPGM(" driver mode:\t");
  31. SERIAL_ECHOLNF(st.get_stealthChop() ? F("stealthChop") : F("spreadCycle"));
  32. }
  33. template<typename TMC>
  34. void tmc_set_stealthChop(TMC &st, const bool enable) {
  35. st.stored.stealthChop_enabled = enable;
  36. st.refresh_stepping_mode();
  37. }
  38. static void set_stealth_status(const bool enable, const int8_t target_e_stepper) {
  39. #define TMC_SET_STEALTH(Q) tmc_set_stealthChop(stepper##Q, enable)
  40. #if X_HAS_STEALTHCHOP || Y_HAS_STEALTHCHOP || Z_HAS_STEALTHCHOP \
  41. || I_HAS_STEALTHCHOP || J_HAS_STEALTHCHOP || K_HAS_STEALTHCHOP \
  42. || X2_HAS_STEALTHCHOP || Y2_HAS_STEALTHCHOP || Z2_HAS_STEALTHCHOP || Z3_HAS_STEALTHCHOP || Z4_HAS_STEALTHCHOP
  43. const uint8_t index = parser.byteval('I');
  44. #endif
  45. LOOP_LOGICAL_AXES(i) if (parser.seen(axis_codes[i])) {
  46. switch (i) {
  47. case X_AXIS:
  48. TERN_(X_HAS_STEALTHCHOP, if (index == 0) TMC_SET_STEALTH(X));
  49. TERN_(X2_HAS_STEALTHCHOP, if (index == 1) TMC_SET_STEALTH(X2));
  50. break;
  51. #if HAS_Y_AXIS
  52. case Y_AXIS:
  53. TERN_(Y_HAS_STEALTHCHOP, if (index == 0) TMC_SET_STEALTH(Y));
  54. TERN_(Y2_HAS_STEALTHCHOP, if (index == 1) TMC_SET_STEALTH(Y2));
  55. break;
  56. #endif
  57. #if HAS_Z_AXIS
  58. case Z_AXIS:
  59. TERN_(Z_HAS_STEALTHCHOP, if (index == 0) TMC_SET_STEALTH(Z));
  60. TERN_(Z2_HAS_STEALTHCHOP, if (index == 1) TMC_SET_STEALTH(Z2));
  61. TERN_(Z3_HAS_STEALTHCHOP, if (index == 2) TMC_SET_STEALTH(Z3));
  62. TERN_(Z4_HAS_STEALTHCHOP, if (index == 3) TMC_SET_STEALTH(Z4));
  63. break;
  64. #endif
  65. #if I_HAS_STEALTHCHOP
  66. case I_AXIS: TMC_SET_STEALTH(I); break;
  67. #endif
  68. #if J_HAS_STEALTHCHOP
  69. case J_AXIS: TMC_SET_STEALTH(J); break;
  70. #endif
  71. #if K_HAS_STEALTHCHOP
  72. case K_AXIS: TMC_SET_STEALTH(K); break;
  73. #endif
  74. #if E_STEPPERS
  75. case E_AXIS: {
  76. if (target_e_stepper < 0) return;
  77. switch (target_e_stepper) {
  78. TERN_(E0_HAS_STEALTHCHOP, case 0: TMC_SET_STEALTH(E0); break;)
  79. TERN_(E1_HAS_STEALTHCHOP, case 1: TMC_SET_STEALTH(E1); break;)
  80. TERN_(E2_HAS_STEALTHCHOP, case 2: TMC_SET_STEALTH(E2); break;)
  81. TERN_(E3_HAS_STEALTHCHOP, case 3: TMC_SET_STEALTH(E3); break;)
  82. TERN_(E4_HAS_STEALTHCHOP, case 4: TMC_SET_STEALTH(E4); break;)
  83. TERN_(E5_HAS_STEALTHCHOP, case 5: TMC_SET_STEALTH(E5); break;)
  84. TERN_(E6_HAS_STEALTHCHOP, case 6: TMC_SET_STEALTH(E6); break;)
  85. TERN_(E7_HAS_STEALTHCHOP, case 7: TMC_SET_STEALTH(E7); break;)
  86. }
  87. } break;
  88. #endif
  89. }
  90. }
  91. }
  92. static void say_stealth_status() {
  93. #define TMC_SAY_STEALTH_STATUS(Q) tmc_say_stealth_status(stepper##Q)
  94. OPTCODE( X_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(X))
  95. OPTCODE(X2_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(X2))
  96. OPTCODE( Y_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(Y))
  97. OPTCODE(Y2_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(Y2))
  98. OPTCODE( Z_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(Z))
  99. OPTCODE(Z2_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(Z2))
  100. OPTCODE(Z3_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(Z3))
  101. OPTCODE(Z4_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(Z4))
  102. OPTCODE( I_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(I))
  103. OPTCODE( J_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(J))
  104. OPTCODE( K_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(K))
  105. OPTCODE(E0_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(E0))
  106. OPTCODE(E1_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(E1))
  107. OPTCODE(E2_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(E2))
  108. OPTCODE(E3_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(E3))
  109. OPTCODE(E4_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(E4))
  110. OPTCODE(E5_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(E5))
  111. OPTCODE(E6_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(E6))
  112. OPTCODE(E7_HAS_STEALTHCHOP, TMC_SAY_STEALTH_STATUS(E7))
  113. }
  114. /**
  115. * M569: Enable stealthChop on an axis
  116. *
  117. * S[1|0] to enable or disable
  118. * XYZE to target an axis
  119. * No arguments reports the stealthChop status of all capable drivers.
  120. */
  121. void GcodeSuite::M569() {
  122. if (parser.seen('S'))
  123. set_stealth_status(parser.value_bool(), get_target_e_stepper_from_command());
  124. else
  125. say_stealth_status();
  126. }
  127. void GcodeSuite::M569_report(const bool forReplay/*=true*/) {
  128. report_heading(forReplay, PSTR(STR_DRIVER_STEPPING_MODE));
  129. auto say_M569 = [](const bool forReplay, const char * const etc=nullptr, const bool eol=false) {
  130. if (!forReplay) SERIAL_ECHO_START();
  131. SERIAL_ECHOPGM(" M569 S1");
  132. if (etc) {
  133. SERIAL_CHAR(' ');
  134. SERIAL_ECHOPGM_P(etc);
  135. }
  136. if (eol) SERIAL_EOL();
  137. };
  138. const bool chop_x = TERN0(X_HAS_STEALTHCHOP, stepperX.get_stored_stealthChop()),
  139. chop_y = TERN0(Y_HAS_STEALTHCHOP, stepperY.get_stored_stealthChop()),
  140. chop_z = TERN0(Z_HAS_STEALTHCHOP, stepperZ.get_stored_stealthChop()),
  141. chop_i = TERN0(I_HAS_STEALTHCHOP, stepperI.get_stored_stealthChop()),
  142. chop_j = TERN0(J_HAS_STEALTHCHOP, stepperJ.get_stored_stealthChop()),
  143. chop_k = TERN0(K_HAS_STEALTHCHOP, stepperK.get_stored_stealthChop());
  144. if (chop_x || chop_y || chop_z || chop_i || chop_j || chop_k) {
  145. say_M569(forReplay);
  146. LINEAR_AXIS_CODE(
  147. if (chop_x) SERIAL_ECHOPGM_P(SP_X_STR),
  148. if (chop_y) SERIAL_ECHOPGM_P(SP_Y_STR),
  149. if (chop_z) SERIAL_ECHOPGM_P(SP_Z_STR),
  150. if (chop_i) SERIAL_ECHOPGM_P(SP_I_STR),
  151. if (chop_j) SERIAL_ECHOPGM_P(SP_J_STR),
  152. if (chop_k) SERIAL_ECHOPGM_P(SP_K_STR)
  153. );
  154. SERIAL_EOL();
  155. }
  156. const bool chop_x2 = TERN0(X2_HAS_STEALTHCHOP, stepperX2.get_stored_stealthChop()),
  157. chop_y2 = TERN0(Y2_HAS_STEALTHCHOP, stepperY2.get_stored_stealthChop()),
  158. chop_z2 = TERN0(Z2_HAS_STEALTHCHOP, stepperZ2.get_stored_stealthChop());
  159. if (chop_x2 || chop_y2 || chop_z2) {
  160. say_M569(forReplay, PSTR("I1"));
  161. if (chop_x2) SERIAL_ECHOPGM_P(SP_X_STR);
  162. if (chop_y2) SERIAL_ECHOPGM_P(SP_Y_STR);
  163. if (chop_z2) SERIAL_ECHOPGM_P(SP_Z_STR);
  164. SERIAL_EOL();
  165. }
  166. if (TERN0(Z3_HAS_STEALTHCHOP, stepperZ3.get_stored_stealthChop())) { say_M569(forReplay, PSTR("I2 Z"), true); }
  167. if (TERN0(Z4_HAS_STEALTHCHOP, stepperZ4.get_stored_stealthChop())) { say_M569(forReplay, PSTR("I3 Z"), true); }
  168. if (TERN0( I_HAS_STEALTHCHOP, stepperI.get_stored_stealthChop())) { say_M569(forReplay, SP_I_STR, true); }
  169. if (TERN0( J_HAS_STEALTHCHOP, stepperJ.get_stored_stealthChop())) { say_M569(forReplay, SP_J_STR, true); }
  170. if (TERN0( K_HAS_STEALTHCHOP, stepperK.get_stored_stealthChop())) { say_M569(forReplay, SP_K_STR, true); }
  171. if (TERN0(E0_HAS_STEALTHCHOP, stepperE0.get_stored_stealthChop())) { say_M569(forReplay, PSTR("T0 E"), true); }
  172. if (TERN0(E1_HAS_STEALTHCHOP, stepperE1.get_stored_stealthChop())) { say_M569(forReplay, PSTR("T1 E"), true); }
  173. if (TERN0(E2_HAS_STEALTHCHOP, stepperE2.get_stored_stealthChop())) { say_M569(forReplay, PSTR("T2 E"), true); }
  174. if (TERN0(E3_HAS_STEALTHCHOP, stepperE3.get_stored_stealthChop())) { say_M569(forReplay, PSTR("T3 E"), true); }
  175. if (TERN0(E4_HAS_STEALTHCHOP, stepperE4.get_stored_stealthChop())) { say_M569(forReplay, PSTR("T4 E"), true); }
  176. if (TERN0(E5_HAS_STEALTHCHOP, stepperE5.get_stored_stealthChop())) { say_M569(forReplay, PSTR("T5 E"), true); }
  177. if (TERN0(E6_HAS_STEALTHCHOP, stepperE6.get_stored_stealthChop())) { say_M569(forReplay, PSTR("T6 E"), true); }
  178. if (TERN0(E7_HAS_STEALTHCHOP, stepperE7.get_stored_stealthChop())) { say_M569(forReplay, PSTR("T7 E"), true); }
  179. }
  180. #endif // HAS_STEALTHCHOP