Merge branch 'dev' into dev

This commit is contained in:
discip
2025-01-13 22:20:48 +01:00
committed by GitHub
21 changed files with 250 additions and 172 deletions

1
.gitignore vendored
View File

@@ -215,3 +215,4 @@ Logo GUI/TS100 Logo Editor/TS100 Logo Editor/bin/
# Tests/linters/sanitizers
source/check-style.log
.ash_history

View File

@@ -39,7 +39,7 @@ The model should be replaced by one of the following options:
- `pinecilv1` for the Pinecil V1
- `pinecilv2` for the Pinecil V2
- `ts101` for the Miniware TS101 [^1] [^2]
- `s60` for the Squire S60 [^1]
- `s60` for the Sequre S60 [^1]
- `mhp30` for the Miniware MHP30
Different models are used for different flash locations for the image storage.

View File

@@ -65,13 +65,12 @@ For notes on installation for your device, please refer to the flashing guide fo
## Builds
The links in the table below allow to download available builds directly.
The links in the table below allow to download available builds directly:
- current _Stable Release_ is **`v2.22`**;
- _Development Build_ **dynamically** provides _**the latest successful build**_ from **`dev`** branch.
Current stable release is `v2.22`.
_Devel builds_ **dynamically** provide _**the latest successful build**_ from **`dev`** branch.
| Device | Stable Release | Devel Build |
|:---------------------:|:--------------:|:-----------:|
| Device | Stable Release | Development Build |
|:---------------------:|:--------------:|:-----------------:|
| Pinecil V1 | [Pinecil.zip](https://github.com/Ralim/IronOS/releases/download/v2.22/Pinecil.zip) | [Pinecil.zip](https://nightly.link/Ralim/IronOS/workflows/push/dev/Pinecil.zip) |
| Pinecil V1/multilang | [Pinecil_multi-lang.zip](https://github.com/Ralim/IronOS/releases/download/v2.22/Pinecil_multi-lang.zip) | [Pinecil_multi-lang.zip](https://nightly.link/Ralim/IronOS/workflows/push/dev/Pinecil_multi-lang.zip) |
| Pinecil V2 | [PinecilV2.zip](https://github.com/Ralim/IronOS/releases/download/v2.22/PinecilV2.zip) | [PinecilV2.zip](https://nightly.link/Ralim/IronOS/workflows/push/dev/Pinecilv2.zip) |

View File

@@ -340,8 +340,8 @@
"description": ""
},
"SolderingTipType": {
"displayText": "Soldering\nTip Type",
"description": "Select the tip type fitted"
"displayText": "Löt-\nspitzentyp",
"description": "Wählen Sie den Typ der eingesetzten Spitze"
}
}
}

View File

@@ -116,13 +116,13 @@
"displayText": "Modalità\nsicura"
},
"TipTypeAuto": {
"displayText": "Auto\nSense"
"displayText": "Rilevaz.\nauto"
},
"TipTypeT12Long": {
"displayText": "TS100\nLong"
"displayText": "TS100\nlunga"
},
"TipTypeT12Short": {
"displayText": "Pine\nShort"
"displayText": "Pine\ncorta"
},
"TipTypeT12PTS": {
"displayText": "PTS\n200"
@@ -149,7 +149,7 @@
},
"PDNegTimeout": {
"displayText": "Abilitazione\nUSB PD",
"description": "Regola il massimo tempo utile per la negoziazione del protocollo USB Power Delivery con alimentatori compatibili [0: disattiva; multipli di 100 ms]"
"description": "Imposta il tempo di negoziazione del protocollo USB Power Delivery con alimentatori compatibili [0: disattiva; multipli di 100 ms]"
},
"USBPDMode": {
"displayText": "PD\nMode",
@@ -177,7 +177,7 @@
},
"ProfilePhases": {
"displayText": "Fasi modalità\nprofilo",
"description": "Imposta il numero di fasi da attuare per un profilo di riscaldamento personalizzato"
"description": "Imposta il numero di fasi da implementare per un profilo di riscaldamento personalizzato"
},
"ProfilePreheatTemp": {
"displayText": "Temperatura\npreriscaldamento",
@@ -340,8 +340,8 @@
"description": ""
},
"SolderingTipType": {
"displayText": "Soldering\nTip Type",
"description": "Select the tip type fitted"
"displayText": "Tipo di\npunta",
"description": "Seleziona il modello della punta in uso"
}
}
}

View File

