diff --git a/Documentation/GettingStarted.md b/Documentation/GettingStarted.md index 7793b106..e269a881 100644 --- a/Documentation/GettingStarted.md +++ b/Documentation/GettingStarted.md @@ -42,7 +42,7 @@ This OLED screen features burn-in protection; if no buttons or movement have bee Additionally to the two icons shown, there are two "hidden" actions that can be performed on this menu. -If you press and hold the button near the tip (`+/A`), this enters the temperature adjustment screen. Normally this is not required; but if you would like to adjust the set temperature _before_ the tip starts to heat, this can be useful. +On devices that do not support profile mode, if you press and hold the button near the tip (`+/A`), this enters the temperature adjustment screen. Normally this is not required; but if you would like to adjust the set temperature _before_ the tip starts to heat, this can be useful. If you press and hold the button near the rear of the iron (`-/B`), it will take you into the [debug menu](https://ralim.github.io/IronOS/DebugMenu/). @@ -74,6 +74,23 @@ Pinecil has an unpopulated footprint (U14) for a hall effect sensor (Si7210-B-00 If, after entering sleep mode, the iron still does not see movement for a much longer time (default=10 minutes); it will shut down and return to the home screen. +## Profile Mode (MHP30 only) + +On devices that support it, a long press on `(+/A)` takes you into profile mode, which initiates the profile selected in the relevant settings. + +Profile mode plays out as follows: + +1. Check if the temperature is below 55C. If not, you will get a warning and cannot enter profile mode. +2. Preheat by raising the target temperature to the configured preheat temperature with the configured preheat speed. +3. Wait for the device to reach the preheat temperature. +4. Gradually move the target temperature to the configured end temperature of the first phase over the configured duration. +5. Wait for the device to reach the end temperature. +6. Repeat steps 4 and 5 for the next phases until there are no more phases configured. +7. Cool down by lowering the target temperature to 0 with the configured cooldown speed. +8. Once the temperature is below 55C, sound the buzzer (if available) and exit profile mode. + +You can manually exit profile mode manually in the same way as the soldering mode, by pressing and holding the rear button or pressing both buttons at once. + ## Settings Menu The settings menu is the most evolving aspect of the firmware, so each option is not documented here. However, do not panic, as every menu option has an on-screen description so you don't _need_ to come back here to figure them all out. diff --git a/Documentation/Menu.md b/Documentation/Menu.md index b9cebe74..458656a3 100644 --- a/Documentation/Menu.md +++ b/Documentation/Menu.md @@ -9,6 +9,12 @@ In this mode the iron works as you would expect, pressing either button will tak - Pressing both buttons or holding the rear button (`-/B`) will exit Soldering Mode. - Holding the front button (`+/A`) will enter [Boost mode](https://ralim.github.io/IronOS/Menu/#boost-mode) (if enabled). +## Profile mode (MHP30 only) + +In this mode, accessible by long pressing `(+/A)`, the configured profile will be initiated. +- You cannot adjust the temperature or enter boost mode. +- Pressing both buttons or holding the rear button (`-/B`) will exit Profile Mode as well. + ## Settings mode This mode allows you to cycle through all the options and set custom values. diff --git a/Translations/make_translation.py b/Translations/make_translation.py index 9a6341c6..6af0d6e0 100755 --- a/Translations/make_translation.py +++ b/Translations/make_translation.py @@ -66,6 +66,29 @@ def read_translation(json_root: Union[str, Path], lang_code: str) -> dict: return lang +def filter_translation(lang: dict, defs: dict, macros: frozenset): + def check_excluded(record): + if "include" in record and not any(m in macros for m in record["include"]): + return True + + if "exclude" in record and any(m in macros for m in record["exclude"]): + return True + + return False + + for category in ("menuOptions", "menuGroups"): + for index, record in enumerate(defs[category]): + if check_excluded(record): + lang[category][record["id"]]["displayText"] = "" + lang[category][record["id"]]["description"] = "" + + for index, record in enumerate(defs["messagesWarn"]): + if check_excluded(record): + lang["messagesWarn"][record["id"]]["message"] = "" + + return lang + + def validate_langcode_matches_content(filename: str, content: dict) -> None: # Extract lang code from file name lang_code = filename[12:-5].upper() @@ -101,6 +124,8 @@ def get_constants() -> List[Tuple[str, str]]: ("SmallSymbolSpace", " "), ("LargeSymbolDot", "."), ("SmallSymbolDot", "."), + ("SmallSymbolSlash", "/"), + ("SmallSymbolColon", ":"), ("LargeSymbolDegC", "C"), ("SmallSymbolDegC", "C"), ("LargeSymbolDegF", "F"), @@ -250,7 +275,6 @@ def get_letter_counts(defs: dict, lang: dict, build_version: str) -> Dict: # collapse all strings down into the composite letters and store totals for these # Doing this seperately for small and big font def sort_and_count(list_in: List[str]): - symbol_counts: dict[str, int] = {} for line in list_in: line = line.replace("\n", "").replace("\r", "") @@ -439,7 +463,6 @@ class FontMapsPerFont: def get_font_map_per_font( text_list_small_font: List[str], text_list_large_font: List[str] ) -> FontMapsPerFont: - pending_small_symbols = set(text_list_small_font) pending_large_symbols = set(text_list_large_font) @@ -1029,7 +1052,6 @@ def get_translation_strings_and_indices_text( large_font_symbol_conversion_table: Dict[str, bytes], suffix: str = "", ) -> str: - # For all strings; we want to convert them to their byte encoded form (using font index lookups) # Then we want to sort by their reversed format to see if we can remove any duplicates by combining the tails (last n bytes;n>0) # Finally we look for any that are contained inside one another, and if they are we update them to point to this @@ -1118,7 +1140,6 @@ def get_translation_strings_and_indices_text( translation_strings_text = " /* .strings = */ {\n" for i, encoded_bytes in enumerate(byte_encoded_strings): - if i > 0: translation_strings_text += ' "\\0"\n' @@ -1285,6 +1306,13 @@ def parse_args() -> argparse.Namespace: required=False, dest="compress_font", ) + parser.add_argument( + "--macros", + help="Extracted macros to filter translation strings by", + type=argparse.FileType("r"), + required=True, + dest="macros", + ) parser.add_argument( "--output", "-o", help="Target file", type=argparse.FileType("w"), required=True ) @@ -1305,6 +1333,12 @@ def main() -> None: logging.error("error: Both --output-pickled and --input-pickled are specified") sys.exit(1) + macros = ( + frozenset(re.findall(r"#define ([^ ]+)", args.macros.read())) + if args.macros + else frozenset() + ) + language_data: LanguageData if args.input_pickled: logging.info(f"Reading pickled language data from {args.input_pickled.name}...") @@ -1329,11 +1363,13 @@ def main() -> None: defs_ = load_json(os.path.join(json_dir, "translations_definitions.json")) if len(args.languageCodes) == 1: - lang_ = read_translation(json_dir, args.languageCodes[0]) + lang_ = filter_translation( + read_translation(json_dir, args.languageCodes[0]), defs_, macros + ) language_data = prepare_language(lang_, defs_, build_version) else: langs_ = [ - read_translation(json_dir, lang_code) + filter_translation(read_translation(json_dir, lang_code), defs_, macros) for lang_code in args.languageCodes ] language_data = prepare_languages(langs_, defs_, build_version) diff --git a/Translations/translation_BE.json b/Translations/translation_BE.json index e901ab09..72ddf0f5 100644 --- a/Translations/translation_BE.json +++ b/Translations/translation_BE.json @@ -60,8 +60,17 @@ "OffString": { "message": "Выкл." }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Ваша прылада, хутчэй за ўсё, падробка!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Дазволіць\nблок. кнопак", "description": "Пры рабоце падоўжаны націск дзьвух кнопак блакуе іх (А=Адключана | Т=Толькі турба | П=Поўная блакіроўка)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Адчувальнасць\nакселерометра", "description": "Адчувальнасць акселерометра (0=Выкл. | 1=Мін. | ... | 9=Макс.)" diff --git a/Translations/translation_BG.json b/Translations/translation_BG.json index af386423..72b4f49f 100644 --- a/Translations/translation_BG.json +++ b/Translations/translation_BG.json @@ -60,8 +60,17 @@ "OffString": { "message": "Изкл." }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Allow locking\nbuttons", "description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Усещане\nза движение", "description": "Усещане за движение (0=Изключено | 1=Слабо | ... | 9=Силно)" diff --git a/Translations/translation_CS.json b/Translations/translation_CS.json index 43dbf35d..fb4c4d1f 100644 --- a/Translations/translation_CS.json +++ b/Translations/translation_CS.json @@ -60,8 +60,17 @@ "OffString": { "message": "Vyp" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Vaše zařízení je s nejvyšší pravděpodobností padělek!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Povolit zamč.\ntlačítek", "description": "Při pájení podržte obě tlačítka pro jejich zamčení (Z=zakázáno | B=pouze v režimu boost | U=úplné zamčení)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Citlivost\nna pohyb", "description": "0=vyp | 1=nejméně citlivé | ... | 9=nejvíce citlivé" diff --git a/Translations/translation_DA.json b/Translations/translation_DA.json index 1b665ede..12625a67 100644 --- a/Translations/translation_DA.json +++ b/Translations/translation_DA.json @@ -60,8 +60,17 @@ "OffString": { "message": "Off" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Din enhed er højst sandsyneligt en Kopivare!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Tillad låsning\naf knapperne", "description": "Hold begge knapper nede under lodning for at låse dem (D=deaktiver | B=kun boost-tilstand | F=fuld låsning)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Bevægelses\nfølsomhed", "description": "Bevægelsesfølsomhed (0=Slukket | 1=Mindst følsom | ... | 9=Mest følsom)" diff --git a/Translations/translation_DE.json b/Translations/translation_DE.json index 07c10399..1b2ac250 100644 --- a/Translations/translation_DE.json +++ b/Translations/translation_DE.json @@ -60,8 +60,17 @@ "OffString": { "message": "Aus" }, + "ProfilePreheatString": { + "message": "Vorwärmen\n" + }, + "ProfileCooldownString": { + "message": "Abkühlen\n" + }, "DeviceFailedValidationWarning": { "message": "Höchstwahrscheinlich ist das Gerät eine Fälschung!" + }, + "TooHotToStartProfileWarning": { + "message": "Zu heiß um\nProfil zu starten!" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Tasten-\nsperre", "description": "Langes drücken beider Tasten im Lötmodus sperrt diese (A=aus | B=nur Boost | V=vollständig)" }, + "ProfilePhases": { + "displayText": "Profile\nPhasen", + "description": "Anzahl an Phasen im Profilmodus" + }, + "ProfilePreheatTemp": { + "displayText": "Vorheiz-\ntemperatur", + "description": "Zu Beginn des Profilmodus auf diese Temperatur vorheizen" + }, + "ProfilePreheatSpeed": { + "displayText": "Vorheiz-\nrate", + "description": "Mit dieser Geschwindigkeit vorheizen (Grad pro Sekunde)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemperatur", + "description": "Zieltemperatur zum Ende dieser Phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDauer", + "description": "Zieldauer dieser Phase (Sekunden)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemperatur", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDauer", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemperatur", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDauer", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemperatur", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDauer", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemperatur", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDauer", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Abkühl-\nrate", + "description": "Am Ende des Profilmodus mit dieser Geschwindigkeit abkühlen (Grad pro Sekunde)" + }, "MotionSensitivity": { "displayText": "Bewegungs-\nempfindlichk.", "description": "0=aus | 1=minimal | ... | 9=maximal" diff --git a/Translations/translation_EL.json b/Translations/translation_EL.json index ae0fe454..ae81203d 100644 --- a/Translations/translation_EL.json +++ b/Translations/translation_EL.json @@ -60,8 +60,17 @@ "OffString": { "message": "Απ." }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Η συσκευή σας ίσως να μην είναι αυθεντική!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Κλείδωμα\nπλήκτρων", "description": "Κατά την κόλληση, κρατήστε και τα δύο πλήκτρα για κλείδωμα (A=απενεργοποίηση | B=μόνο λειτ. boost | Π=πλήρες κλείδωμα)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Ευαισθησία\nκίνησης", "description": "0=off | 1=λιγότερο ευαίσθητο | ... | 9=περισσότερο ευαίσθητο" diff --git a/Translations/translation_EN.json b/Translations/translation_EN.json index b071d01d..2c044e33 100644 --- a/Translations/translation_EN.json +++ b/Translations/translation_EN.json @@ -60,8 +60,17 @@ "OffString": { "message": "Off" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Allow locking\nbuttons", "description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Motion\nsensitivity", "description": "0=off | 1=least sensitive | ... | 9=most sensitive" diff --git a/Translations/translation_ES.json b/Translations/translation_ES.json index 81f00026..575ddf1a 100644 --- a/Translations/translation_ES.json +++ b/Translations/translation_ES.json @@ -60,8 +60,17 @@ "OffString": { "message": "No" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "¡Lo más probable es que su dispositivo sea una falsificación!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Permitir botones\nbloqueo", "description": "Mientras suelda, mantenga pulsados ambos botones para alternar su bloqueo (D=desactivar | B=sólo modo boost | F=bloqueo total)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Detección de\nmovimiento", "description": "Tiempo de reacción al agarrar (0=no | 1=menos sensible | ... | 9=más sensible)" diff --git a/Translations/translation_FI.json b/Translations/translation_FI.json index 751ff7c7..9bb4e90c 100644 --- a/Translations/translation_FI.json +++ b/Translations/translation_FI.json @@ -60,8 +60,17 @@ "OffString": { "message": "Off" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Salli nappien\nlukitus", "description": "Kolvatessa paina molempia näppäimiä lukitaksesi ne (P=pois | V=vain tehostus | K=kaikki)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Liikkeen\nherkkyys", "description": "0=pois päältä | 1=vähäinen herkkyys | ... | 9=suurin herkkyys" diff --git a/Translations/translation_FR.json b/Translations/translation_FR.json index 28059388..4aca77b0 100644 --- a/Translations/translation_FR.json +++ b/Translations/translation_FR.json @@ -60,8 +60,17 @@ "OffString": { "message": "Off" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Votre appareil semble être une contrefaçon !" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Verrouiller\nles boutons", "description": "Pendant la soudure, appuyer sur les deux boutons pour les verrouiller (D=désactivé | B=boost seulement | V=verr. total)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Sensibilité\nau mouvement", "description": "0=désactivé | 1=peu sensible | ... | 9=très sensible" diff --git a/Translations/translation_HR.json b/Translations/translation_HR.json index b1e55542..093e66f7 100644 --- a/Translations/translation_HR.json +++ b/Translations/translation_HR.json @@ -60,8 +60,17 @@ "OffString": { "message": "Off" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Vaš uređaj je najvjerojatnije krivotvoren!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Zaključavanje\ntipki", "description": "Tokom lemljenja, držite obje tipke kako biste ih zaključali ili otključali (O=otključano | B=zaključan boost | Z=zaključano sve)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Osjetljivost\npokreta", "description": "Osjetljivost prepoznavanja pokreta. (0=ugašeno | 1=najmanje osjetljivo | ... | 9=najosjetljivije)" diff --git a/Translations/translation_HU.json b/Translations/translation_HU.json index db925956..449a28c3 100644 --- a/Translations/translation_HU.json +++ b/Translations/translation_HU.json @@ -60,8 +60,17 @@ "OffString": { "message": "Ki" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Az eszköz valószínűleg nem eredeti!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Lezárás\nengedélyezés", "description": "Forrasztás közben mindkét gombot hosszan lenyomva lezárja a kezelést (K=ki | B=csak \"boost\" módban | T=teljes lezárás)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Mozgás\nérzékenység", "description": "Mozgás érzékenység beállítása (0=kikapcsolva | 1=legkevésbé érzékeny | ... | 9=legérzékenyebb)" diff --git a/Translations/translation_IT.json b/Translations/translation_IT.json index 209f6a3b..672061d7 100644 --- a/Translations/translation_IT.json +++ b/Translations/translation_IT.json @@ -60,8 +60,17 @@ "OffString": { "message": "OFF" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "È probabile che questo dispositivo sia contraffatto!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Blocco\ntasti", "description": "Blocca i tasti durante la modalità Saldatura; tieni premuto entrambi per bloccare o sbloccare [D: disattiva; T: consenti Turbo; C: blocco completo]" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Sensibilità\nal movimento", "description": "Imposta la sensibilità al movimento per uscire dalla modalità Riposo [0: nessuna; 1: minima; 9: massima]" diff --git a/Translations/translation_JA_JP.json b/Translations/translation_JA_JP.json index aa7f2a5f..74a3cd0c 100755 --- a/Translations/translation_JA_JP.json +++ b/Translations/translation_JA_JP.json @@ -60,8 +60,17 @@ "OffString": { "message": "オフ" }, + "ProfilePreheatString": { + "message": "Preheat" + }, + "ProfileCooldownString": { + "message": "Cooldown" + }, "DeviceFailedValidationWarning": { "message": "このデバイスはおそらく偽造品です" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to start profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "ボタンロック", "description": "半田付けモード時に両方のボタンを長押しし、ボタンロックする <×=オフ | ブ=ブーストのみ許可 | 全=すべてをロック>" }, + "ProfilePhases": { + "displayText": "Profile Phases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat Temp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat Speed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1 Temp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1 Duration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2 Temp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2 Duration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3 Temp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3 Duration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4 Temp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4 Duration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5 Temp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5 Duration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown Speed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "動きの感度", "description": "0=オフ | 1=最低感度 | ... | 9=最高感度" diff --git a/Translations/translation_LT.json b/Translations/translation_LT.json index 1eb71ace..96387be6 100644 --- a/Translations/translation_LT.json +++ b/Translations/translation_LT.json @@ -60,8 +60,17 @@ "OffString": { "message": "Išj" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Mygtukų\nužraktas", "description": "Lituodami, ilgai paspauskite abu mygtukus, kad juos užrakintumėte (I=Išjungta | T=leidžiamas tik Turbo režimas | V=Visiškas užrakinimas)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Judesio\njautrumas", "description": "Judesio jautrumas (0=Išjungta | 1=Mažiausias | ... | 9=Didžiausias)" diff --git a/Translations/translation_NB.json b/Translations/translation_NB.json index b4718137..f716171f 100644 --- a/Translations/translation_NB.json +++ b/Translations/translation_NB.json @@ -60,8 +60,17 @@ "OffString": { "message": "Av" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Enheten din er sannsynligvis en forfalskning!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Tillat å låse\nknapper", "description": "Mens du lodder, hold nede begge knapper for å bytte mellom låsemodus (D=deaktiver | B=kun boost | F=full lås)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "BSensr\n", "description": "Bevegelsesfølsomhet (0=Inaktiv | 1=Minst følsom | ... | 9=Mest følsom)" diff --git a/Translations/translation_NL.json b/Translations/translation_NL.json index 02a3c1f1..4a1d2d56 100644 --- a/Translations/translation_NL.json +++ b/Translations/translation_NL.json @@ -60,8 +60,17 @@ "OffString": { "message": "Uit" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Jouw toestel is wellicht een namaak-versie!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Knopblokkering\ninschakelen", "description": "Tijdens solderen lang op beide knoppen drukken blokkeert de knoppen (U=Uit | B=Alleen boost mode | V=Volledig blokkeren)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Bewegings-\ngevoeligheid", "description": "Bewegingsgevoeligheid (0=uit | 1=minst gevoelig | ... | 9=meest gevoelig)" diff --git a/Translations/translation_NL_BE.json b/Translations/translation_NL_BE.json index 9f7f82c6..9d841449 100644 --- a/Translations/translation_NL_BE.json +++ b/Translations/translation_NL_BE.json @@ -60,8 +60,17 @@ "OffString": { "message": "Uit" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Allow locking\nbuttons", "description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Bewegings-\ngevoeligheid", "description": "Bewegingsgevoeligheid (0=uit | 1=minst gevoelig | ... | 9=meest gevoelig)" diff --git a/Translations/translation_PL.json b/Translations/translation_PL.json index 9526f8b5..604e8e29 100644 --- a/Translations/translation_PL.json +++ b/Translations/translation_PL.json @@ -60,8 +60,17 @@ "OffString": { "message": "Wył" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Twoje urządzenie jest najprawdopodobniej podróbką!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Blokada\nprzycisków", "description": "W trybie lutowania, wciśnij oba przyciski aby je zablokować (O=Wyłączona | B=tylko Boost | P=pełna blokada)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Czułość\nwykr. ruchu", "description": "Czułość wykrywania ruchu (0: Wyłączona | 1: Minimalna | ... | 9: Maksymalna)" diff --git a/Translations/translation_PT.json b/Translations/translation_PT.json index 883a9677..47be541a 100644 --- a/Translations/translation_PT.json +++ b/Translations/translation_PT.json @@ -60,8 +60,17 @@ "OffString": { "message": "Off" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Seu dispositivo provavelmente é falsificado!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Permitir bloquear\nbutões", "description": "Durante a solda primir os dois butões para alternar entre (D=disativas | B=boost mode | F=bloqueio total)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Sensibilidade\nmovimento", "description": "Sensibilidade ao movimento (0=Desligado | 1=Menor | ... | 9=Maior)" diff --git a/Translations/translation_RO.json b/Translations/translation_RO.json index eff6ac37..b40e8d16 100644 --- a/Translations/translation_RO.json +++ b/Translations/translation_RO.json @@ -60,8 +60,17 @@ "OffString": { "message": "Nu" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Dispozitivul dvs. este cel mai probabil un fals!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Blocare\nbutoane", "description": "Când lipiţi, apăsaţi lung ambele butoane, pentru a le bloca (D=dezactivare | B=numai \"modul boost\" | F=blocare completă)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Sensibilitate\nla miscare", "description": "Sensibilitate senzor miscare (0=oprit | 1=puţin sensibil | ... | 9=cel mai sensibil)" diff --git a/Translations/translation_RU.json b/Translations/translation_RU.json index fe52dc9a..2488aaef 100644 --- a/Translations/translation_RU.json +++ b/Translations/translation_RU.json @@ -60,8 +60,17 @@ "OffString": { "message": "Вык" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Скорее всего, это устройство подделка!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Разрешить\nблок. кнопок", "description": "При работе длинное нажатие обеих кнопок блокирует их (О=Отключено | Т=Только турбо | П=Полная блокировка)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Чувствительн.\nакселерометра", "description": "Чувствительность акселерометра (0=Выкл. | 1=мин. | ... | 9=макс.)" diff --git a/Translations/translation_SK.json b/Translations/translation_SK.json index 1642a2fc..b0b550ad 100644 --- a/Translations/translation_SK.json +++ b/Translations/translation_SK.json @@ -60,8 +60,17 @@ "OffString": { "message": "Vyp" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Vaše zariadenie je pravdepodobne falzifikát!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Povoliť zámok\ntlačidiel", "description": "Zamknutie tlačidiel - dlhé stlačenie oboch naraz počas spájkovania (Z=Zakázať | B=Okrem boost | P=Plné zamknutie)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Citlivosť\npohybu", "description": "Citlivosť detekcie pohybu (0=Vyp | 1=Min | ... | 9=Max)" diff --git a/Translations/translation_SL.json b/Translations/translation_SL.json index 5e775923..5e7d2d6d 100644 --- a/Translations/translation_SL.json +++ b/Translations/translation_SL.json @@ -60,8 +60,17 @@ "OffString": { "message": "Off" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Omogoči\nzaklep gumbov", "description": "Za zaklep med spajkanjem drži oba gumba (O=onemogoči | L=le pospešeno | P=polno)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Občutljivost\npremikanja", "description": "0=izklopljeno | 1=najmanjša | ... | 9=največja" diff --git a/Translations/translation_SR_CYRL.json b/Translations/translation_SR_CYRL.json index bca7ab62..35f85793 100644 --- a/Translations/translation_SR_CYRL.json +++ b/Translations/translation_SR_CYRL.json @@ -60,8 +60,17 @@ "OffString": { "message": "Иск" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Allow locking\nbuttons", "description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Осетљивост\nна покрет", "description": "Осетљивост сензора покрета. (0=искључено | 1=најмање осетљиво | ... | 9=најосетљивије)" diff --git a/Translations/translation_SR_LATN.json b/Translations/translation_SR_LATN.json index 83774e18..6906b7be 100644 --- a/Translations/translation_SR_LATN.json +++ b/Translations/translation_SR_LATN.json @@ -60,8 +60,17 @@ "OffString": { "message": "Isk" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Allow locking\nbuttons", "description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Osetljivost\nna pokret", "description": "Osetljivost senzora pokreta. (0=isključeno | 1=najmanje osetljivo | ... | 9=najosetljivije)" diff --git a/Translations/translation_SV.json b/Translations/translation_SV.json index 075bcd30..58d6f6d8 100644 --- a/Translations/translation_SV.json +++ b/Translations/translation_SV.json @@ -60,8 +60,17 @@ "OffString": { "message": "Av" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Tillåt lås\nvia knappar", "description": "Vid lödning, håll nere bägge knappar för att slå på lås (A=Av | T=Bara turbo | F=Fullt lås)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Rörelse-\nkänslighet", "description": "Rörelsekänslighet (0=Av | 1=minst känslig | ... | 9=mest känslig)" diff --git a/Translations/translation_TR.json b/Translations/translation_TR.json index e22aa7e5..3a22cd19 100644 --- a/Translations/translation_TR.json +++ b/Translations/translation_TR.json @@ -60,8 +60,17 @@ "OffString": { "message": "Kapalı" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Allow locking\nbuttons", "description": "While soldering, hold down both buttons to toggle locking them (K=Kapalı | B=boost mode only | F=full locking)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "HARHAS\n", "description": "Hareket Hassasiyeti (0=Kapalı | 1=En az duyarlı | ... | 9=En duyarlı)" diff --git a/Translations/translation_UK.json b/Translations/translation_UK.json index 873c3f16..4302a650 100644 --- a/Translations/translation_UK.json +++ b/Translations/translation_UK.json @@ -60,8 +60,17 @@ "OffString": { "message": "Вимк" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Вірогідно ваш пристрій підробний!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Дозволити\nблок. кнопок", "description": "Під час пайки тривале натискання обох кнопок заблокує їх (В=Вимк | Т=Тільки турбо | П=Повне)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Чутливість\nсенсору руху", "description": "Акселерометр (0=Вимк. | 1=мін. чутливості | ... | 9=макс. чутливості)" diff --git a/Translations/translation_VI.json b/Translations/translation_VI.json index e4dbeb3d..10c36e0b 100644 --- a/Translations/translation_VI.json +++ b/Translations/translation_VI.json @@ -60,8 +60,17 @@ "OffString": { "message": "Tat" }, + "ProfilePreheatString": { + "message": "Preheat\n" + }, + "ProfileCooldownString": { + "message": "Cooldown\n" + }, "DeviceFailedValidationWarning": { "message": "Your device is most likely a counterfeit!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to\nstart profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "Cho phép khóa\ncác nút", "description": "Trong khi hàn, giu ca 2 nút đe khóa(D=tat | B=chi che đo tăng cuong | F=khóa hoàn toàn)" }, + "ProfilePhases": { + "displayText": "Profile\nPhases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat\nTemp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat\nSpeed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1\nTemp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1\nDuration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2\nTemp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2\nDuration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3\nTemp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3\nDuration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4\nTemp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4\nDuration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5\nTemp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5\nDuration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown\nSpeed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "Cam bien\ncu đong", "description": "- 0=tat | 1=đo nhay thap nhat| ... | 9=đo nhay cao nhat" diff --git a/Translations/translation_YUE_HK.json b/Translations/translation_YUE_HK.json index 069671b4..745e6801 100644 --- a/Translations/translation_YUE_HK.json +++ b/Translations/translation_YUE_HK.json @@ -60,8 +60,17 @@ "OffString": { "message": "關" }, + "ProfilePreheatString": { + "message": "Preheat" + }, + "ProfileCooldownString": { + "message": "Cooldown" + }, "DeviceFailedValidationWarning": { "message": "依支焫雞好有可能係冒牌貨!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to start profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "撳掣鎖定", "description": "喺焊接模式時,同時長撳兩粒掣啓用撳掣鎖定 <無=停用 | 增=淨係容許增熱模式 | 全=鎖定全部>" }, + "ProfilePhases": { + "displayText": "Profile Phases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat Temp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat Speed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1 Temp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1 Duration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2 Temp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2 Duration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3 Temp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3 Duration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4 Temp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4 Duration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5 Temp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5 Duration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown Speed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "動作敏感度", "description": "0=停用 | 1=最低敏感度 | ... | 9=最高敏感度" diff --git a/Translations/translation_ZH_CN.json b/Translations/translation_ZH_CN.json index 5ef18c92..de08f696 100644 --- a/Translations/translation_ZH_CN.json +++ b/Translations/translation_ZH_CN.json @@ -60,8 +60,17 @@ "OffString": { "message": "关" }, + "ProfilePreheatString": { + "message": "Preheat" + }, + "ProfileCooldownString": { + "message": "Cooldown" + }, "DeviceFailedValidationWarning": { "message": "这支电烙铁很有可能是冒牌货!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to start profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "按键锁定", "description": "焊接模式时,同时长按两个按键启用按键锁定 <无=禁用 | 增=只容许增热模式 | 全=完全锁定>" }, + "ProfilePhases": { + "displayText": "Profile Phases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat Temp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat Speed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1 Temp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1 Duration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2 Temp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2 Duration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3 Temp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3 Duration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4 Temp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4 Duration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5 Temp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5 Duration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown Speed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "动作灵敏度", "description": "0=禁用 | 1=最低灵敏度 | ... | 9=最高灵敏度" diff --git a/Translations/translation_ZH_TW.json b/Translations/translation_ZH_TW.json index 0be42f53..1094e3aa 100644 --- a/Translations/translation_ZH_TW.json +++ b/Translations/translation_ZH_TW.json @@ -60,8 +60,17 @@ "OffString": { "message": "關" }, + "ProfilePreheatString": { + "message": "Preheat" + }, + "ProfileCooldownString": { + "message": "Cooldown" + }, "DeviceFailedValidationWarning": { "message": "這支電烙鐵很有可能是冒牌貨!" + }, + "TooHotToStartProfileWarning": { + "message": "Too hot to start profile" } }, "characters": { @@ -143,6 +152,62 @@ "displayText": "按鍵鎖定", "description": "於焊接模式時,同時長按兩個按鍵啟用按鍵鎖定 <無=停用 | 增=只容許增熱模式 | 全=鎖定全部>" }, + "ProfilePhases": { + "displayText": "Profile Phases", + "description": "Number of phases in profile mode" + }, + "ProfilePreheatTemp": { + "displayText": "Preheat Temp", + "description": "Preheat to this temperature at the start of profile mode" + }, + "ProfilePreheatSpeed": { + "displayText": "Preheat Speed", + "description": "Preheat at this rate (degrees per second)" + }, + "ProfilePhase1Temp": { + "displayText": "Phase 1 Temp", + "description": "Target temperature for the end of this phase" + }, + "ProfilePhase1Duration": { + "displayText": "Phase 1 Duration", + "description": "Target duration of this phase (seconds)" + }, + "ProfilePhase2Temp": { + "displayText": "Phase 2 Temp", + "description": "" + }, + "ProfilePhase2Duration": { + "displayText": "Phase 2 Duration", + "description": "" + }, + "ProfilePhase3Temp": { + "displayText": "Phase 3 Temp", + "description": "" + }, + "ProfilePhase3Duration": { + "displayText": "Phase 3 Duration", + "description": "" + }, + "ProfilePhase4Temp": { + "displayText": "Phase 4 Temp", + "description": "" + }, + "ProfilePhase4Duration": { + "displayText": "Phase 4 Duration", + "description": "" + }, + "ProfilePhase5Temp": { + "displayText": "Phase 5 Temp", + "description": "" + }, + "ProfilePhase5Duration": { + "displayText": "Phase 5 Duration", + "description": "" + }, + "ProfileCooldownSpeed": { + "displayText": "Cooldown Speed", + "description": "Cooldown at this rate at the end of profile mode (degrees per second)" + }, "MotionSensitivity": { "displayText": "動作敏感度", "description": "0=停用 | 1=最低敏感度 | ... | 9=最高敏感度" diff --git a/Translations/translations_definitions.json b/Translations/translations_definitions.json index 9548b7df..96d237b7 100644 --- a/Translations/translations_definitions.json +++ b/Translations/translations_definitions.json @@ -17,6 +17,7 @@ }, { "id": "NoPowerDeliveryMessage", + "include": ["POW_PD"], "description": "The IC required for USB-PD could not be communicated with. This is an error warning that USB-PD WILL NOT FUNCTION. Generally indicative of either a hardware or software issues." }, { @@ -49,32 +50,50 @@ { "id": "UVLOWarningString", "maxLen": 8, + "include": ["POW_DC"], "description": "Warning text shown when the unit turns off due to undervoltage in simple mode." }, { "id": "UndervoltageString", "maxLen": 15, + "include": ["POW_DC"], "description": "Warning text shown when the unit turns off due to undervoltage in advanced mode." }, { "id": "InputVoltageString", "maxLen": 11, "note": "Preferably end with a space", + "include": ["POW_DC"], "description": "Prefix text for 'Input Voltage' shown before showing the input voltage reading." }, + { + "id": "ProfilePreheatString", + "maxLen": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Shown in profile mode while preheating" + }, + { + "id": "ProfileCooldownString", + "maxLen": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Shown in profile mode while cooling down" + }, { "id": "SleepingSimpleString", "maxLen": 4, + "exclude": ["NO_SLEEP_MODE"], "description": "The text shown to indicate the unit is in sleep mode when the advanced view is NOT on." }, { "id": "SleepingAdvancedString", "maxLen": 15, + "exclude": ["NO_SLEEP_MODE"], "description": "The text shown to indicate the unit is in sleep mode when the advanced view is turned on." }, { "id": "SleepingTipAdvancedString", "maxLen": 6, + "exclude": ["NO_SLEEP_MODE"], "description": "The prefix text shown before tip temperature when the unit is sleeping with advanced view on." }, { @@ -86,6 +105,12 @@ "id": "DeviceFailedValidationWarning", "default": "Device may be\ncounterfeit", "description": "Warning shown if the device may be a clone or counterfeit unit." + }, + { + "id": "TooHotToStartProfileWarning", + "default": "Too hot to\nstart profile", + "include": ["PROFILE_SUPPORT"], + "description": "Shown when profile mode is started while the device is too hot." } ], "characters": [{ @@ -166,6 +191,7 @@ "id": "PowerMenu", "maxLen": 5, "maxLen2": 11, + "include": ["POW_DC", "POW_QC"], "description": "Menu for settings related to power. Main settings to do with the input voltage." }, { @@ -197,30 +223,35 @@ "id": "DCInCutoff", "maxLen": 5, "maxLen2": 11, + "include": ["POW_DC"], "description": "When the device is powered by a battery, this adjusts the low voltage threshold for when the unit should turn off the heater to protect the battery." }, { "id": "MinVolCell", "maxLen": 4, "maxLen2": 9, + "include": ["POW_DC"], "description": "When powered by a battery, this adjusts the minimum voltage per cell before shutdown. (This is multiplied by the cell count.)" }, { "id": "QCMaxVoltage", "maxLen": 8, "maxLen2": 15, + "include": ["POW_QC"], "description": "This adjusts the maximum voltage the QC negotiation will adjust to. Does NOT affect USB-PD. Should be set safely based on the current rating of your power supply." }, { "id": "PDNegTimeout", "maxLen": 8, "maxLen2": 15, + "include": ["POW_PD"], "description": "How long until firmware stops trying to negotiate for USB-PD and tries QC instead. Longer times may help dodgy / old PD adapters, faster times move onto PD quickly. Units of 100ms. Recommended to keep small values." }, { "id": "PDVpdo", "maxLen": 7, "maxLen2": 15, + "include": ["POW_PD"], "description": "Enabled PPS & EPR modes." }, { @@ -253,6 +284,104 @@ "maxLen2": 13, "description": "If locking the buttons against accidental presses is enabled." }, + { + "id": "ProfilePhases", + "maxLen": 6, + "maxLen2": 13, + "include": ["PROFILE_SUPPORT"], + "description": "set the number of phases for profile mode." + }, + { + "id": "ProfilePreheatTemp", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Preheat to this temperature at the start of profile mode." + }, + { + "id": "ProfilePreheatSpeed", + "maxLen": 5, + "maxLen2": 11, + "include": ["PROFILE_SUPPORT"], + "description": "How fast the temperature is allowed to rise during the preheat phase at the start of profile mode." + }, + { + "id": "ProfilePhase1Temp", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Target temperature for the end of phase 1 of profile mode." + }, + { + "id": "ProfilePhase1Duration", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Duration of phase 1 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature." + }, + { + "id": "ProfilePhase2Temp", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Target temperature for the end of phase 2 of profile mode." + }, + { + "id": "ProfilePhase2Duration", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Duration of phase 2 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature." + }, + { + "id": "ProfilePhase3Temp", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Target temperature for the end of phase 3 of profile mode." + }, + { + "id": "ProfilePhase3Duration", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Duration of phase 3 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature." + }, + { + "id": "ProfilePhase4Temp", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Target temperature for the end of phase 5 of profile mode." + }, + { + "id": "ProfilePhase4Duration", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Duration of phase 5 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature." + }, + { + "id": "ProfilePhase5Temp", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Target temperature for the end of phase 5 of profile mode." + }, + { + "id": "ProfilePhase5Duration", + "maxLen": 4, + "maxLen2": 9, + "include": ["PROFILE_SUPPORT"], + "description": "Duration of phase 5 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature." + }, + { + "id": "ProfileCooldownSpeed", + "maxLen": 5, + "maxLen2": 11, + "include": ["PROFILE_SUPPORT"], + "description": "How fast the temperature is allowed to drop during the cooldown phase at the end of profile mode." + }, { "id": "MotionSensitivity", "maxLen": 6, @@ -263,12 +392,14 @@ "id": "SleepTemperature", "maxLen": 4, "maxLen2": 9, + "exclude": ["NO_SLEEP_MODE"], "description": "Temperature the device will drop down to while asleep. Typically around halfway between off and soldering temperature." }, { "id": "SleepTimeout", "maxLen": 4, "maxLen2": 9, + "exclude": ["NO_SLEEP_MODE"], "description": "How long of a period without movement / button-pressing is required before the device drops down to the sleep temperature." }, { @@ -281,6 +412,7 @@ "id": "HallEffSensitivity", "maxLen": 6, "maxLen2": 13, + "include": ["HALL_SENSOR"], "description": "If the unit has a hall effect sensor (Pinecil), this adjusts how sensitive it is at detecting a magnet to put the device into sleep mode." }, { @@ -293,6 +425,7 @@ "id": "DisplayRotation", "maxLen": 6, "maxLen2": 13, + "exclude": ["NO_DISPLAY_ROTATE"], "description": "If the display should rotate automatically or if it should be fixed for left- or right-handed mode." }, { @@ -359,6 +492,7 @@ "id": "BluetoothLE", "maxLen": 7, "maxLen2": 15, + "include": ["BLE_ENABLED"], "description": "Should BLE be enabled at boot time." }, { diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 diff --git a/source/Core/BSP/BSP.h b/source/Core/BSP/BSP.h index 574d98d2..732a3adc 100644 --- a/source/Core/BSP/BSP.h +++ b/source/Core/BSP/BSP.h @@ -94,6 +94,8 @@ enum StatusLED { }; void setStatusLED(const enum StatusLED state); +void setBuzzer(bool on); + // preStartChecks are run until they return 0 // By the PID, after each ADC sample comes in // For example, on the MHP30 this is used to figure out the resistance of the hotplate diff --git a/source/Core/BSP/MHP30/BSP.cpp b/source/Core/BSP/MHP30/BSP.cpp index a9e686d9..2c4b3381 100644 --- a/source/Core/BSP/MHP30/BSP.cpp +++ b/source/Core/BSP/MHP30/BSP.cpp @@ -455,8 +455,6 @@ void setStatusLED(const enum StatusLED state) { } break; case LED_HOT: ws2812.led_set_color(0, 0xFF, 0, 0); // red - // We have hit the right temp, run buzzer for a short period - buzzerEnd = xTaskGetTickCount() + TICKS_SECOND / 3; break; case LED_COOLING_STILL_HOT: ws2812.led_set_color(0, 0xFF, 0x8C, 0x00); // Orange @@ -465,11 +463,6 @@ void setStatusLED(const enum StatusLED state) { ws2812.led_update(); lastState = state; } - if (state == LED_HOT && xTaskGetTickCount() < buzzerEnd) { - setBuzzer(true); - } else { - setBuzzer(false); - } } uint64_t getDeviceID() { // diff --git a/source/Core/BSP/MHP30/configuration.h b/source/Core/BSP/MHP30/configuration.h index c3ecd127..7cb7e1bd 100644 --- a/source/Core/BSP/MHP30/configuration.h +++ b/source/Core/BSP/MHP30/configuration.h @@ -155,6 +155,8 @@ #define ACCEL_SC7 #define ACCEL_MSA +#define PROFILE_SUPPORT + #define POW_PD 1 #define TEMP_NTC #define I2C_SOFT diff --git a/source/Core/BSP/Miniware/BSP.cpp b/source/Core/BSP/Miniware/BSP.cpp index 2cc36e6e..beb83c34 100644 --- a/source/Core/BSP/Miniware/BSP.cpp +++ b/source/Core/BSP/Miniware/BSP.cpp @@ -246,6 +246,7 @@ bool isTipDisconnected() { } void setStatusLED(const enum StatusLED state) {} +void setBuzzer(bool on) {} uint8_t preStartChecks() { return 1; } uint64_t getDeviceID() { // diff --git a/source/Core/BSP/Pinecil/BSP.cpp b/source/Core/BSP/Pinecil/BSP.cpp index 5bac313d..9c918b62 100644 --- a/source/Core/BSP/Pinecil/BSP.cpp +++ b/source/Core/BSP/Pinecil/BSP.cpp @@ -87,6 +87,7 @@ bool isTipDisconnected() { } void setStatusLED(const enum StatusLED state) {} +void setBuzzer(bool on) {} uint8_t preStartChecks() { return 1; } uint64_t getDeviceID() { return dbg_id_get(); } diff --git a/source/Core/BSP/Pinecilv2/BSP.cpp b/source/Core/BSP/Pinecilv2/BSP.cpp index eb996bd8..0ca2d10c 100644 --- a/source/Core/BSP/Pinecilv2/BSP.cpp +++ b/source/Core/BSP/Pinecilv2/BSP.cpp @@ -148,6 +148,7 @@ bool isTipDisconnected() { void setStatusLED(const enum StatusLED state) { // Dont have one } +void setBuzzer(bool on) {} uint8_t lastTipResistance = 0; // default to unknown const uint8_t numTipResistanceReadings = 3; diff --git a/source/Core/Inc/Settings.h b/source/Core/Inc/Settings.h index e1be959c..de969703 100644 --- a/source/Core/Inc/Settings.h +++ b/source/Core/Inc/Settings.h @@ -53,8 +53,22 @@ enum SettingsOptions { CalibrateCJC = 36, // Toggle calibrate CJC at next boot BluetoothLE = 37, // Toggle BLE if present PDVpdo = 38, // Toggle PPS & EPR + ProfilePhases = 39, // Number of profile mode phases + ProfilePreheatTemp = 40, // Temperature to preheat to before the first phase + ProfilePreheatSpeed = 41, // Maximum allowed preheat speed in degrees per second + ProfilePhase1Temp = 42, // Temperature to target for the end of phase 1 + ProfilePhase1Duration = 43, // Target duration for phase 1 + ProfilePhase2Temp = 44, // Temperature to target for the end of phase 2 + ProfilePhase2Duration = 45, // Target duration for phase 2 + ProfilePhase3Temp = 46, // Temperature to target for the end of phase 3 + ProfilePhase3Duration = 47, // Target duration for phase 3 + ProfilePhase4Temp = 48, // Temperature to target for the end of phase 4 + ProfilePhase4Duration = 49, // Target duration for phase 4 + ProfilePhase5Temp = 50, // Temperature to target for the end of phase 5 + ProfilePhase5Duration = 51, // Target duration for phase 5 + ProfileCooldownSpeed = 52, // Maximum allowed cooldown speed in degrees per second // - SettingsOptionsLength = 39, // + SettingsOptionsLength = 53, // }; typedef enum { diff --git a/source/Core/Inc/Translation.h b/source/Core/Inc/Translation.h index abb877ed..1f1f3964 100644 --- a/source/Core/Inc/Translation.h +++ b/source/Core/Inc/Translation.h @@ -23,6 +23,8 @@ extern const char *SmallSymbolAmps; extern const char *LargeSymbolAmps; extern const char *SmallSymbolDot; extern const char *LargeSymbolDot; +extern const char *SmallSymbolSlash; +extern const char *SmallSymbolColon; extern const char *SmallSymbolDegC; extern const char *LargeSymbolDegC; extern const char *SmallSymbolDegF; @@ -61,6 +63,20 @@ enum class SettingsItemIndex : uint8_t { TempChangeShortStep, TempChangeLongStep, LockingMode, + ProfilePhases, + ProfilePreheatTemp, + ProfilePreheatSpeed, + ProfilePhase1Temp, + ProfilePhase1Duration, + ProfilePhase2Temp, + ProfilePhase2Duration, + ProfilePhase3Temp, + ProfilePhase3Duration, + ProfilePhase4Temp, + ProfilePhase4Duration, + ProfilePhase5Temp, + ProfilePhase5Duration, + ProfileCooldownSpeed, MotionSensitivity, SleepTemperature, SleepTimeout, @@ -107,12 +123,15 @@ struct TranslationIndexTable { uint16_t UVLOWarningString; uint16_t UndervoltageString; uint16_t InputVoltageString; + uint16_t ProfilePreheatString; + uint16_t ProfileCooldownString; uint16_t SleepingSimpleString; uint16_t SleepingAdvancedString; uint16_t SleepingTipAdvancedString; uint16_t OffString; uint16_t DeviceFailedValidationWarning; + uint16_t TooHotToStartProfileWarning; uint16_t SettingRightChar; uint16_t SettingLeftChar; diff --git a/source/Core/Src/Settings.cpp b/source/Core/Src/Settings.cpp index d097609a..9a06592b 100644 --- a/source/Core/Src/Settings.cpp +++ b/source/Core/Src/Settings.cpp @@ -88,6 +88,20 @@ static const SettingConstants settingsConstants[(int)SettingsOptions::SettingsOp {0, 1, 1, 0}, // CalibrateCJC {0, 1, 1, 1}, // BluetoothLE {0, 1, 1, 1}, // PDVpdo + {1, 5, 1, 4}, // ProfilePhases + {MIN_TEMP_C, MAX_TEMP_F, 5, 90}, // ProfilePreheatTemp + {1, 10, 1, 1}, // ProfilePreheatSpeed + {MIN_TEMP_C, MAX_TEMP_F, 5, 130}, // ProfilePhase1Temp + {10, 180, 5, 90}, // ProfilePhase1Duration + {MIN_TEMP_C, MAX_TEMP_F, 5, 140}, // ProfilePhase2Temp + {10, 180, 5, 30}, // ProfilePhase2Duration + {MIN_TEMP_C, MAX_TEMP_F, 5, 165}, // ProfilePhase3Temp + {10, 180, 5, 30}, // ProfilePhase3Duration + {MIN_TEMP_C, MAX_TEMP_F, 5, 140}, // ProfilePhase4Temp + {10, 180, 5, 30}, // ProfilePhase4Duration + {MIN_TEMP_C, MAX_TEMP_F, 5, 90}, // ProfilePhase5Temp + {10, 180, 5, 30}, // ProfilePhase5Duration + {1, 10, 1, 2}, // ProfileCooldownSpeed }; static_assert((sizeof(settingsConstants) / sizeof(SettingConstants)) == ((int)SettingsOptions::SettingsOptionsLength)); diff --git a/source/Core/Src/settingsGUI.cpp b/source/Core/Src/settingsGUI.cpp index e5234b08..e98cd591 100644 --- a/source/Core/Src/settingsGUI.cpp +++ b/source/Core/Src/settingsGUI.cpp @@ -52,6 +52,35 @@ static void displayDisplayRotation(void); static bool setBoostTemp(void); static void displayBoostTemp(void); + +#ifdef PROFILE_SUPPORT +static bool setProfilePreheatTemp(); +static bool setProfilePhase1Temp(); +static bool setProfilePhase2Temp(); +static bool setProfilePhase3Temp(); +static bool setProfilePhase4Temp(); +static bool setProfilePhase5Temp(); +static void displayProfilePhases(void); +static void displayProfilePreheatTemp(void); +static void displayProfilePreheatSpeed(void); +static void displayProfilePhase1Temp(void); +static void displayProfilePhase1Duration(void); +static void displayProfilePhase2Temp(void); +static void displayProfilePhase2Duration(void); +static void displayProfilePhase3Temp(void); +static void displayProfilePhase3Duration(void); +static void displayProfilePhase4Temp(void); +static void displayProfilePhase4Duration(void); +static void displayProfilePhase5Temp(void); +static void displayProfilePhase5Duration(void); +static void displayProfileCooldownSpeed(void); +static bool showProfileOptions(void); +static bool showProfilePhase2Options(void); +static bool showProfilePhase3Options(void); +static bool showProfilePhase4Options(void); +static bool showProfilePhase5Options(void); +#endif + static void displayAutomaticStartMode(void); static void displayLockingMode(void); static void displayCoolingBlinkEnabled(void); @@ -109,6 +138,22 @@ static bool enterAdvancedMenu(void); * Temp Change Short Step * Temp Change Long Step * Locking Mode + * Profile Phases + * Profile Preheat Temperature + * Profile Preheat Max Temperature Change Per Second + * Profile Phase 1 Temperature + * Profile Phase 1 Duration (s) + * Profile Phase 2 Temperature + * Profile Phase 2 Duration (s) + * Profile Phase 3 Temperature + * Profile Phase 3 Duration (s) + * Profile Phase 4 Temperature + * Profile Phase 4 Duration (s) + * Profile Phase 5 Temperature + * Profile Phase 5 Duration (s) + * Profile Phase 6 Temperature + * Profile Phase 6 Duration (s) + * Profile Cooldown Max Temperature Change Per Second * * Power Saving * Motion Sensitivity @@ -195,6 +240,22 @@ const menuitem solderingMenu[] = { * Temp Change Short Step * Temp Change Long Step * Locking Mode + * Profile Phases + * Profile Preheat Temperature + * Profile Preheat Max Temperature Change Per Second + * Profile Phase 1 Temperature + * Profile Phase 1 Duration (s) + * Profile Phase 2 Temperature + * Profile Phase 2 Duration (s) + * Profile Phase 3 Temperature + * Profile Phase 3 Duration (s) + * Profile Phase 4 Temperature + * Profile Phase 4 Duration (s) + * Profile Phase 5 Temperature + * Profile Phase 5 Duration (s) + * Profile Phase 6 Temperature + * Profile Phase 6 Duration (s) + * Profile Cooldown Max Temperature Change Per Second */ {SETTINGS_DESC(SettingsItemIndex::BoostTemperature), setBoostTemp, displayBoostTemp, nullptr, SettingsOptions::SettingsOptionsLength, SettingsItemIndex::BoostTemperature, 5}, /*Boost Temp*/ {SETTINGS_DESC(SettingsItemIndex::AutoStart), nullptr, displayAutomaticStartMode, nullptr, SettingsOptions::AutoStartMode, SettingsItemIndex::AutoStart, 7}, /*Auto start*/ @@ -203,6 +264,22 @@ const menuitem solderingMenu[] = { {SETTINGS_DESC(SettingsItemIndex::TempChangeLongStep), nullptr, displayTempChangeLongStep, nullptr, SettingsOptions::TempChangeLongStep, SettingsItemIndex::TempChangeLongStep, 6}, /*Temp change long step*/ {SETTINGS_DESC(SettingsItemIndex::LockingMode), nullptr, displayLockingMode, nullptr, SettingsOptions::LockingMode, SettingsItemIndex::LockingMode, 7}, /*Locking Mode*/ +#ifdef PROFILE_SUPPORT + {SETTINGS_DESC(SettingsItemIndex::ProfilePhases), nullptr, displayProfilePhases, nullptr, SettingsOptions::ProfilePhases, SettingsItemIndex::ProfilePhases, 7}, /*Profile Phases*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePreheatTemp), setProfilePreheatTemp, displayProfilePreheatTemp, showProfileOptions, SettingsOptions::SettingsOptionsLength, SettingsItemIndex::ProfilePreheatTemp, 5}, /*Profile Preheat Temp*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePreheatSpeed), nullptr, displayProfilePreheatSpeed, showProfileOptions, SettingsOptions::ProfilePreheatSpeed, SettingsItemIndex::ProfilePreheatSpeed, 5}, /*Profile Preheat Speed*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePhase1Temp), setProfilePhase1Temp, displayProfilePhase1Temp, showProfileOptions, SettingsOptions::SettingsOptionsLength, SettingsItemIndex::ProfilePhase1Temp, 5}, /*Phase 1 Temp*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePhase1Duration), nullptr, displayProfilePhase1Duration, showProfileOptions, SettingsOptions::ProfilePhase1Duration, SettingsItemIndex::ProfilePhase1Duration, 5}, /*Phase 1 Duration*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePhase1Temp), setProfilePhase2Temp, displayProfilePhase2Temp, showProfilePhase2Options, SettingsOptions::SettingsOptionsLength, SettingsItemIndex::ProfilePhase2Temp, 5}, /*Phase 2 Temp*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePhase1Duration), nullptr, displayProfilePhase2Duration, showProfilePhase2Options, SettingsOptions::ProfilePhase2Duration, SettingsItemIndex::ProfilePhase2Duration, 5}, /*Phase 2 Duration*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePhase1Temp), setProfilePhase3Temp, displayProfilePhase3Temp, showProfilePhase3Options, SettingsOptions::SettingsOptionsLength, SettingsItemIndex::ProfilePhase3Temp, 5}, /*Phase 3 Temp*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePhase1Duration), nullptr, displayProfilePhase3Duration, showProfilePhase3Options, SettingsOptions::ProfilePhase3Duration, SettingsItemIndex::ProfilePhase3Duration, 5}, /*Phase 3 Duration*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePhase1Temp), setProfilePhase4Temp, displayProfilePhase4Temp, showProfilePhase4Options, SettingsOptions::SettingsOptionsLength, SettingsItemIndex::ProfilePhase4Temp, 5}, /*Phase 4 Temp*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePhase1Duration), nullptr, displayProfilePhase4Duration, showProfilePhase4Options, SettingsOptions::ProfilePhase4Duration, SettingsItemIndex::ProfilePhase4Duration, 5}, /*Phase 4 Duration*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePhase1Temp), setProfilePhase5Temp, displayProfilePhase5Temp, showProfilePhase5Options, SettingsOptions::SettingsOptionsLength, SettingsItemIndex::ProfilePhase5Temp, 5}, /*Phase 5 Temp*/ + {SETTINGS_DESC(SettingsItemIndex::ProfilePhase1Duration), nullptr, displayProfilePhase5Duration, showProfilePhase5Options, SettingsOptions::ProfilePhase5Duration, SettingsItemIndex::ProfilePhase5Duration, 5}, /*Phase 5 Duration*/ + {SETTINGS_DESC(SettingsItemIndex::ProfileCooldownSpeed), nullptr, displayProfileCooldownSpeed, showProfileOptions, SettingsOptions::ProfileCooldownSpeed, SettingsItemIndex::ProfileCooldownSpeed, 5}, /*Profile Cooldown Speed*/ +#endif {0, nullptr, nullptr, nullptr, SettingsOptions::SettingsOptionsLength, SettingsItemIndex::NUM_ITEMS, 0} // end of menu marker. DO NOT REMOVE }; const menuitem PowerSavingMenu[] = { @@ -463,6 +540,59 @@ static void displayLockingMode(void) { } } +#ifdef PROFILE_SUPPORT + +static void displayProfilePhases(void) { + OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhases), 1, FontStyle::LARGE); +} + +static bool setProfileTemp(const enum SettingsOptions option) { + // If in C, 5 deg, if in F 10 deg + uint16_t temp = getSettingValue(option); + if (getSettingValue(SettingsOptions::TemperatureInF)) { + temp += 10; + if (temp > MAX_TEMP_F) + temp = MIN_TEMP_F; + setSettingValue(option, temp); + return temp == MAX_TEMP_F; + } else { + temp += 5; + if (temp > MAX_TEMP_C) + temp = MIN_TEMP_C; + setSettingValue(option, temp); + return temp == MAX_TEMP_C; + } +} + +static bool setProfilePreheatTemp(void) { return setProfileTemp(SettingsOptions::ProfilePreheatTemp); } +static bool setProfilePhase1Temp(void) { return setProfileTemp(SettingsOptions::ProfilePhase1Temp); } +static bool setProfilePhase2Temp(void) { return setProfileTemp(SettingsOptions::ProfilePhase2Temp); } +static bool setProfilePhase3Temp(void) { return setProfileTemp(SettingsOptions::ProfilePhase3Temp); } +static bool setProfilePhase4Temp(void) { return setProfileTemp(SettingsOptions::ProfilePhase4Temp); } +static bool setProfilePhase5Temp(void) { return setProfileTemp(SettingsOptions::ProfilePhase5Temp); } + +static void displayProfilePreheatTemp(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePreheatTemp), 3, FontStyle::LARGE); } +static void displayProfilePhase1Temp(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhase1Temp), 3, FontStyle::LARGE); } +static void displayProfilePhase2Temp(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhase2Temp), 3, FontStyle::LARGE); } +static void displayProfilePhase3Temp(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhase3Temp), 3, FontStyle::LARGE); } +static void displayProfilePhase4Temp(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhase4Temp), 3, FontStyle::LARGE); } +static void displayProfilePhase5Temp(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhase5Temp), 3, FontStyle::LARGE); } +static void displayProfilePreheatSpeed(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePreheatSpeed), 2, FontStyle::LARGE); } +static void displayProfileCooldownSpeed(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfileCooldownSpeed), 2, FontStyle::LARGE); } +static void displayProfilePhase1Duration(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhase1Duration), 3, FontStyle::LARGE); } +static void displayProfilePhase2Duration(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhase2Duration), 3, FontStyle::LARGE); } +static void displayProfilePhase3Duration(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhase3Duration), 3, FontStyle::LARGE); } +static void displayProfilePhase4Duration(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhase4Duration), 3, FontStyle::LARGE); } +static void displayProfilePhase5Duration(void) { OLED::printNumber(getSettingValue(SettingsOptions::ProfilePhase5Duration), 3, FontStyle::LARGE); } + +static bool showProfileOptions(void) { return getSettingValue(SettingsOptions::ProfilePhases); } +static bool showProfilePhase2Options(void) { return getSettingValue(SettingsOptions::ProfilePhases) >= 2; } +static bool showProfilePhase3Options(void) { return getSettingValue(SettingsOptions::ProfilePhases) >= 3; } +static bool showProfilePhase4Options(void) { return getSettingValue(SettingsOptions::ProfilePhases) >= 4; } +static bool showProfilePhase5Options(void) { return getSettingValue(SettingsOptions::ProfilePhases) >= 5; } + +#endif + static void displaySensitivity(void) { OLED::printNumber(getSettingValue(SettingsOptions::Sensitivity), 1, FontStyle::LARGE, false); } static bool showSleepOptions(void) { return getSettingValue(SettingsOptions::Sensitivity) > 0; } @@ -517,36 +647,38 @@ static void displayHallEffect(void) { OLED::printNumber(getSettingValue(Settings static bool showHallEffect(void) { return getHallSensorFitted(); } #endif +static void setTempF(const enum SettingsOptions option) { + uint16_t Temp = getSettingValue(option); + if (getSettingValue(SettingsOptions::TemperatureInF)) { + // Change temp to the F equiv + // C to F == F= ( (C*9) +160)/5 + Temp = ((Temp * 9) + 160) / 5; + } else { + // Change temp to the C equiv + // F->C == C = ((F-32)*5)/9 + Temp = ((Temp - 32) * 5) / 9; + } + // Rescale to be multiples of 10 + Temp = BoostTemp / 10; + Temp *= 10; + setSettingValue(option, Temp); +} + static bool setTempF(void) { - bool res = nextSettingValue(SettingsOptions::TemperatureInF); - uint16_t BoostTemp = getSettingValue(SettingsOptions::BoostTemp); - uint16_t SolderingTemp = getSettingValue(SettingsOptions::SolderingTemp); - uint16_t SleepTemp = getSettingValue(SettingsOptions::SleepTemp); - - if (getSettingValue(SettingsOptions::TemperatureInF)) { - // Change sleep, boost and soldering temps to the F equiv - // C to F == F= ( (C*9) +160)/5 - BoostTemp = ((BoostTemp * 9) + 160) / 5; - SolderingTemp = ((SolderingTemp * 9) + 160) / 5; - SleepTemp = ((SleepTemp * 9) + 160) / 5; - } else { - // Change sleep, boost and soldering temps to the C equiv - // F->C == C = ((F-32)*5)/9 - BoostTemp = ((BoostTemp - 32) * 5) / 9; - SolderingTemp = ((SolderingTemp - 32) * 5) / 9; - SleepTemp = ((SleepTemp - 32) * 5) / 9; - } - // Rescale both to be multiples of 10 - BoostTemp = BoostTemp / 10; - BoostTemp *= 10; - SolderingTemp = SolderingTemp / 10; - SolderingTemp *= 10; - SleepTemp = SleepTemp / 10; - SleepTemp *= 10; - setSettingValue(SettingsOptions::BoostTemp, BoostTemp); - setSettingValue(SettingsOptions::SolderingTemp, SolderingTemp); - setSettingValue(SettingsOptions::SleepTemp, SleepTemp); - + bool res = nextSettingValue(SettingsOptions::TemperatureInF); + setTempF(SettingsOptions::BoostTemp); + setTempF(SettingsOptions::SolderingTemp); +#ifndef NO_SLEEP_MODE + setTempF(SettingsOptions::SleepTemp); +#endif +#ifdef PROFILE_SUPPORT + setTempF(SettingsOptions::ProfilePreheatTemp); + setTempF(SettingsOptions::ProfilePhase1Temp); + setTempF(SettingsOptions::ProfilePhase2Temp); + setTempF(SettingsOptions::ProfilePhase3Temp); + setTempF(SettingsOptions::ProfilePhase4Temp); + setTempF(SettingsOptions::ProfilePhase5Temp); +#endif return res; } diff --git a/source/Core/Threads/OperatingModes/HomeScreen.cpp b/source/Core/Threads/OperatingModes/HomeScreen.cpp index 602a1859..c1ee6854 100644 --- a/source/Core/Threads/OperatingModes/HomeScreen.cpp +++ b/source/Core/Threads/OperatingModes/HomeScreen.cpp @@ -55,8 +55,15 @@ void drawHomeScreen(bool buttonLockout) { showDebugMenu(); break; case BUTTON_F_LONG: +#ifdef PROFILE_SUPPORT + if (!isTipDisconnected()) { + gui_solderingProfileMode(); // enter profile mode + buttonLockout = true; + } +#else gui_solderingTempAdjust(); saveSettings(); +#endif break; case BUTTON_F_SHORT: if (!isTipDisconnected()) { @@ -80,11 +87,6 @@ void drawHomeScreen(bool buttonLockout) { currentTempTargetDegC = 0; // ensure tip is off getInputVoltageX10(getSettingValue(SettingsOptions::VoltageDiv), 0); uint32_t tipTemp = TipThermoModel::getTipInC(); - if (tipTemp > 55) { - setStatusLED(LED_COOLING_STILL_HOT); - } else { - setStatusLED(LED_STANDBY); - } // Preemptively turn the display on. Turn it off if and only if // the tip temperature is below 50 degrees C *and* motion sleep // detection is enabled *and* there has been no activity (movement or @@ -98,6 +100,11 @@ void drawHomeScreen(bool buttonLockout) { setStatusLED(LED_OFF); } else { OLED::setDisplayState(OLED::DisplayState::ON); + if (tipTemp > 55) { + setStatusLED(LED_COOLING_STILL_HOT); + } else { + setStatusLED(LED_STANDBY); + } } // Clear the lcd buffer OLED::clearScreen(); diff --git a/source/Core/Threads/OperatingModes/OperatingModes.h b/source/Core/Threads/OperatingModes/OperatingModes.h index 06f7070e..9e9e73cd 100644 --- a/source/Core/Threads/OperatingModes/OperatingModes.h +++ b/source/Core/Threads/OperatingModes/OperatingModes.h @@ -37,6 +37,7 @@ void performCJCC(void); // Used to ca void gui_solderingTempAdjust(void); // For adjusting the setpoint temperature of the iron int gui_SolderingSleepingMode(bool stayOff, bool autoStarted); // Sleep mode void gui_solderingMode(uint8_t jumpToSleep); // Main mode for hot pointy tool +void gui_solderingProfileMode(); // Profile mode for hot likely-not-so-pointy tool void showDebugMenu(void); // Debugging values void showPDDebug(void); // Debugging menu that hows PD adaptor info void showWarnings(void); // Shows user warnings if required diff --git a/source/Core/Threads/OperatingModes/Sleep.cpp b/source/Core/Threads/OperatingModes/Sleep.cpp index 09b00b8f..f94891b7 100644 --- a/source/Core/Threads/OperatingModes/Sleep.cpp +++ b/source/Core/Threads/OperatingModes/Sleep.cpp @@ -3,6 +3,7 @@ extern OperatingMode currentMode; int gui_SolderingSleepingMode(bool stayOff, bool autoStarted) { +#ifndef NO_SLEEP_MODE // Drop to sleep temperature and display until movement or button press currentMode = OperatingMode::sleeping; @@ -66,5 +67,6 @@ int gui_SolderingSleepingMode(bool stayOff, bool autoStarted) { return 1; // we want to exit soldering mode } } +#endif return 0; } diff --git a/source/Core/Threads/OperatingModes/Soldering.cpp b/source/Core/Threads/OperatingModes/Soldering.cpp index aa0416d2..5cdd2c1f 100644 --- a/source/Core/Threads/OperatingModes/Soldering.cpp +++ b/source/Core/Threads/OperatingModes/Soldering.cpp @@ -1,7 +1,7 @@ #include "OperatingModes.h" +#include "SolderingCommon.h" -extern bool heaterThermalRunaway; extern OperatingMode currentMode; void gui_solderingMode(uint8_t jumpToSleep) { @@ -21,8 +21,11 @@ void gui_solderingMode(uint8_t jumpToSleep) { */ bool boostModeOn = false; bool buttonsLocked = false; + bool converged = false; currentMode = OperatingMode::soldering; + TickType_t buzzerEnd = 0; + if (jumpToSleep) { if (gui_SolderingSleepingMode(jumpToSleep == 2, true) == 1) { lastButtonTime = xTaskGetTickCount(); @@ -98,7 +101,6 @@ void gui_solderingMode(uint8_t jumpToSleep) { // else we update the screen information OLED::clearScreen(); - // Draw in the screen details if (getSettingValue(SettingsOptions::DetailedSoldering)) { if (OLED::getRotation()) { @@ -106,6 +108,7 @@ void gui_solderingMode(uint8_t jumpToSleep) { } else { OLED::setCursor(-1, 0); } + gui_drawTipTemp(true, FontStyle::LARGE); #ifndef NO_SLEEP_MODE @@ -128,66 +131,12 @@ void gui_solderingMode(uint8_t jumpToSleep) { OLED::print(SmallSymbolPlus, FontStyle::SMALL); } - if (OLED::getRotation()) { - OLED::setCursor(0, 0); - } else { - OLED::setCursor(67, 0); - } - // Print wattage - { - uint32_t x10Watt = x10WattHistory.average(); - if (x10Watt > 999) { // If we exceed 99.9W we drop the decimal place to keep it all fitting - OLED::print(SmallSymbolSpace, FontStyle::SMALL); - OLED::printNumber(x10WattHistory.average() / 10, 3, FontStyle::SMALL); - } else { - OLED::printNumber(x10WattHistory.average() / 10, 2, FontStyle::SMALL); - OLED::print(SmallSymbolDot, FontStyle::SMALL); - OLED::printNumber(x10WattHistory.average() % 10, 1, FontStyle::SMALL); - } - OLED::print(SmallSymbolWatts, FontStyle::SMALL); - } + detailedPowerStatus(); - if (OLED::getRotation()) { - OLED::setCursor(0, 8); - } else { - OLED::setCursor(67, 8); - } - printVoltage(); - OLED::print(SmallSymbolVolts, FontStyle::SMALL); } else { - OLED::setCursor(0, 0); - // We switch the layout direction depending on the orientation of the oled - if (OLED::getRotation()) { - // battery - gui_drawBatteryIcon(); - OLED::print(LargeSymbolSpace, FontStyle::LARGE); // Space out gap between battery <-> temp - gui_drawTipTemp(true, FontStyle::LARGE); // Draw current tip temp - - // We draw boost arrow if boosting, or else gap temp <-> heat - // indicator - if (boostModeOn) - OLED::drawSymbol(2); - else - OLED::print(LargeSymbolSpace, FontStyle::LARGE); - - // Draw heating/cooling symbols - OLED::drawHeatSymbol(X10WattsToPWM(x10WattHistory.average())); - } else { - // Draw heating/cooling symbols - OLED::drawHeatSymbol(X10WattsToPWM(x10WattHistory.average())); - // We draw boost arrow if boosting, or else gap temp <-> heat - // indicator - if (boostModeOn) - OLED::drawSymbol(2); - else - OLED::print(LargeSymbolSpace, FontStyle::LARGE); - gui_drawTipTemp(true, FontStyle::LARGE); // Draw current tip temp - - OLED::print(LargeSymbolSpace, FontStyle::LARGE); // Space out gap between battery <-> temp - - gui_drawBatteryIcon(); - } + basicSolderingStatus(boostModeOn); } + OLED::refresh(); // Update the setpoints for the temperature if (boostModeOn) { @@ -204,60 +153,31 @@ void gui_solderingMode(uint8_t jumpToSleep) { } } -#ifdef POW_DC - // Undervoltage test - if (checkForUnderVoltage()) { - lastButtonTime = xTaskGetTickCount(); + if (checkExitSoldering()) { + setBuzzer(false); return; } -#endif -#ifdef ACCEL_EXITS_ON_MOVEMENT - // If the accel works in reverse where movement will cause exiting the soldering mode - if (getSettingValue(SettingsOptions::Sensitivity)) { - if (lastMovementTime) { - if (lastMovementTime > TICKS_SECOND * 10) { - // If we have moved recently; in the last second - // Then exit soldering mode - - if (((TickType_t)(xTaskGetTickCount() - lastMovementTime)) < (TickType_t)(TICKS_SECOND)) { - currentTempTargetDegC = 0; - return; - } - } - } - } -#endif -#ifdef NO_SLEEP_MODE - // No sleep mode, but still want shutdown timeout - - if (shouldShutdown()) { - // shutdown - currentTempTargetDegC = 0; - return; // we want to exit soldering mode - } -#endif - if (shouldBeSleeping(false)) { - if (gui_SolderingSleepingMode(false, false)) { - return; // If the function returns non-0 then exit - } - } - // Update LED status + // Update status int error = currentTempTargetDegC - TipThermoModel::getTipInC(); if (error >= -10 && error <= 10) { // converged + if (!converged) { + setBuzzer(true); + buzzerEnd = xTaskGetTickCount() + TICKS_SECOND / 3; + converged = true; + } setStatusLED(LED_HOT); } else { setStatusLED(LED_HEATING); + converged = false; } - // If we have tripped thermal runaway, turn off heater and show warning - if (heaterThermalRunaway) { - currentTempTargetDegC = 0; // heater control off - warnUser(translatedString(Tr->WarningThermalRunaway), 10 * TICKS_SECOND); - heaterThermalRunaway = false; - return; + if (buzzerEnd != 0 && xTaskGetTickCount() >= buzzerEnd) { + setBuzzer(false); } + // slow down ui update rate GUIDelay(); } } + diff --git a/source/Core/Threads/OperatingModes/SolderingProfile.cpp b/source/Core/Threads/OperatingModes/SolderingProfile.cpp new file mode 100644 index 00000000..70c206a4 --- /dev/null +++ b/source/Core/Threads/OperatingModes/SolderingProfile.cpp @@ -0,0 +1,228 @@ + +#include "OperatingModes.h" +#include "SolderingCommon.h" + +extern OperatingMode currentMode; + +void gui_solderingProfileMode() { + /* + * * Soldering (gui_solderingMode) + * -> Main loop where we draw temp, and animations + * PID control + * --> Long hold back button to exit + * --> Double button to exit + */ + currentMode = OperatingMode::soldering; + + TickType_t buzzerEnd = 0; + + bool waitForRelease = true; + TickType_t phaseStartTime = xTaskGetTickCount(); + + uint16_t tipTemp = 0; + uint8_t profilePhase = 0; + + uint16_t phaseElapsedSeconds = 0; + uint16_t phaseTotalSeconds = 0; + uint16_t phaseStartTemp = 0; + uint16_t phaseEndTemp = getSettingValue(SettingsOptions::ProfilePreheatTemp); + uint16_t phaseTicksPerDegree = TICKS_SECOND / getSettingValue(SettingsOptions::ProfilePreheatSpeed); + uint16_t profileCurrentTargetTemp = 0; + + for (;;) { + ButtonState buttons = getButtonState(); + if (buttons) { + if (waitForRelease) buttons = BUTTON_NONE; + } else { + waitForRelease = false; + } + + switch (buttons) { + case BUTTON_NONE: + break; + case BUTTON_BOTH: + case BUTTON_B_LONG: + return; // exit on back long hold + case BUTTON_F_LONG: + case BUTTON_F_SHORT: + case BUTTON_B_SHORT: + // Not used yet + break; + default: + break; + } + + if (getSettingValue(SettingsOptions::TemperatureInF)) { + tipTemp = TipThermoModel::getTipInF(); + } else { + tipTemp = TipThermoModel::getTipInC(); + } + + // if start temp is unknown (preheat), we're setting it now + if (phaseStartTemp == 0) { + phaseStartTemp = tipTemp; + // if this is hotter than the preheat temperature, we should fail + if (phaseStartTemp >= 55) { + warnUser(translatedString(Tr->TooHotToStartProfileWarning), 10 * TICKS_SECOND); + return; + } + } + + phaseElapsedSeconds = (xTaskGetTickCount() - phaseStartTime) / TICKS_SECOND; + + // have we finished this phase? + if (phaseElapsedSeconds >= phaseTotalSeconds && tipTemp == phaseEndTemp) { + profilePhase++; + phaseStartTemp = phaseEndTemp; + phaseStartTime = xTaskGetTickCount(); + phaseElapsedSeconds = 0; + if (profilePhase > getSettingValue(SettingsOptions::ProfilePhases)) { + // done with all phases, lets go to cooldown + phaseTotalSeconds = 0; + phaseEndTemp = 0; + phaseTicksPerDegree = TICKS_SECOND / getSettingValue(SettingsOptions::ProfileCooldownSpeed); + } else { + // set up next phase + switch(profilePhase) { + case 1: + phaseTotalSeconds = getSettingValue(SettingsOptions::ProfilePhase1Duration); + phaseEndTemp = getSettingValue(SettingsOptions::ProfilePhase1Temp); + break; + case 2: + phaseTotalSeconds = getSettingValue(SettingsOptions::ProfilePhase2Duration); + phaseEndTemp = getSettingValue(SettingsOptions::ProfilePhase2Temp); + break; + case 3: + phaseTotalSeconds = getSettingValue(SettingsOptions::ProfilePhase3Duration); + phaseEndTemp = getSettingValue(SettingsOptions::ProfilePhase3Temp); + break; + case 4: + phaseTotalSeconds = getSettingValue(SettingsOptions::ProfilePhase4Duration); + phaseEndTemp = getSettingValue(SettingsOptions::ProfilePhase4Temp); + break; + case 5: + phaseTotalSeconds = getSettingValue(SettingsOptions::ProfilePhase5Duration); + phaseEndTemp = getSettingValue(SettingsOptions::ProfilePhase5Temp); + break; + default: + break; + } + if (phaseStartTemp < phaseEndTemp) { + phaseTicksPerDegree = (phaseTotalSeconds * TICKS_SECOND) / (phaseEndTemp - phaseStartTemp); + } else { + phaseTicksPerDegree = (phaseTotalSeconds * TICKS_SECOND) / (phaseStartTemp - phaseEndTemp); + } + } + } + + // cooldown phase done? + if (profilePhase > getSettingValue(SettingsOptions::ProfilePhases)) { + if (TipThermoModel::getTipInC() < 55) { + // we're done, let the buzzer beep too + setStatusLED(LED_STANDBY); + if (buzzerEnd == 0) { + setBuzzer(true); + buzzerEnd = xTaskGetTickCount() + TICKS_SECOND / 3; + } + } + } + + // determine current target temp + if (phaseStartTemp < phaseEndTemp) { + if (profileCurrentTargetTemp < phaseEndTemp) { + profileCurrentTargetTemp = phaseStartTemp + ((xTaskGetTickCount() - phaseStartTime) / phaseTicksPerDegree); + } + } else { + if (profileCurrentTargetTemp > phaseEndTemp) { + profileCurrentTargetTemp = phaseStartTemp - ((xTaskGetTickCount() - phaseStartTime) / phaseTicksPerDegree); + } + } + + OLED::clearScreen(); + // Draw in the screen details + if (getSettingValue(SettingsOptions::DetailedSoldering)) { + // print temperature + if (OLED::getRotation()) { + OLED::setCursor(48, 0); + } else { + OLED::setCursor(0, 0); + } + + OLED::printNumber(tipTemp, 3, FontStyle::SMALL); + OLED::print(SmallSymbolSlash, FontStyle::SMALL); + OLED::printNumber(profileCurrentTargetTemp, 3, FontStyle::SMALL); + + if (getSettingValue(SettingsOptions::TemperatureInF)) + OLED::print(SmallSymbolDegF, FontStyle::SMALL); + else + OLED::print(SmallSymbolDegC, FontStyle::SMALL); + + // print phase + if (profilePhase > 0 && profilePhase <= getSettingValue(SettingsOptions::ProfilePhases)) { + if (OLED::getRotation()) { + OLED::setCursor(36, 0); + } else { + OLED::setCursor(55, 0); + } + OLED::printNumber(profilePhase, 1, FontStyle::SMALL); + } + + // print time progress / preheat / cooldown + if (OLED::getRotation()) { + OLED::setCursor(42, 8); + } else { + OLED::setCursor(0, 8); + } + + if (profilePhase == 0) { + OLED::print(translatedString(Tr->ProfilePreheatString), FontStyle::SMALL); + } else if (profilePhase > getSettingValue(SettingsOptions::ProfilePhases)) { + OLED::print(translatedString(Tr->ProfileCooldownString), FontStyle::SMALL); + } else { + OLED::printNumber(phaseElapsedSeconds / 60, 1, FontStyle::SMALL); + OLED::print(SmallSymbolColon, FontStyle::SMALL); + OLED::printNumber(phaseElapsedSeconds % 60, 2, FontStyle::SMALL, false); + + OLED::print(SmallSymbolSlash, FontStyle::SMALL); + + // blink if we can't keep up with the time goal + if (phaseElapsedSeconds < phaseTotalSeconds+2 || (xTaskGetTickCount() / TICKS_SECOND) % 2 == 0) { + OLED::printNumber(phaseTotalSeconds / 60, 1, FontStyle::SMALL); + OLED::print(SmallSymbolColon, FontStyle::SMALL); + OLED::printNumber(phaseTotalSeconds % 60, 2, FontStyle::SMALL, false); + } + } + + detailedPowerStatus(); + + } else { + basicSolderingStatus(false); + } + + OLED::refresh(); + // Update the setpoints for the temperature + if (getSettingValue(SettingsOptions::TemperatureInF)) { + currentTempTargetDegC = TipThermoModel::convertFtoC(profileCurrentTargetTemp); + } else { + currentTempTargetDegC = profileCurrentTargetTemp; + } + + if (checkExitSoldering() || (buzzerEnd != 0 && xTaskGetTickCount() >= buzzerEnd)) { + setBuzzer(false); + return; + } + + // Update LED status + if (profilePhase == 0) { + setStatusLED(LED_HEATING); + } else if (profilePhase > getSettingValue(SettingsOptions::ProfilePhases)) { + setStatusLED(LED_COOLING_STILL_HOT); + } else { + setStatusLED(LED_HOT); + } + + // slow down ui update rate + GUIDelay(); + } +} + diff --git a/source/Core/Threads/OperatingModes/TemperatureAdjust.cpp b/source/Core/Threads/OperatingModes/TemperatureAdjust.cpp index 7f17f4e7..5c05a520 100644 --- a/source/Core/Threads/OperatingModes/TemperatureAdjust.cpp +++ b/source/Core/Threads/OperatingModes/TemperatureAdjust.cpp @@ -4,23 +4,31 @@ void gui_solderingTempAdjust(void) { currentTempTargetDegC = 0; // Turn off heater while adjusting temp TickType_t autoRepeatTimer = 0; uint8_t autoRepeatAcceleration = 0; +#ifndef PROFILE_SUPPORT bool waitForRelease = false; ButtonState buttons = getButtonState(); + if (buttons != BUTTON_NONE) { // Temp adjust entered by long-pressing F button. waitForRelease = true; } +#else + ButtonState buttons; +#endif + for (;;) { OLED::setCursor(0, 0); OLED::clearScreen(); buttons = getButtonState(); if (buttons) { + lastChange = xTaskGetTickCount(); +#ifndef PROFILE_SUPPORT if (waitForRelease) { buttons = BUTTON_NONE; } - lastChange = xTaskGetTickCount(); } else { waitForRelease = false; +#endif } int16_t delta = 0; switch (buttons) { diff --git a/source/Core/Threads/OperatingModes/utils/SolderingCommon.cpp b/source/Core/Threads/OperatingModes/utils/SolderingCommon.cpp new file mode 100644 index 00000000..0feb65d3 --- /dev/null +++ b/source/Core/Threads/OperatingModes/utils/SolderingCommon.cpp @@ -0,0 +1,123 @@ +// +// Created by laura on 24.04.23. +// + +#include "OperatingModes.h" +#include "SolderingCommon.h" + +extern bool heaterThermalRunaway; + +void detailedPowerStatus() { + if (OLED::getRotation()) { + OLED::setCursor(0, 0); + } else { + OLED::setCursor(67, 0); + } + // Print wattage + { + uint32_t x10Watt = x10WattHistory.average(); + if (x10Watt > 999) { // If we exceed 99.9W we drop the decimal place to keep it all fitting + OLED::print(SmallSymbolSpace, FontStyle::SMALL); + OLED::printNumber(x10WattHistory.average() / 10, 3, FontStyle::SMALL); + } else { + OLED::printNumber(x10WattHistory.average() / 10, 2, FontStyle::SMALL); + OLED::print(SmallSymbolDot, FontStyle::SMALL); + OLED::printNumber(x10WattHistory.average() % 10, 1, FontStyle::SMALL); + } + OLED::print(SmallSymbolWatts, FontStyle::SMALL); + } + + if (OLED::getRotation()) { + OLED::setCursor(0, 8); + } else { + OLED::setCursor(67, 8); + } + printVoltage(); + OLED::print(SmallSymbolVolts, FontStyle::SMALL); +} + +void basicSolderingStatus(bool boostModeOn) { + OLED::setCursor(0, 0); + // We switch the layout direction depending on the orientation of the oled + if (OLED::getRotation()) { + // battery + gui_drawBatteryIcon(); + OLED::print(LargeSymbolSpace, FontStyle::LARGE); // Space out gap between battery <-> temp + gui_drawTipTemp(true, FontStyle::LARGE); // Draw current tip temp + + // We draw boost arrow if boosting, or else gap temp <-> heat + // indicator + if (boostModeOn) + OLED::drawSymbol(2); + else + OLED::print(LargeSymbolSpace, FontStyle::LARGE); + + // Draw heating/cooling symbols + OLED::drawHeatSymbol(X10WattsToPWM(x10WattHistory.average())); + } else { + // Draw heating/cooling symbols + OLED::drawHeatSymbol(X10WattsToPWM(x10WattHistory.average())); + // We draw boost arrow if boosting, or else gap temp <-> heat + // indicator + if (boostModeOn) + OLED::drawSymbol(2); + else + OLED::print(LargeSymbolSpace, FontStyle::LARGE); + gui_drawTipTemp(true, FontStyle::LARGE); // Draw current tip temp + + OLED::print(LargeSymbolSpace, FontStyle::LARGE); // Space out gap between battery <-> temp + + gui_drawBatteryIcon(); + } +} + +bool checkExitSoldering(void) { +#ifdef POW_DC + // Undervoltage test + if (checkForUnderVoltage()) { + lastButtonTime = xTaskGetTickCount(); + return true; + } +#endif + +#ifdef ACCEL_EXITS_ON_MOVEMENT + // If the accel works in reverse where movement will cause exiting the soldering mode + if (getSettingValue(Sensitivity)) { + if (lastMovementTime) { + if (lastMovementTime > TICKS_SECOND * 10) { + // If we have moved recently; in the last second + // Then exit soldering mode + + if (((TickType_t)(xTaskGetTickCount() - lastMovementTime)) < (TickType_t)(TICKS_SECOND)) { + currentTempTargetDegC = 0; + return true; + } + } + } + } +#endif +#ifdef NO_SLEEP_MODE + // No sleep mode, but still want shutdown timeout + + if (shouldShutdown()) { + // shutdown + currentTempTargetDegC = 0; + return true; // we want to exit soldering mode + } +#endif + if (shouldBeSleeping(false)) { + if (gui_SolderingSleepingMode(false, false)) { + return true; // If the function returns non-0 then exit + } + } + + // If we have tripped thermal runaway, turn off heater and show warning + if (heaterThermalRunaway) { + currentTempTargetDegC = 0; // heater control off + warnUser(translatedString(Tr->WarningThermalRunaway), 10 * TICKS_SECOND); + heaterThermalRunaway = false; + return true; + } + + return false; +} \ No newline at end of file diff --git a/source/Core/Threads/OperatingModes/utils/SolderingCommon.h b/source/Core/Threads/OperatingModes/utils/SolderingCommon.h new file mode 100644 index 00000000..13443e6c --- /dev/null +++ b/source/Core/Threads/OperatingModes/utils/SolderingCommon.h @@ -0,0 +1,8 @@ +#ifndef SOLDERING_COMMON_H +#define SOLDERING_COMMON_H + +void detailedPowerStatus(); +void basicSolderingStatus(bool boostModeOn); +bool checkExitSoldering(); + +#endif //SOLDERING_COMMON_H diff --git a/source/Makefile b/source/Makefile index b6b663a3..4668d729 100644 --- a/source/Makefile +++ b/source/Makefile @@ -608,15 +608,21 @@ Core/Gen/Translation.%.cpp $(OUTPUT_DIR)/Core/Gen/translation.files/%.pickle: .. ../Translations/make_translation.py \ ../Translations/translations_definitions.json \ ../Translations/font_tables.py \ - Makefile ../Translations/wqy-bitmapsong/wenquanyi_9pt.bdf + Makefile ../Translations/wqy-bitmapsong/wenquanyi_9pt.bdf \ + Core/Gen/macros.txt @test -d Core/Gen || mkdir -p Core/Gen @test -d $(OUTPUT_DIR)/Core/Gen/translation.files || mkdir -p $(OUTPUT_DIR)/Core/Gen/translation.files @echo 'Generating translations for language $*' @python3 ../Translations/make_translation.py \ + --macros $(PWD)/Core/Gen/macros.txt \ -o $(PWD)/Core/Gen/Translation.$*.cpp \ --output-pickled $(OUTPUT_DIR)/Core/Gen/translation.files/$*.pickle \ $* +Core/Gen/macros.txt: Makefile + @test -d Core/Gen || mkdir -p Core/Gen + echo "#include " | $(CC) -dM -E $(CFLAGS) - > $(PWD)/Core/Gen/macros.txt + # # The recipes to produce compressed translation data: # @@ -636,19 +642,21 @@ $(HOST_OUTPUT_DIR)/brieflz/libbrieflz.so: Core/brieflz/brieflz.c Core/brieflz/de @echo Building host brieflz shared library $@ @$(HOST_CC) -fPIC -shared -DBLZ_DLL -DBLZ_DLL_EXPORTS -O $^ -o $@ -Core/Gen/Translation_brieflz.%.cpp: $(OUTPUT_DIR)/Core/Gen/translation.files/%.o $(OUTPUT_DIR)/Core/Gen/translation.files/%.pickle $(HOST_OUTPUT_DIR)/brieflz/libbrieflz.so +Core/Gen/Translation_brieflz.%.cpp: $(OUTPUT_DIR)/Core/Gen/translation.files/%.o $(OUTPUT_DIR)/Core/Gen/translation.files/%.pickle $(HOST_OUTPUT_DIR)/brieflz/libbrieflz.so Core/Gen/macros.txt @test -d $(@D) || mkdir -p $(@D) @echo Generating BriefLZ compressed translation for $* @OBJCOPY=$(OBJCOPY) python3 ../Translations/make_translation.py \ + --macros $(PWD)/Core/Gen/macros.txt \ -o $(PWD)/Core/Gen/Translation_brieflz.$*.cpp \ --input-pickled $(OUTPUT_DIR)/Core/Gen/translation.files/$*.pickle \ --strings-obj $(OUTPUT_DIR)/Core/Gen/translation.files/$*.o \ $* -Core/Gen/Translation_brieflz_font.%.cpp: $(OUTPUT_DIR)/Core/Gen/translation.files/%.pickle $(HOST_OUTPUT_DIR)/brieflz/libbrieflz.so +Core/Gen/Translation_brieflz_font.%.cpp: $(OUTPUT_DIR)/Core/Gen/translation.files/%.pickle $(HOST_OUTPUT_DIR)/brieflz/libbrieflz.so Core/Gen/macros.txt @test -d $(@D) || mkdir -p $(@D) @echo Generating BriefLZ compressed translation for $* @python3 ../Translations/make_translation.py \ + --macros $(PWD)/Core/Gen/macros.txt \ -o $(PWD)/Core/Gen/Translation_brieflz_font.$*.cpp \ --input-pickled $(OUTPUT_DIR)/Core/Gen/translation.files/$*.pickle \ --compress-font \ @@ -689,21 +697,24 @@ Core/Gen/Translation_multi.$(1).cpp: $(patsubst %,../Translations/translation_%. ../Translations/make_translation.py \ ../Translations/translations_definitions.json \ ../Translations/font_tables.py \ - Makefile ../Translations/wqy-bitmapsong/wenquanyi_9pt.bdf + Makefile ../Translations/wqy-bitmapsong/wenquanyi_9pt.bdf \ + Core/Gen/macros.txt @test -d Core/Gen || mkdir -p Core/Gen @test -d $(OUTPUT_DIR)/Core/Gen/translation.files || mkdir -p $(OUTPUT_DIR)/Core/Gen/translation.files @echo 'Generating translations for multi-language $(2)' @python3 ../Translations/make_translation.py \ + --macros $(PWD)/Core/Gen/macros.txt \ -o $(PWD)/Core/Gen/Translation_multi.$(1).cpp \ --output-pickled $(OUTPUT_DIR)/Core/Gen/translation.files/multi.$(1).pickle \ $(3) $(OUTPUT_DIR)/Core/Gen/translation.files/multi.$(1).pickle: Core/Gen/Translation_multi.$(1).cpp -Core/Gen/Translation_brieflz_multi.$(1).cpp: $(OUTPUT_DIR)/Core/Gen/translation.files/multi.$(1).o $(OUTPUT_DIR)/Core/Gen/translation.files/multi.$(1).pickle $(HOST_OUTPUT_DIR)/brieflz/libbrieflz.so +Core/Gen/Translation_brieflz_multi.$(1).cpp: $(OUTPUT_DIR)/Core/Gen/translation.files/multi.$(1).o $(OUTPUT_DIR)/Core/Gen/translation.files/multi.$(1).pickle $(HOST_OUTPUT_DIR)/brieflz/libbrieflz.so Core/Gen/macros.txt @test -d $$(@D) || mkdir -p $$(@D) @echo Generating BriefLZ compressed translation for multi-language $(2) @OBJCOPY=$(OBJCOPY) python3 ../Translations/make_translation.py \ + --macros $(PWD)/Core/Gen/macros.txt \ -o $(PWD)/Core/Gen/Translation_brieflz_multi.$(1).cpp \ --input-pickled $(OUTPUT_DIR)/Core/Gen/translation.files/multi.$(1).pickle \ --strings-obj $(OUTPUT_DIR)/Core/Gen/translation.files/multi.$(1).o \