Merge branch 'master' into newer-arm-gcc
This commit is contained in:
4
.github/workflows/push.yml
vendored
4
.github/workflows/push.yml
vendored
@@ -54,10 +54,10 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Setup
|
||||
run: sudo apt-get update && sudo apt-get install -y python3
|
||||
run: sudo apt-get update && sudo apt-get install -y python3 && pip3 install bdflib
|
||||
|
||||
- name: Run python tests
|
||||
run: cd Translations && chmod +x make_translation_test.py && ./make_translation_test.py
|
||||
run: cd Translations && chmod +x make_translation_test.py && ./make_translation_test.py
|
||||
|
||||
check_formatting:
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
84
Documentation/GettingStarted.md
Normal file
84
Documentation/GettingStarted.md
Normal file
@@ -0,0 +1,84 @@
|
||||
# Getting Started
|
||||
|
||||
Getting started with Iron OS on your Pinecil/TS80/TS80P/TS100.
|
||||
If your device did not come with Iron OS already installed, or if you need to update to the latest version; please see the [Flashing Guide](/Documentation/Flashing.md).
|
||||
|
||||
Once your Iron has been flashed, one first power on it _may_ warn you about the system settings being reset.
|
||||
_Do not panic_; this is 100% completely normal. This is here to note to you that they have been reset to handle the internal structure changing.
|
||||
|
||||
If you receive a warning about the accelerometer or USB-PD not being detected, please see [here](/Documentation/HardwareIssues.md).
|
||||
|
||||
## The Home screen (or idle screen)
|
||||
|
||||
This is the landing page of the firmware, from here you can choose to either go into the [settings menu](##-Settings-Menu) or go into [soldering mode](##-Soldering-Mode).
|
||||
|
||||
By default this will show a screen similar to the one below:
|
||||
|
||||

|
||||
|
||||
Note that this may be drawn mirrored depending on the orientation of your screen.
|
||||
|
||||
The soldering iron symbol on the screen will appear near the tip. This is here to indicate that pressing the button closest to the front of the soldering iron will enter soldering mode.
|
||||
|
||||
And naturally, the spanner like icon represents that pressing the button near the rear of the soldering iron will enter the settings menu.
|
||||
|
||||
In the settings, you can turn on an advanced idle screen instead. The buttons still function the same, however, the image will be swapped for a text telling you the current status of the iron with extra details.
|
||||
|
||||
Depending on how your device is being powered, at one end of the screen, the firmware will either draw text to show you the current-voltage your unit is being provided with, a battery icon (if battery mode is enabled) or a power plug icon.
|
||||
|
||||
If you see exclamation marks (!!!) where the soldering iron should be, this indicates that the firmware can't see the tip connected. This could indicate a problem with the iron or tip if there is one inserted. First, try removing and reinstalling the tip. If the issue persists please see the [hardware issues section](/Documentation/HardwareIssues.md).
|
||||
|
||||
This screen features a burn-in protection feature, where if no buttons or movement have been detected for a while it will automatically blank the screen to try and reduce burn-in if the iron is left unattended. Any movement or button press will wake the screen.
|
||||
|
||||
### Hidden Extras
|
||||
|
||||
Additionally to the two icons shown, there are two "hidden" actions that can be performed on this menu.
|
||||
|
||||
If you press and hold on to the button near the tip of the soldering iron, this will bring up 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 it will take you into the [debug menu](/Documentation/DebugMenu.md).
|
||||
|
||||
## Soldering Mode
|
||||
|
||||
When you press the button to enter into the soldering mode, the iron will instantly start to heat up the tip.
|
||||
|
||||
The firmware defaults to 320C as the set point for the soldering mode, however on this screen you can enter into the adjustment screen by pressing either button.
|
||||
|
||||
Pressing and holding the button near the tip will enter **boost** mode. This allows temporarily overriding the set temperature to a higher (or lower) value. This can be useful as a way to force the tip to a higher temperature to drive more wattage into a large joint when the thermal connection is not ideal.
|
||||
|
||||
Pressing and holding the rear button will exit soldering mode and land you back at the home screen. You can also do this by pressing both buttons at once and this will also work, this is a bit harder to do but is kept for compatibility with the Miniware firmware.
|
||||
|
||||
Pressing and holding **both** buttons at once will enter locked mode, which will prevent the buttons from doing anything. You can in the settings allow boost mode in locked mode optionally. This can be useful if you find yourself hitting the buttons and entering into the temperature adjustment screen by accident.
|
||||
|
||||
### Idle sleep
|
||||
|
||||
If the iron detects a period of time without any significant movement, it will enter into a sleep mode. This is indicated with a graphic on the screen similar to ZZzz (or text in detailed mode).
|
||||
|
||||
In this mode, the temperature of the iron will automatically reduce down to a temperature just below the melting point of the solder. This helps reduce the rate of oxidation and damage to the iron tip.
|
||||
|
||||
Simply picking up or moving the iron will wake it back up into soldering mode. You can also press any button and this will also wake the iron up.
|
||||
|
||||
The Pinecil has a footprint (unpopulated) on the PCB for a hall effect sensor (Si7210). If you fit this then iron will additionally force sleep when it detects a strong magnetic field near the tip of the plastic body. This allows attaching a strong magnet near your iron holder to ensure it always enters sleep.
|
||||
|
||||
### Idle shutdown
|
||||
|
||||
If, after entering sleep mode the iron still does not see movement for a much longer time; it will shut down and return to the home screen.
|
||||
|
||||
## Settings Menu
|
||||
|
||||
The settings menu is the most often evolving aspect of the firmware, so each option is not documented here. However, do not panic, as every menu option has a description so that you don't _need_ to come back here to figure them all out.
|
||||
|
||||
To navigate the menu, the two buttons act separately.
|
||||
The button that you pressed to enter the menu (rear) cycles down the options, and the other button (front) will change the current option.
|
||||
|
||||
To see a description of an option, just pause and wait and after a little bit, it will scroll across the screen.
|
||||
|
||||
The menu is comprised of a "main menu" of categories and then sub-items that allows you to adjust parameters.
|
||||
|
||||
You can long hold buttons to change through options faster, and there is some acceleration when holding the buttons.
|
||||
|
||||
There is a small scrollbar that will be shown along the edge of the screen to indicate how far through the current list you are.
|
||||
|
||||
Additionally, this scrollbar will blink rapidly when you are on the last item in a menu choice.
|
||||
|
||||
I highly recommend taking a few minutes to go through all of the options in the menu to get a feel for what you can change, almost every aspect of the internal system is adjustable to suit you.
|
||||
28
Documentation/HardwareIssues.md
Normal file
28
Documentation/HardwareIssues.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# Hardware Issues
|
||||
|
||||
While we would love everything to work perfectly, sometimes that just doesn't happen.
|
||||
Please do not email maintainers directly, these will generally be ignored.
|
||||
Keep issue discussions to GitHub issues or the discussions page so that the whole community can help and work together.
|
||||
|
||||
## No Accelerometer detected
|
||||
|
||||
If your iron was previously working, this could be a bug (and we are very sorry). Please check the currently open and recently closed issues to check if anyone else has run into this. You can try going back to a release on the firmware to test if this is a new issue before opening an issue.
|
||||
|
||||
If this is a new iron, also feel free to open an issue if you don't see any; a vendor _could_ have changed the model of the accelerometer on us without warning _again_. In which case, support should come shortly.
|
||||
|
||||
If your iron is new, there is a slim chance your accelerometer may be DOA and need replacement.
|
||||
|
||||
**Note this warning will only be shown the first few times until settings are reset**
|
||||
|
||||
## No USB-PD IC detected
|
||||
|
||||
Generally, this means either something went very awry in the firmware or the chip is not answering as would normally be expected. Try rolling back to an earlier release to confirm if the issue still persists then the device may need repair. If you have some form of seller protection/support you most likely want to reach out to this to be safe. If you don't, you can always attempt to replace the IC yourself. As of writing both the TS80P and Pinecil use the FUSB302.
|
||||
|
||||
**Note this warning will only be shown the first few times until settings are reset**
|
||||
|
||||
## No tip detected
|
||||
|
||||
if your tip is not being detected, the most likely cause is that the heater element has been damaged from over-temperature, being dropped or bad luck. As the heater coil is part of the temperature measurement circuit neither will work if it's damaged.
|
||||
|
||||
The best way to see if this is the case is to measure the resistance across the contacts to the tip using a multimeter.
|
||||
you are expecting to see measurements in the range of 4-10 ohms. Anything higher than 10 ohms is _generally_ an issue.
|
||||
@@ -1,176 +1,188 @@
|
||||
# Version Changes
|
||||
|
||||
## V2.14
|
||||
|
||||
- Fixing auto rotation bug in the LIS accelerometer in the TS80/TS80P
|
||||
- Adds support for two new accelerometers
|
||||
-- SC7A20 (Future Pinecil batch) #786
|
||||
-- MSA301 (Newer TS80P) #761
|
||||
- Add warnings if accelerometer or USB-PD IC's are not detected #752
|
||||
-- Only shows for first few boots, to help catch unsupported models
|
||||
- Fixed cooling down blink to be sane speed #769
|
||||
- Cleanup of threads and slightly faster power negotiation #790
|
||||
|
||||
- Updates to flashing scripts #775
|
||||
- Documentation updates all over the place (and the wiki was given a cleanup)|
|
||||
- Updates to makefile #792 #787
|
||||
- Cleanup the folder name of the source code #800
|
||||
- clang-format spec setup #801
|
||||
|
||||
## V2.13
|
||||
|
||||
* First _official_ Pinecil release
|
||||
* All of the wire for Pinecil releases added
|
||||
* Updated Translations
|
||||
* Delay accelerometer to help with entering sleep on startup
|
||||
* Dual speed PWM to help with power limit control
|
||||
* Improve heat up time
|
||||
* Adds locking mode
|
||||
* Improved docs all over the place
|
||||
* Repo rename occured TS100 -> IronOS
|
||||
* Hall effect sensor support added (not fitted in Pinecil but optional)
|
||||
* QC 20V support for Pinecil
|
||||
* CI upgrades for faster builds
|
||||
* Fixed bug with accelerometer model on Pinecil
|
||||
* Rework of all of the temperature curves for better accuracy
|
||||
|
||||
|
||||
- First _official_ Pinecil release
|
||||
- All of the wire for Pinecil releases added
|
||||
- Updated Translations
|
||||
- Delay accelerometer to help with entering sleep on startup
|
||||
- Dual speed PWM to help with power limit control
|
||||
- Improve heat up time
|
||||
- Adds locking mode
|
||||
- Improved docs all over the place
|
||||
- Repo rename occured TS100 -> IronOS
|
||||
- Hall effect sensor support added (not fitted in Pinecil but optional)
|
||||
- QC 20V support for Pinecil
|
||||
- CI upgrades for faster builds
|
||||
- Fixed bug with accelerometer model on Pinecil
|
||||
- Rework of all of the temperature curves for better accuracy
|
||||
|
||||
## V2.12
|
||||
|
||||
* Only released as pre-release
|
||||
* [TS80P] Improvements to the PD negotiation to handle a few more adapters cleanly
|
||||
* Pause on the last item in a list
|
||||
* Clean up the menu (removed both enables and settings, so that you can turn things off easier)
|
||||
* Removing the very old single line menu style.
|
||||
|
||||
- Only released as pre-release
|
||||
- [TS80P] Improvements to the PD negotiation to handle a few more adapters cleanly
|
||||
- Pause on the last item in a list
|
||||
- Clean up the menu (removed both enables and settings, so that you can turn things off easier)
|
||||
- Removing the very old single line menu style.
|
||||
|
||||
## V2.11
|
||||
|
||||
* First TS80P support
|
||||
* Added in a USB-PD driver stack for the FUSB302
|
||||
* Fixed some graphical glitches
|
||||
- First TS80P support
|
||||
- Added in a USB-PD driver stack for the FUSB302
|
||||
- Fixed some graphical glitches
|
||||
|
||||
## V2.10
|
||||
|
||||
* GUI polish (animations and scroll bars)
|
||||
* Power pulse to keep power supplies alive
|
||||
* Adjustable tip response gain
|
||||
- GUI polish (animations and scroll bars)
|
||||
- Power pulse to keep power supplies alive
|
||||
- Adjustable tip response gain
|
||||
|
||||
## V2.09
|
||||
|
||||
* Adjustable steps in temperature adjustment
|
||||
* Git hash now in build string
|
||||
* Adjustable language to set if US units are available or not
|
||||
* Some minor QC3 improvements
|
||||
- Adjustable steps in temperature adjustment
|
||||
- Git hash now in build string
|
||||
- Adjustable language to set if US units are available or not
|
||||
- Some minor QC3 improvements
|
||||
|
||||
## V2.08
|
||||
|
||||
* Fixes auto start in sleep mode
|
||||
* Power limiters
|
||||
- Fixes auto start in sleep mode
|
||||
- Power limiters
|
||||
|
||||
## V2.07
|
||||
|
||||
* QC fixes
|
||||
* Cosmetic fixes for leading 0's
|
||||
- QC fixes
|
||||
- Cosmetic fixes for leading 0's
|
||||
|
||||
## V2.06
|
||||
|
||||
* Warning on settings reset
|
||||
* Temp temp re-write
|
||||
* Display calibration offset
|
||||
* Hide some leading 0's
|
||||
* Menu timeouts
|
||||
- Warning on settings reset
|
||||
- Temp temp re-write
|
||||
- Display calibration offset
|
||||
- Hide some leading 0's
|
||||
- Menu timeouts
|
||||
|
||||
## V2.05
|
||||
|
||||
* Language updates
|
||||
|
||||
- Language updates
|
||||
|
||||
## V2.04
|
||||
|
||||
* GUI updates
|
||||
- GUI updates
|
||||
|
||||
## V2.03
|
||||
|
||||
* Support for new accelerometers
|
||||
- Support for new accelerometers
|
||||
|
||||
## V2.02
|
||||
|
||||
* Adds small font
|
||||
- Adds small font
|
||||
|
||||
## V2.01
|
||||
|
||||
* Newer settings menu
|
||||
- Newer settings menu
|
||||
|
||||
## V2.00
|
||||
|
||||
* Complete re-write of the low layer system to use the STM32 HAL for easier development
|
||||
* This allowed easier setup for the new ADC auto measuring system
|
||||
* Better tip PWM control
|
||||
* Moved to FreeRTOS for scheduling
|
||||
* Complete re-write from blank
|
||||
* Added detailed screen views
|
||||
* Added smaller font for said screen views
|
||||
|
||||
- Complete re-write of the low layer system to use the STM32 HAL for easier development
|
||||
- This allowed easier setup for the new ADC auto measuring system
|
||||
- Better tip PWM control
|
||||
- Moved to FreeRTOS for scheduling
|
||||
- Complete re-write from blank
|
||||
- Added detailed screen views
|
||||
- Added smaller font for said screen views
|
||||
|
||||
## V1.17
|
||||
|
||||
* Added blinking cooldown display
|
||||
* Allowed smaller sleep timeout values
|
||||
* New font!
|
||||
* Automatic startup option
|
||||
- Added blinking cooldown display
|
||||
- Allowed smaller sleep timeout values
|
||||
- New font!
|
||||
- Automatic startup option
|
||||
|
||||
## V1.16
|
||||
|
||||
* Added automatic rotation support
|
||||
* Added power display graph
|
||||
- Added automatic rotation support
|
||||
- Added power display graph
|
||||
|
||||
## V1.15
|
||||
|
||||
* Added support for a custom bootup logo to be programmed via the DFU bootloader
|
||||
- Added support for a custom bootup logo to be programmed via the DFU bootloader
|
||||
|
||||
## V1.14
|
||||
|
||||
* Changed input voltage cutoff to be based on cell count rather than voltage
|
||||
- Changed input voltage cutoff to be based on cell count rather than voltage
|
||||
|
||||
## V1.13
|
||||
|
||||
* Swapped buttons for menu to prevent accidentally changing first menu item
|
||||
* Added auto key repeat
|
||||
- Swapped buttons for menu to prevent accidentally changing first menu item
|
||||
- Added auto key repeat
|
||||
|
||||
## V1.12
|
||||
|
||||
* Increases sensitivity options to be 1*9 with 0 off state
|
||||
* Fixes issue where going from COOL *> soldering can leave screen off
|
||||
- Increases sensitivity options to be 1\*9 with 0 off state
|
||||
- Fixes issue where going from COOL \*> soldering can leave screen off
|
||||
|
||||
## V1.11
|
||||
|
||||
* Boost mode
|
||||
* Change sensitivity options to be 1*8
|
||||
- Boost mode
|
||||
- Change sensitivity options to be 1\*8
|
||||
|
||||
## V1.10
|
||||
|
||||
* Adds help text to settings
|
||||
* Improves settings for the display update rate
|
||||
- Adds help text to settings
|
||||
- Improves settings for the display update rate
|
||||
|
||||
## V1.09
|
||||
|
||||
* Adds display modes, for slowing down or simplifying the display
|
||||
- Adds display modes, for slowing down or simplifying the display
|
||||
|
||||
## V1.08
|
||||
|
||||
* Fix settings menu not showing flip display
|
||||
- Fix settings menu not showing flip display
|
||||
|
||||
## V1.07
|
||||
|
||||
* Adds shutdown time to automatically shutdown the iron after inactivity
|
||||
- Adds shutdown time to automatically shutdown the iron after inactivity
|
||||
|
||||
## V1.06
|
||||
|
||||
* Changes H and C when the iron is heating to the minidso chevron like images
|
||||
- Changes H and C when the iron is heating to the minidso chevron like images
|
||||
|
||||
## V1.05
|
||||
|
||||
* Adds ability to calibrate the input voltage measurement
|
||||
- Adds ability to calibrate the input voltage measurement
|
||||
|
||||
## V1.04
|
||||
|
||||
* Increased accuracy of the temperature control
|
||||
* Improved PID response slightly
|
||||
* Allows temperature offset calibration
|
||||
* Nicer idle screen
|
||||
- Increased accuracy of the temperature control
|
||||
- Improved PID response slightly
|
||||
- Allows temperature offset calibration
|
||||
- Nicer idle screen
|
||||
|
||||
## V1.03
|
||||
|
||||
* Improved Button handling
|
||||
* Ability to set motion sensitivity
|
||||
* DC voltmeter page shows input voltage
|
||||
- Improved Button handling
|
||||
- Ability to set motion sensitivity
|
||||
- DC voltmeter page shows input voltage
|
||||
|
||||
## V1.02
|
||||
|
||||
* Adds hold both buttons on IDLE to access the therometer mode
|
||||
* Changes the exit soldering mode to be holding both buttons (Like original firmware)
|
||||
- Adds hold both buttons on IDLE to access the therometer mode
|
||||
- Changes the exit soldering mode to be holding both buttons (Like original firmware)
|
||||
|
||||
BIN
Documentation/images/HomeScreen.png
Normal file
BIN
Documentation/images/HomeScreen.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 554 B |
75
README.md
75
README.md
@@ -4,7 +4,7 @@
|
||||
|
||||
# IronOS - Flexible Soldering iron control Firmware
|
||||
|
||||
*This repository was formerly known as TS100, its the same great code. Just with more supported devices*
|
||||
_This repository was formerly known as TS100, its the same great code. Just with more supported devices_
|
||||
|
||||
Originally concieved as an alternative firmware for the TS100, this firmware has evolved into a complex soldering iron control firmware.
|
||||
|
||||
@@ -16,29 +16,30 @@ For soldering irons that are designed to be powered by batteries (TS100), settin
|
||||
|
||||
There are 25 languages currently supported as of present. When downloading the firmware for your soldering iron take note of the language code in the file name.
|
||||
|
||||
This project is considered feature complete for use as a soldering iron, *so please suggest any feature improvements you would like!*
|
||||
This project is considered feature complete for use as a soldering iron, _so please suggest any feature improvements you would like!_
|
||||
|
||||
*This firmware does **NOT** support the USB port while running for changing settings. This is done through the onscreen menu only. Logos are edited using the tool or python script and uploaded in DFU mode.*
|
||||
_This firmware does **NOT** support the USB port while running for changing settings. This is done through the onscreen menu only. Logos are edited using the tool or python script and uploaded in DFU mode._
|
||||
|
||||
To get started with this firmware, please jump over to [here](Documentation/GettingStarted.md)
|
||||
|
||||
## Key Features
|
||||
|
||||
* PID style iron temperature control
|
||||
* Automatic sleep with selectable sensitivity
|
||||
* Motion wake support
|
||||
* All settings exposed in intuitive menu
|
||||
* (TS100) Set a voltage lower limit for Lithium batteries so you don't kill your battery pack
|
||||
* (TS80) Set 18W or 24W settings for your power bank
|
||||
* (TS80P) Automatically negotiates appropriate PD and falls back to QC mode like TS80
|
||||
* (Pinecil) Supports all 3 power modes (PD,QC, DC In).
|
||||
* Improved readability Fonts, supporting multiple languages
|
||||
* Use hardware features to improve reliability
|
||||
* Can disable movement detection if desired
|
||||
* Boost mode lets you temporarily change the temperature when soldering (i.e. raise the temperature for short periods of time)
|
||||
* (TS100/Pinecil) Battery charge level indicator if power source set to a lipo cell count
|
||||
* (TS80/TS80P/Pinecil) Power bank operating voltage is displayed
|
||||
* [Custom boot up logo support](Documentation/Logo.md)
|
||||
* Automatic LCD rotation based on the orientation
|
||||
- PID style iron temperature control
|
||||
- Automatic sleep with selectable sensitivity
|
||||
- Motion wake support
|
||||
- All settings exposed in intuitive menu
|
||||
- (TS100) Set a voltage lower limit for Lithium batteries so you don't kill your battery pack
|
||||
- (TS80) Set 18W or 24W settings for your power bank
|
||||
- (TS80P) Automatically negotiates appropriate PD and falls back to QC mode like TS80
|
||||
- (Pinecil) Supports all 3 power modes (PD,QC, DC In).
|
||||
- Improved readability Fonts, supporting multiple languages
|
||||
- Use hardware features to improve reliability
|
||||
- Can disable movement detection if desired
|
||||
- Boost mode lets you temporarily change the temperature when soldering (i.e. raise the temperature for short periods of time)
|
||||
- (TS100/Pinecil) Battery charge level indicator if power source set to a lipo cell count
|
||||
- (TS80/TS80P/Pinecil) Power bank operating voltage is displayed
|
||||
- [Custom boot up logo support](Documentation/Logo.md)
|
||||
- Automatic LCD rotation based on the orientation
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -49,10 +50,10 @@ For installation for your device, please refer to the [Flashing Guide](Documenta
|
||||
This new firmware uses a new menu system to allow access to the settings on the device.
|
||||
When on the main screen, the unit shows prompts for the two most common operations.
|
||||
|
||||
* Pressing the button near the tip enters soldering mode
|
||||
* Pressing the button near the USB enters the settings menu
|
||||
* Holding the button near the tip will enter soldering temperature adjust mode (This is the same as the one in the soldering menu, just to let you edit before heating up)
|
||||
* Holding the button near the USB end will show the [debug menu](Documentation/DebugMenu.md)
|
||||
- Pressing the button near the tip enters soldering mode
|
||||
- Pressing the button near the USB enters the settings menu
|
||||
- Holding the button near the tip will enter soldering temperature adjust mode (This is the same as the one in the soldering menu, just to let you edit before heating up)
|
||||
- Holding the button near the USB end will show the [debug menu](Documentation/DebugMenu.md)
|
||||
|
||||
Detailed operation details are over in the [Menu information.](Documentation/Menu.md)
|
||||
|
||||
@@ -63,19 +64,19 @@ I also want to give a shout out to all of the [Fantastic Contributors](https://g
|
||||
|
||||
Especially to the following users, who have helped in various ways that are massively appreciated:
|
||||
|
||||
* [Dhiltonp](https://github.com/dhiltonp)
|
||||
* [Mrkvozrout](https://github.com/Mrkvozrout)
|
||||
* [JonnieZG](https://github.com/jonnieZG)
|
||||
* [Federck](https://github.com/federck)
|
||||
* [Jvitkauskas](https://github.com/jvitkauskas)
|
||||
* [Doegox](https://github.com/doegox)
|
||||
* [Perillamint](https://github.com/perillamint)
|
||||
* [GeminiServer](https://github.com/GeminiServer)
|
||||
* [Patrick Horlebein](https://github.com/PixelPirate)
|
||||
* [Firebie](https://github.com/Firebie)
|
||||
* [Agatti](https://github.com/agatti)
|
||||
* [Discip](https://github.com/discip)
|
||||
* [Paul Fertser](https://github.com/paulfertser)
|
||||
- [Dhiltonp](https://github.com/dhiltonp)
|
||||
- [Mrkvozrout](https://github.com/Mrkvozrout)
|
||||
- [JonnieZG](https://github.com/jonnieZG)
|
||||
- [Federck](https://github.com/federck)
|
||||
- [Jvitkauskas](https://github.com/jvitkauskas)
|
||||
- [Doegox](https://github.com/doegox)
|
||||
- [Perillamint](https://github.com/perillamint)
|
||||
- [GeminiServer](https://github.com/GeminiServer)
|
||||
- [Patrick Horlebein](https://github.com/PixelPirate)
|
||||
- [Firebie](https://github.com/Firebie)
|
||||
- [Agatti](https://github.com/agatti)
|
||||
- [Discip](https://github.com/discip)
|
||||
- [Paul Fertser](https://github.com/paulfertser)
|
||||
|
||||
Plus the huge number of people who have contributed translations, your effort is massively appreciated.
|
||||
|
||||
@@ -86,6 +87,6 @@ Other components such as FreeRTOS/USB-PD have their own licence.
|
||||
|
||||
## Commercial Use
|
||||
|
||||
This software is provided as-is, so I cannot provide any commercial support for the firmware.
|
||||
This software is provided as-is, so I cannot provide any commercial support for the firmware.
|
||||
However, you are more than welcome to distribute links to the firmware, or provide irons with this software on them.
|
||||
Please do not re-host the files, but rather link to this page, so that there are no old versions of the firmware scattered around.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>TS100 Translation Editor</title>
|
||||
<title>IronOS Translation Editor</title>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
|
||||
<script src="translations_commons.js"></script>
|
||||
@@ -191,11 +191,67 @@
|
||||
delim = " and ";
|
||||
}
|
||||
return str;
|
||||
},
|
||||
|
||||
getWholeScreenMessageMaxLen: function(valMap, id, prop) {
|
||||
var v = prop ? valMap[id][prop] : valMap[id];
|
||||
var maxLen;
|
||||
if (this.isSmall(v)) {
|
||||
maxLen = defMap[id].maxLen2 || 16;
|
||||
} else {
|
||||
maxLen = defMap[id].maxLen || 8;
|
||||
}
|
||||
return maxLen;
|
||||
},
|
||||
|
||||
validateWholeScreenMessage: function(valMap, id, prop) {
|
||||
var v = prop ? valMap[id][prop] : valMap[id];
|
||||
var maxLen = this.getWholeScreenMessageMaxLen(valMap, id, prop);
|
||||
if (this.isSmall(v)) {
|
||||
if (v[0].length === 0) {
|
||||
return "invalid";
|
||||
} else if (Math.max(v[0].length, v[1].length) > maxLen) {
|
||||
return "invalid";
|
||||
}
|
||||
} else {
|
||||
if (v.length > maxLen) {
|
||||
return "invalid";
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
constraintWholeScreenMessage: function(valMap, id, prop) {
|
||||
return "len <= " + this.getWholeScreenMessageMaxLen(valMap, id, prop);
|
||||
},
|
||||
|
||||
isSmall: function(v) {
|
||||
return v instanceof Array;
|
||||
},
|
||||
|
||||
convertToLarge: function(valMap, id, prop) {
|
||||
var v = prop ? valMap[id][prop] : valMap[id];
|
||||
var message = v[0] + (v[1] !== "" ? " " + v[1] : "");
|
||||
if (prop) {
|
||||
valMap[id][prop] = message;
|
||||
} else {
|
||||
valMap[id] = message;
|
||||
}
|
||||
},
|
||||
|
||||
convertToSmall: function(valMap, id, prop) {
|
||||
var v = prop ? valMap[id][prop] : valMap[id];
|
||||
var message = [ v, "" ];
|
||||
if (prop) {
|
||||
valMap[id][prop] = message;
|
||||
} else {
|
||||
valMap[id] = message;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
app.def = def;
|
||||
copyArrayToMap(app.def.messages, defMap);
|
||||
copyArrayToMap(app.def.messagesWarn, defMap);
|
||||
copyArrayToMap(app.def.characters, defMap);
|
||||
copyArrayToMap(app.def.menuGroups, defMap);
|
||||
copyArrayToMap(app.def.menuOptions, defMap);
|
||||
@@ -208,7 +264,7 @@
|
||||
<body>
|
||||
|
||||
<div id="app">
|
||||
<h1>TS100 Translation Editor<span v-if="meta.currentLoaded"> - {{ current.languageLocalName }} [{{current.languageCode}}]</span></h1>
|
||||
<h1>IronOS Translation Editor<span v-if="meta.currentLoaded"> - {{ current.languageLocalName }} [{{current.languageCode}}]</span></h1>
|
||||
<table class="header data">
|
||||
<tr>
|
||||
<td class="label">Referent Language</td>
|
||||
@@ -273,6 +329,27 @@
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h2>Warning Messages</h2>
|
||||
<table class="data">
|
||||
<tr v-for="message in def.messagesWarn" v-bind:class="validateWholeScreenMessage(current.messagesWarn, message.id)">
|
||||
<td class="label"><div class="stringId">{{message.id}}</div></td>
|
||||
<td class="value">
|
||||
<div class="constraint">{{constraintWholeScreenMessage(current.messagesWarn, message.id)}}</div>
|
||||
<div class="ref">{{referent.messagesWarn[message.id]}}</div>
|
||||
<div class="note" v-if="message.note">{{message.note}}</div>
|
||||
<div class="tran" v-if="isSmall(current.messagesWarn[message.id])">
|
||||
<input :id="'in_'+message.id+'_0'" type="text" v-model="current.messagesWarn[message.id][0]" v-bind:class="{unchanged : current.messagesWarn[message.id][0] == referent.messagesWarn[message.id][0] && current.messagesWarn[message.id][1] == referent.messagesWarn[message.id][1], empty : current.messagesWarn[message.id][0] == '' && current.messagesWarn[message.id][1] == ''}">
|
||||
<input :id="'in_'+message.id+'_1'" type="text" v-model="current.messagesWarn[message.id][1]" v-bind:class="{unchanged : current.messagesWarn[message.id][0] == referent.messagesWarn[message.id][0] && current.messagesWarn[message.id][1] == referent.messagesWarn[message.id][1], empty : current.messagesWarn[message.id][0] == '' && current.messagesWarn[message.id][1] == ''}">
|
||||
<button type="button" @click="convertToLarge(current.messagesWarn, message.id)">Convert to large text</button>
|
||||
</div>
|
||||
<div class="tran" v-else>
|
||||
<input :id="'in_'+message.id" type="text" v-model="current.messagesWarn[message.id]" v-bind:class="{unchanged : current.messagesWarn[message.id] == referent.messagesWarn[message.id], empty : current.messagesWarn[message.id]==''}">
|
||||
<button type="button" @click="convertToSmall(current.messagesWarn, message.id)">Convert to small text</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h2>Characters</h2>
|
||||
<table class="data">
|
||||
<tr v-for="char in def.characters" v-bind:class="validateInput(current.characters, char.id)">
|
||||
@@ -287,13 +364,21 @@
|
||||
|
||||
<h2>Menu Groups</h2>
|
||||
<table class="data">
|
||||
<tr v-for="menu in def.menuGroups" v-bind:class="validateInput(current.menuGroups, menu.id, 2)">
|
||||
<tr v-for="menu in def.menuGroups" v-bind:class="validateWholeScreenMessage(current.menuGroups, menu.id, 'text2')">
|
||||
<td class="label"><div class="stringId">{{menu.id}}</div></td>
|
||||
<td class="value">
|
||||
<div class="label">Menu Name</div>
|
||||
<div class="constraint">{{constraintString(menu)}}</div>
|
||||
<div class="constraint">{{constraintWholeScreenMessage(current.menuGroups, menu.id, 'text2')}}</div>
|
||||
<div class="ref">{{referent.menuGroups[menu.id].text2}}</div>
|
||||
<div class="tran" v-bind:class="{unchanged : current.menuGroups[menu.id].text2[0] == referent.menuGroups[menu.id].text2[0] && current.menuGroups[menu.id].text2[1] == referent.menuGroups[menu.id].text2[1], empty : current.menuGroups[menu.id].text2[0] == '' || current.menuGroups[menu.id].text2[1] == ''}"><input type="text" v-model="current.menuGroups[menu.id].text2[0]"><input type="text" v-model="current.menuGroups[menu.id].text2[1]"></div>
|
||||
<div class="tran" v-if="isSmall(current.menuGroups[menu.id].text2)">
|
||||
<input type="text" v-model="current.menuGroups[menu.id].text2[0]" v-bind:class="{unchanged : current.menuGroups[menu.id].text2[0] == referent.menuGroups[menu.id].text2[0] && current.menuGroups[menu.id].text2[1] == referent.menuGroups[menu.id].text2[1], empty : current.menuGroups[menu.id].text2[0] == '' && current.menuGroups[menu.id].text2[1] == ''}">
|
||||
<input type="text" v-model="current.menuGroups[menu.id].text2[1]" v-bind:class="{unchanged : current.menuGroups[menu.id].text2[0] == referent.menuGroups[menu.id].text2[0] && current.menuGroups[menu.id].text2[1] == referent.menuGroups[menu.id].text2[1], empty : current.menuGroups[menu.id].text2[0] == '' && current.menuGroups[menu.id].text2[1] == ''}">
|
||||
<button type="button" @click="convertToLarge(current.menuGroups, menu.id, 'text2')">Convert to large text</button>
|
||||
</div>
|
||||
<div class="tran" v-else>
|
||||
<input type="text" v-model="current.menuGroups[menu.id].text2" v-bind:class="{unchanged : current.menuGroups[menu.id].text2 == referent.menuGroups[menu.id].text2, empty : current.menuGroups[menu.id].text2==''}">
|
||||
<button type="button" @click="convertToSmall(current.menuGroups, menu.id, 'text2')">Convert to small text</button>
|
||||
</div>
|
||||
<div class="label">Description</div>
|
||||
<div class="ref">{{referent.menuGroups[menu.id].desc}}</div>
|
||||
<div class="tran"><input type="text" v-model="current.menuGroups[menu.id].desc" v-bind:class="{unchanged : current.menuGroups[menu.id].desc == referent.menuGroups[menu.id].desc, empty : current.menuGroups[menu.id].desc == ''}"></div>
|
||||
@@ -303,14 +388,22 @@
|
||||
|
||||
<h2>Menu Options</h2>
|
||||
<table class="data">
|
||||
<tr v-for="menu in def.menuOptions" v-bind:class="validateInput(current.menuOptions, menu.id, 2)">
|
||||
<tr v-for="menu in def.menuOptions" v-bind:class="validateWholeScreenMessage(current.menuOptions, menu.id, 'text2')">
|
||||
<td class="label"><div class="stringId">{{menu.id}}</div></td>
|
||||
<td class="value">
|
||||
<div v-bind:class="{hidden : false}">
|
||||
<div class="label">Menu Name (Double-Line)</div>
|
||||
<div class="constraint">{{constraintString(menu)}}</div>
|
||||
<div class="label">Menu Name</div>
|
||||
<div class="constraint">{{constraintWholeScreenMessage(current.menuOptions, menu.id, 'text2')}}</div>
|
||||
<div class="ref">{{referent.menuOptions[menu.id].text2}}</div>
|
||||
<div class="tran" v-bind:class="{unchanged : current.menuOptions[menu.id].text2[0] == referent.menuOptions[menu.id].text2[0] && current.menuOptions[menu.id].text2[1] == referent.menuOptions[menu.id].text2[1], empty : current.menuOptions[menu.id].text2[0] == '' || current.menuOptions[menu.id].text2[1] == ''}"><input type="text" v-model="current.menuOptions[menu.id].text2[0]"><input type="text" v-model="current.menuOptions[menu.id].text2[1]"></div>
|
||||
<div class="tran" v-if="isSmall(current.menuOptions[menu.id].text2)">
|
||||
<input type="text" v-model="current.menuOptions[menu.id].text2[0]" v-bind:class="{unchanged : current.menuOptions[menu.id].text2[0] == referent.menuOptions[menu.id].text2[0] && current.menuOptions[menu.id].text2[1] == referent.menuOptions[menu.id].text2[1], empty : current.menuOptions[menu.id].text2[0] == '' && current.menuOptions[menu.id].text2[1] == ''}">
|
||||
<input type="text" v-model="current.menuOptions[menu.id].text2[1]" v-bind:class="{unchanged : current.menuOptions[menu.id].text2[0] == referent.menuOptions[menu.id].text2[0] && current.menuOptions[menu.id].text2[1] == referent.menuOptions[menu.id].text2[1], empty : current.menuOptions[menu.id].text2[0] == '' && current.menuOptions[menu.id].text2[1] == ''}">
|
||||
<button type="button" @click="convertToLarge(current.menuOptions, menu.id, 'text2')">Convert to large text</button>
|
||||
</div>
|
||||
<div class="tran" v-else>
|
||||
<input type="text" v-model="current.menuOptions[menu.id].text2" v-bind:class="{unchanged : current.menuOptions[menu.id].text2 == referent.menuOptions[menu.id].text2, empty : current.menuOptions[menu.id].text2==''}">
|
||||
<button type="button" @click="convertToSmall(current.menuOptions, menu.id, 'text2')">Convert to small text</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="label">Description</div>
|
||||
<div class="ref">{{referent.menuOptions[menu.id].desc}}</div>
|
||||
@@ -326,4 +419,4 @@
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# coding=utf-8
|
||||
def getFontMap():
|
||||
def get_font_map():
|
||||
font = {
|
||||
" ": "0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,",
|
||||
"!": "0x00,0x00,0x00,0x00,0x7C,0xFF,0xFF,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x00,0x00,0x00,0x00,0x00,",
|
||||
@@ -414,7 +414,7 @@ def getFontMap():
|
||||
return font
|
||||
|
||||
|
||||
def getSmallFontMap():
|
||||
def get_small_font_map():
|
||||
font = {
|
||||
" ": "0x00, 0x00, 0x00, 0x00, 0x00, 0x00,",
|
||||
"!": "0x00, 0x00, 0x4f, 0x00, 0x00, 0x00,",
|
||||
@@ -1,218 +1,214 @@
|
||||
#!/usr/bin/env python3
|
||||
# coding=utf-8
|
||||
from __future__ import print_function
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import io
|
||||
import functools
|
||||
from datetime import datetime
|
||||
import sys
|
||||
import fontTables
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
from datetime import datetime
|
||||
from itertools import chain
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, TextIO, Tuple, Union
|
||||
|
||||
HERE = os.path.dirname(__file__)
|
||||
from bdflib import reader as bdfreader
|
||||
from bdflib.model import Font, Glyph
|
||||
|
||||
try:
|
||||
to_unicode = unicode
|
||||
except NameError:
|
||||
to_unicode = str
|
||||
import font_tables
|
||||
|
||||
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
|
||||
|
||||
@functools.lru_cache(maxsize=None)
|
||||
def cjkFont():
|
||||
from bdflib import reader as bdfreader
|
||||
|
||||
def cjk_font() -> Font:
|
||||
with open(os.path.join(HERE, "wqy-bitmapsong/wenquanyi_9pt.bdf"), "rb") as f:
|
||||
return bdfreader.read_bdf(f)
|
||||
|
||||
|
||||
def log(message):
|
||||
print(message, file=sys.stdout)
|
||||
|
||||
|
||||
# Loading a single JSON file
|
||||
def loadJson(fileName, skipFirstLine):
|
||||
with io.open(fileName, mode="r", encoding="utf-8") as f:
|
||||
if skipFirstLine:
|
||||
def load_json(filename: str, skip_first_line: bool) -> dict:
|
||||
with open(filename) as f:
|
||||
if skip_first_line:
|
||||
f.readline()
|
||||
|
||||
obj = json.loads(f.read())
|
||||
|
||||
return obj
|
||||
return json.loads(f.read())
|
||||
|
||||
|
||||
def readTranslation(jsonDir, langCode):
|
||||
fileName = "translation_{}.json".format(langCode)
|
||||
def read_translation(json_root: Union[str, Path], lang_code: str) -> dict:
|
||||
filename = f"translation_{lang_code}.json"
|
||||
|
||||
fileWithPath = os.path.join(jsonDir, fileName)
|
||||
file_with_path = os.path.join(json_root, filename)
|
||||
|
||||
try:
|
||||
lang = loadJson(fileWithPath, False)
|
||||
lang = load_json(file_with_path, skip_first_line=False)
|
||||
except json.decoder.JSONDecodeError as e:
|
||||
log("Failed to decode " + fileName)
|
||||
log(str(e))
|
||||
logging.error(f"Failed to decode {filename}")
|
||||
logging.exception(str(e))
|
||||
sys.exit(2)
|
||||
|
||||
# Extract lang code from file name
|
||||
langCode = fileName[12:-5].upper()
|
||||
# ...and the one specified in the JSON file...
|
||||
try:
|
||||
langCodeFromJson = lang["languageCode"]
|
||||
except KeyError:
|
||||
langCodeFromJson = "(missing)"
|
||||
|
||||
# ...cause they should be the same!
|
||||
if langCode != langCodeFromJson:
|
||||
raise ValueError(
|
||||
"Invalid languageCode " + langCodeFromJson + " in file " + fileName
|
||||
)
|
||||
validate_langcode_matches_content(filename, lang)
|
||||
|
||||
return lang
|
||||
|
||||
|
||||
def writeStart(f):
|
||||
f.write(
|
||||
to_unicode(
|
||||
"""// WARNING: THIS FILE WAS AUTO GENERATED BY make_translation.py. PLEASE DO NOT EDIT.
|
||||
def validate_langcode_matches_content(filename: str, content: dict) -> None:
|
||||
# Extract lang code from file name
|
||||
lang_code = filename[12:-5].upper()
|
||||
# ...and the one specified in the JSON file...
|
||||
try:
|
||||
lang_code_from_json = content["languageCode"]
|
||||
except KeyError:
|
||||
lang_code_from_json = "(missing)"
|
||||
|
||||
#include "Translation.h"
|
||||
"""
|
||||
)
|
||||
)
|
||||
# ...cause they should be the same!
|
||||
if lang_code != lang_code_from_json:
|
||||
raise ValueError(f"Invalid languageCode {lang_code_from_json} in file {filename}")
|
||||
|
||||
|
||||
def escapeC(s):
|
||||
return s.replace('"', '\\"')
|
||||
def write_start(f: TextIO):
|
||||
f.write("// WARNING: THIS FILE WAS AUTO GENERATED BY make_translation.py. PLEASE DO NOT EDIT.\n")
|
||||
f.write("\n")
|
||||
f.write('#include "Translation.h"\n')
|
||||
|
||||
|
||||
def getConstants():
|
||||
def get_constants() -> List[str]:
|
||||
# Extra constants that are used in the firmware that are shared across all languages
|
||||
consants = []
|
||||
consants.append(("SymbolPlus", "+"))
|
||||
consants.append(("SymbolMinus", "-"))
|
||||
consants.append(("SymbolSpace", " "))
|
||||
consants.append(("SymbolDot", "."))
|
||||
consants.append(("SymbolDegC", "C"))
|
||||
consants.append(("SymbolDegF", "F"))
|
||||
consants.append(("SymbolMinutes", "M"))
|
||||
consants.append(("SymbolSeconds", "S"))
|
||||
consants.append(("SymbolWatts", "W"))
|
||||
consants.append(("SymbolVolts", "V"))
|
||||
consants.append(("SymbolDC", "DC"))
|
||||
consants.append(("SymbolCellCount", "S"))
|
||||
consants.append(("SymbolVersionNumber", buildVersion))
|
||||
return consants
|
||||
return [
|
||||
("SymbolPlus", "+"),
|
||||
("SymbolMinus", "-"),
|
||||
("SymbolSpace", " "),
|
||||
("SymbolDot", "."),
|
||||
("SymbolDegC", "C"),
|
||||
("SymbolDegF", "F"),
|
||||
("SymbolMinutes", "M"),
|
||||
("SymbolSeconds", "S"),
|
||||
("SymbolWatts", "W"),
|
||||
("SymbolVolts", "V"),
|
||||
("SymbolDC", "DC"),
|
||||
("SymbolCellCount", "S"),
|
||||
("SymbolVersionNumber", buildVersion)
|
||||
]
|
||||
|
||||
|
||||
def getDebugMenu():
|
||||
constants = []
|
||||
constants.append(datetime.today().strftime("%d-%m-%y"))
|
||||
constants.append("HW G ") # High Water marker for GUI task
|
||||
constants.append("HW M ") # High Water marker for MOV task
|
||||
constants.append("HW P ") # High Water marker for PID task
|
||||
constants.append("Time ") # Uptime (aka timestamp)
|
||||
constants.append("Move ") # Time of last significant movement
|
||||
constants.append("RTip ") # Tip reading in uV
|
||||
constants.append("CTip ") # Tip temp in C
|
||||
constants.append("CHan ") # Handle temp in C
|
||||
constants.append("Vin ") # Input voltage
|
||||
constants.append("PCB ") # PCB Version AKA IMU version
|
||||
constants.append("PWR ") # Power Negotiation State
|
||||
constants.append("Max ") # Max deg C limit
|
||||
|
||||
return constants
|
||||
def get_debug_menu() -> List[str]:
|
||||
return [
|
||||
datetime.today().strftime("%d-%m-%y"),
|
||||
"HW G ",
|
||||
"HW M ",
|
||||
"HW P ",
|
||||
"Time ",
|
||||
"Move ",
|
||||
"RTip ",
|
||||
"CTip ",
|
||||
"CHan ",
|
||||
"Vin ",
|
||||
"PCB ",
|
||||
"PWR ",
|
||||
"Max "
|
||||
]
|
||||
|
||||
|
||||
def getLetterCounts(defs, lang):
|
||||
textList = []
|
||||
def get_letter_counts(defs: dict, lang: dict) -> List[str]:
|
||||
text_list = []
|
||||
# iterate over all strings
|
||||
obj = lang["menuOptions"]
|
||||
for mod in defs["menuOptions"]:
|
||||
eid = mod["id"]
|
||||
textList.append(obj[eid]["desc"])
|
||||
text_list.append(obj[eid]["desc"])
|
||||
|
||||
obj = lang["messages"]
|
||||
for mod in defs["messages"]:
|
||||
eid = mod["id"]
|
||||
if eid not in obj:
|
||||
textList.append(mod["default"])
|
||||
text_list.append(mod["default"])
|
||||
else:
|
||||
textList.append(obj[eid])
|
||||
text_list.append(obj[eid])
|
||||
|
||||
obj = lang["messagesWarn"]
|
||||
for mod in defs["messagesWarn"]:
|
||||
eid = mod["id"]
|
||||
if isinstance(obj[eid], list):
|
||||
text_list.append(obj[eid][0])
|
||||
text_list.append(obj[eid][1])
|
||||
else:
|
||||
text_list.append(obj[eid])
|
||||
|
||||
obj = lang["characters"]
|
||||
|
||||
for mod in defs["characters"]:
|
||||
eid = mod["id"]
|
||||
textList.append(obj[eid])
|
||||
text_list.append(obj[eid])
|
||||
|
||||
obj = lang["menuOptions"]
|
||||
for mod in defs["menuOptions"]:
|
||||
eid = mod["id"]
|
||||
textList.append(obj[eid]["text2"][0])
|
||||
textList.append(obj[eid]["text2"][1])
|
||||
if isinstance(obj[eid]["text2"], list):
|
||||
text_list.append(obj[eid]["text2"][0])
|
||||
text_list.append(obj[eid]["text2"][1])
|
||||
else:
|
||||
text_list.append(obj[eid]["text2"])
|
||||
|
||||
obj = lang["menuGroups"]
|
||||
for mod in defs["menuGroups"]:
|
||||
eid = mod["id"]
|
||||
textList.append(obj[eid]["text2"][0])
|
||||
textList.append(obj[eid]["text2"][1])
|
||||
if isinstance(obj[eid]["text2"], list):
|
||||
text_list.append(obj[eid]["text2"][0])
|
||||
text_list.append(obj[eid]["text2"][1])
|
||||
else:
|
||||
text_list.append(obj[eid]["text2"])
|
||||
|
||||
obj = lang["menuGroups"]
|
||||
for mod in defs["menuGroups"]:
|
||||
eid = mod["id"]
|
||||
textList.append(obj[eid]["desc"])
|
||||
constants = getConstants()
|
||||
text_list.append(obj[eid]["desc"])
|
||||
constants = get_constants()
|
||||
for x in constants:
|
||||
textList.append(x[1])
|
||||
textList.extend(getDebugMenu())
|
||||
text_list.append(x[1])
|
||||
text_list.extend(get_debug_menu())
|
||||
|
||||
# collapse all strings down into the composite letters and store totals for these
|
||||
|
||||
symbolCounts = {}
|
||||
for line in textList:
|
||||
symbol_counts: dict[str, int] = {}
|
||||
for line in text_list:
|
||||
line = line.replace("\n", "").replace("\r", "")
|
||||
line = line.replace("\\n", "").replace("\\r", "")
|
||||
if len(line):
|
||||
# print(line)
|
||||
if line:
|
||||
for letter in line:
|
||||
symbolCounts[letter] = symbolCounts.get(letter, 0) + 1
|
||||
symbolCounts = sorted(
|
||||
symbolCounts.items(), key=lambda kv: (kv[1], kv[0])
|
||||
) # swap to Big -> little sort order
|
||||
symbolCounts = list(map(lambda x: x[0], symbolCounts))
|
||||
symbolCounts.reverse()
|
||||
return symbolCounts
|
||||
symbol_counts[letter] = symbol_counts.get(letter, 0) + 1
|
||||
symbols_by_occurrence = sorted(symbol_counts.items(), key=lambda kv: (kv[1], kv[0]))
|
||||
# swap to Big -> little sort order
|
||||
symbols_by_occurrence = [x[0] for x in symbols_by_occurrence]
|
||||
symbols_by_occurrence.reverse()
|
||||
return symbols_by_occurrence
|
||||
|
||||
|
||||
def getCJKGlyph(sym):
|
||||
from bdflib.model import Glyph
|
||||
def get_cjk_glyph(sym: str) -> str:
|
||||
glyph: Glyph = cjk_font()[ord(sym)]
|
||||
|
||||
try:
|
||||
glyph: Glyph = cjkFont()[ord(sym)]
|
||||
except:
|
||||
return None
|
||||
data = glyph.data
|
||||
(srcLeft, srcBottom, srcW, srcH) = glyph.get_bounding_box()
|
||||
dstW = 12
|
||||
dstH = 16
|
||||
src_left, src_bottom, src_w, src_h = glyph.get_bounding_box()
|
||||
dst_w = 12
|
||||
dst_h = 16
|
||||
|
||||
# The source data is a per-row list of ints. The first item is the bottom-
|
||||
# most row. For each row, the LSB is the right-most pixel.
|
||||
# Here, (x, y) is the coordinates with origin at the top-left.
|
||||
def getCell(x, y):
|
||||
def get_cell(x: int, y: int) -> bool:
|
||||
# Adjust x coordinates by actual bounding box.
|
||||
adjX = x - srcLeft
|
||||
if adjX < 0 or adjX >= srcW:
|
||||
adj_x = x - src_left
|
||||
if adj_x < 0 or adj_x >= src_w:
|
||||
return False
|
||||
# Adjust y coordinates by actual bounding box, then place the glyph
|
||||
# baseline 3px above the bottom edge to make it centre-ish.
|
||||
# This metric is optimized for WenQuanYi Bitmap Song 9pt and assumes
|
||||
# each glyph is to be placed in a 12x12px box.
|
||||
adjY = y - (dstH - srcH - srcBottom - 3)
|
||||
if adjY < 0 or adjY >= srcH:
|
||||
adj_y = y - (dst_h - src_h - src_bottom - 3)
|
||||
if adj_y < 0 or adj_y >= src_h:
|
||||
return False
|
||||
if data[srcH - adjY - 1] & (1 << (srcW - adjX - 1)):
|
||||
if data[src_h - adj_y - 1] & (1 << (src_w - adj_x - 1)):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
@@ -224,20 +220,20 @@ def getCJKGlyph(sym):
|
||||
# bottom half.
|
||||
s = ""
|
||||
for block in range(2):
|
||||
for c in range(dstW):
|
||||
for c in range(dst_w):
|
||||
b = 0
|
||||
for r in range(8):
|
||||
if getCell(c, r + 8 * block):
|
||||
if get_cell(c, r + 8 * block):
|
||||
b |= 0x01 << r
|
||||
s += f"0x{b:02X},"
|
||||
return s
|
||||
|
||||
|
||||
def getCharsFromFontIndex(index: int) -> str:
|
||||
'''
|
||||
def get_chars_from_font_index(index: int) -> str:
|
||||
"""
|
||||
Converts the font table index into its corresponding string escape
|
||||
sequence(s).
|
||||
'''
|
||||
"""
|
||||
|
||||
# We want to be able to use more than 254 symbols (excluding \x00 null
|
||||
# terminator and \x01 new-line) in the font table but without making all
|
||||
@@ -266,159 +262,144 @@ def getCharsFromFontIndex(index: int) -> str:
|
||||
# ...
|
||||
# 0xFF 0xFF => 15 * 0xFF - 15 + 255 = 4065
|
||||
|
||||
assert index >= 0
|
||||
page = int((index + 14) / 0xFF)
|
||||
assert page <= 0x0F
|
||||
if index < 0:
|
||||
raise ValueError("index must be positive")
|
||||
page = (index + 0x0E) // 0xFF
|
||||
if page > 0x0F:
|
||||
raise ValueError("page value out of range")
|
||||
if page == 0:
|
||||
return "\\x%0.2X" % index
|
||||
return f"\\x{index:02X}"
|
||||
else:
|
||||
# Into extended range
|
||||
# Leader is 0xFz where z is the page number
|
||||
# Following char is the remainder
|
||||
leader = page + 0xF0
|
||||
value = ((index + 14) % 0xFF) + 1
|
||||
assert leader <= 0xFF
|
||||
assert value <= 0xFF
|
||||
return "\\x%0.2X\\x%0.2X" % (leader, value)
|
||||
value = ((index + 0x0E) % 0xFF) + 0x01
|
||||
|
||||
if leader > 0xFF or value > 0xFF:
|
||||
raise ValueError("value is out of range")
|
||||
return f"\\x{leader:02X}\\x{value:02X}"
|
||||
|
||||
|
||||
def getFontMapAndTable(textList):
|
||||
def get_font_map_and_table(text_list: List[str]) -> Tuple[str, Dict[str, str]]:
|
||||
# the text list is sorted
|
||||
# allocate out these in their order as number codes
|
||||
symbolMap = {}
|
||||
symbolMap["\n"] = "\\x01" # Force insert the newline char
|
||||
symbol_map = {"\n": "\\x01"}
|
||||
index = 2 # start at 2, as 0= null terminator,1 = new line
|
||||
forcedFirstSymbols = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
|
||||
forced_first_symbols = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
|
||||
|
||||
# Get the font table, which does not include CJK chars
|
||||
fontTable = fontTables.getFontMap()
|
||||
fontSmallTable = fontTables.getSmallFontMap()
|
||||
font_table = font_tables.get_font_map()
|
||||
font_small_table = font_tables.get_small_font_map()
|
||||
|
||||
# We want to put all CJK chars after non-CJK ones so that the CJK chars
|
||||
# do not need to be in the small font table to save space.
|
||||
# We assume all symbols not in the font table to be a CJK char.
|
||||
# We also enforce that numbers are first.
|
||||
orderedNormalSymList = forcedFirstSymbols + [x for x in textList if x not in forcedFirstSymbols and x in fontTable]
|
||||
orderedCJKSymList = [x for x in textList if x not in forcedFirstSymbols and x not in fontTable]
|
||||
ordered_normal_sym_list: List[str] = forced_first_symbols + [x for x in text_list if x not in forced_first_symbols and x in font_table]
|
||||
ordered_cjk_sym_list: List[str] = [x for x in text_list if x not in forced_first_symbols and x not in font_table]
|
||||
|
||||
totalSymbolCount = len(orderedNormalSymList) + len(orderedCJKSymList)
|
||||
total_symbol_count = len(ordered_normal_sym_list) + len(ordered_cjk_sym_list)
|
||||
# \x00 is for NULL termination and \x01 is for newline, so the maximum
|
||||
# number of symbols allowed is as follow (see also the comments in
|
||||
# `getCharsFromFontIndex`):
|
||||
if totalSymbolCount > (0x10 * 0xFF - 15) - 2:
|
||||
log(f"Error, too many used symbols for this version (total {totalSymbolCount})")
|
||||
# `get_chars_from_font_index`):
|
||||
if total_symbol_count > (0x10 * 0xFF - 15) - 2: # 4063
|
||||
logging.error(f"Error, too many used symbols for this version (total {total_symbol_count})")
|
||||
sys.exit(1)
|
||||
|
||||
log("Generating fonts for {} symbols".format(totalSymbolCount))
|
||||
logging.info(f"Generating fonts for {total_symbol_count} symbols")
|
||||
|
||||
for l in (orderedNormalSymList, orderedCJKSymList):
|
||||
for sym in l:
|
||||
assert(sym not in symbolMap)
|
||||
symbolMap[sym] = getCharsFromFontIndex(index)
|
||||
index = index + 1
|
||||
for sym in chain(ordered_normal_sym_list, ordered_cjk_sym_list):
|
||||
if sym in symbol_map:
|
||||
raise ValueError("Symbol not found in symbol map")
|
||||
symbol_map[sym] = get_chars_from_font_index(index)
|
||||
index += 1
|
||||
|
||||
fontTableStrings = []
|
||||
fontSmallTableStrings = []
|
||||
for sym in orderedNormalSymList:
|
||||
if sym not in fontTable:
|
||||
log("Missing Large font element for {}".format(sym))
|
||||
font_table_strings = []
|
||||
font_small_table_strings = []
|
||||
for sym in ordered_normal_sym_list:
|
||||
if sym not in font_table:
|
||||
logging.error(f"Missing Large font element for {sym}")
|
||||
sys.exit(1)
|
||||
fontLine = fontTable[sym]
|
||||
fontTableStrings.append(fontLine + "//{} -> {}".format(symbolMap[sym], sym))
|
||||
if sym not in fontSmallTable:
|
||||
log("Missing Small font element for {}".format(sym))
|
||||
font_line: str = font_table[sym]
|
||||
font_table_strings.append(f"{font_line}//{symbol_map[sym]} -> {sym}")
|
||||
if sym not in font_small_table:
|
||||
logging.error(f"Missing Small font element for {sym}")
|
||||
sys.exit(1)
|
||||
fontLine = fontSmallTable[sym]
|
||||
fontSmallTableStrings.append(
|
||||
fontLine + "//{} -> {}".format(symbolMap[sym], sym)
|
||||
)
|
||||
font_line: str = font_small_table[sym]
|
||||
font_small_table_strings.append(f"{font_line}//{symbol_map[sym]} -> {sym}")
|
||||
|
||||
for sym in orderedCJKSymList:
|
||||
assert(sym not in fontTable)
|
||||
fontLine = getCJKGlyph(sym)
|
||||
if fontLine is None:
|
||||
log("Missing Large font element for {}".format(sym))
|
||||
for sym in ordered_cjk_sym_list:
|
||||
if sym in font_table:
|
||||
raise ValueError("Symbol already exists in font_table")
|
||||
font_line = get_cjk_glyph(sym)
|
||||
if font_line is None:
|
||||
logging.error(f"Missing Large font element for {sym}")
|
||||
sys.exit(1)
|
||||
fontTableStrings.append(fontLine + "//{} -> {}".format(symbolMap[sym], sym))
|
||||
font_table_strings.append(f"{font_line}//{symbol_map[sym]} -> {sym}")
|
||||
# No data to add to the small font table
|
||||
fontSmallTableStrings.append(
|
||||
"// {} -> {}".format(symbolMap[sym], sym)
|
||||
)
|
||||
font_small_table_strings.append(f"// {symbol_map[sym]} -> {sym}")
|
||||
|
||||
outputTable = "const uint8_t USER_FONT_12[] = {" + to_unicode("\n")
|
||||
for line in fontTableStrings:
|
||||
output_table = "const uint8_t USER_FONT_12[] = {\n"
|
||||
for line in font_table_strings:
|
||||
# join font table int one large string
|
||||
outputTable = outputTable + line + to_unicode("\n")
|
||||
outputTable = outputTable + "};" + to_unicode("\n")
|
||||
outputTable = outputTable + "const uint8_t USER_FONT_6x8[] = {" + to_unicode("\n")
|
||||
for line in fontSmallTableStrings:
|
||||
output_table += line + "\n"
|
||||
output_table += "};\n"
|
||||
output_table += "const uint8_t USER_FONT_6x8[] = {\n"
|
||||
for line in font_small_table_strings:
|
||||
# join font table int one large string
|
||||
outputTable = outputTable + line + to_unicode("\n")
|
||||
outputTable = outputTable + "};" + to_unicode("\n")
|
||||
return (outputTable, symbolMap)
|
||||
output_table += line + "\n"
|
||||
output_table += "};\n"
|
||||
return output_table, symbol_map
|
||||
|
||||
|
||||
def convStr(symbolConversionTable, text):
|
||||
def convert_string(symbol_conversion_table: Dict[str, str], text: str) -> str:
|
||||
# convert all of the symbols from the string into escapes for their content
|
||||
outputString = ""
|
||||
output_string = ""
|
||||
for c in text.replace("\\r", "").replace("\\n", "\n"):
|
||||
if c not in symbolConversionTable:
|
||||
log("Missing font definition for {}".format(c))
|
||||
if c not in symbol_conversion_table:
|
||||
logging.error(f"Missing font definition for {c}")
|
||||
sys.exit(1)
|
||||
else:
|
||||
outputString = outputString + symbolConversionTable[c]
|
||||
return outputString
|
||||
output_string += symbol_conversion_table[c]
|
||||
return output_string
|
||||
|
||||
|
||||
def writeLanguage(lang, defs, f):
|
||||
languageCode = lang["languageCode"]
|
||||
log("Generating block for " + languageCode)
|
||||
def write_language(lang: dict, defs: dict, f: TextIO) -> None:
|
||||
language_code: str = lang["languageCode"]
|
||||
logging.info(f"Generating block for {language_code}")
|
||||
# Iterate over all of the text to build up the symbols & counts
|
||||
textList = getLetterCounts(defs, lang)
|
||||
text_list = get_letter_counts(defs, lang)
|
||||
# From the letter counts, need to make a symbol translator & write out the font
|
||||
(fontTableText, symbolConversionTable) = getFontMapAndTable(textList)
|
||||
font_table_text, symbol_conversion_table = get_font_map_and_table(text_list)
|
||||
|
||||
try:
|
||||
langName = lang["languageLocalName"]
|
||||
lang_name = lang["languageLocalName"]
|
||||
except KeyError:
|
||||
langName = languageCode
|
||||
lang_name = language_code
|
||||
|
||||
f.write(to_unicode("\n// ---- " + langName + " ----\n\n"))
|
||||
f.write(fontTableText)
|
||||
f.write(to_unicode("\n// ---- " + langName + " ----\n\n"))
|
||||
f.write(f"\n// ---- {lang_name} ----\n\n")
|
||||
f.write(font_table_text)
|
||||
f.write(f"\n// ---- {lang_name} ----\n\n")
|
||||
|
||||
# ----- Writing SettingsDescriptions
|
||||
obj = lang["menuOptions"]
|
||||
f.write(to_unicode("const char* SettingsDescriptions[] = {\n"))
|
||||
f.write("const char* SettingsDescriptions[] = {\n")
|
||||
|
||||
maxLen = 25
|
||||
max_len = 25
|
||||
index = 0
|
||||
for mod in defs["menuOptions"]:
|
||||
eid = mod["id"]
|
||||
if "feature" in mod:
|
||||
f.write(to_unicode("#ifdef " + mod["feature"] + "\n"))
|
||||
f.write(
|
||||
to_unicode(
|
||||
" /* ["
|
||||
+ "{:02d}".format(index)
|
||||
+ "] "
|
||||
+ eid.ljust(maxLen)[:maxLen]
|
||||
+ " */ "
|
||||
)
|
||||
)
|
||||
f.write(
|
||||
to_unicode(
|
||||
'"'
|
||||
+ convStr(symbolConversionTable, (obj[eid]["desc"]))
|
||||
+ '",'
|
||||
+ "//{} \n".format(obj[eid]["desc"])
|
||||
)
|
||||
)
|
||||
if "feature" in mod:
|
||||
f.write(to_unicode("#endif\n"))
|
||||
index = index + 1
|
||||
f.write(f"#ifdef {mod['feature']}\n")
|
||||
f.write(f" /* [{index:02d}] {eid.ljust(max_len)[:max_len]} */ ")
|
||||
f.write(f"\"{convert_string(symbol_conversion_table, obj[eid]['desc'])}\",//{obj[eid]['desc']} \n")
|
||||
|
||||
f.write(to_unicode("};\n\n"))
|
||||
if "feature" in mod:
|
||||
f.write("#endif\n")
|
||||
index += 1
|
||||
|
||||
f.write("};\n\n")
|
||||
|
||||
# ----- Writing Message strings
|
||||
|
||||
@@ -426,227 +407,164 @@ def writeLanguage(lang, defs, f):
|
||||
|
||||
for mod in defs["messages"]:
|
||||
eid = mod["id"]
|
||||
sourceText = ""
|
||||
source_text = ""
|
||||
if "default" in mod:
|
||||
sourceText = mod["default"]
|
||||
source_text = mod["default"]
|
||||
if eid in obj:
|
||||
sourceText = obj[eid]
|
||||
translatedText = convStr(symbolConversionTable, sourceText)
|
||||
f.write(
|
||||
to_unicode(
|
||||
"const char* "
|
||||
+ eid
|
||||
+ ' = "'
|
||||
+ translatedText
|
||||
+ '";'
|
||||
+ "//{} \n".format(sourceText.replace("\n", "_"))
|
||||
)
|
||||
)
|
||||
source_text = obj[eid]
|
||||
translated_text = convert_string(symbol_conversion_table, source_text)
|
||||
source_text = source_text.replace("\n", "_")
|
||||
f.write(f'const char* {eid} = "{translated_text}";//{source_text} \n')
|
||||
|
||||
f.write(to_unicode("\n"))
|
||||
f.write("\n")
|
||||
|
||||
obj = lang["messagesWarn"]
|
||||
|
||||
for mod in defs["messagesWarn"]:
|
||||
eid = mod["id"]
|
||||
if isinstance(obj[eid], list):
|
||||
if not obj[eid][1]:
|
||||
source_text = obj[eid][0]
|
||||
else:
|
||||
source_text = obj[eid][0] + "\n" + obj[eid][1]
|
||||
else:
|
||||
source_text = "\n" + obj[eid]
|
||||
translated_text = convert_string(symbol_conversion_table, source_text)
|
||||
source_text = source_text.replace("\n", "_")
|
||||
f.write(f'const char* {eid} = "{translated_text}";//{source_text} \n')
|
||||
|
||||
f.write("\n")
|
||||
|
||||
# ----- Writing Characters
|
||||
|
||||
obj = lang["characters"]
|
||||
|
||||
for mod in defs["characters"]:
|
||||
eid = mod["id"]
|
||||
f.write(
|
||||
to_unicode(
|
||||
"const char* "
|
||||
+ eid
|
||||
+ ' = "'
|
||||
+ convStr(symbolConversionTable, obj[eid])
|
||||
+ '";'
|
||||
+ "//{} \n".format(obj[eid])
|
||||
)
|
||||
)
|
||||
|
||||
f.write(to_unicode("\n"))
|
||||
eid: str = mod["id"]
|
||||
f.write(f'const char* {eid} = "{convert_string(symbol_conversion_table, obj[eid])}";//{obj[eid]} \n')
|
||||
f.write("\n")
|
||||
|
||||
# Write out firmware constant options
|
||||
constants = getConstants()
|
||||
constants = get_constants()
|
||||
for x in constants:
|
||||
f.write(
|
||||
to_unicode(
|
||||
"const char* "
|
||||
+ x[0]
|
||||
+ ' = "'
|
||||
+ convStr(symbolConversionTable, x[1])
|
||||
+ '";'
|
||||
+ "//{} \n".format(x[1])
|
||||
)
|
||||
)
|
||||
|
||||
f.write(to_unicode("\n"))
|
||||
f.write(f'const char* {x[0]} = "{convert_string(symbol_conversion_table, x[1])}";//{x[1]} \n')
|
||||
f.write("\n")
|
||||
|
||||
# Debug Menu
|
||||
f.write(to_unicode("const char* DebugMenu[] = {\n"))
|
||||
f.write("const char* DebugMenu[] = {\n")
|
||||
|
||||
for c in getDebugMenu():
|
||||
f.write(
|
||||
to_unicode(
|
||||
'\t "' + convStr(symbolConversionTable, c) + '",' + "//{} \n".format(c)
|
||||
)
|
||||
)
|
||||
f.write(to_unicode("};\n\n"))
|
||||
for c in get_debug_menu():
|
||||
f.write(f'\t "{convert_string(symbol_conversion_table, c)}",//{c} \n')
|
||||
f.write("};\n\n")
|
||||
|
||||
# ----- Writing SettingsDescriptions
|
||||
obj = lang["menuOptions"]
|
||||
f.write(to_unicode("const char* SettingsShortNames[][2] = {\n"))
|
||||
f.write("const char* SettingsShortNames[] = {\n")
|
||||
|
||||
maxLen = 25
|
||||
max_len = 25
|
||||
index = 0
|
||||
for mod in defs["menuOptions"]:
|
||||
eid = mod["id"]
|
||||
if isinstance(obj[eid]["text2"], list):
|
||||
if not obj[eid]["text2"][1]:
|
||||
source_text = obj[eid]["text2"][0]
|
||||
else:
|
||||
source_text = obj[eid]["text2"][0] + "\n" + obj[eid]["text2"][1]
|
||||
else:
|
||||
source_text = "\n" + obj[eid]["text2"]
|
||||
if "feature" in mod:
|
||||
f.write(to_unicode("#ifdef " + mod["feature"] + "\n"))
|
||||
f.write(
|
||||
to_unicode(
|
||||
" /* ["
|
||||
+ "{:02d}".format(index)
|
||||
+ "] "
|
||||
+ eid.ljust(maxLen)[:maxLen]
|
||||
+ " */ "
|
||||
)
|
||||
)
|
||||
f.write(
|
||||
to_unicode(
|
||||
'{ "'
|
||||
+ convStr(symbolConversionTable, (obj[eid]["text2"][0]))
|
||||
+ '", "'
|
||||
+ convStr(symbolConversionTable, (obj[eid]["text2"][1]))
|
||||
+ '" },'
|
||||
+ "//{} \n".format(obj[eid]["text2"])
|
||||
)
|
||||
)
|
||||
f.write(f"#ifdef {mod['feature']}\n")
|
||||
f.write(f" /* [{index:02d}] {eid.ljust(max_len)[:max_len]} */ ")
|
||||
f.write(f'{{ "{convert_string(symbol_conversion_table, source_text)}" }},//{obj[eid]["text2"]} \n')
|
||||
|
||||
if "feature" in mod:
|
||||
f.write(to_unicode("#endif\n"))
|
||||
index = index + 1
|
||||
f.write("#endif\n")
|
||||
index += 1
|
||||
|
||||
f.write(to_unicode("};\n\n"))
|
||||
f.write("};\n\n")
|
||||
|
||||
# ----- Writing Menu Groups
|
||||
obj = lang["menuGroups"]
|
||||
f.write(to_unicode("const char* SettingsMenuEntries[" + str(len(obj)) + "] = {\n"))
|
||||
f.write(f"const char* SettingsMenuEntries[{len(obj)}] = {{\n")
|
||||
|
||||
maxLen = 25
|
||||
max_len = 25
|
||||
for mod in defs["menuGroups"]:
|
||||
eid = mod["id"]
|
||||
f.write(to_unicode(" /* " + eid.ljust(maxLen)[:maxLen] + " */ "))
|
||||
f.write(
|
||||
to_unicode(
|
||||
'"'
|
||||
+ convStr(
|
||||
symbolConversionTable,
|
||||
(obj[eid]["text2"][0]) + "\\n" + obj[eid]["text2"][1],
|
||||
)
|
||||
+ '",'
|
||||
+ "//{} \n".format(obj[eid]["text2"])
|
||||
)
|
||||
)
|
||||
if isinstance(obj[eid]["text2"], list):
|
||||
if not obj[eid]["text2"][1]:
|
||||
source_text = obj[eid]["text2"][0]
|
||||
else:
|
||||
source_text = obj[eid]["text2"][0] + "\n" + obj[eid]["text2"][1]
|
||||
else:
|
||||
source_text = "\n" + obj[eid]["text2"]
|
||||
f.write(f" /* {eid.ljust(max_len)[:max_len]} */ ")
|
||||
f.write(f'"{convert_string(symbol_conversion_table, source_text)}",//{obj[eid]["text2"]} \n')
|
||||
|
||||
f.write(to_unicode("};\n\n"))
|
||||
f.write("};\n\n")
|
||||
|
||||
# ----- Writing Menu Groups Descriptions
|
||||
obj = lang["menuGroups"]
|
||||
f.write(
|
||||
to_unicode(
|
||||
"const char* SettingsMenuEntriesDescriptions[" + str(len(obj)) + "] = {\n"
|
||||
)
|
||||
)
|
||||
f.write(f"const char* SettingsMenuEntriesDescriptions[{(len(obj))}] = {{\n")
|
||||
|
||||
maxLen = 25
|
||||
max_len = 25
|
||||
for mod in defs["menuGroups"]:
|
||||
eid = mod["id"]
|
||||
f.write(to_unicode(" /* " + eid.ljust(maxLen)[:maxLen] + " */ "))
|
||||
f.write(
|
||||
to_unicode(
|
||||
'"'
|
||||
+ convStr(symbolConversionTable, (obj[eid]["desc"]))
|
||||
+ '",'
|
||||
+ "//{} \n".format(obj[eid]["desc"])
|
||||
)
|
||||
)
|
||||
f.write(f" /* {eid.ljust(max_len)[:max_len]} */ ")
|
||||
f.write(f"\"{convert_string(symbol_conversion_table, (obj[eid]['desc']))}\",//{obj[eid]['desc']} \n")
|
||||
|
||||
f.write(to_unicode("};\n\n"))
|
||||
f.write(
|
||||
"const bool HasFahrenheit = "
|
||||
+ ("true" if lang.get("tempUnitFahrenheit", True) else "false")
|
||||
+ ";\n"
|
||||
)
|
||||
f.write("};\n\n")
|
||||
f.write(f"const bool HasFahrenheit = {('true' if lang.get('tempUnitFahrenheit', True) else 'false')};\n")
|
||||
|
||||
f.write("\n// Verify SettingsItemIndex values:\n")
|
||||
for i, mod in enumerate(defs["menuOptions"]):
|
||||
eid = mod["id"]
|
||||
f.write(f"static_assert(static_cast<uint8_t>(SettingsItemIndex::{eid}) == {i});\n")
|
||||
|
||||
|
||||
def readVersion(jsonDir):
|
||||
with open(os.path.relpath(jsonDir + "/../source/version.h"), "r") as version_file:
|
||||
try:
|
||||
for line in version_file:
|
||||
if re.findall(r"^.*(?<=(#define)).*(?<=(BUILD_VERSION))", line):
|
||||
line = re.findall(r"\"(.+?)\"", line)
|
||||
if line:
|
||||
version = line[0]
|
||||
try:
|
||||
version += (
|
||||
"."
|
||||
+ subprocess.check_output(
|
||||
["git", "rev-parse", "--short=7", "HEAD"]
|
||||
)
|
||||
.strip()
|
||||
.decode("ascii")
|
||||
.upper()
|
||||
)
|
||||
# --short=7: the shorted hash with 7 digits. Increase/decrease if needed!
|
||||
except OSError:
|
||||
version += " git"
|
||||
finally:
|
||||
if version_file:
|
||||
version_file.close()
|
||||
return version
|
||||
def read_version() -> str:
|
||||
with open(HERE.parent / 'source' / 'version.h') as version_file:
|
||||
for line in version_file:
|
||||
if re.findall(r"^.*(?<=(#define)).*(?<=(BUILD_VERSION))", line):
|
||||
line = re.findall(r"\"(.+?)\"", line)
|
||||
if line:
|
||||
version = line[0]
|
||||
try:
|
||||
version += f".{subprocess.check_output(['git', 'rev-parse', '--short=7', 'HEAD']).strip().decode('ascii').upper()}"
|
||||
# --short=7: the shorted hash with 7 digits. Increase/decrease if needed!
|
||||
except OSError:
|
||||
version += " git"
|
||||
return version
|
||||
|
||||
|
||||
def orderOutput(langDict):
|
||||
# These languages go first
|
||||
mandatoryOrder = ["EN"]
|
||||
|
||||
# Then add all others in alphabetical order
|
||||
sortedKeys = sorted(langDict.keys())
|
||||
|
||||
# Add the rest as they come
|
||||
for key in sortedKeys:
|
||||
if key not in mandatoryOrder:
|
||||
mandatoryOrder.append(key)
|
||||
|
||||
return mandatoryOrder
|
||||
|
||||
|
||||
def parseArgs():
|
||||
def parse_args() -> argparse.Namespace:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
"--output", "-o", help="Target file", type=argparse.FileType("w"), required=True
|
||||
)
|
||||
parser.add_argument("languageCode", help="Language to generate")
|
||||
parser.add_argument("--output", "-o",
|
||||
help="Target file",
|
||||
type=argparse.FileType("w"),
|
||||
required=True
|
||||
)
|
||||
parser.add_argument("languageCode",
|
||||
help="Language to generate")
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
jsonDir = HERE
|
||||
|
||||
args = parseArgs()
|
||||
json_dir = HERE
|
||||
|
||||
args = parse_args()
|
||||
try:
|
||||
buildVersion = readVersion(jsonDir)
|
||||
except:
|
||||
log("error: could not get/extract build version")
|
||||
buildVersion = read_version()
|
||||
except FileNotFoundError:
|
||||
logging.error("error: Could not find version info ")
|
||||
sys.exit(1)
|
||||
|
||||
log("Build version: " + buildVersion)
|
||||
log("Making " + args.languageCode + " from " + jsonDir)
|
||||
logging.info(f"Build version: {buildVersion}")
|
||||
logging.info(f"Making {args.languageCode} from {json_dir}")
|
||||
|
||||
lang = readTranslation(jsonDir, args.languageCode)
|
||||
defs = loadJson(os.path.join(jsonDir, "translations_def.js"), True)
|
||||
out = args.output
|
||||
writeStart(out)
|
||||
writeLanguage(lang, defs, out)
|
||||
lang_ = read_translation(json_dir, args.languageCode)
|
||||
defs_ = load_json(os.path.join(json_dir, "translations_def.js"), True)
|
||||
out_ = args.output
|
||||
write_start(out_)
|
||||
write_language(lang_, defs_, out_)
|
||||
|
||||
log("Done")
|
||||
logging.info("Done")
|
||||
|
||||
@@ -1,23 +1,22 @@
|
||||
#!/usr/bin/env python3
|
||||
# coding=utf-8
|
||||
import unittest
|
||||
|
||||
|
||||
class TestMakeTranslation(unittest.TestCase):
|
||||
def test_getCharsFromFontIndex(self):
|
||||
from make_translation import getCharsFromFontIndex
|
||||
def test_get_chars_from_font_index(self):
|
||||
from make_translation import get_chars_from_font_index
|
||||
|
||||
self.assertEqual(getCharsFromFontIndex(2), "\\x02")
|
||||
self.assertEqual(getCharsFromFontIndex(239), "\\xEF")
|
||||
self.assertEqual(getCharsFromFontIndex(240), "\\xF0")
|
||||
self.assertEqual(getCharsFromFontIndex(241), "\\xF1\\x01")
|
||||
self.assertEqual(getCharsFromFontIndex(495), "\\xF1\\xFF")
|
||||
self.assertEqual(getCharsFromFontIndex(496), "\\xF2\\x01")
|
||||
self.assertEqual(getCharsFromFontIndex(750), "\\xF2\\xFF")
|
||||
self.assertEqual(getCharsFromFontIndex(751), "\\xF3\\x01")
|
||||
self.assertEqual(getCharsFromFontIndex(0x10 * 0xFF - 15), "\\xFF\\xFF")
|
||||
with self.assertRaises(AssertionError):
|
||||
getCharsFromFontIndex(0x10 * 0xFF - 14)
|
||||
self.assertEqual(get_chars_from_font_index(2), "\\x02")
|
||||
self.assertEqual(get_chars_from_font_index(239), "\\xEF")
|
||||
self.assertEqual(get_chars_from_font_index(240), "\\xF0")
|
||||
self.assertEqual(get_chars_from_font_index(241), "\\xF1\\x01")
|
||||
self.assertEqual(get_chars_from_font_index(495), "\\xF1\\xFF")
|
||||
self.assertEqual(get_chars_from_font_index(496), "\\xF2\\x01")
|
||||
self.assertEqual(get_chars_from_font_index(750), "\\xF2\\xFF")
|
||||
self.assertEqual(get_chars_from_font_index(751), "\\xF3\\x01")
|
||||
self.assertEqual(get_chars_from_font_index(0x10 * 0xFF - 15), "\\xFF\\xFF")
|
||||
with self.assertRaises(ValueError):
|
||||
get_chars_from_font_index(0x10 * 0xFF - 14)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -21,11 +21,25 @@
|
||||
"TipDisconnectedString": "ПРЕКЪСНАТ ВРЪХ",
|
||||
"SolderingAdvancedPowerPrompt": "Захранване: ",
|
||||
"OffString": "Изкл.",
|
||||
"ResetOKMessage": "Нулиране завършено",
|
||||
"YourGainMessage": "Усилване:",
|
||||
"SettingsResetMessage": "Настройките бяха\nнулирани!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"YourGainMessage": "Усилване:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": [
|
||||
"Нулиране",
|
||||
"завършено"
|
||||
],
|
||||
"SettingsResetMessage": [
|
||||
"Настройките бяха",
|
||||
"нулирани!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +51,7 @@
|
||||
"SettingFastChar": "F",
|
||||
"SettingSlowChar": "S",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +215,6 @@
|
||||
],
|
||||
"desc": "Скорост на движение на този текст"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Модел",
|
||||
"на връх"
|
||||
],
|
||||
"desc": "Избор на модел на връх"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Бърза",
|
||||
"калибрация"
|
||||
],
|
||||
"desc": "Бърза калибрация с използване на гореща вода"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Прецизна",
|
||||
"калибрация"
|
||||
],
|
||||
"desc": "Прецизна калибрация с използване на термо-двойка на върха на поялника"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Мощност на",
|
||||
@@ -264,13 +257,6 @@
|
||||
],
|
||||
"desc": "Поддържане на интензивност на захранващия импулс"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Промяна",
|
||||
"сила връх"
|
||||
],
|
||||
"desc": "Усилване на върха на поялника"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "HROT NEPŘIPOJEN",
|
||||
"SolderingAdvancedPowerPrompt": "Ohřev: ",
|
||||
"OffString": "Vyp",
|
||||
"YourGainMessage": "Zisk:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Zisk:",
|
||||
"SettingsResetMessage": "Tov. nas. obnov.",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Tov. nas. obnov.",
|
||||
""
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "R",
|
||||
"SettingSlowChar": "P",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Rychlost posuvu popisků podobných tomuto <P=Pomalu, R=Rychle>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Model",
|
||||
"hrotu"
|
||||
],
|
||||
"desc": "Výběr modelu hrotu."
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Jednoduchá",
|
||||
"kalibrace"
|
||||
],
|
||||
"desc": "Jednoduchá kalibrace pomocí horké vody."
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Pokročilá",
|
||||
"kalibrace"
|
||||
],
|
||||
"desc": "Pokročilá kalibrace pomocí termočlánku na hrotu."
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Výkon",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Puls pro udržení zařízení v chodu (kvůli power bankám)."
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Změnit",
|
||||
"zisk hr."
|
||||
],
|
||||
"desc": "Zisk hrotu (měření)"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "TIP DISCONNECTED",
|
||||
"SolderingAdvancedPowerPrompt": "Power: ",
|
||||
"OffString": "Off",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "Settings were\nreset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "F",
|
||||
"SettingSlowChar": "S",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "L",
|
||||
"SettingStartSleepChar": "D",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Speed this text scrolls past at"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Tip",
|
||||
"Model"
|
||||
],
|
||||
"desc": "Tip Model selection"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Simple",
|
||||
"Calibration"
|
||||
],
|
||||
"desc": "Simple Calibration using Hot water"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Advanced",
|
||||
"Calibration"
|
||||
],
|
||||
"desc": "Advanced calibration using thermocouple on the tip"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Power",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Keep awake pulse power intensity"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Tip gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -22,11 +22,22 @@
|
||||
"TipDisconnectedString": "Spitze fehlt",
|
||||
"SolderingAdvancedPowerPrompt": "Leistung: ",
|
||||
"OffString": "Aus",
|
||||
"NoAccelerometerMessage": "Kein Bewegungssensor\nerkannt!",
|
||||
"NoPowerDeliveryMessage": "Kein USB-PD IC\nerkannt!",
|
||||
"YourGainMessage": "Dein Faktor:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Dein Faktor:",
|
||||
"SettingsResetMessage": "Einstellungen\nzurückgesetzt!",
|
||||
"SettingsResetMessage": [
|
||||
"Einstellungen",
|
||||
"zurückgesetzt!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"Kein Bewegungssensor",
|
||||
"erkannt!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"Kein USB-PD IC",
|
||||
"erkannt!"
|
||||
],
|
||||
"LockingKeysString": "GESPERRT",
|
||||
"UnlockingKeysString": "ENTSPERRT",
|
||||
"WarningKeysLockedString": "!GESPERRT!"
|
||||
@@ -202,27 +213,6 @@
|
||||
],
|
||||
"desc": "Scrollgeschwindigkeit der Erläuterungen <L=langsam | S=schnell>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Löt-",
|
||||
"spitze"
|
||||
],
|
||||
"desc": "Auswahl der Lötspitze"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Einfache",
|
||||
"Kalibrierung"
|
||||
],
|
||||
"desc": "Einfache Kalibrierung mit heißem Wasser"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Erweiterte",
|
||||
"Kalibrierung"
|
||||
],
|
||||
"desc": "Erweiterte Kalibrierung mit Thermoelement an der Lötspitze"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Spannungs-",
|
||||
@@ -265,13 +255,6 @@
|
||||
],
|
||||
"desc": "Powerbank mit einem Impuls wach halten <Watt>"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Ändere",
|
||||
"Spitzen-Faktor"
|
||||
],
|
||||
"desc": "Spitzen-Faktor"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall-Sonde",
|
||||
|
||||
@@ -22,11 +22,22 @@
|
||||
"TipDisconnectedString": "NO TIP",
|
||||
"SolderingAdvancedPowerPrompt": "Power: ",
|
||||
"OffString": "Off",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "Settings were\nreset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": "LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -38,7 +49,7 @@
|
||||
"SettingFastChar": "F",
|
||||
"SettingSlowChar": "S",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "S",
|
||||
"SettingStartSleepChar": "Z",
|
||||
"SettingStartSleepOffChar": "R",
|
||||
@@ -202,27 +213,6 @@
|
||||
],
|
||||
"desc": "Speed info text scrolls past at <S=slow | F=fast>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Tip",
|
||||
"model"
|
||||
],
|
||||
"desc": "Tip model selection"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Simple",
|
||||
"calibration"
|
||||
],
|
||||
"desc": "Using hot water to calibrate tip"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Advanced",
|
||||
"calibration"
|
||||
],
|
||||
"desc": "Using a thermocouple on the tip to calibrate it"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"QC",
|
||||
@@ -265,13 +255,6 @@
|
||||
],
|
||||
"desc": "Intensity of power of keep-awake-pulse <watt>"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Tip gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall sensor",
|
||||
|
||||
@@ -21,11 +21,23 @@
|
||||
"TipDisconnectedString": "NO HAY PUNTA",
|
||||
"SolderingAdvancedPowerPrompt": "Potencia: ",
|
||||
"OffString": " No",
|
||||
"ResetOKMessage": "Hecho. ",
|
||||
"YourGainMessage": "Gananc.:",
|
||||
"SettingsResetMessage": "Ajustes borrados",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": "Ajustes borrados"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Hecho.",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +49,7 @@
|
||||
"SettingFastChar": "R",
|
||||
"SettingSlowChar": "L",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "S",
|
||||
"SettingStartSleepChar": "R",
|
||||
"SettingStartSleepOffChar": "F",
|
||||
@@ -201,27 +213,6 @@
|
||||
],
|
||||
"desc": "Velocidad de desplazamiento del texto <R=rápida L=lenta>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Modelo de",
|
||||
"punta"
|
||||
],
|
||||
"desc": "Elegir el modelo de punta actual."
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Calibración",
|
||||
"simple"
|
||||
],
|
||||
"desc": "Calibración simple con agua caliente."
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Calibración",
|
||||
"avanzada"
|
||||
],
|
||||
"desc": "Calibrar con un termopar en la punta; más difícil."
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Potencia de",
|
||||
@@ -264,13 +255,6 @@
|
||||
],
|
||||
"desc": "Aplica unos pulsos necesarios para mantener encendidas ciertas baterías portátiles. En vatios."
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Ajustar ganancia",
|
||||
"de punta"
|
||||
],
|
||||
"desc": "Modificar el valor de ganancia de la punta."
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "KÄRKI ON IRTI",
|
||||
"SolderingAdvancedPowerPrompt": "Teho: ",
|
||||
"OffString": "OFF",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "Settings were\nreset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "N",
|
||||
"SettingSlowChar": "H",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Näiden selitetekstien vieritysnopeus."
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Tip",
|
||||
"Model"
|
||||
],
|
||||
"desc": "Tip Model selection"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Simple",
|
||||
"Calibration"
|
||||
],
|
||||
"desc": "Simple Calibration using Hot water"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Advanced",
|
||||
"Calibration"
|
||||
],
|
||||
"desc": "Advanced calibration using thermocouple on the tip"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Power",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Keep awake pulse power intensity"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Tip gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "PANNE DÉBRANCHÉE",
|
||||
"SolderingAdvancedPowerPrompt": "Puissance : ",
|
||||
"OffString": "Off",
|
||||
"YourGainMessage": "Gain : "
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Gain : ",
|
||||
"SettingsResetMessage": "Réglage réinit. !",
|
||||
"NoAccelerometerMessage": "Accéléromètre\nnon détecté !",
|
||||
"NoPowerDeliveryMessage": "Pas d'USB-PD\ndétecté !",
|
||||
"SettingsResetMessage": [
|
||||
"Réglage",
|
||||
"réinit. !"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"Accéléromètre",
|
||||
"non détecté !"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"Pas d'USB-PD",
|
||||
"détecté !"
|
||||
],
|
||||
"LockingKeysString": "VERROUIL",
|
||||
"UnlockingKeysString": "DEVERROU",
|
||||
"WarningKeysLockedString": "! VERR. !"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "R",
|
||||
"SettingSlowChar": "L",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"D",
|
||||
"SettingOffChar": "D",
|
||||
"SettingStartSolderingChar": "A",
|
||||
"SettingStartSleepChar": "V",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Vitesse de défilement du texte <R=rapide | L=lent>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Modèle de",
|
||||
"la panne"
|
||||
],
|
||||
"desc": "Sélection du modèle de la panne"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Calibration",
|
||||
"simple"
|
||||
],
|
||||
"desc": "Calibration simple à l'aide d'eau chaude"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Calibration",
|
||||
"avancée"
|
||||
],
|
||||
"desc": "Calibration avancée à l'aide d'un thermocouple sur la panne"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Tension max.",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Puissance des impulsions pour éviter la mise en veille des batteries <watt>"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modifier",
|
||||
"gain panne"
|
||||
],
|
||||
"desc": "Modifier le gain de la panne"
|
||||
},
|
||||
"LockingMode": {
|
||||
"text2": [
|
||||
"Verrouiller",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "VRH NIJE SPOJEN!",
|
||||
"SolderingAdvancedPowerPrompt": "Snaga: ",
|
||||
"OffString": "Off",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "Settings were\nreset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "B",
|
||||
"SettingSlowChar": "S",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Brzina kretanja dugačkih poruka. <B=brzo, S=sporo>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Model",
|
||||
"Vrha"
|
||||
],
|
||||
"desc": "Odabir modela lemnog vrha"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Jednostavna",
|
||||
"kalibracija"
|
||||
],
|
||||
"desc": "Kalibracija kipućom vodom"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Napredna",
|
||||
"kalibracija"
|
||||
],
|
||||
"desc": "Kalibracija korištenjem termo-elementa"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Snaga",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Keep awake pulse power intensity"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Tip gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,25 @@
|
||||
"TipDisconnectedString": "PÁKA LEVÉVE",
|
||||
"SolderingAdvancedPowerPrompt": "Telj: ",
|
||||
"OffString": "Ki",
|
||||
"ResetOKMessage": "Törlés OK",
|
||||
"YourGainMessage": "Erősítés:",
|
||||
"SettingsResetMessage": "Beállítások\ntörölve!",
|
||||
"NoAccelerometerMessage": "Nincs gyorsulásmérő!",
|
||||
"NoPowerDeliveryMessage": "Nincs USB-PD IC!",
|
||||
"YourGainMessage": "Erősítés:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": [
|
||||
"Törlés OK",
|
||||
""
|
||||
],
|
||||
"SettingsResetMessage": [
|
||||
"Beállítások",
|
||||
"törölve!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"Nincs",
|
||||
"gyorsulásmérő!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"Nincs USB-PD IC!",
|
||||
""
|
||||
],
|
||||
"LockingKeysString": "LEZÁRVA",
|
||||
"UnlockingKeysString": "FELOLDVA",
|
||||
"WarningKeysLockedString": "!LEZÁRVA!"
|
||||
@@ -37,7 +51,7 @@
|
||||
"SettingFastChar": "G",
|
||||
"SettingSlowChar": "L",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"0",
|
||||
"SettingOffChar": "0",
|
||||
"SettingStartSolderingChar": "F",
|
||||
"SettingStartSleepChar": "Z",
|
||||
"SettingStartSleepOffChar": "S",
|
||||
@@ -201,27 +215,6 @@
|
||||
],
|
||||
"desc": "Szöveggörgetés sebessége"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Forr.páka",
|
||||
"modell"
|
||||
],
|
||||
"desc": "Forrasztópáka modell kiválasztása"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Egyszerű",
|
||||
"kalibráció"
|
||||
],
|
||||
"desc": "Egyszerű kalibrálás forró víz segítségével"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Haladó",
|
||||
"Kalibráció"
|
||||
],
|
||||
"desc": "Haladó kalibrálás hegyre helyezett hőelem segítségével"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Max. USB",
|
||||
@@ -264,13 +257,6 @@
|
||||
],
|
||||
"desc": "Powerbankot ébrentartó áramfelvételi pulzusok nagysága <W>"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Pákaerősítés",
|
||||
""
|
||||
],
|
||||
"desc": "Pákaerősítés állítása"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Alvásérzékelő",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "PUNTA ASSENTE",
|
||||
"SolderingAdvancedPowerPrompt": "Potenz:",
|
||||
"OffString": "OFF",
|
||||
"YourGainMessage": "Guad.: "
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Guad.: ",
|
||||
"SettingsResetMessage": "Reset effettuato",
|
||||
"NoAccelerometerMessage": "Accelerometro\nnon rilevato",
|
||||
"NoPowerDeliveryMessage": "USB-PD non\ndisponibile",
|
||||
"SettingsResetMessage": [
|
||||
"Reset effettuato",
|
||||
""
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"Accelerometro",
|
||||
"non rilevato"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"USB-PD non",
|
||||
"disponibile"
|
||||
],
|
||||
"LockingKeysString": "Blocc.",
|
||||
"UnlockingKeysString": "Sblocc.",
|
||||
"WarningKeysLockedString": "BLOCCATO"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "V",
|
||||
"SettingSlowChar": "L",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "S",
|
||||
"SettingStartSleepChar": "R",
|
||||
"SettingStartSleepOffChar": "A",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Imposta la velocità di scorrimento del testo [L: lenta; V: veloce]"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Modello",
|
||||
"punta"
|
||||
],
|
||||
"desc": "Seleziona il modello della punta in uso"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Calibrazione",
|
||||
"semplice"
|
||||
],
|
||||
"desc": "Calibra le rilevazioni di temperatura tramite l'utilizzo di acqua in ebollizione"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Calibrazione",
|
||||
"avanzata"
|
||||
],
|
||||
"desc": "Calibra le rilevazioni di temperatura attraverso la termocoppia presente nella punta"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Voltaggio",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Regola la potenza di un \"impulso sveglia\" atto a prevenire lo standby eventuale dell'alimentatore [watt]"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Guadagno",
|
||||
"punta"
|
||||
],
|
||||
"desc": "Varia il guadagno della punta"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Effetto",
|
||||
|
||||
@@ -21,11 +21,25 @@
|
||||
"TipDisconnectedString": "NĖRA ANTGALIO",
|
||||
"SolderingAdvancedPowerPrompt": "Galia: ",
|
||||
"OffString": "Išj",
|
||||
"ResetOKMessage": "Atstatytas OK",
|
||||
"YourGainMessage": "Greitis:",
|
||||
"SettingsResetMessage": "Nust. atstatyti!",
|
||||
"NoAccelerometerMessage": "Nerastas\nakselerometras!",
|
||||
"NoPowerDeliveryMessage": "Nerastas\nUSB-PD IC !",
|
||||
"YourGainMessage": "Greitis:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": [
|
||||
"Atstatytas OK",
|
||||
""
|
||||
],
|
||||
"SettingsResetMessage": [
|
||||
"Nust. atstatyti!",
|
||||
""
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"Nerastas",
|
||||
"akselerometras!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"Nerastas",
|
||||
"USB-PD IC !"
|
||||
],
|
||||
"LockingKeysString": " UŽRAKIN",
|
||||
"UnlockingKeysString": "ATRAKIN",
|
||||
"WarningKeysLockedString": "!UŽRAK!"
|
||||
@@ -37,7 +51,7 @@
|
||||
"SettingFastChar": "G",
|
||||
"SettingSlowChar": "L",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"I",
|
||||
"SettingOffChar": "I",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "M",
|
||||
"SettingStartSleepOffChar": "K",
|
||||
@@ -201,27 +215,6 @@
|
||||
],
|
||||
"desc": "Greitis, kuriuo šis tekstas slenka"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Antgalio",
|
||||
"modelis"
|
||||
],
|
||||
"desc": "Antgalio modelio pasirinkimas"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Paprastas",
|
||||
"kalibravimas"
|
||||
],
|
||||
"desc": "Paprastas kalibravimas naudojant karštą vandienį"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Išplėstinis",
|
||||
"kalibravimas"
|
||||
],
|
||||
"desc": "Išplėstinis kalibravimas naudojant termoelementą"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"QC mait.",
|
||||
@@ -264,13 +257,6 @@
|
||||
],
|
||||
"desc": "Periodinis galios pulso intensyvumas maitinblokiui, neleidžiantis jam užmigti."
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Keisti",
|
||||
"antgreit"
|
||||
],
|
||||
"desc": "Antgalio pokyčio greitis"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Holo",
|
||||
|
||||
@@ -21,14 +21,34 @@
|
||||
"TipDisconnectedString": "PUNT LOSGEKOPPELT",
|
||||
"SolderingAdvancedPowerPrompt": "Vermogen: ",
|
||||
"OffString": "Uit",
|
||||
"YourGainMessage": "Niveau:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Niveau:",
|
||||
"SettingsResetMessage": "Instellingen zijn\ngereset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"LockingKeysString": " GEBLOKKEERD",
|
||||
"UnlockingKeysString": "GEDEBLOKKEERD",
|
||||
"WarningKeysLockedString": "!GEBLOKKEERD!"
|
||||
"SettingsResetMessage": [
|
||||
"Instellingen",
|
||||
"zijn gereset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": [
|
||||
" GEBLOKKEERD",
|
||||
""
|
||||
],
|
||||
"UnlockingKeysString": [
|
||||
"GEDEBLOKKEERD",
|
||||
""
|
||||
],
|
||||
"WarningKeysLockedString": [
|
||||
"!GEBLOKKEERD!",
|
||||
""
|
||||
]
|
||||
},
|
||||
"characters": {
|
||||
"SettingRightChar": "R",
|
||||
@@ -37,7 +57,7 @@
|
||||
"SettingFastChar": "F",
|
||||
"SettingSlowChar": "S",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +221,6 @@
|
||||
],
|
||||
"desc": "Snelheid waarmee de tekst scrolt."
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Punt",
|
||||
"Model"
|
||||
],
|
||||
"desc": "Punt Model selecteren"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Simpele",
|
||||
"Calibratie"
|
||||
],
|
||||
"desc": "Simpele Calibratie met warm water"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Geavanceerde",
|
||||
"Calibratie"
|
||||
],
|
||||
"desc": "Geavanceerde calibratie met een thermokoppel op de punt"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Power",
|
||||
@@ -264,13 +263,6 @@
|
||||
],
|
||||
"desc": "Vermogen van puls om soldeerbout aan te houden"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Verander",
|
||||
"punt gain"
|
||||
],
|
||||
"desc": "Punt gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "Punt ONTKOPPELD",
|
||||
"SolderingAdvancedPowerPrompt": "Vermogen: ",
|
||||
"OffString": "Uit",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "Settings were\nreset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "S",
|
||||
"SettingSlowChar": "T",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Scrolsnelheid van de tekst."
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Punt",
|
||||
"Model"
|
||||
],
|
||||
"desc": "Gekozen punt"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Eenvoudige",
|
||||
"Calibrering"
|
||||
],
|
||||
"desc": "Calibrering met heet water"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Gevorderde",
|
||||
"Calibrering"
|
||||
],
|
||||
"desc": "Calibrering met thermokoppel"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Vermogen",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Keep awake pulse power intensity"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Tip gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "SPISS FRAKOBLET",
|
||||
"SolderingAdvancedPowerPrompt": "Effekt: ",
|
||||
"OffString": "Av",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "Settings were\nreset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "H",
|
||||
"SettingSlowChar": "L",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "L",
|
||||
"SettingStartSleepChar": "D",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -105,7 +116,7 @@
|
||||
},
|
||||
"SleepTimeout": {
|
||||
"text2": [
|
||||
"",
|
||||
"DTid",
|
||||
""
|
||||
],
|
||||
"desc": "Tid før dvale <Minutter/Sekunder"
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Hastigheten på rulletekst"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Tip",
|
||||
"Model"
|
||||
],
|
||||
"desc": "Tip Model selection"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Simple",
|
||||
"Calibration"
|
||||
],
|
||||
"desc": "Simple Calibration using Hot water"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Advanced",
|
||||
"Calibration"
|
||||
],
|
||||
"desc": "Advanced calibration using thermocouple on the tip"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Power",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Keep awake pulse power intensity"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Tip gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -22,11 +22,22 @@
|
||||
"TipDisconnectedString": "GROT ODŁĄCZONY",
|
||||
"SolderingAdvancedPowerPrompt": "Moc: ",
|
||||
"OffString": "Wył",
|
||||
"YourGainMessage": "Us.zysk:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Us.zysk:",
|
||||
"SettingsResetMessage": "Ust. zresetowane",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Ust. zresetowane",
|
||||
""
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " ZABLOK.",
|
||||
"UnlockingKeysString": "ODBLOK.",
|
||||
"WarningKeysLockedString": "!ZABLOK!"
|
||||
@@ -38,7 +49,7 @@
|
||||
"SettingFastChar": "S",
|
||||
"SettingSlowChar": "W",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "Z",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -202,27 +213,6 @@
|
||||
],
|
||||
"desc": "Szybkość przewijania tekstu"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Model",
|
||||
"grotu"
|
||||
],
|
||||
"desc": "Wybór modelu grotu"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Prosta",
|
||||
"kalibracja"
|
||||
],
|
||||
"desc": "Prosta kalibracja, używając gorącej wody"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Zaawansowana",
|
||||
"kalibracja"
|
||||
],
|
||||
"desc": "Zaawansowana kalibracja za pomocą termopary na grocie"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Moc",
|
||||
@@ -265,13 +255,6 @@
|
||||
],
|
||||
"desc": "W przypadku używania powerbanku, utrzymuj moc na poziomie <W> aby nie uśpić powerbanku"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Zm. zysk",
|
||||
"grotu"
|
||||
],
|
||||
"desc": "Własne ustawienia zysku grotu, celem lepszej kalibracji wysokich temperatur <uV/°C>"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Czułość",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "SEM PONTA",
|
||||
"SolderingAdvancedPowerPrompt": "Power: ",
|
||||
"OffString": "Off",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "Settings were\nreset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "R",
|
||||
"SettingSlowChar": "L",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Velocidade a que o texto é exibido"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Ponta",
|
||||
"Modelo"
|
||||
],
|
||||
"desc": "Selecção de modelo de ponta"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Calibração",
|
||||
"Simples"
|
||||
],
|
||||
"desc": "Calibração simples com água quente"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Calibração",
|
||||
"Avançada"
|
||||
],
|
||||
"desc": "Calibração avançada com um termopar na ponta"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Potência",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Keep awake pulse power intensity"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Tip gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "ЖАЛО ОТСОЕДИНЕНО",
|
||||
"SolderingAdvancedPowerPrompt": "Питание: ",
|
||||
"OffString": "Выкл.",
|
||||
"YourGainMessage": "Прирост:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Сброс OK",
|
||||
"YourGainMessage": "Прирост:",
|
||||
"SettingsResetMessage": "Настройки\nсброшены!",
|
||||
"NoAccelerometerMessage": "Не определен\nакселерометр!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Настройки",
|
||||
"сброшены!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"Не определен",
|
||||
"акселерометр!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "Б",
|
||||
"SettingSlowChar": "М",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "П",
|
||||
"SettingStartSleepChar": "О",
|
||||
"SettingStartSleepOffChar": "К",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Скорость прокрутки текста <М=медленно, Б=быстро>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Модель",
|
||||
"жала"
|
||||
],
|
||||
"desc": "Выбор модели жала"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Упрощенная",
|
||||
"калибровка"
|
||||
],
|
||||
"desc": "Упрощенная калибровка с использованием горячей воды"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Улучшенная",
|
||||
"калибровка"
|
||||
],
|
||||
"desc": "Улучшенная калибровка с импользованием термопары жала"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Мощность",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Сила импульса удерживающего от сна повербанк или другой источник питания"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Изменить",
|
||||
"усиление жала"
|
||||
],
|
||||
"desc": "Усиление жала"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Эффект Холла",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "HROT ODPOJENÝ",
|
||||
"SolderingAdvancedPowerPrompt": "Výkon: ",
|
||||
"OffString": "Vyp",
|
||||
"YourGainMessage": "Zisk:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Zisk:",
|
||||
"SettingsResetMessage": "Tov. nas. obnov.",
|
||||
"NoAccelerometerMessage": "Bez pohyb. senz.",
|
||||
"NoPowerDeliveryMessage": "Chýba čip USB-PD",
|
||||
"SettingsResetMessage": [
|
||||
"Tov. nas. obnov.",
|
||||
""
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"Bez pohyb. senz.",
|
||||
""
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"Chýba čip USB-PD",
|
||||
""
|
||||
],
|
||||
"LockingKeysString": " ZABLOK.",
|
||||
"UnlockingKeysString": "ODBLOK.",
|
||||
"WarningKeysLockedString": "!ZABLOK!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "R",
|
||||
"SettingSlowChar": "P",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"Z",
|
||||
"SettingOffChar": "Z",
|
||||
"SettingStartSolderingChar": "S",
|
||||
"SettingStartSleepChar": "K",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Rýchlosť pohybu tohto textu"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Typ",
|
||||
"hrotu"
|
||||
],
|
||||
"desc": "Zvolenie hrotu"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Zjednodušená",
|
||||
"kalibrácia"
|
||||
],
|
||||
"desc": "Zjednodušená kalibrácia pomocou horúcej vody"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Pokročilá",
|
||||
"kalibrácia"
|
||||
],
|
||||
"desc": "Pokročilá kalibrácia meraním teploty hrotu"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Obmedzenie",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Impulz udržujúci napájací zdroj zapnutý (power banky) <watt>"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Zisk",
|
||||
"hrotu"
|
||||
],
|
||||
"desc": "Úprava zisku hrotu (meranie)"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Citliv.",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "NI KONICE",
|
||||
"SolderingAdvancedPowerPrompt": "Moč: ",
|
||||
"OffString": "Off",
|
||||
"YourGainMessage": "Ojačenje"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Ojačenje",
|
||||
"SettingsResetMessage": "Nastavitve OK!",
|
||||
"NoAccelerometerMessage": "Ni pospeševalnik",
|
||||
"NoPowerDeliveryMessage": "Ni USB-PD čipa!",
|
||||
"SettingsResetMessage": [
|
||||
"Nastavitve OK!",
|
||||
""
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"Ni pospeševalnik",
|
||||
""
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"Ni USB-PD čipa!",
|
||||
""
|
||||
],
|
||||
"LockingKeysString": "ZAKLENJ.",
|
||||
"UnlockingKeysString": "ODKLENJ.",
|
||||
"WarningKeysLockedString": "ZAKLENJ."
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "H",
|
||||
"SettingSlowChar": "P",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"U",
|
||||
"SettingOffChar": "U",
|
||||
"SettingStartSolderingChar": "S",
|
||||
"SettingStartSleepChar": "Z",
|
||||
"SettingStartSleepOffChar": "V",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Hitrost, s katero se prikazuje besedilo <P=počasi | H=hitro>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Tip",
|
||||
"konice"
|
||||
],
|
||||
"desc": "Izbira tipa konice"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Preprosta",
|
||||
"kalibracija"
|
||||
],
|
||||
"desc": "Preprosta kalibracija z vročo vodo."
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Napredna",
|
||||
"kalibracija"
|
||||
],
|
||||
"desc": "Napredna kalibracija s termočlenom na konici"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"QC",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Velikost moči za vzdrževanje budnosti."
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Nastavi",
|
||||
"moč kon."
|
||||
],
|
||||
"desc": "Nastavi moč konice."
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Občut.",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "ВРХ НИЈЕ СПОЈЕН",
|
||||
"SolderingAdvancedPowerPrompt": "Снага: ",
|
||||
"OffString": "Иск",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "Settings were\nreset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "Б",
|
||||
"SettingSlowChar": "С",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Брзина кретања описних порука попут ове. <С=споро, Б=брзо>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Модел",
|
||||
"врха"
|
||||
],
|
||||
"desc": "Одабир модела лемног врха."
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Једноставна",
|
||||
"калибрација"
|
||||
],
|
||||
"desc": "Једноставна калибрација кипућом водом."
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Напредна",
|
||||
"калибрација"
|
||||
],
|
||||
"desc": "Напредна калибрација помоћу термопара."
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Улазна",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Keep awake pulse power intensity"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Tip gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "VRH NIJE SPOJEN",
|
||||
"SolderingAdvancedPowerPrompt": "Snaga: ",
|
||||
"OffString": "Isk",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "Settings were\nreset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "B",
|
||||
"SettingSlowChar": "S",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Brzina kretanja opisnih poruka poput ove. <S=sporo, B=brzo>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Model",
|
||||
"vrha"
|
||||
],
|
||||
"desc": "Odabir modela lemnog vrha."
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Jednostavna",
|
||||
"kalibracija"
|
||||
],
|
||||
"desc": "Jednostavna kalibracija kipućom vodom."
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Napredna",
|
||||
"kalibracija"
|
||||
],
|
||||
"desc": "Napredna kalibracija pomoću termopara."
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Ulazna",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Keep awake pulse power intensity"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Tip gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "SPETS URTAGEN",
|
||||
"SolderingAdvancedPowerPrompt": "Ström: ",
|
||||
"OffString": "Av",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Reset OK",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "Settings were\nreset!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": [
|
||||
"Settings were",
|
||||
"reset!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": " LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "S",
|
||||
"SettingSlowChar": "L",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Hastighet som den här texten rullar i"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Tip",
|
||||
"Model"
|
||||
],
|
||||
"desc": "Tip Model selection"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Simple",
|
||||
"Calibration"
|
||||
],
|
||||
"desc": "Simple Calibration using Hot water"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Advanced",
|
||||
"Calibration"
|
||||
],
|
||||
"desc": "Advanced calibration using thermocouple on the tip"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Power",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Keep awake pulse power intensity"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Tip gain"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,28 @@
|
||||
"TipDisconnectedString": "UÇ ÇIKARILDI",
|
||||
"SolderingAdvancedPowerPrompt": "Güç: ",
|
||||
"OffString": "Kapalı",
|
||||
"ResetOKMessage": "Sıfırlama Tamam",
|
||||
"YourGainMessage": "Kazancınız:",
|
||||
"SettingsResetMessage": "Ayarlar Sıfırlandı",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!"
|
||||
"YourGainMessage": "Kazancınız:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": [
|
||||
"Sıfırlama Tamam",
|
||||
""
|
||||
],
|
||||
"SettingsResetMessage": [
|
||||
"Ayarlar",
|
||||
"Sıfırlandı"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": "LOCKED",
|
||||
"UnlockingKeysString": "UNLOCKED",
|
||||
"WarningKeysLockedString": "!LOCKED!"
|
||||
},
|
||||
"characters": {
|
||||
"SettingRightChar": "R",
|
||||
@@ -34,7 +51,7 @@
|
||||
"SettingFastChar": "F",
|
||||
"SettingSlowChar": "S",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"O",
|
||||
"SettingOffChar": "O",
|
||||
"SettingStartSolderingChar": "T",
|
||||
"SettingStartSleepChar": "S",
|
||||
"SettingStartSleepOffChar": "O",
|
||||
@@ -205,27 +222,6 @@
|
||||
],
|
||||
"desc": "Bu yazının kayma hızı S= Yavaş, F= Hızlı"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Uç",
|
||||
"Modeli"
|
||||
],
|
||||
"desc": "Uç Modeli seçimi"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Basit",
|
||||
"Kalibrasyon"
|
||||
],
|
||||
"desc": "Sıcak su kullanarak basit kalibrasyon"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Gelişmiş",
|
||||
"Kalibrasyon"
|
||||
],
|
||||
"desc": "Uçtaki ısı sensörünü kullanarak gelişmiş kalibrasyon"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"QC",
|
||||
@@ -282,13 +278,6 @@
|
||||
],
|
||||
"desc": "Güç girişi voltajı ölçüm yoğunluğunu sık tut."
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Modify",
|
||||
"tip gain"
|
||||
],
|
||||
"desc": "Kazancınız"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Hall Eff",
|
||||
|
||||
@@ -21,11 +21,22 @@
|
||||
"TipDisconnectedString": "Жало вимкнено!",
|
||||
"SolderingAdvancedPowerPrompt": "Живлення: ",
|
||||
"OffString": "Вимк",
|
||||
"YourGainMessage": "Приріст:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "Скид. OK",
|
||||
"YourGainMessage": "Приріст:",
|
||||
"SettingsResetMessage": "Налаштування\nскинуті!",
|
||||
"NoAccelerometerMessage": "Акселерометр\nне виявлено!",
|
||||
"NoPowerDeliveryMessage": "USB-PD IC\nне виявлено!",
|
||||
"SettingsResetMessage": [
|
||||
"Налаштування",
|
||||
"скинуті!"
|
||||
],
|
||||
"NoAccelerometerMessage": [
|
||||
"Акселерометр",
|
||||
"не виявлено!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"USB-PD IC",
|
||||
"не виявлено!"
|
||||
],
|
||||
"LockingKeysString": " ЗАБЛОК.",
|
||||
"UnlockingKeysString": "РОЗБЛОК.",
|
||||
"WarningKeysLockedString": "!ЗАБЛОК!"
|
||||
@@ -37,7 +48,7 @@
|
||||
"SettingFastChar": "Ш",
|
||||
"SettingSlowChar": "П",
|
||||
"SettingMediumChar": "M",
|
||||
"SettingOffChar":"B",
|
||||
"SettingOffChar": "B",
|
||||
"SettingStartSolderingChar": "П",
|
||||
"SettingStartSleepChar": "О",
|
||||
"SettingStartSleepOffChar": "К",
|
||||
@@ -201,27 +212,6 @@
|
||||
],
|
||||
"desc": "Швидкість прокрутки тексту <П=повільно, Ш=швидко>"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Модель",
|
||||
"жала"
|
||||
],
|
||||
"desc": "Вибір моделі жала"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Просте",
|
||||
"Калібрування"
|
||||
],
|
||||
"desc": "Просте калібрування з використанням гарячої води"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Детальне",
|
||||
"Калібрування"
|
||||
],
|
||||
"desc": "Калібрування за допомогою термопари"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"Потужність",
|
||||
@@ -264,13 +254,6 @@
|
||||
],
|
||||
"desc": "Деякі PowerBank-и з часом вимк. живлення, якщо пристрій споживає дуже мало енергії)"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"Змінити",
|
||||
"підсил. жала"
|
||||
],
|
||||
"desc": "Підсилення жала"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"Чутливість",
|
||||
|
||||
@@ -22,11 +22,19 @@
|
||||
"TipDisconnectedString": "NO TIP",
|
||||
"SolderingAdvancedPowerPrompt": "Power: ",
|
||||
"OffString": "關",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "已重設!",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "\n設定已被重設!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": "設定已被重設!",
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": "已鎖定",
|
||||
"UnlockingKeysString": "已解除鎖定",
|
||||
"WarningKeysLockedString": "!撳掣鎖定!"
|
||||
@@ -38,7 +46,7 @@
|
||||
"SettingFastChar": "快",
|
||||
"SettingSlowChar": "慢",
|
||||
"SettingMediumChar": "中",
|
||||
"SettingOffChar":"關",
|
||||
"SettingOffChar": "關",
|
||||
"SettingStartSolderingChar": "焊",
|
||||
"SettingStartSleepChar": "待",
|
||||
"SettingStartSleepOffChar": "室",
|
||||
@@ -54,271 +62,141 @@
|
||||
},
|
||||
"menuGroups": {
|
||||
"PowerMenu": {
|
||||
"text2": [
|
||||
"",
|
||||
"電源設定"
|
||||
],
|
||||
"text2": "電源設定",
|
||||
"desc": "電源設定"
|
||||
},
|
||||
"SolderingMenu": {
|
||||
"text2": [
|
||||
"",
|
||||
"焊接設定"
|
||||
],
|
||||
"text2": "焊接設定",
|
||||
"desc": "焊接設定"
|
||||
},
|
||||
"PowerSavingMenu": {
|
||||
"text2": [
|
||||
"",
|
||||
"待機設定"
|
||||
],
|
||||
"text2": "待機設定",
|
||||
"desc": "自動待機慳電設定"
|
||||
},
|
||||
"UIMenu": {
|
||||
"text2": [
|
||||
"",
|
||||
"使用者介面"
|
||||
],
|
||||
"text2": "使用者介面",
|
||||
"desc": "使用者介面設定"
|
||||
},
|
||||
"AdvancedMenu": {
|
||||
"text2": [
|
||||
"",
|
||||
"進階設定"
|
||||
],
|
||||
"text2": "進階設定",
|
||||
"desc": "進階設定"
|
||||
}
|
||||
},
|
||||
"menuOptions": {
|
||||
"DCInCutoff": {
|
||||
"text2": [
|
||||
"",
|
||||
"電源"
|
||||
],
|
||||
"text2": "電源",
|
||||
"desc": "輸入電源;設定自動停機電壓 <DC 10V> <S 鋰電池,以每粒3.3V計算;依個設定會停用功率限制>"
|
||||
},
|
||||
"SleepTemperature": {
|
||||
"text2": [
|
||||
"",
|
||||
"待機温度"
|
||||
],
|
||||
"text2": "待機温度",
|
||||
"desc": "喺待機模式時嘅辣雞咀温度"
|
||||
},
|
||||
"SleepTimeout": {
|
||||
"text2": [
|
||||
"",
|
||||
"待機延時"
|
||||
],
|
||||
"text2": "待機延時",
|
||||
"desc": "自動進入待機模式前嘅閒置等候時間 <S=秒 | M=分鐘>"
|
||||
},
|
||||
"ShutdownTimeout": {
|
||||
"text2": [
|
||||
"",
|
||||
"自動熄機"
|
||||
],
|
||||
"text2": "自動熄機",
|
||||
"desc": "自動熄機前嘅閒置等候時間 <M=分鐘>"
|
||||
},
|
||||
"MotionSensitivity": {
|
||||
"text2": [
|
||||
"",
|
||||
"動作敏感度"
|
||||
],
|
||||
"text2": "動作敏感度",
|
||||
"desc": "0=停用 | 1=最低敏感度 | ... | 9=最高敏感度"
|
||||
},
|
||||
"TemperatureUnit": {
|
||||
"text2": [
|
||||
"",
|
||||
"温度單位"
|
||||
],
|
||||
"text2": "温度單位",
|
||||
"desc": "C=攝氏 | F=華氏"
|
||||
},
|
||||
"AdvancedIdle": {
|
||||
"text2": [
|
||||
"",
|
||||
"詳細閒置畫面"
|
||||
],
|
||||
"text2": "詳細閒置畫面",
|
||||
"desc": "喺閒置畫面以英文細字顯示詳細嘅資料"
|
||||
},
|
||||
"DisplayRotation": {
|
||||
"text2": [
|
||||
"",
|
||||
"畫面方向"
|
||||
],
|
||||
"text2": "畫面方向",
|
||||
"desc": "A=自動 | L=使用左手 | R=使用右手"
|
||||
},
|
||||
"BoostTemperature": {
|
||||
"text2": [
|
||||
"",
|
||||
"增熱温度"
|
||||
],
|
||||
"text2": "增熱温度",
|
||||
"desc": "喺增熱模式時使用嘅温度"
|
||||
},
|
||||
"AutoStart": {
|
||||
"text2": [
|
||||
"",
|
||||
"自動啓用"
|
||||
],
|
||||
"text2": "自動啓用",
|
||||
"desc": "開機時自動啓用 <無=停用 | 焊=焊接模式 | 待=待機模式 | 室=室温待機>"
|
||||
},
|
||||
"CooldownBlink": {
|
||||
"text2": [
|
||||
"",
|
||||
"降温時閃爍"
|
||||
],
|
||||
"text2": "降温時閃爍",
|
||||
"desc": "停止加熱之後,當辣雞咀仲係熱嗰陣閃爍畫面"
|
||||
},
|
||||
"TemperatureCalibration": {
|
||||
"text2": [
|
||||
"",
|
||||
"温度校正?"
|
||||
],
|
||||
"text2": "温度校正?",
|
||||
"desc": "開始校正辣雞咀温度位移"
|
||||
},
|
||||
"SettingsReset": {
|
||||
"text2": [
|
||||
"",
|
||||
"全部重設?"
|
||||
],
|
||||
"text2": "全部重設?",
|
||||
"desc": "將所有設定重設到預設值"
|
||||
},
|
||||
"VoltageCalibration": {
|
||||
"text2": [
|
||||
"",
|
||||
"輸入電壓校正?"
|
||||
],
|
||||
"text2": "輸入電壓校正?",
|
||||
"desc": "開始校正VIN輸入電壓 <長撳以退出>"
|
||||
},
|
||||
"AdvancedSoldering": {
|
||||
"text2": [
|
||||
"",
|
||||
"詳細焊接畫面"
|
||||
],
|
||||
"text2": "詳細焊接畫面",
|
||||
"desc": "喺焊接模式畫面以英文細字顯示詳細嘅資料"
|
||||
},
|
||||
"ScrollingSpeed": {
|
||||
"text2": [
|
||||
"",
|
||||
"捲動速度"
|
||||
],
|
||||
"text2": "捲動速度",
|
||||
"desc": "解說文字嘅捲動速度"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Tip",
|
||||
"model"
|
||||
],
|
||||
"desc": "Tip model selection"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Simple",
|
||||
"calibration"
|
||||
],
|
||||
"desc": "Using hot water to calibrate tip"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Advanced",
|
||||
"calibration"
|
||||
],
|
||||
"desc": "Using a thermocouple on the tip to calibrate it"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"",
|
||||
"QC電壓"
|
||||
],
|
||||
"text2": "QC電壓",
|
||||
"desc": "使用QC電源時請求嘅最高目標電壓"
|
||||
},
|
||||
"PowerLimit": {
|
||||
"text2": [
|
||||
"",
|
||||
"功率限制"
|
||||
],
|
||||
"text2": "功率限制",
|
||||
"desc": "限制辣雞可用嘅最大功率 <W=watt(火)>"
|
||||
},
|
||||
"ReverseButtonTempChange": {
|
||||
"text2": [
|
||||
"",
|
||||
"反轉加減掣"
|
||||
],
|
||||
"text2": "反轉加減掣",
|
||||
"desc": "反轉調校温度時加減掣嘅方向"
|
||||
},
|
||||
"TempChangeShortStep": {
|
||||
"text2": [
|
||||
"",
|
||||
"温度調整 短"
|
||||
],
|
||||
"text2": "温度調整 短",
|
||||
"desc": "調校温度時短撳一下嘅温度變幅"
|
||||
},
|
||||
"TempChangeLongStep": {
|
||||
"text2": [
|
||||
"",
|
||||
"温度調整 長"
|
||||
],
|
||||
"text2": "温度調整 長",
|
||||
"desc": "調校温度時長撳嘅温度變幅"
|
||||
},
|
||||
"PowerPulsePower": {
|
||||
"text2": [
|
||||
"",
|
||||
"電源脈衝"
|
||||
],
|
||||
"text2": "電源脈衝",
|
||||
"desc": "為保持電源喚醒而通電所用嘅功率 <watt(火)>"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"",
|
||||
"温度增幅"
|
||||
],
|
||||
"desc": "辣雞咀温度增幅"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"",
|
||||
"磁場敏感度"
|
||||
],
|
||||
"text2": "磁場敏感度",
|
||||
"desc": "磁場感應器用嚟啓動待機模式嘅敏感度 <關=停用 | 低=最低敏感度 | 中=中等敏感度 | 高=最高敏感度>"
|
||||
},
|
||||
"LockingMode": {
|
||||
"text2": [
|
||||
"",
|
||||
"撳掣鎖定"
|
||||
],
|
||||
"text2": "撳掣鎖定",
|
||||
"desc": "喺焊接模式時,同時長撳兩粒掣啓用撳掣鎖定 <無=停用 | 增=鎖定增熱模式 | 全=鎖定全部>"
|
||||
},
|
||||
"MinVolCell": {
|
||||
"text2": [
|
||||
"",
|
||||
"最低電壓"
|
||||
],
|
||||
"text2": "最低電壓",
|
||||
"desc": "每粒電池嘅最低可用電壓 <伏特> <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
|
||||
},
|
||||
"AnimLoop": {
|
||||
"text2": [
|
||||
"",
|
||||
"動畫循環"
|
||||
],
|
||||
"text2": "動畫循環",
|
||||
"desc": "循環顯示功能表圖示動畫"
|
||||
},
|
||||
"AnimSpeed": {
|
||||
"text2": [
|
||||
"",
|
||||
"動畫速度"
|
||||
],
|
||||
"text2": "動畫速度",
|
||||
"desc": "功能表圖示動畫嘅速度 <關=不顯示動畫 | 慢=慢速 | 中=中速 | 快=快速>"
|
||||
},
|
||||
"PowerPulseWait": {
|
||||
"text2": [
|
||||
"",
|
||||
"電源脈衝間隔"
|
||||
],
|
||||
"text2": "電源脈衝間隔",
|
||||
"desc": "為保持電源喚醒,每次通電之間嘅間隔時間 <x2.5s(秒)>"
|
||||
},
|
||||
"PowerPulseDuration": {
|
||||
"text2": [
|
||||
"",
|
||||
"電源脈衝時長"
|
||||
],
|
||||
"text2": "電源脈衝時長",
|
||||
"desc": "為保持電源喚醒,每次通電脈衝嘅時間長度 <x250ms(亳秒)>"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,11 +22,19 @@
|
||||
"TipDisconnectedString": "NO TIP",
|
||||
"SolderingAdvancedPowerPrompt": "Power: ",
|
||||
"OffString": "關",
|
||||
"YourGainMessage": "Your gain:"
|
||||
},
|
||||
"messagesWarn": {
|
||||
"ResetOKMessage": "已重設!",
|
||||
"YourGainMessage": "Your gain:",
|
||||
"SettingsResetMessage": "\n設定已被重設!",
|
||||
"NoAccelerometerMessage": "No accelerometer\ndetected!",
|
||||
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
|
||||
"SettingsResetMessage": "設定已被重設!",
|
||||
"NoAccelerometerMessage": [
|
||||
"No accelerometer",
|
||||
"detected!"
|
||||
],
|
||||
"NoPowerDeliveryMessage": [
|
||||
"No USB-PD IC",
|
||||
"detected!"
|
||||
],
|
||||
"LockingKeysString": "已鎖定",
|
||||
"UnlockingKeysString": "已解除鎖定",
|
||||
"WarningKeysLockedString": "!按鍵鎖定!"
|
||||
@@ -38,7 +46,7 @@
|
||||
"SettingFastChar": "快",
|
||||
"SettingSlowChar": "慢",
|
||||
"SettingMediumChar": "中",
|
||||
"SettingOffChar":"關",
|
||||
"SettingOffChar": "關",
|
||||
"SettingStartSolderingChar": "焊",
|
||||
"SettingStartSleepChar": "待",
|
||||
"SettingStartSleepOffChar": "室",
|
||||
@@ -54,271 +62,141 @@
|
||||
},
|
||||
"menuGroups": {
|
||||
"PowerMenu": {
|
||||
"text2": [
|
||||
"",
|
||||
"電源設定"
|
||||
],
|
||||
"text2": "電源設定",
|
||||
"desc": "電源設定"
|
||||
},
|
||||
"SolderingMenu": {
|
||||
"text2": [
|
||||
"",
|
||||
"焊接設定"
|
||||
],
|
||||
"text2": "焊接設定",
|
||||
"desc": "焊接設定"
|
||||
},
|
||||
"PowerSavingMenu": {
|
||||
"text2": [
|
||||
"",
|
||||
"待機設定"
|
||||
],
|
||||
"text2": "待機設定",
|
||||
"desc": "自動待機省電設定"
|
||||
},
|
||||
"UIMenu": {
|
||||
"text2": [
|
||||
"",
|
||||
"使用者介面"
|
||||
],
|
||||
"text2": "使用者介面",
|
||||
"desc": "使用者介面設定"
|
||||
},
|
||||
"AdvancedMenu": {
|
||||
"text2": [
|
||||
"",
|
||||
"進階設定"
|
||||
],
|
||||
"text2": "進階設定",
|
||||
"desc": "進階設定"
|
||||
}
|
||||
},
|
||||
"menuOptions": {
|
||||
"DCInCutoff": {
|
||||
"text2": [
|
||||
"",
|
||||
"電源"
|
||||
],
|
||||
"text2": "電源",
|
||||
"desc": "輸入電源;設定自動停機電壓 <DC 10V> <S 鋰電池,以每顆3.3V計算;此設定會停用功率限制>"
|
||||
},
|
||||
"SleepTemperature": {
|
||||
"text2": [
|
||||
"",
|
||||
"待機溫度"
|
||||
],
|
||||
"text2": "待機溫度",
|
||||
"desc": "於待機模式時的鉻鐵頭溫度"
|
||||
},
|
||||
"SleepTimeout": {
|
||||
"text2": [
|
||||
"",
|
||||
"待機延時"
|
||||
],
|
||||
"text2": "待機延時",
|
||||
"desc": "自動進入待機模式前的閒置等候時間 <S=秒 | M=分鐘>"
|
||||
},
|
||||
"ShutdownTimeout": {
|
||||
"text2": [
|
||||
"",
|
||||
"自動關機"
|
||||
],
|
||||
"text2": "自動關機",
|
||||
"desc": "自動關機前的閒置等候時間 <M=分鐘>"
|
||||
},
|
||||
"MotionSensitivity": {
|
||||
"text2": [
|
||||
"",
|
||||
"動作敏感度"
|
||||
],
|
||||
"text2": "動作敏感度",
|
||||
"desc": "0=停用 | 1=最低敏感度 | ... | 9=最高敏感度"
|
||||
},
|
||||
"TemperatureUnit": {
|
||||
"text2": [
|
||||
"",
|
||||
"溫標"
|
||||
],
|
||||
"text2": "溫標",
|
||||
"desc": "C=攝氏 | F=華氏"
|
||||
},
|
||||
"AdvancedIdle": {
|
||||
"text2": [
|
||||
"",
|
||||
"詳細閒置畫面"
|
||||
],
|
||||
"text2": "詳細閒置畫面",
|
||||
"desc": "於閒置畫面以英文小字型顯示詳細資料"
|
||||
},
|
||||
"DisplayRotation": {
|
||||
"text2": [
|
||||
"",
|
||||
"畫面方向"
|
||||
],
|
||||
"text2": "畫面方向",
|
||||
"desc": "A=自動 | L=使用左手 | R=使用右手"
|
||||
},
|
||||
"BoostTemperature": {
|
||||
"text2": [
|
||||
"",
|
||||
"增熱溫度"
|
||||
],
|
||||
"text2": "增熱溫度",
|
||||
"desc": "於增熱模式時使用的溫度"
|
||||
},
|
||||
"AutoStart": {
|
||||
"text2": [
|
||||
"",
|
||||
"自動啟用"
|
||||
],
|
||||
"text2": "自動啟用",
|
||||
"desc": "開機時自動啟用 <無=停用 | 焊=焊接模式 | 待=待機模式 | 室=室溫待機>"
|
||||
},
|
||||
"CooldownBlink": {
|
||||
"text2": [
|
||||
"",
|
||||
"降溫時閃爍"
|
||||
],
|
||||
"text2": "降溫時閃爍",
|
||||
"desc": "停止加熱之後,當鉻鐵頭仍處於高溫時閃爍畫面"
|
||||
},
|
||||
"TemperatureCalibration": {
|
||||
"text2": [
|
||||
"",
|
||||
"溫度校正?"
|
||||
],
|
||||
"text2": "溫度校正?",
|
||||
"desc": "開始校正鉻鐵頭溫度位移"
|
||||
},
|
||||
"SettingsReset": {
|
||||
"text2": [
|
||||
"",
|
||||
"全部重設?"
|
||||
],
|
||||
"text2": "全部重設?",
|
||||
"desc": "將所有設定重設到預設值"
|
||||
},
|
||||
"VoltageCalibration": {
|
||||
"text2": [
|
||||
"",
|
||||
"輸入電壓校正?"
|
||||
],
|
||||
"text2": "輸入電壓校正?",
|
||||
"desc": "開始校正VIN輸入電壓 <長按以退出>"
|
||||
},
|
||||
"AdvancedSoldering": {
|
||||
"text2": [
|
||||
"",
|
||||
"詳細焊接畫面"
|
||||
],
|
||||
"text2": "詳細焊接畫面",
|
||||
"desc": "於焊接模式畫面以英文小字型顯示詳細資料"
|
||||
},
|
||||
"ScrollingSpeed": {
|
||||
"text2": [
|
||||
"",
|
||||
"捲動速度"
|
||||
],
|
||||
"text2": "捲動速度",
|
||||
"desc": "解說文字的捲動速度"
|
||||
},
|
||||
"TipModel": {
|
||||
"text2": [
|
||||
"Tip",
|
||||
"model"
|
||||
],
|
||||
"desc": "Tip model selection"
|
||||
},
|
||||
"SimpleCalibrationMode": {
|
||||
"text2": [
|
||||
"Simple",
|
||||
"calibration"
|
||||
],
|
||||
"desc": "Using hot water to calibrate tip"
|
||||
},
|
||||
"AdvancedCalibrationMode": {
|
||||
"text2": [
|
||||
"Advanced",
|
||||
"calibration"
|
||||
],
|
||||
"desc": "Using a thermocouple on the tip to calibrate it"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": [
|
||||
"",
|
||||
"QC電壓"
|
||||
],
|
||||
"text2": "QC電壓",
|
||||
"desc": "使用QC電源時請求的最高目標電壓"
|
||||
},
|
||||
"PowerLimit": {
|
||||
"text2": [
|
||||
"",
|
||||
"功率限制"
|
||||
],
|
||||
"text2": "功率限制",
|
||||
"desc": "限制鉻鐵可用的最大功率 <W=watt(瓦特)>"
|
||||
},
|
||||
"ReverseButtonTempChange": {
|
||||
"text2": [
|
||||
"",
|
||||
"調換加減鍵"
|
||||
],
|
||||
"text2": "調換加減鍵",
|
||||
"desc": "調校溫度時調換加減鍵的方向"
|
||||
},
|
||||
"TempChangeShortStep": {
|
||||
"text2": [
|
||||
"",
|
||||
"溫度調整 短"
|
||||
],
|
||||
"text2": "溫度調整 短",
|
||||
"desc": "調校溫度時短按一下的溫度變幅"
|
||||
},
|
||||
"TempChangeLongStep": {
|
||||
"text2": [
|
||||
"",
|
||||
"溫度調整 長"
|
||||
],
|
||||
"text2": "溫度調整 長",
|
||||
"desc": "調校溫度時長按按鍵的溫度變幅"
|
||||
},
|
||||
"PowerPulsePower": {
|
||||
"text2": [
|
||||
"",
|
||||
"電源脈衝"
|
||||
],
|
||||
"text2": "電源脈衝",
|
||||
"desc": "為保持電源喚醒而通電所用的功率 <watt(瓦特)>"
|
||||
},
|
||||
"TipGain": {
|
||||
"text2": [
|
||||
"",
|
||||
"溫度增幅"
|
||||
],
|
||||
"desc": "鉻鐵頭溫度增幅"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": [
|
||||
"",
|
||||
"磁場敏感度"
|
||||
],
|
||||
"text2": "磁場敏感度",
|
||||
"desc": "磁場感應器用作啟動待機模式的敏感度 <關=停用 | 低=最低敏感度 | 中=中等敏感度 | 高=最高敏感度>"
|
||||
},
|
||||
"LockingMode": {
|
||||
"text2": [
|
||||
"",
|
||||
"按鍵鎖定"
|
||||
],
|
||||
"text2": "按鍵鎖定",
|
||||
"desc": "於焊接模式時,同時長按兩個按鍵啟用按鍵鎖定 <無=停用 | 增=鎖定增熱模式 | 全=鎖定全部>"
|
||||
},
|
||||
"MinVolCell": {
|
||||
"text2": [
|
||||
"",
|
||||
"最低電壓"
|
||||
],
|
||||
"text2": "最低電壓",
|
||||
"desc": "每顆電池的最低可用電壓 <伏特> <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
|
||||
},
|
||||
"AnimLoop": {
|
||||
"text2": [
|
||||
"",
|
||||
"動畫循環"
|
||||
],
|
||||
"text2": "動畫循環",
|
||||
"desc": "循環顯示功能表圖示動畫"
|
||||
},
|
||||
"AnimSpeed": {
|
||||
"text2": [
|
||||
"",
|
||||
"動畫速度"
|
||||
],
|
||||
"text2": "動畫速度",
|
||||
"desc": "功能表圖示動畫的速度 <關=不顯示動畫 | 慢=慢速 | 中=中速 | 快=快速>"
|
||||
},
|
||||
"PowerPulseWait": {
|
||||
"text2": [
|
||||
"",
|
||||
"電源脈衝間隔"
|
||||
],
|
||||
"text2": "電源脈衝間隔",
|
||||
"desc": "為保持電源喚醒,每次通電之間的間隔時間 <x2.5s(秒)>"
|
||||
},
|
||||
"PowerPulseDuration": {
|
||||
"text2": [
|
||||
"",
|
||||
"電源脈衝時長"
|
||||
],
|
||||
"text2": "電源脈衝時長",
|
||||
"desc": "為保持電源喚醒,每次通電脈衝的時間長度 <x250ms(亳秒)>"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,44 +81,33 @@ var def =
|
||||
"id": "OffString",
|
||||
"maxLen": 3
|
||||
},
|
||||
{
|
||||
"id": "ResetOKMessage",
|
||||
"maxLen": 8
|
||||
},
|
||||
{
|
||||
"id": "YourGainMessage",
|
||||
"maxLen": 8,
|
||||
"default": "Your Gain"
|
||||
}
|
||||
],
|
||||
"messagesWarn": [
|
||||
{
|
||||
"id": "ResetOKMessage"
|
||||
},
|
||||
{
|
||||
"id": "SettingsResetMessage",
|
||||
"maxLen": 16,
|
||||
"default": "Settings were\nreset!"
|
||||
"id": "SettingsResetMessage"
|
||||
},
|
||||
{
|
||||
"id": "NoAccelerometerMessage",
|
||||
"maxLen": 16,
|
||||
"default": "No accelerometer\ndetected!"
|
||||
"id": "NoAccelerometerMessage"
|
||||
},
|
||||
{
|
||||
"id": "NoPowerDeliveryMessage",
|
||||
"maxLen": 16,
|
||||
"default": "No USB-PD IC\ndetected!"
|
||||
"id": "NoPowerDeliveryMessage"
|
||||
},
|
||||
{
|
||||
"id": "LockingKeysString",
|
||||
"maxLen": 8,
|
||||
"default": "LOCKING"
|
||||
"id": "LockingKeysString"
|
||||
},
|
||||
{
|
||||
"id": "UnlockingKeysString",
|
||||
"maxLen": 8,
|
||||
"default": "UNLOCK"
|
||||
"id": "UnlockingKeysString"
|
||||
},
|
||||
{
|
||||
"id": "WarningKeysLockedString",
|
||||
"maxLen": 8,
|
||||
"default": "LOCKED!"
|
||||
"id": "WarningKeysLockedString"
|
||||
}
|
||||
],
|
||||
"characters": [
|
||||
@@ -206,23 +195,28 @@ var def =
|
||||
"menuGroups": [
|
||||
{
|
||||
"id": "PowerMenu",
|
||||
"maxLen": 11
|
||||
"maxLen": 5,
|
||||
"maxLen2": 11
|
||||
},
|
||||
{
|
||||
"id": "SolderingMenu",
|
||||
"maxLen": 11
|
||||
"maxLen": 5,
|
||||
"maxLen2": 11
|
||||
},
|
||||
{
|
||||
"id": "PowerSavingMenu",
|
||||
"maxLen": 11
|
||||
"maxLen": 5,
|
||||
"maxLen2": 11
|
||||
},
|
||||
{
|
||||
"id": "UIMenu",
|
||||
"maxLen": 11
|
||||
"maxLen": 5,
|
||||
"maxLen2": 11
|
||||
},
|
||||
{
|
||||
"id": "AdvancedMenu",
|
||||
"maxLen": 11
|
||||
"maxLen": 5,
|
||||
"maxLen2": 11
|
||||
}
|
||||
],
|
||||
"menuOptions": [
|
||||
@@ -306,21 +300,6 @@ var def =
|
||||
"maxLen": 6,
|
||||
"maxLen2": 11
|
||||
},
|
||||
{
|
||||
"id": "TipModel",
|
||||
"maxLen": 8,
|
||||
"maxLen2": 16
|
||||
},
|
||||
{
|
||||
"id": "SimpleCalibrationMode",
|
||||
"maxLen": 8,
|
||||
"maxLen2": 16
|
||||
},
|
||||
{
|
||||
"id": "AdvancedCalibrationMode",
|
||||
"maxLen": 8,
|
||||
"maxLen2": 16
|
||||
},
|
||||
{
|
||||
"id": "QCMaxVoltage",
|
||||
"maxLen": 8,
|
||||
@@ -351,11 +330,6 @@ var def =
|
||||
"maxLen": 6,
|
||||
"maxLen2": 16
|
||||
},
|
||||
{
|
||||
"id": "TipGain",
|
||||
"maxLen": 6,
|
||||
"maxLen2": 8
|
||||
},
|
||||
{
|
||||
"id": "HallEffSensitivity",
|
||||
"maxLen": 6,
|
||||
|
||||
@@ -267,6 +267,26 @@ void OLED::print(const char *const str, FontStyle fontStyle) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a static string message designed to use the whole screen, starting
|
||||
* from the top-left corner.
|
||||
*
|
||||
* If the message starts with a newline (`\\x01`), the string starting from
|
||||
* after the newline is printed in the large font. Otherwise, the message
|
||||
* is printed in the small font.
|
||||
*
|
||||
* @param string The string message to be printed
|
||||
*/
|
||||
void OLED::printWholeScreen(const char *string) {
|
||||
setCursor(0, 0);
|
||||
if (string[0] == '\x01') {
|
||||
// Empty first line means that this uses large font (for CJK).
|
||||
OLED::print(string + 1, FontStyle::LARGE);
|
||||
} else {
|
||||
OLED::print(string, FontStyle::SMALL);
|
||||
}
|
||||
}
|
||||
|
||||
inline void stripLeaderZeros(char *buffer, uint8_t places) {
|
||||
// Removing the leading zero's by swapping them to SymbolSpace
|
||||
// Stop 1 short so that we dont blank entire number if its zero
|
||||
|
||||
@@ -55,6 +55,7 @@ public:
|
||||
static bool getRotation() { return inLeftHandedMode; }
|
||||
static int16_t getCursorX() { return cursor_x; }
|
||||
static void print(const char *string, FontStyle fontStyle); // Draw a string to the current location, with selected font
|
||||
static void printWholeScreen(const char *string);
|
||||
// Set the cursor location by pixels
|
||||
static void setCursor(int16_t x, int16_t y) {
|
||||
cursor_x = x;
|
||||
|
||||
@@ -12,9 +12,9 @@ extern const uint8_t USER_FONT_12[];
|
||||
extern const uint8_t USER_FONT_6x8[];
|
||||
extern const bool HasFahrenheit;
|
||||
|
||||
extern const char *SettingsShortNames[33][2];
|
||||
extern const char *SettingsDescriptions[33];
|
||||
extern const char *SettingsMenuEntries[5];
|
||||
extern const char *SettingsShortNames[];
|
||||
extern const char *SettingsDescriptions[];
|
||||
extern const char *SettingsMenuEntries[];
|
||||
|
||||
extern const char *SettingsCalibrationDone;
|
||||
extern const char *SettingsCalibrationWarning;
|
||||
@@ -35,8 +35,9 @@ extern const char *IdleSetString;
|
||||
extern const char *TipDisconnectedString;
|
||||
extern const char *SolderingAdvancedPowerPrompt;
|
||||
extern const char *OffString;
|
||||
extern const char *ResetOKMessage;
|
||||
extern const char *YourGainMessage;
|
||||
|
||||
extern const char *ResetOKMessage;
|
||||
extern const char *SettingsResetMessage;
|
||||
extern const char *NoAccelerometerMessage;
|
||||
extern const char *NoPowerDeliveryMessage;
|
||||
@@ -81,4 +82,41 @@ extern const char *SymbolCellCount;
|
||||
extern const char *SymbolVersionNumber;
|
||||
|
||||
extern const char *DebugMenu[];
|
||||
|
||||
enum class SettingsItemIndex : uint8_t {
|
||||
DCInCutoff,
|
||||
SleepTemperature,
|
||||
SleepTimeout,
|
||||
ShutdownTimeout,
|
||||
MotionSensitivity,
|
||||
TemperatureUnit,
|
||||
AdvancedIdle,
|
||||
DisplayRotation,
|
||||
BoostTemperature,
|
||||
AutoStart,
|
||||
CooldownBlink,
|
||||
TemperatureCalibration,
|
||||
SettingsReset,
|
||||
VoltageCalibration,
|
||||
AdvancedSoldering,
|
||||
ScrollingSpeed,
|
||||
QCMaxVoltage,
|
||||
PowerLimit,
|
||||
ReverseButtonTempChange,
|
||||
TempChangeShortStep,
|
||||
TempChangeLongStep,
|
||||
PowerPulsePower,
|
||||
HallEffSensitivity,
|
||||
LockingMode,
|
||||
MinVolCell,
|
||||
AnimLoop,
|
||||
AnimSpeed,
|
||||
PowerPulseWait,
|
||||
PowerPulseDuration,
|
||||
};
|
||||
|
||||
constexpr uint8_t settings_item_index(const SettingsItemIndex i) { return static_cast<uint8_t>(i); }
|
||||
// Use a constexpr function for type-checking.
|
||||
#define SETTINGS_DESC(i) (SettingsDescriptions[settings_item_index(i)])
|
||||
|
||||
#endif /* TRANSLATION_H_ */
|
||||
|
||||
@@ -29,6 +29,7 @@ typedef struct {
|
||||
|
||||
void enterSettingsMenu();
|
||||
void GUIDelay();
|
||||
void warnUser(const char *warning, const int timeout);
|
||||
extern const menuitem rootSettingsMenu[];
|
||||
|
||||
#endif /* GUI_HPP_ */
|
||||
|
||||
@@ -57,8 +57,6 @@ static bool settings_setResetSettings(void);
|
||||
static bool settings_displayResetSettings(void);
|
||||
static bool settings_setCalibrate(void);
|
||||
static bool settings_displayCalibrate(void);
|
||||
// static bool settings_setTipGain(void);
|
||||
// static bool settings_displayTipGain(void);
|
||||
static bool settings_setCalibrateVIN(void);
|
||||
static bool settings_displayCalibrateVIN(void);
|
||||
static bool settings_displayReverseButtonTempChangeEnabled(void);
|
||||
@@ -141,12 +139,12 @@ const menuitem rootSettingsMenu[]{
|
||||
* Advanced Menu
|
||||
* Exit
|
||||
*/
|
||||
{(const char *)NULL, settings_enterPowerMenu, settings_displayPowerMenu}, /*Power*/
|
||||
{(const char *)NULL, settings_enterSolderingMenu, settings_displaySolderingMenu}, /*Soldering*/
|
||||
{(const char *)NULL, settings_enterPowerSavingMenu, settings_displayPowerSavingMenu}, /*Sleep Options Menu*/
|
||||
{(const char *)NULL, settings_enterUIMenu, settings_displayUIMenu}, /*UI Menu*/
|
||||
{(const char *)NULL, settings_enterAdvancedMenu, settings_displayAdvancedMenu}, /*Advanced Menu*/
|
||||
{NULL, NULL, NULL} // end of menu marker. DO NOT REMOVE
|
||||
{nullptr, settings_enterPowerMenu, settings_displayPowerMenu}, /*Power*/
|
||||
{nullptr, settings_enterSolderingMenu, settings_displaySolderingMenu}, /*Soldering*/
|
||||
{nullptr, settings_enterPowerSavingMenu, settings_displayPowerSavingMenu}, /*Sleep Options Menu*/
|
||||
{nullptr, settings_enterUIMenu, settings_displayUIMenu}, /*UI Menu*/
|
||||
{nullptr, settings_enterAdvancedMenu, settings_displayAdvancedMenu}, /*Advanced Menu*/
|
||||
{nullptr, nullptr, nullptr} // end of menu marker. DO NOT REMOVE
|
||||
};
|
||||
|
||||
const menuitem powerMenu[] = {
|
||||
@@ -154,13 +152,13 @@ const menuitem powerMenu[] = {
|
||||
* Power Source
|
||||
*/
|
||||
#ifdef POW_DC
|
||||
{(const char *)SettingsDescriptions[0], settings_setInputVRange, settings_displayInputVRange}, /*Voltage input*/
|
||||
{(const char *)SettingsDescriptions[28], settings_setInputMinVRange, settings_displayInputMinVRange}, /*Minimum voltage input*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::DCInCutoff), settings_setInputVRange, settings_displayInputVRange}, /*Voltage input*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::MinVolCell), settings_setInputMinVRange, settings_displayInputMinVRange}, /*Minimum voltage input*/
|
||||
#endif
|
||||
#ifdef POW_QC
|
||||
{(const char *)SettingsDescriptions[19], settings_setQCInputV, settings_displayQCInputV}, /*Voltage input*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::QCMaxVoltage), settings_setQCInputV, settings_displayQCInputV}, /*Voltage input*/
|
||||
#endif
|
||||
{NULL, NULL, NULL} // end of menu marker. DO NOT REMOVE
|
||||
{nullptr, nullptr, nullptr} // end of menu marker. DO NOT REMOVE
|
||||
};
|
||||
const menuitem solderingMenu[] = {
|
||||
/*
|
||||
@@ -170,12 +168,12 @@ const menuitem solderingMenu[] = {
|
||||
* Temp change short step
|
||||
* Temp change long step
|
||||
*/
|
||||
{(const char *)SettingsDescriptions[8], settings_setBoostTemp, settings_displayBoostTemp}, /*Boost Temp*/
|
||||
{(const char *)SettingsDescriptions[9], settings_setAutomaticStartMode, settings_displayAutomaticStartMode}, /*Auto start*/
|
||||
{(const char *)SettingsDescriptions[22], settings_setTempChangeShortStep, settings_displayTempChangeShortStep}, /*Temp change short step*/
|
||||
{(const char *)SettingsDescriptions[23], settings_setTempChangeLongStep, settings_displayTempChangeLongStep}, /*Temp change long step*/
|
||||
{(const char *)SettingsDescriptions[27], settings_setLockingMode, settings_displayLockingMode}, /*Locking Mode*/
|
||||
{NULL, NULL, NULL} // end of menu marker. DO NOT REMOVE
|
||||
{SETTINGS_DESC(SettingsItemIndex::BoostTemperature), settings_setBoostTemp, settings_displayBoostTemp}, /*Boost Temp*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::AutoStart), settings_setAutomaticStartMode, settings_displayAutomaticStartMode}, /*Auto start*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::TempChangeShortStep), settings_setTempChangeShortStep, settings_displayTempChangeShortStep}, /*Temp change short step*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::TempChangeLongStep), settings_setTempChangeLongStep, settings_displayTempChangeLongStep}, /*Temp change long step*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::LockingMode), settings_setLockingMode, settings_displayLockingMode}, /*Locking Mode*/
|
||||
{nullptr, nullptr, nullptr} // end of menu marker. DO NOT REMOVE
|
||||
};
|
||||
const menuitem UIMenu[] = {
|
||||
/*
|
||||
@@ -186,15 +184,15 @@ const menuitem UIMenu[] = {
|
||||
* Cooldown blink
|
||||
* Reverse Temp change buttons + -
|
||||
*/
|
||||
{(const char *)SettingsDescriptions[5], settings_setTempF,
|
||||
{SETTINGS_DESC(SettingsItemIndex::TemperatureUnit), settings_setTempF,
|
||||
settings_displayTempF}, /* Temperature units, this has to be the first element in the array to work with the logic in settings_enterUIMenu() */
|
||||
{(const char *)SettingsDescriptions[7], settings_setDisplayRotation, settings_displayDisplayRotation}, /*Display Rotation*/
|
||||
{(const char *)SettingsDescriptions[10], settings_setCoolingBlinkEnabled, settings_displayCoolingBlinkEnabled}, /*Cooling blink warning*/
|
||||
{(const char *)SettingsDescriptions[15], settings_setScrollSpeed, settings_displayScrollSpeed}, /*Scroll Speed for descriptions*/
|
||||
{(const char *)SettingsDescriptions[21], settings_setReverseButtonTempChangeEnabled, settings_displayReverseButtonTempChangeEnabled}, /* Reverse Temp change buttons + - */
|
||||
{(const char *)SettingsDescriptions[30], settings_setAnimationSpeed, settings_displayAnimationSpeed}, /*Animation Speed adjustment */
|
||||
{(const char *)SettingsDescriptions[29], settings_setAnimationLoop, settings_displayAnimationLoop}, /*Animation Loop switch */
|
||||
{NULL, NULL, NULL} // end of menu marker. DO NOT REMOVE
|
||||
{SETTINGS_DESC(SettingsItemIndex::DisplayRotation), settings_setDisplayRotation, settings_displayDisplayRotation}, /*Display Rotation*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::CooldownBlink), settings_setCoolingBlinkEnabled, settings_displayCoolingBlinkEnabled}, /*Cooling blink warning*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::ScrollingSpeed), settings_setScrollSpeed, settings_displayScrollSpeed}, /*Scroll Speed for descriptions*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::ReverseButtonTempChange), settings_setReverseButtonTempChangeEnabled, settings_displayReverseButtonTempChangeEnabled}, /* Reverse Temp change buttons + - */
|
||||
{SETTINGS_DESC(SettingsItemIndex::AnimSpeed), settings_setAnimationSpeed, settings_displayAnimationSpeed}, /*Animation Speed adjustment */
|
||||
{SETTINGS_DESC(SettingsItemIndex::AnimLoop), settings_setAnimationLoop, settings_displayAnimationLoop}, /*Animation Loop switch */
|
||||
{nullptr, nullptr, nullptr} // end of menu marker. DO NOT REMOVE
|
||||
};
|
||||
const menuitem PowerSavingMenu[] = {
|
||||
/*
|
||||
@@ -203,14 +201,14 @@ const menuitem PowerSavingMenu[] = {
|
||||
* Shutdown Time
|
||||
* Motion Sensitivity
|
||||
*/
|
||||
{(const char *)SettingsDescriptions[1], settings_setSleepTemp, settings_displaySleepTemp}, /*Sleep Temp*/
|
||||
{(const char *)SettingsDescriptions[2], settings_setSleepTime, settings_displaySleepTime}, /*Sleep Time*/
|
||||
{(const char *)SettingsDescriptions[3], settings_setShutdownTime, settings_displayShutdownTime}, /*Shutdown Time*/
|
||||
{(const char *)SettingsDescriptions[4], settings_setSensitivity, settings_displaySensitivity}, /* Motion Sensitivity*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::SleepTemperature), settings_setSleepTemp, settings_displaySleepTemp}, /*Sleep Temp*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::SleepTimeout), settings_setSleepTime, settings_displaySleepTime}, /*Sleep Time*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::ShutdownTimeout), settings_setShutdownTime, settings_displayShutdownTime}, /*Shutdown Time*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::MotionSensitivity), settings_setSensitivity, settings_displaySensitivity}, /* Motion Sensitivity*/
|
||||
#ifdef HALL_SENSOR
|
||||
{(const char *)SettingsDescriptions[26], settings_setHallEffect, settings_displayHallEffect}, /* HallEffect Sensitivity*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::HallEffSensitivity), settings_setHallEffect, settings_displayHallEffect}, /* HallEffect Sensitivity*/
|
||||
#endif
|
||||
{NULL, NULL, NULL} // end of menu marker. DO NOT REMOVE
|
||||
{nullptr, nullptr, nullptr} // end of menu marker. DO NOT REMOVE
|
||||
};
|
||||
const menuitem advancedMenu[] = {
|
||||
|
||||
@@ -227,42 +225,29 @@ const menuitem advancedMenu[] = {
|
||||
* Power Pulse Wait
|
||||
* Power Pulse Duration
|
||||
*/
|
||||
{(const char *)SettingsDescriptions[20], settings_setPowerLimit, settings_displayPowerLimit}, /*Power limit*/
|
||||
{(const char *)SettingsDescriptions[6], settings_setAdvancedIDLEScreens, settings_displayAdvancedIDLEScreens}, /* Advanced idle screen*/
|
||||
{(const char *)SettingsDescriptions[14], settings_setAdvancedSolderingScreens, settings_displayAdvancedSolderingScreens}, /* Advanced soldering screen*/
|
||||
{(const char *)SettingsDescriptions[12], settings_setResetSettings, settings_displayResetSettings}, /*Resets settings*/
|
||||
{(const char *)SettingsDescriptions[11], settings_setCalibrate, settings_displayCalibrate}, /*Calibrate tip*/
|
||||
{(const char *)SettingsDescriptions[13], settings_setCalibrateVIN, settings_displayCalibrateVIN}, /*Voltage input cal*/
|
||||
{(const char *)SettingsDescriptions[24], settings_setPowerPulse, settings_displayPowerPulse}, /*Power Pulse adjustment */
|
||||
{(const char *)SettingsDescriptions[31], settings_setPowerPulseWait, settings_displayPowerPulseWait}, /*Power Pulse Wait adjustment*/
|
||||
{(const char *)SettingsDescriptions[32], settings_setPowerPulseDuration, settings_displayPowerPulseDuration}, /*Power Pulse Duration adjustment*/
|
||||
//{ (const char *) SettingsDescriptions[25], settings_setTipGain, settings_displayTipGain }, /*TipGain*/
|
||||
{NULL, NULL, NULL} // end of menu marker. DO NOT REMOVE
|
||||
{SETTINGS_DESC(SettingsItemIndex::PowerLimit), settings_setPowerLimit, settings_displayPowerLimit}, /*Power limit*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::AdvancedIdle), settings_setAdvancedIDLEScreens, settings_displayAdvancedIDLEScreens}, /* Advanced idle screen*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::AdvancedSoldering), settings_setAdvancedSolderingScreens, settings_displayAdvancedSolderingScreens}, /* Advanced soldering screen*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::SettingsReset), settings_setResetSettings, settings_displayResetSettings}, /*Resets settings*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::TemperatureCalibration), settings_setCalibrate, settings_displayCalibrate}, /*Calibrate tip*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::VoltageCalibration), settings_setCalibrateVIN, settings_displayCalibrateVIN}, /*Voltage input cal*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::PowerPulsePower), settings_setPowerPulse, settings_displayPowerPulse}, /*Power Pulse adjustment */
|
||||
{SETTINGS_DESC(SettingsItemIndex::PowerPulseWait), settings_setPowerPulseWait, settings_displayPowerPulseWait}, /*Power Pulse Wait adjustment*/
|
||||
{SETTINGS_DESC(SettingsItemIndex::PowerPulseDuration), settings_setPowerPulseDuration, settings_displayPowerPulseDuration}, /*Power Pulse Duration adjustment*/
|
||||
{nullptr, nullptr, nullptr} // end of menu marker. DO NOT REMOVE
|
||||
};
|
||||
|
||||
static void printShortDescriptionDoubleLine(uint32_t shortDescIndex) {
|
||||
if (SettingsShortNames[shortDescIndex][0][0] == '\x00') {
|
||||
// Empty first line means that this uses large font (for CJK).
|
||||
OLED::setCursor(0, 0);
|
||||
OLED::print(SettingsShortNames[shortDescIndex][1], FontStyle::LARGE);
|
||||
} else {
|
||||
OLED::setCursor(0, 0);
|
||||
OLED::print(SettingsShortNames[shortDescIndex][0], FontStyle::SMALL);
|
||||
OLED::setCursor(0, 8);
|
||||
OLED::print(SettingsShortNames[shortDescIndex][1], FontStyle::SMALL);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints two small lines (or one line for CJK) of short description
|
||||
* and prepares cursor in big font after it.
|
||||
* @param shortDescIndex Index to of short description.
|
||||
* Prints two small lines (or one line for CJK) of short description for
|
||||
* setting items and prepares cursor after it.
|
||||
* @param settingsItemIndex Index of the setting item.
|
||||
* @param cursorCharPosition Custom cursor char position to set after printing
|
||||
* description.
|
||||
*/
|
||||
static void printShortDescription(uint32_t shortDescIndex, uint16_t cursorCharPosition) {
|
||||
static void printShortDescription(SettingsItemIndex settingsItemIndex, uint16_t cursorCharPosition) {
|
||||
// print short description (default single line, explicit double line)
|
||||
printShortDescriptionDoubleLine(shortDescIndex);
|
||||
uint8_t shortDescIndex = static_cast<uint8_t>(settingsItemIndex);
|
||||
OLED::printWholeScreen(SettingsShortNames[shortDescIndex]);
|
||||
|
||||
// prepare cursor for value
|
||||
// make room for scroll indicator
|
||||
@@ -349,7 +334,7 @@ static bool settings_setInputVRange(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayInputVRange(void) {
|
||||
printShortDescription(0, 6);
|
||||
printShortDescription(SettingsItemIndex::DCInCutoff, 6);
|
||||
|
||||
if (systemSettings.minDCVoltageCells) {
|
||||
OLED::printNumber(2 + systemSettings.minDCVoltageCells, 1, FontStyle::LARGE);
|
||||
@@ -371,12 +356,12 @@ static bool settings_setInputMinVRange(void) {
|
||||
|
||||
static bool settings_displayInputMinVRange(void) {
|
||||
if (systemSettings.minDCVoltageCells) {
|
||||
printShortDescription(28, 4);
|
||||
printShortDescription(SettingsItemIndex::MinVolCell, 4);
|
||||
OLED::printNumber(systemSettings.minVoltageCells / 10, 2, FontStyle::LARGE);
|
||||
OLED::print(SymbolDot, FontStyle::LARGE);
|
||||
OLED::printNumber(systemSettings.minVoltageCells % 10, 1, FontStyle::LARGE);
|
||||
} else {
|
||||
printShortDescription(28, 5);
|
||||
printShortDescription(SettingsItemIndex::MinVolCell, 5);
|
||||
OLED::print(SettingNAChar, FontStyle::LARGE);
|
||||
}
|
||||
return false;
|
||||
@@ -394,7 +379,7 @@ static bool settings_setQCInputV(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayQCInputV(void) {
|
||||
printShortDescription(19, 5);
|
||||
printShortDescription(SettingsItemIndex::QCMaxVoltage, 5);
|
||||
// 0 = 9V, 1=12V, 2=20V (Fixed Voltages)
|
||||
// These are only used in QC modes
|
||||
switch (systemSettings.QCIdealVoltage) {
|
||||
@@ -433,7 +418,7 @@ static bool settings_setSleepTemp(void) {
|
||||
}
|
||||
|
||||
static bool settings_displaySleepTemp(void) {
|
||||
printShortDescription(1, 5);
|
||||
printShortDescription(SettingsItemIndex::SleepTemperature, 5);
|
||||
OLED::printNumber(systemSettings.SleepTemp, 3, FontStyle::LARGE);
|
||||
return false;
|
||||
}
|
||||
@@ -450,7 +435,7 @@ static bool settings_setSleepTime(void) {
|
||||
}
|
||||
|
||||
static bool settings_displaySleepTime(void) {
|
||||
printShortDescription(2, 5);
|
||||
printShortDescription(SettingsItemIndex::SleepTimeout, 5);
|
||||
if (systemSettings.SleepTime == 0) {
|
||||
OLED::print(OffString, FontStyle::LARGE);
|
||||
} else if (systemSettings.SleepTime < 6) {
|
||||
@@ -474,7 +459,7 @@ static bool settings_setShutdownTime(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayShutdownTime(void) {
|
||||
printShortDescription(3, 5);
|
||||
printShortDescription(SettingsItemIndex::ShutdownTimeout, 5);
|
||||
if (systemSettings.ShutdownTime == 0) {
|
||||
OLED::print(OffString, FontStyle::LARGE);
|
||||
} else {
|
||||
@@ -509,7 +494,7 @@ static bool settings_setTempF(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayTempF(void) {
|
||||
printShortDescription(5, 7);
|
||||
printShortDescription(SettingsItemIndex::TemperatureUnit, 7);
|
||||
|
||||
OLED::print((systemSettings.temperatureInF) ? SymbolDegF : SymbolDegC, FontStyle::LARGE);
|
||||
return false;
|
||||
@@ -522,7 +507,7 @@ static bool settings_setSensitivity(void) {
|
||||
}
|
||||
|
||||
static bool settings_displaySensitivity(void) {
|
||||
printShortDescription(4, 7);
|
||||
printShortDescription(SettingsItemIndex::MotionSensitivity, 7);
|
||||
OLED::printNumber(systemSettings.sensitivity, 1, FontStyle::LARGE, false);
|
||||
return false;
|
||||
}
|
||||
@@ -533,7 +518,7 @@ static bool settings_setAdvancedSolderingScreens(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayAdvancedSolderingScreens(void) {
|
||||
printShortDescription(14, 7);
|
||||
printShortDescription(SettingsItemIndex::AdvancedSoldering, 7);
|
||||
|
||||
OLED::drawCheckbox(systemSettings.detailedSoldering);
|
||||
return false;
|
||||
@@ -545,7 +530,7 @@ static bool settings_setAdvancedIDLEScreens(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayAdvancedIDLEScreens(void) {
|
||||
printShortDescription(6, 7);
|
||||
printShortDescription(SettingsItemIndex::AdvancedIdle, 7);
|
||||
|
||||
OLED::drawCheckbox(systemSettings.detailedIDLE);
|
||||
return false;
|
||||
@@ -559,7 +544,7 @@ static bool settings_setPowerLimit(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayPowerLimit(void) {
|
||||
printShortDescription(20, 5);
|
||||
printShortDescription(SettingsItemIndex::PowerLimit, 5);
|
||||
if (systemSettings.powerLimit == 0) {
|
||||
OLED::print(OffString, FontStyle::LARGE);
|
||||
} else {
|
||||
@@ -578,7 +563,7 @@ static bool settings_setScrollSpeed(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayScrollSpeed(void) {
|
||||
printShortDescription(15, 7);
|
||||
printShortDescription(SettingsItemIndex::ScrollingSpeed, 7);
|
||||
OLED::print((systemSettings.descriptionScrollSpeed) ? SettingFastChar : SettingSlowChar, FontStyle::LARGE);
|
||||
return false;
|
||||
}
|
||||
@@ -603,7 +588,7 @@ static bool settings_setDisplayRotation(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayDisplayRotation(void) {
|
||||
printShortDescription(7, 7);
|
||||
printShortDescription(SettingsItemIndex::DisplayRotation, 7);
|
||||
|
||||
switch (systemSettings.OrientationMode) {
|
||||
case 0:
|
||||
@@ -648,7 +633,7 @@ static bool settings_setBoostTemp(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayBoostTemp(void) {
|
||||
printShortDescription(8, 5);
|
||||
printShortDescription(SettingsItemIndex::BoostTemperature, 5);
|
||||
if (systemSettings.BoostTemp) {
|
||||
OLED::printNumber(systemSettings.BoostTemp, 3, FontStyle::LARGE);
|
||||
} else {
|
||||
@@ -664,7 +649,7 @@ static bool settings_setAutomaticStartMode(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayAutomaticStartMode(void) {
|
||||
printShortDescription(9, 7);
|
||||
printShortDescription(SettingsItemIndex::AutoStart, 7);
|
||||
|
||||
switch (systemSettings.autoStartMode) {
|
||||
case 0:
|
||||
@@ -693,7 +678,7 @@ static bool settings_setLockingMode(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayLockingMode(void) {
|
||||
printShortDescription(27, 7);
|
||||
printShortDescription(SettingsItemIndex::LockingMode, 7);
|
||||
|
||||
switch (systemSettings.lockingMode) {
|
||||
case 0:
|
||||
@@ -718,7 +703,7 @@ static bool settings_setCoolingBlinkEnabled(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayCoolingBlinkEnabled(void) {
|
||||
printShortDescription(10, 7);
|
||||
printShortDescription(SettingsItemIndex::CooldownBlink, 7);
|
||||
OLED::drawCheckbox(systemSettings.coolingTempBlink);
|
||||
return false;
|
||||
}
|
||||
@@ -726,19 +711,13 @@ static bool settings_displayCoolingBlinkEnabled(void) {
|
||||
static bool settings_setResetSettings(void) {
|
||||
if (userConfirmation(SettingsResetWarning)) {
|
||||
resetSettings();
|
||||
|
||||
OLED::clearScreen();
|
||||
OLED::setCursor(0, 0);
|
||||
OLED::print(ResetOKMessage, FontStyle::LARGE);
|
||||
OLED::refresh();
|
||||
|
||||
waitForButtonPressOrTimeout(2000); // 2 second timeout
|
||||
warnUser(ResetOKMessage, 2 * TICKS_SECOND);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool settings_displayResetSettings(void) {
|
||||
printShortDescription(12, 7);
|
||||
printShortDescription(SettingsItemIndex::SettingsReset, 7);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -784,7 +763,7 @@ static bool settings_setCalibrate(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayCalibrate(void) {
|
||||
printShortDescription(11, 5);
|
||||
printShortDescription(SettingsItemIndex::TemperatureCalibration, 5);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -816,7 +795,7 @@ static bool settings_setCalibrateVIN(void) {
|
||||
OLED::setCursor(0, 0);
|
||||
OLED::printNumber(systemSettings.voltageDiv, 3, FontStyle::LARGE);
|
||||
OLED::refresh();
|
||||
waitForButtonPressOrTimeout(1000);
|
||||
waitForButtonPressOrTimeout(1 * TICKS_SECOND);
|
||||
return false;
|
||||
case BUTTON_NONE:
|
||||
default:
|
||||
@@ -850,7 +829,7 @@ static bool settings_setReverseButtonTempChangeEnabled(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayReverseButtonTempChangeEnabled(void) {
|
||||
printShortDescription(21, 7);
|
||||
printShortDescription(SettingsItemIndex::ReverseButtonTempChange, 7);
|
||||
OLED::drawCheckbox(systemSettings.ReverseButtonTempChangeEnabled);
|
||||
return false;
|
||||
}
|
||||
@@ -864,7 +843,7 @@ static bool settings_setTempChangeShortStep(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayTempChangeShortStep(void) {
|
||||
printShortDescription(22, 6);
|
||||
printShortDescription(SettingsItemIndex::TempChangeShortStep, 6);
|
||||
OLED::printNumber(systemSettings.TempChangeShortStep, 2, FontStyle::LARGE);
|
||||
return false;
|
||||
}
|
||||
@@ -884,7 +863,7 @@ static bool settings_setTempChangeLongStep(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayTempChangeLongStep(void) {
|
||||
printShortDescription(23, 6);
|
||||
printShortDescription(SettingsItemIndex::TempChangeLongStep, 6);
|
||||
OLED::printNumber(systemSettings.TempChangeLongStep, 2, FontStyle::LARGE);
|
||||
return false;
|
||||
}
|
||||
@@ -896,7 +875,7 @@ static bool settings_setPowerPulse(void) {
|
||||
return systemSettings.KeepAwakePulse == POWER_PULSE_MAX - 1;
|
||||
}
|
||||
static bool settings_displayPowerPulse(void) {
|
||||
printShortDescription(24, 5);
|
||||
printShortDescription(SettingsItemIndex::PowerPulsePower, 5);
|
||||
if (systemSettings.KeepAwakePulse) {
|
||||
OLED::printNumber(systemSettings.KeepAwakePulse / 10, 1, FontStyle::LARGE);
|
||||
OLED::print(SymbolDot, FontStyle::LARGE);
|
||||
@@ -913,7 +892,7 @@ static bool settings_setAnimationLoop(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayAnimationLoop(void) {
|
||||
printShortDescription(29, 7);
|
||||
printShortDescription(SettingsItemIndex::AnimLoop, 7);
|
||||
OLED::drawCheckbox(systemSettings.animationLoop);
|
||||
return false;
|
||||
}
|
||||
@@ -925,7 +904,7 @@ static bool settings_setAnimationSpeed(void) {
|
||||
}
|
||||
|
||||
static bool settings_displayAnimationSpeed(void) {
|
||||
printShortDescription(30, 7);
|
||||
printShortDescription(SettingsItemIndex::AnimSpeed, 7);
|
||||
switch (systemSettings.animationSpeed) {
|
||||
case settingOffSpeed_t::SLOW:
|
||||
OLED::print(SettingSlowChar, FontStyle::LARGE);
|
||||
@@ -955,7 +934,7 @@ static bool settings_setPowerPulseWait(void) {
|
||||
|
||||
static bool settings_displayPowerPulseWait(void) {
|
||||
if (systemSettings.KeepAwakePulse) {
|
||||
printShortDescription(31, 7);
|
||||
printShortDescription(SettingsItemIndex::PowerPulseWait, 7);
|
||||
OLED::printNumber(systemSettings.KeepAwakePulseWait, 1, FontStyle::LARGE);
|
||||
return false;
|
||||
} else {
|
||||
@@ -975,7 +954,7 @@ static bool settings_setPowerPulseDuration(void) {
|
||||
|
||||
static bool settings_displayPowerPulseDuration(void) {
|
||||
if (systemSettings.KeepAwakePulse) {
|
||||
printShortDescription(32, 7);
|
||||
printShortDescription(SettingsItemIndex::PowerPulseDuration, 7);
|
||||
OLED::printNumber(systemSettings.KeepAwakePulseDuration, 1, FontStyle::LARGE);
|
||||
return false;
|
||||
} else {
|
||||
@@ -985,7 +964,7 @@ static bool settings_displayPowerPulseDuration(void) {
|
||||
|
||||
#ifdef HALL_SENSOR
|
||||
static bool settings_displayHallEffect(void) {
|
||||
printShortDescription(26, 7);
|
||||
printShortDescription(SettingsItemIndex::HallEffSensitivity, 7);
|
||||
switch (systemSettings.hallEffectSensitivity) {
|
||||
case 1:
|
||||
OLED::print(SettingSensitivityLow, FontStyle::LARGE);
|
||||
@@ -1016,18 +995,8 @@ static bool animOpenState = false;
|
||||
|
||||
static void displayMenu(size_t index) {
|
||||
// Call into the menu
|
||||
const char *textPtr = SettingsMenuEntries[index];
|
||||
FontStyle font;
|
||||
if (textPtr[0] == '\x01') { // `\x01` is used as newline.
|
||||
// Empty first line means that this uses large font (for CJK).
|
||||
font = FontStyle::LARGE;
|
||||
textPtr++;
|
||||
} else {
|
||||
font = FontStyle::SMALL;
|
||||
}
|
||||
OLED::setCursor(0, 0);
|
||||
// Draw title
|
||||
OLED::print(textPtr, font);
|
||||
OLED::printWholeScreen(SettingsMenuEntries[index]);
|
||||
// Draw symbol
|
||||
// 16 pixel wide image
|
||||
// 2 pixel wide scrolling indicator
|
||||
@@ -1059,7 +1028,7 @@ static void displayMenu(size_t index) {
|
||||
}
|
||||
|
||||
static bool settings_displayCalibrateVIN(void) {
|
||||
printShortDescription(13, 5);
|
||||
printShortDescription(SettingsItemIndex::VoltageCalibration, 5);
|
||||
return false;
|
||||
}
|
||||
static bool settings_displayPowerMenu(void) {
|
||||
@@ -1117,12 +1086,12 @@ void gui_Menu(const menuitem *menu) {
|
||||
bool scrollBlink = false;
|
||||
bool lastValue = false;
|
||||
|
||||
for (uint8_t i = 0; menu[i].draw != NULL; i++) {
|
||||
for (uint8_t i = 0; menu[i].draw != nullptr; i++) {
|
||||
scrollContentSize += 1;
|
||||
}
|
||||
|
||||
// Animated menu opening.
|
||||
if (menu[currentScreen].draw != NULL) {
|
||||
if (menu[currentScreen].draw != nullptr) {
|
||||
// This menu is drawn in a secondary framebuffer.
|
||||
// Then we play a transition from the current primary
|
||||
// framebuffer to the new buffer.
|
||||
@@ -1137,11 +1106,11 @@ void gui_Menu(const menuitem *menu) {
|
||||
animOpenState = false;
|
||||
}
|
||||
|
||||
while ((menu[currentScreen].draw != NULL) && earlyExit == false) {
|
||||
while ((menu[currentScreen].draw != nullptr) && earlyExit == false) {
|
||||
OLED::setCursor(0, 0);
|
||||
// If the user has hesitated for >=3 seconds, show the long text
|
||||
// Otherwise "draw" the option
|
||||
if ((xTaskGetTickCount() - lastButtonTime < (TICKS_SECOND * 3)) || menu[currentScreen].description == NULL) {
|
||||
if ((xTaskGetTickCount() - lastButtonTime < (TICKS_SECOND * 3)) || menu[currentScreen].description == nullptr) {
|
||||
lcdRefresh = true;
|
||||
OLED::clearScreen();
|
||||
if (menu[currentScreen].draw()) {
|
||||
@@ -1159,14 +1128,15 @@ void gui_Menu(const menuitem *menu) {
|
||||
// Draw description
|
||||
if (descriptionStart == 0)
|
||||
descriptionStart = xTaskGetTickCount();
|
||||
const char *description = menu[currentScreen].description;
|
||||
// lower the value - higher the speed
|
||||
int16_t descriptionWidth = FONT_12_WIDTH * (str_display_len(menu[currentScreen].description) + 7);
|
||||
int16_t descriptionWidth = FONT_12_WIDTH * (str_display_len(description) + 7);
|
||||
int16_t descriptionOffset = ((xTaskGetTickCount() - descriptionStart) / (systemSettings.descriptionScrollSpeed == 1 ? (TICKS_100MS / 10) : (TICKS_100MS / 5)));
|
||||
descriptionOffset %= descriptionWidth; // Roll around at the end
|
||||
if (lastOffset != descriptionOffset) {
|
||||
OLED::clearScreen();
|
||||
OLED::setCursor((OLED_WIDTH - descriptionOffset), 0);
|
||||
OLED::print(menu[currentScreen].description, FontStyle::LARGE);
|
||||
OLED::print(description, FontStyle::LARGE);
|
||||
lastOffset = descriptionOffset;
|
||||
lcdRefresh = true;
|
||||
}
|
||||
@@ -1187,7 +1157,7 @@ void gui_Menu(const menuitem *menu) {
|
||||
case BUTTON_F_SHORT:
|
||||
// increment
|
||||
if (descriptionStart == 0) {
|
||||
if (menu[currentScreen].incrementHandler != NULL) {
|
||||
if (menu[currentScreen].incrementHandler != nullptr) {
|
||||
lastValue = menu[currentScreen].incrementHandler();
|
||||
} else {
|
||||
earlyExit = true;
|
||||
|
||||
@@ -43,10 +43,10 @@ static uint16_t min(uint16_t a, uint16_t b) {
|
||||
else
|
||||
return a;
|
||||
}
|
||||
void warnUser(const char *warning, const FontStyle font, const int timeout) {
|
||||
|
||||
void warnUser(const char *warning, const int timeout) {
|
||||
OLED::clearScreen();
|
||||
OLED::setCursor(0, 0);
|
||||
OLED::print(warning, font);
|
||||
OLED::printWholeScreen(warning);
|
||||
OLED::refresh();
|
||||
waitForButtonPressOrTimeout(timeout);
|
||||
}
|
||||
@@ -462,7 +462,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
|
||||
case BUTTON_BOTH_LONG:
|
||||
// Unlock buttons
|
||||
buttonsLocked = false;
|
||||
warnUser(UnlockingKeysString, FontStyle::LARGE, TICKS_SECOND);
|
||||
warnUser(UnlockingKeysString, TICKS_SECOND);
|
||||
break;
|
||||
case BUTTON_F_LONG:
|
||||
// if boost mode is enabled turn it on
|
||||
@@ -476,7 +476,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
|
||||
case BUTTON_F_SHORT:
|
||||
case BUTTON_B_SHORT:
|
||||
// Do nothing and display a lock warming
|
||||
warnUser(WarningKeysLockedString, FontStyle::LARGE, TICKS_SECOND / 2);
|
||||
warnUser(WarningKeysLockedString, TICKS_SECOND / 2);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -511,7 +511,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
|
||||
if (systemSettings.lockingMode != 0) {
|
||||
// Lock buttons
|
||||
buttonsLocked = true;
|
||||
warnUser(LockingKeysString, FontStyle::LARGE, TICKS_SECOND);
|
||||
warnUser(LockingKeysString, TICKS_SECOND);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -713,12 +713,7 @@ void showDebugMenu(void) {
|
||||
void showWarnings() {
|
||||
// Display alert if settings were reset
|
||||
if (settingsWereReset) {
|
||||
if (SettingsResetMessage[0] == '\x01') { // `\x01` is used as newline.
|
||||
// Empty first line means that this uses large font (for CJK).
|
||||
warnUser(SettingsResetMessage + 1, FontStyle::LARGE, 10 * TICKS_SECOND);
|
||||
} else {
|
||||
warnUser(SettingsResetMessage, FontStyle::SMALL, 10 * TICKS_SECOND);
|
||||
}
|
||||
warnUser(SettingsResetMessage, 10 * TICKS_SECOND);
|
||||
}
|
||||
#ifndef NO_WARN_MISSING
|
||||
// We also want to alert if accel or pd is not detected / not responding
|
||||
@@ -732,7 +727,7 @@ void showWarnings() {
|
||||
if (systemSettings.accelMissingWarningCounter < 2) {
|
||||
systemSettings.accelMissingWarningCounter++;
|
||||
saveSettings();
|
||||
warnUser(NoAccelerometerMessage, FontStyle::SMALL, 10 * TICKS_SECOND);
|
||||
warnUser(NoAccelerometerMessage, 10 * TICKS_SECOND);
|
||||
}
|
||||
}
|
||||
#ifdef POW_PD
|
||||
@@ -741,7 +736,7 @@ void showWarnings() {
|
||||
if (systemSettings.pdMissingWarningCounter < 2) {
|
||||
systemSettings.pdMissingWarningCounter++;
|
||||
saveSettings();
|
||||
warnUser(NoPowerDeliveryMessage, FontStyle::SMALL, 10 * TICKS_SECOND);
|
||||
warnUser(NoPowerDeliveryMessage, 10 * TICKS_SECOND);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -132,12 +132,9 @@ OPTIM=-Os -flto -finline-small-functions -findirect-inlining -fdiagnostics-color
|
||||
# global defines ---------------------------------------------------------------
|
||||
GLOBAL_DEFINES += $(DEV_GLOBAL_DEFS) -D USE_RTOS_SYSTICK -D MODEL_$(model) -D VECT_TAB_OFFSET=$(bootldr_size)U
|
||||
|
||||
# Without debug code
|
||||
DEBUG=
|
||||
DEBUG=-g3
|
||||
ifdef swd_enable
|
||||
GLOBAL_DEFINES += -DSWD_ENABLE
|
||||
# Enable debug code generation
|
||||
DEBUG=-g
|
||||
endif
|
||||
|
||||
|
||||
@@ -319,7 +316,7 @@ $(OUT_OBJS_S): $(OUTPUT_DIR)/%.o: %.S Makefile
|
||||
@echo 'Building file: $<'
|
||||
@$(AS) -c $(AFLAGS) $< -o $@
|
||||
|
||||
Core/Gen/Translation.%.cpp: ../Translations/translation_%.json Makefile ../Translations/make_translation.py ../Translations/translations_commons.js ../Translations/fontTables.py ../Translations/wqy-bitmapsong/wenquanyi_9pt.bdf
|
||||
Core/Gen/Translation.%.cpp: ../Translations/translation_%.json Makefile ../Translations/make_translation.py ../Translations/translations_def.js ../Translations/font_tables.py ../Translations/wqy-bitmapsong/wenquanyi_9pt.bdf
|
||||
@test -d $(@D) || mkdir -p $(@D)
|
||||
@echo 'Generating translations for language $*'
|
||||
@python3 ../Translations/make_translation.py -o $(PWD)/$@ $*
|
||||
@@ -352,4 +349,4 @@ check-style:
|
||||
# pull in dependency info for *existing* .o files
|
||||
-include $(OUT_OBJS:.o=.d)
|
||||
-include $(OUT_OBJS_CPP:.o=.d)
|
||||
|
||||
-include $(OUTPUT_DIR)/Core/Gen/Translation.*.d
|
||||
|
||||
@@ -378,6 +378,13 @@ PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U;
|
||||
PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */
|
||||
PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle = NULL; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */
|
||||
|
||||
/* Improve support for OpenOCD. The kernel tracks Ready tasks via priority lists.
|
||||
* For tracking the state of remote threads, OpenOCD uses uxTopUsedPriority
|
||||
* to determine the number of priority lists to read back from the remote target. */
|
||||
const volatile UBaseType_t uxTopUsedPriority = configMAX_PRIORITIES - 1U;
|
||||
|
||||
|
||||
|
||||
/* Context switches are held pending while the scheduler is suspended. Also,
|
||||
interrupts must not manipulate the xStateListItem of a TCB, or any of the
|
||||
lists the xStateListItem can be referenced from, if the scheduler is suspended.
|
||||
@@ -2093,6 +2100,10 @@ BaseType_t xReturn;
|
||||
/* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0,
|
||||
meaning xIdleTaskHandle is not used anywhere else. */
|
||||
( void ) xIdleTaskHandle;
|
||||
|
||||
/* OpenOCD makes use of uxTopUsedPriority for thread debugging. Prevent uxTopUsedPriority
|
||||
* from getting optimized out as it is no longer used by the kernel. */
|
||||
( void ) uxTopUsedPriority;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
||||
Reference in New Issue
Block a user