@@ -4,7 +4,7 @@
"tempUnitFahrenheit": false,
"messagesWarn": {
"CalibrationDone": {
"message": "Kalibracja\nwykonana!"
"message": "Skalibrowano!"
},
"ResetOKMessage": {
"message": "Reset OK"
@@ -19,7 +19,7 @@
"message": "Nie rozpoznano\nkont. USB-PD IC!"
},
"LockingKeysString": {
"message": " ZABLOK."
"message": "ZABLOK."
},
"UnlockingKeysString": {
"message": "ODBLOK."
@@ -31,7 +31,7 @@
"message": "Ucieczka\ntermiczna"
},
"WarningTipShorted": {
"message": "!Tip Shorted!"
"message": "!Zwarty grot!"
},
"SettingsCalibrationWarning": {
"message": "Upewnij się, że końcówka i uchwyt mają temperaturę pokojową podczas następnego rozruchu!"
@@ -58,16 +58,16 @@
"message": "Grot: \n"
},
"ProfilePreheatString": {
"message": "Preheat\n"
"message": "Rozgrzewanie\n"
},
"ProfileCooldownString": {
"message": "Cooldown\n"
"message": "Schładzanie\n"
},
"DeviceFailedValidationWarning": {
"message": "Twoje urządzenie jest najprawdopodobniej podróbką!"
},
"TooHotToStartProfileWarning": {
"message": "Too hot to\nstart profile"
"message": "Zbyt gorące, aby\nuruchomić profil"
}
},
"characters": {
@@ -107,22 +107,22 @@
},
"menuValues": {
"USBPDModeDefault": {
"displayText": "Default\nMode"
"displayText": "Tryb\ndomyślny"
},
"USBPDModeNoDynamic": {
"displayText": "No\nDynamic"
"displayText": "Nie\ndynamiczny"
},
"USBPDModeSafe": {
"displayText": "Safe\nMode"
"displayText": "Tryb\nbezpieczny"
},
"TipTypeAuto": {
"displayText": "Auto\nSense"
"displayText": "Auto\nwykrycie"
},
"TipTypeT12Long": {
"displayText": "TS100\nLong"
"displayText": "Długi\nTS100"
},
"TipTypeT12Short": {
"displayText": "Pine\nShort"
"displayText": "Krótki\nPine"
},
"TipTypeT12PTS": {
"displayText": "PTS\n200"
@@ -137,27 +137,27 @@
"menuOptions": {
"DCInCutoff": {
"displayText": "Źródło\nzasilania",
"description": "Źródło zasilania. Ustaw napięcie odcięcia. (DC 10V) (S 3.3V dla ogniw Li, wyłącz limit mocy)"
"description": "Źródło zasilania. Ustaw napięcie odcięcia. (DC 10V) (S=3.3V dla ogniw Li, wyłącz limit mocy)"
},
"MinVolCell": {
"displayText": "Minimalne\nnapięcie",
"description": "Minimalne dozwolone napięcie na komórkę (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
},
"QCMaxVoltage": {
"displayText": "QC\nnapięcie",
"displayText": "Napięcie QC",
"description": "Maksymalne napięcie, które lutownica będzie próbowała wynegocjować z ładowarką Quick Charge (V)"
},
"PDNegTimeout": {
"displayText": "Limit czasu\nPD",
"description": "Limit czasu negocjacji PD w krokach co 100 ms dla zgodności z niektórymi ładowarkami QC (0: wyłączone)"
"description": "Limit czasu negocjacji PD w krokach co 100ms dla zgodności z niektórymi ładowarkami QC (0: wyłączone)"
},
"USBPDMode": {
"displayText": "PD\nMode",
"displayText": "Tryb PD",
"description": "Włącza tryby PPS & EPR."
},
"BoostTemperature": {
"displayText": "Temp.\nboost",
"description": "Temperatura w trybie \"boost\" "
"description": "Temp. w trybie \"boost\" "
},
"AutoStart": {
"displayText": "Aut. uruch.\ntr. lutowania",
@@ -176,60 +176,60 @@
"description": "W trybie lutowania, wciśnij oba przyciski aby je zablokować (B=tylko Boost | P=pełna blokada)"
},
"ProfilePhases": {
"displayText": "Profile\nPhases",
"description": "Number of phases in profile mode"
"displayText": "Fazy\nprofilu",
"description": "Liczba faz w trybie profilu"
},
"ProfilePreheatTemp": {
"displayText": "Preheat\nTemp",
"description": "Preheat to this temperature at the start of profile mode"
"displayText": "Temp.\nrozgrzewania",
"description": "Rozgrzanie do tej temp. na początku trybu profilu"
},
"ProfilePreheatSpeed": {
"displayText": "Preheat\nSpeed",
"description": "Preheat at this rate (degrees per second)"
"displayText": "Prędk.\nrozgrzewania",
"description": "Tempo rozgrzewania (stopnie na sekundę)"
},
"ProfilePhase1Temp": {
"displayText": "Phase 1\nTemp",
"description": "Target temperature for the end of this phase"
"displayText": "Temp.\nfazy 1",
"description": "Docelowa temp. na koniec tej fazy"
},
"ProfilePhase1Duration": {
"displayText": "Phase 1\nDuration",
"description": "Target duration of this phase (seconds)"
"displayText": "Dług.\nfazy 1",
"description": "Docelowy czas trwania tej fazy (sekundy)"
},
"ProfilePhase2Temp": {
"displayText": "Phase 2\nTemp",
"displayText": "Temp.\nfazy 2",
"description": ""
},
"ProfilePhase2Duration": {
"displayText": "Phase 2\nDuration",
"displayText": "Dług.\nfazy 2",
"description": ""
},
"ProfilePhase3Temp": {
"displayText": "Phase 3\nTemp",
"displayText": "Temp.\nfazy 3",
"description": ""
},
"ProfilePhase3Duration": {
"displayText": "Phase 3\nDuration",
"displayText": "Dług.\nfazy 3",
"description": ""
},
"ProfilePhase4Temp": {
"displayText": "Phase 4\nTemp",
"displayText": "Temp.\nfazy 4",
"description": ""
},
"ProfilePhase4Duration": {
"displayText": "Phase 4\nDuration",
"displayText": "Dług.\nfazy 4",
"description": ""
},
"ProfilePhase5Temp": {
"displayText": "Phase 5\nTemp",
"displayText": "Temp.\nfazy 5",
"description": ""
},
"ProfilePhase5Duration": {
"displayText": "Phase 5\nDuration",
"displayText": "Dług.\nfazy 5",
"description": ""
},
"ProfileCooldownSpeed": {
"displayText": "Cooldown\nSpeed",
"description": "Cooldown at this rate at the end of profile mode (degrees per second)"
"displayText": "Prędk.\nschładzania",
"description": "Tempo schładzania na koniec trybu profilu (stopnie na sekundę)"
},
"MotionSensitivity": {
"displayText": "Czułość\nwykr. ruchu",
@@ -264,8 +264,8 @@
"description": "Obrót ekranu (P: dla praworęcznych | L: dla leworęcznych | A: automatycznie)"
},
"CooldownBlink": {
"displayText": "Mig. podczas\nwychładzania",
"description": "Temperatura miga podczas wychładzania, gdy grot jest wciąż gorący"
"displayText": "Mig. podczas\nschładzania",
"description": "Temperatura miga podczas schładzania, gdy grot jest wciąż gorący"
},
"ScrollingSpeed": {
"displayText": "Sz. przew.\ntekstu",
@@ -296,7 +296,7 @@
"description": "Ustawia czas wyświetlania loga podczas uruchamiania (s=sekund)"
},
"AdvancedIdle": {
"displayText": "Szeczegółowy\nekran bezczy.",
"displayText": "Szczegółowy\nekran bezczyn.",
"description": "Wyświetla szczegółowe informacje za pomocą mniejszej czcionki na ekranie bezczynności"
},
"AdvancedSoldering": {
@@ -305,7 +305,7 @@
},
"BluetoothLE": {
"displayText": "Bluetooth\n",
"description": "Enables BLE"
"description": "Włącza Bluetooth Low Energy"
},
"PowerLimit": {
"displayText": "Ogr.\nmocy",
@@ -340,8 +340,8 @@
"description": ""
},
"SolderingTipType": {
"displayText": "Soldering\nTip Type",
"description": "Select the tip type fitted"
"displayText": "Typ grotu",
"description": "Wybierz typ zamontowanego grotu"
}
}
}

View File

@@ -116,19 +116,19 @@
"displayText": "Вкл.без\nзапроса"
},
"TipTypeAuto": {
"displayText": "Auto\nSense"
"displayText": "Авто\nопред-е"
},
"TipTypeT12Long": {
"displayText": "TS100\nLong"
"displayText": "TS100\nстанд."
},
"TipTypeT12Short": {
"displayText": "Pine\nShort"
"displayText": "Pine\nкоротк."
},
"TipTypeT12PTS": {
"displayText": "PTS\n200"
},
"TipTypeTS80": {
"displayText": "TS80\n"
"displayText": "TS80(P)\n"
},
"TipTypeJBCC210": {
"displayText": "JBC\nC210"
@@ -252,8 +252,8 @@
"description": "Чувствительность датчика Холла к магнитному полю (1=мин. | ... | 9=макс.)"
},
"HallEffSleepTimeout": {
"displayText": "HallSensor\nSleepTime",
"description": "Интервал перед запуском \"спящего режима\", когда эффект Холла превышает пороговое значение"
"displayText": "Интервал\nдатчика Холла",
"description": "Время между превышением датчиком Холла порогового значения и режимом сна"
},
"TemperatureUnit": {
"displayText": "Единицы\nизмерения",
@@ -340,8 +340,8 @@
"description": ""
},
"SolderingTipType": {
"displayText": "Soldering\nTip Type",
"description": "Select the tip type fitted"
"displayText": "Тип\nжала",
"description": "Выбор типа установленного жала"
}
}
}

