diff --git a/Firmware/mmu2/error_codes.h b/Firmware/mmu2/error_codes.h index 0dcb30573..770924653 100644 --- a/Firmware/mmu2/error_codes.h +++ b/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, + }; diff --git a/Firmware/mmu2/errors_list.h b/Firmware/mmu2/errors_list.h index e68afc6ad..a6d0e7b8a 100644 --- a/Firmware/mmu2/errors_list.h +++ b/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 diff --git a/Firmware/mmu2_error_converter.cpp b/Firmware/mmu2_error_converter.cpp index a4dd070df..ee87c9e54 100644 --- a/Firmware/mmu2_error_converter.cpp +++ b/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)