Browse Source

Add preliminary support for MMU_SELFTEST_FAILED error messages

D.R.racer 2 years ago
parent
commit
ebb79351a7
3 changed files with 41 additions and 4 deletions
  1. 11 4
      Firmware/mmu2/error_codes.h
  2. 16 0
      Firmware/mmu2/errors_list.h
  3. 14 0
      Firmware/mmu2_error_converter.cpp

+ 11 - 4
Firmware/mmu2/error_codes.h

@@ -37,11 +37,11 @@ enum class ErrorCode : uint_fast16_t {
     HOMING_FAILED = 0x8007, ///< generic homing failed error - always reported with the corresponding axis bit set (Idler or Selector) as follows:
     HOMING_SELECTOR_FAILED = HOMING_FAILED | TMC_SELECTOR_BIT, ///< E32903 the Selector was unable to home properly - that means something is blocking its movement
     HOMING_IDLER_FAILED = HOMING_FAILED | TMC_IDLER_BIT, ///< E33031 the Idler was unable to home properly - that means something is blocking its movement
-    STALLED_PULLEY = HOMING_FAILED | TMC_PULLEY_BIT, ///< E32839 for the Pulley "homing" means just stallguard detected during Pulley's operation (Pulley doesn't home)
+    STALLED_PULLEY = HOMING_FAILED | TMC_PULLEY_BIT, ///< E32839 for the Pulley "homing" means just StallGuard detected during Pulley's operation (Pulley doesn't home)
 
     FINDA_VS_EEPROM_DISREPANCY = 0x8008, ///< E32776 FINDA is pressed but we have no such record in EEPROM - this can only happen at the start of the MMU and can be resolved by issuing an Unload command
 
-    FSENSOR_TOO_EARLY = 0x8009, ///< E32777 FSensor triggered while doing FastFeedToExtruder - that means either:
+    FSENSOR_TOO_EARLY = 0x8009, ///< E32777 FSensor triggered while doing FastFeedToBondtech - that means either:
     ///< - the PTFE is too short
     ///< - a piece of filament was left inside - pushed in front of the loaded filament causing the fsensor trigger too early
     ///< - fsensor is faulty producing bogus triggers
@@ -60,7 +60,7 @@ enum class ErrorCode : uint_fast16_t {
 
     /// TMC driver init error - TMC dead or bad communication
     /// - E33344 Pulley TMC driver
-    /// - E33404 Selector TMC driver
+    /// - E33408 Selector TMC driver
     /// - E33536 Idler TMC driver
     /// - E33728 All 3 TMC driver
     TMC_IOIN_MISMATCH = 0x8200,
@@ -105,5 +105,12 @@ enum class ErrorCode : uint_fast16_t {
     /// - E49280 Selector TMC driver
     /// - E49408 Idler TMC driver
     /// - E49600 All 3 TMC driver
-    TMC_OVER_TEMPERATURE_ERROR = 0xC000
+    TMC_OVER_TEMPERATURE_ERROR = 0xC000,
+
+    /// TMC driver - IO pins are unreliable. While in theory it's recoverable, in practice it most likely
+    /// means your hardware is borked (we can't command the drivers reliably via STEP/EN/DIR due to electrical
+    /// issues or hardware fault. Possible "fixable" cause is undervoltage on the 5v logic line.
+    /// Unfixable possible cause: bad or cracked solder joints on the PCB, failed shift register, failed driver.
+    MMU_SOLDERING_NEEDS_ATTENTION = 0xC200,
+
 };

+ 16 - 0
Firmware/mmu2/errors_list.h

@@ -54,6 +54,9 @@ typedef enum : uint16_t {
     ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED = 314,
     ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED = 324,
 
+    ERR_ELECTRICAL_PULLEY_SELFTEST_FAILED = 305,
+    ERR_ELECTRICAL_SELECTOR_SELFTEST_FAILED = 315,
+    ERR_ELECTRICAL_IDLER_SELFTEST_FAILED = 325,
 
     ERR_CONNECT = 400,
     ERR_CONNECT_MMU_NOT_RESPONDING = 401,
@@ -104,6 +107,9 @@ static const constexpr uint16_t errorCodes[] PROGMEM = {
     ERR_ELECTRICAL_PULLEY_TMC_DRIVER_SHORTED,
     ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED,
     ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED,
+    ERR_ELECTRICAL_PULLEY_SELFTEST_FAILED,
+    ERR_ELECTRICAL_SELECTOR_SELFTEST_FAILED,
+    ERR_ELECTRICAL_IDLER_SELFTEST_FAILED,
     ERR_CONNECT_MMU_NOT_RESPONDING,
     ERR_CONNECT_COMMUNICATION_ERROR,
     ERR_SYSTEM_FILAMENT_ALREADY_LOADED, 
@@ -143,6 +149,7 @@ static const char MSG_TITLE_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1  = ISTR("TMC UND
 static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1      = ISTR("TMC DRIVER SHORTED"); ////MSG_TITLE_TMC_DRIVER_SHORTED c=20
 //static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED");
 //static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED");
+static const char MSG_TITLE_SELFTEST_FAILED[] PROGMEM_I1      = ISTR("MMU SELFTEST FAILED"); ////MSG_TITLE_SELFTEST_FAILED c=20
 static const char MSG_TITLE_MMU_NOT_RESPONDING[] PROGMEM_I1      = ISTR("MMU NOT RESPONDING"); ////MSG_TITLE_MMU_NOT_RESPONDING c=20
 static const char MSG_TITLE_COMMUNICATION_ERROR[] PROGMEM_I1     = ISTR("COMMUNICATION ERROR"); ////MSG_TITLE_COMMUNICATION_ERROR c=20
 static const char MSG_TITLE_FIL_ALREADY_LOADED[] PROGMEM_I1      = ISTR("FILAMENT ALREADY LOA"); ////MSG_TITLE_FIL_ALREADY_LOADED c=20
@@ -181,6 +188,9 @@ static const char * const errorTitles [] PROGMEM = {
     _R(MSG_TITLE_TMC_DRIVER_SHORTED),
     _R(MSG_TITLE_TMC_DRIVER_SHORTED),
     _R(MSG_TITLE_TMC_DRIVER_SHORTED),
+    _R(MSG_TITLE_SELFTEST_FAILED),
+    _R(MSG_TITLE_SELFTEST_FAILED),
+    _R(MSG_TITLE_SELFTEST_FAILED),
     _R(MSG_TITLE_MMU_NOT_RESPONDING),
     _R(MSG_TITLE_COMMUNICATION_ERROR),
     _R(MSG_TITLE_FIL_ALREADY_LOADED),
@@ -261,6 +271,9 @@ static const char * const errorDescs[] PROGMEM = {
     _R(MSG_DESC_TMC), // descPULLEY_TMC_DRIVER_SHORTED
     _R(MSG_DESC_TMC), // descSELECTOR_TMC_DRIVER_SHORTED
     _R(MSG_DESC_TMC), // descIDLER_TMC_DRIVER_SHORTED
+    _R(MSG_DESC_TMC), // descPULLEY_SELFTEST_FAILED
+    _R(MSG_DESC_TMC), // descSELECTOR_SELFTEST_FAILED
+    _R(MSG_DESC_TMC), // descIDLER_SELFTEST_FAILED
     _R(MSG_DESC_MMU_NOT_RESPONDING),
     _R(MSG_DESC_COMMUNICATION_ERROR),
     _R(MSG_DESC_FILAMENT_ALREADY_LOADED),
@@ -336,6 +349,9 @@ static const uint8_t errorButtons[] PROGMEM = {
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_DRIVER_SHORTED
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_DRIVER_SHORTED
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_DRIVER_SHORTED
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_SELFTEST_FAILED
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_SELFTEST_FAILED
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_SELFTEST_FAILED
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//MMU_NOT_RESPONDING
     Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//COMMUNICATION_ERROR
 

+ 14 - 0
Firmware/mmu2_error_converter.cpp

@@ -79,6 +79,20 @@ uint8_t PrusaErrorCodeIndex(uint16_t ec) {
     case (uint16_t)ErrorCode::FINDA_VS_EEPROM_DISREPANCY:
         return FindErrorIndex(ERR_SYSTEM_UNLOAD_MANUALLY);
     }
+    
+    // Electrical issues which can be detected somehow.
+    // Need to be placed before TMC-related errors in order to process couples of error bits between single ones
+    // and to keep the code size down.
+    if (ec & (uint16_t)ErrorCode::TMC_PULLEY_BIT) {
+        if (ec & (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION == (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION)
+            return FindErrorIndex(ERR_ELECTRICAL_PULLEY_SELFTEST_FAILED);
+    } else if (ec & (uint16_t)ErrorCode::TMC_SELECTOR_BIT) {
+        if (ec & (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION == (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION)
+            return FindErrorIndex(ERR_ELECTRICAL_SELECTOR_SELFTEST_FAILED);
+    } else if (ec & (uint16_t)ErrorCode::TMC_IDLER_BIT) {
+        if (ec & (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION == (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION)
+            return FindErrorIndex(ERR_ELECTRICAL_IDLER_SELFTEST_FAILED);
+    }
 
     // TMC-related errors - multiple of these can occur at once
     // - in such a case we report the first which gets found/converted into Prusa-Error-Codes (usually the fact, that one TMC has an issue is serious enough)