View File

@@ -46,10 +46,10 @@
"message": "电压过低"
},
"UndervoltageString": {
"message": "Undervoltage"
"message": "欠压"
},
"InputVoltageString": {
"message": "VIN: "
"message": "VIN: \n"
},
"SleepingAdvancedString": {
"message": "Zzzz..."
@@ -58,16 +58,16 @@
"message": "<--- "
},
"ProfilePreheatString": {
"message": "Preheat"
"message": "预热中"
},
"ProfileCooldownString": {
"message": "Cooldown"
"message": "冷却"
},
"DeviceFailedValidationWarning": {
"message": "这支电烙铁很有可能是冒牌货!"
},
"TooHotToStartProfileWarning": {
"message": "Too hot to start profile"
"message": "设备过热"
}
},
"characters": {
@@ -107,16 +107,16 @@
},
"menuValues": {
"USBPDModeDefault": {
"displayText": "Default\nMode"
"displayText": "默认模式"
},
"USBPDModeNoDynamic": {
"displayText": "No\nDynamic"
},
"USBPDModeSafe": {
"displayText": "Safe\nMode"
"displayText": "安全模式"
},
"TipTypeAuto": {
"displayText": "Auto\nSense"
"displayText": "自动检测"
},
"TipTypeT12Long": {
"displayText": "TS100\nLong"
@@ -152,7 +152,7 @@
"description": "设定USB-PD协议交涉的超时时限为兼容某些QC电源而设 <x100ms亳秒>"
},
"USBPDMode": {
"displayText": "PD VPDO",
"displayText": "PD\nVPDO",
"description": "启用PPS和EPR快充支持"
},
"BoostTemperature": {
@@ -176,60 +176,60 @@
"description": "焊接模式时,同时长按两个按键启用按键锁定 <增=只容许增热模式 | 全=完全锁定>"
},
"ProfilePhases": {
"displayText": "Profile Phases",
"description": "Number of phases in profile mode"
"displayText": "配置阶数",
"description": "配置模式下的阶段数量"
},
"ProfilePreheatTemp": {
"displayText": "Preheat Temp",
"description": "Preheat to this temperature at the start of profile mode"
"displayText": "预热温度",
"description": "配置开始时的目标温度"
},
"ProfilePreheatSpeed": {
"displayText": "Preheat Speed",
"description": "Preheat at this rate (degrees per second)"
"displayText": "预热速度",
"description": "将以此速度进行预热 (度/秒)"
},
"ProfilePhase1Temp": {
"displayText": "Phase 1 Temp",
"description": "Target temperature for the end of this phase"
"displayText": "阶段1温度",
"description": "此阶段结束时的目标温度"
},
"ProfilePhase1Duration": {
"displayText": "Phase 1 Duration",
"description": "Target duration of this phase (seconds)"
"displayText": "阶段1时间",
"description": "此阶段的目标持续时间(秒)"
},
"ProfilePhase2Temp": {
"displayText": "Phase 2 Temp",
"description": ""
"displayText": "阶段2温度",
"description": "此阶段结束时的目标温度"
},
"ProfilePhase2Duration": {
"displayText": "Phase 2 Duration",
"description": ""
"displayText": "阶段2时间",
"description": "此阶段的目标持续时间(秒)"
},
"ProfilePhase3Temp": {
"displayText": "Phase 3 Temp",
"description": ""
"displayText": "阶段3温度",
"description": "此阶段结束时的目标温度"
},
"ProfilePhase3Duration": {
"displayText": "Phase 3 Duration",
"description": ""
"displayText": "阶段3时间",
"description": "此阶段的目标持续时间(秒)"
},
"ProfilePhase4Temp": {
"displayText": "Phase 4 Temp",
"description": ""
"displayText": "阶段4温度",
"description": "此阶段结束时的目标温度"
},
"ProfilePhase4Duration": {
"displayText": "Phase 4 Duration",
"description": ""
"displayText": "阶段4时间",
"description": "此阶段的目标持续时间(秒)"
},
"ProfilePhase5Temp": {
"displayText": "Phase 5 Temp",
"description": ""
"displayText": "阶段5温度",
"description": "此阶段结束时的目标温度"
},
"ProfilePhase5Duration": {
"displayText": "Phase 5 Duration",
"description": ""
"displayText": "阶段5时间",
"description": "此阶段的目标持续时间(秒)"
},
"ProfileCooldownSpeed": {
"displayText": "Cooldown Speed",
"description": "Cooldown at this rate at the end of profile mode (degrees per second)"
"displayText": "冷却速度",
"description": "在配置模式结束时以此速度进行冷却(度/秒)"
},
"MotionSensitivity": {
"displayText": "动作灵敏度",
@@ -252,8 +252,8 @@
"description": "霍尔效应传感器用作启动待机模式的灵敏度 <1=最低灵敏度 | ... | 9=最高灵敏度>"
},
"HallEffSleepTimeout": {
"displayText": "HallSensor\nSleepTime",
"description": "Interval before \"sleep mode\" starts when hall effect is above threshold"
"displayText": "霍尔传感器休眠时间",
"description": "当霍尔传感器检测值高于阈值时,进入“睡眠模式”前的间隔时间"
},
"TemperatureUnit": {
"displayText": "温度单位",
@@ -316,7 +316,7 @@
"description": "在下次重启时校正烙铁头热电偶冷接点补偿值CJC温差小于5摄氏度时无需校正"
},
"VoltageCalibration": {
"displayText": "输入电压校正",
"displayText": "输入电压校正",
"description": "开始校正输入电压VIN<长按以退出>"
},
"PowerPulsePower": {
@@ -332,7 +332,7 @@
"description": "为保持电源处于唤醒状态,每次通电脉冲的时间长度 <x250ms亳秒>"
},
"SettingsReset": {
"displayText": "全部重置",
"displayText": "全部重置",
"description": "将所有设定重置为默认值"
},
"LanguageSwitch": {
@@ -340,8 +340,8 @@
"description": ""
},
"SolderingTipType": {
"displayText": "Soldering\nTip Type",
"description": "Select the tip type fitted"
"displayText": "焊接头类型",
"description": "选择安装合适的尖端类型"
}
}
}

