errors_list.h 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. // Extracted from Prusa-Error-Codes repo
  2. // Subject to automation and optimization
  3. // BEWARE - this file shall be included only into mmu2_error_converter.cpp, not anywhere else!
  4. #pragma once
  5. #include "inttypes.h"
  6. #include "../language.h"
  7. #include <avr/pgmspace.h>
  8. #include "buttons.h"
  9. namespace MMU2 {
  10. static constexpr uint8_t ERR_MMU_CODE = 4;
  11. typedef enum : uint16_t {
  12. ERR_UNDEF = 0,
  13. ERR_MECHANICAL = 100,
  14. ERR_MECHANICAL_FINDA_DIDNT_TRIGGER = 101,
  15. ERR_MECHANICAL_FINDA_DIDNT_GO_OFF = 102,
  16. ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER = 103,
  17. ERR_MECHANICAL_FSENSOR_DIDNT_GO_OFF = 104,
  18. ERR_MECHANICAL_PULLEY_CANNOT_MOVE = 105,
  19. ERR_MECHANICAL_FSENSOR_TOO_EARLY = 106,
  20. ERR_MECHANICAL_INSPECT_FINDA = 107,
  21. ERR_MECHANICAL_LOAD_TO_EXTRUDER_FAILED = 108,
  22. ERR_MECHANICAL_SELECTOR_CANNOT_HOME = 115,
  23. ERR_MECHANICAL_SELECTOR_CANNOT_MOVE = 116,
  24. ERR_MECHANICAL_IDLER_CANNOT_HOME = 125,
  25. ERR_MECHANICAL_IDLER_CANNOT_MOVE = 126,
  26. ERR_TEMPERATURE = 200,
  27. ERR_TEMPERATURE_PULLEY_WARNING_TMC_TOO_HOT = 201,
  28. ERR_TEMPERATURE_SELECTOR_WARNING_TMC_TOO_HOT = 211,
  29. ERR_TEMPERATURE_IDLER_WARNING_TMC_TOO_HOT = 221,
  30. ERR_TEMPERATURE_PULLEY_TMC_OVERHEAT_ERROR = 202,
  31. ERR_TEMPERATURE_SELECTOR_TMC_OVERHEAT_ERROR = 212,
  32. ERR_TEMPERATURE_IDLER_TMC_OVERHEAT_ERROR = 222,
  33. ERR_ELECTRICAL = 300,
  34. ERR_ELECTRICAL_PULLEY_TMC_DRIVER_ERROR = 301,
  35. ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_ERROR = 311,
  36. ERR_ELECTRICAL_IDLER_TMC_DRIVER_ERROR = 321,
  37. ERR_ELECTRICAL_PULLEY_TMC_DRIVER_RESET = 302,
  38. ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_RESET = 312,
  39. ERR_ELECTRICAL_IDLER_TMC_DRIVER_RESET = 322,
  40. ERR_ELECTRICAL_PULLEY_TMC_UNDERVOLTAGE_ERROR = 303,
  41. ERR_ELECTRICAL_SELECTOR_TMC_UNDERVOLTAGE_ERROR = 313,
  42. ERR_ELECTRICAL_IDLER_TMC_UNDERVOLTAGE_ERROR = 323,
  43. ERR_ELECTRICAL_PULLEY_TMC_DRIVER_SHORTED = 304,
  44. ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED = 314,
  45. ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED = 324,
  46. ERR_ELECTRICAL_PULLEY_SELFTEST_FAILED = 305,
  47. ERR_ELECTRICAL_SELECTOR_SELFTEST_FAILED = 315,
  48. ERR_ELECTRICAL_IDLER_SELFTEST_FAILED = 325,
  49. ERR_CONNECT = 400,
  50. ERR_CONNECT_MMU_NOT_RESPONDING = 401,
  51. ERR_CONNECT_COMMUNICATION_ERROR = 402,
  52. ERR_SYSTEM = 500,
  53. ERR_SYSTEM_FILAMENT_ALREADY_LOADED = 501,
  54. ERR_SYSTEM_INVALID_TOOL = 502,
  55. ERR_SYSTEM_QUEUE_FULL = 503,
  56. ERR_SYSTEM_FW_UPDATE_NEEDED = 504,
  57. ERR_SYSTEM_FW_RUNTIME_ERROR = 505,
  58. ERR_SYSTEM_UNLOAD_MANUALLY = 506,
  59. ERR_SYSTEM_FILAMENT_EJECTED = 507,
  60. ERR_OTHER = 900
  61. } err_num_t;
  62. // Avr gcc has serious trouble understanding static data structures in PROGMEM
  63. // and inadvertedly falls back to copying the whole structure into RAM (which is obviously unwanted).
  64. // But since this file ought to be generated in the future from yaml prescription,
  65. // it really makes no difference if there are "nice" data structures or plain arrays.
  66. static const constexpr uint16_t errorCodes[] PROGMEM = {
  67. ERR_MECHANICAL_FINDA_DIDNT_TRIGGER,
  68. ERR_MECHANICAL_FINDA_DIDNT_GO_OFF,
  69. ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER,
  70. ERR_MECHANICAL_FSENSOR_DIDNT_GO_OFF,
  71. ERR_MECHANICAL_PULLEY_CANNOT_MOVE,
  72. ERR_MECHANICAL_FSENSOR_TOO_EARLY,
  73. ERR_MECHANICAL_INSPECT_FINDA,
  74. ERR_MECHANICAL_LOAD_TO_EXTRUDER_FAILED,
  75. ERR_MECHANICAL_SELECTOR_CANNOT_HOME,
  76. ERR_MECHANICAL_SELECTOR_CANNOT_MOVE,
  77. ERR_MECHANICAL_IDLER_CANNOT_HOME,
  78. ERR_MECHANICAL_IDLER_CANNOT_MOVE,
  79. ERR_TEMPERATURE_PULLEY_WARNING_TMC_TOO_HOT,
  80. ERR_TEMPERATURE_SELECTOR_WARNING_TMC_TOO_HOT,
  81. ERR_TEMPERATURE_IDLER_WARNING_TMC_TOO_HOT,
  82. ERR_TEMPERATURE_PULLEY_TMC_OVERHEAT_ERROR,
  83. ERR_TEMPERATURE_SELECTOR_TMC_OVERHEAT_ERROR,
  84. ERR_TEMPERATURE_IDLER_TMC_OVERHEAT_ERROR,
  85. ERR_ELECTRICAL_PULLEY_TMC_DRIVER_ERROR,
  86. ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_ERROR,
  87. ERR_ELECTRICAL_IDLER_TMC_DRIVER_ERROR,
  88. ERR_ELECTRICAL_PULLEY_TMC_DRIVER_RESET,
  89. ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_RESET,
  90. ERR_ELECTRICAL_IDLER_TMC_DRIVER_RESET,
  91. ERR_ELECTRICAL_PULLEY_TMC_UNDERVOLTAGE_ERROR,
  92. ERR_ELECTRICAL_SELECTOR_TMC_UNDERVOLTAGE_ERROR,
  93. ERR_ELECTRICAL_IDLER_TMC_UNDERVOLTAGE_ERROR,
  94. ERR_ELECTRICAL_PULLEY_TMC_DRIVER_SHORTED,
  95. ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED,
  96. ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED,
  97. ERR_ELECTRICAL_PULLEY_SELFTEST_FAILED,
  98. ERR_ELECTRICAL_SELECTOR_SELFTEST_FAILED,
  99. ERR_ELECTRICAL_IDLER_SELFTEST_FAILED,
  100. ERR_CONNECT_MMU_NOT_RESPONDING,
  101. ERR_CONNECT_COMMUNICATION_ERROR,
  102. ERR_SYSTEM_FILAMENT_ALREADY_LOADED,
  103. ERR_SYSTEM_INVALID_TOOL,
  104. ERR_SYSTEM_QUEUE_FULL,
  105. ERR_SYSTEM_FW_UPDATE_NEEDED,
  106. ERR_SYSTEM_FW_RUNTIME_ERROR,
  107. ERR_SYSTEM_UNLOAD_MANUALLY,
  108. ERR_SYSTEM_FILAMENT_EJECTED
  109. };
  110. // @@TODO some of the strings are duplicates, can be merged into one 01234567890123456789
  111. static const char MSG_TITLE_FINDA_DIDNT_TRIGGER[] PROGMEM_I1 = ISTR("FINDA DIDNT TRIGGER"); ////MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
  112. static const char MSG_TITLE_FINDA_DIDNT_GO_OFF[] PROGMEM_I1 = ISTR("FINDA: FILAM. STUCK"); ////MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
  113. static const char MSG_TITLE_FSENSOR_DIDNT_TRIGGER[] PROGMEM_I1 = ISTR("FSENSOR DIDNT TRIGG."); ////MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
  114. static const char MSG_TITLE_FSENSOR_DIDNT_GO_OFF[] PROGMEM_I1 = ISTR("FSENSOR: FIL. STUCK"); ////MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
  115. static const char MSG_TITLE_PULLEY_CANNOT_MOVE[] PROGMEM_I1 = ISTR("PULLEY CANNOT MOVE"); ////MSG_TITLE_PULLEY_CANNOT_MOVE c=20
  116. static const char MSG_TITLE_FSENSOR_TOO_EARLY[] PROGMEM_I1 = ISTR("FSENSOR TOO EARLY"); ////MSG_TITLE_FSENSOR_TOO_EARLY c=20
  117. static const char MSG_TITLE_INSPECT_FINDA[] PROGMEM_I1 = ISTR("INSPECT FINDA"); ////MSG_TITLE_INSPECT_FINDA c=20
  118. static const char MSG_TITLE_LOAD_TO_EXTRUDER_FAILED[] PROGMEM_I1 = ISTR("LOAD TO EXTR. FAILED"); ////MSG_TITLE_LOAD_TO_EXTRUDER_FAILED c=20
  119. static const char MSG_TITLE_SELECTOR_CANNOT_MOVE[] PROGMEM_I1 = ISTR("SELECTOR CANNOT MOVE"); ////MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
  120. static const char MSG_TITLE_SELECTOR_CANNOT_HOME[] PROGMEM_I1 = ISTR("SELECTOR CANNOT HOME"); ////MSG_TITLE_SELECTOR_CANNOT_HOME c=20
  121. static const char MSG_TITLE_IDLER_CANNOT_MOVE[] PROGMEM_I1 = ISTR("IDLER CANNOT MOVE"); ////MSG_TITLE_IDLER_CANNOT_MOVE c=20
  122. static const char MSG_TITLE_IDLER_CANNOT_HOME[] PROGMEM_I1 = ISTR("IDLER CANNOT HOME"); ////MSG_TITLE_IDLER_CANNOT_HOME c=20
  123. static const char MSG_TITLE_TMC_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("WARNING TMC TOO HOT"); ////MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
  124. //static const char MSG_TITLE_TMC_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("WARNING TMC TOO HOT"); ////MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
  125. //static const char MSG_TITLE_TMC_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("WARNING TMC TOO HOT");
  126. static const char MSG_TITLE_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC OVERHEAT ERROR"); ////MSG_TITLE_TMC_OVERHEAT_ERROR c=20
  127. //static const char MSG_TITLE_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC OVERHEAT ERROR");
  128. //static const char MSG_TITLE_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC OVERHEAT ERROR");
  129. static const char MSG_TITLE_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC DRIVER ERROR"); ////MSG_TITLE_TMC_DRIVER_ERROR c=20
  130. //static const char MSG_TITLE_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC DRIVER ERROR");
  131. //static const char MSG_TITLE_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC DRIVER ERROR");
  132. static const char MSG_TITLE_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC DRIVER RESET"); ////MSG_TITLE_TMC_DRIVER_RESET c=20
  133. //static const char MSG_TITLE_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC DRIVER RESET");
  134. //static const char MSG_TITLE_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC DRIVER RESET");
  135. static const char MSG_TITLE_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("TMC UNDERVOLTAGE ERR"); ////MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
  136. //static const char MSG_TITLE_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("TMC UNDERVOLTAGE ERR");
  137. //static const char MSG_TITLE_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("TMC UNDERVOLTAGE ERR");
  138. static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED"); ////MSG_TITLE_TMC_DRIVER_SHORTED c=20
  139. //static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED");
  140. //static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED");
  141. static const char MSG_TITLE_SELFTEST_FAILED[] PROGMEM_I1 = ISTR("MMU SELFTEST FAILED"); ////MSG_TITLE_SELFTEST_FAILED c=20
  142. static const char MSG_TITLE_MMU_NOT_RESPONDING[] PROGMEM_I1 = ISTR("MMU NOT RESPONDING"); ////MSG_TITLE_MMU_NOT_RESPONDING c=20
  143. static const char MSG_TITLE_COMMUNICATION_ERROR[] PROGMEM_I1 = ISTR("COMMUNICATION ERROR"); ////MSG_TITLE_COMMUNICATION_ERROR c=20
  144. static const char MSG_TITLE_FIL_ALREADY_LOADED[] PROGMEM_I1 = ISTR("FILAMENT ALREADY LOA"); ////MSG_TITLE_FIL_ALREADY_LOADED c=20
  145. static const char MSG_TITLE_INVALID_TOOL[] PROGMEM_I1 = ISTR("INVALID TOOL"); ////MSG_TITLE_INVALID_TOOL c=20
  146. static const char MSG_TITLE_QUEUE_FULL[] PROGMEM_I1 = ISTR("QUEUE FULL"); ////MSG_TITLE_QUEUE_FULL c=20
  147. static const char MSG_TITLE_FW_UPDATE_NEEDED[] PROGMEM_I1 = ISTR("MMU FW UPDATE NEEDED"); ////MSG_TITLE_FW_UPDATE_NEEDED c=20
  148. static const char MSG_TITLE_FW_RUNTIME_ERROR[] PROGMEM_I1 = ISTR("FW RUNTIME ERROR"); ////MSG_TITLE_FW_RUNTIME_ERROR c=20
  149. static const char MSG_TITLE_UNLOAD_MANUALLY[] PROGMEM_I1 = ISTR("UNLOAD MANUALLY"); ////MSG_TITLE_UNLOAD_MANUALLY c=20
  150. static const char MSG_TITLE_FILAMENT_EJECTED[] PROGMEM_I1 = ISTR("FILAMENT EJECTED"); ////MSG_TITLE_FILAMENT_EJECTED c=20
  151. static const char * const errorTitles [] PROGMEM = {
  152. _R(MSG_TITLE_FINDA_DIDNT_TRIGGER),
  153. _R(MSG_TITLE_FINDA_DIDNT_GO_OFF),
  154. _R(MSG_TITLE_FSENSOR_DIDNT_TRIGGER),
  155. _R(MSG_TITLE_FSENSOR_DIDNT_GO_OFF),
  156. _R(MSG_TITLE_PULLEY_CANNOT_MOVE),
  157. _R(MSG_TITLE_FSENSOR_TOO_EARLY),
  158. _R(MSG_TITLE_INSPECT_FINDA),
  159. _R(MSG_TITLE_LOAD_TO_EXTRUDER_FAILED),
  160. _R(MSG_TITLE_SELECTOR_CANNOT_HOME),
  161. _R(MSG_TITLE_SELECTOR_CANNOT_MOVE),
  162. _R(MSG_TITLE_IDLER_CANNOT_HOME),
  163. _R(MSG_TITLE_IDLER_CANNOT_MOVE),
  164. _R(MSG_TITLE_TMC_WARNING_TMC_TOO_HOT),
  165. _R(MSG_TITLE_TMC_WARNING_TMC_TOO_HOT),
  166. _R(MSG_TITLE_TMC_WARNING_TMC_TOO_HOT),
  167. _R(MSG_TITLE_TMC_OVERHEAT_ERROR),
  168. _R(MSG_TITLE_TMC_OVERHEAT_ERROR),
  169. _R(MSG_TITLE_TMC_OVERHEAT_ERROR),
  170. _R(MSG_TITLE_TMC_DRIVER_ERROR),
  171. _R(MSG_TITLE_TMC_DRIVER_ERROR),
  172. _R(MSG_TITLE_TMC_DRIVER_ERROR),
  173. _R(MSG_TITLE_TMC_DRIVER_RESET),
  174. _R(MSG_TITLE_TMC_DRIVER_RESET),
  175. _R(MSG_TITLE_TMC_DRIVER_RESET),
  176. _R(MSG_TITLE_TMC_UNDERVOLTAGE_ERROR),
  177. _R(MSG_TITLE_TMC_UNDERVOLTAGE_ERROR),
  178. _R(MSG_TITLE_TMC_UNDERVOLTAGE_ERROR),
  179. _R(MSG_TITLE_TMC_DRIVER_SHORTED),
  180. _R(MSG_TITLE_TMC_DRIVER_SHORTED),
  181. _R(MSG_TITLE_TMC_DRIVER_SHORTED),
  182. _R(MSG_TITLE_SELFTEST_FAILED),
  183. _R(MSG_TITLE_SELFTEST_FAILED),
  184. _R(MSG_TITLE_SELFTEST_FAILED),
  185. _R(MSG_TITLE_MMU_NOT_RESPONDING),
  186. _R(MSG_TITLE_COMMUNICATION_ERROR),
  187. _R(MSG_TITLE_FIL_ALREADY_LOADED),
  188. _R(MSG_TITLE_INVALID_TOOL),
  189. _R(MSG_TITLE_QUEUE_FULL),
  190. _R(MSG_TITLE_FW_UPDATE_NEEDED),
  191. _R(MSG_TITLE_FW_RUNTIME_ERROR),
  192. _R(MSG_TITLE_UNLOAD_MANUALLY),
  193. _R(MSG_TITLE_FILAMENT_EJECTED)
  194. };
  195. // @@TODO looking at the texts, they can be composed of several parts and/or parametrized (could save a lot of space ;) )
  196. // Moreover, some of them have been disabled in favour of saving some more code size.
  197. static const char MSG_DESC_FINDA_DIDNT_TRIGGER[] PROGMEM_I1 = ISTR("FINDA didn't trigger while loading the filament. Ensure the filament can move and FINDA works."); ////MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
  198. static const char MSG_DESC_FINDA_DIDNT_GO_OFF[] PROGMEM_I1 = ISTR("FINDA didn't switch off while unloading filament. Try unloading manually. Ensure filament can move and FINDA works."); ////MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
  199. static const char MSG_DESC_FSENSOR_DIDNT_TRIGGER[] PROGMEM_I1 = ISTR("Filament sensor didn't trigger while loading the filament. Ensure the filament reached the fsensor and the sensor works."); ////MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
  200. static const char MSG_DESC_FSENSOR_DIDNT_GO_OFF[] PROGMEM_I1 = ISTR("Filament sensor didn't switch off while unloading filament. Ensure filament can move and the sensor works."); ////MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
  201. static const char MSG_DESC_PULLEY_STALLED[] PROGMEM_I1 = ISTR("Pulley motor stalled. Ensure the pulley can move and check the wiring."); ////MSG_DESC_PULLEY_STALLED c=20 r=8
  202. static const char MSG_DESC_FSENSOR_TOO_EARLY[] PROGMEM_I1 = ISTR("Filament sensor triggered too early while loading to extruder. Check there isn't anything stuck in PTFE tube. Check that sensor reads properly."); ////MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
  203. static const char MSG_DESC_INSPECT_FINDA[] PROGMEM_I1 = ISTR("Selector can't move due to FINDA detecting a filament. Make sure no filament is in selector and FINDA works properly."); ////MSG_DESC_INSPECT_FINDA c=20 r=8
  204. static const char MSG_DESC_LOAD_TO_EXTRUDER_FAILED[] PROGMEM_I1 = ISTR("Loading to extruder failed. Inspect the filament tip shape. Refine the sensor calibration, if needed."); ////MSG_DESC_LOAD_TO_EXTRUDER_FAILED c=20 r=8
  205. static const char MSG_DESC_SELECTOR_CANNOT_HOME[] PROGMEM_I1 = ISTR("The Selector cannot home properly. Check for anything blocking its movement."); ////MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
  206. static const char MSG_DESC_CANNOT_MOVE[] PROGMEM_I1 = ISTR("Can't move Selector or Idler."); /////MSG_DESC_CANNOT_MOVE c=20 r=4
  207. //static const char MSG_DESC_SELECTOR_CANNOT_MOVE[] PROGMEM_I1 = ISTR("The Selector cannot move. Check for anything blocking its movement. Check the wiring is correct.");
  208. static const char MSG_DESC_IDLER_CANNOT_HOME[] PROGMEM_I1 = ISTR("The Idler cannot home properly. Check for anything blocking its movement."); ////MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
  209. //static const char MSG_DESC_IDLER_CANNOT_MOVE[] PROGMEM_I1 = ISTR("The Idler cannot move properly. Check for anything blocking its movement. Check the wiring is correct.");
  210. static const char MSG_DESC_TMC[] PROGMEM_I1 = ISTR("More details online."); ////MSG_DESC_TMC c=20 r=8
  211. //static const char MSG_DESC_PULLEY_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("TMC driver for the Pulley motor is almost overheating. Make sure there is sufficient airflow near the MMU board.");
  212. //static const char MSG_DESC_SELECTOR_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("TMC driver for the Selector motor is almost overheating. Make sure there is sufficient airflow near the MMU board.");
  213. //static const char MSG_DESC_IDLER_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("TMC driver for the Idler motor is almost overheating. Make sure there is sufficient airflow near the MMU board.");
  214. //static const char MSG_DESC_PULLEY_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Pulley motor is overheated. Cool down the MMU board and reset MMU.");
  215. //static const char MSG_DESC_SELECTOR_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Selector motor is overheated. Cool down the MMU board and reset MMU.");
  216. //static const char MSG_DESC_IDLER_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Idler motor is overheated. Cool down the MMU board and reset MMU.");
  217. //static const char MSG_DESC_PULLEY_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Pulley motor is not responding. Try resetting the MMU. If the issue persists contact support.");
  218. //static const char MSG_DESC_SELECTOR_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Selector motor is not responding. Try resetting the MMU. If the issue persists contact support.");
  219. //static const char MSG_DESC_IDLER_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Idler motor is not responding. Try resetting the MMU. If the issue persists contact support.");
  220. //static const char MSG_DESC_PULLEY_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC driver for the Pulley motor was restarted. There is probably an issue with the electronics. Check the wiring and connectors.");
  221. //static const char MSG_DESC_SELECTOR_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC driver for the Selector motor was restarted. There is probably an issue with the electronics. Check the wiring and connectors.");
  222. //static const char MSG_DESC_IDLER_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC driver for the Idler motor was restarted. There is probably an issue with the electronics. Check the wiring and connectors.");
  223. //static const char MSG_DESC_PULLEY_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("Not enough current for the Pulley TMC driver. There is probably an issue with the electronics. Check the wiring and connectors.");
  224. //static const char MSG_DESC_SELECTOR_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("Not enough current for the Selector TMC driver. There is probably an issue with the electronics. Check the wiring and connectors.");
  225. //static const char MSG_DESC_IDLER_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("Not enough current for the Idler TMC driver. There is probably an issue with the electronics. Check the wiring and connectors.");
  226. //static const char MSG_DESC_PULLEY_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("Short circuit on the Pulley TMC driver. Check the wiring and connectors. If the issue persists contact support.");
  227. //static const char MSG_DESC_SELECTOR_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("Short circuit on the Selector TMC driver. Check the wiring and connectors. If the issue persists contact support.");
  228. //static const char MSG_DESC_IDLER_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("Short circuit on the Idler TMC driver. Check the wiring and connectors. If the issue persists contact support.");
  229. static const char MSG_DESC_MMU_NOT_RESPONDING[] PROGMEM_I1 = ISTR("MMU unit not responding. Check the wiring and connectors. If the issue persists, contact support."); ////MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
  230. static const char MSG_DESC_COMMUNICATION_ERROR[] PROGMEM_I1 = ISTR("MMU unit not responding correctly. Check the wiring and connectors. If the issue persists, contact support."); ////MSG_DESC_COMMUNICATION_ERROR c=20 r=9
  231. static const char MSG_DESC_FILAMENT_ALREADY_LOADED[] PROGMEM_I1 = ISTR("Cannot perform the action, filament is already loaded. Unload it first."); ////MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
  232. static const char MSG_DESC_INVALID_TOOL[] PROGMEM_I1 = ISTR("Requested filament tool is not available on this hardware. Check the G-code for tool index out of range (T0-T4)."); ////MSG_DESC_INVALID_TOOL c=20 r=8
  233. static const char MSG_DESC_QUEUE_FULL[] PROGMEM_I1 = ISTR("MMU Firmware internal error, please reset the MMU."); ////MSG_DESC_QUEUE_FULL c=20 r=8
  234. static const char MSG_DESC_FW_UPDATE_NEEDED[] PROGMEM_I1 = ISTR("The MMU unit reports its FW version incompatible with the printer's firmware. Make sure the MMU firmware is up to date."); ////MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
  235. static const char MSG_DESC_FW_RUNTIME_ERROR[] PROGMEM_I1 = ISTR("Internal runtime error. Try resetting the MMU unit or updating the firmware. If the issue persists, contact support."); ////MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
  236. static const char MSG_DESC_UNLOAD_MANUALLY[] PROGMEM_I1 = ISTR("Filament detected unexpectedly. Ensure no filament is loaded. Check the sensors and wiring."); ////MSG_DESC_UNLOAD_MANUALLY c=20 r=8
  237. static const char MSG_DESC_FILAMENT_EJECTED[] PROGMEM_I1 = ISTR("Remove the ejected filament from the front of the MMU unit."); ////MSG_DESC_FILAMENT_EJECTED c=20 r=8
  238. static const char * const errorDescs[] PROGMEM = {
  239. _R(MSG_DESC_FINDA_DIDNT_TRIGGER),
  240. _R(MSG_DESC_FINDA_DIDNT_GO_OFF),
  241. _R(MSG_DESC_FSENSOR_DIDNT_TRIGGER),
  242. _R(MSG_DESC_FSENSOR_DIDNT_GO_OFF),
  243. _R(MSG_DESC_PULLEY_STALLED),
  244. _R(MSG_DESC_FSENSOR_TOO_EARLY),
  245. _R(MSG_DESC_INSPECT_FINDA),
  246. _R(MSG_DESC_LOAD_TO_EXTRUDER_FAILED),
  247. _R(MSG_DESC_SELECTOR_CANNOT_HOME),
  248. _R(MSG_DESC_CANNOT_MOVE),
  249. _R(MSG_DESC_IDLER_CANNOT_HOME),
  250. _R(MSG_DESC_CANNOT_MOVE),
  251. _R(MSG_DESC_TMC), // descPULLEY_WARNING_TMC_TOO_HOT
  252. _R(MSG_DESC_TMC), // descSELECTOR_WARNING_TMC_TOO_HOT
  253. _R(MSG_DESC_TMC), // descIDLER_WARNING_TMC_TOO_HOT
  254. _R(MSG_DESC_TMC), // descPULLEY_TMC_OVERHEAT_ERROR
  255. _R(MSG_DESC_TMC), // descSELECTOR_TMC_OVERHEAT_ERROR
  256. _R(MSG_DESC_TMC), // descIDLER_TMC_OVERHEAT_ERROR
  257. _R(MSG_DESC_TMC), // descPULLEY_TMC_DRIVER_ERROR
  258. _R(MSG_DESC_TMC), // descSELECTOR_TMC_DRIVER_ERROR
  259. _R(MSG_DESC_TMC), // descIDLER_TMC_DRIVER_ERROR
  260. _R(MSG_DESC_TMC), // descPULLEY_TMC_DRIVER_RESET
  261. _R(MSG_DESC_TMC), // descSELECTOR_TMC_DRIVER_RESET
  262. _R(MSG_DESC_TMC), // descIDLER_TMC_DRIVER_RESET
  263. _R(MSG_DESC_TMC), // descPULLEY_TMC_UNDERVOLTAGE_ERROR
  264. _R(MSG_DESC_TMC), // descSELECTOR_TMC_UNDERVOLTAGE_ERROR
  265. _R(MSG_DESC_TMC), // descIDLER_TMC_UNDERVOLTAGE_ERROR
  266. _R(MSG_DESC_TMC), // descPULLEY_TMC_DRIVER_SHORTED
  267. _R(MSG_DESC_TMC), // descSELECTOR_TMC_DRIVER_SHORTED
  268. _R(MSG_DESC_TMC), // descIDLER_TMC_DRIVER_SHORTED
  269. _R(MSG_DESC_TMC), // descPULLEY_SELFTEST_FAILED
  270. _R(MSG_DESC_TMC), // descSELECTOR_SELFTEST_FAILED
  271. _R(MSG_DESC_TMC), // descIDLER_SELFTEST_FAILED
  272. _R(MSG_DESC_MMU_NOT_RESPONDING),
  273. _R(MSG_DESC_COMMUNICATION_ERROR),
  274. _R(MSG_DESC_FILAMENT_ALREADY_LOADED),
  275. _R(MSG_DESC_INVALID_TOOL),
  276. _R(MSG_DESC_QUEUE_FULL),
  277. _R(MSG_DESC_FW_UPDATE_NEEDED),
  278. _R(MSG_DESC_FW_RUNTIME_ERROR),
  279. _R(MSG_DESC_UNLOAD_MANUALLY),
  280. _R(MSG_DESC_FILAMENT_EJECTED)
  281. };
  282. // we have max 3 buttons/operations to select from
  283. // one of them is "More" to show the explanation text normally hidden in the next screens.
  284. // It is displayed with W (Double down arrow, special character from CGRAM)
  285. // 01234567890123456789
  286. // >bttxt >bttxt >W
  287. // Therefore at least some of the buttons, which can occur on the screen together, can only be 8-chars long max @@TODO.
  288. // Beware - we only have space for 2 buttons on the LCD while the MMU has 3 buttons
  289. // -> the left button on the MMU is not used/rendered on the LCD (it is also almost unused on the MMU side)
  290. static const char MSG_BTN_RETRY[] PROGMEM_I1 = ISTR("Retry"); ////MSG_BTN_RETRY c=8
  291. static const char MSG_BTN_CONTINUE[] PROGMEM_I1 = ISTR("Done"); ////MSG_BTN_CONTINUE c=8
  292. static const char MSG_BTN_RESTART_MMU[] PROGMEM_I1 = ISTR("Reset MMU"); ////MSG_BTN_RESTART_MMU c=9
  293. static const char MSG_BTN_UNLOAD[] PROGMEM_I1 = ISTR("Unload"); ////MSG_BTN_UNLOAD c=8
  294. static const char MSG_BTN_STOP[] PROGMEM_I1 = ISTR("Stop"); ////MSG_BTN_STOP c=8
  295. static const char MSG_BTN_DISABLE_MMU[] PROGMEM_I1 = ISTR("Disable"); ////MSG_BTN_DISABLE_MMU c=9
  296. static const char MSG_BTN_MORE[] PROGMEM_I1 = ISTR("\x06"); ////MSG_BTN_MORE c=8 //@todo convert to PROGMEM_N1
  297. // Used to parse the buttons from Btns().
  298. static const char * const btnOperation[] PROGMEM = {
  299. _R(MSG_BTN_RETRY),
  300. _R(MSG_BTN_CONTINUE),
  301. _R(MSG_BTN_RESTART_MMU),
  302. _R(MSG_BTN_UNLOAD),
  303. _R(MSG_BTN_STOP),
  304. _R(MSG_BTN_DISABLE_MMU),
  305. };
  306. // We have 8 different operations/buttons at this time, so we need at least 4 bits to encode each.
  307. // Since one of the buttons is always "More", we can skip that one.
  308. // Therefore we need just 1 byte to describe the necessary buttons for each screen.
  309. uint8_t constexpr Btns(ButtonOperations bMiddle, ButtonOperations bRight){
  310. return ((uint8_t)bRight) << 4 | ((uint8_t)bMiddle);
  311. }
  312. static const uint8_t errorButtons[] PROGMEM = {
  313. Btns(ButtonOperations::Retry, ButtonOperations::Continue),//FINDA_DIDNT_TRIGGER
  314. Btns(ButtonOperations::Retry, ButtonOperations::Continue),//FINDA_DIDNT_GO_OFF
  315. Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//FSENSOR_DIDNT_TRIGGER
  316. Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//FSENSOR_DIDNT_GO_OFF
  317. Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//PULLEY_STALLED
  318. Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//FSENSOR_TOO_EARLY
  319. Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//INSPECT_FINDA
  320. Btns(ButtonOperations::Continue, ButtonOperations::NoOperation),//LOAD_TO_EXTRUDER_FAILED
  321. Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//SELECTOR_CANNOT_HOME
  322. Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//SELECTOR_CANNOT_MOVE
  323. Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//IDLER_CANNOT_HOME
  324. Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//IDLER_CANNOT_MOVE
  325. Btns(ButtonOperations::Continue, ButtonOperations::RestartMMU),//PULLEY_WARNING_TMC_TOO_HOT
  326. Btns(ButtonOperations::Continue, ButtonOperations::RestartMMU),//SELECTOR_WARNING_TMC_TOO_HOT
  327. Btns(ButtonOperations::Continue, ButtonOperations::RestartMMU),//IDLER_WARNING_TMC_TOO_HOT
  328. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_OVERHEAT_ERROR
  329. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_OVERHEAT_ERROR
  330. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_OVERHEAT_ERROR
  331. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_DRIVER_ERROR
  332. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_DRIVER_ERROR
  333. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_DRIVER_ERROR
  334. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_DRIVER_RESET
  335. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_DRIVER_RESET
  336. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_DRIVER_RESET
  337. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_UNDERVOLTAGE_ERROR
  338. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_UNDERVOLTAGE_ERROR
  339. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_UNDERVOLTAGE_ERROR
  340. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_DRIVER_SHORTED
  341. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_DRIVER_SHORTED
  342. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_DRIVER_SHORTED
  343. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_SELFTEST_FAILED
  344. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_SELFTEST_FAILED
  345. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_SELFTEST_FAILED
  346. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//MMU_NOT_RESPONDING
  347. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//COMMUNICATION_ERROR
  348. Btns(ButtonOperations::Unload, ButtonOperations::Continue),//FILAMENT_ALREADY_LOADED
  349. Btns(ButtonOperations::StopPrint, ButtonOperations::RestartMMU),//INVALID_TOOL
  350. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//QUEUE_FULL
  351. Btns(ButtonOperations::DisableMMU, ButtonOperations::NoOperation),//FW_UPDATE_NEEDED
  352. Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//FW_RUNTIME_ERROR
  353. Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//UNLOAD_MANUALLY
  354. Btns(ButtonOperations::Continue, ButtonOperations::NoOperation),//FILAMENT_EJECTED
  355. };
  356. static_assert( sizeof(errorCodes) / sizeof(errorCodes[0]) == sizeof(errorDescs) / sizeof (errorDescs[0]));
  357. static_assert( sizeof(errorCodes) / sizeof(errorCodes[0]) == sizeof(errorTitles) / sizeof (errorTitles[0]));
  358. static_assert( sizeof(errorCodes) / sizeof(errorCodes[0]) == sizeof(errorButtons) / sizeof (errorButtons[0]));
  359. } // namespace MMU2