diff --git a/Translations/translation_BG.json b/Translations/translation_BG.json index 230dc44d..e36fdfe4 100644 --- a/Translations/translation_BG.json +++ b/Translations/translation_BG.json @@ -42,7 +42,8 @@ ], "LockingKeysString": " LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "R", diff --git a/Translations/translation_CS.json b/Translations/translation_CS.json index cee4e94d..18c63c18 100644 --- a/Translations/translation_CS.json +++ b/Translations/translation_CS.json @@ -42,7 +42,8 @@ ], "LockingKeysString": " LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "P", diff --git a/Translations/translation_DA.json b/Translations/translation_DA.json index dc4ed073..29f3f089 100644 --- a/Translations/translation_DA.json +++ b/Translations/translation_DA.json @@ -42,7 +42,8 @@ ], "LockingKeysString": " LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "H", diff --git a/Translations/translation_DE.json b/Translations/translation_DE.json index 91a012a0..83600ae3 100644 --- a/Translations/translation_DE.json +++ b/Translations/translation_DE.json @@ -43,7 +43,8 @@ ], "LockingKeysString": "GESPERRT", "UnlockingKeysString": "ENTSPERRT", - "WarningKeysLockedString": "!GESPERRT!" + "WarningKeysLockedString": "!GESPERRT!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "R", diff --git a/Translations/translation_EN.json b/Translations/translation_EN.json index 51f7e8a1..593a2c61 100644 --- a/Translations/translation_EN.json +++ b/Translations/translation_EN.json @@ -42,7 +42,8 @@ ], "LockingKeysString": "LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "R", diff --git a/Translations/translation_ES.json b/Translations/translation_ES.json index 75c5268c..ef7f1f62 100644 --- a/Translations/translation_ES.json +++ b/Translations/translation_ES.json @@ -43,7 +43,8 @@ ], "LockingKeysString": " BLOQUEADO", "UnlockingKeysString": "DESBLOQUEADO", - "WarningKeysLockedString": "¡BLOQUEADO!" + "WarningKeysLockedString": "¡BLOQUEADO!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "D", diff --git a/Translations/translation_FI.json b/Translations/translation_FI.json index 4a64a92a..f8fea9ed 100644 --- a/Translations/translation_FI.json +++ b/Translations/translation_FI.json @@ -41,7 +41,8 @@ ], "LockingKeysString": " LUKITTU", "UnlockingKeysString": "AUKI", - "WarningKeysLockedString": "!LUKKO!" + "WarningKeysLockedString": "!LUKKO!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "O", diff --git a/Translations/translation_FR.json b/Translations/translation_FR.json index 9a19f1b0..073de1bd 100644 --- a/Translations/translation_FR.json +++ b/Translations/translation_FR.json @@ -42,7 +42,8 @@ ], "LockingKeysString": "VERROUIL", "UnlockingKeysString": "DEVERROU", - "WarningKeysLockedString": "! VERR. !" + "WarningKeysLockedString": "! VERR. !", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "D", diff --git a/Translations/translation_HR.json b/Translations/translation_HR.json index e697c05f..72055c32 100644 --- a/Translations/translation_HR.json +++ b/Translations/translation_HR.json @@ -42,7 +42,8 @@ ], "LockingKeysString": " LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "D", diff --git a/Translations/translation_HU.json b/Translations/translation_HU.json index 152345a9..6707082f 100644 --- a/Translations/translation_HU.json +++ b/Translations/translation_HU.json @@ -45,7 +45,8 @@ ], "LockingKeysString": "LEZÁRVA", "UnlockingKeysString": "FELOLDVA", - "WarningKeysLockedString": "!LEZÁRVA!" + "WarningKeysLockedString": "!LEZÁRVA!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "J", diff --git a/Translations/translation_IT.json b/Translations/translation_IT.json index 03e335f2..8c34ddec 100644 --- a/Translations/translation_IT.json +++ b/Translations/translation_IT.json @@ -42,7 +42,8 @@ ], "LockingKeysString": "Blocc.", "UnlockingKeysString": "Sblocc.", - "WarningKeysLockedString": "BLOCCATO" + "WarningKeysLockedString": "BLOCCATO", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "D", diff --git a/Translations/translation_JA_JP.json b/Translations/translation_JA_JP.json index 43346306..c0fd7fd6 100644 --- a/Translations/translation_JA_JP.json +++ b/Translations/translation_JA_JP.json @@ -40,7 +40,8 @@ ], "LockingKeysString": "ボタンロック", "UnlockingKeysString": "ロックを解除", - "WarningKeysLockedString": "!入力ロック中!" + "WarningKeysLockedString": "!入力ロック中!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "右", diff --git a/Translations/translation_LT.json b/Translations/translation_LT.json index 08ade638..95882932 100644 --- a/Translations/translation_LT.json +++ b/Translations/translation_LT.json @@ -42,7 +42,8 @@ ], "LockingKeysString": " UŽRAKIN", "UnlockingKeysString": "ATRAKIN", - "WarningKeysLockedString": "!UŽRAK!" + "WarningKeysLockedString": "!UŽRAK!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "D", diff --git a/Translations/translation_NL.json b/Translations/translation_NL.json index 9ec43f05..6133bc45 100644 --- a/Translations/translation_NL.json +++ b/Translations/translation_NL.json @@ -42,7 +42,8 @@ ], "LockingKeysString": " GEBLOKKEERD", "UnlockingKeysString": "GEDEBLOKKEERD", - "WarningKeysLockedString": "!GEBLOKKEERD!" + "WarningKeysLockedString": "!GEBLOKKEERD!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "R", diff --git a/Translations/translation_NL_BE.json b/Translations/translation_NL_BE.json index f835bb55..87cfd5c1 100644 --- a/Translations/translation_NL_BE.json +++ b/Translations/translation_NL_BE.json @@ -42,7 +42,8 @@ ], "LockingKeysString": " LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "R", diff --git a/Translations/translation_NO.json b/Translations/translation_NO.json index 36a0029f..4916c965 100644 --- a/Translations/translation_NO.json +++ b/Translations/translation_NO.json @@ -42,7 +42,8 @@ ], "LockingKeysString": " LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "H", diff --git a/Translations/translation_PL.json b/Translations/translation_PL.json index f079404d..39019fce 100644 --- a/Translations/translation_PL.json +++ b/Translations/translation_PL.json @@ -43,7 +43,8 @@ ], "LockingKeysString": " ZABLOK.", "UnlockingKeysString": "ODBLOK.", - "WarningKeysLockedString": "!ZABLOK!" + "WarningKeysLockedString": "!ZABLOK!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "P", diff --git a/Translations/translation_PT.json b/Translations/translation_PT.json index d494f4ba..fe95523c 100644 --- a/Translations/translation_PT.json +++ b/Translations/translation_PT.json @@ -42,7 +42,8 @@ ], "LockingKeysString": "LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "D", diff --git a/Translations/translation_RU.json b/Translations/translation_RU.json index 4493031b..5ec240b2 100644 --- a/Translations/translation_RU.json +++ b/Translations/translation_RU.json @@ -43,7 +43,8 @@ ], "LockingKeysString": "LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "П", diff --git a/Translations/translation_SK.json b/Translations/translation_SK.json index fd5fa433..7bd82fd8 100644 --- a/Translations/translation_SK.json +++ b/Translations/translation_SK.json @@ -42,7 +42,8 @@ ], "LockingKeysString": "ZABLOK.", "UnlockingKeysString": "ODBLOK.", - "WarningKeysLockedString": "!ZABLOK!" + "WarningKeysLockedString": "!ZABLOK!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "P", diff --git a/Translations/translation_SL.json b/Translations/translation_SL.json index 30f57661..69170f18 100644 --- a/Translations/translation_SL.json +++ b/Translations/translation_SL.json @@ -42,7 +42,8 @@ ], "LockingKeysString": "ZAKLENJ.", "UnlockingKeysString": "ODKLENJ.", - "WarningKeysLockedString": "ZAKLENJ." + "WarningKeysLockedString": "ZAKLENJ.", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "D", diff --git a/Translations/translation_SR_CYRL.json b/Translations/translation_SR_CYRL.json index 4f15c1bc..464dfb0d 100644 --- a/Translations/translation_SR_CYRL.json +++ b/Translations/translation_SR_CYRL.json @@ -42,7 +42,8 @@ ], "LockingKeysString": "LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "Д", diff --git a/Translations/translation_SR_LATN.json b/Translations/translation_SR_LATN.json index 204c1c48..6ad42ad7 100644 --- a/Translations/translation_SR_LATN.json +++ b/Translations/translation_SR_LATN.json @@ -42,7 +42,8 @@ ], "LockingKeysString": "LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "D", diff --git a/Translations/translation_SV.json b/Translations/translation_SV.json index 5f4ff096..6c850d69 100644 --- a/Translations/translation_SV.json +++ b/Translations/translation_SV.json @@ -36,7 +36,8 @@ ], "LockingKeysString": "LÅST", "UnlockingKeysString": "UPPLÅST", - "WarningKeysLockedString": "!LÅST!" + "WarningKeysLockedString": "!LÅST!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "H", diff --git a/Translations/translation_TR.json b/Translations/translation_TR.json index 3da91e6a..8a2dc4d1 100644 --- a/Translations/translation_TR.json +++ b/Translations/translation_TR.json @@ -45,7 +45,8 @@ ], "LockingKeysString": "LOCKED", "UnlockingKeysString": "UNLOCKED", - "WarningKeysLockedString": "!LOCKED!" + "WarningKeysLockedString": "!LOCKED!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "R", diff --git a/Translations/translation_UK.json b/Translations/translation_UK.json index aa613683..604853ab 100644 --- a/Translations/translation_UK.json +++ b/Translations/translation_UK.json @@ -43,7 +43,8 @@ ], "LockingKeysString": "ЗАБЛОК.", "UnlockingKeysString": "РОЗБЛОК.", - "WarningKeysLockedString": "!ЗАБЛОК!" + "WarningKeysLockedString": "!ЗАБЛОК!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "П", diff --git a/Translations/translation_YUE_HK.json b/Translations/translation_YUE_HK.json index 51215151..7f9d6d0e 100644 --- a/Translations/translation_YUE_HK.json +++ b/Translations/translation_YUE_HK.json @@ -40,7 +40,8 @@ ], "LockingKeysString": "已鎖定", "UnlockingKeysString": "已解除鎖定", - "WarningKeysLockedString": "!撳掣鎖定!" + "WarningKeysLockedString": "!撳掣鎖定!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "右", diff --git a/Translations/translation_ZH_CN.json b/Translations/translation_ZH_CN.json index 1af6fe72..3627a186 100644 --- a/Translations/translation_ZH_CN.json +++ b/Translations/translation_ZH_CN.json @@ -40,7 +40,8 @@ ], "LockingKeysString": "已锁定", "UnlockingKeysString": "已解除锁定", - "WarningKeysLockedString": "!按键锁定!" + "WarningKeysLockedString": "!按键锁定!", + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "右", diff --git a/Translations/translation_ZH_TW.json b/Translations/translation_ZH_TW.json index 6cb02207..a943ab4a 100644 --- a/Translations/translation_ZH_TW.json +++ b/Translations/translation_ZH_TW.json @@ -40,7 +40,9 @@ ], "LockingKeysString": "已鎖定", "UnlockingKeysString": "已解除鎖定", - "WarningKeysLockedString": "!按鍵鎖定!" + "WarningKeysLockedString": "!按鍵鎖定!", + "WarningThermalRunaway":["Thermal","Runaway"], + "WarningThermalRunaway":["Thermal","Runaway"] }, "characters": { "SettingRightChar": "右", diff --git a/Translations/translations_def.js b/Translations/translations_def.js index 7baa271d..e25b02db 100644 --- a/Translations/translations_def.js +++ b/Translations/translations_def.js @@ -83,6 +83,9 @@ var def = }, { "id": "WarningKeysLockedString" + }, + { + "id": "WarningThermalRunaway" } ], "characters": [ diff --git a/source/Core/Inc/Translation.h b/source/Core/Inc/Translation.h index 5bb54963..6362c83c 100644 --- a/source/Core/Inc/Translation.h +++ b/source/Core/Inc/Translation.h @@ -85,6 +85,7 @@ struct TranslationIndexTable { uint16_t LockingKeysString; uint16_t UnlockingKeysString; uint16_t WarningKeysLockedString; + uint16_t WarningThermalRunaway; uint16_t SettingRightChar; uint16_t SettingLeftChar; diff --git a/source/Core/Inc/configuration.h b/source/Core/Inc/configuration.h index 66f3f828..bbe5ffec 100644 --- a/source/Core/Inc/configuration.h +++ b/source/Core/Inc/configuration.h @@ -94,6 +94,9 @@ #define DETAILED_SOLDERING 0 // 0: Disable 1: Enable - Default 0 #define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0 +#define THERMAL_RUNAWAY_TIME_SEC 20 +#define THERMAL_RUNAWAY_TEMP_C 20 + #define CUT_OUT_SETTING 0 // default to no cut-off voltage #define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33)) #define TEMPERATURE_INF 0 // default to 0 diff --git a/source/Core/Threads/GUIThread.cpp b/source/Core/Threads/GUIThread.cpp index df032b26..ad12452d 100644 --- a/source/Core/Threads/GUIThread.cpp +++ b/source/Core/Threads/GUIThread.cpp @@ -28,6 +28,7 @@ extern "C" { // File local variables extern uint32_t currentTempTargetDegC; extern TickType_t lastMovementTime; +extern bool heaterThermalRunaway; extern osThreadId GUITaskHandle; extern osThreadId MOVTaskHandle; extern osThreadId PIDTaskHandle; @@ -62,7 +63,7 @@ void GUIDelay() { // This limits the re-draw rate to the LCD and also lets the DMA run // As the gui task can very easily fill this bus with transactions, which will // prevent the movement detection from running - osDelay(50); + vTaskDelay(5 * TICKS_10MS); } void gui_drawTipTemp(bool symbol, const FontStyle font) { // Draw tip temp handling unit conversion & tolerance near setpoint @@ -608,7 +609,6 @@ static void gui_solderingMode(uint8_t jumpToSleep) { } } OLED::refresh(); - // Update the setpoints for the temperature if (boostModeOn) { if (systemSettings.temperatureInF) @@ -645,6 +645,15 @@ static void gui_solderingMode(uint8_t jumpToSleep) { } else { setStatusLED(LED_HEATING); } + // If we have tripped thermal runaway, turn off header and show warning + if (heaterThermalRunaway) { + currentTempTargetDegC = 0; // heaater control off + // TODO WARNING + + warnUser(translatedString(Tr->WarningThermalRunaway), 10 * TICKS_SECOND); + heaterThermalRunaway = false; + return; + } // slow down ui update rate GUIDelay(); } diff --git a/source/Core/Threads/PIDThread.cpp b/source/Core/Threads/PIDThread.cpp index e8a69073..ff90c76a 100644 --- a/source/Core/Threads/PIDThread.cpp +++ b/source/Core/Threads/PIDThread.cpp @@ -19,6 +19,7 @@ static TickType_t powerPulseDurationUnit = (5 * TICKS_100MS) / 2; // 250 ms TaskHandle_t pidTaskNotification = NULL; uint32_t currentTempTargetDegC = 0; // Current temperature target in C int32_t powerSupplyWattageLimit = 0; +bool heaterThermalRunaway = false; /* StartPIDTask function */ void startPIDTask(void const *argument __unused) { /* @@ -32,8 +33,10 @@ void startPIDTask(void const *argument __unused) { history tempError = {{0}, 0, 0}; currentTempTargetDegC = 0; // Force start with no output (off). If in sleep / soldering this will // be over-ridden rapidly - pidTaskNotification = xTaskGetCurrentTaskHandle(); - uint32_t PIDTempTarget = 0; + pidTaskNotification = xTaskGetCurrentTaskHandle(); + uint32_t PIDTempTarget = 0; + uint16_t tipTempCRunawayTemp = 0; + TickType_t runawaylastChangeTime = 0; #ifdef SLEW_LIMIT int32_t x10WattsOutLast = 0; #endif @@ -91,6 +94,33 @@ void startPIDTask(void const *argument __unused) { // and counters extra power if the iron is no longer losing temp. // basically: temp - lastTemp // Unfortunately, our temp signal is too noisy to really help. + + // Check for thermal runaway, where it has been x seconds with negligible (y) temp rise + // While trying to actively heat + if ((tError > THERMAL_RUNAWAY_TEMP_C)) { + // Temp error is high + int16_t delta = (int16_t)currentTipTempInC - (int16_t)tipTempCRunawayTemp; + if (delta < 0) { + delta = -delta; + } + if (delta > THERMAL_RUNAWAY_TEMP_C) { + // We have heated up more than the threshold, reset the timer + tipTempCRunawayTemp = currentTipTempInC; + runawaylastChangeTime = xTaskGetTickCount(); + } else { + if ((xTaskGetTickCount() - runawaylastChangeTime) > (THERMAL_RUNAWAY_TIME_SEC * TICKS_SECOND)) { + // It has taken too long to rise + heaterThermalRunaway = true; + } + } + } else { + tipTempCRunawayTemp = currentTipTempInC; + runawaylastChangeTime = xTaskGetTickCount(); + } + + } else { + tipTempCRunawayTemp = currentTipTempInC; + runawaylastChangeTime = xTaskGetTickCount(); } // If the user turns on the option of using an occasional pulse to keep the power bank on if (systemSettings.KeepAwakePulse) { @@ -111,6 +141,9 @@ void startPIDTask(void const *argument __unused) { if (getTipRawTemp(0) > (0x7FFF - 32)) { x10WattsOut = 0; } + if (heaterThermalRunaway) { + x10WattsOut = 0; + } if (systemSettings.powerLimit && x10WattsOut > (systemSettings.powerLimit * 10)) { x10WattsOut = systemSettings.powerLimit * 10; }