View File

@@ -90,6 +90,20 @@ docs_history()
return "${ret}"
}
# Check for links to release builds in README.md
docs_links()
{
ver_git="$(git tag -l | sort | grep -e "^v" | grep -v "rc" | tail -1)"
md="README.md"
ver_md="$(grep -c "${ver_git}" "${md}")"
ret=0
if [ "${ver_md}" -ne 0 ]; then
ret=1
echo "Please, update mention & links in ${md} inside Builds section for release builds with version ${ver_git}."
fi;
return "${ret}"
}
# source/Makefile:ALL_LANGUAGES & Translations/*.json automagical routine
build_langs()
{
@@ -191,7 +205,9 @@ if [ "docs" = "${cmd}" ]; then
hist="${?}"
build_langs
langs="${?}"
if [ "${readme}" -eq 0 ] && [ "${hist}" -eq 0 ] && [ "${langs}" -eq 0 ]; then
docs_links
links="${?}"
if [ "${readme}" -eq 0 ] && [ "${hist}" -eq 0 ] && [ "${langs}" -eq 0 ] && [ "${links}" -eq 0 ]; then
ret=0
else
ret=1
@@ -218,6 +234,11 @@ if [ "build_langs" = "${cmd}" ]; then
exit "${?}"
fi;
if [ "docs_links" = "${cmd}" ]; then
docs_links
exit "${?}"
fi;
if [ "check_style_file" = "${cmd}" ]; then
check_style_file "${2}"
exit "${?}"

View File

@@ -103,8 +103,8 @@
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
// Due to large thermal mass of the PCB being heated we need to pull this back a bit
#define THERMAL_RUNAWAY_TIME_SEC 45
#define THERMAL_RUNAWAY_TEMP_C 3
#define THERMAL_RUNAWAY_TIME_SEC 20
#define THERMAL_RUNAWAY_TEMP_C 2
#define CUT_OUT_SETTING 0 // default to no cut-off voltage
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))

View File

@@ -63,8 +63,13 @@
* OLED Brightness
*
*/
#define MIN_BRIGHTNESS 0 // Min OLED brightness selectable
#define MAX_BRIGHTNESS 100 // Max OLED brightness selectable
#if defined(MODEL_TS101)
#define MIN_BRIGHTNESS 1 // Min OLED brightness selectable
#define MAX_BRIGHTNESS 101 // Max OLED brightness selectable
#else
#define MIN_BRIGHTNESS 0 // Min OLED brightness selectable
#define MAX_BRIGHTNESS 100 // Max OLED brightness selectable
#endif
#define BRIGHTNESS_STEP 25 // OLED brightness increment
#define DEFAULT_BRIGHTNESS 25 // default OLED brightness
@@ -104,7 +109,7 @@
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
#define THERMAL_RUNAWAY_TIME_SEC 20
#define THERMAL_RUNAWAY_TEMP_C 10
#define THERMAL_RUNAWAY_TEMP_C 3
#define CUT_OUT_SETTING 0 // default to no cut-off voltage
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))
@@ -214,6 +219,7 @@
#define TEMP_NTC 1
#define ACCEL_I2CBB1 1
#define POW_EPR 1
#define TIP_TYPE_SUPPORT 1 // Support for tips of different types, i.e. resistance
#define AUTO_TIP_SELECTION 1 // Can auto-select the tip
#define TIPTYPE_T12 1 // Can manually pick a T12 tip
#define HAS_POWER_DEBUG_MENU

View File

@@ -104,7 +104,7 @@
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
#define THERMAL_RUNAWAY_TIME_SEC 20
#define THERMAL_RUNAWAY_TEMP_C 20
#define THERMAL_RUNAWAY_TEMP_C 3
#define CUT_OUT_SETTING 0 // default to no cut-off voltage
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))

View File

@@ -105,7 +105,7 @@
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
#define THERMAL_RUNAWAY_TIME_SEC 20
#define THERMAL_RUNAWAY_TEMP_C 20
#define THERMAL_RUNAWAY_TEMP_C 3
#define CUT_OUT_SETTING 0 // default to no cut-off voltage
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))
@@ -155,6 +155,7 @@
#define POW_EPR 1
#define ENABLE_QC2 1
#define MAG_SLEEP_SUPPORT 1
#define TIP_TYPE_SUPPORT 1 // Support for tips of different types, i.e. resistance
#define AUTO_TIP_SELECTION 1 // Can auto-select the tip
#define TIPTYPE_T12 1 // Can manually pick a T12 tip
#define DEVICE_HAS_VALIDATION_SUPPORT

View File

@@ -133,7 +133,7 @@
#define TEMP_uV_LOOKUP_S60
#define USB_PD_VMAX 12 // Maximum voltage for PD to negotiate
#define THERMAL_RUNAWAY_TIME_SEC 20
#define THERMAL_RUNAWAY_TEMP_C 10
#define THERMAL_RUNAWAY_TEMP_C 3
#define USB_PD_TIMEOUT 1 // Default Timeout for USB-PD Protocol negotiation in x100ms
#define HARDWARE_MAX_WATTAGE_X10 600
@@ -168,7 +168,7 @@
#define TEMP_uV_LOOKUP_S60
#define USB_PD_VMAX 20 // Maximum voltage for PD to negotiate
#define THERMAL_RUNAWAY_TIME_SEC 20
#define THERMAL_RUNAWAY_TEMP_C 10
#define THERMAL_RUNAWAY_TEMP_C 3
#define USB_PD_TIMEOUT 1 // Default Timeout for USB-PD Protocol negotiation in x100ms
#define HARDWARE_MAX_WATTAGE_X10 600
@@ -225,8 +225,8 @@
#define TIP_THERMAL_MASS 30 // X10 watts to raise 1 deg C in 1 second
#define TIP_THERMAL_INERTIA 10 // We use a large inertia value to smooth out the drive to the tip since its stupidly sensitive
#define THERMAL_RUNAWAY_TIME_SEC 60
#define THERMAL_RUNAWAY_TEMP_C 3
#define THERMAL_RUNAWAY_TIME_SEC 30
#define THERMAL_RUNAWAY_TEMP_C 2
#define COPPER_HEATER_COIL 1 // Have a heater coil that changes resistance on us
#define TIP_RESISTANCE 52 // PCB heater, measured at ~19C. Will shift by temp a decent amount

View File

@@ -123,6 +123,7 @@ typedef enum {
* Some devices allow multiple types of tips to be fitted, this allows selecting them or overriding the logic
* The first type will be the default (gets value of 0)
*/
#ifdef TIP_TYPE_SUPPORT
typedef enum {
#ifdef AUTO_TIP_SELECTION
TIP_TYPE_AUTO, // If the hardware supports automatic detection
@@ -142,7 +143,15 @@ typedef enum {
// #endif
TIP_TYPE_MAX, // Max value marker
} tipType_t;
uint8_t getUserSelectedTipResistance(); // returns the resistance matching the selected tip type or 0 for auto
#else
typedef enum {
TIP_TYPE_AUTO = 0, // value for the default case
TIP_TYPE_MAX = 0, // marker for settings when not supported
} tipType_t;
#endif /* TIP_TYPE_SUPPORT */
// returns the resistance matching the selected tip type or 0 for auto and when not supported
uint8_t getUserSelectedTipResistance();
// Settings wide operations
void saveSettings();
@@ -162,5 +171,7 @@ void setSettingValue(const enum SettingsOptions option, const uint16_t newValue)
// Special access helpers, to reduce logic duplication
uint8_t lookupVoltageLevel();
uint16_t lookupHallEffectThreshold();
#ifdef TIP_TYPE_SUPPORT
const char *lookupTipName(); // Get the name string for the current soldering tip
#endif /* TIP_TYPE_SUPPORT */
#endif /* SETTINGS_H_ */

View File

@@ -298,16 +298,12 @@ uint8_t lookupVoltageLevel() {
}
}
#ifdef TIP_TYPE_SUPPORT
const char *lookupTipName() {
// Get the name string for the current soldering tip
tipType_t value = (tipType_t)getSettingValue(SettingsOptions::SolderingTipType);
switch (value) {
#ifdef AUTO_TIP_SELECTION
case tipType_t::TIP_TYPE_AUTO:
return translatedString(Tr->TipTypeAuto);
break;
#endif
#ifdef TIPTYPE_T12
case tipType_t::T12_8_OHM:
return translatedString(Tr->TipTypeT12Long);
@@ -319,7 +315,7 @@ const char *lookupTipName() {
return translatedString(Tr->TipTypeT12PTS);
break;
#endif
#ifdef TIPTYE_TS80
#ifdef TIPTYPE_TS80
case tipType_t::TS80_4_5_OHM:
return translatedString(Tr->TipTypeTS80);
break;
@@ -328,13 +324,19 @@ const char *lookupTipName() {
case tipType_t::JBC_210_2_5_OHM:
return translatedString(Tr->TipTypeJBCC210);
break;
#endif
#ifdef AUTO_TIP_SELECTION
case tipType_t::TIP_TYPE_AUTO:
#endif
default:
return nullptr;
return translatedString(Tr->TipTypeAuto);
break;
}
}
#endif /* TIP_TYPE_SUPPORT */
// Returns the resistance for the current tip selected by the user or 0 for auto
#ifdef TIP_TYPE_SUPPORT
uint8_t getUserSelectedTipResistance() {
tipType_t value = (tipType_t)getSettingValue(SettingsOptions::SolderingTipType);
@@ -370,3 +372,6 @@ uint8_t getUserSelectedTipResistance() {
break;
}
}
#else
uint8_t getUserSelectedTipResistance() { return tipType_t::TIP_TYPE_AUTO; }
#endif /* TIP_TYPE_SUPPORT */

View File

@@ -116,8 +116,10 @@ static bool showHallEffect(void);
#endif /* HALL_SENSOR */
// Tip type selection
#ifdef TIP_TYPE_SUPPORT
static void displaySolderingTipType(void);
static bool showSolderingTipType(void);
#endif /* TIP_TYPE_SUPPORT */
// Menu functions
@@ -267,12 +269,12 @@ const menuitem powerMenu[] = {
const menuitem solderingMenu[] = {
/*
* Tip Type
* Boost Mode Temp
* Auto Start
* Temp Change Short Step
* Temp Change Long Step
* Locking Mode
* Tip Type
* Profile Phases
* Profile Preheat Temperature
* Profile Preheat Max Temperature Change Per Second
@@ -288,8 +290,6 @@ const menuitem solderingMenu[] = {
* Profile Phase 5 Duration (s)
* Profile Cooldown Max Temperature Change Per Second
*/
/* Tip Type */
{SETTINGS_DESC(SettingsItemIndex::SolderingTipType), nullptr, displaySolderingTipType, showSolderingTipType, SettingsOptions::SolderingTipType, SettingsItemIndex::SolderingTipType, 5},
/* Boost Temp */
{SETTINGS_DESC(SettingsItemIndex::BoostTemperature), setBoostTemp, displayBoostTemp, nullptr, SettingsOptions::BoostTemp, SettingsItemIndex::BoostTemperature, 5},
/* Auto start */
@@ -300,6 +300,10 @@ const menuitem solderingMenu[] = {
{SETTINGS_DESC(SettingsItemIndex::TempChangeLongStep), nullptr, displayTempChangeLongStep, nullptr, SettingsOptions::TempChangeLongStep, SettingsItemIndex::TempChangeLongStep, 6},
/* Locking Mode */
{SETTINGS_DESC(SettingsItemIndex::LockingMode), nullptr, displayLockingMode, nullptr, SettingsOptions::LockingMode, SettingsItemIndex::LockingMode, 7},
#ifdef TIP_TYPE_SUPPORT
/* Tip Type */
{SETTINGS_DESC(SettingsItemIndex::SolderingTipType), nullptr, displaySolderingTipType, showSolderingTipType, SettingsOptions::SolderingTipType, SettingsItemIndex::SolderingTipType, 5},
#endif /* TIP_TYPE_SUPPORT */
#ifdef PROFILE_SUPPORT
/* Profile Phases */
{SETTINGS_DESC(SettingsItemIndex::ProfilePhases), nullptr, displayProfilePhases, nullptr, SettingsOptions::ProfilePhases, SettingsItemIndex::ProfilePhases, 7},
@@ -763,12 +767,16 @@ static void displayHallEffectSleepTime(void) {
}
}
#endif /* HALL_SENSOR */
#ifdef TIP_TYPE_SUPPORT
static void displaySolderingTipType(void) {
// TODO wrapping X value
OLED::print(lookupTipName(), FontStyle::SMALL, 255, OLED::getCursorX());
}
// If there is no detection, and no options, max is 0
static bool showSolderingTipType(void) { return tipType_t::TIP_TYPE_MAX != 0; }
#endif /* TIP_TYPE_SUPPORT */
static void setTempF(const enum SettingsOptions option) {
uint16_t Temp = getSettingValue(option);
if (getSettingValue(SettingsOptions::TemperatureInF)) {

View File

@@ -30,7 +30,7 @@ int32_t powerSupplyWattageLimit = 0;
bool heaterThermalRunaway = false;
static int32_t getPIDResultX10Watts(TemperatureType_t set_point, TemperatureType_t current_value);
static void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const TemperatureType_t tError);
static void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint32_t x10WattsOut);
static void setOutputx10WattsViaFilters(int32_t x10Watts);
static int32_t getX10WattageLimits();
@@ -92,8 +92,8 @@ void startPIDTask(void const *argument __unused) {
PIDTempTarget = TipThermoModel::getTipMaxInC();
}
detectThermalRunaway(currentTipTempInC, PIDTempTarget - currentTipTempInC);
x10WattsOut = getPIDResultX10Watts(PIDTempTarget, currentTipTempInC);
detectThermalRunaway(currentTipTempInC, x10WattsOut);
} else {
detectThermalRunaway(currentTipTempInC, 0);
}
@@ -228,31 +228,59 @@ int32_t getPIDResultX10Watts(TemperatureType_t set_point, TemperatureType_t curr
#endif
}
void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const TemperatureType_t tError) {
static TemperatureType_t tipTempCRunawayTemp = 0;
static TickType_t runawaylastChangeTime = 0;
/*
* Detection of thermal runaway
* The goal of this is to handle cases where something has gone wrong
* 1. The tip MOSFET is broken, so power is being constantly applied to the tip
* a. This can show as temp being stuck at max
* b. Or temp rising when the heater is off
* 2. Broken temperature sense
* a. Temp is stuck at a value
* These boil down to either a constantly rising temperature or a temperature that is stuck at a value
* These are both covered; but looking at the eye/delta between min and max temp seen
*/
void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint32_t x10WattsOut) {
// Check for thermal runaway, where it has been x seconds with negligible (y) temp rise
// While trying to actively heat
static TemperatureType_t tiptempMin = 0xFFFF; // Min tip temp seen
static TemperatureType_t tipTempMax = 0; // Max tip temp seen while heater is on
bool thisCycleIsHeating = x10WattsOut > 0;
static TickType_t heatCycleStart = 0;
// If we are more than 20C below the setpoint
if ((tError > THERMAL_RUNAWAY_TEMP_C)) {
static bool haveSeenDelta = false;
// If we have heated up by more than 20C since last sample point, snapshot time and tip temp
TemperatureType_t delta = currentTipTempInC - tipTempCRunawayTemp;
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
// Check for readings being pegged at the top of the ADC while the heater is off
if (!thisCycleIsHeating && (getTipRawTemp(0) > (0x7FFF - 16))) {
heaterThermalRunaway = true;
}
if (haveSeenDelta) {
return;
}
if (currentTipTempInC < tiptempMin) {
tiptempMin = currentTipTempInC;
}
if (thisCycleIsHeating && currentTipTempInC > tipTempMax) {
tipTempMax = currentTipTempInC;
}
if (thisCycleIsHeating) {
if (heatCycleStart == 0) {
heatCycleStart = xTaskGetTickCount();
}
} else {
heatCycleStart = 0;
}
if ((xTaskGetTickCount() - heatCycleStart) > (THERMAL_RUNAWAY_TIME_SEC * TICKS_SECOND)) {
if (tipTempMax > tiptempMin) {
// Have been heating for min seconds, check if the delta is large enough
TemperatureType_t delta = tipTempMax - tiptempMin;
haveSeenDelta = true;
if (delta < THERMAL_RUNAWAY_TEMP_C) {
heaterThermalRunaway = true;
}
}
} else {
tipTempCRunawayTemp = currentTipTempInC;
runawaylastChangeTime = xTaskGetTickCount();
}
}
@@ -308,4 +336,4 @@ void setOutputx10WattsViaFilters(int32_t x10WattsOut) {
#endif
setTipX10Watts(x10WattsOut);
resetWatchdog();
}
}

View File

@@ -29,20 +29,20 @@ extern "C" {
#endif
enum class OperatingMode {
StartupLogo = 0, // Showing the startup logo
CJCCalibration, // Cold Junction Calibration
StartupWarnings, // Startup checks and warnings
InitialisationDone, // Special state we use just before we to home screen at first startup. Allows jumping to extra startup states
HomeScreen, // Home/Idle screen that is the main launchpad to other modes
Soldering, // Main soldering operating mode
SolderingProfile, // Soldering by following a profile, used for reflow for example
Sleeping, // Sleep state holds iron at lower sleep temp
Hibernating, // Like sleeping but keeps heater fully off until woken
SettingsMenu, // Settings Menu
DebugMenuReadout, // Debug metrics
TemperatureAdjust, // Set point temperature adjustment
UsbPDDebug, // USB PD debugging information
ThermalRunaway, // Thermal Runaway warning state.
StartupLogo=10, // Showing the startup logo
CJCCalibration=11, // Cold Junction Calibration
StartupWarnings=12, // Startup checks and warnings
InitialisationDone=13, // Special state we use just before we to home screen at first startup. Allows jumping to extra startup states
HomeScreen=0, // Home/Idle screen that is the main launchpad to other modes
Soldering=1, // Main soldering operating mode
SolderingProfile=6, // Soldering by following a profile, used for reflow for example
Sleeping=3, // Sleep state holds iron at lower sleep temp
Hibernating=14, // Like sleeping but keeps heater fully off until woken
SettingsMenu=4, // Settings Menu
DebugMenuReadout=5, // Debug metrics
TemperatureAdjust=7, // Set point temperature adjustment
UsbPDDebug=8, // USB PD debugging information
ThermalRunaway=9, // Thermal Runaway warning state.
};
enum class TransitionAnimation {

View File

@@ -138,9 +138,7 @@ OperatingMode gui_solderingMode(const ButtonState buttons, guiContext *cxt) {
// Draw in the screen details
if (getSettingValue(SettingsOptions::DetailedSoldering)) {
ui_draw_soldering_power_status(cxt->scratch_state.state2);
} else {
ui_draw_soldering_basic_status(cxt->scratch_state.state2);
}

View File

@@ -21,4 +21,4 @@
* * BUILD_VERSION = 'v2.22' -> from stable git release: 'v2.22R.5E6F7G8H'
*/
#define BUILD_VERSION "v2.22"
#define BUILD_VERSION "v2.23"