diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 8af8318b..b8f9f562 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -28,8 +28,13 @@ jobs:
fetch-depth: 0
- uses: actions/setup-python@v4
- - run: pip install --upgrade pip && pip install mkdocs mkdocs-gen-files
+
+ - run: |
+ pip install --upgrade pip &&
+ pip install mkdocs mkdocs-gen-files pymdown-extensions \
+ mkdocs-git-revision-date-plugin mkdocs-autolinks-plugin \
+ mkdocs-awesome-pages-plugin
- run: git config user.name 'github-actions[bot]' && git config user.email 'github-actions[bot]@users.noreply.github.com'
- name: Publish docs
- run: mkdocs gh-deploy
\ No newline at end of file
+ run: mkdocs gh-deploy
diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml
index 6bda0d65..3df90fe4 100644
--- a/.github/workflows/push.yml
+++ b/.github/workflows/push.yml
@@ -140,14 +140,14 @@ jobs:
steps:
- name: deps
- run: apk add --no-cache python3 py3-pip make git
+ run: apk add --no-cache python3 py3-pip make git black
- uses: actions/checkout@v3
with:
submodules: true
- name: install black
- run: python3 -m pip install bdflib black flake8
+ run: python3 -m pip install bdflib flake8
- name: Check formatting with clang-format
run: cd source && make clean && make check-style
diff --git a/.github/workflows/weblate.yml b/.github/workflows/weblate.yml
deleted file mode 100644
index 885e7a6f..00000000
--- a/.github/workflows/weblate.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-name: Weblate PR
-on:
- create:
- branches: ["^translations$"]
-
-jobs:
- pull-request:
- name: Open PR to dev
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- name: checkout
-
- - uses: repo-sync/pull-request@v2
- name: pull-request
- with:
- destination_branch: "dev"
- pr_title: "Merging newest translations into dev" # Title of pull request
- pr_body: | # Full markdown support, requires pr_title to be set
- Translations automatically submitted by Weblate
-
- _Translations from [Weblate](https://hosted.weblate.org/projects/ironos/main-firmware/)_
- pr_reviewer: "ralim"
- pr_draft: false
- github_token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/Dockerfile b/Dockerfile
index d420b12b..c3f98f34 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,12 +8,20 @@ WORKDIR /build
# Misc -> findutils make git
# musl-dev is required for the multi lang firmwares
# clang is required for clang-format (for dev)
+ARG APK_COMPS="gcc-riscv-none-elf gcc-arm-none-eabi newlib-riscv-none-elf \
+ newlib-arm-none-eabi"
+ARG APK_PYTHON="python3 py3-pip black"
+ARG APK_MISC="findutils make git"
+ARG APK_DEV="musl-dev clang bash clang-extra-tools"
-RUN apk add --no-cache gcc-riscv-none-elf gcc-arm-none-eabi newlib-riscv-none-elf newlib-arm-none-eabi findutils python3 py3-pip make git musl-dev clang bash clang-extra-tools
+# PIP packages
+ARG PIP_PKGS='bdflib'
+
+RUN apk add --no-cache ${APK_COMPS} ${APK_PYTHON} ${APK_MISC} ${APK_DEV}
# Install Python3 packages
-RUN python3 -m pip install bdflib black
+RUN python3 -m pip install ${PIP_PKGS}
# Git trust
RUN git config --global --add safe.directory /build/source
diff --git a/Documentation/Development.md b/Documentation/Development.md
index 79497af5..b43ae2d1 100644
--- a/Documentation/Development.md
+++ b/Documentation/Development.md
@@ -104,3 +104,40 @@ If you _need_ an IDE I have used [Nuclei's IDE](https://nucleisys.com/download.p
Follow the same idea as the STM Cube IDE notes above.
## Building Pinecil V2
+
+To build the Pinecil V2 firmware, you can use a Docker container that provides a consistent development environment across different operating systems, including Windows with WSL2. Here's how to do it:
+
+### Prerequisites
+
+Docker Desktop: Install the latest version of Docker Desktop for your operating system from the official website.
+
+On Windows follow the instructions on the official documentation to install 'Windows Subsystem for Linux' (WSL2).
+
+### Building Steps
+
+1. Clone the repository, initialize and update submodules:
+
+ ```sh
+ git clone --recurse-submodules https://github.com/Ralim/IronOS.git
+ ```
+
+2. Start the Docker container with the development environment:
+
+ ```sh
+ cd IronOS
+ ./start_dev.sh
+ ```
+
+ This script will build a Docker image and run a container with the necessary tools to build the firmware.
+
+3. Build the firmware for Pinecil V2:
+
+ ```sh
+ cd source/source
+ ./build.sh -l EN -m Pinecilv2
+ ```
+
+ This command will compile the firmware with English language support for Pinecil V2 board.
+
+4. Find the firmware artifacts:
+ After the build completes successfully, you can find the firmware artifacts in the `source/Hexfile` directory.
diff --git a/Documentation/Flashing/Pinecil V1.md b/Documentation/Flashing/Pinecil V1.md
index 49517935..bd3f23a8 100644
--- a/Documentation/Flashing/Pinecil V1.md
+++ b/Documentation/Flashing/Pinecil V1.md
@@ -12,8 +12,8 @@ These are built on every change and can be found on the Actions tab (see below).
Main releases are made to the [releases page](https://github.com/Ralim/IronOS/releases).
Download the zip file that matches your model of soldering iron and extract it.
-Select the appropriate file type for your unit, in general Miniware devices need `.hex` and Pinecil needs `.dfu`.
-Flash according to details below
+Select the appropriate file type for your unit, in general Miniware devices need `.hex`, Pinecil V1 needs `.dfu`, and Pinecil V2 needs `.bin`.
+Flash according to details below.
### Bleeding edge / latest
@@ -26,13 +26,16 @@ Then this works the same as a production release (use the correct file).
# Pinecil V1
-- The MCU used in Pinecil supports usb-dfu. Reference [Pinecil Wiki](https://wiki.pine64.org/wiki/Pinecil).
-- Recommended Updater: the [Pine64 Updater](https://github.com/pine64/pinecil-firmware-updater/releases), is an easy-to-use GUI app. It is fast and works in several types of OS, i.e. Windows/Mac. It will automatically fetch the newest stable version of IronOS from GitHub.
+- The MCU used in Pinecil supports usb-dfu. Reference [Pinecil Wiki](https://wiki.pine64.org/wiki/Pinecil) for hardware and firmware instructions.
+- Recommended Updater for Windows/MacOS: [Pine64 Updater](https://github.com/pine64/pine64_updater) is an easy-to-use GUI app. It is fast and automatically fetches the newest stable version of IronOS from GitHub. It can also be used to load custom boot logo art.
+- Recommended Updater for Linux/MacOS: [PineFlash](https://github.com/Spagett1/PineFlash) is an easy-to-use GUI app. It is fast and automatically fetches the newest stable version of IronOS from Github. It can also be used to load custom boot logo art.
+
- Troubleshooting: if you have issues using the Pine64 Updater or your install fails, please go to troubleshooting tips below.
-- Community chat: if troubleshooting doesn't work, then join the Pine64 > Pinecil channel. There are knowledgeable members in Discord/Telegram/Matrix. Discord has a bridge bot connection to Telegram and Matrix so that all pine volunteers/members can see advice for Pinecil and related items or just get tips on which Power supply to purchase.
+- The [Pinecil Wiki](https://wiki.pine64.org/wiki/Pinecil) is a great resource for all things Pinecil.
+- Community chat: if troubleshooting doesn't work, then join the Pine64 > Pinecil channel [here](https://wiki.pine64.org/wiki/Pinecil#Live_Community_Chat). There are knowledgeable members in Discord/Telegram/Matrix. Discord has a bridge bot connection to Telegram and Matrix so that all pine64 volunteers/members can see advice for Pinecil and related items or just get tips on which power supply to purchase.
- One advantage of Pinecil is that you cannot permanently damage it doing a firmware update (because DFU is in ROM); an update could render Pinecil temporarily inoperable if you flash an invalid firmware. But no worries, simply re-flashing with a working firmware copy will fix everything.
- USB-C cable is required to do an update. Generally, all USB controllers work, but some hubs have issues, so it is preferred to avoid USB hubs for updates.
-- Alternate Update Methods: if your OS is not currently supported by the [Updater](https://github.com/pine64/pinecil-firmware-updater/releases) or it does not meet your needs, i.e., you want to install a beta version, the below manual methods may be used.
+- Alternate Update Methods: if your OS is not currently supported by the [Pine64 Updater](https://github.com/pine64/pine64_updater) or it does not meet your needs, i.e., you want to install a beta version, the below manual methods may be used.
## Linux and Mac
diff --git a/Documentation/Flashing/Pinecil V2.md b/Documentation/Flashing/Pinecil V2.md
index 82ce680c..ac74a0d9 100644
--- a/Documentation/Flashing/Pinecil V2.md
+++ b/Documentation/Flashing/Pinecil V2.md
@@ -12,21 +12,25 @@ These are built on every change and can be found on the Actions tab (see below).
Main releases are made to the [releases page](https://github.com/Ralim/IronOS/releases).
Download the zip file that matches your model of soldering iron and extract it.
-Select the appropriate file type for your unit, in general Miniware devices need `.hex` and Pinecil needs `.dfu`.
-Flash according to details below
+Select the appropriate file type for your unit, in general Miniware devices need `.hex`, Pinecil V1 needs `.dfu`, and Pinecil V2 needs `.bin`.
+Flash according to details below.
### Bleeding edge / latest
-For the _latest_ code, you will need to download the zip file from the artifacts page on the build for what you want.
-Head to the [Actions](https://github.com/Ralim/IronOS/actions) page and then select the run for the appropriate branch you would like.
+For the _latest_ code, you need to download the zip file from the artifacts page for the build that you want.
+Head to the [Actions](https://github.com/Ralim/IronOS/actions) page and then select the run for the appropriate branch and beta you would like.
In general you probably want `master`.
-Once you click on a run, scroll down to the "Artifacts" section and then click on your model to download a zip file.
+Once you click on a run, scroll down to the "Artifacts" section and then click on your device model name to download a zip file.
Then this works the same as a production release (use the correct file).
# Pinecil V2
-- The MCU in V2 is Bouffalo BL706 and does _not_ use usb-dfu for flashing as the previous MCU did.
-- The current firmware (2.18) is very fresh and no upgrade is available/needed.
-- When an update is released for V2, then IronOS will also include an update method to follow.
+- The MCU in Pinecil V2 is Bouffalo BL706 and does _not_ use usb-dfu for flashing as the previous Pinecil V1 MCU did.
+- See the Pinecil Wiki page [here](https://wiki.pine64.org/wiki/Pinecil#Firmware_&_Updates) for instructions.
+- The V2 uses the [BLISP flasher](https://github.com/pine64/blisp) to upload the firmware to the MCU.
+- The [Pinecil Wiki](https://wiki.pine64.org/wiki/Pinecil) is a great resource for all things Pinecil.
+- Community chat: if there are issues updating, then join the Pine64 > Pinecil channel [here](https://wiki.pine64.org/wiki/Pinecil#Live_Community_Chat). There are knowledgeable members in Discord/Telegram/Matrix. Discord has a bridge bot connection to Telegram and Matrix so that all pine64 volunteers/members can see advice for Pinecil and related items or just get tips on which power supply to purchase.
+- One advantage of Pinecil is that you cannot permanently damage it doing a firmware update (because BIN is in ROM); an update could render Pinecil temporarily inoperable if you flash an invalid firmware. But no worries, simply re-flashing with a working firmware copy will fix everything.
+- USB-C cable is required to do an update. Generally, all USB controllers work, but some hubs have issues, so it is preferred to avoid USB hubs for updates.
- Background on the [BL706 chipset](https://lupyuen.github.io/articles/bl706)
diff --git a/Documentation/GettingStarted.md b/Documentation/GettingStarted.md
index 3843d746..7793b106 100644
--- a/Documentation/GettingStarted.md
+++ b/Documentation/GettingStarted.md
@@ -28,7 +28,7 @@ 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 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.
+And naturally, the slider controls icon (or spanner icon in older versions) represents that pressing the button near the rear of the soldering iron will enter the settings menu.
In the settings, you can turn on a detailed 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.
diff --git a/Documentation/Menu.md b/Documentation/Menu.md
index a8ac4fc5..b9cebe74 100644
--- a/Documentation/Menu.md
+++ b/Documentation/Menu.md
@@ -39,11 +39,13 @@ To calibrate your iron:
7. Press both buttons at the same time to Save and Exit to the menu
### Calibrate Tip CJC
-This performs a Tip Cold Junction Calibration (CJC) ([see Temperature for details](https://ralim.github.io/IronOS/Temperature/)). This is normally not needed unless you have an issue with tip temperature or your tips are wearing out prematurely. Changing tip lengths does not necessarily mean a calibration is needed. Check first that your tips are not defective, and measured resistance is close to specifications (Pinecil/TS100 short tips 6.2 Ω, long tips 8 Ω, TS80(P) ~4.5 Ω).
+This calibrates the [Cold Junction Compensation](https://ralim.github.io/IronOS/Temperature/) *(CJC)* for the tip. This is normally not needed unless you have an issue with tip temperature or your tips are wearing out prematurely. Changing tip lengths does not necessarily mean a calibration is needed. Check first that your tips are not defective and measured resistance is close to specifications *[Pinecil / TS100 short tips **6.2 Ω**, long tips **8 Ω**, TS80/P ~**4.5 Ω**]*.
-What this is for: some tips have an offset on their readings which causes issues, i.e., the actual temperature of the tip is much higher than displayed. To calibrate this out, perform the following steps.
+What this is for:
+Some tips have an offset on their readings which causes issues, i.e. The actual temperature of the tip is much higher than displayed. Follow the steps below to calibrate this.
-Caution: if the method below is not followed, the iron could be worse than before calibration. If you need to repeat the method, first unplug and let the handle/PCB cool down to room temperature.
+Caution:
+If the method below is not followed, the iron could be worse than before calibration. If you need to repeat the method, first unplug and let the handle/PCB cool down to room temperature.
1. Connect power to your device.
2. Go to **`Advanced Settings`** using (`-/B`) and press (`+/A`) to select it. Use (`-/B`) to scroll to **`Calibrate CJC at next boot`** and confirm with (`+/A`).
@@ -52,11 +54,11 @@ Caution: if the method below is not followed, the iron could be worse than befor
4. Unplug you device.
5. **Critical: Make sure a tip is attached & wait until the tip & handle are at room temperature.** (Wait a reasonable amount of time after having used the device.)
6. Power the device and ideally keep it out of your hands (You know it might get warm.).
-7. The display shows **`....`** for a short time while the device measures and compares the tip and handle voltages.
-8. As a result the new *Offset value* is displayed. This value can later be viewed in the **`Debug menu`**.
+7. The display shows **`calibrating ....`** for a short time while the device measures and compares the tip and handle voltages.
+8. **`Calibration done!`** is displayed for 3 seconds. The new offset value can later be viewed in the **`Debug menu`**.
9. Calibration is done and the device proceeds booting.
-Note: offsets are dependant on your tip, temperature sensor, and the MCU. It's the culmination of tolerances at rest. Typical values are 700-1000 range. This is only designed to be used at boot while cold (ambient room temperature), as temperatures drift apart as soon as power is connected. Doing this reading repeatedly could result in wide varience of the offset number and/or incorrect calibration.
+Note: offsets are dependant on your tip, temperature sensor, and the MCU. It's the culmination of tolerances at rest. Typical values are 700-1000 range. This is only designed to be used at boot while cold (ambient / room temperature), as temperatures drift apart as soon as power is connected. Doing this reading repeatedly could result in wide varience of the offset number and/or incorrect calibration.
### Boost mode
diff --git a/Documentation/Translation.md b/Documentation/Translation.md
index b96b39b8..d9016f21 100644
--- a/Documentation/Translation.md
+++ b/Documentation/Translation.md
@@ -1,6 +1,12 @@
# Translation
-If you would like to contribute a translation, use the [Translation Editor](http://htmlpreview.github.io/?https://github.com/Ralim/ts100/blob/master/Translations/TranslationEditor.html).
-[Open a reference language file and optionally a target language file](https://github.com/Ralim/ts100/tree/master/Translations).
+At the present time the main way of performing translations is to open a PR to this repository.
+All translations are stored as `json` files in the repository. Currently there is ongoing work to look into a more user friendly method of editing translations than these but for now these are reliable.
You can create a pull request with the new / updated json configuration file, and this will include this language into the new builds for the firmware.
+
+For testing you can build locally and test of course; but if you dont want to figure out the build environment; you can just open a PR and github will build the firmware for you using the _actions_ feature.
+
+This means that once you have a github account you can perform all of your edits inside Github should this be desired.
+
+Translations are _NOT_ accepted via issues/discussions or email.
diff --git a/README.md b/README.md
index a1e6a9a9..2125e630 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
-
-
-
+[](https://github.com/Ralim/IronOS/actions/workflows/push.yml)
+[](https://github.com/Ralim/IronOS)
+[](https://github.com/Ralim/IronOS/graphs/contributors)
+[](https://github.com/Ralim/IronOS/releases/latest)
# IronOS - Flexible Soldering iron control Firmware
@@ -22,15 +23,17 @@ _This firmware does **NOT** support the USB port while running for changing sett
| Device | DC | QC | PD | EPR | BLE | Battery | Recommended |
| :--------: | :-: | :-: | :-: | :-: | :-: | :-----: | :---------: |
-| MHP30 | ❌ | ❌ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
-| Pinecil V1 | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
-| Pinecil V2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
-| TS80P | ❌ | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
-| TS100 | ✔️ | ❌ | ❌ | ❌ | ❌ | ✔️ | ❌ |
-| TS80 | ❌ | ✔️ | ❌ | ❌ | ❌ | ✔️ | ❌ |
+| MHP30 | ❌ | ❌ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
+| Pinecil V1 | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
+| Pinecil V2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
+| TS80P | ❌ | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
+| TS100 | ✔️ | ❌ | ❌ | ❌ | ❌ | ✔️ | ❌* |
+| TS80 | ❌ | ✔️ | ❌ | ❌ | ❌ | ✔️ | ❌** |
\*Please note that Miniware started shipping TS100's using cloned STM32 Chips. While these do work with IronOS, their DFU bootloader works terribly, and it is hard to get it to successfully flash larger firmware images like IronOS without timing out. This is the main reason why the TS100 is **_no longer recommended_**.
+\**TS80 is replaced by TS80P. Production ramped down a long time ago and it's just existing stock clearing the system. It's marked not recommended being optimistic that people might pause and buy the far superior TS80P instead. This is the main reason why the TS80 is **_no longer recommended_**.
+
## Getting Started
To get started with IronOS firmware, please jump to [Getting Started Guide](https://ralim.github.io/IronOS/GettingStarted/).
@@ -79,6 +82,12 @@ When on the main screen and having the tip plugged in, the unit shows a pair of
Operation details are over in the [Menu information.](https://ralim.github.io/IronOS/Menu/)
+## Translations
+
+Is your preferred language missing localisation of some of the text?
+Translations are stored as `json` files in the Translations folder.
+PR's are loved and accepted to enhance the firmware.
+
## Thanks
If you love this firmware and want to continue my caffeine addiction, you can do so [here](https://paypal.me/RalimTek) (or email me for other options).
diff --git a/Translations/TranslationEditor.html b/Translations/TranslationEditor.html
deleted file mode 100644
index 5cce1fd1..00000000
--- a/Translations/TranslationEditor.html
+++ /dev/null
@@ -1,652 +0,0 @@
-
-
-
-
- IronOS Translation Editor
-
-
-
-
-
-
-
-
-
-
-
- IronOS Translation Editor
- - {{ current.languageLocalName }} [{{current.languageCode}}]
-
-
-
-
-
-
-
-
Obsolete
-
-
- {{entry.id}}
- {{entry.value}}
-
-
-
-
-
Messages and Strings
-
-
- {{message.id}}
-
- {{constraintString(message)}}
- Description
- {{message.description}}
- Reference
- {{referent.messages[message.id]}}
- {{message.note}}
-
-
-
-
-
-
-
-
Warning Messages
-
-
- {{message.id}}
-
-
- {{constraintWholeScreenMessage(current.messagesWarn,
- message.id)}}
-
- Description
- {{message.description}}
- Reference
- {{referent.messagesWarn[message.id]}}
- {{message.note}}
-
-
-
-
- Convert to large text
-
-
-
-
-
- Convert to small text
-
-
-
-
-
-
-
Characters
-
-
- {{char.id}}
-
- {{constraintString(char)}}
- Description
- {{char.description}}
- Reference
- {{referent.characters[char.id]}}
-
-
-
-
-
-
-
-
Menu Groups
-
-
- {{menu.id}}
-
- Menu Name
-
- {{constraintWholeScreenMessage(current.menuGroups, menu.id,
- 'text2')}}
-
- Description
- {{menu.description}}
- Reference
- {{referent.menuGroups[menu.id].text2}}
-
-
-
-
- Convert to large text
-
-
-
-
-
- Convert to small text
-
-
- Description
- {{referent.menuGroups[menu.id].desc}}
-
-
-
-
-
-
-
-
Menu Options
-
-
- {{menu.id}}
-
-
-
Menu Name
-
- {{constraintWholeScreenMessage(current.menuOptions, menu.id,
- 'text2')}}
-
-
Description
-
{{menu.description}}
-
Reference
-
{{referent.menuOptions[menu.id].text2}}
-
-
-
-
- Convert to large text
-
-
-
-
-
- Convert to small text
-
-
-
- Description
- {{referent.menuOptions[menu.id].desc}}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Translations/TranslationsParser.html b/Translations/TranslationsParser.html
deleted file mode 100644
index d47e5218..00000000
--- a/Translations/TranslationsParser.html
+++ /dev/null
@@ -1,322 +0,0 @@
-
-
-
-
-
- TS100 Translation Parser
-
-
-
-
-
-
-
-
-
-
-
TS100 Translation Parser
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Translations/font_tables.py b/Translations/font_tables.py
index a0b64253..f8a30782 100755
--- a/Translations/font_tables.py
+++ b/Translations/font_tables.py
@@ -996,6 +996,12 @@ ALL_FONTS = [
NAME_GREEK,
NAME_CJK, # CJK must come last
]
+ALL_PRE_RENDERED_FONTS = [
+ NAME_ASCII_BASIC,
+ NAME_LATIN_EXTENDED,
+ NAME_CYRILLIC,
+ NAME_GREEK,
+]
def get_font_maps_for_name(
diff --git a/Translations/gen_menu_docs.py b/Translations/gen_menu_docs.py
index 1ca8f18e..5bc8222e 100755
--- a/Translations/gen_menu_docs.py
+++ b/Translations/gen_menu_docs.py
@@ -11,7 +11,7 @@ logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
HERE = Path(__file__).resolve().parent
-TRANSLATION_DEFS_PATH = os.path.join(HERE, "translations_def.js")
+TRANSLATION_DEFS_PATH = os.path.join(HERE, "translations_definitions.json")
ENGLISH_TRANSLATION_PATH = os.path.join(HERE, "translation_EN.json")
MENU_DOCS_FILE_PATH = os.path.join(HERE.parent, "Documentation/Settings.md")
@@ -99,8 +99,8 @@ def main() -> None:
json_dir = HERE
print(json_dir)
logging.info("Loading translation definitions")
- defs = load_json(TRANSLATION_DEFS_PATH, True)
- eng_translation = load_json(ENGLISH_TRANSLATION_PATH, False)
+ defs = load_json(TRANSLATION_DEFS_PATH)
+ eng_translation = load_json(ENGLISH_TRANSLATION_PATH)
with open(MENU_DOCS_FILE_PATH, "w") as outputf:
write_header(outputf)
write_menu_categories(outputf, defs, eng_translation)
diff --git a/Translations/make_translation.py b/Translations/make_translation.py
index 351664ce..9a6341c6 100755
--- a/Translations/make_translation.py
+++ b/Translations/make_translation.py
@@ -34,10 +34,8 @@ def cjk_font() -> Font:
# Loading a single JSON file
-def load_json(filename: str, skip_first_line: bool) -> dict:
+def load_json(filename: str) -> dict:
with open(filename) as f:
- if skip_first_line:
- f.readline()
return json.loads(f.read())
@@ -57,7 +55,7 @@ def read_translation(json_root: Union[str, Path], lang_code: str) -> dict:
file_with_path = os.path.join(json_root, filename)
try:
- lang = load_json(file_with_path, skip_first_line=False)
+ lang = load_json(file_with_path)
except json.decoder.JSONDecodeError as e:
logging.error(f"Failed to decode {filename}")
logging.exception(str(e))
@@ -92,27 +90,37 @@ def write_start(f: TextIO):
f.write('#include "Translation.h"\n')
-def get_constants(build_version: str) -> List[Tuple[str, str]]:
+def get_constants() -> List[Tuple[str, str]]:
# Extra constants that are used in the firmware that are shared across all languages
return [
- ("SymbolPlus", "+"),
- ("SymbolMinus", "-"),
- ("SymbolSpace", " "),
- ("SymbolDot", "."),
- ("SymbolDegC", "C"),
- ("SymbolDegF", "F"),
- ("SymbolMinutes", "m"),
- ("SymbolSeconds", "s"),
- ("SymbolWatts", "W"),
- ("SymbolVolts", "V"),
- ("SymbolAmps", "A"),
- ("SymbolDC", "DC"),
- ("SymbolCellCount", "S"),
- ("SymbolVersionNumber", build_version),
- ("SymbolPDDebug", "PD Debug"),
- ("SymbolState", "State"),
- ("SymbolNoVBus", "No VBus"),
- ("SymbolVBus", "VBus"),
+ ("LargeSymbolPlus", "+"),
+ ("SmallSymbolPlus", "+"),
+ ("LargeSymbolMinus", "-"),
+ ("SmallSymbolMinus", "-"),
+ ("LargeSymbolSpace", " "),
+ ("SmallSymbolSpace", " "),
+ ("LargeSymbolDot", "."),
+ ("SmallSymbolDot", "."),
+ ("LargeSymbolDegC", "C"),
+ ("SmallSymbolDegC", "C"),
+ ("LargeSymbolDegF", "F"),
+ ("SmallSymbolDegF", "F"),
+ ("LargeSymbolMinutes", "m"),
+ ("SmallSymbolMinutes", "m"),
+ ("LargeSymbolSeconds", "s"),
+ ("SmallSymbolSeconds", "s"),
+ ("LargeSymbolWatts", "W"),
+ ("SmallSymbolWatts", "W"),
+ ("LargeSymbolVolts", "V"),
+ ("SmallSymbolVolts", "V"),
+ ("SmallSymbolAmps", "A"),
+ ("LargeSymbolDC", "DC"),
+ ("LargeSymbolCellCount", "S"),
+ ("SmallSymbolVersionNumber", read_version()),
+ ("SmallSymbolPDDebug", "PD Debug"),
+ ("SmallSymbolState", "State"),
+ ("SmallSymbolNoVBus", "No VBus"),
+ ("SmallSymbolVBus", "VBus"),
]
@@ -159,90 +167,167 @@ def get_power_source_list() -> List[str]:
]
-def get_letter_counts(
- defs: dict, lang: dict, build_version: str
-) -> Tuple[List[str], Dict[str, int]]:
- text_list = []
- # iterate over all strings
- obj = lang["menuOptions"]
- for mod in defs["menuOptions"]:
- eid = mod["id"]
- text_list.append(obj[eid]["desc"])
+def test_is_small_font(msg: str) -> bool:
+ return "\n" in msg and msg[0] != "\n"
- obj = lang["messages"]
- for mod in defs["messages"]:
- eid = mod["id"]
- if eid not in obj:
- text_list.append(mod["default"])
- else:
- text_list.append(obj[eid])
+
+def get_letter_counts(defs: dict, lang: dict, build_version: str) -> Dict:
+ """From the source definitions, language file and build version; calculates the ranked symbol list
+
+ Args:
+ defs (dict): _description_
+ lang (dict): _description_
+ build_version (str): _description_
+
+ Returns:
+ Dict: _description_
+ """
+ big_font_messages = []
+ small_font_messages = []
+
+ # iterate over all strings
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])
+ msg = obj[eid]["message"]
+ if test_is_small_font(msg):
+ small_font_messages.append(msg)
else:
- text_list.append(obj[eid])
+ big_font_messages.append(msg)
obj = lang["characters"]
for mod in defs["characters"]:
eid = mod["id"]
- text_list.append(obj[eid])
+ msg = obj[eid]
+ if test_is_small_font(msg):
+ small_font_messages.append(msg)
+ else:
+ big_font_messages.append(msg)
obj = lang["menuOptions"]
for mod in defs["menuOptions"]:
eid = mod["id"]
- if isinstance(obj[eid]["text2"], list):
- text_list.append(obj[eid]["text2"][0])
- text_list.append(obj[eid]["text2"][1])
+ msg = obj[eid]["displayText"]
+ if test_is_small_font(msg):
+ small_font_messages.append(msg)
else:
- text_list.append(obj[eid]["text2"])
+ big_font_messages.append(msg)
+
+ obj = lang["menuOptions"]
+ for mod in defs["menuOptions"]:
+ eid = mod["id"]
+ msg = obj[eid]["description"]
+ big_font_messages.append(msg)
obj = lang["menuGroups"]
for mod in defs["menuGroups"]:
eid = mod["id"]
- if isinstance(obj[eid]["text2"], list):
- text_list.append(obj[eid]["text2"][0])
- text_list.append(obj[eid]["text2"][1])
+ msg = obj[eid]["displayText"]
+ if test_is_small_font(msg):
+ small_font_messages.append(msg)
else:
- text_list.append(obj[eid]["text2"])
+ big_font_messages.append(msg)
obj = lang["menuGroups"]
for mod in defs["menuGroups"]:
eid = mod["id"]
- text_list.append(obj[eid]["desc"])
- constants = get_constants(build_version)
+ msg = obj[eid]["description"]
+ big_font_messages.append(msg)
+
+ constants = get_constants()
for x in constants:
- text_list.append(x[1])
- text_list.extend(get_debug_menu())
- text_list.extend(get_accel_names_list())
- text_list.extend(get_power_source_list())
+ if x[0].startswith("Small"):
+ small_font_messages.append(x[1])
+ else:
+ big_font_messages.append(x[1])
+
+ small_font_messages.extend(get_debug_menu())
+ small_font_messages.extend(get_accel_names_list())
+ small_font_messages.extend(get_power_source_list())
# collapse all strings down into the composite letters and store totals for these
+ # Doing this seperately for small and big font
+ def sort_and_count(list_in: List[str]):
- symbol_counts: dict[str, int] = {}
- for line in text_list:
- line = line.replace("\n", "").replace("\r", "")
- line = line.replace("\\n", "").replace("\\r", "")
- if line:
- for letter in line:
- symbol_counts[letter] = symbol_counts.get(letter, 0) + 1
- # swap to Big -> little sort order
+ symbol_counts: dict[str, int] = {}
+ for line in list_in:
+ line = line.replace("\n", "").replace("\r", "")
+ line = line.replace("\\n", "").replace("\\r", "")
+ if line:
+ for letter in line:
+ symbol_counts[letter] = symbol_counts.get(letter, 0) + 1
+ # swap to Big -> little sort order
+
+ return symbol_counts
+
+ small_symbol_counts = sort_and_count(small_font_messages)
+ big_symbol_counts = sort_and_count(big_font_messages)
+
+ return {
+ "smallFontCounts": small_symbol_counts,
+ "bigFontCounts": big_symbol_counts,
+ }
+
+
+def convert_letter_counts_to_ranked_symbols_with_forced(
+ symbol_dict: Dict[str, int]
+) -> List[str]:
+ # Add in forced symbols first
+ ranked_symbols = []
+ ranked_symbols.extend(get_forced_first_symbols())
+ # Now add in all the others based on letter count
symbols_by_occurrence = [
x[0]
for x in sorted(
- symbol_counts.items(), key=lambda kv: (kv[1], kv[0]), reverse=True
+ symbol_dict.items(), key=lambda kv: (kv[1], kv[0]), reverse=True
)
]
- return symbols_by_occurrence, symbol_counts
+ ranked_symbols.extend([x for x in symbols_by_occurrence if x not in ranked_symbols])
+ return ranked_symbols
-def get_cjk_glyph(sym: str) -> bytes:
- glyph: Glyph = cjk_font()[ord(sym)]
+def merge_letter_count_info(a: Dict, b: Dict) -> Dict:
+ """Merge the results from get_letter_counts
+ Combining the ranked symbols lists
+ Args:
+ a (Dict): get_letter_counts
+ b (Dict): get_letter_counts
+
+ Returns:
+ Dict: get_letter_counts
+ """
+ smallFontCounts = {}
+ bigFontCounts = {}
+ for x in a.get("smallFontCounts", []):
+ old = smallFontCounts.get(x, 0)
+ old += a["smallFontCounts"][x]
+ smallFontCounts[x] = old
+ for x in a.get("bigFontCounts", []):
+ old = bigFontCounts.get(x, 0)
+ old += a["bigFontCounts"][x]
+ bigFontCounts[x] = old
+ for x in b.get("smallFontCounts", []):
+ old = smallFontCounts.get(x, 0)
+ old += b["smallFontCounts"][x]
+ smallFontCounts[x] = old
+ for x in b.get("bigFontCounts", []):
+ old = bigFontCounts.get(x, 0)
+ old += b["bigFontCounts"][x]
+ bigFontCounts[x] = old
+ return {
+ "smallFontCounts": smallFontCounts,
+ "bigFontCounts": bigFontCounts,
+ }
+
+
+def get_cjk_glyph(sym: str) -> Optional[bytes]:
+ try:
+ glyph: Glyph = cjk_font()[ord(sym)]
+ except KeyError:
+ return None
data = glyph.data
src_left, src_bottom, src_w, src_h = glyph.get_bounding_box()
dst_w = 12
@@ -343,81 +428,107 @@ def bytes_to_c_hex(b: bytes) -> str:
return ", ".join((f"0x{i:02X}" for i in b)) + ","
-@dataclass
-class FontMap:
- font12: Dict[str, bytes]
- font06: Dict[str, Optional[bytes]]
-
-
@dataclass
class FontMapsPerFont:
+ font12_symbols_ordered: List[str]
font12_maps: Dict[str, Dict[str, bytes]]
- font06_maps: Dict[str, Dict[str, Optional[bytes]]]
- sym_lists: Dict[str, List[str]]
+ font06_symbols_ordered: List[str]
+ font06_maps: Dict[str, Dict[str, bytes]]
-def get_font_map_per_font(text_list: List[str]) -> FontMapsPerFont:
- pending_sym_set = set(text_list)
- if len(pending_sym_set) != len(text_list):
- raise ValueError("`text_list` contains duplicated symbols")
+def get_font_map_per_font(
+ text_list_small_font: List[str], text_list_large_font: List[str]
+) -> FontMapsPerFont:
- total_symbol_count = len(text_list)
+ pending_small_symbols = set(text_list_small_font)
+ pending_large_symbols = set(text_list_large_font)
+
+ if len(pending_small_symbols) != len(text_list_small_font):
+ raise ValueError("`text_list_small_font` contains duplicated symbols")
+ if len(pending_large_symbols) != len(text_list_large_font):
+ raise ValueError("`text_list_large_font` contains duplicated symbols")
+
+ total_symbol_count_small = len(pending_small_symbols)
# \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
# `get_bytes_from_font_index`):
- if total_symbol_count > (0x10 * 0xFF - 15) - 2: # 4063
+ if total_symbol_count_small > (0x10 * 0xFF - 15) - 2: # 4063
raise ValueError(
- f"Error, too many used symbols for this version (total {total_symbol_count})"
+ f"Error, too many used symbols for this version (total {total_symbol_count_small})"
+ )
+ logging.info(f"Generating fonts for {total_symbol_count_small} symbols")
+
+ total_symbol_count_large = len(pending_large_symbols)
+ # \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
+ # `get_bytes_from_font_index`):
+ if total_symbol_count_large > (0x10 * 0xFF - 15) - 2: # 4063
+ raise ValueError(
+ f"Error, too many used symbols for this version (total {total_symbol_count_large})"
+ )
+ logging.info(f"Generating fonts for {total_symbol_count_large} symbols")
+
+ # Build the full font maps
+
+ font12_map: Dict[str, bytes] = {}
+ font06_map: Dict[str, bytes] = {}
+
+ # First we go through and do all of the CJK characters that are in the large font to have them removed
+ for sym in text_list_large_font:
+ font12_line = get_cjk_glyph(sym)
+ if font12_line is None:
+ continue
+ font12_map[sym] = font12_line
+ pending_large_symbols.remove(sym)
+ # Now that all CJK characters are done, we next have to fill out all of the small and large fonts from the remainders
+
+ # This creates our superset of characters to reference off that are pre-rendered ones (non CJK)
+ # Collect font bitmaps by the defined font order:
+ for font in font_tables.ALL_PRE_RENDERED_FONTS:
+ font12, font06 = font_tables.get_font_maps_for_name(font)
+ font12_map.update(font12)
+ font06_map.update(font06)
+
+ # LARGE FONT
+ for sym in text_list_large_font:
+ if sym in pending_large_symbols:
+ font_data = font12_map.get(sym, None)
+ if font_data is None:
+ raise KeyError(f"Symbol |{sym}| is missing in large font set")
+ font12_map[sym] = font_data
+ pending_large_symbols.remove(sym)
+
+ if len(pending_large_symbols) > 0:
+ raise KeyError(
+ f"Missing large font symbols for {len(pending_large_symbols)} characters: {pending_large_symbols}"
)
- logging.info(f"Generating fonts for {total_symbol_count} symbols")
+ # SMALL FONT
+ for sym in text_list_small_font:
+ if sym in pending_small_symbols:
+ font_data = font06_map.get(sym, None)
+ if font_data is None:
+ raise KeyError(f"Symbol |{sym}| is missing in small font set")
+ font06_map[sym] = font_data
+ pending_small_symbols.remove(sym)
- # Collect font bitmaps by the defined font order:
- font12_maps: Dict[str, Dict[str, bytes]] = {}
- font06_maps: Dict[str, Dict[str, Optional[bytes]]] = {}
- sym_lists: Dict[str, List[str]] = {}
- for font in font_tables.ALL_FONTS:
- font12_maps[font] = {}
- font12_map = font12_maps[font]
- font06_maps[font] = {}
- font06_map = font06_maps[font]
- sym_lists[font] = []
- sym_list = sym_lists[font]
+ if len(pending_small_symbols) > 0:
+ raise KeyError(
+ f"Missing small font symbols for {len(pending_small_symbols)} characters: {pending_small_symbols}"
+ )
- if font == font_tables.NAME_CJK:
- is_cjk = True
- else:
- is_cjk = False
- font12: Dict[str, bytes]
- font06: Dict[str, bytes]
- font12, font06 = font_tables.get_font_maps_for_name(font)
-
- for sym in text_list:
- if sym not in pending_sym_set:
- continue
- if is_cjk:
- font12_line = get_cjk_glyph(sym)
- if font12_line is None:
- continue
- font06_line = None
- else:
- try:
- font12_line = font12[sym]
- font06_line = font06[sym]
- except KeyError:
- continue
- font12_map[sym] = font12_line
- font06_map[sym] = font06_line
- sym_list.append(sym)
- pending_sym_set.remove(sym)
-
- if len(pending_sym_set) > 0:
- raise KeyError(f"Symbols not found in our fonts: {pending_sym_set}")
-
- return FontMapsPerFont(font12_maps, font06_maps, sym_lists)
+ return FontMapsPerFont(
+ text_list_large_font, font12_map, text_list_small_font, font06_map
+ )
def get_forced_first_symbols() -> List[str]:
+ """Get the list of symbols that must always occur at start of small and large fonts
+ Used by firmware for displaying numbers and hex strings
+
+ Returns:
+ List[str]: List of single character strings that must be the first N entries in a font table
+ """
forced_first_symbols = [
"0",
"1",
@@ -435,39 +546,13 @@ def get_forced_first_symbols() -> List[str]:
"d",
"e",
"f",
+ " ", # We lock these to ease printing functions; and they are always included due to constants
+ "-",
+ "+",
]
return forced_first_symbols
-def get_sym_list_and_font_map(
- text_list: List[str],
-) -> Tuple[List[str], Dict[str, List[str]], FontMap]:
- font_maps = get_font_map_per_font(text_list)
- font12_maps = font_maps.font12_maps
- font06_maps = font_maps.font06_maps
-
- # Build the full font maps
- font12_map = {}
- font06_map = {}
- for font in font_tables.ALL_FONTS:
- font12_map.update(font12_maps[font])
- font06_map.update(font06_maps[font])
-
- # Collect all symbols by the original symbol order, but also making sure
- # all symbols with only large font must be placed after all symbols with
- # both small and large fonts
- sym_list_both_fonts = []
- sym_list_large_only = []
- for sym in text_list:
- if font06_map[sym] is None:
- sym_list_large_only.append(sym)
- else:
- sym_list_both_fonts.append(sym)
- sym_list = sym_list_both_fonts + sym_list_large_only
-
- return sym_list, font_maps.sym_lists, FontMap(font12_map, font06_map)
-
-
def build_symbol_conversion_map(sym_list: List[str]) -> Dict[str, bytes]:
forced_first_symbols = get_forced_first_symbols()
if sym_list[: len(forced_first_symbols)] != forced_first_symbols:
@@ -487,12 +572,16 @@ def build_symbol_conversion_map(sym_list: List[str]) -> Dict[str, bytes]:
def make_font_table_cpp(
- sym_list: List[str], font_map: FontMap, symbol_map: Dict[str, bytes]
+ small_font_sym_list: List[str],
+ large_font_sym_list: List[str],
+ font_map: FontMapsPerFont,
+ small_symbol_map: Dict[str, bytes],
+ large_symbol_map: Dict[str, bytes],
) -> str:
output_table = make_font_table_named_cpp(
- "USER_FONT_12", sym_list, font_map.font12, symbol_map
+ "USER_FONT_12", large_font_sym_list, font_map.font12_maps
)
- output_table += make_font_table_06_cpp(sym_list, font_map, symbol_map)
+ output_table += make_font_table_06_cpp(small_font_sym_list, font_map)
return output_table
@@ -500,29 +589,26 @@ def make_font_table_named_cpp(
name: Optional[str],
sym_list: List[str],
font_map: Dict[str, bytes],
- symbol_map: Dict[str, bytes],
) -> str:
output_table = ""
if name:
output_table = f"const uint8_t {name}[] = {{\n"
- for sym in sym_list:
- output_table += f"{bytes_to_c_hex(font_map[sym])}//{bytes_to_escaped(symbol_map[sym])} -> {sym}\n"
+ for i, sym in enumerate(sym_list):
+ output_table += f"{bytes_to_c_hex(font_map[sym])}//0x{i+2:X} -> {sym}\n"
if name:
output_table += f"}}; // {name}\n"
return output_table
-def make_font_table_06_cpp(
- sym_list: List[str], font_map: FontMap, symbol_map: Dict[str, bytes]
-) -> str:
+def make_font_table_06_cpp(sym_list: List[str], font_map: FontMapsPerFont) -> str:
output_table = "const uint8_t USER_FONT_6x8[] = {\n"
- for sym in sym_list:
- font_bytes = font_map.font06[sym]
+ for i, sym in enumerate(sym_list):
+ font_bytes = font_map.font06_maps[sym]
if font_bytes:
font_line = bytes_to_c_hex(font_bytes)
else:
font_line = "// " # placeholder
- output_table += f"{font_line}//{bytes_to_escaped(symbol_map[sym])} -> {sym}\n"
+ output_table += f"{font_line}//0x{i+2:X} -> {sym}\n"
output_table += "};\n"
return output_table
@@ -532,8 +618,9 @@ def convert_string_bytes(symbol_conversion_table: Dict[str, bytes], text: str) -
output_string = b""
for c in text.replace("\\r", "").replace("\\n", "\n"):
if c not in symbol_conversion_table:
+ print(symbol_conversion_table)
logging.error(f"Missing font definition for {c}")
- sys.exit(1)
+ raise KeyError(f"Missing font definition for {c}")
else:
output_string += symbol_conversion_table[c]
return output_string
@@ -564,28 +651,34 @@ class LanguageData:
langs: List[dict]
defs: dict
build_version: str
- sym_list: List[str]
- sym_lists_by_font: Dict[str, List[str]]
- font_map: FontMap
+ small_text_symbols: List[str]
+ large_text_symbols: List[str]
+ font_map: FontMapsPerFont
def prepare_language(lang: dict, defs: dict, build_version: str) -> LanguageData:
language_code: str = lang["languageCode"]
logging.info(f"Preparing language data for {language_code}")
# Iterate over all of the text to build up the symbols & counts
- text_list, _ = get_letter_counts(defs, lang, build_version)
- # From the letter counts, need to make a symbol translator & write out the font
+ letter_count_data = get_letter_counts(defs, lang, build_version)
+ small_font_symbols = convert_letter_counts_to_ranked_symbols_with_forced(
+ letter_count_data["smallFontCounts"]
+ )
+ large_font_symbols = convert_letter_counts_to_ranked_symbols_with_forced(
+ letter_count_data["bigFontCounts"]
+ )
- forced_first_symbols = get_forced_first_symbols()
+ # From the letter counts, need to make a symbol index and matching font index
- # We enforce that numbers come first.
- text_list = forced_first_symbols + [
- x for x in text_list if x not in forced_first_symbols
- ]
+ font_data = get_font_map_per_font(small_font_symbols, large_font_symbols)
- sym_list, sym_lists_by_font, font_map = get_sym_list_and_font_map(text_list)
return LanguageData(
- [lang], defs, build_version, sym_list, sym_lists_by_font, font_map
+ [lang],
+ defs,
+ build_version,
+ small_font_symbols,
+ large_font_symbols,
+ font_data,
)
@@ -595,62 +688,95 @@ def prepare_languages(
language_codes: List[str] = [lang["languageCode"] for lang in langs]
logging.info(f"Preparing language data for {language_codes}")
- forced_first_symbols = get_forced_first_symbols()
-
# Build the full font maps
- font12_map = {}
- font06_map = {}
- # Calculate total symbol counts per font:
- total_sym_counts: Dict[str, Dict[str, int]] = {}
+ total_symbol_counts: Dict[str, Dict[str, int]] = {}
for lang in langs:
- text_list, sym_counts = get_letter_counts(defs, lang, build_version)
- text_list = forced_first_symbols + [
- x for x in text_list if x not in forced_first_symbols
- ]
- font_maps = get_font_map_per_font(text_list)
- for font in font_tables.ALL_FONTS:
- font12_map.update(font_maps.font12_maps[font])
- font06_map.update(font_maps.font06_maps[font])
- for font, font_sym_list in font_maps.sym_lists.items():
- font_total_sym_counts = total_sym_counts.get(font, {})
- for sym in font_sym_list:
- font_total_sym_counts[sym] = font_total_sym_counts.get(
- sym, 0
- ) + sym_counts.get(sym, 0)
- total_sym_counts[font] = font_total_sym_counts
+ letter_count_data = get_letter_counts(defs, lang, build_version)
+ total_symbol_counts = merge_letter_count_info(
+ total_symbol_counts, letter_count_data
+ )
- sym_lists_by_font: Dict[str, List[str]] = {}
- combined_sym_list = []
- for font in font_tables.ALL_FONTS:
- if font not in total_sym_counts:
- continue
- # swap to Big -> little sort order
- current_sym_list = [
- x[0]
- for x in sorted(
- total_sym_counts[font].items(),
- key=lambda kv: (kv[1], kv[0]),
- reverse=True,
- )
- ]
- if font == font_tables.NAME_ASCII_BASIC:
- # We enforce that numbers come first.
- current_sym_list = forced_first_symbols + [
- x for x in current_sym_list if x not in forced_first_symbols
- ]
- sym_lists_by_font[font] = current_sym_list
- combined_sym_list.extend(current_sym_list)
+ small_font_symbols = convert_letter_counts_to_ranked_symbols_with_forced(
+ total_symbol_counts["smallFontCounts"]
+ )
+ large_font_symbols = convert_letter_counts_to_ranked_symbols_with_forced(
+ total_symbol_counts["bigFontCounts"]
+ )
+ font_data = get_font_map_per_font(small_font_symbols, large_font_symbols)
return LanguageData(
langs,
defs,
build_version,
- combined_sym_list,
- sym_lists_by_font,
- FontMap(font12_map, font06_map),
+ small_font_symbols,
+ large_font_symbols,
+ font_data,
)
+def render_font_block(data: LanguageData, f: TextIO, compress_font: bool = False):
+ font_map = data.font_map
+
+ small_font_symbol_conversion_table = build_symbol_conversion_map(
+ data.small_text_symbols
+ )
+ large_font_symbol_conversion_table = build_symbol_conversion_map(
+ data.large_text_symbols
+ )
+
+ if not compress_font:
+ font_table_text = make_font_table_cpp(
+ data.small_text_symbols,
+ data.large_text_symbols,
+ font_map,
+ small_font_symbol_conversion_table,
+ large_font_symbol_conversion_table,
+ )
+ f.write(font_table_text)
+ f.write(
+ "const FontSection FontSectionInfo = {\n"
+ " .font12_start_ptr = USER_FONT_12,\n"
+ " .font06_start_ptr = USER_FONT_6x8,\n"
+ " .font12_decompressed_size = 0,\n"
+ " .font06_decompressed_size = 0,\n"
+ " .font12_compressed_source = 0,\n"
+ " .font06_compressed_source = 0,\n"
+ "};\n"
+ )
+ else:
+ font12_uncompressed = bytearray()
+ for sym in data.large_text_symbols:
+ font12_uncompressed.extend(font_map.font12_maps[sym])
+ font12_compressed = brieflz.compress(bytes(font12_uncompressed))
+ logging.info(
+ f"Font table 12x16 compressed from {len(font12_uncompressed)} to {len(font12_compressed)} bytes (ratio {len(font12_compressed) / len(font12_uncompressed):.3})"
+ )
+
+ write_bytes_as_c_array(f, "font_12x16_brieflz", font12_compressed)
+ font06_uncompressed = bytearray()
+ for sym in data.small_text_symbols:
+ font06_uncompressed.extend(font_map.font06_maps[sym])
+ font06_compressed = brieflz.compress(bytes(font06_uncompressed))
+ logging.info(
+ f"Font table 06x08 compressed from {len(font06_uncompressed)} to {len(font06_compressed)} bytes (ratio {len(font06_compressed) / len(font06_uncompressed):.3})"
+ )
+
+ write_bytes_as_c_array(f, "font_06x08_brieflz", font06_compressed)
+
+ f.write(
+ f"static uint8_t font12_out_buffer[{len(font12_uncompressed)}];\n"
+ f"static uint8_t font06_out_buffer[{len(font06_uncompressed)}];\n"
+ "const FontSection FontSectionInfo = {\n"
+ " .font12_start_ptr = font12_out_buffer,\n"
+ " .font06_start_ptr = font06_out_buffer,\n"
+ f" .font12_decompressed_size = {len(font12_uncompressed)},\n"
+ f" .font06_decompressed_size = {len(font06_uncompressed)},\n"
+ " .font12_compressed_source = font_12x16_brieflz,\n"
+ " .font06_compressed_source = font_06x08_brieflz,\n"
+ "};\n"
+ )
+
+
def write_language(
data: LanguageData,
f: TextIO,
@@ -661,11 +787,13 @@ def write_language(
raise ValueError("More than 1 languages are provided")
lang = data.langs[0]
defs = data.defs
- build_version = data.build_version
- sym_list = data.sym_list
- font_map = data.font_map
- symbol_conversion_table = build_symbol_conversion_map(sym_list)
+ small_font_symbol_conversion_table = build_symbol_conversion_map(
+ data.small_text_symbols
+ )
+ large_font_symbol_conversion_table = build_symbol_conversion_map(
+ data.large_text_symbols
+ )
language_code: str = lang["languageCode"]
logging.info(f"Generating block for {language_code}")
@@ -680,54 +808,12 @@ def write_language(
f.write(f"\n// ---- {lang_name} ----\n\n")
- if not compress_font:
- font_table_text = make_font_table_cpp(
- sym_list, font_map, symbol_conversion_table
- )
- f.write(font_table_text)
- f.write(
- "const FontSection FontSectionsData[] = {\n"
- " {\n"
- " .symbol_start = 2,\n"
- f" .symbol_end = {len(sym_list) + 2},\n"
- " .font12_start_ptr = USER_FONT_12,\n"
- " .font06_start_ptr = USER_FONT_6x8,\n"
- " },\n"
- "};\n"
- "const FontSection *const FontSections = FontSectionsData;\n"
- "const uint8_t FontSectionsCount = sizeof(FontSectionsData) / sizeof(FontSectionsData[0]);\n"
- )
- else:
- font12_uncompressed = bytearray()
- for sym in sym_list:
- font12_uncompressed.extend(font_map.font12[sym])
- font12_compressed = brieflz.compress(bytes(font12_uncompressed))
- logging.info(
- f"Font table 12x16 compressed from {len(font12_uncompressed)} to {len(font12_compressed)} bytes (ratio {len(font12_compressed) / len(font12_uncompressed):.3})"
- )
- write_bytes_as_c_array(f, "font_12x16_brieflz", font12_compressed)
- font_table_text = make_font_table_06_cpp(
- sym_list, font_map, symbol_conversion_table
- )
- f.write(font_table_text)
- f.write(
- f"static uint8_t font_out_buffer[{len(font12_uncompressed)}];\n"
- "const FontSection FontSectionsData[] = {\n"
- " {\n"
- " .symbol_start = 2,\n"
- f" .symbol_end = {len(sym_list) + 2},\n"
- " .font12_start_ptr = font_out_buffer,\n"
- " .font06_start_ptr = USER_FONT_6x8,\n"
- " },\n"
- "};\n"
- "const FontSection *const FontSections = FontSectionsData;\n"
- "const uint8_t FontSectionsCount = sizeof(FontSectionsData) / sizeof(FontSectionsData[0]);\n"
- )
+ render_font_block(data, f, compress_font)
f.write(f"\n// ---- {lang_name} ----\n\n")
translation_common_text = get_translation_common_text(
- defs, symbol_conversion_table, build_version
+ small_font_symbol_conversion_table, large_font_symbol_conversion_table
)
f.write(translation_common_text)
f.write(
@@ -736,7 +822,10 @@ def write_language(
if not strings_bin:
translation_strings_and_indices_text = get_translation_strings_and_indices_text(
- lang, defs, symbol_conversion_table
+ lang,
+ defs,
+ small_font_symbol_conversion_table,
+ large_font_symbol_conversion_table,
)
f.write(translation_strings_and_indices_text)
f.write(
@@ -780,12 +869,13 @@ def write_languages(
compress_font: bool = False,
) -> None:
defs = data.defs
- build_version = data.build_version
- combined_sym_list = data.sym_list
- sym_lists_by_font = data.sym_lists_by_font
- font_map = data.font_map
- symbol_conversion_table = build_symbol_conversion_map(combined_sym_list)
+ small_font_symbol_conversion_table = build_symbol_conversion_map(
+ data.small_text_symbols
+ )
+ large_font_symbol_conversion_table = build_symbol_conversion_map(
+ data.large_text_symbols
+ )
language_codes: List[str] = [lang["languageCode"] for lang in data.langs]
logging.info(f"Generating block for {language_codes}")
@@ -798,102 +888,15 @@ def write_languages(
f.write(f"\n// ---- {lang_names} ----\n\n")
- max_decompressed_font_size = 0
- if not compress_font:
- font_table_text = ""
- font_section_info_text = (
- "const FontSectionDataInfo FontSectionDataInfos[] = {\n"
- )
- for font, current_sym_list in sym_lists_by_font.items():
- font_table_text += f"const uint8_t font_table_data_{font}[] = {{\n"
- font_table_text += "// 12x16:\n"
- font_table_text += make_font_table_named_cpp(
- None,
- current_sym_list,
- font_map.font12,
- symbol_conversion_table,
- )
- if font != font_tables.NAME_CJK:
- font_table_text += "// 6x8:\n"
- font_table_text += make_font_table_named_cpp(
- None,
- current_sym_list,
- font_map.font06, # type: ignore[arg-type]
- symbol_conversion_table,
- )
- font_table_text += f"}}; // font_table_data_{font}\n"
- if len(current_sym_list) == 0:
- current_sym_start = 0
- else:
- current_sym_start = combined_sym_list.index(current_sym_list[0]) + 2
- font_section_info_text += (
- " {\n"
- f" .symbol_start = {current_sym_start},\n"
- f" .symbol_count = {len(current_sym_list)},\n"
- f" .data_size = sizeof(font_table_data_{font}),\n"
- " .data_is_compressed = false,\n"
- f" .data_ptr = font_table_data_{font},\n"
- " },\n"
- )
-
- f.write(font_table_text)
- font_section_info_text += (
- "};\n"
- "const uint8_t FontSectionDataCount = sizeof(FontSectionDataInfos) / sizeof(FontSectionDataInfos[0]);\n\n"
- )
- f.write(font_section_info_text)
- f.write(
- "FontSection DynamicFontSections[4] = {};\n"
- "const FontSection *const FontSections = DynamicFontSections;\n"
- "const uint8_t FontSectionsCount = sizeof(DynamicFontSections) / sizeof(DynamicFontSections[0]);\n"
- )
- else:
- font_section_info_text = (
- "const FontSectionDataInfo FontSectionDataInfos[] = {\n"
- )
- for font, current_sym_list in sym_lists_by_font.items():
- print(font, current_sym_list)
- if len(current_sym_list) == 0:
- continue
- current_sym_start = combined_sym_list.index(current_sym_list[0]) + 2
- font_uncompressed = bytearray()
- for sym in current_sym_list:
- font_uncompressed.extend(font_map.font12[sym])
- if font != font_tables.NAME_CJK:
- for sym in current_sym_list:
- font_uncompressed.extend(font_map.font06[sym]) # type: ignore[arg-type]
- font_compressed = brieflz.compress(bytes(font_uncompressed))
- logging.info(
- f"Font table for {font} compressed from {len(font_uncompressed)} to {len(font_compressed)} bytes (ratio {len(font_compressed) / len(font_uncompressed):.3})"
- )
- max_decompressed_font_size += len(font_uncompressed)
- write_bytes_as_c_array(f, f"font_data_brieflz_{font}", font_compressed)
- font_section_info_text += (
- " {\n"
- f" .symbol_start = {current_sym_start},\n"
- f" .symbol_count = {len(current_sym_list)},\n"
- f" .data_size = sizeof(font_data_brieflz_{font}),\n"
- " .data_is_compressed = true,\n"
- f" .data_ptr = font_data_brieflz_{font},\n"
- " },\n"
- )
- font_section_info_text += (
- "};\n"
- "const uint8_t FontSectionDataCount = sizeof(FontSectionDataInfos) / sizeof(FontSectionDataInfos[0]);\n\n"
- )
- f.write(font_section_info_text)
- f.write(
- "FontSection DynamicFontSections[4] = {};\n"
- "const FontSection *const FontSections = DynamicFontSections;\n"
- "const uint8_t FontSectionsCount = sizeof(DynamicFontSections) / sizeof(DynamicFontSections[0]);\n"
- )
+ render_font_block(data, f, compress_font)
f.write(f"\n// ---- {lang_names} ----\n\n")
translation_common_text = get_translation_common_text(
- defs, symbol_conversion_table, build_version
+ small_font_symbol_conversion_table, large_font_symbol_conversion_table
)
f.write(translation_common_text)
+
f.write(
f"const bool HasFahrenheit = {('true' if any([lang.get('tempUnitFahrenheit', True) for lang in data.langs]) else 'false')};\n\n"
)
@@ -904,7 +907,11 @@ def write_languages(
lang_code = lang["languageCode"]
translation_strings_and_indices_text = (
get_translation_strings_and_indices_text(
- lang, defs, symbol_conversion_table, suffix=f"_{lang_code}"
+ lang,
+ defs,
+ small_font_symbol_conversion_table,
+ large_font_symbol_conversion_table,
+ suffix=f"_{lang_code}",
)
)
f.write(translation_strings_and_indices_text)
@@ -953,7 +960,7 @@ def write_languages(
f.write("};\n")
f.write(
"const uint8_t LanguageCount = sizeof(LanguageMetas) / sizeof(LanguageMetas[0]);\n\n"
- f"alignas(TranslationData) uint8_t translation_data_out_buffer[{max_decompressed_translation_size + max_decompressed_font_size}];\n"
+ f"alignas(TranslationData) uint8_t translation_data_out_buffer[{max_decompressed_translation_size }];\n"
"const uint16_t translation_data_out_buffer_size = sizeof(translation_data_out_buffer);\n\n"
)
@@ -962,14 +969,21 @@ def write_languages(
def get_translation_common_text(
- defs: dict, symbol_conversion_table: Dict[str, bytes], build_version
+ small_symbol_conversion_table: Dict[str, bytes],
+ large_symbol_conversion_table: Dict[str, bytes],
) -> str:
translation_common_text = ""
# Write out firmware constant options
- constants = get_constants(build_version)
+ constants = get_constants()
for x in constants:
- translation_common_text += f'const char* {x[0]} = "{convert_string(symbol_conversion_table, x[1])}";//{x[1]} \n'
+ if x[0].startswith("Small"):
+ translation_common_text += f'const char* {x[0]} = "{convert_string(small_symbol_conversion_table, x[1])}";//{x[1]} \n'
+ elif x[0].startswith("Large"):
+ str = x[1]
+ translation_common_text += f'const char* {x[0]} = "{convert_string(large_symbol_conversion_table, str)}";//{x[1]} \n'
+ else:
+ raise ValueError(f"Constant {x} is not size encoded")
translation_common_text += "\n"
# Debug Menu
@@ -977,7 +991,7 @@ def get_translation_common_text(
for c in get_debug_menu():
translation_common_text += (
- f'\t "{convert_string(symbol_conversion_table, c)}",//{c} \n'
+ f'\t "{convert_string(small_symbol_conversion_table, c)}",//"{c}" \n'
)
translation_common_text += "};\n\n"
@@ -986,7 +1000,7 @@ def get_translation_common_text(
for c in get_accel_names_list():
translation_common_text += (
- f'\t "{convert_string(symbol_conversion_table, c)}",//{c} \n'
+ f'\t "{convert_string(small_symbol_conversion_table, c)}",//{c} \n'
)
translation_common_text += "};\n\n"
@@ -995,7 +1009,7 @@ def get_translation_common_text(
for c in get_power_source_list():
translation_common_text += (
- f'\t "{convert_string(symbol_conversion_table, c)}",//{c} \n'
+ f'\t "{convert_string(small_symbol_conversion_table, c)}",//{c} \n'
)
translation_common_text += "};\n\n"
@@ -1009,216 +1023,198 @@ class TranslationItem:
def get_translation_strings_and_indices_text(
- lang: dict, defs: dict, symbol_conversion_table: Dict[str, bytes], suffix: str = ""
+ lang: dict,
+ defs: dict,
+ small_font_symbol_conversion_table: Dict[str, bytes],
+ large_font_symbol_conversion_table: Dict[str, bytes],
+ suffix: str = "",
) -> str:
- str_table: List[str] = []
- str_group_messages: List[TranslationItem] = []
- str_group_messageswarn: List[TranslationItem] = []
- str_group_characters: List[TranslationItem] = []
- str_group_settingdesc: List[TranslationItem] = []
- str_group_settingshortnames: List[TranslationItem] = []
- str_group_settingmenuentries: List[TranslationItem] = []
- str_group_settingmenuentriesdesc: List[TranslationItem] = []
- eid: str
+ # For all strings; we want to convert them to their byte encoded form (using font index lookups)
+ # Then we want to sort by their reversed format to see if we can remove any duplicates by combining the tails (last n bytes;n>0)
+ # Finally we look for any that are contained inside one another, and if they are we update them to point to this
- # ----- Reading SettingsDescriptions
- obj = lang["menuOptions"]
+ # _OR_ we can be lazy and abuse cpu power and just make python search for our substring each time we append
- for index, mod in enumerate(defs["menuOptions"]):
- eid = mod["id"]
- str_group_settingdesc.append(
- TranslationItem(f"[{index:02d}] {eid}", len(str_table))
- )
- str_table.append(obj[eid]["desc"])
-
- # ----- Reading Message strings
-
- obj = lang["messages"]
-
- for mod in defs["messages"]:
- eid = mod["id"]
- source_text = ""
- if "default" in mod:
- source_text = mod["default"]
- if eid in obj:
- source_text = obj[eid]
- str_group_messages.append(TranslationItem(eid, len(str_table)))
- str_table.append(source_text)
-
- 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]
- str_group_messageswarn.append(TranslationItem(eid, len(str_table)))
- str_table.append(source_text)
-
- # ----- Reading Characters
-
- obj = lang["characters"]
-
- for mod in defs["characters"]:
- eid = mod["id"]
- str_group_characters.append(TranslationItem(eid, len(str_table)))
- str_table.append(obj[eid])
-
- # ----- Reading SettingsDescriptions
- obj = lang["menuOptions"]
-
- for index, mod in enumerate(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"]
- str_group_settingshortnames.append(
- TranslationItem(f"[{index:02d}] {eid}", len(str_table))
- )
- str_table.append(source_text)
-
- # ----- Reading Menu Groups
- obj = lang["menuGroups"]
-
- for index, mod in enumerate(defs["menuGroups"]):
- 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"]
- str_group_settingmenuentries.append(
- TranslationItem(f"[{index:02d}] {eid}", len(str_table))
- )
- str_table.append(source_text)
-
- # ----- Reading Menu Groups Descriptions
- obj = lang["menuGroups"]
-
- for index, mod in enumerate(defs["menuGroups"]):
- eid = mod["id"]
- str_group_settingmenuentriesdesc.append(
- TranslationItem(f"[{index:02d}] {eid}", len(str_table))
- )
- str_table.append(obj[eid]["desc"])
+ byte_encoded_strings: List[bytes] = [] # List of byte arrays of encoded strings
+ byte_encoded_strings_unencoded_reference: List[str] = []
@dataclass
- class RemappedTranslationItem:
- str_index: int
+ class TranslatedStringLocation:
+ byte_encoded_translation_index: int = 0
str_start_offset: int = 0
- # ----- Perform suffix merging optimization:
- #
- # We sort the backward strings so that strings with the same suffix will
- # be next to each other, e.g.:
- # "ef\0",
- # "cdef\0",
- # "abcdef\0",
- backward_sorted_table: List[Tuple[int, str, bytes]] = sorted(
- (
- (i, s, bytes(reversed(convert_string_bytes(symbol_conversion_table, s))))
- for i, s in enumerate(str_table)
- ),
- key=lambda x: x[2],
- )
- str_remapping: List[Optional[RemappedTranslationItem]] = [None] * len(str_table)
- for i, (str_index, source_str, converted) in enumerate(backward_sorted_table[:-1]):
- j = i
- while backward_sorted_table[j + 1][2].startswith(converted):
- j += 1
- if j + 1 == len(backward_sorted_table):
- break
- if j != i:
- str_remapping[str_index] = RemappedTranslationItem(
- str_index=backward_sorted_table[j][0],
- str_start_offset=len(backward_sorted_table[j][2]) - len(converted),
+ translated_string_lookups: Dict[str, TranslatedStringLocation] = {}
+
+ # We do the collapse on the encoded strings; since we are doing different fonts, this avoids needing to track fonts
+ # Also means if things line up nicely for us; we can do it across fonts (rare)
+ def add_encoded_string(
+ unencoded_string: str, encoded_string: bytes, translation_id: str
+ ):
+ for i, byte_data in enumerate(byte_encoded_strings):
+ if byte_data.endswith(encoded_string):
+ logging.info(f"Collapsing {translation_id}")
+ record = TranslatedStringLocation(
+ i, len(byte_data) - len(encoded_string)
+ )
+ translated_string_lookups[translation_id] = record
+ return
+ byte_encoded_strings.append(encoded_string)
+ byte_encoded_strings_unencoded_reference.append(unencoded_string)
+ record = TranslatedStringLocation(len(byte_encoded_strings) - 1, 0)
+ translated_string_lookups[translation_id] = record
+
+ def encode_string_and_add(
+ message: str, translation_id: str, force_large_text: bool = False
+ ):
+ encoded_data: bytes
+ if force_large_text is False and test_is_small_font(message):
+ encoded_data = convert_string_bytes(
+ small_font_symbol_conversion_table, message
)
+ else:
+ if force_large_text is False:
+ message = "\n" + message
+ encoded_data = convert_string_bytes(
+ large_font_symbol_conversion_table, message
+ )
+ add_encoded_string(message, encoded_data, translation_id)
+
+ for index, record in enumerate(defs["menuOptions"]):
+ lang_data = lang["menuOptions"][record["id"]]
+ # Add to translations the menu text and the description
+ encode_string_and_add(
+ lang_data["description"], "menuOptions" + record["id"] + "description", True
+ )
+ encode_string_and_add(
+ lang_data["displayText"], "menuOptions" + record["id"] + "displayText"
+ )
+
+ for index, record in enumerate(defs["menuGroups"]):
+ lang_data = lang["menuGroups"][record["id"]]
+ # Add to translations the menu text and the description
+ encode_string_and_add(
+ lang_data["description"], "menuGroups" + record["id"] + "description", True
+ )
+ encode_string_and_add(
+ lang_data["displayText"], "menuGroups" + record["id"] + "displayText"
+ )
+
+ for index, record in enumerate(defs["messagesWarn"]):
+ lang_data = lang["messagesWarn"][record["id"]]
+ # Add to translations the menu text and the description
+ encode_string_and_add(
+ lang_data["message"], "messagesWarn" + record["id"] + "Message"
+ )
+
+ for index, record in enumerate(defs["characters"]):
+ lang_data = lang["characters"][record["id"]]
+ # Add to translations the menu text and the description
+ encode_string_and_add(lang_data, "characters" + record["id"] + "Message", True)
# ----- Write the string table:
- str_offsets = [-1] * len(str_table)
offset = 0
- write_null = False
# NOTE: Cannot specify C99 designator here due to GCC (g++) bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55227
translation_strings_text = " /* .strings = */ {\n"
- for i, source_str in enumerate(str_table):
- if str_remapping[i] is not None:
- continue
- if write_null:
+
+ for i, encoded_bytes in enumerate(byte_encoded_strings):
+
+ if i > 0:
translation_strings_text += ' "\\0"\n'
- write_null = True
- # Find what items use this string
- str_used_by = [i] + [
- j for j, r in enumerate(str_remapping) if r and r.str_index == i
- ]
- for j in str_used_by:
- for group, pre_info in [
- (str_group_messages, "messages"),
- (str_group_messageswarn, "messagesWarn"),
- (str_group_characters, "characters"),
- (str_group_settingdesc, "SettingsDescriptions"),
- (str_group_settingshortnames, "SettingsShortNames"),
- (str_group_settingmenuentries, "SettingsMenuEntries"),
- (str_group_settingmenuentriesdesc, "SettingsMenuEntriesDescriptions"),
- ]:
- for item in group:
- if item.str_index == j:
- translation_strings_text += (
- f" // - {pre_info} {item.info}\n"
- )
- if j == i:
- translation_strings_text += (
- f" // {offset: >4}: {escape(source_str)}\n"
- )
- str_offsets[j] = offset
- else:
- remapped = str_remapping[j]
- assert remapped is not None
- translation_strings_text += f" // {offset + remapped.str_start_offset: >4}: {escape(str_table[j])}\n"
- str_offsets[j] = offset + remapped.str_start_offset
- converted_bytes = convert_string_bytes(symbol_conversion_table, source_str)
- translation_strings_text += f' "{bytes_to_escaped(converted_bytes)}"'
- str_offsets[i] = offset
- # Add the length and the null terminator
- offset += len(converted_bytes) + 1
+
+ # Write a comment of what it is
+ translation_strings_text += f" // {offset: >4}: {escape(byte_encoded_strings_unencoded_reference[i])}\n"
+ # Write the actual data
+ translation_strings_text += f' "{bytes_to_escaped(encoded_bytes)}"'
+ offset += len(encoded_bytes) + 1
+
translation_strings_text += "\n }, // .strings\n\n"
str_total_bytes = offset
+ ################# Part 2: Emit all the string offsets
- def get_offset(idx: int) -> int:
- assert str_offsets[idx] >= 0
- return str_offsets[idx]
+ string_index_commulative_lengths = []
+ position = 0
+ for string in byte_encoded_strings:
+ string_index_commulative_lengths.append(position)
+ position += len(string) + 1
translation_indices_text = " .indices = {\n"
- # ----- Write the messages string indices:
- for group in [str_group_messages, str_group_messageswarn, str_group_characters]:
- for item in group:
- translation_indices_text += f" .{item.info} = {get_offset(item.str_index)}, // {escape(str_table[item.str_index])}\n"
- translation_indices_text += "\n"
+ # Write out the constant strings (ones we reference directly)
- # ----- Write the settings index tables:
- for group, name in [
- (str_group_settingdesc, "SettingsDescriptions"),
- (str_group_settingshortnames, "SettingsShortNames"),
- (str_group_settingmenuentries, "SettingsMenuEntries"),
- (str_group_settingmenuentriesdesc, "SettingsMenuEntriesDescriptions"),
- ]:
+ for _, record in enumerate(defs["messagesWarn"]):
+ # Add to translations the menu text and the description
+ lang_data = lang["messagesWarn"][record["id"]]
+ key = "messagesWarn" + record["id"] + "Message"
+ translated_index = translated_string_lookups[key]
+ string_index = translated_index.byte_encoded_translation_index
+ start_index = (
+ string_index_commulative_lengths[string_index]
+ + translated_index.str_start_offset
+ )
+
+ translation_indices_text += (
+ f" .{record['id']} = {start_index}, // {escape(lang_data['message'])}\n"
+ )
+
+ translation_indices_text += "\n"
+
+ # Constant short values we use in settings menu
+
+ for _, record in enumerate(defs["characters"]):
+ # Add to translations the menu text and the description
+ lang_data = lang["characters"][record["id"]]
+ key = "characters" + record["id"] + "Message"
+ translated_index = translated_string_lookups[key]
+ string_index = translated_index.byte_encoded_translation_index
+ start_index = (
+ string_index_commulative_lengths[string_index]
+ + translated_index.str_start_offset
+ )
+
+ translation_indices_text += (
+ f" .{record['id']} = {start_index}, // {escape(lang_data)}\n"
+ )
+
+ translation_indices_text += "\n"
+
+ # Now for the fun ones, where they are nested and ordered
+
+ def write_grouped_indexes(output_text: str, name: str, mainKey: str, subKey: str):
max_len = 30
- translation_indices_text += f" .{name} = {{\n"
- for item in group:
- translation_indices_text += f" /* {item.info.ljust(max_len)[:max_len]} */ {get_offset(item.str_index)}, // {escape(str_table[item.str_index])}\n"
- translation_indices_text += f" }}, // {name}\n\n"
+ output_text += f" .{name} = {{\n"
+ for index, record in enumerate(defs[mainKey]):
+ lang_data = lang[mainKey][record["id"]]
+ key = mainKey + record["id"] + subKey
+ raw_string = lang_data[subKey]
+ translated_index = translated_string_lookups[key]
+ string_index = translated_index.byte_encoded_translation_index
+ start_index = (
+ string_index_commulative_lengths[string_index]
+ + translated_index.str_start_offset
+ )
+
+ output_text += f" /* {record['id'].ljust(max_len)[:max_len]} */ {start_index}, // {escape(raw_string)}\n"
+
+ output_text += f" }}, // {name}\n\n"
+ return output_text
+
+ translation_indices_text = write_grouped_indexes(
+ translation_indices_text, "SettingsDescriptions", "menuOptions", "description"
+ )
+ translation_indices_text = write_grouped_indexes(
+ translation_indices_text, "SettingsShortNames", "menuOptions", "displayText"
+ )
+ translation_indices_text = write_grouped_indexes(
+ translation_indices_text,
+ "SettingsMenuEntriesDescriptions",
+ "menuGroups",
+ "description",
+ )
+ translation_indices_text = write_grouped_indexes(
+ translation_indices_text, "SettingsMenuEntries", "menuGroups", "displayText"
+ )
translation_indices_text += " }, // .indices\n\n"
@@ -1331,7 +1327,7 @@ def main() -> None:
logging.info(f"Build version: {build_version}")
logging.info(f"Making {args.languageCodes} from {json_dir}")
- defs_ = load_json(os.path.join(json_dir, "translations_def.js"), True)
+ defs_ = load_json(os.path.join(json_dir, "translations_definitions.json"))
if len(args.languageCodes) == 1:
lang_ = read_translation(json_dir, args.languageCodes[0])
language_data = prepare_language(lang_, defs_, build_version)
diff --git a/Translations/migrate.py b/Translations/migrate.py
new file mode 100755
index 00000000..286a93db
--- /dev/null
+++ b/Translations/migrate.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+
+import json
+import os
+import sys
+
+# Migrate json files to use "\n" encoding rather than []
+
+
+def load_json(filename: str) -> dict:
+ with open(filename, "r", encoding="utf8") as f:
+ return json.loads(f.read())
+
+
+def save_json(filename: str, data: dict):
+ with open(filename, "w", encoding="utf8") as f:
+ json.dump(data, f, indent=4, ensure_ascii=False)
+
+
+file_name = sys.argv[1]
+print(file_name)
+
+data = load_json(file_name)
+
+# Migrate messages to be delimited
+for key in data["messagesWarn"]:
+ old_message = data["messagesWarn"][key]
+ if isinstance(old_message, list):
+ print(old_message)
+ new_message = "\n".join(old_message)
+ data["messagesWarn"][key] = {"message": new_message}
+ else:
+ data["messagesWarn"][key] = {"message": old_message}
+
+for key in data["messages"]:
+ old_message = data["messages"][key]
+ if isinstance(old_message, list):
+ print(old_message)
+ new_message = "\n".join(old_message)
+ data["messagesWarn"][key] = {"message": new_message}
+ else:
+ data["messagesWarn"][key] = {"message": old_message}
+
+del data["messages"]
+print("Part 2")
+# for menu-groups break out the text2 field
+for key in data["menuGroups"]:
+ old_data = data["menuGroups"][key]
+ if isinstance(old_data.get("text2", ""), list):
+ new_data = "\n".join(old_data["text2"])
+ data["menuGroups"][key]["displayText"] = new_data
+ del data["menuGroups"][key]["text2"]
+ else:
+ data["menuGroups"][key]["displayText"] = old_data["text2"].replace("\n", "")
+ del data["menuGroups"][key]["text2"]
+ data["menuGroups"][key]["description"] = data["menuGroups"][key]["desc"]
+ del data["menuGroups"][key]["desc"]
+
+
+print("Part 3")
+# for menu-groups break out the text2 field
+for key in data["menuOptions"]:
+ old_data = data["menuOptions"][key]
+ if isinstance(old_data.get("text2", ""), list):
+ new_data = "\n".join(old_data["text2"])
+ data["menuOptions"][key]["displayText"] = new_data
+ del data["menuOptions"][key]["text2"]
+ else:
+ data["menuOptions"][key]["displayText"] = old_data["text2"].replace("\n", "")
+ del data["menuOptions"][key]["text2"]
+ data["menuOptions"][key]["description"] = data["menuOptions"][key]["desc"]
+ del data["menuOptions"][key]["desc"]
+
+
+save_json(file_name, data)
diff --git a/Translations/translation_BE.json b/Translations/translation_BE.json
index 67b9ae2a..e901ab09 100644
--- a/Translations/translation_BE.json
+++ b/Translations/translation_BE.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "BE",
- "languageLocalName": "Беларуская",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Пераканайцеся, што пры наступнай загрузцы наканечнік і ручка маюць пакаёвую тэмпературу!",
- "CJCCalibrating": "каліброўка",
- "SettingsResetWarning": "Вы ўпэннены, што жадаеце зкінуць налады да першапачатковых значэнняў?",
- "UVLOWarningString": "НАПРУГА--",
- "UndervoltageString": "Нізкая напруга",
- "InputVoltageString": "Сілкаванне В: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Чаканне...",
- "SleepingTipAdvancedString": "Джала:",
- "OffString": "Выкл.",
- "DeviceFailedValidationWarning": "Ваша прылада, хутчэй за ўсё, падробка!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Скід OK",
- "SettingsResetMessage": [
- "Налады",
- "зкінуты!"
- ],
- "NoAccelerometerMessage": [
- "Ня вызначаны",
- "акселерометр!"
- ],
- "NoPowerDeliveryMessage": [
- "Няма USB-PD IC",
- "выяўлены!"
- ],
- "LockingKeysString": "ЗАМКНУТЫ",
- "UnlockingKeysString": "АДЫМКНУТЫ",
- "WarningKeysLockedString": "!ЗАМКНУТЫ!",
- "WarningThermalRunaway": [
- "Цеплавы",
- "Уцякач"
- ]
- },
- "characters": {
- "SettingRightChar": "П",
- "SettingLeftChar": "Л",
- "SettingAutoChar": "А",
- "SettingOffChar": "O",
- "SettingSlowChar": "М",
- "SettingMediumChar": "С",
- "SettingFastChar": "Х",
- "SettingStartNoneChar": "В",
- "SettingStartSolderingChar": "П",
- "SettingStartSleepChar": "Ч",
- "SettingStartSleepOffChar": "К",
- "SettingSensitivityOff": "А",
- "SettingSensitivityLow": "Н",
- "SettingSensitivityMedium": "С",
- "SettingSensitivityHigh": "В",
- "SettingLockDisableChar": "А",
- "SettingLockBoostChar": "Т",
- "SettingLockFullChar": "П"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Налады",
- "сілкавання"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Налады",
- "пайкі"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Рэжымы",
- "сну"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Налады",
- "інтэрфейсу"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Дадатковыя",
- "налады"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Крыніца",
- "сілкавання"
- ],
- "desc": "Крыніца сілкавання. Усталюе напругу адсечкі. (DC 10В) (S 3,3В на ячэйку, без абмежавання магутнасці)"
- },
- "MinVolCell": {
- "text2": [
- "Мін.",
- "напр."
- ],
- "desc": "Мінімальная дазволеная напруга на ячэйку (3S: 3 - 3,7V | 4S: 2,4 - 3,7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Магутнасць",
- "сілкавання"
- ],
- "desc": "Магутнасць выкарыстоўваемай крыніцы сілкавання"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "прыпынак"
- ],
- "desc": "Час чакання ўзгаднення PD з крокам 100 мс для сумяшчальнасці з некаторымі зараднымі зараднымі прыладамі QC (0: адключана)"
- },
- "BoostTemperature": {
- "text2": [
- "t° турба",
- "рэжыму"
- ],
- "desc": "Тэмпература джала ў турба-рэжыме"
- },
- "AutoStart": {
- "text2": [
- "Аўта",
- "старт"
- ],
- "desc": "Рэжым, у якім запускаецца паяльнік пры падачы сілкавання (В=Выкл. | П=Пайка | Ч=Чаканне | К=Чаканне пры комн. тэмп.)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Крок тэмп.",
- "кар. нац."
- ],
- "desc": "Крок вымярэння тэмпературы пры кароткім націску кнопак"
- },
- "TempChangeLongStep": {
- "text2": [
- "Крок тэмп.",
- "пад. нац."
- ],
- "desc": "Крок вымярэння тэмпературы пры падоўжаным націску кнопак"
- },
- "LockingMode": {
- "text2": [
- "Дазволіць",
- "блок. кнопак"
- ],
- "desc": "Пры рабоце падоўжаны націск дзьвух кнопак блакуе іх (А=Адключана | Т=Толькі турба | П=Поўная блакіроўка)"
- },
- "MotionSensitivity": {
- "text2": [
- "Адчувальнасць",
- "акселерометра"
- ],
- "desc": "Адчувальнасць акселерометра (0=Выкл. | 1=Мін. | ... | 9=Макс.)"
- },
- "SleepTemperature": {
- "text2": [
- "Тэмп.",
- "чакання"
- ],
- "desc": "Тэмпература рэжыму чакання"
- },
- "SleepTimeout": {
- "text2": [
- "Таймаўт",
- "чакання"
- ],
- "desc": "Час да пераходу ў рэжым чакання (Хвіліны | Секунды)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Таймаут",
- "выключэння"
- ],
- "desc": "Час да адключэння паяльніка (Хвіліны)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Эфект Хола",
- "адчувальнасць"
- ],
- "desc": "Узровень адчувальнасці датчыка хола ў рэжыме сну (0=Выкл. | 1=Мін. | ... | 9=Макс.)"
- },
- "TemperatureUnit": {
- "text2": [
- "Адзінкі",
- "тэмпературы"
- ],
- "desc": "Адзінкі вымярэння тэмпературы (C=Цэльcія | F=Фарэнгейта)"
- },
- "DisplayRotation": {
- "text2": [
- "Арыентацыя",
- "экрану"
- ],
- "desc": "Арыентацыя экрану (П=Правая рука | Л=Левая рука | А=Аўта)"
- },
- "CooldownBlink": {
- "text2": [
- "Мігценне t°",
- "пры астуджэнні"
- ],
- "desc": "Міргаць тэмпературай на экране астуджэння, пакуль джала яшчэ гарачае"
- },
- "ScrollingSpeed": {
- "text2": [
- "Хуткацсь",
- "тексту"
- ],
- "desc": "Хуткасць гартання тэксту (М=марудна | Х=хутка)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Інвертаваць",
- "кнопкі"
- ],
- "desc": "Інвертаваць кнопкі вымярэння тэмпературы"
- },
- "AnimSpeed": {
- "text2": [
- "Хуткасць",
- "анімацыі"
- ],
- "desc": "Хуткасць анімацыі гузікаў у галоўным меню (Мілісекунды) (А=Адключана | Н=Нізкая | С=Сярэдняя | В=Высокая)"
- },
- "AnimLoop": {
- "text2": [
- "Зацыкленая",
- "анімацыя"
- ],
- "desc": "Зацыкленая анімацыя гузікаў у галоўным меню"
- },
- "Brightness": {
- "text2": [
- "Экран",
- "Яркасць"
- ],
- "desc": "Адрэгулюйце кантраснасць / яркасць OLED-экрана"
- },
- "ColourInversion": {
- "text2": [
- "Экран",
- "Інвертаваць"
- ],
- "desc": "Інвертаваць колеры OLED-экрана"
- },
- "LOGOTime": {
- "text2": [
- "Лагатып загрузкі",
- "працягласць"
- ],
- "desc": "Усталяваць працягласць лагатыпа загрузкі (s=Секунды)"
- },
- "AdvancedIdle": {
- "text2": [
- "Падрабязны",
- "рэжым чакання"
- ],
- "desc": "Адлюстроўваць дэталёвую инфармацыю паменьшаным шрыфтом на экране чакання"
- },
- "AdvancedSoldering": {
- "text2": [
- "Падрабязны",
- "экран пайкі"
- ],
- "desc": "Паказваць дэталёвую інформацыю на экране пайкі"
- },
- "PowerLimit": {
- "text2": [
- "Межы",
- "магутнасці"
- ],
- "desc": "Максімальная магутнасць, якую можа выкарыстоўваць паяльнік (Ватт)"
- },
- "CalibrateCJC": {
- "text2": [
- "Каліброўка тэмпературы",
- "пры наступнай загрузцы"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Каліброўка",
- "напругі"
- ],
- "desc": "Каліброўка ўваходнай напругі (падоўжаны націск для выхаду)"
- },
- "PowerPulsePower": {
- "text2": [
- "Сіла імп.",
- "сілкав. Вт"
- ],
- "desc": "Моц імпульса ўтрымливаючага ад сну павербанку ці іншай крыніцы сілкавання"
- },
- "PowerPulseWait": {
- "text2": [
- "Імпульс магутнасці",
- "час чакання"
- ],
- "desc": "Час чакання перад запускам кожнага імпульсу няспання (x 2.5 с)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Імпульс магутнасці",
- "працягласць"
- ],
- "desc": "Працягласць імпульсу няспання (x 250 мс)"
- },
- "SettingsReset": {
- "text2": [
- "Скід",
- "наладаў"
- ],
- "desc": "Скід наладаў да першапачатковых значэнняў"
- },
- "LanguageSwitch": {
- "text2": [
- "Мова:",
- " BY Беларуская"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "BE",
+ "languageLocalName": "Беларуская",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Каліброўка\nзроблена!"
+ },
+ "ResetOKMessage": {
+ "message": "Скід OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Налады\nзкінуты!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Ня вызначаны\nакселерометр!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Няма USB-PD IC\nвыяўлены!"
+ },
+ "LockingKeysString": {
+ "message": "ЗАМКНУТЫ"
+ },
+ "UnlockingKeysString": {
+ "message": "АДЫМКНУТЫ"
+ },
+ "WarningKeysLockedString": {
+ "message": "!ЗАМКНУТЫ!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Некантралюемае\nразаграванне"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Пераканайцеся, што пры наступнай загрузцы наканечнік і ручка маюць пакаёвую тэмпературу!"
+ },
+ "CJCCalibrating": {
+ "message": "каліброўка\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Вы ўпэннены, што жадаеце зкінуць налады да першапачатковых значэнняў?"
+ },
+ "UVLOWarningString": {
+ "message": "НАПРУГА--"
+ },
+ "UndervoltageString": {
+ "message": "Нізкая напруга\n"
+ },
+ "InputVoltageString": {
+ "message": "Сілкаванне В: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Чаканне...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Джала: \n"
+ },
+ "OffString": {
+ "message": "Выкл."
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Ваша прылада, хутчэй за ўсё, падробка!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "П",
+ "SettingLeftChar": "Л",
+ "SettingAutoChar": "А",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "М",
+ "SettingMediumChar": "С",
+ "SettingFastChar": "Х",
+ "SettingStartNoneChar": "В",
+ "SettingStartSolderingChar": "П",
+ "SettingStartSleepChar": "Ч",
+ "SettingStartSleepOffChar": "К",
+ "SettingLockDisableChar": "А",
+ "SettingLockBoostChar": "Т",
+ "SettingLockFullChar": "П"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Налады\nсілкавання",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Налады\nпайкі",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Рэжымы\nсну",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Налады\nінтэрфейсу",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Дадатковыя\nналады",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Крыніца\nсілкавання",
+ "description": "Крыніца сілкавання. Усталюе напругу адсечкі. (DC 10В) (S 3,3В на ячэйку, без абмежавання магутнасці)"
+ },
+ "MinVolCell": {
+ "displayText": "Мін.\nнапр.",
+ "description": "Мінімальная дазволеная напруга на ячэйку (3S: 3 - 3,7V | 4S: 2,4 - 3,7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Магутнасць\nсілкавання",
+ "description": "Магутнасць выкарыстоўваемай крыніцы сілкавання"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\nпрыпынак",
+ "description": "Час чакання ўзгаднення PD з крокам 100 мс для сумяшчальнасці з некаторымі зараднымі зараднымі прыладамі QC (0: адключана)"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Уключае рэжымы PPS & EPR."
+ },
+ "BoostTemperature": {
+ "displayText": "t° турба\nрэжыму",
+ "description": "Тэмпература джала ў турба-рэжыме"
+ },
+ "AutoStart": {
+ "displayText": "Аўта\nстарт",
+ "description": "Рэжым, у якім запускаецца паяльнік пры падачы сілкавання (В=Выкл. | П=Пайка | Ч=Чаканне | К=Чаканне пры комн. тэмп.)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Крок тэмп.\nкар. нац.",
+ "description": "Крок вымярэння тэмпературы пры кароткім націску кнопак"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Крок тэмп.\nпад. нац.",
+ "description": "Крок вымярэння тэмпературы пры падоўжаным націску кнопак"
+ },
+ "LockingMode": {
+ "displayText": "Дазволіць\nблок. кнопак",
+ "description": "Пры рабоце падоўжаны націск дзьвух кнопак блакуе іх (А=Адключана | Т=Толькі турба | П=Поўная блакіроўка)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Адчувальнасць\nакселерометра",
+ "description": "Адчувальнасць акселерометра (0=Выкл. | 1=Мін. | ... | 9=Макс.)"
+ },
+ "SleepTemperature": {
+ "displayText": "Тэмп.\nчакання",
+ "description": "Тэмпература рэжыму чакання"
+ },
+ "SleepTimeout": {
+ "displayText": "Таймаўт\nчакання",
+ "description": "Час да пераходу ў рэжым чакання (Хвіліны | Секунды)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Таймаут\nвыключэння",
+ "description": "Час да адключэння паяльніка (Хвіліны)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Эфект Хола\nадчувальнасць",
+ "description": "Узровень адчувальнасці датчыка хола ў рэжыме сну (0=Выкл. | 1=Мін. | ... | 9=Макс.)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Адзінкі\nтэмпературы",
+ "description": "Адзінкі вымярэння тэмпературы (C=Цэльcія | F=Фарэнгейта)"
+ },
+ "DisplayRotation": {
+ "displayText": "Арыентацыя\nэкрану",
+ "description": "Арыентацыя экрану (П=Правая рука | Л=Левая рука | А=Аўта)"
+ },
+ "CooldownBlink": {
+ "displayText": "Мігценне t°\nпры астуджэнні",
+ "description": "Міргаць тэмпературай на экране астуджэння, пакуль джала яшчэ гарачае"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Хуткацсь\nтексту",
+ "description": "Хуткасць гартання тэксту (М=марудна | Х=хутка)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Інвертаваць\nкнопкі",
+ "description": "Інвертаваць кнопкі вымярэння тэмпературы"
+ },
+ "AnimSpeed": {
+ "displayText": "Хуткасць\nанімацыі",
+ "description": "Хуткасць анімацыі гузікаў у галоўным меню (Мілісекунды) (А=Адключана | Н=Нізкая | С=Сярэдняя | В=Высокая)"
+ },
+ "AnimLoop": {
+ "displayText": "Зацыкленая\nанімацыя",
+ "description": "Зацыкленая анімацыя гузікаў у галоўным меню"
+ },
+ "Brightness": {
+ "displayText": "Экран\nЯркасць",
+ "description": "Адрэгулюйце кантраснасць / яркасць OLED-экрана"
+ },
+ "ColourInversion": {
+ "displayText": "Экран\nІнвертаваць",
+ "description": "Інвертаваць колеры OLED-экрана"
+ },
+ "LOGOTime": {
+ "displayText": "Лагатып загрузкі\nпрацягласць",
+ "description": "Усталяваць працягласць лагатыпа загрузкі (s=Секунды)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Падрабязны\nрэжым чакання",
+ "description": "Адлюстроўваць дэталёвую инфармацыю паменьшаным шрыфтом на экране чакання"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Падрабязны\nэкран пайкі",
+ "description": "Паказваць дэталёвую інформацыю на экране пайкі"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Межы\nмагутнасці",
+ "description": "Максімальная магутнасць, якую можа выкарыстоўваць паяльнік (Ватт)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Каліброўка тэмпературы\nпры наступнай загрузцы",
+ "description": "Каліброўка тэмпературы пры наступным уключэнні (не патрабуецца, калі розніца тэмператур меньш за 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Каліброўка\nнапругі",
+ "description": "Каліброўка ўваходнай напругі (падоўжаны націск для выхаду)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Сіла імп.\nсілкав. Вт",
+ "description": "Моц імпульса ўтрымливаючага ад сну павербанку ці іншай крыніцы сілкавання"
+ },
+ "PowerPulseWait": {
+ "displayText": "Імпульс магутнасці\nчас чакання",
+ "description": "Час чакання перад запускам кожнага імпульсу няспання (x 2.5 с)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Імпульс магутнасці\nпрацягласць",
+ "description": "Працягласць імпульсу няспання (x 250 мс)"
+ },
+ "SettingsReset": {
+ "displayText": "Скід\nналадаў",
+ "description": "Скід наладаў да першапачатковых значэнняў"
+ },
+ "LanguageSwitch": {
+ "displayText": "Мова:\n BY Беларуская",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_BG.json b/Translations/translation_BG.json
index e6715866..af386423 100644
--- a/Translations/translation_BG.json
+++ b/Translations/translation_BG.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "BG",
- "languageLocalName": "Български",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Сигурни ли сте, че искате да върнете фабричните настройки?",
- "UVLOWarningString": "Ниско DC Напрежение",
- "UndervoltageString": "Ниско Напрежение",
- "InputVoltageString": "Входно V: ",
- "SleepingSimpleString": "Сън",
- "SleepingAdvancedString": "Хър Хър Хър...",
- "SleepingTipAdvancedString": "Връх:",
- "OffString": "Изкл.",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Нулиране",
- "SettingsResetMessage": [
- "Настройките бяха",
- "нулирани!"
- ],
- "NoAccelerometerMessage": [
- "No accelerometer",
- "detected!"
- ],
- "NoPowerDeliveryMessage": [
- "No USB-PD IC",
- "detected!"
- ],
- "LockingKeysString": "LOCKED",
- "UnlockingKeysString": "UNLOCKED",
- "WarningKeysLockedString": "!LOCKED!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "R",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "S",
- "SettingMediumChar": "M",
- "SettingFastChar": "F",
- "SettingStartNoneChar": "И",
- "SettingStartSolderingChar": "Р",
- "SettingStartSleepChar": "С",
- "SettingStartSleepOffChar": "П",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Power",
- "settings"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Поялник",
- "Настройки"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Режими",
- "Настройки"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Интерфейс",
- "Настройки"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Разширени",
- "Настройки"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Източник",
- "захранване"
- ],
- "desc": "Източник на захранване. Минимално напрежение. (DC 10V) (S 3,3V за клетка)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "voltage"
- ],
- "desc": "Minimum allowed voltage per battery cell (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Мощност на",
- "захранване"
- ],
- "desc": "Мощност на избраното захранване"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
- },
- "BoostTemperature": {
- "text2": [
- "Турбо",
- "темп."
- ],
- "desc": "Температура за \"турбо\" режим"
- },
- "AutoStart": {
- "text2": [
- "Автоматичен",
- "работен режим"
- ],
- "desc": "Режим на поялника при включване на захранването. (И=Изключен | Р=Работен | С=Сън | П=Сън температура помещение)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Промяна T",
- "бързо?"
- ],
- "desc": "Промяна на температура при бързо натискане на бутон!"
- },
- "TempChangeLongStep": {
- "text2": [
- "Промяна Т",
- "задържане?"
- ],
- "desc": "Промяна на температура при задържане на бутон!"
- },
- "LockingMode": {
- "text2": [
- "Allow locking",
- "buttons"
- ],
- "desc": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
- },
- "MotionSensitivity": {
- "text2": [
- "Усещане",
- "за движение"
- ],
- "desc": "Усещане за движение (0=Изключено | 1=Слабо | ... | 9=Силно)"
- },
- "SleepTemperature": {
- "text2": [
- "Темп.",
- "сън"
- ],
- "desc": "Температура при режим \"сън\" (C)"
- },
- "SleepTimeout": {
- "text2": [
- "Време",
- "сън"
- ],
- "desc": "Включване в режим \"сън\" след: (Минути | Секунди)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Време",
- "изкл."
- ],
- "desc": "Изключване след (Минути)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall sensor",
- "sensitivity"
- ],
- "desc": "Sensitivity to magnets (0=Изключено | 1=Слабо | ... | 9=Силно)"
- },
- "TemperatureUnit": {
- "text2": [
- "Единици за",
- "температура"
- ],
- "desc": "Единици за температура (C=Целзии | F=Фаренхайт)"
- },
- "DisplayRotation": {
- "text2": [
- "Ориентация",
- "на дисплея"
- ],
- "desc": "Ориентация на дисплея (R=Дясна Ръка | L=Лява Ръка | A=Автоматично)"
- },
- "CooldownBlink": {
- "text2": [
- "Мигай при",
- "топъл поялник"
- ],
- "desc": "След изключване от работен режим, индикатора за температура да мига докато човката на поялника все още е топла"
- },
- "ScrollingSpeed": {
- "text2": [
- "Скорост",
- "на текста"
- ],
- "desc": "Скорост на движение на този текст"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Размяна",
- "бутони +-?"
- ],
- "desc": "Обръщане на бутоните \"+\" и \"-\" за промяна на температурата на върха на поялника"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "speed"
- ],
- "desc": "Pace of icon animations in menu (O=off | S=slow | M=medium | F=fast)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loop icon animations in main menu"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Детайлен",
- "екран в покой"
- ],
- "desc": "Покажи детайлна информация със ситен шрифт на екрана в режим на покой."
- },
- "AdvancedSoldering": {
- "text2": [
- "Детайлен",
- "работен екран"
- ],
- "desc": "Детайлна информация в работен режим при запояване"
- },
- "PowerLimit": {
- "text2": [
- "Лимит на",
- "мощност"
- ],
- "desc": "Максимална мощност на поялника (Watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Калибриране",
- "напрежение?"
- ],
- "desc": "Калибриране на входното напрежение. Задръжте бутонa за изход"
- },
- "PowerPulsePower": {
- "text2": [
- "Захранващ",
- "импулс"
- ],
- "desc": "Поддържане на интензивност на захранващия импулс"
- },
- "PowerPulseWait": {
- "text2": [
- "Power pulse",
- "delay"
- ],
- "desc": "Delay before keep-awake-pulse is triggered (x 2,5с)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duration"
- ],
- "desc": "Keep-awake-pulse duration (x 250мс)"
- },
- "SettingsReset": {
- "text2": [
- "Фабрични",
- "настройки?"
- ],
- "desc": "Връщане на фабрични настройки"
- },
- "LanguageSwitch": {
- "text2": [
- "Език:",
- " BG Български"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "BG",
+ "languageLocalName": "Български",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Нулиране"
+ },
+ "SettingsResetMessage": {
+ "message": "Настройките бяха\nнулирани!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "No accelerometer\ndetected!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "No USB-PD IC\ndetected!"
+ },
+ "LockingKeysString": {
+ "message": "LOCKED"
+ },
+ "UnlockingKeysString": {
+ "message": "UNLOCKED"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LOCKED!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Сигурни ли сте, че искате да върнете фабричните настройки?"
+ },
+ "UVLOWarningString": {
+ "message": "Ниско DC Напрежение"
+ },
+ "UndervoltageString": {
+ "message": "Ниско Напрежение\n"
+ },
+ "InputVoltageString": {
+ "message": "Входно V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Сън"
+ },
+ "SleepingAdvancedString": {
+ "message": "Хър Хър Хър...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Връх: \n"
+ },
+ "OffString": {
+ "message": "Изкл."
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "R",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "S",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "F",
+ "SettingStartNoneChar": "И",
+ "SettingStartSolderingChar": "Р",
+ "SettingStartSleepChar": "С",
+ "SettingStartSleepOffChar": "П",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Power\nsettings",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Поялник\nНастройки",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Режими\nНастройки",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Интерфейс\nНастройки",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Разширени\nНастройки",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Източник\nзахранване",
+ "description": "Източник на захранване. Минимално напрежение. (DC 10V) (S 3,3V за клетка)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nvoltage",
+ "description": "Minimum allowed voltage per battery cell (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Мощност на\nзахранване",
+ "description": "Мощност на избраното захранване"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Турбо\nтемп.",
+ "description": "Температура за \"турбо\" режим"
+ },
+ "AutoStart": {
+ "displayText": "Автоматичен\nработен режим",
+ "description": "Режим на поялника при включване на захранването. (И=Изключен | Р=Работен | С=Сън | П=Сън температура помещение)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Промяна T\nбързо?",
+ "description": "Промяна на температура при бързо натискане на бутон!"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Промяна Т\nзадържане?",
+ "description": "Промяна на температура при задържане на бутон!"
+ },
+ "LockingMode": {
+ "displayText": "Allow locking\nbuttons",
+ "description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Усещане\nза движение",
+ "description": "Усещане за движение (0=Изключено | 1=Слабо | ... | 9=Силно)"
+ },
+ "SleepTemperature": {
+ "displayText": "Темп.\nсън",
+ "description": "Температура при режим \"сън\" (C)"
+ },
+ "SleepTimeout": {
+ "displayText": "Време\nсън",
+ "description": "Включване в режим \"сън\" след: (Минути | Секунди)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Време\nизкл.",
+ "description": "Изключване след (Минути)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall sensor\nsensitivity",
+ "description": "Sensitivity to magnets (0=Изключено | 1=Слабо | ... | 9=Силно)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Единици за\nтемпература",
+ "description": "Единици за температура (C=Целзии | F=Фаренхайт)"
+ },
+ "DisplayRotation": {
+ "displayText": "Ориентация\nна дисплея",
+ "description": "Ориентация на дисплея (R=Дясна Ръка | L=Лява Ръка | A=Автоматично)"
+ },
+ "CooldownBlink": {
+ "displayText": "Мигай при\nтопъл поялник",
+ "description": "След изключване от работен режим, индикатора за температура да мига докато човката на поялника все още е топла"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Скорост\nна текста",
+ "description": "Скорост на движение на този текст"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Размяна\nбутони +-?",
+ "description": "Обръщане на бутоните \"+\" и \"-\" за промяна на температурата на върха на поялника"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nspeed",
+ "description": "Pace of icon animations in menu (O=off | S=slow | M=medium | F=fast)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nloop",
+ "description": "Loop icon animations in main menu"
+ },
+ "Brightness": {
+ "displayText": "Screen\nbrightness",
+ "description": "Adjust the OLED screen brightness"
+ },
+ "ColourInversion": {
+ "displayText": "Invert\nscreen",
+ "description": "Invert the OLED screen colors"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Детайлен\nекран в покой",
+ "description": "Покажи детайлна информация със ситен шрифт на екрана в режим на покой."
+ },
+ "AdvancedSoldering": {
+ "displayText": "Детайлен\nработен екран",
+ "description": "Детайлна информация в работен режим при запояване"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Лимит на\nмощност",
+ "description": "Максимална мощност на поялника (Watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Калибриране\nнапрежение?",
+ "description": "Калибриране на входното напрежение. Задръжте бутонa за изход"
+ },
+ "PowerPulsePower": {
+ "displayText": "Захранващ\nимпулс",
+ "description": "Поддържане на интензивност на захранващия импулс"
+ },
+ "PowerPulseWait": {
+ "displayText": "Power pulse\ndelay",
+ "description": "Delay before keep-awake-pulse is triggered (x 2,5с)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Power pulse\nduration",
+ "description": "Keep-awake-pulse duration (x 250мс)"
+ },
+ "SettingsReset": {
+ "displayText": "Фабрични\nнастройки?",
+ "description": "Връщане на фабрични настройки"
+ },
+ "LanguageSwitch": {
+ "displayText": "Език:\n BG Български",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_CS.json b/Translations/translation_CS.json
index 6a7e6bf4..7acadb35 100644
--- a/Translations/translation_CS.json
+++ b/Translations/translation_CS.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "CS",
- "languageLocalName": "Český",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Opravdu chcete resetovat zařízení do továrního nastavení?",
- "UVLOWarningString": "Nízké DC",
- "UndervoltageString": "Nízké napětí",
- "InputVoltageString": "Napětí: ",
- "SleepingSimpleString": "Zzz ",
- "SleepingAdvancedString": "Režim spánku...",
- "SleepingTipAdvancedString": "Hrot:",
- "OffString": "Vyp",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Nějaká nastavení",
- "byla změněna!"
- ],
- "NoAccelerometerMessage": [
- "Akcelerometr",
- "nebyl detekován!"
- ],
- "NoPowerDeliveryMessage": [
- "Žádný IO USB-PD",
- "nebyl detekován!"
- ],
- "LockingKeysString": "ZAMČENO",
- "UnlockingKeysString": "ODEMČENO",
- "WarningKeysLockedString": "ZAMČENO!",
- "WarningThermalRunaway": [
- "Teplotní",
- "Ochrana"
- ]
- },
- "characters": {
- "SettingRightChar": "P",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "D",
- "SettingSlowChar": "P",
- "SettingMediumChar": "S",
- "SettingFastChar": "R",
- "SettingStartNoneChar": "V",
- "SettingStartSolderingChar": "P",
- "SettingStartSleepChar": "S",
- "SettingStartSleepOffChar": "M",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "M",
- "SettingSensitivityMedium": "S",
- "SettingSensitivityHigh": "V",
- "SettingLockDisableChar": "Z",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "U"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Napájecí",
- "nastavení"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Pájecí",
- "nastavení"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Režim",
- "spánku"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Uživatelské",
- "rozhraní"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Pokročilá",
- "nastavení"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Zdroj",
- "napájení"
- ],
- "desc": "Při nižším napětí ukončit pájení (DC 10V) (S 3,3V na článek, zakázat omezení napájení)."
- },
- "MinVolCell": {
- "text2": [
- "Minimální",
- "napětí"
- ],
- "desc": "Minimální dovolené napětí po článku (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Napětí",
- "QC"
- ],
- "desc": "Maximální napětí QC pro jednání páječkou"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "Maximální prodleva při jednání PD ve 100ms krocích pro kompatibilitu s některými QC nabíječkami"
- },
- "BoostTemperature": {
- "text2": [
- "Teplota",
- "boostu"
- ],
- "desc": "Teplota hrotu v \"režimu boost\""
- },
- "AutoStart": {
- "text2": [
- "Chování",
- "při startu"
- ],
- "desc": "V=vypnuto | P=pájecí teplota | S=spánková teplota | M=zahřát hrot po pohybu"
- },
- "TempChangeShortStep": {
- "text2": [
- "Krok teploty",
- "krátký?"
- ],
- "desc": "Velikost přídavku při změně teploty krátkým stiskem tlačítka"
- },
- "TempChangeLongStep": {
- "text2": [
- "Krok teploty",
- "dlouhý?"
- ],
- "desc": "Velikost přídavku při změně teploty dlouhým stiskem tlačítka"
- },
- "LockingMode": {
- "text2": [
- "Povolit zamč.",
- "tlačítek"
- ],
- "desc": "Při pájení podržte obě tlačítka pro jejich zamčení (Z=zakázáno | B=pouze v režimu boost | U=úplné zamčení)"
- },
- "MotionSensitivity": {
- "text2": [
- "Citlivost",
- "na pohyb"
- ],
- "desc": "0=vyp | 1=nejméně citlivé | ... | 9=nejvíce citlivé"
- },
- "SleepTemperature": {
- "text2": [
- "Teplota",
- "ve spánku"
- ],
- "desc": "Teplota hrotu v režimu spánku."
- },
- "SleepTimeout": {
- "text2": [
- "Čas",
- "do spánku"
- ],
- "desc": "\"Režim spánku\" naběhne v (s=sekundách | m=minutách)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Čas do",
- "vypnutí"
- ],
- "desc": "Interval automatického vypnutí (m=minut)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Citlivost",
- "Hall. čidla"
- ],
- "desc": "Citlivost Hallova čidla pro detekci spánku (0=vypnuto | 1=nejméně citlivé | ... | 9=nejvíce citlivé)"
- },
- "TemperatureUnit": {
- "text2": [
- "Jednotka",
- "teploty"
- ],
- "desc": "C=Celsius | F=Fahrenheit"
- },
- "DisplayRotation": {
- "text2": [
- "Orientace",
- "obrazovky"
- ],
- "desc": "P=pravák | L=levák | A=automaticky"
- },
- "CooldownBlink": {
- "text2": [
- "Blikáni při",
- "chladnutí"
- ],
- "desc": "Blikat teplotou při chladnutí dokud je hrot horký"
- },
- "ScrollingSpeed": {
- "text2": [
- "Rychlost",
- "posouvání"
- ],
- "desc": "Rychlost posouvání popisků podobných tomuto (P=pomalu | R=rychle)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Prohodit",
- "tl. +-?"
- ],
- "desc": "Prohodit tlačítka pro změnu teploty"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "rychlost"
- ],
- "desc": "Tempo animace ikon v menu (O=vypnuto | P=pomalu | S=středně | R=rychle)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "smyčka"
- ],
- "desc": "Animovat ikony hlavního menu ve smyčce"
- },
- "Brightness": {
- "text2": [
- "Jas",
- "obrazovky"
- ],
- "desc": "Upravit jas OLED"
- },
- "ColourInversion": {
- "text2": [
- "Invertovat",
- "obrazovku"
- ],
- "desc": "Invertovat barvy na OLED"
- },
- "LOGOTime": {
- "text2": [
- "Trvání",
- "boot loga"
- ],
- "desc": "Nastavení doby trvání boot loga (s=sekundy)"
- },
- "AdvancedIdle": {
- "text2": [
- "Podrobná obr.",
- "nečinnosti"
- ],
- "desc": "Zobrazit detailní informace malým fontem na obrazovce nečinnosti"
- },
- "AdvancedSoldering": {
- "text2": [
- "Podrobná obr.",
- "pájení"
- ],
- "desc": "Zobrazit detailní informace malým fontem na obrazovce pájení"
- },
- "PowerLimit": {
- "text2": [
- "Omezení",
- "Výkonu"
- ],
- "desc": "Maximální příkon páječky (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibrovat",
- "vstupní napětí?"
- ],
- "desc": "Začít kalibraci vstupního napětí (dlouhý stisk pro ukončení)"
- },
- "PowerPulsePower": {
- "text2": [
- "Napájecí",
- "pulz"
- ],
- "desc": "Intenzita výkonu pulzu pro udržení páječky vzhůru (watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Prodleva",
- "napáj. pulzu"
- ],
- "desc": "Prodleva než je spuštěn pulz pro udržení páječky vzhůru pulzu pro udržení páječky vzhůru (x 2,5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Délka",
- "napáj. pulzu"
- ],
- "desc": "Délka pulzu pro udržení páječky vzhůru (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Obnovit tovární",
- "nastavení?"
- ],
- "desc": "Obnovit všechna nastavení na výchozí"
- },
- "LanguageSwitch": {
- "text2": [
- "Jazyk:",
- " CS Český"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "CS",
+ "languageLocalName": "Český",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Nějaká nastavení\nbyla změněna!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Akcelerometr\nnebyl detekován!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Žádný IO USB-PD\nnebyl detekován!"
+ },
+ "LockingKeysString": {
+ "message": "ZAMČENO"
+ },
+ "UnlockingKeysString": {
+ "message": "ODEMČENO"
+ },
+ "WarningKeysLockedString": {
+ "message": "ZAMČENO!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Teplotní\nOchrana"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Opravdu chcete resetovat zařízení do továrního nastavení?"
+ },
+ "UVLOWarningString": {
+ "message": "Nízké DC"
+ },
+ "UndervoltageString": {
+ "message": "Nízké napětí\n"
+ },
+ "InputVoltageString": {
+ "message": "Napětí: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzz "
+ },
+ "SleepingAdvancedString": {
+ "message": "Režim spánku...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Hrot: \n"
+ },
+ "OffString": {
+ "message": "Vyp"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "P",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "D",
+ "SettingSlowChar": "P",
+ "SettingMediumChar": "S",
+ "SettingFastChar": "R",
+ "SettingStartNoneChar": "V",
+ "SettingStartSolderingChar": "P",
+ "SettingStartSleepChar": "S",
+ "SettingStartSleepOffChar": "M",
+ "SettingLockDisableChar": "Z",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "U"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Napájecí\nnastavení",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Pájecí\nnastavení",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Režim\nspánku",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Uživatelské\nrozhraní",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Pokročilá\nnastavení",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Zdroj\nnapájení",
+ "description": "Při nižším napětí ukončit pájení (DC 10V) (S 3,3V na článek, zakázat omezení napájení)."
+ },
+ "MinVolCell": {
+ "displayText": "Minimální\nnapětí",
+ "description": "Minimální dovolené napětí po článku (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Napětí\nQC",
+ "description": "Maximální napětí QC pro jednání páječkou"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "Maximální prodleva při jednání PD ve 100ms krocích pro kompatibilitu s některými QC nabíječkami"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Teplota\nboostu",
+ "description": "Teplota hrotu v \"režimu boost\""
+ },
+ "AutoStart": {
+ "displayText": "Chování\npři startu",
+ "description": "V=vypnuto | P=pájecí teplota | S=spánková teplota | M=zahřát hrot po pohybu"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Krok teploty\nkrátký?",
+ "description": "Velikost přídavku při změně teploty krátkým stiskem tlačítka"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Krok teploty\ndlouhý?",
+ "description": "Velikost přídavku při změně teploty dlouhým stiskem tlačítka"
+ },
+ "LockingMode": {
+ "displayText": "Povolit zamč.\ntlačítek",
+ "description": "Při pájení podržte obě tlačítka pro jejich zamčení (Z=zakázáno | B=pouze v režimu boost | U=úplné zamčení)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Citlivost\nna pohyb",
+ "description": "0=vyp | 1=nejméně citlivé | ... | 9=nejvíce citlivé"
+ },
+ "SleepTemperature": {
+ "displayText": "Teplota\nve spánku",
+ "description": "Teplota hrotu v režimu spánku."
+ },
+ "SleepTimeout": {
+ "displayText": "Čas\ndo spánku",
+ "description": "\"Režim spánku\" naběhne v (s=sekundách | m=minutách)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Čas do\nvypnutí",
+ "description": "Interval automatického vypnutí (m=minut)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Citlivost\nHall. čidla",
+ "description": "Citlivost Hallova čidla pro detekci spánku (0=vypnuto | 1=nejméně citlivé | ... | 9=nejvíce citlivé)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Jednotka\nteploty",
+ "description": "C=Celsius | F=Fahrenheit"
+ },
+ "DisplayRotation": {
+ "displayText": "Orientace\nobrazovky",
+ "description": "P=pravák | L=levák | A=automaticky"
+ },
+ "CooldownBlink": {
+ "displayText": "Blikáni při\nchladnutí",
+ "description": "Blikat teplotou při chladnutí dokud je hrot horký"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Rychlost\nposouvání",
+ "description": "Rychlost posouvání popisků podobných tomuto (P=pomalu | R=rychle)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Prohodit\ntl. +-?",
+ "description": "Prohodit tlačítka pro změnu teploty"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nrychlost",
+ "description": "Tempo animace ikon v menu (O=vypnuto | P=pomalu | S=středně | R=rychle)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nsmyčka",
+ "description": "Animovat ikony hlavního menu ve smyčce"
+ },
+ "Brightness": {
+ "displayText": "Jas\nobrazovky",
+ "description": "Upravit jas OLED"
+ },
+ "ColourInversion": {
+ "displayText": "Invertovat\nobrazovku",
+ "description": "Invertovat barvy na OLED"
+ },
+ "LOGOTime": {
+ "displayText": "Trvání\nboot loga",
+ "description": "Nastavení doby trvání boot loga (s=sekundy)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Podrobná obr.\nnečinnosti",
+ "description": "Zobrazit detailní informace malým fontem na obrazovce nečinnosti"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Podrobná obr.\npájení",
+ "description": "Zobrazit detailní informace malým fontem na obrazovce pájení"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Omezení\nVýkonu",
+ "description": "Maximální příkon páječky (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibrovat\nvstupní napětí?",
+ "description": "Začít kalibraci vstupního napětí (dlouhý stisk pro ukončení)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Napájecí\npulz",
+ "description": "Intenzita výkonu pulzu pro udržení páječky vzhůru (watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Prodleva\nnapáj. pulzu",
+ "description": "Prodleva než je spuštěn pulz pro udržení páječky vzhůru pulzu pro udržení páječky vzhůru (x 2,5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Délka\nnapáj. pulzu",
+ "description": "Délka pulzu pro udržení páječky vzhůru (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Obnovit tovární\nnastavení?",
+ "description": "Obnovit všechna nastavení na výchozí"
+ },
+ "LanguageSwitch": {
+ "displayText": "Jazyk:\n CS Český",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_DA.json b/Translations/translation_DA.json
index 37953a92..1b665ede 100644
--- a/Translations/translation_DA.json
+++ b/Translations/translation_DA.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "DA",
- "languageLocalName": "Dansk",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Er du sikker du vil resette indstillingerne til standard?",
- "UVLOWarningString": "Lav Volt",
- "UndervoltageString": "Undervolt",
- "InputVoltageString": "Input V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Dvale...",
- "SleepingTipAdvancedString": "Tip:",
- "OffString": "Off",
- "DeviceFailedValidationWarning": "Din enhed er højst sandsyneligt en Kopivare!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Visse indstillinger",
- "Er blevet ændret!"
- ],
- "NoAccelerometerMessage": [
- "ingen accelerometer",
- "fundet!"
- ],
- "NoPowerDeliveryMessage": [
- "ingen USB-PD IC",
- "Fundet!"
- ],
- "LockingKeysString": "LÅST",
- "UnlockingKeysString": "ULÅST",
- "WarningKeysLockedString": "!LÅST!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "H",
- "SettingLeftChar": "V",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "S",
- "SettingMediumChar": "M",
- "SettingFastChar": "F",
- "SettingStartNoneChar": "S",
- "SettingStartSolderingChar": "L",
- "SettingStartSleepChar": "D",
- "SettingStartSleepOffChar": "R",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Strøm",
- "Indstillinger"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Lodde",
- "Indstillinger"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Dvale",
- "mode"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Bruger",
- "Grændseflade"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Advancerede",
- "Indstillinger"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Strøm",
- "Kilde"
- ],
- "desc": "Strømforsyning. Indstil Cutoff Spændingen. (DC 10V) (S 3,3V per celle)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "Spænding"
- ],
- "desc": "Minimum tilladt spænding pr. celle (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC",
- "Spænding"
- ],
- "desc": "Max QC spænding Loddekolben skal forhandle sig til"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD-forhandlingstimeout i trin på 100 ms for kompatibilitet med nogle QC-opladere"
- },
- "BoostTemperature": {
- "text2": [
- "Boost",
- "temp"
- ],
- "desc": "Temperatur i \"boost mode\""
- },
- "AutoStart": {
- "text2": [
- "Start-up",
- "Opførsel"
- ],
- "desc": "Start automatisk med lodning når strøm sættes til. (S=Slukket | L=Lodning | D=Dvale tilstand | R=Dvale tilstand rumtemperatur)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp ændring",
- "kort"
- ],
- "desc": "Temperatur-ændring-stigning ved kort tryk på knappen"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp ændring",
- "lang"
- ],
- "desc": "Temperatur-ændring-stigning ved lang tryk på knappen"
- },
- "LockingMode": {
- "text2": [
- "Tillad låsning",
- "af knapperne"
- ],
- "desc": "Hold begge knapper nede under lodning for at låse dem (D=deaktiver | B=kun boost-tilstand | F=fuld låsning)"
- },
- "MotionSensitivity": {
- "text2": [
- "Bevægelses",
- "følsomhed"
- ],
- "desc": "Bevægelsesfølsomhed (0=Slukket | 1=Mindst følsom | ... | 9=Mest følsom)"
- },
- "SleepTemperature": {
- "text2": [
- "Dvale",
- "temp"
- ],
- "desc": "Dvale Temperatur (C)"
- },
- "SleepTimeout": {
- "text2": [
- "Dvale",
- "timeout"
- ],
- "desc": "Dvale Timeout (Minutter | Sekunder)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Sluknings",
- "timeout"
- ],
- "desc": "sluknings Timeout (Minutter)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall sensor",
- "følsomhed"
- ],
- "desc": "følsomhed overfor magneten (0=Slukket | 1=Mindst følsom | ... | 9=Mest følsom)"
- },
- "TemperatureUnit": {
- "text2": [
- "Temperatur",
- "Enhed"
- ],
- "desc": "Temperatur Enhed (C=Celsius | F=Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "Skærm",
- "Orientering"
- ],
- "desc": "Skærm Orientering (H=Højre Håndet | V=Venstre Håndet | A=Automatisk)"
- },
- "CooldownBlink": {
- "text2": [
- "Køl ned",
- "Blinkning"
- ],
- "desc": "Blink temperaturen på skærmen, mens spidsen stadig er varm."
- },
- "ScrollingSpeed": {
- "text2": [
- "Scrolling",
- "Hastighed"
- ],
- "desc": "Hastigheden infotekst ruller forbi med (S=Langsom | F=Hurtigt)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Skift",
- "+ - tasterne"
- ],
- "desc": "Skift tildeling af knapper til temperaturjustering"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "Hastighed"
- ],
- "desc": "Hastigheden for ikonanimationer i menuen (O=fra | S=langsomt | M=medium | F=hurtigt)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "sløfe"
- ],
- "desc": "ikonanimation sløfe i hovedmenuen"
- },
- "Brightness": {
- "text2": [
- "Skærm",
- "lysstyrke"
- ],
- "desc": "Juster lysstyrken på OLED-skærmen"
- },
- "ColourInversion": {
- "text2": [
- "spejlvende",
- "skærm"
- ],
- "desc": "spejlvende farverne på OLED-skærmen"
- },
- "LOGOTime": {
- "text2": [
- "opstartslogo",
- "varighed"
- ],
- "desc": "Indstiller varigheden for opstartslogoet (s=sekunder)"
- },
- "AdvancedIdle": {
- "text2": [
- "Detaljeret",
- "Standby skærm"
- ],
- "desc": "Vis detialieret information med en mindre skriftstørrelse på standby skærmen."
- },
- "AdvancedSoldering": {
- "text2": [
- "Detaljeret",
- "loddeskærm"
- ],
- "desc": "Vis detaljeret information mens der loddes"
- },
- "PowerLimit": {
- "text2": [
- "Strøm",
- "begrænsning"
- ],
- "desc": "Maksimal effekt Loddekolben kan bruge (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "kalibrere CJK",
- "under næste opstart"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibrere",
- "input spændingen?"
- ],
- "desc": "VIN kalibrering. Knapperne justere, Lang tryk for at gå ud"
- },
- "PowerPulsePower": {
- "text2": [
- "Strøm",
- "puls"
- ],
- "desc": "Intensiteten af strøm for hold-vågen-puls (watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Strøm puls",
- "Forsinkelse"
- ],
- "desc": "Forsinkelse før hold-vågen-puls udløses (x 2,5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Strøm puls",
- "varighed"
- ],
- "desc": "Hold-vågen-pulsvarighed (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Gendan fabriks",
- "Indstillinger"
- ],
- "desc": "Gendan alle indstillinger"
- },
- "LanguageSwitch": {
- "text2": [
- "Sprog:",
- " DA Dansk"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "DA",
+ "languageLocalName": "Dansk",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Visse indstillinger\nEr blevet ændret!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "ingen accelerometer\nfundet!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "ingen USB-PD IC\nFundet!"
+ },
+ "LockingKeysString": {
+ "message": "LÅST"
+ },
+ "UnlockingKeysString": {
+ "message": "ULÅST"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LÅST!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Er du sikker du vil resette indstillingerne til standard?"
+ },
+ "UVLOWarningString": {
+ "message": "Lav Volt"
+ },
+ "UndervoltageString": {
+ "message": "Undervolt\n"
+ },
+ "InputVoltageString": {
+ "message": "Input V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Dvale...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Tip: \n"
+ },
+ "OffString": {
+ "message": "Off"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Din enhed er højst sandsyneligt en Kopivare!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "H",
+ "SettingLeftChar": "V",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "S",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "F",
+ "SettingStartNoneChar": "S",
+ "SettingStartSolderingChar": "L",
+ "SettingStartSleepChar": "D",
+ "SettingStartSleepOffChar": "R",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Strøm\nIndstillinger",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Lodde\nIndstillinger",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Dvale\nmode",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Bruger\nGrændseflade",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Advancerede\nIndstillinger",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Strøm\nKilde",
+ "description": "Strømforsyning. Indstil Cutoff Spændingen. (DC 10V) (S 3,3V per celle)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nSpænding",
+ "description": "Minimum tilladt spænding pr. celle (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC\nSpænding",
+ "description": "Max QC spænding Loddekolben skal forhandle sig til"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD-forhandlingstimeout i trin på 100 ms for kompatibilitet med nogle QC-opladere"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Boost\ntemp",
+ "description": "Temperatur i \"boost mode\""
+ },
+ "AutoStart": {
+ "displayText": "Start-up\nOpførsel",
+ "description": "Start automatisk med lodning når strøm sættes til. (S=Slukket | L=Lodning | D=Dvale tilstand | R=Dvale tilstand rumtemperatur)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp ændring\nkort",
+ "description": "Temperatur-ændring-stigning ved kort tryk på knappen"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp ændring\nlang",
+ "description": "Temperatur-ændring-stigning ved lang tryk på knappen"
+ },
+ "LockingMode": {
+ "displayText": "Tillad låsning\naf knapperne",
+ "description": "Hold begge knapper nede under lodning for at låse dem (D=deaktiver | B=kun boost-tilstand | F=fuld låsning)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Bevægelses\nfølsomhed",
+ "description": "Bevægelsesfølsomhed (0=Slukket | 1=Mindst følsom | ... | 9=Mest følsom)"
+ },
+ "SleepTemperature": {
+ "displayText": "Dvale\ntemp",
+ "description": "Dvale Temperatur (C)"
+ },
+ "SleepTimeout": {
+ "displayText": "Dvale\ntimeout",
+ "description": "Dvale Timeout (Minutter | Sekunder)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Sluknings\ntimeout",
+ "description": "sluknings Timeout (Minutter)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall sensor\nfølsomhed",
+ "description": "følsomhed overfor magneten (0=Slukket | 1=Mindst følsom | ... | 9=Mest følsom)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Temperatur\nEnhed",
+ "description": "Temperatur Enhed (C=Celsius | F=Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "Skærm\nOrientering",
+ "description": "Skærm Orientering (H=Højre Håndet | V=Venstre Håndet | A=Automatisk)"
+ },
+ "CooldownBlink": {
+ "displayText": "Køl ned\nBlinkning",
+ "description": "Blink temperaturen på skærmen, mens spidsen stadig er varm."
+ },
+ "ScrollingSpeed": {
+ "displayText": "Scrolling\nHastighed",
+ "description": "Hastigheden infotekst ruller forbi med (S=Langsom | F=Hurtigt)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Skift\n+ - tasterne",
+ "description": "Skift tildeling af knapper til temperaturjustering"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nHastighed",
+ "description": "Hastigheden for ikonanimationer i menuen (O=fra | S=langsomt | M=medium | F=hurtigt)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nsløfe",
+ "description": "ikonanimation sløfe i hovedmenuen"
+ },
+ "Brightness": {
+ "displayText": "Skærm\nlysstyrke",
+ "description": "Juster lysstyrken på OLED-skærmen"
+ },
+ "ColourInversion": {
+ "displayText": "spejlvende\nskærm",
+ "description": "spejlvende farverne på OLED-skærmen"
+ },
+ "LOGOTime": {
+ "displayText": "opstartslogo\nvarighed",
+ "description": "Indstiller varigheden for opstartslogoet (s=sekunder)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Detaljeret\nStandby skærm",
+ "description": "Vis detialieret information med en mindre skriftstørrelse på standby skærmen."
+ },
+ "AdvancedSoldering": {
+ "displayText": "Detaljeret\nloddeskærm",
+ "description": "Vis detaljeret information mens der loddes"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Strøm\nbegrænsning",
+ "description": "Maksimal effekt Loddekolben kan bruge (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "kalibrere CJK\nunder næste opstart",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibrere\ninput spændingen?",
+ "description": "VIN kalibrering. Knapperne justere, Lang tryk for at gå ud"
+ },
+ "PowerPulsePower": {
+ "displayText": "Strøm\npuls",
+ "description": "Intensiteten af strøm for hold-vågen-puls (watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Strøm puls\nForsinkelse",
+ "description": "Forsinkelse før hold-vågen-puls udløses (x 2,5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Strøm puls\nvarighed",
+ "description": "Hold-vågen-pulsvarighed (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Gendan fabriks\nIndstillinger",
+ "description": "Gendan alle indstillinger"
+ },
+ "LanguageSwitch": {
+ "displayText": "Sprog:\n DA Dansk",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_DE.json b/Translations/translation_DE.json
index 2902ee61..07c10399 100644
--- a/Translations/translation_DE.json
+++ b/Translations/translation_DE.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "DE",
- "languageLocalName": "Deutsch",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Vor dem Neustart bitte sicherstellen, dass Lötspitze & Gerät Raumtemperatur haben!",
- "CJCCalibrating": "kalibriere",
- "SettingsResetWarning": "Sicher, dass alle Werte zurückgesetzt werden sollen?",
- "UVLOWarningString": "V niedr.",
- "UndervoltageString": "Unterspannung",
- "InputVoltageString": "V Eingang: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Ruhemodus...",
- "SleepingTipAdvancedString": "Temp:",
- "OffString": "Aus",
- "DeviceFailedValidationWarning": "Höchstwahrscheinlich ist das Gerät eine Fälschung!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Erfolgreich",
- "kalibriert!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Einstellungen",
- "zurückgesetzt!"
- ],
- "NoAccelerometerMessage": [
- "Bewegungssensor",
- "nicht erkannt!"
- ],
- "NoPowerDeliveryMessage": [
- "USB-PD IC",
- "nicht erkannt!"
- ],
- "LockingKeysString": "GESPERRT",
- "UnlockingKeysString": "ENTSPERRT",
- "WarningKeysLockedString": "!GESPERRT!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "R",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "A",
- "SettingSlowChar": "L",
- "SettingMediumChar": "M",
- "SettingFastChar": "S",
- "SettingStartNoneChar": "A",
- "SettingStartSolderingChar": "L",
- "SettingStartSleepChar": "R",
- "SettingStartSleepOffChar": "K",
- "SettingSensitivityOff": "A",
- "SettingSensitivityLow": "N",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "A",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "V"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Energie-",
- "einstellungen"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Löt-",
- "einstellungen"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Ruhe-",
- "modus"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Anzeige-",
- "einstellungen"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Erweiterte",
- "Einstellungen"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Spannungs-",
- "quelle"
- ],
- "desc": "Spannungsquelle (Abschaltspannung) (DC=10V | nS=n*3.3V für n LiIon-Zellen)"
- },
- "MinVolCell": {
- "text2": [
- "Minimale",
- "Spannung"
- ],
- "desc": "Minimal zulässige Spannung pro Zelle (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Spannungs-",
- "maximum"
- ],
- "desc": "Maximal zulässige Spannung der verwendeten Spannungsversorgung (V=Volt)"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD Abfragedauer in 100ms Schritten (Kompatibilität mit best. QC-Ladegeräten)"
- },
- "BoostTemperature": {
- "text2": [
- "Boost-",
- "temperatur"
- ],
- "desc": "Temperatur der Lötspitze im Boostmodus"
- },
- "AutoStart": {
- "text2": [
- "Start im",
- "Lötmodus"
- ],
- "desc": "Heizverhalten beim Einschalten der Spannungsversorgung (A=aus | L=Lötmodus | R=Ruhemodus | K=Ruhemodus mit kalter Spitze)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp-Schritt",
- "Druck kurz"
- ],
- "desc": "Schrittweite für Temperaturwechsel bei kurzem Tastendruck"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp-Schritt",
- "Druck lang"
- ],
- "desc": "Schrittweite für Temperaturwechsel bei langem Tastendruck"
- },
- "LockingMode": {
- "text2": [
- "Tasten-",
- "sperre"
- ],
- "desc": "Langes drücken beider Tasten im Lötmodus sperrt diese (A=aus | B=nur Boost | V=vollständig)"
- },
- "MotionSensitivity": {
- "text2": [
- "Bewegungs-",
- "empfindlichk."
- ],
- "desc": "0=aus | 1=minimal | ... | 9=maximal"
- },
- "SleepTemperature": {
- "text2": [
- "Ruhe-",
- "temperatur"
- ],
- "desc": "Ruhetemperatur der Spitze"
- },
- "SleepTimeout": {
- "text2": [
- "Ruhever-",
- "zögerung"
- ],
- "desc": "Dauer vor Übergang in den Ruhemodus (s=Sekunden | m=Minuten)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Abschalt-",
- "verzög."
- ],
- "desc": "Dauer vor automatischer Abschaltung (m=Minuten)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Empfindlichkeit",
- "der Hall-Sonde"
- ],
- "desc": "Empfindlichkeit der Hall-Sonde um den Ruhemodus auszulösen (0=aus | 1=minimal | ... | 9=maximal)"
- },
- "TemperatureUnit": {
- "text2": [
- "Temperatur-",
- "einheit"
- ],
- "desc": "C=°Celsius | F=°Fahrenheit"
- },
- "DisplayRotation": {
- "text2": [
- "Anzeige-",
- "ausrichtung"
- ],
- "desc": "R=rechtshändig | L=linkshändig | A=automatisch"
- },
- "CooldownBlink": {
- "text2": [
- "Abkühl-",
- "blinken"
- ],
- "desc": "Temperaturanzeige blinkt beim Abkühlen, solange Spitze heiß ist"
- },
- "ScrollingSpeed": {
- "text2": [
- "Scroll-",
- "geschw."
- ],
- "desc": "Scrollgeschwindigkeit der Erläuterungen (L=langsam | S=schnell)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "+- Tasten",
- "umkehren?"
- ],
- "desc": "Tastenbelegung zur Temperaturänderung umkehren"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "Geschw."
- ],
- "desc": "Geschwindigkeit der Icon-Animationen im Menü (A=aus | L=langsam | M=mittel | S=schnell)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "Schleife"
- ],
- "desc": "Icon-Animationen im Hauptmenü wiederholen"
- },
- "Brightness": {
- "text2": [
- "Bildschirm-",
- "kontrast"
- ],
- "desc": "Verändert die Helligkeit des OLED-Displays"
- },
- "ColourInversion": {
- "text2": [
- "Farben",
- "umkehren"
- ],
- "desc": "Invertiert die Farben des OLED-Displays"
- },
- "LOGOTime": {
- "text2": [
- "Startlogo-",
- "dauer"
- ],
- "desc": "Legt die Dauer der Anzeige des Startlogos fest (s=Sekunden)"
- },
- "AdvancedIdle": {
- "text2": [
- "Detaillierte",
- "Ruheansicht"
- ],
- "desc": "Detaillierte Anzeige im Ruhemodus"
- },
- "AdvancedSoldering": {
- "text2": [
- "Detaillierte",
- "Lötansicht"
- ],
- "desc": "Detaillierte Anzeige im Lötmodus"
- },
- "PowerLimit": {
- "text2": [
- "Leistungs-",
- "maximum"
- ],
- "desc": "Maximal zulässige Leistungsaufnahme des Lötkolbens (W=Watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Temperatur",
- "kalibrieren?"
- ],
- "desc": "Beim nächsten Start wird die Kaltstellenkompensation kalibriert (nicht nötig wenn Delta T < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Eingangsspannung",
- "kalibrieren?"
- ],
- "desc": "Kalibrierung der Eingangsspannung (Langer Tastendruck zum Verlassen)"
- },
- "PowerPulsePower": {
- "text2": [
- "Leistungs-",
- "impuls"
- ],
- "desc": "Powerbank mit einem Impuls wach halten (Watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Impuls-",
- "verzögerung"
- ],
- "desc": "Dauer vor Abgabe von Wachhalteimpulsen (x 2,5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Impuls-",
- "dauer"
- ],
- "desc": "Dauer des Wachhalteimpulses (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Einstellungen",
- "zurücksetzen?"
- ],
- "desc": "Werte auf Werkseinstellungen zurücksetzen"
- },
- "LanguageSwitch": {
- "text2": [
- "Sprache:",
- " DE Deutsch"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "DE",
+ "languageLocalName": "Deutsch",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Erfolgreich\nkalibriert!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Einstellungen\nzurückgesetzt!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Bewegungssensor\nnicht erkannt!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "USB-PD IC\nnicht erkannt!"
+ },
+ "LockingKeysString": {
+ "message": "GESPERRT"
+ },
+ "UnlockingKeysString": {
+ "message": "ENTSPERRT"
+ },
+ "WarningKeysLockedString": {
+ "message": "!GESPERRT!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Vor dem Neustart bitte sicherstellen, dass Lötspitze & Gerät Raumtemperatur haben!"
+ },
+ "CJCCalibrating": {
+ "message": "kalibriere\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Sicher, dass alle Werte zurückgesetzt werden sollen?"
+ },
+ "UVLOWarningString": {
+ "message": "V niedr."
+ },
+ "UndervoltageString": {
+ "message": "Unterspannung\n"
+ },
+ "InputVoltageString": {
+ "message": "V Eingang: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Ruhemodus...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Temp: \n"
+ },
+ "OffString": {
+ "message": "Aus"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Höchstwahrscheinlich ist das Gerät eine Fälschung!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "R",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "A",
+ "SettingSlowChar": "L",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "S",
+ "SettingStartNoneChar": "A",
+ "SettingStartSolderingChar": "L",
+ "SettingStartSleepChar": "R",
+ "SettingStartSleepOffChar": "K",
+ "SettingLockDisableChar": "A",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "V"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Energie-\neinstellungen",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Löt-\neinstellungen",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Ruhe-\nmodus",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Anzeige-\neinstellungen",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Erweiterte\nEinstellungen",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Spannungs-\nquelle",
+ "description": "Spannungsquelle (Abschaltspannung) (DC=10V | nS=n*3.3V für n LiIon-Zellen)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimale\nSpannung",
+ "description": "Minimal zulässige Spannung pro Zelle (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Spannungs-\nmaximum",
+ "description": "Maximal zulässige Spannung der verwendeten Spannungsversorgung (V=Volt)"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD Abfragedauer in 100ms Schritten (Kompatibilität mit best. QC-Ladegeräten)"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Aktiviert PPS & EPR"
+ },
+ "BoostTemperature": {
+ "displayText": "Boost-\ntemperatur",
+ "description": "Temperatur der Lötspitze im Boostmodus"
+ },
+ "AutoStart": {
+ "displayText": "Start im\nLötmodus",
+ "description": "Heizverhalten beim Einschalten der Spannungsversorgung (A=aus | L=Lötmodus | R=Ruhemodus | K=Ruhemodus mit kalter Spitze)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp-Schritt\nDruck kurz",
+ "description": "Schrittweite für Temperaturwechsel bei kurzem Tastendruck"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp-Schritt\nDruck lang",
+ "description": "Schrittweite für Temperaturwechsel bei langem Tastendruck"
+ },
+ "LockingMode": {
+ "displayText": "Tasten-\nsperre",
+ "description": "Langes drücken beider Tasten im Lötmodus sperrt diese (A=aus | B=nur Boost | V=vollständig)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Bewegungs-\nempfindlichk.",
+ "description": "0=aus | 1=minimal | ... | 9=maximal"
+ },
+ "SleepTemperature": {
+ "displayText": "Ruhe-\ntemperatur",
+ "description": "Ruhetemperatur der Spitze"
+ },
+ "SleepTimeout": {
+ "displayText": "Ruhever-\nzögerung",
+ "description": "Dauer vor Übergang in den Ruhemodus (s=Sekunden | m=Minuten)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Abschalt-\nverzög.",
+ "description": "Dauer vor automatischer Abschaltung (m=Minuten)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Empfindlichkeit\nder Hall-Sonde",
+ "description": "Empfindlichkeit der Hall-Sonde um den Ruhemodus auszulösen (0=aus | 1=minimal | ... | 9=maximal)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Temperatur-\neinheit",
+ "description": "C=°Celsius | F=°Fahrenheit"
+ },
+ "DisplayRotation": {
+ "displayText": "Anzeige-\nausrichtung",
+ "description": "R=rechtshändig | L=linkshändig | A=automatisch"
+ },
+ "CooldownBlink": {
+ "displayText": "Abkühl-\nblinken",
+ "description": "Temperaturanzeige blinkt beim Abkühlen, solange Spitze heiß ist"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Scroll-\ngeschw.",
+ "description": "Scrollgeschwindigkeit der Erläuterungen (L=langsam | S=schnell)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "+- Tasten\numkehren",
+ "description": "Tastenbelegung zur Temperaturänderung umkehren"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nGeschw.",
+ "description": "Geschwindigkeit der Icon-Animationen im Menü (A=aus | L=langsam | M=mittel | S=schnell)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nSchleife",
+ "description": "Icon-Animationen im Hauptmenü wiederholen"
+ },
+ "Brightness": {
+ "displayText": "Bildschirm-\nhelligkeit",
+ "description": "Verändert die Helligkeit des OLED-Displays"
+ },
+ "ColourInversion": {
+ "displayText": "Farben\numkehren",
+ "description": "Invertiert die Farben des OLED-Displays"
+ },
+ "LOGOTime": {
+ "displayText": "Startlogo-\ndauer",
+ "description": "Legt die Dauer der Anzeige des Startlogos fest (s=Sekunden)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Detaillierte\nRuheansicht",
+ "description": "Detaillierte Anzeige im Ruhemodus"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Detaillierte\nLötansicht",
+ "description": "Detaillierte Anzeige im Lötmodus"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Aktiviert Bluetooth LE"
+ },
+ "PowerLimit": {
+ "displayText": "Leistungs-\nmaximum",
+ "description": "Maximal zulässige Leistungsaufnahme des Lötkolbens (W=Watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Temperatur\nkalibrieren",
+ "description": "Beim nächsten Start wird die Kaltstellenkompensation kalibriert (nicht nötig wenn Delta T < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Eingangsspannung\nkalibrieren",
+ "description": "Kalibrierung der Eingangsspannung (Langer Tastendruck zum Verlassen)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Leistungs-\nimpuls",
+ "description": "Powerbank mit einem Impuls wach halten (Watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Impuls-\nverzögerung",
+ "description": "Dauer vor Abgabe von Wachhalteimpulsen (x 2,5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Impuls-\ndauer",
+ "description": "Dauer des Wachhalteimpulses (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Einstellungen\nzurücksetzen",
+ "description": "Werte auf Werkseinstellungen zurücksetzen"
+ },
+ "LanguageSwitch": {
+ "displayText": "Sprache:\n DE Deutsch",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_EL.json b/Translations/translation_EL.json
index 27971dab..ae0fe454 100644
--- a/Translations/translation_EL.json
+++ b/Translations/translation_EL.json
@@ -1,344 +1,251 @@
-{
- "languageCode": "EL",
- "languageLocalName": "Greek",
- "tempUnitFahrenheit": true,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Σίγουρα θέλετε επαναφορά αρχικών ρυθμίσεων;",
- "UVLOWarningString": "Χαμηλ DC",
- "UndervoltageString": "Υπόταση",
- "InputVoltageString": "Είσοδος V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Υπνος...",
- "SleepingTipAdvancedString": "Μύτη:",
- "OffString": "Απ.",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Επαν. OK",
- "SettingsResetMessage": [
- "Κάποιες ρυθμ.",
- "άλλαξαν"
- ],
- "NoAccelerometerMessage": [
- "Δεν εντοπίστηκε",
- "επιταχυνσιόμετρο"
- ],
- "NoPowerDeliveryMessage": [
- "Δεν εντοπίστηκε",
- "κύκλωμα USB-PD"
- ],
- "LockingKeysString": "ΚΛΕΙΔ.",
- "UnlockingKeysString": "ΞΕΚΛΕΙΔ.",
- "WarningKeysLockedString": [
- "ΚΛΕΙΔΩΜΕΝΑ",
- "ΠΛΗΚΤΡΑ!"
- ],
- "WarningThermalRunaway": [
- "Θερμική",
- "Φυγή"
- ]
- },
- "characters": {
- "SettingRightChar": "R",
- "SettingLeftChar": "L",
- "SettingAutoChar": "Α",
- "SettingOffChar": "0",
- "SettingSlowChar": "Α",
- "SettingMediumChar": "Μ",
- "SettingFastChar": "Γ",
- "SettingStartNoneChar": "0",
- "SettingStartSolderingChar": "Κ",
- "SettingStartSleepChar": "Ζ",
- "SettingStartSleepOffChar": "Υ",
- "SettingSensitivityOff": "0",
- "SettingSensitivityLow": "Χ",
- "SettingSensitivityMedium": "Μ",
- "SettingSensitivityHigh": "Υ",
- "SettingLockDisableChar": "Α",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "Π"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Ρυθμίσεις",
- "ενέργειας"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Ρυθμίσεις",
- "κόλλησης"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Λειτουργία",
- "ύπνου"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Διεπαφή",
- "χρήστη"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Προηγμένες",
- "ρυθμίσεις"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Πηγή",
- "ενέργειας"
- ],
- "desc": "Πηγή ενέργειας. Oρισμός τάσης απενεργοποίησης. (DC 10V) (S 3.3V ανα κυψέλη, απενεργοποίηση ενεργειακού ορίου)"
- },
- "MinVolCell": {
- "text2": [
- "Ελάχιστη",
- "τάση"
- ],
- "desc": "Ελάχιστη επιτρεπτή τάση ανα κυψέλη (3 σε σειρά: 3 - 3.7V | 4-6 σε σειρά: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Τάση",
- "QC"
- ],
- "desc": "Μέγιστη τάση QC που να ζητά το κολλητήρι από το τροφοδοτικό"
- },
- "PDNegTimeout": {
- "text2": [
- "χρονικό όριο",
- "PD"
- ],
- "desc": "Χρονικό όριο διαπραγμάτευσης PD σε βήματα 100ms για συμβατότητα με κάποιους φορτιστές QC"
- },
- "BoostTemperature": {
- "text2": [
- "Θερμοκ.",
- "boost"
- ],
- "desc": "Θερμοκρασία στη \"λειτουργία boost\""
- },
- "AutoStart": {
- "text2": [
- "Ζέσταμα",
- "κατά την εν."
- ],
- "desc": "0=off | Κ=θερμ. κόλλησης | Z=αναμονή σε θερμοκρασία ύπνου μέχρι την κίνηση | Υ=αναμονή χωρίς ζέσταμα μέχρι την κίνηση"
- },
- "TempChangeShortStep": {
- "text2": [
- "Αλλαγή θερμοκ.",
- "στιγμιαίο"
- ],
- "desc": "Βήμα αλλαγής θερμοκρασίας σε στιγμιαίο πάτημα πλήκτρου"
- },
- "TempChangeLongStep": {
- "text2": [
- "Αλλαγή θερμοκ.",
- "παρατεταμένο"
- ],
- "desc": "Βήμα αλλαγής θερμοκρασίας σε παρατεταμένο πάτημα πλήκτρου"
- },
- "LockingMode": {
- "text2": [
- "Κλείδωμα",
- "πλήκτρων"
- ],
- "desc": "Κατά την κόλληση, κρατήστε και τα δύο πλήκτρα για κλείδωμα (A=απενεργοποίηση | B=μόνο λειτ. boost | Π=πλήρες κλείδωμα)"
- },
- "MotionSensitivity": {
- "text2": [
- "Ευαισθησία",
- "κίνησης"
- ],
- "desc": "0=off | 1=λιγότερο ευαίσθητο | ... | 9=περισσότερο ευαίσθητο"
- },
- "SleepTemperature": {
- "text2": [
- "Θερμοκρ.",
- "ύπνου"
- ],
- "desc": "Θερμοκρασία μύτης σε λειτ. ύπνου"
- },
- "SleepTimeout": {
- "text2": [
- "Έναρξη",
- "ύπνου"
- ],
- "desc": "Χρονικό διάστημα πρίν την ενεργοποίηση λειτουργίας ύπνου (Δ=δευτ. | Λ=λεπτά)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Έναρξη",
- "απενεργ."
- ],
- "desc": "Χρονικό διάστημα πρίν την απενεργοποίηση του κολλητηριού (Λ=λεπτά)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Ευαισθ. αισθ. ",
- "φαιν. Hall"
- ],
- "desc": "Ευαισθησία του αισθητήρα φαινομένου Hall για εντοπισμό αδράνειας (0=off | 1=λιγότερο ευαίσθητο | ... | 9=περισσότερο ευαίσθητο)"
- },
- "TemperatureUnit": {
- "text2": [
- "Μονάδες",
- "θερμοκρασίας"
- ],
- "desc": "C=Κελσίου | F=Φαρενάιτ"
- },
- "DisplayRotation": {
- "text2": [
- "Διάταξη",
- "οθόνης"
- ],
- "desc": "R=δεξιόχειρες | L=αριστερόχειρες | Α=αυτόματο"
- },
- "CooldownBlink": {
- "text2": [
- "Αναβοσβήσιμο",
- "ψύξης"
- ],
- "desc": "Αναβοσβήσιμο της ενδειξης θερμοκρασίας κατά την παύση θέρμανσης όταν η μύτη είναι ακόμα καυτή"
- },
- "ScrollingSpeed": {
- "text2": [
- "Ταχύτητα",
- "κύλισης"
- ],
- "desc": "Ταχύτητα κύλισης κειμένου (Α=αργά | Γ=γρήγορα)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Αντιστροφή",
- "πλήκτρων + -"
- ],
- "desc": "Αντιστροφή διάταξης πλήκτρων στη ρύθμιση θερμοκρασίας"
- },
- "AnimSpeed": {
- "text2": [
- "Ταχύτητα",
- "κιν. εικονιδ."
- ],
- "desc": "Ρυθμός κίνησης εικονιδίων στο μενού (0=off | Α=αργός | Μ=μέτριος | Γ=γρήγορος)"
- },
- "AnimLoop": {
- "text2": [
- "Επανάληψη",
- "κιν. εικονιδ."
- ],
- "desc": "Επανάληψη κίνησης εικονιδίων στο αρχικό μενού"
- },
- "Brightness": {
- "text2": [
- "Αντίθεση",
- "οθόνης"
- ],
- "desc": "Ρύθμιση φωτεινότητας οθόνης OLED"
- },
- "ColourInversion": {
- "text2": [
- "Αντιστροφή",
- "χρωμάτων"
- ],
- "desc": "Αντιστροφή χρωμάτων οθόνης OLED"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Sets the duration for the boot logo (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Λεπτομερής",
- "οθ. αδράνειας"
- ],
- "desc": "Προβολή λεπτομερών πληροφοριών σε μικρότερη γραμματοσειρά στην οθόνη αδράνειας"
- },
- "AdvancedSoldering": {
- "text2": [
- "Λεπτομερής",
- "οθ. κόλλησης"
- ],
- "desc": "Προβολή λεπτομερών πληροφοριών σε μικρότερη γραμματοσειρά στην οθόνη κόλλησης"
- },
- "PowerLimit": {
- "text2": [
- "Ενεργειακό",
- "όριο"
- ],
- "desc": "Μέγιστη ενέργεια που μπορεί να χρησιμοποιεί το κολλητήρι (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Βαθμονόμηση",
- "τάσης εισόδου;"
- ],
- "desc": "Έναρξη βαθμονόμησης τάσης εισόδου (κράτημα για έξοδο)"
- },
- "PowerPulsePower": {
- "text2": [
- "Παλμός",
- "ενέργειας"
- ],
- "desc": "Ένταση ενέργειας παλμού διατήρησης λειτουργίας (W=watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Καθυστέρηση",
- "παλμού ενέργ."
- ],
- "desc": "Καθυστέρηση πριν την ενεργοποίση παλμού διατήρησης λειτουργίας (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Διάρκεια",
- "παλμού ενέργ."
- ],
- "desc": "Διάρκεια παλμού διατήρησης ενέργειας (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Επαναφορά",
- "εργ. ρυθμίσεων;"
- ],
- "desc": "Επαναφορά στις προεπιλεγμένες ρυθμίσεις"
- },
- "LanguageSwitch": {
- "text2": [
- "Γλώσσα:",
- " GR Ελληνικά"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "EL",
+ "languageLocalName": "Greek",
+ "tempUnitFahrenheit": true,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Βαθμονόμηση\nολοκληρώθηκε!"
+ },
+ "ResetOKMessage": {
+ "message": "Επαν. OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Κάποιες ρυθμ.\nάλλαξαν"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Δεν εντοπίστηκε\nεπιταχυνσιόμετρο"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Δεν εντοπίστηκε\nκύκλωμα USB-PD"
+ },
+ "LockingKeysString": {
+ "message": "ΚΛΕΙΔ."
+ },
+ "UnlockingKeysString": {
+ "message": "ΞΕΚΛΕΙΔ."
+ },
+ "WarningKeysLockedString": {
+ "message": "ΚΛΕΙΔΩΜΕΝΑ\nΠΛΗΚΤΡΑ!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Θερμική\nΦυγή"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Πριν την επανεκκίνηση, βεβαιωθείτε ότι η μύτη και η συσκ. είναι σε θερμ. δωματίου!"
+ },
+ "CJCCalibrating": {
+ "message": "βαθμονόμηση\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Σίγουρα θέλετε επαναφορά αρχικών ρυθμίσεων;"
+ },
+ "UVLOWarningString": {
+ "message": "Χαμηλ DC"
+ },
+ "UndervoltageString": {
+ "message": "Υπόταση\n"
+ },
+ "InputVoltageString": {
+ "message": "Είσοδος V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Υπνος...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Μύτη: \n"
+ },
+ "OffString": {
+ "message": "Απ."
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Η συσκευή σας ίσως να μην είναι αυθεντική!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "R",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "Α",
+ "SettingOffChar": "0",
+ "SettingSlowChar": "Α",
+ "SettingMediumChar": "Μ",
+ "SettingFastChar": "Γ",
+ "SettingStartNoneChar": "0",
+ "SettingStartSolderingChar": "Κ",
+ "SettingStartSleepChar": "Ζ",
+ "SettingStartSleepOffChar": "Υ",
+ "SettingLockDisableChar": "Α",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "Π"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Ρυθμίσεις\nενέργειας",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Ρυθμίσεις\nκόλλησης",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Λειτουργία\nύπνου",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Διεπαφή\nχρήστη",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Προηγμένες\nρυθμίσεις",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Πηγή\nενέργειας",
+ "description": "Πηγή ενέργειας. Oρισμός τάσης απενεργοποίησης. (DC 10V) (S 3.3V ανα μπαταρία, απενεργοποίηση ενεργειακού ορίου)"
+ },
+ "MinVolCell": {
+ "displayText": "Ελάχιστη\nτάση",
+ "description": "Ελάχιστη επιτρεπτή τάση ανα μπαταρία (3 σε σειρά: 3 - 3.7V | 4-6 σε σειρά: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Τάση\nQC",
+ "description": "Μέγιστη τάση QC που να ζητείται από το τροφοδοτικό"
+ },
+ "PDNegTimeout": {
+ "displayText": "χρονικό όριο\nPD",
+ "description": "Χρονικό όριο διαπραγμάτευσης PD σε βήματα 100ms για συμβατότητα με κάποιους φορτιστές QC"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Ενεργοποιεί λειτουργίες PPS & EPR."
+ },
+ "BoostTemperature": {
+ "displayText": "Θερμοκ.\nboost",
+ "description": "Θερμοκρασία στη \"λειτουργία boost\""
+ },
+ "AutoStart": {
+ "displayText": "Ζέσταμα\nκατά την εν.",
+ "description": "0=off | Κ=θερμ. κόλλησης | Z=αναμονή σε θερμοκρασία ύπνου μέχρι την κίνηση | Υ=αναμονή χωρίς ζέσταμα μέχρι την κίνηση"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Αλλαγή θερμοκ.\nστιγμιαίο",
+ "description": "Βήμα αλλαγής θερμοκρασίας σε στιγμιαίο πάτημα πλήκτρου"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Αλλαγή θερμοκ.\nπαρατεταμένο",
+ "description": "Βήμα αλλαγής θερμοκρασίας σε παρατεταμένο πάτημα πλήκτρου"
+ },
+ "LockingMode": {
+ "displayText": "Κλείδωμα\nπλήκτρων",
+ "description": "Κατά την κόλληση, κρατήστε και τα δύο πλήκτρα για κλείδωμα (A=απενεργοποίηση | B=μόνο λειτ. boost | Π=πλήρες κλείδωμα)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Ευαισθησία\nκίνησης",
+ "description": "0=off | 1=λιγότερο ευαίσθητο | ... | 9=περισσότερο ευαίσθητο"
+ },
+ "SleepTemperature": {
+ "displayText": "Θερμοκρ.\nύπνου",
+ "description": "Θερμοκρασία μύτης σε λειτ. ύπνου"
+ },
+ "SleepTimeout": {
+ "displayText": "Έναρξη\nύπνου",
+ "description": "Χρονικό διάστημα πρίν την ενεργοποίηση λειτουργίας ύπνου (Δ=δευτ. | Λ=λεπτά)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Έναρξη\nαπενεργ.",
+ "description": "Χρονικό διάστημα πρίν την απενεργοποίηση του κολλητηριού (Λ=λεπτά)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Ευαισθ. αισθ. \nφαιν. Hall",
+ "description": "Ευαισθησία του αισθητήρα φαινομένου Hall για εντοπισμό αδράνειας (0=off | 1=λιγότερο ευαίσθητο | ... | 9=περισσότερο ευαίσθητο)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Μονάδες\nθερμοκρασίας",
+ "description": "C=Κελσίου | F=Φαρενάιτ"
+ },
+ "DisplayRotation": {
+ "displayText": "Διάταξη\nοθόνης",
+ "description": "R=δεξιόχειρες | L=αριστερόχειρες | Α=αυτόματο"
+ },
+ "CooldownBlink": {
+ "displayText": "Αναβοσβήσιμο\nψύξης",
+ "description": "Αναβοσβήσιμο της ενδειξης θερμοκρασίας κατά την παύση θέρμανσης όταν η μύτη είναι ακόμα καυτή"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Ταχύτητα\nκύλισης",
+ "description": "Ταχύτητα κύλισης κειμένου (Α=αργά | Γ=γρήγορα)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Αντιστροφή\nπλήκτρων + -",
+ "description": "Αντιστροφή διάταξης πλήκτρων στη ρύθμιση θερμοκρασίας"
+ },
+ "AnimSpeed": {
+ "displayText": "Ταχύτητα\nκιν. εικονιδ.",
+ "description": "Ρυθμός κίνησης εικονιδίων στο μενού (0=off | Α=αργός | Μ=μέτριος | Γ=γρήγορος)"
+ },
+ "AnimLoop": {
+ "displayText": "Επανάληψη\nκιν. εικονιδ.",
+ "description": "Επανάληψη κίνησης εικονιδίων στο αρχικό μενού"
+ },
+ "Brightness": {
+ "displayText": "Αντίθεση\nοθόνης",
+ "description": "Ρύθμιση φωτεινότητας οθόνης OLED"
+ },
+ "ColourInversion": {
+ "displayText": "Αντιστροφή\nχρωμάτων",
+ "description": "Αντιστροφή χρωμάτων οθόνης OLED"
+ },
+ "LOGOTime": {
+ "displayText": "Διάρκεια\nlogo εκκίνησης",
+ "description": "Διάρκεια εμφάνισης της εικόνας εκκίνησης (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Λεπτομερής\nοθ. αδράνειας",
+ "description": "Προβολή λεπτομερών πληροφοριών σε μικρότερη γραμματοσειρά στην οθόνη αδράνειας"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Λεπτομερής\nοθ. κόλλησης",
+ "description": "Προβολή λεπτομερών πληροφοριών σε μικρότερη γραμματοσειρά στην οθόνη κόλλησης"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Ενεργειακό\nόριο",
+ "description": "Μέγιστη ενέργεια που μπορεί να χρησιμοποιεί το κολλητήρι (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Βαθμονόμηση CJC\nσε επόμενη έναρξη",
+ "description": "Στην επόμενη εκκίνηση θα γίνει βαθμονόμηση θερμοκρασίας (δεν απαιτείται αν Δθερμ < 5 C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Βαθμονόμηση\nτάσης εισόδου;",
+ "description": "Έναρξη βαθμονόμησης τάσης εισόδου (κράτημα για έξοδο)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Παλμός\nενέργειας",
+ "description": "Ένταση ενέργειας παλμού διατήρησης λειτουργίας (W=watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Καθυστέρηση\nπαλμού ενέργ.",
+ "description": "Καθυστέρηση πριν την ενεργοποίση παλμού διατήρησης λειτουργίας (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Διάρκεια\nπαλμού ενέργ.",
+ "description": "Διάρκεια παλμού διατήρησης ενέργειας (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Επαναφορά\nεργ. ρυθμίσεων;",
+ "description": "Επαναφορά στις προεπιλεγμένες ρυθμίσεις"
+ },
+ "LanguageSwitch": {
+ "displayText": "Γλώσσα:\n EL Ελληνικά",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_EN.json b/Translations/translation_EN.json
index 14405cc7..b071d01d 100644
--- a/Translations/translation_EN.json
+++ b/Translations/translation_EN.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "EN",
- "languageLocalName": "English",
- "tempUnitFahrenheit": true,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Are you sure you want to restore default settings?",
- "UVLOWarningString": "DC LOW",
- "UndervoltageString": "Undervoltage",
- "InputVoltageString": "Input V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Sleeping...",
- "SleepingTipAdvancedString": "Tip:",
- "OffString": "Off",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Certain settings",
- "changed!"
- ],
- "NoAccelerometerMessage": [
- "No accelerometer",
- "detected!"
- ],
- "NoPowerDeliveryMessage": [
- "No USB-PD IC",
- "detected!"
- ],
- "LockingKeysString": "LOCKED",
- "UnlockingKeysString": "UNLOCKED",
- "WarningKeysLockedString": "!LOCKED!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "R",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "S",
- "SettingMediumChar": "M",
- "SettingFastChar": "F",
- "SettingStartNoneChar": "O",
- "SettingStartSolderingChar": "S",
- "SettingStartSleepChar": "Z",
- "SettingStartSleepOffChar": "R",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Power",
- "settings"
- ],
- "desc": "Settings for Power Supply (Batteries, Quick Charge, PD etc)"
- },
- "SolderingMenu": {
- "text2": [
- "Soldering",
- "settings"
- ],
- "desc": "Soldering settings, boost modes; how the iron operates"
- },
- "PowerSavingMenu": {
- "text2": [
- "Sleep",
- "mode"
- ],
- "desc": "Sleep modes; methods we use to save power on the device by shutting down"
- },
- "UIMenu": {
- "text2": [
- "User",
- "interface"
- ],
- "desc": "User interactions (how it looks, animations, units etc)"
- },
- "AdvancedMenu": {
- "text2": [
- "Advanced",
- "settings"
- ],
- "desc": "Advanced or Misc options."
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Power",
- "source"
- ],
- "desc": "Set cutoff voltage to prevent battery overdrainage (DC 10V) (S=3.3V per cell, disable PWR limit)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "voltage"
- ],
- "desc": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC",
- "voltage"
- ],
- "desc": "Max QC voltage the iron should negotiate for"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
- },
- "BoostTemperature": {
- "text2": [
- "Boost",
- "temp"
- ],
- "desc": "Tip temperature used in \"boost mode\""
- },
- "AutoStart": {
- "text2": [
- "Start-up",
- "behavior"
- ],
- "desc": "O=off | S=heat to soldering temp | Z=standby at sleep temp until moved | R=standby without heating until moved"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp change",
- "short"
- ],
- "desc": "Temperature-change-increment on short button press"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp change",
- "long"
- ],
- "desc": "Temperature-change-increment on long button press"
- },
- "LockingMode": {
- "text2": [
- "Allow locking",
- "buttons"
- ],
- "desc": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
- },
- "MotionSensitivity": {
- "text2": [
- "Motion",
- "sensitivity"
- ],
- "desc": "0=off | 1=least sensitive | ... | 9=most sensitive"
- },
- "SleepTemperature": {
- "text2": [
- "Sleep",
- "temp"
- ],
- "desc": "Tip temperature while in \"sleep mode\""
- },
- "SleepTimeout": {
- "text2": [
- "Sleep",
- "timeout"
- ],
- "desc": "Interval before \"sleep mode\" starts (s=seconds | m=minutes)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Shutdown",
- "timeout"
- ],
- "desc": "Interval before the iron shuts down (m=minutes)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall sensor",
- "sensitivity"
- ],
- "desc": "Sensitivity to magnets (0=off | 1=least sensitive | ... | 9=most sensitive)"
- },
- "TemperatureUnit": {
- "text2": [
- "Temperature",
- "unit"
- ],
- "desc": "C=°Celsius | F=°Fahrenheit"
- },
- "DisplayRotation": {
- "text2": [
- "Display",
- "orientation"
- ],
- "desc": "R=right-handed | L=left-handed | A=automatic"
- },
- "CooldownBlink": {
- "text2": [
- "Cooldown",
- "flashing"
- ],
- "desc": "Flash temp reading at idle while tip is hot"
- },
- "ScrollingSpeed": {
- "text2": [
- "Scrolling",
- "speed"
- ],
- "desc": "Speed info text scrolls past at (S=slow | F=fast)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Swap",
- "+ - keys"
- ],
- "desc": "Reverse assignment of buttons for temperature adjustment"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "speed"
- ],
- "desc": "Pace of icon animations in menu (O=off | S=slow | M=medium | F=fast)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loop icon animations in main menu"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Detailed",
- "idle screen"
- ],
- "desc": "Display detailed info in a smaller font on idle screen"
- },
- "AdvancedSoldering": {
- "text2": [
- "Detailed",
- "solder screen"
- ],
- "desc": "Display detailed info in a smaller font on soldering screen"
- },
- "PowerLimit": {
- "text2": [
- "Power",
- "limit"
- ],
- "desc": "Maximum power the iron can use (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Calibrate",
- "input voltage"
- ],
- "desc": "Start VIN calibration (long press to exit)"
- },
- "PowerPulsePower": {
- "text2": [
- "Power",
- "pulse"
- ],
- "desc": "Intensity of power of keep-awake-pulse (watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Power pulse",
- "delay"
- ],
- "desc": "Delay before keep-awake-pulse is triggered (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duration"
- ],
- "desc": "Keep-awake-pulse duration (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Restore default",
- "settings"
- ],
- "desc": "Reset all settings to default"
- },
- "LanguageSwitch": {
- "text2": [
- "Language:",
- " EN English"
- ],
- "desc": "Toggle active language"
- }
- }
-}
+{
+ "languageCode": "EN",
+ "languageLocalName": "English",
+ "tempUnitFahrenheit": true,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Certain settings\nchanged!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "No accelerometer\ndetected!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "No USB-PD IC\ndetected!"
+ },
+ "LockingKeysString": {
+ "message": "LOCKED"
+ },
+ "UnlockingKeysString": {
+ "message": "UNLOCKED"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LOCKED!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Are you sure you want to restore default settings?"
+ },
+ "UVLOWarningString": {
+ "message": "DC LOW"
+ },
+ "UndervoltageString": {
+ "message": "Undervoltage\n"
+ },
+ "InputVoltageString": {
+ "message": "Input V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Sleeping...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Tip: \n"
+ },
+ "OffString": {
+ "message": "Off"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "R",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "S",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "F",
+ "SettingStartNoneChar": "O",
+ "SettingStartSolderingChar": "S",
+ "SettingStartSleepChar": "Z",
+ "SettingStartSleepOffChar": "R",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Power\nsettings",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Soldering\nsettings",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Sleep\nmode",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "User\ninterface",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Advanced\nsettings",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Power\nsource",
+ "description": "Set cutoff voltage to prevent battery overdrainage (DC 10V) (S=3.3V per cell, disable PWR limit)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nvoltage",
+ "description": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC\nvoltage",
+ "description": "Max QC voltage the iron should negotiate for"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Boost\ntemp",
+ "description": "Tip temperature used in \"boost mode\""
+ },
+ "AutoStart": {
+ "displayText": "Start-up\nbehavior",
+ "description": "O=off | S=heat to soldering temp | Z=standby at sleep temp until moved | R=standby without heating until moved"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp change\nshort",
+ "description": "Temperature-change-increment on short button press"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp change\nlong",
+ "description": "Temperature-change-increment on long button press"
+ },
+ "LockingMode": {
+ "displayText": "Allow locking\nbuttons",
+ "description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Motion\nsensitivity",
+ "description": "0=off | 1=least sensitive | ... | 9=most sensitive"
+ },
+ "SleepTemperature": {
+ "displayText": "Sleep\ntemp",
+ "description": "Tip temperature while in \"sleep mode\""
+ },
+ "SleepTimeout": {
+ "displayText": "Sleep\ntimeout",
+ "description": "Interval before \"sleep mode\" starts (s=seconds | m=minutes)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Shutdown\ntimeout",
+ "description": "Interval before the iron shuts down (m=minutes)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall sensor\nsensitivity",
+ "description": "Sensitivity to magnets (0=off | 1=least sensitive | ... | 9=most sensitive)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Temperature\nunit",
+ "description": "C=°Celsius | F=°Fahrenheit"
+ },
+ "DisplayRotation": {
+ "displayText": "Display\norientation",
+ "description": "R=right-handed | L=left-handed | A=automatic"
+ },
+ "CooldownBlink": {
+ "displayText": "Cooldown\nflashing",
+ "description": "Flash temp reading at idle while tip is hot"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Scrolling\nspeed",
+ "description": "Scrolling speed of info text (S=slow | F=fast)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Swap\n+ - keys",
+ "description": "Reverse assignment of buttons for temperature adjustment"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nspeed",
+ "description": "Pace of icon animations in menu (O=off | S=slow | M=medium | F=fast)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nloop",
+ "description": "Loop icon animations in main menu"
+ },
+ "Brightness": {
+ "displayText": "Screen\nbrightness",
+ "description": "Adjust the OLED screen brightness"
+ },
+ "ColourInversion": {
+ "displayText": "Invert\nscreen",
+ "description": "Invert the OLED screen colors"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Detailed\nidle screen",
+ "description": "Display detailed info in a smaller font on idle screen"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Detailed\nsolder screen",
+ "description": "Display detailed info in a smaller font on soldering screen"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Power\nlimit",
+ "description": "Maximum power the iron can use (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "Calibrate Cold Junction Compensation at next boot (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Calibrate\ninput voltage",
+ "description": "Start VIN calibration (long press to exit)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Power\npulse",
+ "description": "Intensity of power of keep-awake-pulse (W=watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Power pulse\ndelay",
+ "description": "Delay before keep-awake-pulse is triggered (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Power pulse\nduration",
+ "description": "Keep-awake-pulse duration (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Restore default\nsettings",
+ "description": "Reset all settings to default"
+ },
+ "LanguageSwitch": {
+ "displayText": "Language:\n EN English",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_ES.json b/Translations/translation_ES.json
index 6b8539f2..81f00026 100644
--- a/Translations/translation_ES.json
+++ b/Translations/translation_ES.json
@@ -1,342 +1,251 @@
-{
- "languageCode": "ES",
- "languageLocalName": "Castellano",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "¿Quieres restablecer los ajustes?",
- "UVLOWarningString": "CC BAJA",
- "UndervoltageString": "Voltaje bajo",
- "InputVoltageString": "Voltaje: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "En reposo...",
- "SleepingTipAdvancedString": "Punta:",
- "OffString": " No",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Hecho.",
- "SettingsResetMessage": [
- "Ajustes",
- "¡Reiniciados!"
- ],
- "NoAccelerometerMessage": [
- "Sin acelerómetro",
- "¡Detectado!"
- ],
- "NoPowerDeliveryMessage": [
- "Sin USB-PD IC",
- "¡Detectado!"
- ],
- "LockingKeysString": " BLOQUEADO",
- "UnlockingKeysString": "DESBLOQUEADO",
- "WarningKeysLockedString": "¡BLOQUEADO!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "D",
- "SettingLeftChar": "I",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "L",
- "SettingMediumChar": "M",
- "SettingFastChar": "R",
- "SettingStartNoneChar": "N",
- "SettingStartSolderingChar": "S",
- "SettingStartSleepChar": "R",
- "SettingStartSleepOffChar": "F",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Potencia",
- "ajustes"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Soldadura",
- "ajustes"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Modos de",
- "reposo"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Interfaz",
- "de usuario"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Ajustes",
- "avanzados"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Fuente",
- "de energía"
- ],
- "desc": "Elige el tipo de fuente para limitar el voltaje (DC 10V) (S 3,3V por pila, ilimitado)"
- },
- "MinVolCell": {
- "text2": [
- "Mínimo",
- "voltaje"
- ],
- "desc": "voltaje mínimo permitido por célula (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Potencia de",
- "entrada"
- ],
- "desc": "Potencia en vatios del adaptador de corriente utilizado."
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers (0: disabled)"
- },
- "BoostTemperature": {
- "text2": [
- "Ajustar la",
- "temp. extra"
- ],
- "desc": "Temperatura momentánea que se alcanza al apretar el botón del modo extra."
- },
- "AutoStart": {
- "text2": [
- "Calentar",
- "al enchufar"
- ],
- "desc": "Se calienta él solo al arrancar (N=no | S=entrar en modo soldar | R=solo entrar en reposo | F=en reposo pero mantiene la punta fría)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Cambio temp.",
- "puls. cortas"
- ],
- "desc": "Subir y bajar X grados de temperatura con cada pulsación corta de los botones +/-."
- },
- "TempChangeLongStep": {
- "text2": [
- "Cambio temp.",
- "puls. largas"
- ],
- "desc": "Subir y bajar X grados de temperatura con cada pulsación larga de los botones +/-."
- },
- "LockingMode": {
- "text2": [
- "Permitir botones",
- "bloqueo"
- ],
- "desc": "Al soldar, una pulsación larga en ambos botones los bloquea (D=desactivar | B=sólo potenciar | F=bloqueo total)."
- },
- "MotionSensitivity": {
- "text2": [
- "Detección de",
- "movimiento"
- ],
- "desc": "Tiempo de reacción al agarrar (0=no | 1=menos sensible | ... | 9=más sensible)"
- },
- "SleepTemperature": {
- "text2": [
- "Temperatura",
- "en reposo"
- ],
- "desc": "Temperatura de la punta en reposo."
- },
- "SleepTimeout": {
- "text2": [
- "Entrar",
- "en reposo"
- ],
- "desc": "Tiempo de inactividad para entrar en reposo (min | seg)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Tiempo de",
- "apagado"
- ],
- "desc": "Tiempo de inactividad para apagarse (en minutos)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall Eff",
- "Sensibilidad"
- ],
- "desc": "Sensibilidad del sensor de efecto Hall en la detección de reposo (0=no | 1=menos sensible | ... | 9=más sensible)"
- },
- "TemperatureUnit": {
- "text2": [
- "Unidad de",
- "temperatura"
- ],
- "desc": "Unidad de temperatura (C=centígrados | F=Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "Orientación",
- "de pantalla"
- ],
- "desc": "Orientación de la pantalla (D=diestro | I=zurdo | A=automático)"
- },
- "CooldownBlink": {
- "text2": [
- "Parpadear",
- "al enfriar"
- ],
- "desc": "La temperatura en pantalla parpadea mientras la punta siga caliente."
- },
- "ScrollingSpeed": {
- "text2": [
- "Velocidad",
- "del texto"
- ],
- "desc": "Velocidad de desplazamiento del texto (R=rápida | L=lenta)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Invertir",
- "botones +/-"
- ],
- "desc": "Intercambia las funciones de subir y bajar la temperatura de los botones +/- para que funcionen al revés."
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "velocidad"
- ],
- "desc": "Velocidad de las animaciones de los iconos en el menú (O=off | L=low | M=medium | R=high)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "bucle"
- ],
- "desc": "Animaciones de iconos en bucle en el menú raíz"
- },
- "Brightness": {
- "text2": [
- "Pantalla",
- "brillo"
- ],
- "desc": "Ajusta el brillo de la pantalla OLED"
- },
- "ColourInversion": {
- "text2": [
- "Invertir",
- "pantalla"
- ],
- "desc": "Invertir la pantalla OLED"
- },
- "LOGOTime": {
- "text2": [
- "logo inicial",
- "duración"
- ],
- "desc": "Duración de la animación del logo inicial (s=segundos)"
- },
- "AdvancedIdle": {
- "text2": [
- "Info extra en",
- "modo reposo"
- ],
- "desc": "Muestra información detallada en letra pequeña al reposar."
- },
- "AdvancedSoldering": {
- "text2": [
- "Info extra",
- "al soldar"
- ],
- "desc": "Muestra más datos por pantalla cuando se está soldando."
- },
- "PowerLimit": {
- "text2": [
- "Ajustar la",
- "potenc. máx."
- ],
- "desc": "Elige el límite de potencia máxima del soldador (en vatios)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrar CJC",
-
- "en el próximo inicio"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Calibrar voltaje",
- "de entrada"
- ],
- "desc": "Calibra VIN. Ajusta con ambos botones y mantén pulsado para salir."
- },
- "PowerPulsePower": {
- "text2": [
- "Pulsos bat.",
- "constantes"
- ],
- "desc": "Aplica unos pulsos necesarios para mantener encendidas ciertas baterías portátiles. En vatios."
- },
- "PowerPulseWait": {
- "text2": [
- "Impulso de potencia",
- "tiempo de espera"
- ],
- "desc": "Tiempo de espera antes de disparar cada pulso de mantenimiento de la vigilia (x 2,5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Impulso de potencia",
- "duración"
- ],
- "desc": "Duración del impulso de mantenimiento de la vigilia (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Volver a ajustes",
- "de fábrica"
- ],
- "desc": "Restablece todos los ajustes a los valores originales."
- },
- "LanguageSwitch": {
- "text2": [
- "Idioma:",
- " ES Castellano"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "ES",
+ "languageLocalName": "Castellano",
+ "tempUnitFahrenheit": true,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Hecho"
+ },
+ "SettingsResetMessage": {
+ "message": "Ajustes\n¡Reiniciados!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Sin acelerómetro\n¡Detectado!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Sin USB-PD IC\n¡Detectado!"
+ },
+ "LockingKeysString": {
+ "message": "BLOQUEADO"
+ },
+ "UnlockingKeysString": {
+ "message": "DESBLOQUEADO"
+ },
+ "WarningKeysLockedString": {
+ "message": "¡BLOQUEADO!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Térmico\nFuera de control"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "¡Antes de reiniciar, asegúrese de que la punta y el mango estén a temperatura ambiente!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrando\n"
+ },
+ "SettingsResetWarning": {
+ "message": "¿Quieres restablecer los ajustes?"
+ },
+ "UVLOWarningString": {
+ "message": "CC BAJA"
+ },
+ "UndervoltageString": {
+ "message": "Voltaje bajo\n"
+ },
+ "InputVoltageString": {
+ "message": "Voltaje: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Reposo"
+ },
+ "SleepingAdvancedString": {
+ "message": "En reposo...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Punta: \n"
+ },
+ "OffString": {
+ "message": "No"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "¡Lo más probable es que su dispositivo sea una falsificación!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "D",
+ "SettingLeftChar": "I",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "L",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "R",
+ "SettingStartNoneChar": "N",
+ "SettingStartSolderingChar": "S",
+ "SettingStartSleepChar": "R",
+ "SettingStartSleepOffChar": "F",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Potencia\najustes",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Soldadura\najustes",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Modos de\nreposo",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Interfaz\nde usuario",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Ajustes\navanzados",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Fuente\nde energía",
+ "description": "Elige el tipo de fuente para limitar el voltaje (DC 10V) (S 3,3V por pila, ilimitado)"
+ },
+ "MinVolCell": {
+ "displayText": "Mínimo\nvoltaje",
+ "description": "voltaje mínimo permitido por célula (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Potencia de\nentrada",
+ "description": "Potencia en vatios del adaptador de corriente utilizado"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntiempo de espera",
+ "description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers (0: disabled)"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Ajustar la\ntemp. extra",
+ "description": "Temperatura de la punta utilizada en el \"modo de impulso\""
+ },
+ "AutoStart": {
+ "displayText": "Calentar\nal enchufar",
+ "description": "Se calienta él solo al arrancar (N=no | S=entrar en modo soldar | R=solo entrar en reposo | F=en reposo pero mantiene la punta fría)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Cambio temp.\npuls. cortas",
+ "description": "Aumento de la temperatura al pulsar brevemente un botón"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Cambio temp.\npuls. largas",
+ "description": "Aumento de la temperatura al pulsar prolongadamente un botón"
+ },
+ "LockingMode": {
+ "displayText": "Permitir botones\nbloqueo",
+ "description": "Mientras suelda, mantenga pulsados ambos botones para alternar su bloqueo (D=desactivar | B=sólo modo boost | F=bloqueo total)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Detección de\nmovimiento",
+ "description": "Tiempo de reacción al agarrar (0=no | 1=menos sensible | ... | 9=más sensible)"
+ },
+ "SleepTemperature": {
+ "displayText": "Temperatura\nen reposo",
+ "description": "Temperatura de la punta en \"reposo\""
+ },
+ "SleepTimeout": {
+ "displayText": "Entrar\nen reposo",
+ "description": "Tiempo de inactividad para entrar en reposo (min | seg)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Tiempo de\napagado",
+ "description": "Tiempo de inactividad para apagarse (en minutos)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall Eff\nSensibilidad",
+ "description": "Sensibilidad del sensor de efecto Hall en la detección de reposo (0=no | 1=menos sensible | ... | 9=más sensible)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Unidad de\ntemperatura",
+ "description": "Unidad de temperatura (C=centígrados | F=Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "Orientación\nde pantalla",
+ "description": "Orientación de la pantalla (D=diestro | I=zurdo | A=automático)"
+ },
+ "CooldownBlink": {
+ "displayText": "Parpadear\nal enfriar",
+ "description": "Lectura de la temperatura al ralentí mientras la punta está caliente"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Velocidad\ndel texto",
+ "description": "Velocidad de desplazamiento del texto (R=rápida | L=lenta)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Invertir\nbotones +/-",
+ "description": "Intercambio inversa de los botones para ajustar la temperatura"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nvelocidad",
+ "description": "Velocidad de las animaciones de los iconos en el menú (O=off | L=low | M=medium | R=high)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nbucle",
+ "description": "Animaciones de iconos en bucle en el menú raíz"
+ },
+ "Brightness": {
+ "displayText": "Pantalla\nbrillo",
+ "description": "Ajusta el brillo de la pantalla OLED"
+ },
+ "ColourInversion": {
+ "displayText": "Invertir\npantalla",
+ "description": "Invertir la pantalla OLED"
+ },
+ "LOGOTime": {
+ "displayText": "logo inicial\nduración",
+ "description": "Duración de la animación del logo inicial (s=segundos)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Info extra en\nmodo reposo",
+ "description": "Mostrar información detallada en una fuente más pequeña en la pantalla inactiva"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Info extra\nal soldar",
+ "description": "Mostrar información detallada en una fuente más pequeña en la pantalla de soldadura"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Habilita BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Potencia\nlímite",
+ "description": "Elige el límite de potencia máxima del soldador (en vatios)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrar CJC\nen el próximo inicio",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Calibrar voltaje\nde entrada",
+ "description": "Iniciar calibración VIN (pulsación larga para salir)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Pulsos bat.\nconstantes",
+ "description": "Intensidad de la potencia del pulso de mantenimiento del estado de vigilia (W=vatio)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Impulso de potencia\ntiempo de espera",
+ "description": "Tiempo de espera antes de disparar cada pulso de mantenimiento de la vigilia (x 2,5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Impulso de potencia\nduración",
+ "description": "Duración del impulso de mantenimiento de la vigilia (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Volver a ajustes\nde fábrica",
+ "description": "Restablecer todos los ajustes por defecto"
+ },
+ "LanguageSwitch": {
+ "displayText": "Idioma:\n ES Castellano",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_FI.json b/Translations/translation_FI.json
index 57ec7664..751ff7c7 100644
--- a/Translations/translation_FI.json
+++ b/Translations/translation_FI.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "FI",
- "languageLocalName": "Suomi",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Haluatko varmasti palauttaa oletusarvot?",
- "UVLOWarningString": "DC ALH.",
- "UndervoltageString": "Alijännite",
- "InputVoltageString": "Jännite: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Lepotila...",
- "SleepingTipAdvancedString": "Kärki:",
- "OffString": "Off",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Palautus",
- "SettingsResetMessage": [
- "Asetukset",
- "palautettu!"
- ],
- "NoAccelerometerMessage": [
- "Kiihtyvyysanturi",
- "puuttuu!"
- ],
- "NoPowerDeliveryMessage": [
- "USB-PD IC",
- "puuttuu!"
- ],
- "LockingKeysString": " LUKITTU",
- "UnlockingKeysString": "AUKI",
- "WarningKeysLockedString": "!LUKKO!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "O",
- "SettingLeftChar": "V",
- "SettingAutoChar": "A",
- "SettingOffChar": "P",
- "SettingSlowChar": "A",
- "SettingMediumChar": "M",
- "SettingFastChar": "S",
- "SettingStartNoneChar": "E",
- "SettingStartSolderingChar": "J",
- "SettingStartSleepChar": "L",
- "SettingStartSleepOffChar": "H",
- "SettingSensitivityOff": "P",
- "SettingSensitivityLow": "A",
- "SettingSensitivityMedium": "K",
- "SettingSensitivityHigh": "S",
- "SettingLockDisableChar": "P",
- "SettingLockBoostChar": "V",
- "SettingLockFullChar": "K"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Virta-",
- "asetukset"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Juotos-",
- "asetukset"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Lepotilan",
- "asetukset"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Käyttö-",
- "liittymä"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Lisä-",
- "asetukset"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Virtalähde",
- "DC"
- ],
- "desc": "Virtalähde. Asettaa katkaisujännitteen. (DC 10V) (S 3.3V per kenno, poistaa virtarajoitukset)"
- },
- "MinVolCell": {
- "text2": [
- "Pienin",
- "jännite"
- ],
- "desc": "Pienin sallittu jännite per kenno (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC",
- "jännite"
- ],
- "desc": "Ensisijainen maksimi QC jännite"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
- },
- "BoostTemperature": {
- "text2": [
- "Tehostus-",
- "lämpötila"
- ],
- "desc": "Tehostustilan lämpötila"
- },
- "AutoStart": {
- "text2": [
- "Autom.",
- "käynnistys"
- ],
- "desc": "Käynnistää virrat kytkettäessä juotostilan automaattisesti. (E=Ei käytössä | J=juotostila | L=Lepotila | H=Lepotila huoneenlämpö)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Lämmön muutos",
- "lyhyt painal."
- ],
- "desc": "Lämpötilan muutos lyhyellä painalluksella"
- },
- "TempChangeLongStep": {
- "text2": [
- "Lämmön muutos",
- "pitkä painal."
- ],
- "desc": "Lämpötilan muutos pitkällä painalluksella"
- },
- "LockingMode": {
- "text2": [
- "Salli nappien",
- "lukitus"
- ],
- "desc": "Kolvatessa paina molempia näppäimiä lukitaksesi ne (P=pois | V=vain tehostus | K=kaikki)"
- },
- "MotionSensitivity": {
- "text2": [
- "Liikkeen",
- "herkkyys"
- ],
- "desc": "0=pois päältä | 1=vähäinen herkkyys | ... | 9=suurin herkkyys"
- },
- "SleepTemperature": {
- "text2": [
- "Lepotilan",
- "lämpötila"
- ],
- "desc": "Kärjen lämpötila \"lepotilassa\""
- },
- "SleepTimeout": {
- "text2": [
- "Lepotilan",
- "viive"
- ],
- "desc": "\"Lepotilan\" ajastus (s=sekuntia | m=minuuttia)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Sammutus",
- "viive"
- ],
- "desc": "Automaattisen sammutuksen ajastus (m=minuuttia)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall-",
- "herk."
- ],
- "desc": "Hall-efektianturin herkkyys lepotilan tunnistuksessa (0=pois päältä | 1=vähäinen herkkyys | ... | 9=suurin herkkyys)"
- },
- "TemperatureUnit": {
- "text2": [
- "Lämpötilan",
- "yksikkö"
- ],
- "desc": "C=celsius, F=fahrenheit"
- },
- "DisplayRotation": {
- "text2": [
- "Näytön",
- "kierto"
- ],
- "desc": "O=oikeakätinen | V=vasenkätinen | A=automaattinen"
- },
- "CooldownBlink": {
- "text2": [
- "Jäähdytyksen",
- "vilkutus"
- ],
- "desc": "Vilkuttaa jäähtyessä juotoskärjen lämpötilaa sen ollessa vielä vaarallisen kuuma"
- },
- "ScrollingSpeed": {
- "text2": [
- "Selityksien",
- "nopeus"
- ],
- "desc": "Selityksien vieritysnopeus (H=hidas | N=nopea)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Suunnanvaihto",
- "+ - näppäimille"
- ],
- "desc": "Lämpötilapainikkeiden suunnan vaihtaminen"
- },
- "AnimSpeed": {
- "text2": [
- "Animaation",
- "nopeus"
- ],
- "desc": "Animaatioiden nopeus valikossa (P=pois | A=alhainen | K=keskiverto | S=suuri)"
- },
- "AnimLoop": {
- "text2": [
- "Animaation",
- "toistaminen"
- ],
- "desc": "Toista animaatiot valikossa"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Tiedot",
- "lepotilassa"
- ],
- "desc": "Näyttää yksityiskohtaisemmat pienemmällä fontilla tiedot lepotilassa."
- },
- "AdvancedSoldering": {
- "text2": [
- "Tarkempi",
- "juotosnäyttö"
- ],
- "desc": "Näyttää yksityiskohtaisemmat tiedot pienellä fontilla juotostilassa"
- },
- "PowerLimit": {
- "text2": [
- "Tehon-",
- "rajoitus"
- ],
- "desc": "Suurin sallittu teho (Watti)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibroi",
- "tulojännite?"
- ],
- "desc": "Tulojännitten kalibrointi (VIN) (paina pitkään poistuaksesi)"
- },
- "PowerPulsePower": {
- "text2": [
- "Herätyspulssin",
- "voimakkuus"
- ],
- "desc": "Herätyspulssin voimakkuus (Watti)"
- },
- "PowerPulseWait": {
- "text2": [
- "Pulssin",
- "odotusaika"
- ],
- "desc": "Odotusaika herätyspulssin lähetykseen (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Pulssin",
- "kesto"
- ],
- "desc": "Herätyspulssin kesto (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Palauta",
- "tehdasasetukset?"
- ],
- "desc": "Palauta kaikki asetukset oletusarvoihin"
- },
- "LanguageSwitch": {
- "text2": [
- "Kieli:",
- " FI Suomi"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "FI",
+ "languageLocalName": "Suomi",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Palautus"
+ },
+ "SettingsResetMessage": {
+ "message": "Asetukset\npalautettu!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Kiihtyvyysanturi\npuuttuu!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "USB-PD IC\npuuttuu!"
+ },
+ "LockingKeysString": {
+ "message": " LUKITTU"
+ },
+ "UnlockingKeysString": {
+ "message": "AUKI"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LUKKO!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Haluatko varmasti palauttaa oletusarvot?"
+ },
+ "UVLOWarningString": {
+ "message": "DC ALH."
+ },
+ "UndervoltageString": {
+ "message": "Alijännite\n"
+ },
+ "InputVoltageString": {
+ "message": "Jännite: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Lepotila...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Kärki: \n"
+ },
+ "OffString": {
+ "message": "Off"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "O",
+ "SettingLeftChar": "V",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "P",
+ "SettingSlowChar": "A",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "S",
+ "SettingStartNoneChar": "E",
+ "SettingStartSolderingChar": "J",
+ "SettingStartSleepChar": "L",
+ "SettingStartSleepOffChar": "H",
+ "SettingLockDisableChar": "P",
+ "SettingLockBoostChar": "V",
+ "SettingLockFullChar": "K"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Virta-\nasetukset",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Juotos-\nasetukset",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Lepotilan\nasetukset",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Käyttö-\nliittymä",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Lisä-\nasetukset",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Virtalähde\nDC",
+ "description": "Virtalähde. Asettaa katkaisujännitteen. (DC 10V) (S 3.3V per kenno, poistaa virtarajoitukset)"
+ },
+ "MinVolCell": {
+ "displayText": "Pienin\njännite",
+ "description": "Pienin sallittu jännite per kenno (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC\njännite",
+ "description": "Ensisijainen maksimi QC jännite"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Tehostus-\nlämpötila",
+ "description": "Tehostustilan lämpötila"
+ },
+ "AutoStart": {
+ "displayText": "Autom.\nkäynnistys",
+ "description": "Käynnistää virrat kytkettäessä juotostilan automaattisesti. (E=Ei käytössä | J=juotostila | L=Lepotila | H=Lepotila huoneenlämpö)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Lämmön muutos\nlyhyt painal.",
+ "description": "Lämpötilan muutos lyhyellä painalluksella"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Lämmön muutos\npitkä painal.",
+ "description": "Lämpötilan muutos pitkällä painalluksella"
+ },
+ "LockingMode": {
+ "displayText": "Salli nappien\nlukitus",
+ "description": "Kolvatessa paina molempia näppäimiä lukitaksesi ne (P=pois | V=vain tehostus | K=kaikki)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Liikkeen\nherkkyys",
+ "description": "0=pois päältä | 1=vähäinen herkkyys | ... | 9=suurin herkkyys"
+ },
+ "SleepTemperature": {
+ "displayText": "Lepotilan\nlämpötila",
+ "description": "Kärjen lämpötila \"lepotilassa\""
+ },
+ "SleepTimeout": {
+ "displayText": "Lepotilan\nviive",
+ "description": "\"Lepotilan\" ajastus (s=sekuntia | m=minuuttia)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Sammutus\nviive",
+ "description": "Automaattisen sammutuksen ajastus (m=minuuttia)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall-\nherk.",
+ "description": "Hall-efektianturin herkkyys lepotilan tunnistuksessa (0=pois päältä | 1=vähäinen herkkyys | ... | 9=suurin herkkyys)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Lämpötilan\nyksikkö",
+ "description": "C=celsius, F=fahrenheit"
+ },
+ "DisplayRotation": {
+ "displayText": "Näytön\nkierto",
+ "description": "O=oikeakätinen | V=vasenkätinen | A=automaattinen"
+ },
+ "CooldownBlink": {
+ "displayText": "Jäähdytyksen\nvilkutus",
+ "description": "Vilkuttaa jäähtyessä juotoskärjen lämpötilaa sen ollessa vielä vaarallisen kuuma"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Selityksien\nnopeus",
+ "description": "Selityksien vieritysnopeus (H=hidas | N=nopea)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Suunnanvaihto\n+ - näppäimille",
+ "description": "Lämpötilapainikkeiden suunnan vaihtaminen"
+ },
+ "AnimSpeed": {
+ "displayText": "Animaation\nnopeus",
+ "description": "Animaatioiden nopeus valikossa (P=pois | A=alhainen | K=keskiverto | S=suuri)"
+ },
+ "AnimLoop": {
+ "displayText": "Animaation\ntoistaminen",
+ "description": "Toista animaatiot valikossa"
+ },
+ "Brightness": {
+ "displayText": "Screen\nbrightness",
+ "description": "Adjust the OLED screen brightness"
+ },
+ "ColourInversion": {
+ "displayText": "Invert\nscreen",
+ "description": "Invert the OLED screen colors"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Tiedot\nlepotilassa",
+ "description": "Näyttää yksityiskohtaisemmat pienemmällä fontilla tiedot lepotilassa."
+ },
+ "AdvancedSoldering": {
+ "displayText": "Tarkempi\njuotosnäyttö",
+ "description": "Näyttää yksityiskohtaisemmat tiedot pienellä fontilla juotostilassa"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Tehon-\nrajoitus",
+ "description": "Suurin sallittu teho (Watti)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibroi\ntulojännite?",
+ "description": "Tulojännitten kalibrointi (VIN) (paina pitkään poistuaksesi)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Herätyspulssin\nvoimakkuus",
+ "description": "Herätyspulssin voimakkuus (Watti)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Pulssin\nodotusaika",
+ "description": "Odotusaika herätyspulssin lähetykseen (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Pulssin\nkesto",
+ "description": "Herätyspulssin kesto (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Palauta\ntehdasasetukset?",
+ "description": "Palauta kaikki asetukset oletusarvoihin"
+ },
+ "LanguageSwitch": {
+ "displayText": "Kieli:\n FI Suomi",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_FR.json b/Translations/translation_FR.json
index 51841fef..2309e330 100644
--- a/Translations/translation_FR.json
+++ b/Translations/translation_FR.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "FR",
- "languageLocalName": "Français",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Voulez-vous vraiment réinitialiser les paramètres aux valeurs par défaut ?",
- "UVLOWarningString": "DC FAIBL",
- "UndervoltageString": "Sous-tension",
- "InputVoltageString": "V d'entrée: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "En veille...",
- "SleepingTipAdvancedString": "Panne:",
- "OffString": "Off",
- "DeviceFailedValidationWarning": "Votre appareil semble être une contrefaçon !"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Réglages",
- "réinitialisés !"
- ],
- "NoAccelerometerMessage": [
- "Accéléromètre",
- "non détecté !"
- ],
- "NoPowerDeliveryMessage": [
- "USB-PD",
- "non détecté !"
- ],
- "LockingKeysString": "VERROUIL",
- "UnlockingKeysString": "DEVERROU",
- "WarningKeysLockedString": "! VERR. !",
- "WarningThermalRunaway": [
- "Emballement",
- "thermique"
- ]
- },
- "characters": {
- "SettingRightChar": "D",
- "SettingLeftChar": "G",
- "SettingAutoChar": "A",
- "SettingOffChar": "D",
- "SettingSlowChar": "L",
- "SettingMediumChar": "M",
- "SettingFastChar": "R",
- "SettingStartNoneChar": "D",
- "SettingStartSolderingChar": "A",
- "SettingStartSleepChar": "V",
- "SettingStartSleepOffChar": "O",
- "SettingSensitivityOff": "D",
- "SettingSensitivityLow": "B",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "V"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Paramètres",
- "d'alim."
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Paramètres",
- "de soudure"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Mode",
- "veille"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Interface",
- "utilisateur"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Options",
- "avancées"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Source",
- "d'alim."
- ],
- "desc": "Source d'alimentation. Règle la tension de coupure (DC 10V) (S 3.3V par cellules, désactive la limite de puissance)"
- },
- "MinVolCell": {
- "text2": [
- "Tension",
- "minimale"
- ],
- "desc": "Tension minimale autorisée par cellule (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Tension",
- "QC"
- ],
- "desc": "Tension maximale désirée avec une alimentation QC"
- },
- "PDNegTimeout": {
- "text2": [
- "Délai",
- "expir. PD"
- ],
- "desc": "Délai de la negociation PD par étapes de 100ms pour la compatiblité avec certains chargeurs QC"
- },
- "BoostTemperature": {
- "text2": [
- "Temp.",
- "boost"
- ],
- "desc": "Température utilisée en \"mode boost\""
- },
- "AutoStart": {
- "text2": [
- "Chauffer au",
- "démarrage"
- ],
- "desc": "D=désactivé | A=activé | V=mode veille | O=mode veille à température ambiante"
- },
- "TempChangeShortStep": {
- "text2": [
- "Incrément",
- "appui court"
- ],
- "desc": "Incrément de changement de température sur appui court"
- },
- "TempChangeLongStep": {
- "text2": [
- "Incrément",
- "appui long"
- ],
- "desc": "Incrément de changement de température sur appui long"
- },
- "LockingMode": {
- "text2": [
- "Verrouiller",
- "les boutons"
- ],
- "desc": "Pendant la soudure, appuyer sur les deux boutons pour les verrouiller (D=désactivé | B=boost seulement | V=verr. total)"
- },
- "MotionSensitivity": {
- "text2": [
- "Sensibilité",
- "au mouvement"
- ],
- "desc": "0=désactivé | 1=peu sensible | ... | 9=très sensible"
- },
- "SleepTemperature": {
- "text2": [
- "Temp.",
- "veille"
- ],
- "desc": "Température de la panne en \"mode veille\""
- },
- "SleepTimeout": {
- "text2": [
- "Délai",
- "veille"
- ],
- "desc": "Délai avant mise en veille (s=secondes | m=minutes)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Délai",
- "arrêt"
- ],
- "desc": "Délai avant l'arrêt du fer à souder (m=minutes)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Sensibilité",
- "capteur effet hall"
- ],
- "desc": "Sensibilité du capteur à effet Hall pour la mise en veille (0=désactivé | 1=peu sensible | ... | 9=très sensible)"
- },
- "TemperatureUnit": {
- "text2": [
- "Unité de",
- "température"
- ],
- "desc": "C=Celsius | F=Fahrenheit"
- },
- "DisplayRotation": {
- "text2": [
- "Orientation",
- "de l'écran"
- ],
- "desc": "D=droitier | G=gaucher | A=automatique"
- },
- "CooldownBlink": {
- "text2": [
- "Refroidir en",
- "clignotant"
- ],
- "desc": "Faire clignoter la température lors du refroidissement tant que la panne est chaude"
- },
- "ScrollingSpeed": {
- "text2": [
- "Vitesse de",
- "défilement"
- ],
- "desc": "Vitesse de défilement du texte (R=rapide | L=lent)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Inverser les",
- "touches + -"
- ],
- "desc": "Inverser les boutons d'ajustement de température"
- },
- "AnimSpeed": {
- "text2": [
- "Vitesse",
- "anim. icônes"
- ],
- "desc": "Vitesse des animations des icônes dans le menu (D=désactivé | L=lente | M=moyenne | R=rapide)"
- },
- "AnimLoop": {
- "text2": [
- "Rejouer",
- "anim. icônes"
- ],
- "desc": "Rejouer en boucle les animations des icônes dans le menu principal"
- },
- "Brightness": {
- "text2": [
- "Luminosité",
- "de l'écran"
- ],
- "desc": "Ajuster la luminosité de l'écran OLED"
- },
- "ColourInversion": {
- "text2": [
- "Inverser",
- "les couleurs"
- ],
- "desc": "Inverser les couleurs de l'écran OLED"
- },
- "LOGOTime": {
- "text2": [
- "Durée logo",
- "au démarrage"
- ],
- "desc": "Définit la durée d'affichage du logo au démarrage (s=secondes)"
- },
- "AdvancedIdle": {
- "text2": [
- "Écran veille",
- "détaillé"
- ],
- "desc": "Afficher les informations détaillées sur l'écran de veille"
- },
- "AdvancedSoldering": {
- "text2": [
- "Écran soudure",
- "détaillé"
- ],
- "desc": "Afficher les informations détaillées sur l'écran de soudure"
- },
- "PowerLimit": {
- "text2": [
- "Limite de",
- "puissance"
- ],
- "desc": "Puissance maximale utilisable (W=watts)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Étalonner",
- "tension d'entrée"
- ],
- "desc": "Étalonner tension d'entrée (appui long pour quitter)"
- },
- "PowerPulsePower": {
- "text2": [
- "Puissance",
- "impulsions"
- ],
- "desc": "Puissance des impulsions pour éviter la mise en veille des batteries (watts)"
- },
- "PowerPulseWait": {
- "text2": [
- "Délai entre",
- "les impulsions"
- ],
- "desc": "Délai entre chaque impulsion pour empêcher la mise en veille (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Durée des",
- "impulsions"
- ],
- "desc": "Durée des impulsions pour empêcher la mise en veille (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Réinitialisation",
- "d'usine"
- ],
- "desc": "Réinitialiser tous les réglages"
- },
- "LanguageSwitch": {
- "text2": [
- "Langue:",
- " FR Français"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "FR",
+ "languageLocalName": "Français",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Étalonnage\nterminé!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Réglages\nréinitialisés !"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Accéléromètre\nnon détecté !"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "USB-PD\nnon détecté !"
+ },
+ "LockingKeysString": {
+ "message": "VERROUIL"
+ },
+ "UnlockingKeysString": {
+ "message": "DEVERROU"
+ },
+ "WarningKeysLockedString": {
+ "message": "! VERR. !"
+ },
+ "WarningThermalRunaway": {
+ "message": "Emballement\nthermique"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Avant de redémarrer, assurez-vous que la panne et la poignée sont à température ambiante !"
+ },
+ "CJCCalibrating": {
+ "message": "Etalonnage\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Voulez-vous vraiment réinitialiser les paramètres aux valeurs par défaut ?"
+ },
+ "UVLOWarningString": {
+ "message": "DC FAIBL"
+ },
+ "UndervoltageString": {
+ "message": "Sous-tension\n"
+ },
+ "InputVoltageString": {
+ "message": "V d'entrée: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "En veille...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Panne: \n"
+ },
+ "OffString": {
+ "message": "Off"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Votre appareil semble être une contrefaçon !"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "D",
+ "SettingLeftChar": "G",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "D",
+ "SettingSlowChar": "L",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "R",
+ "SettingStartNoneChar": "D",
+ "SettingStartSolderingChar": "A",
+ "SettingStartSleepChar": "V",
+ "SettingStartSleepOffChar": "O",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "V"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Paramètres\nd'alim.",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Paramètres\nde soudure",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Mode\nveille",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Interface\nutilisateur",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Options\navancées",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Source\nd'alim.",
+ "description": "Source d'alimentation. Règle la tension de coupure (DC 10V) (S 3.3V par cellules, désactive la limite de puissance)"
+ },
+ "MinVolCell": {
+ "displayText": "Tension\nminimale",
+ "description": "Tension minimale autorisée par cellule (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Tension\nQC",
+ "description": "Tension maximale désirée avec une alimentation QC"
+ },
+ "PDNegTimeout": {
+ "displayText": "Délai\nexpir. PD",
+ "description": "Délai de la negociation PD par étapes de 100ms pour la compatiblité avec certains chargeurs QC"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Temp.\nboost",
+ "description": "Température utilisée en \"mode boost\""
+ },
+ "AutoStart": {
+ "displayText": "Chauffer au\ndémarrage",
+ "description": "D=désactivé | A=activé | V=mode veille | O=mode veille à température ambiante"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Incrément\nappui court",
+ "description": "Incrément de changement de température sur appui court"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Incrément\nappui long",
+ "description": "Incrément de changement de température sur appui long"
+ },
+ "LockingMode": {
+ "displayText": "Verrouiller\nles boutons",
+ "description": "Pendant la soudure, appuyer sur les deux boutons pour les verrouiller (D=désactivé | B=boost seulement | V=verr. total)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Sensibilité\nau mouvement",
+ "description": "0=désactivé | 1=peu sensible | ... | 9=très sensible"
+ },
+ "SleepTemperature": {
+ "displayText": "Temp.\nveille",
+ "description": "Température de la panne en \"mode veille\""
+ },
+ "SleepTimeout": {
+ "displayText": "Délai\nveille",
+ "description": "Délai avant mise en veille (s=secondes | m=minutes)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Délai\narrêt",
+ "description": "Délai avant l'arrêt du fer à souder (m=minutes)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Sensibilité\ncapteur effet hall",
+ "description": "Sensibilité du capteur à effet Hall pour la mise en veille (0=désactivé | 1=peu sensible | ... | 9=très sensible)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Unité de\ntempérature",
+ "description": "C=Celsius | F=Fahrenheit"
+ },
+ "DisplayRotation": {
+ "displayText": "Orientation\nde l'écran",
+ "description": "D=droitier | G=gaucher | A=automatique"
+ },
+ "CooldownBlink": {
+ "displayText": "Refroidir en\nclignotant",
+ "description": "Faire clignoter la température lors du refroidissement tant que la panne est chaude"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Vitesse de\ndéfilement",
+ "description": "Vitesse de défilement du texte (R=rapide | L=lent)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Inverser les\ntouches + -",
+ "description": "Inverser les boutons d'ajustement de température"
+ },
+ "AnimSpeed": {
+ "displayText": "Vitesse\nanim. icônes",
+ "description": "Vitesse des animations des icônes dans le menu (D=désactivé | L=lente | M=moyenne | R=rapide)"
+ },
+ "AnimLoop": {
+ "displayText": "Rejouer\nanim. icônes",
+ "description": "Rejouer en boucle les animations des icônes dans le menu principal"
+ },
+ "Brightness": {
+ "displayText": "Luminosité\nde l'écran",
+ "description": "Ajuster la luminosité de l'écran OLED"
+ },
+ "ColourInversion": {
+ "displayText": "Inverser\nles couleurs",
+ "description": "Inverser les couleurs de l'écran OLED"
+ },
+ "LOGOTime": {
+ "displayText": "Durée logo\nau démarrage",
+ "description": "Définit la durée d'affichage du logo au démarrage (s=secondes)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Écran veille\ndétaillé",
+ "description": "Afficher les informations détaillées sur l'écran de veille"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Écran soudure\ndétaillé",
+ "description": "Afficher les informations détaillées sur l'écran de soudure"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Limite de\npuissance",
+ "description": "Puissance maximale utilisable (W=watts)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Étalonner CJC\nau prochain démarage",
+ "description": "Au prochain démarrage, la compensation de soudure froide sera calibrée (non nécessaire si Delta T est < 5°C)."
+ },
+ "VoltageCalibration": {
+ "displayText": "Étalonner\ntension d'entrée",
+ "description": "Étalonner tension d'entrée (appui long pour quitter)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Puissance\nimpulsions",
+ "description": "Puissance des impulsions pour éviter la mise en veille des batteries (watts)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Délai entre\nles impulsions",
+ "description": "Délai entre chaque impulsion pour empêcher la mise en veille (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Durée des\nimpulsions",
+ "description": "Durée des impulsions pour empêcher la mise en veille (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Réinitialisation\nd'usine",
+ "description": "Réinitialiser tous les réglages"
+ },
+ "LanguageSwitch": {
+ "displayText": "Langue:\n FR Français",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_HR.json b/Translations/translation_HR.json
index 413cc867..b1e55542 100644
--- a/Translations/translation_HR.json
+++ b/Translations/translation_HR.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "HR",
- "languageLocalName": "Hrvatski",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Jeste li sigurni da želite sve postavke vratiti na tvorničke vrijednosti?",
- "UVLOWarningString": "BATERIJA",
- "UndervoltageString": "PRENIZAK NAPON",
- "InputVoltageString": "Napajanje: ",
- "SleepingSimpleString": "Zzz ",
- "SleepingAdvancedString": "SPAVANJE...",
- "SleepingTipAdvancedString": "Vrh: ",
- "OffString": "Off",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Certain settings",
- "were changed!"
- ],
- "NoAccelerometerMessage": [
- "No accelerometer",
- "detected!"
- ],
- "NoPowerDeliveryMessage": [
- "No USB-PD IC",
- "detected!"
- ],
- "LockingKeysString": "LOCKED",
- "UnlockingKeysString": "UNLOCKED",
- "WarningKeysLockedString": "!LOCKED!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "D",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "S",
- "SettingMediumChar": "M",
- "SettingFastChar": "B",
- "SettingStartNoneChar": "I",
- "SettingStartSolderingChar": "L",
- "SettingStartSleepChar": "R",
- "SettingStartSleepOffChar": "S",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Power",
- "settings"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Postavke",
- "lemljenja"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Ušteda",
- "energije"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Korisničko",
- "sučelje"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Napredne",
- "opcije"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Izvor",
- "napajanja"
- ],
- "desc": "Izvor napajanja. Postavlja napon isključivanja. (DC 10V) (S 3.3V po ćeliji)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "voltage"
- ],
- "desc": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Snaga",
- "napajanja"
- ],
- "desc": "Snaga modula za napajanje"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
- },
- "BoostTemperature": {
- "text2": [
- "Boost",
- "temp"
- ],
- "desc": "Temperatura u pojačanom (Boost) načinu."
- },
- "AutoStart": {
- "text2": [
- "Auto",
- "start"
- ],
- "desc": "Ako je aktivno, lemilica po uključivanju napajanja odmah počinje grijati. (I=isključeno | L=lemljenje | R=rezervni | S=rezervni sobna temperatura)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp change",
- "short"
- ],
- "desc": "Temperature-change-increment on short button press"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp change",
- "long"
- ],
- "desc": "Temperature-change-increment on long button press"
- },
- "LockingMode": {
- "text2": [
- "Allow locking",
- "buttons"
- ],
- "desc": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
- },
- "MotionSensitivity": {
- "text2": [
- "Osjetljivost",
- "pokreta"
- ],
- "desc": "Osjetljivost prepoznavanja pokreta. (0=Ugašeno | 1=Najmanje osjetljivo | ... | 9=Najosjetljivije)"
- },
- "SleepTemperature": {
- "text2": [
- "Temp",
- "spavanja"
- ],
- "desc": "Temperatura na koju se spušta lemilica nakon određenog vremena mirovanja. (C | F)"
- },
- "SleepTimeout": {
- "text2": [
- "Vrijeme",
- "spavanja"
- ],
- "desc": "Vrijeme mirovanja nakon kojega lemilica spušta temperaturu. (Minute | Sekunde)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Vrijeme",
- "gašenja"
- ],
- "desc": "Vrijeme mirovanja nakon kojega će se lemilica ugasiti. (Minute)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall sensor",
- "sensitivity"
- ],
- "desc": "Sensitivity of the Hall effect sensor to detect sleep (0=Ugašeno | 1=Najmanje osjetljivo | ... | 9=Najosjetljivije)"
- },
- "TemperatureUnit": {
- "text2": [
- "Jedinica",
- "temperature"
- ],
- "desc": "Jedinica temperature. (C=Celzij | F=Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "Rotacija",
- "ekrana"
- ],
- "desc": "Orijentacija ekrana. (D=Desnoruki | L=Ljevoruki | A=Automatski)"
- },
- "CooldownBlink": {
- "text2": [
- "Upozorenje",
- "pri hlađenju"
- ],
- "desc": "Bljeskanje temperature prilikom hlađenja, ako je lemilica vruća."
- },
- "ScrollingSpeed": {
- "text2": [
- "Brzina",
- "poruka"
- ],
- "desc": "Brzina kretanja dugačkih poruka. (B=brzo | S=sporo)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Swap",
- "+ - keys"
- ],
- "desc": "Reverse assignment of buttons for temperature adjustment"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "speed"
- ],
- "desc": "Pace of icon animations in menu (O=off | S=slow | M=medium | B=fast)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loop icon animations in main menu"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Detalji",
- "pri čekanju"
- ],
- "desc": "Prikazivanje detaljnih informacija tijekom čekanja."
- },
- "AdvancedSoldering": {
- "text2": [
- "Detalji",
- "pri lemljenju"
- ],
- "desc": "Prikazivanje detaljnih informacija tijekom lemljenja."
- },
- "PowerLimit": {
- "text2": [
- "Power",
- "limit"
- ],
- "desc": "Maximum power the iron can use (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibracija",
- "napona napajanja"
- ],
- "desc": "Kalibracija ulaznog napona. Podešavanje gumbima, dugački pritisak za kraj."
- },
- "PowerPulsePower": {
- "text2": [
- "Power",
- "pulse"
- ],
- "desc": "Intensity of power of keep-awake-pulse (W=watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Power pulse",
- "delay"
- ],
- "desc": "Delay before keep-awake-pulse is triggered (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duration"
- ],
- "desc": "Keep-awake-pulse duration (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Tvorničke",
- "postavke"
- ],
- "desc": "Vraćanje svih postavki na tvorničke vrijednosti."
- },
- "LanguageSwitch": {
- "text2": [
- "Jezik:",
- " HR Hrvatski"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "HR",
+ "languageLocalName": "Hrvatski",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Kalibracija\ndovršena!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Neke postavke\nsu izmijenjene!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Akcelerometar\nnije pronađen!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "USB-PD IC\nnije pronađen!"
+ },
+ "LockingKeysString": {
+ "message": "ZAKLJUČ"
+ },
+ "UnlockingKeysString": {
+ "message": "OTKLJUČ"
+ },
+ "WarningKeysLockedString": {
+ "message": "ZAKLJUČ!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Neispravan\ngrijač"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Prije restarta provjerite da su vrh i ručka na sobnoj temperaturi!"
+ },
+ "CJCCalibrating": {
+ "message": "kalibriram\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Jeste li sigurni da želite sve postavke vratiti na tvorničke vrijednosti?"
+ },
+ "UVLOWarningString": {
+ "message": "BAT!!!"
+ },
+ "UndervoltageString": {
+ "message": "PRENIZAK NAPON\n"
+ },
+ "InputVoltageString": {
+ "message": "Napon V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzz "
+ },
+ "SleepingAdvancedString": {
+ "message": "SPAVAM...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Vrh: \n"
+ },
+ "OffString": {
+ "message": "Off"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Vaš uređaj je najvjerojatnije krivotvoren!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "D",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "U",
+ "SettingSlowChar": "S",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "B",
+ "SettingStartNoneChar": "U",
+ "SettingStartSolderingChar": "L",
+ "SettingStartSleepChar": "T",
+ "SettingStartSleepOffChar": "H",
+ "SettingLockDisableChar": "O",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "Z"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Postavke\nnapajanja",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Postavke\nlemljenja",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Ušteda\nenergije",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Korisničko\nsučelje",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Napredne\nopcije",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Izvor\nnapajanja",
+ "description": "Izvor napajanja. Postavlja napon isključivanja. (DC 10V) (S 3.3V po ćeliji)"
+ },
+ "MinVolCell": {
+ "displayText": "Najniži\nnapon",
+ "description": "Najniži dozvoljeni napon po ćeliji baterije (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Snaga\nnapajanja",
+ "description": "Snaga modula za napajanje"
+ },
+ "PDNegTimeout": {
+ "displayText": "USB-PD\ntimeout",
+ "description": "Timeout za USB-Power Delivery u koracima od 100ms za kompatibilnost s nekim QC punjačima"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Boost\ntemp",
+ "description": "Temperatura u pojačanom (Boost) načinu."
+ },
+ "AutoStart": {
+ "displayText": "Auto\nstart",
+ "description": "Ako je aktivno, lemilica po uključivanju napajanja odmah počinje grijati. (U=ugašeno | L=lemljenje | T=spavanje toplo | H=spavanje hladno)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Korak temp\nkratki pritisak",
+ "description": "Korak temperature pri kratkom pritisku tipke"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Korak temp\ndugi pritisak",
+ "description": "Korak temperature pri dugačkom pritisku tipke"
+ },
+ "LockingMode": {
+ "displayText": "Zaključavanje\ntipki",
+ "description": "Tokom lemljenja, držite obje tipke kako biste ih zaključali ili otključali (O=otključano | B=zaključan boost | Z=zaključano sve)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Osjetljivost\npokreta",
+ "description": "Osjetljivost prepoznavanja pokreta. (0=ugašeno | 1=najmanje osjetljivo | ... | 9=najosjetljivije)"
+ },
+ "SleepTemperature": {
+ "displayText": "Temp\nspavanja",
+ "description": "Temperatura na koju se spušta lemilica nakon određenog vremena mirovanja (C | F)"
+ },
+ "SleepTimeout": {
+ "displayText": "Vrijeme\nspavanja",
+ "description": "Vrijeme mirovanja nakon kojega lemilica spušta temperaturu. (Minute | Sekunde)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Vrijeme\ngašenja",
+ "description": "Vrijeme mirovanja nakon kojega će se lemilica ugasiti (Minute)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Osjetljivost\nHall senzora",
+ "description": "Osjetljivost senzora magnetskog polja za detekciju spavanja (U=Ugašeno | N=Najmanja | S=Srednja | V=Visoka)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Jedinica\ntemperature",
+ "description": "Jedinica temperature (C=Celzij | F=Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "Rotacija\nekrana",
+ "description": "Orijentacija ekrana (D=desnoruki | L=ljevoruki | A=automatski)"
+ },
+ "CooldownBlink": {
+ "displayText": "Upozorenje\npri hlađenju",
+ "description": "Bljeskanje temperature prilikom hlađenja, ako je lemilica vruća"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Brzina\nporuka",
+ "description": "Brzina kretanja dugačkih poruka (B=brzo | S=sporo)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Zamjena\n+ - tipki",
+ "description": "Zamjenjuje funkciju gornje i donje tipke za podešavanje temperature"
+ },
+ "AnimSpeed": {
+ "displayText": "Brzina\nanimacije",
+ "description": "Brzina animacije ikona u menijima (U=ugašeno | S=sporo | M=srednje | B=brzo)"
+ },
+ "AnimLoop": {
+ "displayText": "Ponavljanje\nanimacije",
+ "description": "Hoće li se animacije menija vrtiti u petlji - samo ako brzina animacije nije na \"Ugašeno\""
+ },
+ "Brightness": {
+ "displayText": "Svjetlina\nekrana",
+ "description": "Podešavanje svjetline OLED ekrana. Veća svjetlina može dugotrajno dovesti do pojave duhova na ekranu."
+ },
+ "ColourInversion": {
+ "displayText": "Inverzija\nekrana",
+ "description": "Inverzan prikaz slike na ekranu"
+ },
+ "LOGOTime": {
+ "displayText": "Trajanje\nboot logotipa",
+ "description": "Trajanje prikaza boot logotipa (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Detalji\npri čekanju",
+ "description": "Prikazivanje detaljnih informacija tijekom čekanja"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Detalji\npri lemljenju",
+ "description": "Prikazivanje detaljnih informacija tijekom lemljenja"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Ograničenje\nsnage",
+ "description": "Najveća snaga koju lemilica smije vući iz napajanja (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Kalibracija kod\nsljed. starta",
+ "description": "Kod sljedećeg starta izvršit će se kalibracija (nije potrebno ako je pogreška manja od 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibracija\nnapajanja",
+ "description": "Kalibracija ulaznog napona napajanja (Podešavanje tipkama, dugački pritisak za kraj)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Snaga period.\npulsa napajanja",
+ "description": "Intenzitet periodičkog pulsa kojega lemilica povlači kako se USB napajanje ne bi ugasilo (W=watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Interval per.\npulsa nap.",
+ "description": "Razmak periodičkih pulseva koje lemilica povlači kako se USB napajanje ne bi ugasilo (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Trajanje per.\npulsa nap.",
+ "description": "Trajanje periodičkog pulsa kojega lemilica povlači kako se USB napajanje ne bi ugasilo (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Tvorničke\npostavke",
+ "description": "Vraćanje svih postavki na tvorničke vrijednosti"
+ },
+ "LanguageSwitch": {
+ "displayText": "Jezik:\n HR Hrvatski",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_HU.json b/Translations/translation_HU.json
index b067537e..db925956 100644
--- a/Translations/translation_HU.json
+++ b/Translations/translation_HU.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "HU",
- "languageLocalName": "Magyar",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Biztos visszaállítja a beállításokat alapértékekre?",
- "UVLOWarningString": "DC TÚL KEVÉS",
- "UndervoltageString": "Alulfeszültség",
- "InputVoltageString": "Bemenet V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Alvás...",
- "SleepingTipAdvancedString": "Hegy:",
- "OffString": "Ki",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Törlés OK",
- "SettingsResetMessage": [
- "Beállítások",
- "visszaállítva!"
- ],
- "NoAccelerometerMessage": [
- "Nincs",
- "gyorsulásmérő!"
- ],
- "NoPowerDeliveryMessage": [
- "Nincs",
- "USB-PD IC!"
- ],
- "LockingKeysString": "LEZÁRVA",
- "UnlockingKeysString": "FELOLDVA",
- "WarningKeysLockedString": "!LEZÁRVA!",
- "WarningThermalRunaway": [
- "Kontrollálatlan",
- "hőmérséklet!"
- ]
- },
- "characters": {
- "SettingRightChar": "J",
- "SettingLeftChar": "B",
- "SettingAutoChar": "A",
- "SettingOffChar": "0",
- "SettingSlowChar": "L",
- "SettingMediumChar": "K",
- "SettingFastChar": "Gy",
- "SettingStartNoneChar": "K",
- "SettingStartSolderingChar": "F",
- "SettingStartSleepChar": "A",
- "SettingStartSleepOffChar": "Sz",
- "SettingSensitivityOff": "0",
- "SettingSensitivityLow": "A",
- "SettingSensitivityMedium": "K",
- "SettingSensitivityHigh": "M",
- "SettingLockDisableChar": "K",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "T"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Táp",
- "beállítások"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Forrasztási",
- "beállítások"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Alvási",
- "módok"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Felhasználói",
- "felület"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Haladó",
- "beállítások"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Áram",
- "forrás"
- ],
- "desc": "Kikapcsolási feszültség beállítása (DC:10V | S:3.3V/LiPo cella | ki)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "feszültség"
- ],
- "desc": "Minimális engedélyezett cellafeszültség (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Max. USB",
- "feszültség"
- ],
- "desc": "Maximális USB feszültség (QuickCharge)"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "időtúllépés"
- ],
- "desc": "PD egyeztetés időkerete (kompatibilitás QC töltőkkel) (x 100ms)"
- },
- "BoostTemperature": {
- "text2": [
- "Boost",
- "hőmérséklet"
- ],
- "desc": "Hőmérséklet \"boost\" módban"
- },
- "AutoStart": {
- "text2": [
- "Automatikus",
- "indítás"
- ],
- "desc": "Bekapcsolás után automatikusan lépjen forrasztás módba (K=ki | F=forrasztás | A=alvó mód | Sz=szobahőmérséklet)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Hőm. állítás",
- "rövid"
- ],
- "desc": "Hőmérséklet állítás rövid gombnyomásra (C | F)"
- },
- "TempChangeLongStep": {
- "text2": [
- "Hőm. állítás",
- "hosszú"
- ],
- "desc": "Hőmérséklet állítás hosszú gombnyomásra (C | F)"
- },
- "LockingMode": {
- "text2": [
- "Lezárás",
- "engedélyezés"
- ],
- "desc": "Forrasztás közben mindkét gombot hosszan lenyomva lezárja a kezelést (K=ki | B=csak \"boost\" módban | T=teljes lezárás)"
- },
- "MotionSensitivity": {
- "text2": [
- "Mozgás",
- "érzékenység"
- ],
- "desc": "Mozgás érzékenység beállítása (0=kikapcsolva | 1=legkevésbé érzékeny | ... | 9=legérzékenyebb)"
- },
- "SleepTemperature": {
- "text2": [
- "Alvási",
- "hőmérséklet"
- ],
- "desc": "Hőmérséklet alvó módban (C | F)"
- },
- "SleepTimeout": {
- "text2": [
- "Alvás",
- "időzítő"
- ],
- "desc": "Alvási időzítő (perc | másodperc)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Kikapcsolás",
- "időzítő"
- ],
- "desc": "Kikapcsolási időzítő (perc)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Alvásérzékelő",
- "érzékenység"
- ],
- "desc": "Alvásérzékelő gyorsulásmérő érzékenysége (0=kikapcsolva | 1=legkevésbé érzékeny | ... | 9=legérzékenyebb)"
- },
- "TemperatureUnit": {
- "text2": [
- "Hőmérséklet",
- "mértékegysége"
- ],
- "desc": "Hőmérséklet mértékegysége (C=Celsius | F=Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "Kijelző",
- "tájolása"
- ],
- "desc": "Kijelző tájolása (J=jobbkezes | B=balkezes | A=automatikus)"
- },
- "CooldownBlink": {
- "text2": [
- "Villogás",
- "hűléskor"
- ],
- "desc": "Villogjon a hőmérséklet kijelzése hűlés közben, amíg a forrasztó hegy forró"
- },
- "ScrollingSpeed": {
- "text2": [
- "Görgetés",
- "sebessége"
- ],
- "desc": "Szöveggörgetés sebessége"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "+/- gomb",
- "megfordítása"
- ],
- "desc": "Forrasztó hegy hőmérsékletállító gombok felcserélése"
- },
- "AnimSpeed": {
- "text2": [
- "Animáció",
- "sebessége"
- ],
- "desc": "Menüikonok animációjának sebessége (0=ki | L=lassú | K=közepes | Gy=gyors)"
- },
- "AnimLoop": {
- "text2": [
- "Folytonos",
- "animáció"
- ],
- "desc": "Főmenü ikonjainak folytonos animációja"
- },
- "Brightness": {
- "text2": [
- "Képernyő",
- "kontraszt"
- ],
- "desc": "Képernyő kontrasztjának állítása"
- },
- "ColourInversion": {
- "text2": [
- "Képernyő",
- "invertálás"
- ],
- "desc": "Képernyő színeinek invertálása"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Részletes",
- "készenlét"
- ],
- "desc": "Részletes információk megjelenítése kisebb betűméretben a készenléti képernyőn"
- },
- "AdvancedSoldering": {
- "text2": [
- "Részletes",
- "forrasztás infó"
- ],
- "desc": "Részletes információk megjelenítése forrasztás közben"
- },
- "PowerLimit": {
- "text2": [
- "Teljesítmény",
- "maximum"
- ],
- "desc": "Maximális felvett teljesitmény beállitása"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Bemeneti fesz.",
- "kalibrálása?"
- ],
- "desc": "Bemeneti feszültség kalibrálása (hosszan nyomva kilép)"
- },
- "PowerPulsePower": {
- "text2": [
- "Ébr. pulzus",
- "nagysága"
- ],
- "desc": "Powerbankot ébrentartó áramfelvételi pulzusok nagysága (W)"
- },
- "PowerPulseWait": {
- "text2": [
- "Ébr. pulzus",
- "időköze"
- ],
- "desc": "Powerbankot ébrentartó áramfelvételi pulzusok időköze (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Ébr. pulzus",
- "időtartama"
- ],
- "desc": "Powerbankot ébrentartó áramfelvételi pulzusok időtartama (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Gyári",
- "beállítások?"
- ],
- "desc": "Beállítások alaphelyzetbe állítása"
- },
- "LanguageSwitch": {
- "text2": [
- "Nyelv:",
- " HU Magyar"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "HU",
+ "languageLocalName": "Magyar",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Kalibráció\nkész!"
+ },
+ "ResetOKMessage": {
+ "message": "Törlés OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Beállítások\nvisszaállítva!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Nincs\ngyorsulásmérő!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Nincs\nUSB-PD IC!"
+ },
+ "LockingKeysString": {
+ "message": "LEZÁRVA"
+ },
+ "UnlockingKeysString": {
+ "message": "FELOLDVA"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LEZÁRVA!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Kontrollálatlan\nhőmérséklet!"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Újraindítás előtt a hegy és az eszköz legyen szobahőmérsékletű!"
+ },
+ "CJCCalibrating": {
+ "message": "Kalibrálás\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Biztos visszaállítja a beállításokat alapértékekre?"
+ },
+ "UVLOWarningString": {
+ "message": "DC túl alacsony"
+ },
+ "UndervoltageString": {
+ "message": "Alulfeszültség\n"
+ },
+ "InputVoltageString": {
+ "message": "Bemenet V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Alvás...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Hegy: \n"
+ },
+ "OffString": {
+ "message": "Ki"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Az eszköz valószínűleg nem eredeti!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "J",
+ "SettingLeftChar": "B",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "0",
+ "SettingSlowChar": "L",
+ "SettingMediumChar": "K",
+ "SettingFastChar": "Gy",
+ "SettingStartNoneChar": "K",
+ "SettingStartSolderingChar": "F",
+ "SettingStartSleepChar": "A",
+ "SettingStartSleepOffChar": "Sz",
+ "SettingLockDisableChar": "K",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "T"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Táp\nbeállítások",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Forrasztási\nbeállítások",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Alvási\nmódok",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Felhasználói\nfelület",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Haladó\nbeállítások",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Áram\nforrás",
+ "description": "Kikapcsolási feszültség beállítása (DC:10V | S:3.3V/LiPo cella | ki)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nfeszültség",
+ "description": "Minimális engedélyezett cellafeszültség (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Max. USB\nfeszültség",
+ "description": "Maximális USB feszültség (QuickCharge)"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\nidőtúllépés",
+ "description": "PD egyeztetés időkerete (kompatibilitás QC töltőkkel) (x 100ms)"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Boost\nhőmérséklet",
+ "description": "Hőmérséklet \"boost\" módban"
+ },
+ "AutoStart": {
+ "displayText": "Automatikus\nindítás",
+ "description": "Bekapcsolás után automatikusan lépjen forrasztás módba (K=ki | F=forrasztás | A=alvó mód | Sz=szobahőmérséklet)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Hőm. állítás\nrövid",
+ "description": "Hőmérséklet állítás rövid gombnyomásra (C | F)"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Hőm. állítás\nhosszú",
+ "description": "Hőmérséklet állítás hosszú gombnyomásra (C | F)"
+ },
+ "LockingMode": {
+ "displayText": "Lezárás\nengedélyezés",
+ "description": "Forrasztás közben mindkét gombot hosszan lenyomva lezárja a kezelést (K=ki | B=csak \"boost\" módban | T=teljes lezárás)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Mozgás\nérzékenység",
+ "description": "Mozgás érzékenység beállítása (0=kikapcsolva | 1=legkevésbé érzékeny | ... | 9=legérzékenyebb)"
+ },
+ "SleepTemperature": {
+ "displayText": "Alvási\nhőmérséklet",
+ "description": "Hőmérséklet alvó módban (C | F)"
+ },
+ "SleepTimeout": {
+ "displayText": "Alvás\nidőzítő",
+ "description": "Alvási időzítő (perc | másodperc)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Kikapcsolás\nidőzítő",
+ "description": "Kikapcsolási időzítő (perc)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Alvásérzékelő\nérzékenység",
+ "description": "Alvásérzékelő gyorsulásmérő érzékenysége (0=kikapcsolva | 1=legkevésbé érzékeny | ... | 9=legérzékenyebb)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Hőmérséklet\nmértékegysége",
+ "description": "Hőmérséklet mértékegysége (C=Celsius | F=Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "Kijelző\ntájolása",
+ "description": "Kijelző tájolása (J=jobbkezes | B=balkezes | A=automatikus)"
+ },
+ "CooldownBlink": {
+ "displayText": "Villogás\nhűléskor",
+ "description": "Villogjon a hőmérséklet kijelzése hűlés közben, amíg a forrasztó hegy forró"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Görgetés\nsebessége",
+ "description": "Szöveggörgetés sebessége"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "+/- gomb\nmegfordítása",
+ "description": "Forrasztó hegy hőmérsékletállító gombok felcserélése"
+ },
+ "AnimSpeed": {
+ "displayText": "Animáció\nsebessége",
+ "description": "Menüikonok animációjának sebessége (0=ki | L=lassú | K=közepes | Gy=gyors)"
+ },
+ "AnimLoop": {
+ "displayText": "Folytonos\nanimáció",
+ "description": "Főmenü ikonjainak folytonos animációja"
+ },
+ "Brightness": {
+ "displayText": "Képernyő\nkontraszt",
+ "description": "Képernyő kontrasztjának állítása"
+ },
+ "ColourInversion": {
+ "displayText": "Képernyő\ninvertálás",
+ "description": "Képernyő színeinek invertálása"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nmegjelenítés",
+ "description": "Boot logo megjelenítési idejének beállítása (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Részletes\nkészenlét",
+ "description": "Részletes információk megjelenítése kisebb betűméretben a készenléti képernyőn"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Részletes\nforrasztás infó",
+ "description": "Részletes információk megjelenítése forrasztás közben"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Teljesítmény\nmaximum",
+ "description": "Maximális felvett teljesitmény beállitása"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nköv. indításnál",
+ "description": "Következő indításnál a hegy Cold Junction Compensation kalibrálása (nem szükséges ha Delta T kisebb mint 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Bemeneti fesz.\nkalibrálása?",
+ "description": "Bemeneti feszültség kalibrálása (hosszan nyomva kilép)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Ébr. pulzus\nnagysága",
+ "description": "Powerbankot ébrentartó áramfelvételi pulzusok nagysága (W)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Ébr. pulzus\nidőköze",
+ "description": "Powerbankot ébrentartó áramfelvételi pulzusok időköze (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Ébr. pulzus\nidőtartama",
+ "description": "Powerbankot ébrentartó áramfelvételi pulzusok időtartama (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Gyári\nbeállítások?",
+ "description": "Beállítások alaphelyzetbe állítása"
+ },
+ "LanguageSwitch": {
+ "displayText": "Nyelv:\n HU Magyar",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_IT.json b/Translations/translation_IT.json
index 362ded6e..209f6a3b 100644
--- a/Translations/translation_IT.json
+++ b/Translations/translation_IT.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "IT",
- "languageLocalName": "Italiano",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Prima di riavvire assicurati che la punta e l'impugnatura siano a temperatura ambiente!",
- "CJCCalibrating": "Calibrazione in corso",
- "SettingsResetWarning": "Ripristinare le impostazioni iniziali?",
- "UVLOWarningString": "DC BASSA",
- "UndervoltageString": "DC INSUFFICIENTE",
- "InputVoltageString": "V in:",
- "SleepingSimpleString": "Zzz ",
- "SleepingAdvancedString": "Riposo",
- "SleepingTipAdvancedString": "Punta:",
- "OffString": "OFF",
- "DeviceFailedValidationWarning": "È probabile che il dispositivo in uso sia contraffatto!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibrazione",
- "completata!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Impostazioni",
- "ripristinate"
- ],
- "NoAccelerometerMessage": [
- "Accelerometro",
- "non rilevato"
- ],
- "NoPowerDeliveryMessage": [
- "USB PD",
- "non rilevato"
- ],
- "LockingKeysString": "Blocc.",
- "UnlockingKeysString": "Sblocc.",
- "WarningKeysLockedString": "BLOCCATO",
- "WarningThermalRunaway": [
- "Temperatura",
- "fuori controllo"
- ]
- },
- "characters": {
- "SettingRightChar": "D",
- "SettingLeftChar": "S",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "L",
- "SettingMediumChar": "M",
- "SettingFastChar": "V",
- "SettingStartNoneChar": "D",
- "SettingStartSolderingChar": "S",
- "SettingStartSleepChar": "R",
- "SettingStartSleepOffChar": "A",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "B",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "A",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "T",
- "SettingLockFullChar": "C"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Opzioni",
- "alimentaz"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Opzioni",
- "saldatura"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Risparmio",
- "energetico"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Interfaccia",
- "utente"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Opzioni",
- "avanzate"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Sorgente",
- "alimentaz"
- ],
- "desc": "Imposta una tensione minima di alimentazione attraverso la selezione di una sorgente [DC: 10 V; 3S/4S/5S/6S: 3,3 V per cella]"
- },
- "MinVolCell": {
- "text2": [
- "Tensione",
- "min celle"
- ],
- "desc": "Modifica la tensione di minima carica delle celle di una batteria Li-Po [3S: 3,0-3,7 V; 4S/5S/6S: 2,4-3,7 V]"
- },
- "QCMaxVoltage": {
- "text2": [
- "Voltaggio",
- "QC"
- ],
- "desc": "Imposta il massimo voltaggio negoziabile con un alimentatore Quick Charge [volt]"
- },
- "PDNegTimeout": {
- "text2": [
- "Abilitazione",
- "USB PD"
- ],
- "desc": "Regola il massimo tempo utile per la negoziazione del protocollo USB Power Delivery con alimentatori compatibili [0: disattiva; multipli di 100 ms]"
- },
- "BoostTemperature": {
- "text2": [
- "Temp",
- "Turbo"
- ],
- "desc": "Imposta la temperatura della funzione Turbo [°C/°F]"
- },
- "AutoStart": {
- "text2": [
- "Avvio",
- "automatico"
- ],
- "desc": "Attiva automaticamente il saldatore quando viene alimentato [D: disattiva; S: saldatura; R: riposo; A: temperatura ambiente]"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp passo",
- "breve"
- ],
- "desc": "Imposta il passo dei valori di temperatura per una breve pressione dei tasti"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp passo",
- "lungo"
- ],
- "desc": "Imposta il passo dei valori di temperatura per una lunga pressione dei tasti"
- },
- "LockingMode": {
- "text2": [
- "Blocco",
- "tasti"
- ],
- "desc": "Blocca i tasti durante la modalità Saldatura; tieni premuto entrambi per bloccare o sbloccare [D: disattiva; T: consenti Turbo; C: blocco completo]"
- },
- "MotionSensitivity": {
- "text2": [
- "Sensibilità",
- "al movimento"
- ],
- "desc": "Imposta la sensibilità al movimento per uscire dalla modalità Riposo [0: nessuna; 1: minima; 9: massima]"
- },
- "SleepTemperature": {
- "text2": [
- "Temp",
- "riposo"
- ],
- "desc": "Imposta la temperatura da mantenere in modalità Riposo [°C/°F]"
- },
- "SleepTimeout": {
- "text2": [
- "Timer",
- "riposo"
- ],
- "desc": "Imposta il timer per entrare in modalità Riposo [secondi/minuti]"
- },
- "ShutdownTimeout": {
- "text2": [
- "Timer",
- "spegnimento"
- ],
- "desc": "Imposta il timer per lo spegnimento [minuti]"
- },
- "HallEffSensitivity": {
- "text2": [
- "Sensore",
- "Hall"
- ],
- "desc": "Regola la sensibilità del sensore ad effetto Hall per entrare in modalità Riposo [0: nessuna; 1: minima; 9: massima]"
- },
- "TemperatureUnit": {
- "text2": [
- "Unità di",
- "temperatura"
- ],
- "desc": "Scegli l'unità di misura per la temperatura [C: grado Celsius; F: grado Farenheit]"
- },
- "DisplayRotation": {
- "text2": [
- "Orientamento",
- "schermo"
- ],
- "desc": "Imposta l'orientamento dello schermo [D: mano destra; S: mano sinistra; A: automatico]"
- },
- "CooldownBlink": {
- "text2": [
- "Avviso",
- "punta calda"
- ],
- "desc": "Evidenzia il valore di temperatura durante il raffreddamento se la punta è ancora calda"
- },
- "ScrollingSpeed": {
- "text2": [
- "Velocità",
- "testo"
- ],
- "desc": "Imposta la velocità di scorrimento del testo [L: lenta; V: veloce]"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Inversione",
- "tasti"
- ],
- "desc": "Inverti i tasti per aumentare o diminuire la temperatura della punta"
- },
- "AnimSpeed": {
- "text2": [
- "Velocità",
- "animazioni"
- ],
- "desc": "Imposta la velocità di riproduzione delle animazioni del menù principale [O: OFF; L: lenta; M: media; V: veloce]"
- },
- "AnimLoop": {
- "text2": [
- "Ciclo",
- "animazioni"
- ],
- "desc": "Abilita la riproduzione ciclica delle animazioni del menù principale"
- },
- "Brightness": {
- "text2": [
- "Luminosità",
- "schermo"
- ],
- "desc": "Regola la luminosità dello schermo [1: minimo; 10: massimo]"
- },
- "ColourInversion": {
- "text2": [
- "Inverti",
- "colori"
- ],
- "desc": "Inverti i colori dello schermo"
- },
- "LOGOTime": {
- "text2": [
- "Durata",
- "logo"
- ],
- "desc": "Imposta la permanenza sullo schermo del logo iniziale [secondi]"
- },
- "AdvancedIdle": {
- "text2": [
- "Interfaccia",
- "testuale"
- ],
- "desc": "Mostra informazioni dettagliate all'interno della schermata principale"
- },
- "AdvancedSoldering": {
- "text2": [
- "Dettagli",
- "saldatura"
- ],
- "desc": "Mostra informazioni dettagliate durante la modalità Saldatura"
- },
- "PowerLimit": {
- "text2": [
- "Limite",
- "potenza"
- ],
- "desc": "Imposta il valore di potenza massima erogabile al saldatore [watt]"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibra T",
- "all'avvio"
- ],
- "desc": "Calibra le rilevazioni di temperatura al prossimo riavvio (non necessario se il Delta T<5 °C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Calibrazione",
- "tensione"
- ],
- "desc": "Calibra la tensione in ingresso; regola con entrambi i tasti, tieni premuto il tasto superiore per uscire"
- },
- "PowerPulsePower": {
- "text2": [
- "Potenza",
- "impulso"
- ],
- "desc": "Regola la potenza di un \"impulso sveglia\" atto a prevenire lo standby eventuale dell'alimentatore [watt]"
- },
- "PowerPulseWait": {
- "text2": [
- "Distanza",
- "impulsi"
- ],
- "desc": "Imposta il tempo che deve intercorrere tra due \"impulsi sveglia\" [multipli di 2,5 s]"
- },
- "PowerPulseDuration": {
- "text2": [
- "Durata",
- "impulso"
- ],
- "desc": "Regola la durata dell'«impulso sveglia» [multipli di 250 ms]"
- },
- "SettingsReset": {
- "text2": [
- "Ripristino",
- "impostazioni"
- ],
- "desc": "Ripristina le impostazioni allo stato iniziale"
- },
- "LanguageSwitch": {
- "text2": [
- "Lingua:",
- " IT Italiano"
- ],
- "desc": ""
- }
- }
-}
+{
+ "languageCode": "IT",
+ "languageLocalName": "Italiano",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibrazione\ncompletata!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Impostazioni\nripristinate"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Accelerometro\nnon rilevato"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "USB PD\nnon rilevato"
+ },
+ "LockingKeysString": {
+ "message": "Blocc."
+ },
+ "UnlockingKeysString": {
+ "message": "Sblocc."
+ },
+ "WarningKeysLockedString": {
+ "message": "BLOCCATO"
+ },
+ "WarningThermalRunaway": {
+ "message": "Temperatura\nfuori controllo"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Prima di riavviare assicurati che la punta e l'impugnatura siano a temperatura ambiente!"
+ },
+ "CJCCalibrating": {
+ "message": "Calibrazione in corso\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Ripristinare le impostazioni predefinite?"
+ },
+ "UVLOWarningString": {
+ "message": "DC BASSA"
+ },
+ "UndervoltageString": {
+ "message": "DC INSUFFICIENTE\n"
+ },
+ "InputVoltageString": {
+ "message": "V in: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzz "
+ },
+ "SleepingAdvancedString": {
+ "message": "Riposo\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Punta: \n"
+ },
+ "OffString": {
+ "message": "OFF"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "È probabile che questo dispositivo sia contraffatto!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "D",
+ "SettingLeftChar": "S",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "L",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "V",
+ "SettingStartNoneChar": "D",
+ "SettingStartSolderingChar": "S",
+ "SettingStartSleepChar": "R",
+ "SettingStartSleepOffChar": "A",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "T",
+ "SettingLockFullChar": "C"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Opzioni\nalimentaz",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Opzioni\nsaldatura",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Risparmio\nenergetico",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Interfaccia\nutente",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Opzioni\navanzate",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Sorgente\nalimentaz",
+ "description": "Imposta una tensione minima di alimentazione attraverso la selezione di una sorgente [DC: 10 V; 3S/4S/5S/6S: 3,3 V per cella]"
+ },
+ "MinVolCell": {
+ "displayText": "Tensione\nmin celle",
+ "description": "Modifica la tensione di minima carica delle celle di una batteria Li-Po [3S: 3,0-3,7 V; 4S/5S/6S: 2,4-3,7 V]"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Tensione\nQC",
+ "description": "Imposta la massima tensione negoziabile con un alimentatore Quick Charge [volt]"
+ },
+ "PDNegTimeout": {
+ "displayText": "Abilitazione\nUSB PD",
+ "description": "Regola il massimo tempo utile per la negoziazione del protocollo USB Power Delivery con alimentatori compatibili [0: disattiva; multipli di 100 ms]"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Abilita le modalità Power Delivery PPS ed EPR"
+ },
+ "BoostTemperature": {
+ "displayText": "Temp\nTurbo",
+ "description": "Imposta la temperatura della funzione Turbo [°C/°F]"
+ },
+ "AutoStart": {
+ "displayText": "Avvio\nautomatico",
+ "description": "Attiva automaticamente il saldatore quando viene alimentato [D: disattiva; S: saldatura; R: riposo; A: temperatura ambiente]"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp passo\nbreve",
+ "description": "Imposta il passo dei valori di temperatura per una breve pressione dei tasti"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp passo\nlungo",
+ "description": "Imposta il passo dei valori di temperatura per una lunga pressione dei tasti"
+ },
+ "LockingMode": {
+ "displayText": "Blocco\ntasti",
+ "description": "Blocca i tasti durante la modalità Saldatura; tieni premuto entrambi per bloccare o sbloccare [D: disattiva; T: consenti Turbo; C: blocco completo]"
+ },
+ "MotionSensitivity": {
+ "displayText": "Sensibilità\nal movimento",
+ "description": "Imposta la sensibilità al movimento per uscire dalla modalità Riposo [0: nessuna; 1: minima; 9: massima]"
+ },
+ "SleepTemperature": {
+ "displayText": "Temp\nriposo",
+ "description": "Imposta la temperatura da mantenere in modalità Riposo [°C/°F]"
+ },
+ "SleepTimeout": {
+ "displayText": "Timer\nriposo",
+ "description": "Imposta il timer per entrare in modalità Riposo [secondi/minuti]"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Timer\nspegnimento",
+ "description": "Imposta il timer per lo spegnimento [minuti]"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Sensore\nHall",
+ "description": "Regola la sensibilità del sensore ad effetto Hall per entrare in modalità Riposo [0: nessuna; 1: minima; 9: massima]"
+ },
+ "TemperatureUnit": {
+ "displayText": "Unità di\ntemperatura",
+ "description": "Scegli l'unità di misura per la temperatura [C: grado Celsius; F: grado Farenheit]"
+ },
+ "DisplayRotation": {
+ "displayText": "Orientamento\nschermo",
+ "description": "Imposta l'orientamento dello schermo [D: mano destra; S: mano sinistra; A: automatico]"
+ },
+ "CooldownBlink": {
+ "displayText": "Avviso\npunta calda",
+ "description": "Evidenzia il valore di temperatura durante il raffreddamento se la punta è ancora calda"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Velocità\ntesto",
+ "description": "Imposta la velocità di scorrimento del testo [L: lenta; V: veloce]"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Inversione\ntasti",
+ "description": "Inverti i tasti per aumentare o diminuire la temperatura della punta"
+ },
+ "AnimSpeed": {
+ "displayText": "Velocità\nanimazioni",
+ "description": "Imposta la velocità di riproduzione delle animazioni del menù principale [O: OFF; L: lenta; M: media; V: veloce]"
+ },
+ "AnimLoop": {
+ "displayText": "Ciclo\nanimazioni",
+ "description": "Abilita la riproduzione ciclica delle animazioni del menù principale"
+ },
+ "Brightness": {
+ "displayText": "Luminosità\nschermo",
+ "description": "Regola la luminosità dello schermo [1: minimo; 10: massimo]"
+ },
+ "ColourInversion": {
+ "displayText": "Inverti\ncolori",
+ "description": "Inverti i colori dello schermo"
+ },
+ "LOGOTime": {
+ "displayText": "Durata\nlogo",
+ "description": "Imposta la permanenza sullo schermo del logo iniziale [secondi]"
+ },
+ "AdvancedIdle": {
+ "displayText": "Interfaccia\ntestuale",
+ "description": "Mostra informazioni dettagliate all'interno della schermata principale"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Dettagli\nsaldatura",
+ "description": "Mostra informazioni dettagliate durante la modalità Saldatura"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Abilita BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Limite\npotenza",
+ "description": "Imposta il valore di potenza massima erogabile al saldatore [watt]"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibra T\nall'avvio",
+ "description": "Calibra le rilevazioni di temperatura al prossimo riavvio (non necessario se il Delta T<5 °C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Calibrazione\ntensione",
+ "description": "Calibra la tensione in ingresso; regola con entrambi i tasti, tieni premuto il tasto superiore per uscire"
+ },
+ "PowerPulsePower": {
+ "displayText": "Potenza\nimpulso",
+ "description": "Regola la potenza di un \"impulso sveglia\" atto a prevenire lo standby eventuale dell'alimentatore [watt]"
+ },
+ "PowerPulseWait": {
+ "displayText": "Distanza\nimpulsi",
+ "description": "Imposta il tempo che deve intercorrere tra due \"impulsi sveglia\" [multipli di 2,5 s]"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Durata\nimpulso",
+ "description": "Regola la durata dell'«impulso sveglia» [multipli di 250 ms]"
+ },
+ "SettingsReset": {
+ "displayText": "Ripristino\nimpostazioni",
+ "description": "Ripristina le impostazioni predefinite"
+ },
+ "LanguageSwitch": {
+ "displayText": "Lingua:\n IT Italiano",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_JA_JP.json b/Translations/translation_JA_JP.json
index d436af80..aa7f2a5f 100755
--- a/Translations/translation_JA_JP.json
+++ b/Translations/translation_JA_JP.json
@@ -1,212 +1,251 @@
-{
- "languageCode": "JA_JP",
- "languageLocalName": "日本語",
- "tempUnitFahrenheit": true,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "設定をリセットしますか?",
- "UVLOWarningString": "電圧が低すぎます",
- "UndervoltageString": "Undervoltage",
- "InputVoltageString": "Input V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Sleeping...",
- "SleepingTipAdvancedString": "Tip:",
- "OffString": "オフ",
- "DeviceFailedValidationWarning": "このデバイスはおそらく偽造品です"
- },
- "messagesWarn": {
- "CJCCalibrationDone": "Calibration done!",
- "ResetOKMessage": "リセットOK",
- "SettingsResetMessage": "初期化されました",
- "NoAccelerometerMessage": "加速度計未検出",
- "NoPowerDeliveryMessage": "PD IC未検出",
- "LockingKeysString": "ボタンロック",
- "UnlockingKeysString": "ロックを解除",
- "WarningKeysLockedString": "!入力ロック中!",
- "WarningThermalRunaway": "過熱"
- },
- "characters": {
- "SettingRightChar": "右",
- "SettingLeftChar": "左",
- "SettingAutoChar": "自",
- "SettingOffChar": "×",
- "SettingSlowChar": "遅",
- "SettingMediumChar": "中",
- "SettingFastChar": "速",
- "SettingStartNoneChar": "×",
- "SettingStartSolderingChar": "熱",
- "SettingStartSleepChar": "待",
- "SettingStartSleepOffChar": "室",
- "SettingSensitivityOff": "×",
- "SettingSensitivityLow": "低",
- "SettingSensitivityMedium": "中",
- "SettingSensitivityHigh": "高",
- "SettingLockDisableChar": "×",
- "SettingLockBoostChar": "ブ",
- "SettingLockFullChar": "全"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": "電源設定",
- "desc": ""
- },
- "SolderingMenu": {
- "text2": "半田付け設定",
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": "待機設定",
- "desc": ""
- },
- "UIMenu": {
- "text2": "UI設定",
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": "高度な設定",
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": "下限電圧",
- "desc": "下限電圧を指定する "
- },
- "MinVolCell": {
- "text2": "最低電圧",
- "desc": "セルあたりの最低電圧 <ボルト> <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
- },
- "QCMaxVoltage": {
- "text2": "QC電圧",
- "desc": "QC電源使用時に要求する目標電圧"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "一部のQC電源との互換性のため、PDネゴシエーションをタイムアウトする時間 "
- },
- "BoostTemperature": {
- "text2": "ブースト温度",
- "desc": "ブーストモードで使用される温度"
- },
- "AutoStart": {
- "text2": "自動加熱",
- "desc": "電源投入時に自動的に加熱する <×=オフ | 熱=半田付けモード | 待=スタンバイモード | 室=室温スタンバイモード>"
- },
- "TempChangeShortStep": {
- "text2": "温度変化 短",
- "desc": "ボタンを短く押した時の温度変化値"
- },
- "TempChangeLongStep": {
- "text2": "温度変化 長",
- "desc": "ボタンを長押しした時の温度変化値"
- },
- "LockingMode": {
- "text2": "ボタンロック",
- "desc": "半田付けモード時に両方のボタンを長押しし、ボタンロックする <×=オフ | ブ=ブーストのみ許可 | 全=すべてをロック>"
- },
- "MotionSensitivity": {
- "text2": "動きの感度",
- "desc": "0=オフ | 1=最低感度 | ... | 9=最高感度"
- },
- "SleepTemperature": {
- "text2": "待機温度",
- "desc": "スタンバイ時のコテ先温度"
- },
- "SleepTimeout": {
- "text2": "待機遅延",
- "desc": "スタンバイモードに入るまでの待機時間 "
- },
- "ShutdownTimeout": {
- "text2": "自動オフ",
- "desc": "自動電源オフまでの待機時間 "
- },
- "HallEffSensitivity": {
- "text2": "磁界感度",
- "desc": "スタンバイモードに入るのに使用される磁場センサーの感度 <0=オフ | 1=最低感度 | ... | 9=最高感度>"
- },
- "TemperatureUnit": {
- "text2": "温度単位",
- "desc": "C=摂氏 | F=華氏"
- },
- "DisplayRotation": {
- "text2": "画面の向き",
- "desc": "右=右利き | 左=左利き | 自=自動"
- },
- "CooldownBlink": {
- "text2": "冷却中に点滅",
- "desc": "加熱の停止後、コテ先が熱い間は温度表示を点滅する"
- },
- "ScrollingSpeed": {
- "text2": "スクロール速度",
- "desc": "テキストをスクロールする速さ <遅=遅い | 速=速い>"
- },
- "ReverseButtonTempChange": {
- "text2": "キー入れ替え",
- "desc": "温度設定時に+ボタンと-ボタンを入れ替える"
- },
- "AnimSpeed": {
- "text2": "動画の速度",
- "desc": "メニューアイコンのアニメーションの速さ <×=再生しない | 遅=低速 | 中=中速 | 速=高速>"
- },
- "AnimLoop": {
- "text2": "動画をループ",
- "desc": "メニューアイコンのアニメーションをループする"
- },
- "Brightness": {
- "text2": "画面輝度",
- "desc": "画面の明るさ・コントラストを変更する"
- },
- "ColourInversion": {
- "text2": "色反転",
- "desc": "画面の色を反転する"
- },
- "LOGOTime": {
- "text2": "起動画面",
- "desc": "起動画面の表示時間を設定する"
- },
- "AdvancedIdle": {
- "text2": "詳細な待受画面",
- "desc": "待ち受け画面に詳細情報を表示する"
- },
- "AdvancedSoldering": {
- "text2": "詳細な作業画面",
- "desc": "半田付け画面に詳細情報を表示する"
- },
- "PowerLimit": {
- "text2": "電力制限",
- "desc": "最大電力を制限する "
- },
- "CalibrateCJC": {
- "text2": "Calibrate CJC",
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
- },
- "VoltageCalibration": {
- "text2": "電圧校正",
- "desc": "入力電圧(VIN)の校正を開始する <長押しで終了>"
- },
- "PowerPulsePower": {
- "text2": "電力パルス",
- "desc": "電源をオンに保つための電力パルス <ワット>"
- },
- "PowerPulseWait": {
- "text2": "パルス間隔",
- "desc": "電源をオンに保つための電力パルスの時間間隔 "
- },
- "PowerPulseDuration": {
- "text2": "パルス時間長",
- "desc": "電源をオンに保つための電力パルスの時間長 "
- },
- "SettingsReset": {
- "text2": "設定をリセット",
- "desc": "すべての設定を初期化する"
- },
- "LanguageSwitch": {
- "text2": "言語: 日本語",
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "JA_JP",
+ "languageLocalName": "日本語",
+ "tempUnitFahrenheit": true,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration done!"
+ },
+ "ResetOKMessage": {
+ "message": "リセットOK"
+ },
+ "SettingsResetMessage": {
+ "message": "初期化されました"
+ },
+ "NoAccelerometerMessage": {
+ "message": "加速度計未検出"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "PD IC未検出"
+ },
+ "LockingKeysString": {
+ "message": "ボタンロック"
+ },
+ "UnlockingKeysString": {
+ "message": "ロックを解除"
+ },
+ "WarningKeysLockedString": {
+ "message": "!入力ロック中!"
+ },
+ "WarningThermalRunaway": {
+ "message": "過熱"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating"
+ },
+ "SettingsResetWarning": {
+ "message": "設定をリセットしますか?"
+ },
+ "UVLOWarningString": {
+ "message": "電圧が低すぎます"
+ },
+ "UndervoltageString": {
+ "message": "Undervoltage"
+ },
+ "InputVoltageString": {
+ "message": "Input V: "
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Sleeping..."
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Tip: "
+ },
+ "OffString": {
+ "message": "オフ"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "このデバイスはおそらく偽造品です"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "右",
+ "SettingLeftChar": "左",
+ "SettingAutoChar": "自",
+ "SettingOffChar": "×",
+ "SettingSlowChar": "遅",
+ "SettingMediumChar": "中",
+ "SettingFastChar": "速",
+ "SettingStartNoneChar": "×",
+ "SettingStartSolderingChar": "熱",
+ "SettingStartSleepChar": "待",
+ "SettingStartSleepOffChar": "室",
+ "SettingLockDisableChar": "×",
+ "SettingLockBoostChar": "ブ",
+ "SettingLockFullChar": "全"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "電源設定",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "半田付け設定",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "待機設定",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "UI設定",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "高度な設定",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "下限電圧",
+ "description": "下限電圧を指定する "
+ },
+ "MinVolCell": {
+ "displayText": "最低電圧",
+ "description": "セルあたりの最低電圧 <ボルト> <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC電圧",
+ "description": "QC電源使用時に要求する目標電圧"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "一部のQC電源との互換性のため、PDネゴシエーションをタイムアウトする時間 "
+ },
+ "PDVpdo": {
+ "displayText": "PD VPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "ブースト温度",
+ "description": "ブーストモードで使用される温度"
+ },
+ "AutoStart": {
+ "displayText": "自動加熱",
+ "description": "電源投入時に自動的に加熱する <×=オフ | 熱=半田付けモード | 待=スタンバイモード | 室=室温スタンバイモード>"
+ },
+ "TempChangeShortStep": {
+ "displayText": "温度変化 短",
+ "description": "ボタンを短く押した時の温度変化値"
+ },
+ "TempChangeLongStep": {
+ "displayText": "温度変化 長",
+ "description": "ボタンを長押しした時の温度変化値"
+ },
+ "LockingMode": {
+ "displayText": "ボタンロック",
+ "description": "半田付けモード時に両方のボタンを長押しし、ボタンロックする <×=オフ | ブ=ブーストのみ許可 | 全=すべてをロック>"
+ },
+ "MotionSensitivity": {
+ "displayText": "動きの感度",
+ "description": "0=オフ | 1=最低感度 | ... | 9=最高感度"
+ },
+ "SleepTemperature": {
+ "displayText": "待機温度",
+ "description": "スタンバイ時のコテ先温度"
+ },
+ "SleepTimeout": {
+ "displayText": "待機遅延",
+ "description": "スタンバイモードに入るまでの待機時間 "
+ },
+ "ShutdownTimeout": {
+ "displayText": "自動オフ",
+ "description": "自動電源オフまでの待機時間 "
+ },
+ "HallEffSensitivity": {
+ "displayText": "磁界感度",
+ "description": "スタンバイモードに入るのに使用される磁場センサーの感度 <0=オフ | 1=最低感度 | ... | 9=最高感度>"
+ },
+ "TemperatureUnit": {
+ "displayText": "温度単位",
+ "description": "C=摂氏 | F=華氏"
+ },
+ "DisplayRotation": {
+ "displayText": "画面の向き",
+ "description": "右=右利き | 左=左利き | 自=自動"
+ },
+ "CooldownBlink": {
+ "displayText": "冷却中に点滅",
+ "description": "加熱の停止後、コテ先が熱い間は温度表示を点滅する"
+ },
+ "ScrollingSpeed": {
+ "displayText": "スクロール速度",
+ "description": "テキストをスクロールする速さ <遅=遅い | 速=速い>"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "キー入れ替え",
+ "description": "温度設定時に+ボタンと-ボタンを入れ替える"
+ },
+ "AnimSpeed": {
+ "displayText": "動画の速度",
+ "description": "メニューアイコンのアニメーションの速さ <×=再生しない | 遅=低速 | 中=中速 | 速=高速>"
+ },
+ "AnimLoop": {
+ "displayText": "動画をループ",
+ "description": "メニューアイコンのアニメーションをループする"
+ },
+ "Brightness": {
+ "displayText": "画面輝度",
+ "description": "画面の明るさ・コントラストを変更する"
+ },
+ "ColourInversion": {
+ "displayText": "色反転",
+ "description": "画面の色を反転する"
+ },
+ "LOGOTime": {
+ "displayText": "起動画面",
+ "description": "起動画面の表示時間を設定する"
+ },
+ "AdvancedIdle": {
+ "displayText": "詳細な待受画面",
+ "description": "待ち受け画面に詳細情報を表示する"
+ },
+ "AdvancedSoldering": {
+ "displayText": "詳細な作業画面",
+ "description": "半田付け画面に詳細情報を表示する"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "電力制限",
+ "description": "最大電力を制限する "
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "電圧校正",
+ "description": "入力電圧(VIN)の校正を開始する <長押しで終了>"
+ },
+ "PowerPulsePower": {
+ "displayText": "電力パルス",
+ "description": "電源をオンに保つための電力パルス <ワット>"
+ },
+ "PowerPulseWait": {
+ "displayText": "パルス間隔",
+ "description": "電源をオンに保つための電力パルスの時間間隔 "
+ },
+ "PowerPulseDuration": {
+ "displayText": "パルス時間長",
+ "description": "電源をオンに保つための電力パルスの時間長 "
+ },
+ "SettingsReset": {
+ "displayText": "設定をリセット",
+ "description": "すべての設定を初期化する"
+ },
+ "LanguageSwitch": {
+ "displayText": "言語: 日本語",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_LT.json b/Translations/translation_LT.json
index 04ac9ed8..1eb71ace 100644
--- a/Translations/translation_LT.json
+++ b/Translations/translation_LT.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "LT",
- "languageLocalName": "Lietuvių",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Ar norite atstatyti nustatymus į numatytas reikšmes?",
- "UVLOWarningString": "MAŽ VOLT",
- "UndervoltageString": "Žema įtampa",
- "InputVoltageString": "Įvestis V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Miegu...",
- "SleepingTipAdvancedString": "Antg:",
- "OffString": "Išj",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Atstatyta",
- "SettingsResetMessage": [
- "Nust. atstatyti!",
- ""
- ],
- "NoAccelerometerMessage": [
- "Nerastas",
- "akselerometras!"
- ],
- "NoPowerDeliveryMessage": [
- "Nerastas",
- "USB-PD IC!"
- ],
- "LockingKeysString": "UŽRAKIN",
- "UnlockingKeysString": "ATRAKIN",
- "WarningKeysLockedString": "!UŽRAK!",
- "WarningThermalRunaway": [
- "Perkaitimo",
- "pavojus"
- ]
- },
- "characters": {
- "SettingRightChar": "D",
- "SettingLeftChar": "K",
- "SettingAutoChar": "A",
- "SettingOffChar": "I",
- "SettingSlowChar": "L",
- "SettingMediumChar": "V",
- "SettingFastChar": "G",
- "SettingStartNoneChar": "N",
- "SettingStartSolderingChar": "T",
- "SettingStartSleepChar": "M",
- "SettingStartSleepOffChar": "K",
- "SettingSensitivityOff": "I",
- "SettingSensitivityLow": "Ž",
- "SettingSensitivityMedium": "V",
- "SettingSensitivityHigh": "A",
- "SettingLockDisableChar": "I",
- "SettingLockBoostChar": "T",
- "SettingLockFullChar": "V"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Maitinimo",
- "nustatymai"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Litavimo",
- "nustatymai"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Miego",
- "režimai"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Naudotojo",
- "sąsaja"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Išplėsti.",
- "nustatymai"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Maitinimo",
- "šaltinis"
- ],
- "desc": "Išjungimo įtampa. (DC 10V) (arba celių [S] kiekis [3.3V per celę])"
- },
- "MinVolCell": {
- "text2": [
- "Minimalus",
- "voltažas"
- ],
- "desc": "Minimalus voltažas, kuris yra leidžiamas kiekvienam baterijos elementui (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC mait.",
- "įtampa"
- ],
- "desc": "Maksimali QC maitinimo bloko įtampa"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "laikas"
- ],
- "desc": "PD suderinimo laikas žingsniais po 100ms suderinamumui su kai kuriais QC įkrovikliais"
- },
- "BoostTemperature": {
- "text2": [
- "Turbo",
- "temperat."
- ],
- "desc": "Temperatūra turbo režimu"
- },
- "AutoStart": {
- "text2": [
- "Automatinis",
- "paleidimas"
- ],
- "desc": "Ar pradėti kaitininti iš karto įjungus lituoklį (N=Ne | T=Taip | M=Miegas | K=Miegoti kambario temperatūroje)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp.keitim.",
- "trump.spust."
- ],
- "desc": "Temperatūros keitimo žingsnis trumpai spustėlėjus mygtuką"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp.keitim.",
- "ilgas pasp."
- ],
- "desc": "Temperatūros keitimo žingsnis ilgai paspaudus mygtuką"
- },
- "LockingMode": {
- "text2": [
- "Mygtukų",
- "užraktas"
- ],
- "desc": "Lituodami, ilgai paspauskite abu mygtukus, kad juos užrakintumėte (I=Išjungta | T=leidžiamas tik Turbo režimas | V=Visiškas užrakinimas)"
- },
- "MotionSensitivity": {
- "text2": [
- "Judesio",
- "jautrumas"
- ],
- "desc": "Judesio jautrumas (0=Išjungta | 1=Mažiausias | ... | 9=Didžiausias)"
- },
- "SleepTemperature": {
- "text2": [
- "Miego",
- "temperat."
- ],
- "desc": "Antgalio temperatūra miego režimu"
- },
- "SleepTimeout": {
- "text2": [
- "Miego",
- "laikas"
- ],
- "desc": "Užmigimo laikas (sekundės | minutės)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Išjungimo",
- "laikas"
- ],
- "desc": "Išjungimo laikas (minutės)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Holo",
- "jutiklis"
- ],
- "desc": "Holo jutiklio jautrumas nustatant miegą (0=Išjungta | 1=Mažiausias | ... | 9=Didžiausias)"
- },
- "TemperatureUnit": {
- "text2": [
- "Temperatūros",
- "vienetai"
- ],
- "desc": "Temperatūros vienetai (C=Celsijus | F=Farenheitas)"
- },
- "DisplayRotation": {
- "text2": [
- "Ekrano",
- "orientacija"
- ],
- "desc": "Ekrano orientacija (D=Dešiniarankiams | K=Kairiarankiams | A=Automatinė)"
- },
- "CooldownBlink": {
- "text2": [
- "Atvėsimo",
- "mirksėjimas"
- ],
- "desc": "Ar mirksėti temperatūrą ekrane kol vėstantis antgalis vis dar karštas?"
- },
- "ScrollingSpeed": {
- "text2": [
- "Aprašymo",
- "greitis"
- ],
- "desc": "Greitis, kuriuo šis tekstas slenka"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Sukeisti + -",
- "mygtukus?"
- ],
- "desc": "Sukeisti + - temperatūros keitimo mygtukus vietomis"
- },
- "AnimSpeed": {
- "text2": [
- "Animacijų",
- "greitis"
- ],
- "desc": "Paveiksliukų animacijų greitis meniu punktuose (I=Išjungtas | L=Lėtas | V=Vidutinis | G=Greitas)"
- },
- "AnimLoop": {
- "text2": [
- "Animacijų",
- "pakartojimas"
- ],
- "desc": "Leidžia kartoti animacijas be sustojimo pagrindiniame meniu"
- },
- "Brightness": {
- "text2": [
- "Ekrano",
- "šviesumas"
- ],
- "desc": "Nustato OLED ekrano kontrastą/šviesumą."
- },
- "ColourInversion": {
- "text2": [
- "Ekrano",
- "invertavimas"
- ],
- "desc": "Invertuoja OLED ekrano spalvas"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Detalus lau-",
- "kimo ekranas"
- ],
- "desc": "Ar rodyti papildomą informaciją mažesniu šriftu laukimo ekrane"
- },
- "AdvancedSoldering": {
- "text2": [
- "Detalus lita-",
- "vimo ekranas"
- ],
- "desc": "Ar rodyti išsamią informaciją lituojant"
- },
- "PowerLimit": {
- "text2": [
- "Galios",
- "riba"
- ],
- "desc": "Didžiausia galia, kurią gali naudoti lituoklis (Vatai)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibruoti",
- "įvesties įtampą?"
- ],
- "desc": "Įvesties įtampos kalibravimas. Trumpai paspauskite, norėdami nustatyti, ilgai paspauskite, kad išeitumėte."
- },
- "PowerPulsePower": {
- "text2": [
- "Galios",
- "pulso W"
- ],
- "desc": "Periodinis galios pulso intensyvumas maitinblokiui, neleidžiantis jam užmigti."
- },
- "PowerPulseWait": {
- "text2": [
- "Galios pulso",
- "dažnumas"
- ],
- "desc": "Pasikartojantis laiko intervalas (x 2.5s), ties kuriuo kartojamas galios pulsas maitinblokiui, neleidžiantis jam užmigti"
- },
- "PowerPulseDuration": {
- "text2": [
- "Galios pulso",
- "trukmė"
- ],
- "desc": "Galios pulso aktyvioji trukmė (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Atstatyti",
- "nustatymus?"
- ],
- "desc": "Nustato nustatymus į numatytuosius"
- },
- "LanguageSwitch": {
- "text2": [
- "Kalba:",
- " LT Lietuvių"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "LT",
+ "languageLocalName": "Lietuvių",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Atstatyta"
+ },
+ "SettingsResetMessage": {
+ "message": "Nust. \natstatyti!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Nerastas\nakselerometras!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Nerastas\nUSB-PD IC!"
+ },
+ "LockingKeysString": {
+ "message": "UŽRAKIN"
+ },
+ "UnlockingKeysString": {
+ "message": "ATRAKIN"
+ },
+ "WarningKeysLockedString": {
+ "message": "!UŽRAK!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Perkaitimo\npavojus"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Ar norite atstatyti nustatymus į numatytas reikšmes?"
+ },
+ "UVLOWarningString": {
+ "message": "MAŽ VOLT"
+ },
+ "UndervoltageString": {
+ "message": "Žema įtampa\n"
+ },
+ "InputVoltageString": {
+ "message": "Įvestis V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Miegu...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Antg: \n"
+ },
+ "OffString": {
+ "message": "Išj"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "D",
+ "SettingLeftChar": "K",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "I",
+ "SettingSlowChar": "L",
+ "SettingMediumChar": "V",
+ "SettingFastChar": "G",
+ "SettingStartNoneChar": "N",
+ "SettingStartSolderingChar": "T",
+ "SettingStartSleepChar": "M",
+ "SettingStartSleepOffChar": "K",
+ "SettingLockDisableChar": "I",
+ "SettingLockBoostChar": "T",
+ "SettingLockFullChar": "V"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Maitinimo\nnustatymai",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Litavimo\nnustatymai",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Miego\nrežimai",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Naudotojo\nsąsaja",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Išplėsti.\nnustatymai",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Maitinimo\nšaltinis",
+ "description": "Išjungimo įtampa. (DC 10V) (arba celių [S] kiekis [3.3V per celę])"
+ },
+ "MinVolCell": {
+ "displayText": "Minimalus\nvoltažas",
+ "description": "Minimalus voltažas, kuris yra leidžiamas kiekvienam baterijos elementui (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC mait.\nįtampa",
+ "description": "Maksimali QC maitinimo bloko įtampa"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\nlaikas",
+ "description": "PD suderinimo laikas žingsniais po 100ms suderinamumui su kai kuriais QC įkrovikliais"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Turbo\ntemperat.",
+ "description": "Temperatūra turbo režimu"
+ },
+ "AutoStart": {
+ "displayText": "Automatinis\npaleidimas",
+ "description": "Ar pradėti kaitininti iš karto įjungus lituoklį (N=Ne | T=Taip | M=Miegas | K=Miegoti kambario temperatūroje)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp.keitim.\ntrump.spust.",
+ "description": "Temperatūros keitimo žingsnis trumpai spustėlėjus mygtuką"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp.keitim.\nilgas pasp.",
+ "description": "Temperatūros keitimo žingsnis ilgai paspaudus mygtuką"
+ },
+ "LockingMode": {
+ "displayText": "Mygtukų\nužraktas",
+ "description": "Lituodami, ilgai paspauskite abu mygtukus, kad juos užrakintumėte (I=Išjungta | T=leidžiamas tik Turbo režimas | V=Visiškas užrakinimas)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Judesio\njautrumas",
+ "description": "Judesio jautrumas (0=Išjungta | 1=Mažiausias | ... | 9=Didžiausias)"
+ },
+ "SleepTemperature": {
+ "displayText": "Miego\ntemperat.",
+ "description": "Antgalio temperatūra miego režimu"
+ },
+ "SleepTimeout": {
+ "displayText": "Miego\nlaikas",
+ "description": "Užmigimo laikas (sekundės | minutės)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Išjungimo\nlaikas",
+ "description": "Išjungimo laikas (minutės)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Holo\njutiklis",
+ "description": "Holo jutiklio jautrumas nustatant miegą (0=Išjungta | 1=Mažiausias | ... | 9=Didžiausias)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Temperatūros\nvienetai",
+ "description": "Temperatūros vienetai (C=Celsijus | F=Farenheitas)"
+ },
+ "DisplayRotation": {
+ "displayText": "Ekrano\norientacija",
+ "description": "Ekrano orientacija (D=Dešiniarankiams | K=Kairiarankiams | A=Automatinė)"
+ },
+ "CooldownBlink": {
+ "displayText": "Atvėsimo\nmirksėjimas",
+ "description": "Ar mirksėti temperatūrą ekrane kol vėstantis antgalis vis dar karštas?"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Aprašymo\ngreitis",
+ "description": "Greitis, kuriuo šis tekstas slenka"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Sukeisti + -\nmygtukus?",
+ "description": "Sukeisti + - temperatūros keitimo mygtukus vietomis"
+ },
+ "AnimSpeed": {
+ "displayText": "Animacijų\ngreitis",
+ "description": "Paveiksliukų animacijų greitis meniu punktuose (I=Išjungtas | L=Lėtas | V=Vidutinis | G=Greitas)"
+ },
+ "AnimLoop": {
+ "displayText": "Animacijų\npakartojimas",
+ "description": "Leidžia kartoti animacijas be sustojimo pagrindiniame meniu"
+ },
+ "Brightness": {
+ "displayText": "Ekrano\nšviesumas",
+ "description": "Nustato OLED ekrano kontrastą/šviesumą."
+ },
+ "ColourInversion": {
+ "displayText": "Ekrano\ninvertavimas",
+ "description": "Invertuoja OLED ekrano spalvas"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Detalus lau-\nkimo ekranas",
+ "description": "Ar rodyti papildomą informaciją mažesniu šriftu laukimo ekrane"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Detalus lita-\nvimo ekranas",
+ "description": "Ar rodyti išsamią informaciją lituojant"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Galios\nriba",
+ "description": "Didžiausia galia, kurią gali naudoti lituoklis (Vatai)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibruoti\nįvesties įtampą?",
+ "description": "Įvesties įtampos kalibravimas. Trumpai paspauskite, norėdami nustatyti, ilgai paspauskite, kad išeitumėte."
+ },
+ "PowerPulsePower": {
+ "displayText": "Galios\npulso W",
+ "description": "Periodinis galios pulso intensyvumas maitinblokiui, neleidžiantis jam užmigti."
+ },
+ "PowerPulseWait": {
+ "displayText": "Galios pulso\ndažnumas",
+ "description": "Pasikartojantis laiko intervalas (x 2.5s), ties kuriuo kartojamas galios pulsas maitinblokiui, neleidžiantis jam užmigti"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Galios pulso\ntrukmė",
+ "description": "Galios pulso aktyvioji trukmė (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Atstatyti\nnustatymus?",
+ "description": "Nustato nustatymus į numatytuosius"
+ },
+ "LanguageSwitch": {
+ "displayText": "Kalba:\n LT Lietuvių",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_NB.json b/Translations/translation_NB.json
index 43b3010e..b4718137 100644
--- a/Translations/translation_NB.json
+++ b/Translations/translation_NB.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "NB",
- "languageLocalName": "Norsk bokmål",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Er du sikker på at du vil tilbakestille til standardinnstillinger?",
- "UVLOWarningString": "Lavspenn",
- "UndervoltageString": "Underspenning",
- "InputVoltageString": "Innspenn.: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Dvale...",
- "SleepingTipAdvancedString": "Spiss:",
- "OffString": "Av",
- "DeviceFailedValidationWarning": "Enheten din er sannsynligvis en forfalskning!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Tilbakestilling OK",
- "SettingsResetMessage": [
- "Noen innstillinger",
- "ble endret!"
- ],
- "NoAccelerometerMessage": [
- "Ingen akselerometer",
- "funnet!"
- ],
- "NoPowerDeliveryMessage": [
- "Ingen USB-PD IC",
- "funnet!"
- ],
- "LockingKeysString": "LÅST",
- "UnlockingKeysString": "ÅPNET",
- "WarningKeysLockedString": "!LÅST!",
- "WarningThermalRunaway": [
- "Termisk",
- "rømling"
- ]
- },
- "characters": {
- "SettingRightChar": "H",
- "SettingLeftChar": "V",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "S",
- "SettingMediumChar": "M",
- "SettingFastChar": "F",
- "SettingStartNoneChar": "I",
- "SettingStartSolderingChar": "L",
- "SettingStartSleepChar": "D",
- "SettingStartSleepOffChar": "R",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Effekt-",
- "innst."
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Lodde-",
- "innst."
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Dvale-",
- "innst."
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Bruker-",
- "grensesn."
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Avanserte",
- "valg"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Kilde",
- ""
- ],
- "desc": "Strømforsyning. Sett nedre spenning for automatisk nedstenging. (DC 10V) (S 3.3V per celle)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "spenning"
- ],
- "desc": "Minimum tillatt spenning per celle (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC-",
- "spenning"
- ],
- "desc": "Maks QC-spenning bolten skal forhandle om"
- },
- "PDNegTimeout": {
- "text2": [
- "PD-",
- "tidsavb."
- ],
- "desc": "PD-forhandlingstidsavbrudd i steg på 100 ms for kompatibilitet med noen QC-ladere"
- },
- "BoostTemperature": {
- "text2": [
- "KTmp",
- ""
- ],
- "desc": "Temperatur i \"kraft-modus\""
- },
- "AutoStart": {
- "text2": [
- "AStart",
- ""
- ],
- "desc": "Start automatisk med lodding når strøm kobles til. (I=Inaktiv | L=Lodding | D=Dvale | R=Dvale romtemperatur)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp-endring",
- "kort"
- ],
- "desc": "Hvor mye temperaturen skal endres ved kort trykk på knapp"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp-endring",
- "lang"
- ],
- "desc": "Hvor mye temperaturen skal endres ved langt trykk på knapp"
- },
- "LockingMode": {
- "text2": [
- "Tillat å låse",
- "knapper"
- ],
- "desc": "Mens du lodder, hold nede begge knapper for å bytte mellom låsemodus (D=deaktiver | B=kun boost | F=full lås)"
- },
- "MotionSensitivity": {
- "text2": [
- "BSensr",
- ""
- ],
- "desc": "Bevegelsesfølsomhet (0=Inaktiv | 1=Minst følsom | ... | 9=Mest følsom)"
- },
- "SleepTemperature": {
- "text2": [
- "DTmp",
- ""
- ],
- "desc": "Dvaletemperatur (C)"
- },
- "SleepTimeout": {
- "text2": [
- "DTid",
- ""
- ],
- "desc": "Tid før dvale (Minutter | Sekunder)"
- },
- "ShutdownTimeout": {
- "text2": [
- "AvTid",
- ""
- ],
- "desc": "Tid før automatisk nedstenging (Minutter)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall-sensor",
- "følsomhet"
- ],
- "desc": "Sensitiviteten til Hall-effekt-sensoren for å detektere inaktivitet (0=Inaktiv | 1=Minst følsom | ... | 9=Mest følsom)"
- },
- "TemperatureUnit": {
- "text2": [
- "TmpEnh",
- ""
- ],
- "desc": "Temperaturskala (C=Celsius | F=Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "SkRetn",
- ""
- ],
- "desc": "Skjermretning (H=Høyrehendt | V=Venstrehendt | A=Automatisk)"
- },
- "CooldownBlink": {
- "text2": [
- "KjBlnk",
- ""
- ],
- "desc": "Blink temperaturen på skjermen mens spissen fortsatt er varm."
- },
- "ScrollingSpeed": {
- "text2": [
- "RullHa",
- ""
- ],
- "desc": "Hastigheten på rulletekst"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Bytt",
- "+ - kn."
- ],
- "desc": "Bytt om på knappene for å stille temperatur"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "hastighet"
- ],
- "desc": "Hastigheten til animasjonene i menyen (O=off | S=slow | M=medium | F=fast)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loop ikon-animasjoner i hovedmenyen"
- },
- "Brightness": {
- "text2": [
- "Skjerm-",
- "lysstyrke"
- ],
- "desc": "Juster lysstyrken til OLED-skjermen"
- },
- "ColourInversion": {
- "text2": [
- "Inverter",
- "skjerm"
- ],
- "desc": "Inverter fargene på OLED-skjermen"
- },
- "LOGOTime": {
- "text2": [
- "Oppstartlogo",
- "varighet"
- ],
- "desc": "Setter varigheten til oppstartlogoen (s=sekunder)"
- },
- "AdvancedIdle": {
- "text2": [
- "AvDvSk",
- ""
- ],
- "desc": "Vis detaljert informasjon med liten skrift på dvaleskjermen."
- },
- "AdvancedSoldering": {
- "text2": [
- "AvLdSk",
- ""
- ],
- "desc": "Vis detaljert informasjon ved lodding"
- },
- "PowerLimit": {
- "text2": [
- "Effekt-",
- "grense"
- ],
- "desc": "Maks effekt jernet kan bruke (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "TempKal?",
- ""
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "KalSpIn?",
- ""
- ],
- "desc": "Kalibrer spenning. Knappene justerer. Langt trykk for å gå ut"
- },
- "PowerPulsePower": {
- "text2": [
- "Effekt-",
- "puls"
- ],
- "desc": "Hvor høy effekt pulsen for å holde laderen våken skal ha (watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Effektpuls",
- "forsink."
- ],
- "desc": "Forsinkelse før effektpulsen utløses (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Effektpuls",
- "varighet"
- ],
- "desc": "Hvor lenge holde-våken-pulsen varer (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "TilbStl?",
- ""
- ],
- "desc": "Tilbakestill alle innstillinger"
- },
- "LanguageSwitch": {
- "text2": [
- "Språk:",
- " NB Norsk bm"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "NB",
+ "languageLocalName": "Norsk bokmål",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Tilbakestilling OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Noen innstillinger\nble endret!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Ingen akselerometer\nfunnet!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Ingen USB-PD IC\nfunnet!"
+ },
+ "LockingKeysString": {
+ "message": "LÅST"
+ },
+ "UnlockingKeysString": {
+ "message": "ÅPNET"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LÅST!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Termisk\nrømling"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Er du sikker på at du vil tilbakestille til standardinnstillinger?"
+ },
+ "UVLOWarningString": {
+ "message": "Lavspenn"
+ },
+ "UndervoltageString": {
+ "message": "Underspenning\n"
+ },
+ "InputVoltageString": {
+ "message": "Innspenn.: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Dvale...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Spiss: \n"
+ },
+ "OffString": {
+ "message": "Av"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Enheten din er sannsynligvis en forfalskning!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "H",
+ "SettingLeftChar": "V",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "S",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "F",
+ "SettingStartNoneChar": "I",
+ "SettingStartSolderingChar": "L",
+ "SettingStartSleepChar": "D",
+ "SettingStartSleepOffChar": "R",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Effekt-\ninnst.",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Lodde-\ninnst.",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Dvale-\ninnst.",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Bruker-\ngrensesn.",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Avanserte\nvalg",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Kilde\n",
+ "description": "Strømforsyning. Sett nedre spenning for automatisk nedstenging. (DC 10V) (S 3.3V per celle)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nspenning",
+ "description": "Minimum tillatt spenning per celle (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC-\nspenning",
+ "description": "Maks QC-spenning bolten skal forhandle om"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD-\ntidsavb.",
+ "description": "PD-forhandlingstidsavbrudd i steg på 100 ms for kompatibilitet med noen QC-ladere"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "KTmp\n",
+ "description": "Temperatur i \"kraft-modus\""
+ },
+ "AutoStart": {
+ "displayText": "AStart\n",
+ "description": "Start automatisk med lodding når strøm kobles til. (I=Inaktiv | L=Lodding | D=Dvale | R=Dvale romtemperatur)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp-endring\nkort",
+ "description": "Hvor mye temperaturen skal endres ved kort trykk på knapp"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp-endring\nlang",
+ "description": "Hvor mye temperaturen skal endres ved langt trykk på knapp"
+ },
+ "LockingMode": {
+ "displayText": "Tillat å låse\nknapper",
+ "description": "Mens du lodder, hold nede begge knapper for å bytte mellom låsemodus (D=deaktiver | B=kun boost | F=full lås)"
+ },
+ "MotionSensitivity": {
+ "displayText": "BSensr\n",
+ "description": "Bevegelsesfølsomhet (0=Inaktiv | 1=Minst følsom | ... | 9=Mest følsom)"
+ },
+ "SleepTemperature": {
+ "displayText": "DTmp\n",
+ "description": "Dvaletemperatur (C)"
+ },
+ "SleepTimeout": {
+ "displayText": "DTid\n",
+ "description": "Tid før dvale (Minutter | Sekunder)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "AvTid\n",
+ "description": "Tid før automatisk nedstenging (Minutter)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall-sensor\nfølsomhet",
+ "description": "Sensitiviteten til Hall-effekt-sensoren for å detektere inaktivitet (0=Inaktiv | 1=Minst følsom | ... | 9=Mest følsom)"
+ },
+ "TemperatureUnit": {
+ "displayText": "TmpEnh\n",
+ "description": "Temperaturskala (C=Celsius | F=Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "SkRetn\n",
+ "description": "Skjermretning (H=Høyrehendt | V=Venstrehendt | A=Automatisk)"
+ },
+ "CooldownBlink": {
+ "displayText": "KjBlnk\n",
+ "description": "Blink temperaturen på skjermen mens spissen fortsatt er varm."
+ },
+ "ScrollingSpeed": {
+ "displayText": "RullHa\n",
+ "description": "Hastigheten på rulletekst"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Bytt\n+ - kn.",
+ "description": "Bytt om på knappene for å stille temperatur"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nhastighet",
+ "description": "Hastigheten til animasjonene i menyen (O=off | S=slow | M=medium | F=fast)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nloop",
+ "description": "Loop ikon-animasjoner i hovedmenyen"
+ },
+ "Brightness": {
+ "displayText": "Skjerm-\nlysstyrke",
+ "description": "Juster lysstyrken til OLED-skjermen"
+ },
+ "ColourInversion": {
+ "displayText": "Inverter\nskjerm",
+ "description": "Inverter fargene på OLED-skjermen"
+ },
+ "LOGOTime": {
+ "displayText": "Oppstartlogo\nvarighet",
+ "description": "Setter varigheten til oppstartlogoen (s=sekunder)"
+ },
+ "AdvancedIdle": {
+ "displayText": "AvDvSk\n",
+ "description": "Vis detaljert informasjon med liten skrift på dvaleskjermen."
+ },
+ "AdvancedSoldering": {
+ "displayText": "AvLdSk\n",
+ "description": "Vis detaljert informasjon ved lodding"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Effekt-\ngrense",
+ "description": "Maks effekt jernet kan bruke (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "TempKal?\n",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "KalSpIn?\n",
+ "description": "Kalibrer spenning. Knappene justerer. Langt trykk for å gå ut"
+ },
+ "PowerPulsePower": {
+ "displayText": "Effekt-\npuls",
+ "description": "Hvor høy effekt pulsen for å holde laderen våken skal ha (watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Effektpuls\nforsink.",
+ "description": "Forsinkelse før effektpulsen utløses (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Effektpuls\nvarighet",
+ "description": "Hvor lenge holde-våken-pulsen varer (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "TilbStl?\n",
+ "description": "Tilbakestill alle innstillinger"
+ },
+ "LanguageSwitch": {
+ "displayText": "Språk:\n NB Norsk bm",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_NL.json b/Translations/translation_NL.json
index db38745d..02a3c1f1 100644
--- a/Translations/translation_NL.json
+++ b/Translations/translation_NL.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "NL",
- "languageLocalName": "Nederlands",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Weet je zeker dat je de fabrieksinstellingen terug wilt zetten?",
- "UVLOWarningString": "DC Laag",
- "UndervoltageString": "Onderspanning",
- "InputVoltageString": "Voeding V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Slaapstand...",
- "SleepingTipAdvancedString": "Punt:",
- "OffString": "Uit",
- "DeviceFailedValidationWarning": "Jouw toestel is wellicht een namaak-versie!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Instellingen",
- "zijn gereset!"
- ],
- "NoAccelerometerMessage": [
- "Geen accelerometer",
- "gedetecteerd!"
- ],
- "NoPowerDeliveryMessage": [
- "Geen USB-PD IC ",
- "gedetecteerd!"
- ],
- "LockingKeysString": "GEBLOKKEERD",
- "UnlockingKeysString": "GEDEBLOKKEERD",
- "WarningKeysLockedString": "!GEBLOKKEERD!",
- "WarningThermalRunaway": [
- "Verwarming",
- "Oncontroleerbaar"
- ]
- },
- "characters": {
- "SettingRightChar": "R",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "U",
- "SettingSlowChar": "L",
- "SettingMediumChar": "G",
- "SettingFastChar": "S",
- "SettingStartNoneChar": "U",
- "SettingStartSolderingChar": "G",
- "SettingStartSleepChar": "S",
- "SettingStartSleepOffChar": "B",
- "SettingSensitivityOff": "U",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "G",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "U",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "V"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Voeding",
- "instellingen"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Soldeer",
- "instellingen"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Slaap",
- "Modes"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Weergave",
- "instellingen"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Geavanceerde",
- "instellingen"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Spannings-",
- "bron"
- ],
- "desc": "Spanningsbron. Stelt drempelspanning in. (DC 10V) (S 3.3V per cel)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "voltage"
- ],
- "desc": "Minimum toegestaan voltage per cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC",
- "Voltage"
- ],
- "desc": "Maximaal QC voltage dat gevraagd mag worden"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD afstemmingsduur in stappen van 100ms (voor compatibiliteit met sommige QC laders)"
- },
- "BoostTemperature": {
- "text2": [
- "Boost",
- "temp"
- ],
- "desc": "Punt temperatuur in boostmode"
- },
- "AutoStart": {
- "text2": [
- "Opstart",
- "gedrag"
- ],
- "desc": "Gedrag bij opstarten (U=Uit | G=Gebruiks-temperatuur | S=Slaapstand-temperatuur tot beweging | B=Uit tot beweging)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp veranderen",
- "kort"
- ],
- "desc": "Temperatuur verandering bij kort drukken"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp veranderen",
- "lang"
- ],
- "desc": "Temperatuur verandering bij lang drukken"
- },
- "LockingMode": {
- "text2": [
- "Knopblokkering",
- "inschakelen"
- ],
- "desc": "Tijdens solderen lang op beide knoppen drukken blokkeert de knoppen (U=Uit | B=Alleen boost mode | V=Volledig blokkeren)"
- },
- "MotionSensitivity": {
- "text2": [
- "Bewegings-",
- "gevoeligheid"
- ],
- "desc": "Bewegingsgevoeligheid (0=uit | 1=minst gevoelig | ... | 9=meest gevoelig)"
- },
- "SleepTemperature": {
- "text2": [
- "Slaap",
- "temp"
- ],
- "desc": "Punt temperatuur in slaapstand"
- },
- "SleepTimeout": {
- "text2": [
- "Slaap",
- "time-out"
- ],
- "desc": "Tijd voordat slaapmodus wordt geactiveerd (S=seconden | M=minuten)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Uitschakel",
- "time-out"
- ],
- "desc": "Tijd voordat soldeerbout automatisch uitschakelt (M=minuten)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall sensor",
- "gevoeligheid"
- ],
- "desc": "Gevoeligheid van de Hall effect sensor om naar slaapmodus te gaan (0=uit | 1=minst gevoelig | ... | 9=meest gevoelig)"
- },
- "TemperatureUnit": {
- "text2": [
- "Temperatuur",
- "eenheid"
- ],
- "desc": "Temperatuureenheid (C=Celsius | F=Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "Scherm-",
- "oriëntatie"
- ],
- "desc": "Schermoriëntatie (R=Rechtshandig | L=Linkshandig | A=Automatisch)"
- },
- "CooldownBlink": {
- "text2": [
- "Afkoel",
- "flitsen"
- ],
- "desc": "Temperatuur laten flitsen in het hoofdmenu zo lang de punt nog warm is"
- },
- "ScrollingSpeed": {
- "text2": [
- "Scroll",
- "snelheid"
- ],
- "desc": "Snelheid waarmee de tekst scrolt (S=Snel | L=Langzaam)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Draai",
- "+ - knoppen om"
- ],
- "desc": "Keer de +- knoppen van de temperatuurregeling om"
- },
- "AnimSpeed": {
- "text2": [
- "Animatie",
- "snelheid"
- ],
- "desc": "Tempo van de icoon animaties in het hoofdmenu (U=uit | L=langzaam | G=gemiddeld | S=snel)"
- },
- "AnimLoop": {
- "text2": [
- "Animatie",
- "herhaling"
- ],
- "desc": "Herhaal icoon animaties in hoofdmenu"
- },
- "Brightness": {
- "text2": [
- "Scherm",
- "helderheid"
- ],
- "desc": "Pas helderheid van het OLED scherm aan"
- },
- "ColourInversion": {
- "text2": [
- "Inverteer",
- "scherm"
- ],
- "desc": "Inverteer de kleuren van het OLED scherm"
- },
- "LOGOTime": {
- "text2": [
- "Opstart logo",
- "duur"
- ],
- "desc": "Stelt de weergaveduur van het opstartlogo in (s=seconden)"
- },
- "AdvancedIdle": {
- "text2": [
- "Gedetailleerd",
- "startscherm"
- ],
- "desc": "Gedetailleerde informatie weergeven in een kleine letters op het startscherm."
- },
- "AdvancedSoldering": {
- "text2": [
- "Gedetailleerd",
- "soldeerscherm"
- ],
- "desc": "Gedetailleerde informatie weergeven in een kleiner lettertype op het soldeerscherm"
- },
- "PowerLimit": {
- "text2": [
- "Vermogen",
- "limiet"
- ],
- "desc": "Maximaal vermogen (W=Watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibreer",
- "input-voltage?"
- ],
- "desc": "Start VIN Kalibratie (druk lang om te sluiten)"
- },
- "PowerPulsePower": {
- "text2": [
- "Stroom",
- "Puls"
- ],
- "desc": "Intensiteit van stroompuls om voeding aan te houden (watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Stroompuls",
- "interval"
- ],
- "desc": "Tijdsduur tussen voeding wakker-blijf-pulsen (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duur"
- ],
- "desc": "Duur van voeding-wakker-blijf-pulsen (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Instellingen",
- "resetten?"
- ],
- "desc": "Alle instellingen terugzetten naar fabrieksinstellingen"
- },
- "LanguageSwitch": {
- "text2": [
- "Taal:",
- " NL Nederlands"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "NL",
+ "languageLocalName": "Nederlands",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Instellingen\nzijn gereset!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Geen accelerometer\ngedetecteerd!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Geen USB-PD IC \ngedetecteerd!"
+ },
+ "LockingKeysString": {
+ "message": "GEBLOKKEERD"
+ },
+ "UnlockingKeysString": {
+ "message": "GEDEBLOKKEERD"
+ },
+ "WarningKeysLockedString": {
+ "message": "!GEBLOKKEERD!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Verwarming\nOncontroleerbaar"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Weet je zeker dat je de fabrieksinstellingen terug wilt zetten?"
+ },
+ "UVLOWarningString": {
+ "message": "DC Laag"
+ },
+ "UndervoltageString": {
+ "message": "Onderspanning\n"
+ },
+ "InputVoltageString": {
+ "message": "Voeding V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Slaapstand...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Punt: \n"
+ },
+ "OffString": {
+ "message": "Uit"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Jouw toestel is wellicht een namaak-versie!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "R",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "U",
+ "SettingSlowChar": "L",
+ "SettingMediumChar": "G",
+ "SettingFastChar": "S",
+ "SettingStartNoneChar": "U",
+ "SettingStartSolderingChar": "G",
+ "SettingStartSleepChar": "S",
+ "SettingStartSleepOffChar": "B",
+ "SettingLockDisableChar": "U",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "V"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Voeding\ninstellingen",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Soldeer\ninstellingen",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Slaap\nModes",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Weergave\ninstellingen",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Geavanceerde\ninstellingen",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Spannings-\nbron",
+ "description": "Spanningsbron. Stelt drempelspanning in. (DC 10V) (S 3.3V per cel)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nvoltage",
+ "description": "Minimum toegestaan voltage per cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC\nvoltage",
+ "description": "Maximaal QC voltage dat gevraagd mag worden"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD afstemmingsduur in stappen van 100ms (voor compatibiliteit met sommige QC laders)"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Boost\ntemp",
+ "description": "Punt temperatuur in boostmode"
+ },
+ "AutoStart": {
+ "displayText": "Opstart\ngedrag",
+ "description": "Gedrag bij opstarten (U=Uit | G=Gebruiks-temperatuur | S=Slaapstand-temperatuur tot beweging | B=Uit tot beweging)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp veranderen\nkort",
+ "description": "Temperatuur verandering bij kort drukken"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp veranderen\nlang",
+ "description": "Temperatuur verandering bij lang drukken"
+ },
+ "LockingMode": {
+ "displayText": "Knopblokkering\ninschakelen",
+ "description": "Tijdens solderen lang op beide knoppen drukken blokkeert de knoppen (U=Uit | B=Alleen boost mode | V=Volledig blokkeren)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Bewegings-\ngevoeligheid",
+ "description": "Bewegingsgevoeligheid (0=uit | 1=minst gevoelig | ... | 9=meest gevoelig)"
+ },
+ "SleepTemperature": {
+ "displayText": "Slaap\ntemp",
+ "description": "Punt temperatuur in slaapstand"
+ },
+ "SleepTimeout": {
+ "displayText": "Slaap\ntime-out",
+ "description": "Tijd voordat slaapmodus wordt geactiveerd (S=seconden | M=minuten)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Uitschakel\ntime-out",
+ "description": "Tijd voordat soldeerbout automatisch uitschakelt (M=minuten)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall sensor\ngevoeligheid",
+ "description": "Gevoeligheid van de Hall effect sensor om naar slaapmodus te gaan (0=uit | 1=minst gevoelig | ... | 9=meest gevoelig)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Temperatuur\neenheid",
+ "description": "Temperatuureenheid (C=Celsius | F=Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "Scherm-\noriëntatie",
+ "description": "Schermoriëntatie (R=Rechtshandig | L=Linkshandig | A=Automatisch)"
+ },
+ "CooldownBlink": {
+ "displayText": "Afkoel\nflitsen",
+ "description": "Temperatuur laten flitsen in het hoofdmenu zo lang de punt nog warm is"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Scroll\nsnelheid",
+ "description": "Snelheid waarmee de tekst scrolt (S=Snel | L=Langzaam)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Draai\n+ - knoppen om",
+ "description": "Keer de +- knoppen van de temperatuurregeling om"
+ },
+ "AnimSpeed": {
+ "displayText": "Animatie\nsnelheid",
+ "description": "Tempo van de icoon animaties in het hoofdmenu (U=uit | L=langzaam | G=gemiddeld | S=snel)"
+ },
+ "AnimLoop": {
+ "displayText": "Animatie\nherhaling",
+ "description": "Herhaal icoon animaties in hoofdmenu"
+ },
+ "Brightness": {
+ "displayText": "Scherm\nhelderheid",
+ "description": "Pas helderheid van het OLED scherm aan"
+ },
+ "ColourInversion": {
+ "displayText": "Inverteer\nscherm",
+ "description": "Inverteer de kleuren van het OLED scherm"
+ },
+ "LOGOTime": {
+ "displayText": "Opstart logo\nduur",
+ "description": "Stelt de weergaveduur van het opstartlogo in (s=seconden)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Gedetailleerd\nstartscherm",
+ "description": "Gedetailleerde informatie weergeven in een kleine letters op het startscherm."
+ },
+ "AdvancedSoldering": {
+ "displayText": "Gedetailleerd\nsoldeerscherm",
+ "description": "Gedetailleerde informatie weergeven in een kleiner lettertype op het soldeerscherm"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Vermogen\nlimiet",
+ "description": "Maximaal vermogen (W=Watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibreer\ninput-voltage?",
+ "description": "Start VIN Kalibratie (druk lang om te sluiten)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Stroom\nPuls",
+ "description": "Intensiteit van stroompuls om voeding aan te houden (watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Stroompuls\ninterval",
+ "description": "Tijdsduur tussen voeding wakker-blijf-pulsen (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Power pulse\nduur",
+ "description": "Duur van voeding-wakker-blijf-pulsen (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Instellingen\nresetten?",
+ "description": "Alle instellingen terugzetten naar fabrieksinstellingen"
+ },
+ "LanguageSwitch": {
+ "displayText": "Taal:\n NL Nederlands",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_NL_BE.json b/Translations/translation_NL_BE.json
index 8201db73..9f7f82c6 100644
--- a/Translations/translation_NL_BE.json
+++ b/Translations/translation_NL_BE.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "NL_BE",
- "languageLocalName": "Vlaams",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Ben je zeker dat je alle standaardwaarden wil resetten?",
- "UVLOWarningString": "Voedingsspanning LAAG",
- "UndervoltageString": "Onderspanning",
- "InputVoltageString": "Voedingsspanning: ",
- "SleepingSimpleString": "Zzz ",
- "SleepingAdvancedString": "Slaapstand...",
- "SleepingTipAdvancedString": "Punt:",
- "OffString": "Uit",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Certain settings",
- "were changed!"
- ],
- "NoAccelerometerMessage": [
- "No accelerometer",
- "detected!"
- ],
- "NoPowerDeliveryMessage": [
- "No USB-PD IC",
- "detected!"
- ],
- "LockingKeysString": "LOCKED",
- "UnlockingKeysString": "UNLOCKED",
- "WarningKeysLockedString": "!LOCKED!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "R",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "T",
- "SettingMediumChar": "M",
- "SettingFastChar": "S",
- "SettingStartNoneChar": "F",
- "SettingStartSolderingChar": "T",
- "SettingStartSleepChar": "S",
- "SettingStartSleepOffChar": "K",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Power",
- "settings"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Soldeer",
- "Instellingen"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Slaap",
- "standen"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Gebruikers-",
- "Interface"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Gevorderde",
- "Instellingen"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Spannings-",
- "bron"
- ],
- "desc": "Spanningsbron. Stelt minimumspanning in. (DC 10V) (S 3.3V per cel)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "voltage"
- ],
- "desc": "Minimum allowed voltage per cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Vermogen",
- "Watt"
- ],
- "desc": "Vermogen van de adapter"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
- },
- "BoostTemperature": {
- "text2": [
- "Verhogings",
- "temp"
- ],
- "desc": "Verhogingstemperatuur"
- },
- "AutoStart": {
- "text2": [
- "Auto",
- "start"
- ],
- "desc": "Breng de soldeerbout op temperatuur bij het opstarten. (F=Uit | T=Soldeertemperatuur | S=Slaapstand-temperatuur | K=Slaapstand kamertemperatuur)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp change",
- "short"
- ],
- "desc": "Temperature-change-increment on short button press"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp change",
- "long"
- ],
- "desc": "Temperature-change-increment on long button press"
- },
- "LockingMode": {
- "text2": [
- "Allow locking",
- "buttons"
- ],
- "desc": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
- },
- "MotionSensitivity": {
- "text2": [
- "Bewegings-",
- "gevoeligheid"
- ],
- "desc": "Bewegingsgevoeligheid (0=uit | 1=minst gevoelig | ... | 9=meest gevoelig)"
- },
- "SleepTemperature": {
- "text2": [
- "Slaap",
- "temp"
- ],
- "desc": "Temperatuur in slaapstand (°C)"
- },
- "SleepTimeout": {
- "text2": [
- "Slaap",
- "time-out"
- ],
- "desc": "Slaapstand time-out (Minuten | Seconden)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Uitschakel",
- "time-out"
- ],
- "desc": "Automatisch afsluiten time-out (Minuten)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall sensor",
- "sensitivity"
- ],
- "desc": "Sensitivity to magnets (0=uit | 1=minst gevoelig | ... | 9=meest gevoelig)"
- },
- "TemperatureUnit": {
- "text2": [
- "Temperatuur",
- "schaal"
- ],
- "desc": "Temperatuurschaal (°C=Celsius | °F=Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "Scherm-",
- "oriëntatie"
- ],
- "desc": "Schermoriëntatie (R=Rechtshandig | L=Linkshandig | A=Automatisch)"
- },
- "CooldownBlink": {
- "text2": [
- "Afkoel",
- "knipper"
- ],
- "desc": "Temperatuur knippert in hoofdmenu tijdens afkoeling."
- },
- "ScrollingSpeed": {
- "text2": [
- "Scrol",
- "snelheid"
- ],
- "desc": "Scrolsnelheid van de tekst."
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Swap",
- "+ - keys"
- ],
- "desc": "Reverse assignment of buttons for temperature adjustment"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "speed"
- ],
- "desc": "Pace of icon animations in menu (O=off | T=slow | M=medium | S=fast)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loop icon animations in main menu"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Gedetailleerd",
- "slaapscherm"
- ],
- "desc": "Gedetailleerde informatie in een kleiner lettertype in het slaapscherm."
- },
- "AdvancedSoldering": {
- "text2": [
- "Gedetailleerd",
- "soldeerscherm"
- ],
- "desc": "Gedetailleerde informatie in kleiner lettertype in soldeerscherm."
- },
- "PowerLimit": {
- "text2": [
- "Power",
- "limit"
- ],
- "desc": "Maximum power the iron can use (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Calibreer",
- "voedingsspanning?"
- ],
- "desc": "VIN Calibreren. Bevestigen door knoppen lang in te drukken."
- },
- "PowerPulsePower": {
- "text2": [
- "Power",
- "pulse"
- ],
- "desc": "Intensity of power of keep-awake-pulse (W=watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Power pulse",
- "delay"
- ],
- "desc": "Delay before keep-awake-pulse is triggered (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duration"
- ],
- "desc": "Keep-awake-pulse duration (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Instellingen",
- "resetten?"
- ],
- "desc": "Alle instellingen resetten."
- },
- "LanguageSwitch": {
- "text2": [
- "Spraak:",
- " NL_BE Vlaams"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "NL_BE",
+ "languageLocalName": "Vlaams",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Certain settings\nwere changed!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "No accelerometer\ndetected!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "No USB-PD IC\ndetected!"
+ },
+ "LockingKeysString": {
+ "message": "LOCKED"
+ },
+ "UnlockingKeysString": {
+ "message": "UNLOCKED"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LOCKED!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Ben je zeker dat je alle standaardwaarden wil resetten?"
+ },
+ "UVLOWarningString": {
+ "message": "Voedingsspanning LAAG"
+ },
+ "UndervoltageString": {
+ "message": "Onderspanning\n"
+ },
+ "InputVoltageString": {
+ "message": "Voedingsspanning: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzz "
+ },
+ "SleepingAdvancedString": {
+ "message": "Slaapstand...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Punt: \n"
+ },
+ "OffString": {
+ "message": "Uit"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "R",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "T",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "S",
+ "SettingStartNoneChar": "F",
+ "SettingStartSolderingChar": "T",
+ "SettingStartSleepChar": "S",
+ "SettingStartSleepOffChar": "K",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Power\nsettings",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Soldeer\nInstellingen",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Slaap\nstanden",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Gebruikers-\nInterface",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Gevorderde\nInstellingen",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Spannings-\nbron",
+ "description": "Spanningsbron. Stelt minimumspanning in. (DC 10V) (S 3.3V per cel)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nvoltage",
+ "description": "Minimum allowed voltage per cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Vermogen\nWatt",
+ "description": "Vermogen van de adapter"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Verhogings\ntemp",
+ "description": "Verhogingstemperatuur"
+ },
+ "AutoStart": {
+ "displayText": "Auto\nstart",
+ "description": "Breng de soldeerbout op temperatuur bij het opstarten. (F=Uit | T=Soldeertemperatuur | S=Slaapstand-temperatuur | K=Slaapstand kamertemperatuur)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp change\nshort",
+ "description": "Temperature-change-increment on short button press"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp change\nlong",
+ "description": "Temperature-change-increment on long button press"
+ },
+ "LockingMode": {
+ "displayText": "Allow locking\nbuttons",
+ "description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Bewegings-\ngevoeligheid",
+ "description": "Bewegingsgevoeligheid (0=uit | 1=minst gevoelig | ... | 9=meest gevoelig)"
+ },
+ "SleepTemperature": {
+ "displayText": "Slaap\ntemp",
+ "description": "Temperatuur in slaapstand (°C)"
+ },
+ "SleepTimeout": {
+ "displayText": "Slaap\ntime-out",
+ "description": "Slaapstand time-out (Minuten | Seconden)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Uitschakel\ntime-out",
+ "description": "Automatisch afsluiten time-out (Minuten)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall sensor\nsensitivity",
+ "description": "Sensitivity to magnets (0=uit | 1=minst gevoelig | ... | 9=meest gevoelig)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Temperatuur\nschaal",
+ "description": "Temperatuurschaal (°C=Celsius | °F=Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "Scherm-\noriëntatie",
+ "description": "Schermoriëntatie (R=Rechtshandig | L=Linkshandig | A=Automatisch)"
+ },
+ "CooldownBlink": {
+ "displayText": "Afkoel\nknipper",
+ "description": "Temperatuur knippert in hoofdmenu tijdens afkoeling."
+ },
+ "ScrollingSpeed": {
+ "displayText": "Scrol\nsnelheid",
+ "description": "Scrolsnelheid van de tekst."
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Swap\n+ - keys",
+ "description": "Reverse assignment of buttons for temperature adjustment"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nspeed",
+ "description": "Pace of icon animations in menu (O=off | T=slow | M=medium | S=fast)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nloop",
+ "description": "Loop icon animations in main menu"
+ },
+ "Brightness": {
+ "displayText": "Screen\nbrightness",
+ "description": "Adjust the OLED screen brightness"
+ },
+ "ColourInversion": {
+ "displayText": "Invert\nscreen",
+ "description": "Invert the OLED screen colors"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Gedetailleerd\nslaapscherm",
+ "description": "Gedetailleerde informatie in een kleiner lettertype in het slaapscherm."
+ },
+ "AdvancedSoldering": {
+ "displayText": "Gedetailleerd\nsoldeerscherm",
+ "description": "Gedetailleerde informatie in kleiner lettertype in soldeerscherm."
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Power\nlimit",
+ "description": "Maximum power the iron can use (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Calibreer\nvoedingsspanning?",
+ "description": "VIN Calibreren. Bevestigen door knoppen lang in te drukken."
+ },
+ "PowerPulsePower": {
+ "displayText": "Power\npulse",
+ "description": "Intensity of power of keep-awake-pulse (W=watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Power pulse\ndelay",
+ "description": "Delay before keep-awake-pulse is triggered (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Power pulse\nduration",
+ "description": "Keep-awake-pulse duration (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Instellingen\nresetten?",
+ "description": "Alle instellingen resetten."
+ },
+ "LanguageSwitch": {
+ "displayText": "Spraak:\n NL_BE Vlaams",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_PL.json b/Translations/translation_PL.json
index 745abb19..9526f8b5 100644
--- a/Translations/translation_PL.json
+++ b/Translations/translation_PL.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "PL",
- "languageLocalName": "Polski",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Upewnij się, że końcówka i uchwyt mają temperaturę pokojową podczas następnego rozruchu!",
- "CJCCalibrating": "kalibracja",
- "SettingsResetWarning": "Czy na pewno chcesz przywrócić ustawienia fabryczne?",
- "UVLOWarningString": "NIS. NAP",
- "UndervoltageString": "Zbyt niskie nap.",
- "InputVoltageString": "Nap. wej.:",
- "SleepingSimpleString": "Zzz!",
- "SleepingAdvancedString": "Tr. uśpienia",
- "SleepingTipAdvancedString": "Grot:",
- "OffString": "Wył",
- "DeviceFailedValidationWarning": "Twoje urządzenie jest najprawdopodobniej podróbką!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Ust. zresetowane",
- ""
- ],
- "NoAccelerometerMessage": [
- "Nie rozpoznano",
- "akcelerometru!"
- ],
- "NoPowerDeliveryMessage": [
- "Nie rozpoznano",
- "kont. USB-PD IC!"
- ],
- "LockingKeysString": " ZABLOK.",
- "UnlockingKeysString": "ODBLOK.",
- "WarningKeysLockedString": "!ZABLOK!",
- "WarningThermalRunaway": [
- "Ucieczka",
- "termiczna"
- ]
- },
- "characters": {
- "SettingRightChar": "P",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "W",
- "SettingMediumChar": "M",
- "SettingFastChar": "S",
- "SettingStartNoneChar": "B",
- "SettingStartSolderingChar": "T",
- "SettingStartSleepChar": "Z",
- "SettingStartSleepOffChar": "O",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "N",
- "SettingSensitivityMedium": "Ś",
- "SettingSensitivityHigh": "W",
- "SettingLockDisableChar": "W",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "P"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Ustawienia",
- "zasilania"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Lutowanie",
- ""
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Oszcz.",
- "energii"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Interfejs",
- "użytkownika"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Ustawienia",
- "zaawans."
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Źródło",
- "zasilania"
- ],
- "desc": "Źródło zasilania. Ustaw napięcie odcięcia. (DC 10V) (S 3.3V dla ogniw Li, wyłącz limit mocy)"
- },
- "MinVolCell": {
- "text2": [
- "Minimalne",
- "napięcie"
- ],
- "desc": "Minimalne dozwolone napięcie na komórkę (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC",
- "napięcie"
- ],
- "desc": "Maksymalne napięcie, które lutownica będzie próbowała wynegocjować z ładowarką Quick Charge (V)"
- },
- "PDNegTimeout": {
- "text2": [
- "Limit czasu",
- "PD"
- ],
- "desc": "Limit czasu negocjacji PD w krokach co 100 ms dla zgodności z niektórymi ładowarkami QC (0: wyłączone)"
- },
- "BoostTemperature": {
- "text2": [
- "Temp.",
- "boost"
- ],
- "desc": "Temperatura w trybie \"boost\" "
- },
- "AutoStart": {
- "text2": [
- "Aut. uruch.",
- "tr. lutowania"
- ],
- "desc": "Automatyczne uruchamianie trybu lutowania po włączeniu zasilania. (B: wyłączone | T: lutowanie | Z: uśpienie | O: uśpienie w temp. pokojowej)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Zm. temp.",
- "kr. przyc."
- ],
- "desc": "Wartość zmiany temperatury, po krótkim przyciśnięciu (°C)"
- },
- "TempChangeLongStep": {
- "text2": [
- "Zm. temp.",
- "dł. przyc."
- ],
- "desc": "Wartość zmiany temperatury, po długim przyciśnięciu (°C)"
- },
- "LockingMode": {
- "text2": [
- "Blokada",
- "przycisków"
- ],
- "desc": "W trybie lutowania, wciśnij oba przyciski aby je zablokować (O=Wyłączona | B=tylko Boost | P=pełna blokada)"
- },
- "MotionSensitivity": {
- "text2": [
- "Czułość",
- "wykr. ruchu"
- ],
- "desc": "Czułość wykrywania ruchu (0: Wyłączona | 1: Minimalna | ... | 9: Maksymalna)"
- },
- "SleepTemperature": {
- "text2": [
- "Temp.",
- "uśpienia"
- ],
- "desc": "Temperatura w trybie uśpienia (°C)"
- },
- "SleepTimeout": {
- "text2": [
- "Czas do",
- "uśpienia"
- ],
- "desc": "Czas do przejścia w tryb uśpienia (minuty | sekundy)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Czas do",
- "wyłączenia"
- ],
- "desc": "Czas do wyłączenia (minuty)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Czułość",
- "cz. Halla"
- ],
- "desc": "Czułość czujnika Halla, używanego do przechodznia w tryb uśpienia (0: Wyłączona | 1: Minimalna | ... | 9: Maksymalna)"
- },
- "TemperatureUnit": {
- "text2": [
- "Jednostka",
- "temperatury"
- ],
- "desc": "Jednostka temperatury (C: Celciusz | F: Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "Obrót",
- "ekranu"
- ],
- "desc": "Obrót ekranu (P: dla praworęcznych | L: dla leworęcznych | A: automatycznie)"
- },
- "CooldownBlink": {
- "text2": [
- "Mig. podczas",
- "wychładzania"
- ],
- "desc": "Temperatura miga podczas wychładzania, gdy grot jest wciąż gorący"
- },
- "ScrollingSpeed": {
- "text2": [
- "Sz. przew.",
- "tekstu"
- ],
- "desc": "Szybkość przewijania tekstu"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Zamień przyc.",
- "+ -"
- ],
- "desc": "Zamienia działanie przycisków zmiany temperatury grotu"
- },
- "AnimSpeed": {
- "text2": [
- "Prędkosć",
- "animacji"
- ],
- "desc": "Prędkość animacji ikon w menu (O: wył. | W: mała | M: średnia | S: duża)"
- },
- "AnimLoop": {
- "text2": [
- "Zapętlona",
- "animacja"
- ],
- "desc": "Zapętla animację ikon w menu głównym"
- },
- "Brightness": {
- "text2": [
- "Jasność",
- "wyświetlacza"
- ],
- "desc": "Regulacja kontrastu/jasności wyświetlacza OLED"
- },
- "ColourInversion": {
- "text2": [
- "Odwrócenie",
- "kolorów"
- ],
- "desc": "Odwrócenie kolorów wyświetlacza OLED"
- },
- "LOGOTime": {
- "text2": [
- "Długość wyś.",
- "loga"
- ],
- "desc": "Ustawia czas wyświetlania loga podczas uruchamiania (s=sekund)"
- },
- "AdvancedIdle": {
- "text2": [
- "Szeczegółowy",
- "ekran bezczy."
- ],
- "desc": "Wyświetla szczegółowe informacje za pomocą mniejszej czcionki na ekranie bezczynności"
- },
- "AdvancedSoldering": {
- "text2": [
- "Sz. inf. w",
- "tr. lutowania"
- ],
- "desc": "Wyświetl szczegółowe informacje w trybie lutowania"
- },
- "PowerLimit": {
- "text2": [
- "Ogr.",
- "mocy"
- ],
- "desc": "Maksymalna moc (W), jakiej może użyć lutownica"
- },
- "CalibrateCJC": {
- "text2": [
- "Kalibracja temperatury",
- "przy następnym uruchomieniu"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibracja",
- "napięcia"
- ],
- "desc": "Kalibracja napięcia wejściowego. Krótkie naciśnięcie, aby ustawić, długie naciśnięcie, aby wyjść."
- },
- "PowerPulsePower": {
- "text2": [
- "Moc",
- "impulsu"
- ],
- "desc": "W przypadku używania powerbanku, utrzymuj moc na poziomie (W) aby nie uśpić powerbanku"
- },
- "PowerPulseWait": {
- "text2": [
- "Czas między",
- "imp. mocy"
- ],
- "desc": "Czas między kolejnymi impulsami mocy zapobiegającymi usypianiu powerbanku (x2,5 s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Długość",
- "impulsu mocy"
- ],
- "desc": "Długość impulsu mocy zapobiegającego usypianiu powerbanku (x250 ms)"
- },
- "SettingsReset": {
- "text2": [
- "Ustawienia",
- "fabryczne"
- ],
- "desc": "Resetuje wszystkie ustawienia"
- },
- "LanguageSwitch": {
- "text2": [
- "Język:",
- " PL Polski"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "PL",
+ "languageLocalName": "Polski",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Kalibracja\nwykonana!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Ust. \nzresetowane"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Nie rozpoznano\nakcelerometru!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Nie rozpoznano\nkont. USB-PD IC!"
+ },
+ "LockingKeysString": {
+ "message": " ZABLOK."
+ },
+ "UnlockingKeysString": {
+ "message": "ODBLOK."
+ },
+ "WarningKeysLockedString": {
+ "message": "!ZABLOK!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Ucieczka\ntermiczna"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Upewnij się, że końcówka i uchwyt mają temperaturę pokojową podczas następnego rozruchu!"
+ },
+ "CJCCalibrating": {
+ "message": "kalibracja\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Czy na pewno chcesz przywrócić ustawienia fabryczne?"
+ },
+ "UVLOWarningString": {
+ "message": "NIS. NAP"
+ },
+ "UndervoltageString": {
+ "message": "Zbyt niskie nap.\n"
+ },
+ "InputVoltageString": {
+ "message": "Nap. wej.: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzz!"
+ },
+ "SleepingAdvancedString": {
+ "message": "Tr. uśpienia\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Grot: \n"
+ },
+ "OffString": {
+ "message": "Wył"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Twoje urządzenie jest najprawdopodobniej podróbką!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "P",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "W",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "S",
+ "SettingStartNoneChar": "B",
+ "SettingStartSolderingChar": "T",
+ "SettingStartSleepChar": "Z",
+ "SettingStartSleepOffChar": "O",
+ "SettingLockDisableChar": "W",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "P"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Ustawienia\nzasilania",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Lutowanie\n",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Oszcz.\nenergii",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Interfejs\nużytkownika",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Ustawienia\nzaawans.",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Źródło\nzasilania",
+ "description": "Źródło zasilania. Ustaw napięcie odcięcia. (DC 10V) (S 3.3V dla ogniw Li, wyłącz limit mocy)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimalne\nnapięcie",
+ "description": "Minimalne dozwolone napięcie na komórkę (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC\nnapięcie",
+ "description": "Maksymalne napięcie, które lutownica będzie próbowała wynegocjować z ładowarką Quick Charge (V)"
+ },
+ "PDNegTimeout": {
+ "displayText": "Limit czasu\nPD",
+ "description": "Limit czasu negocjacji PD w krokach co 100 ms dla zgodności z niektórymi ładowarkami QC (0: wyłączone)"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Włącza tryby PPS & EPR."
+ },
+ "BoostTemperature": {
+ "displayText": "Temp.\nboost",
+ "description": "Temperatura w trybie \"boost\" "
+ },
+ "AutoStart": {
+ "displayText": "Aut. uruch.\ntr. lutowania",
+ "description": "Automatyczne uruchamianie trybu lutowania po włączeniu zasilania. (B: wyłączone | T: lutowanie | Z: uśpienie | O: uśpienie w temp. pokojowej)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Zm. temp.\nkr. przyc.",
+ "description": "Wartość zmiany temperatury, po krótkim przyciśnięciu (°C)"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Zm. temp.\ndł. przyc.",
+ "description": "Wartość zmiany temperatury, po długim przyciśnięciu (°C)"
+ },
+ "LockingMode": {
+ "displayText": "Blokada\nprzycisków",
+ "description": "W trybie lutowania, wciśnij oba przyciski aby je zablokować (O=Wyłączona | B=tylko Boost | P=pełna blokada)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Czułość\nwykr. ruchu",
+ "description": "Czułość wykrywania ruchu (0: Wyłączona | 1: Minimalna | ... | 9: Maksymalna)"
+ },
+ "SleepTemperature": {
+ "displayText": "Temp.\nuśpienia",
+ "description": "Temperatura w trybie uśpienia (°C)"
+ },
+ "SleepTimeout": {
+ "displayText": "Czas do\nuśpienia",
+ "description": "Czas do przejścia w tryb uśpienia (minuty | sekundy)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Czas do\nwyłączenia",
+ "description": "Czas do wyłączenia (minuty)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Czułość\ncz. Halla",
+ "description": "Czułość czujnika Halla, używanego do przechodznia w tryb uśpienia (0: Wyłączona | 1: Minimalna | ... | 9: Maksymalna)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Jednostka\ntemperatury",
+ "description": "Jednostka temperatury (C: Celciusz | F: Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "Obrót\nekranu",
+ "description": "Obrót ekranu (P: dla praworęcznych | L: dla leworęcznych | A: automatycznie)"
+ },
+ "CooldownBlink": {
+ "displayText": "Mig. podczas\nwychładzania",
+ "description": "Temperatura miga podczas wychładzania, gdy grot jest wciąż gorący"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Sz. przew.\ntekstu",
+ "description": "Szybkość przewijania tekstu"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Zamień przyc.\n+ -",
+ "description": "Zamienia działanie przycisków zmiany temperatury grotu"
+ },
+ "AnimSpeed": {
+ "displayText": "Prędkosć\nanimacji",
+ "description": "Prędkość animacji ikon w menu (O: wył. | W: mała | M: średnia | S: duża)"
+ },
+ "AnimLoop": {
+ "displayText": "Zapętlona\nanimacja",
+ "description": "Zapętla animację ikon w menu głównym"
+ },
+ "Brightness": {
+ "displayText": "Jasność\nwyświetlacza",
+ "description": "Regulacja kontrastu/jasności wyświetlacza OLED"
+ },
+ "ColourInversion": {
+ "displayText": "Odwrócenie\nkolorów",
+ "description": "Odwrócenie kolorów wyświetlacza OLED"
+ },
+ "LOGOTime": {
+ "displayText": "Długość wyś.\nloga",
+ "description": "Ustawia czas wyświetlania loga podczas uruchamiania (s=sekund)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Szeczegółowy\nekran bezczy.",
+ "description": "Wyświetla szczegółowe informacje za pomocą mniejszej czcionki na ekranie bezczynności"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Sz. inf. w\ntr. lutowania",
+ "description": "Wyświetl szczegółowe informacje w trybie lutowania"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Ogr.\nmocy",
+ "description": "Maksymalna moc (W), jakiej może użyć lutownica"
+ },
+ "CalibrateCJC": {
+ "displayText": "Kalibracja temperatury\nprzy następnym uruchomieniu",
+ "description": "Kalibracja temperatury przy następnym włączeniu (nie jest wymagana, jeśli różnica temperatur jest mniejsza niż 5°C"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibracja\nnapięcia",
+ "description": "Kalibracja napięcia wejściowego. Krótkie naciśnięcie, aby ustawić, długie naciśnięcie, aby wyjść."
+ },
+ "PowerPulsePower": {
+ "displayText": "Moc\nimpulsu",
+ "description": "W przypadku używania powerbanku, utrzymuj moc na poziomie (W) aby nie uśpić powerbanku"
+ },
+ "PowerPulseWait": {
+ "displayText": "Czas między\nimp. mocy",
+ "description": "Czas między kolejnymi impulsami mocy zapobiegającymi usypianiu powerbanku (x2,5 s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Długość\nimpulsu mocy",
+ "description": "Długość impulsu mocy zapobiegającego usypianiu powerbanku (x250 ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Ustawienia\nfabryczne",
+ "description": "Resetuje wszystkie ustawienia"
+ },
+ "LanguageSwitch": {
+ "displayText": "Język:\n PL Polski",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_PT.json b/Translations/translation_PT.json
index e4cee4be..883a9677 100644
--- a/Translations/translation_PT.json
+++ b/Translations/translation_PT.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "PT",
- "languageLocalName": "Português",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Definições de fábrica?",
- "UVLOWarningString": "DC BAIXO",
- "UndervoltageString": "Subtensão",
- "InputVoltageString": "Tensão ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Repouso...",
- "SleepingTipAdvancedString": "Ponta:",
- "OffString": "Off",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Certain settings",
- "were changed!"
- ],
- "NoAccelerometerMessage": [
- "No accelerometer",
- "detected!"
- ],
- "NoPowerDeliveryMessage": [
- "No USB-PD IC",
- "detected!"
- ],
- "LockingKeysString": "LOCKED",
- "UnlockingKeysString": "UNLOCKED",
- "WarningKeysLockedString": "!LOCKED!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "D",
- "SettingLeftChar": "C",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "S",
- "SettingMediumChar": "M",
- "SettingFastChar": "F",
- "SettingStartNoneChar": "D",
- "SettingStartSolderingChar": "S",
- "SettingStartSleepChar": "H",
- "SettingStartSleepOffChar": "A",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Power",
- "settings"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Configurações",
- "Solda"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Modos",
- "Repouso"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Interface",
- "Utilizador"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Menu",
- "Avançado"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Fonte",
- "alimentação"
- ],
- "desc": "Fonte de alimentação. Define a tensão de corte. (DC=10V) (S=3.3V/célula)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "voltage"
- ],
- "desc": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Potência",
- "Fonte"
- ],
- "desc": "Potência da fonte usada (Watt)"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers (0: disabled)"
- },
- "BoostTemperature": {
- "text2": [
- "Modo turbo",
- "temperat."
- ],
- "desc": "Ajuste de temperatura do \"modo turbo\""
- },
- "AutoStart": {
- "text2": [
- "Partida",
- "automática"
- ],
- "desc": "Aquece a ponta automaticamente ao ligar (D=desligar | S=soldagem | H=hibernar | A=hibernar temp. ambiente)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp change",
- "short"
- ],
- "desc": "Temperature-change-increment on short button press"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp change",
- "long"
- ],
- "desc": "Temperature-change-increment on long button press"
- },
- "LockingMode": {
- "text2": [
- "Allow locking",
- "buttons"
- ],
- "desc": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
- },
- "MotionSensitivity": {
- "text2": [
- "Sensibilidade",
- "movimento"
- ],
- "desc": "Sensibilidade ao movimento (0=Desligado | 1=Menor | ... | 9=Maior)"
- },
- "SleepTemperature": {
- "text2": [
- "Temperat.",
- "repouso"
- ],
- "desc": "Temperatura de repouso (C)"
- },
- "SleepTimeout": {
- "text2": [
- "Tempo",
- "repouso"
- ],
- "desc": "Tempo para repouso (Minutos | Segundos)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Tempo",
- "desligam."
- ],
- "desc": "Tempo para desligamento (Minutos)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall sensor",
- "sensitivity"
- ],
- "desc": "Sensitivity to magnets (0=Desligado | 1=Menor | ... | 9=Maior)"
- },
- "TemperatureUnit": {
- "text2": [
- "Unidade",
- "temperatura"
- ],
- "desc": "Unidade de temperatura (C=Celsius | F=Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "Orientação",
- "tela"
- ],
- "desc": "Orientação da tela (D=estro | C=anhoto | A=utomática)"
- },
- "CooldownBlink": {
- "text2": [
- "Piscar ao",
- "arrefecer"
- ],
- "desc": "Faz o valor da temperatura piscar durante o arrefecimento"
- },
- "ScrollingSpeed": {
- "text2": [
- "Velocidade",
- "texto ajuda"
- ],
- "desc": "Velocidade a que o texto é exibido"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Swap",
- "+ - keys"
- ],
- "desc": "Reverse assignment of buttons for temperature adjustment"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "speed"
- ],
- "desc": "Pace of icon animations in menu (O=off | S=slow | M=medium | F=fast)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loop icon animations in main menu"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Tela repouso",
- "avançada"
- ],
- "desc": "Exibe informações avançadas quando em espera"
- },
- "AdvancedSoldering": {
- "text2": [
- "Tela trabalho",
- "avançada"
- ],
- "desc": "Exibe informações avançadas durante o uso"
- },
- "PowerLimit": {
- "text2": [
- "Power",
- "limit"
- ],
- "desc": "Maximum power the iron can use (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Calibrar",
- "tensão"
- ],
- "desc": "Calibra a tensão de alimentação. Use os botões para ajustar o valor. Mantenha pressionado para sair"
- },
- "PowerPulsePower": {
- "text2": [
- "Power",
- "pulse"
- ],
- "desc": "Intensity of power of keep-awake-pulse (W=watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Power pulse",
- "delay"
- ],
- "desc": "Delay before keep-awake-pulse is triggered (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duration"
- ],
- "desc": "Keep-awake-pulse duration (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Reset de",
- "fábrica?"
- ],
- "desc": "Reverte todos ajustes"
- },
- "LanguageSwitch": {
- "text2": [
- "Idioma:",
- " PT Português"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "PT",
+ "languageLocalName": "Português",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibração\nefetuada!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Algumas configurações\nforam alteradas!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Acelerómetro não\ndetectado!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "USB-PD IC não\ndetectado!"
+ },
+ "LockingKeysString": {
+ "message": "Bloqueado"
+ },
+ "UnlockingKeysString": {
+ "message": "Desbloqueado"
+ },
+ "WarningKeysLockedString": {
+ "message": "!Bloqueado!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Antes de reninciar certifique-se que o ferro est à temperatura ambiente!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrar\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Definições de fábrica?"
+ },
+ "UVLOWarningString": {
+ "message": "DC BAIXO"
+ },
+ "UndervoltageString": {
+ "message": "Subtensão\n"
+ },
+ "InputVoltageString": {
+ "message": "Tensão: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Repouso...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Ponta: \n"
+ },
+ "OffString": {
+ "message": "Off"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Seu dispositivo provavelmente é falsificado!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "D",
+ "SettingLeftChar": "C",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "S",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "F",
+ "SettingStartNoneChar": "D",
+ "SettingStartSolderingChar": "S",
+ "SettingStartSleepChar": "H",
+ "SettingStartSleepOffChar": "A",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Configurações de\nenergia",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Configurações\nSolda",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Modos\nRepouso",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Interface\nUtilizador",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Menu\nAvançado",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Fonte\nalimentação",
+ "description": "Fonte de alimentação. Define a tensão de corte. (DC=10V) (S=3.3V/célula)"
+ },
+ "MinVolCell": {
+ "displayText": "Tensão\nmínima",
+ "description": "Tensão mínima permitida por célula de bateria (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Potência\nFonte",
+ "description": "Potência da fonte usada (Watt)"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD tempo\nlimite",
+ "description": "Tempo limite de negoiciação de PD de 100ms para compatibilidade com alguns carregadores é (0: disabled)"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Activa o modo PPS & EPR"
+ },
+ "BoostTemperature": {
+ "displayText": "Modo turbo\ntemperat.",
+ "description": "Ajuste de temperatura do \"modo turbo\""
+ },
+ "AutoStart": {
+ "displayText": "Aquecimento\nautomático",
+ "description": "Aquece a ponta automaticamente ao ligar (D=desligar | S=soldagem | H=hibernar | A=hibernar temp. ambiente)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp mudança\ncurta",
+ "description": "A temperatura será aumentada com um click curto"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp mudança\nlonga",
+ "description": "A temperatura será aumentada com um click longo"
+ },
+ "LockingMode": {
+ "displayText": "Permitir bloquear\nbutões",
+ "description": "Durante a solda primir os dois butões para alternar entre (D=disativas | B=boost mode | F=bloqueio total)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Sensibilidade\nmovimento",
+ "description": "Sensibilidade ao movimento (0=Desligado | 1=Menor | ... | 9=Maior)"
+ },
+ "SleepTemperature": {
+ "displayText": "Temperatura\nrepouso",
+ "description": "Temperatura de repouso (C)"
+ },
+ "SleepTimeout": {
+ "displayText": "Tempo\nrepouso",
+ "description": "Tempo para repouso (Minutos | Segundos)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Tempo\ndesligar",
+ "description": "Tempo para desligar (Minutos)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Sensibilidade de\nmagentismo",
+ "description": "Sensibilidade de magnetismo (0=Desligado | 1=Menor | ... | 9=Maior)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Unidade\ntemperatura",
+ "description": "Unidade de temperatura (C=Celsius | F=Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "Orientação\necrã",
+ "description": "Orientação do ecrã (D=estro | C=anhoto | A=utomática)"
+ },
+ "CooldownBlink": {
+ "displayText": "Piscar ao\narrefecer",
+ "description": "Faz o valor da temperatura piscar durante o arrefecimento"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Velocidade\ntexto ajuda",
+ "description": "Velocidade a que o texto é mostrado"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Mudar\n+ - teclas",
+ "description": "Inverter o alinhamento dos butões para ajudar a temperatura"
+ },
+ "AnimSpeed": {
+ "displayText": "Velocidade de\nanimação",
+ "description": "Sitio das animações no menu (O=off | S=lentas | M=medias | F=rapidas)"
+ },
+ "AnimLoop": {
+ "displayText": "Repetir\nanimações",
+ "description": "Repetir icon de animações no ecrã principal"
+ },
+ "Brightness": {
+ "displayText": "Screen\nbrightness",
+ "description": "Ajustar o brilho do ecrã OLED"
+ },
+ "ColourInversion": {
+ "displayText": "Inverter\necrã",
+ "description": "Inverter as cores do ecrã OLED"
+ },
+ "LOGOTime": {
+ "displayText": "Duração do\nlogo no arranque",
+ "description": "Definir a duração do logotipo no arranque em (s=segundos)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Ecrã repouso\navançada",
+ "description": "Mostra informações avançadas quando em espera"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Ecrã trabalho\navançado",
+ "description": "Mostra informações avançadas durante o uso"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Limite de\npotência",
+ "description": "Potência máxima a usar (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrar CJC\nno prozimo arranque",
+ "description": "No próximo arranque CJC será calibrada (não será necessário caso o Delta T seja < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Calibrar\ntensão",
+ "description": "Calibra a tensão de alimentação. Use os botões para ajustar o valor. Mantenha pressionado para sair"
+ },
+ "PowerPulsePower": {
+ "displayText": "Potência\ndo pulso",
+ "description": "Intensidade de potência de arranque (W=watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Espera do\npulso",
+ "description": "Espera entre o acordar e o envio da rectivação (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Duração\npulso",
+ "description": "Manter os inplosus de rectivação em (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Reset de\nfábrica?",
+ "description": "Repôe todos os ajustes"
+ },
+ "LanguageSwitch": {
+ "displayText": "Idioma:\n PT Português",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_RO.json b/Translations/translation_RO.json
index 6deb9dda..eff6ac37 100644
--- a/Translations/translation_RO.json
+++ b/Translations/translation_RO.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "RO",
- "languageLocalName": "Română",
- "tempUnitFahrenheit": true,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Sigur doriti să restaurati la setările implicite?",
- "UVLOWarningString": "DC LOW",
- "UndervoltageString": "Sub tensiune",
- "InputVoltageString": "Intrare V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Adormit...",
- "SleepingTipAdvancedString": "Tip:",
- "OffString": "Nu",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Setările au fost",
- "resetate!"
- ],
- "NoAccelerometerMessage": [
- "Nu accelerometru",
- "detectat!"
- ],
- "NoPowerDeliveryMessage": [
- "Fără USB-PD IC",
- "detectat!"
- ],
- "LockingKeysString": "BLOCAT",
- "UnlockingKeysString": "DEBLOCAT",
- "WarningKeysLockedString": "!BLOCAT!",
- "WarningThermalRunaway": [
- "Incalzire",
- "Esuata"
- ]
- },
- "characters": {
- "SettingRightChar": "D",
- "SettingLeftChar": "S",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "Î",
- "SettingMediumChar": "M",
- "SettingFastChar": "R",
- "SettingStartNoneChar": "O",
- "SettingStartSolderingChar": "S",
- "SettingStartSleepChar": "Z",
- "SettingStartSleepOffChar": "R",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Setări de",
- "alimentare"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Setări de",
- "lipire"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Modul",
- "repaus"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Interfată",
- "utilizator"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Optiuni",
- "avansate"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Sursa de",
- "alimentare"
- ],
- "desc": "Sursa de alimentare. Setează tensiunea de întrerupere. (DC 10V) (S 3.3V per celulă, dezactivati limita de alimentare)"
- },
- "MinVolCell": {
- "text2": [
- "Voltaj",
- "minim"
- ],
- "desc": "Tensiunea minimă admisă pe celulă (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC",
- "voltaj"
- ],
- "desc": "Tensiunea maximă QC dorită pentru care negociază letconul"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "Timp limita de negociere pentru tranzactia PD, in pasi de 100ms, pentru compatibilitate cu alimentatoarele QC"
- },
- "BoostTemperature": {
- "text2": [
- "Boost",
- "temp"
- ],
- "desc": "Temperatura utilizată în \"modul boost\""
- },
- "AutoStart": {
- "text2": [
- "Auto",
- "start"
- ],
- "desc": "Start letcon în modul de lipire la pornire (O=oprit | S=lipire | Z=repaus | R=repaus la temperatura camerei)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Schimbare temp.",
- "apăsare scută"
- ],
- "desc": "Schimbarea temperaturii la apăsarea scurtă a butonului"
- },
- "TempChangeLongStep": {
- "text2": [
- "Schimbare temp.",
- "apăsare lungă"
- ],
- "desc": "Schimbarea temperaturii la apăsarea lungă a butonului"
- },
- "LockingMode": {
- "text2": [
- "Blocare",
- "butoane"
- ],
- "desc": "Când lipiti, apăsati lung ambele butoane, pentru a le bloca (D=dezactivare | B=numai \"modul boost\" | F=blocare completă)"
- },
- "MotionSensitivity": {
- "text2": [
- "Sensibilitate",
- "la miscare"
- ],
- "desc": "Sensibilitate senzor miscare (0=oprit | 1=putin sensibil | ... | 9=cel mai sensibil)"
- },
- "SleepTemperature": {
- "text2": [
- "Temp",
- "repaus"
- ],
- "desc": "Temperatura vârfului în \"modul repaus\""
- },
- "SleepTimeout": {
- "text2": [
- "Expirare",
- "repaus"
- ],
- "desc": "Interval înainte de lansarea \"modului de repaus\" în (s=secunde | m=minute)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Expirare",
- "oprire"
- ],
- "desc": "Interval înainte ca letconul să se oprească (m=minute)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Sensibilitate",
- "senzor Hall"
- ],
- "desc": "Sensibilitate senzor cu efect Hall pentru a detecta repausul (0=oprit | 1=putin sensibil | ... | 9=cel mai sensibil)"
- },
- "TemperatureUnit": {
- "text2": [
- "Unitate de",
- "temperatură"
- ],
- "desc": "C=Celsius | F=Fahrenheit"
- },
- "DisplayRotation": {
- "text2": [
- "Orientare",
- "ecran"
- ],
- "desc": "R=dreptaci | L=stângaci | A=auto"
- },
- "CooldownBlink": {
- "text2": [
- "Clipeste",
- "la răcire"
- ],
- "desc": "Clipeste temperatura după oprirea încălzirii, în timp ce vârful este încă fierbinte"
- },
- "ScrollingSpeed": {
- "text2": [
- "Viteză",
- "derulare"
- ],
- "desc": "Viteză derulare text cu informatii la (S=lent | F=rapid)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Inversare",
- "+ - butoane"
- ],
- "desc": "Inversarea butoanelor de reglare a temperaturii"
- },
- "AnimSpeed": {
- "text2": [
- "Animatii",
- "viteză"
- ],
- "desc": "Ritmul animatiilor pictogramei din meniu (O=oprit | Î=încet | M=mediu | R=rapid)"
- },
- "AnimLoop": {
- "text2": [
- "Animatii",
- "buclă"
- ],
- "desc": "Animatii de pictograme în meniul principal"
- },
- "Brightness": {
- "text2": [
- "Ecranului",
- "luminozitatea"
- ],
- "desc": "Ajusteaza luminozitatea ecranului"
- },
- "ColourInversion": {
- "text2": [
- "Inverseaza",
- "culoarea"
- ],
- "desc": "Inverseaza culoarea ecranului"
- },
- "LOGOTime": {
- "text2": [
- "Durată",
- "logo încărcare"
- ],
- "desc": "Setati durata logo de pornire (s=secunde)"
- },
- "AdvancedIdle": {
- "text2": [
- "Detalii,",
- "ecran inactiv"
- ],
- "desc": "Afisati informatii detaliate într-un font mai mic pe ecranul de repaus"
- },
- "AdvancedSoldering": {
- "text2": [
- "Detalii",
- "ecran lipire"
- ],
- "desc": "Afisati informatii detaliate într-un font mai mic pe ecranul de lipire"
- },
- "PowerLimit": {
- "text2": [
- "Putere",
- "limită"
- ],
- "desc": "Puterea maximă pe care letconul o poate folosi (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrare CJC",
- "la următoarea pornire"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Calibrare tens.",
- "de intrare?"
- ],
- "desc": "Porniti calibrarea VIN (apăsati lung pentru a iesi)"
- },
- "PowerPulsePower": {
- "text2": [
- "Putere",
- "puls"
- ],
- "desc": "Puterea pulsului de mentinere activa a blocului de alimentare (watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Întârziere",
- "puls putere"
- ],
- "desc": "Perioada pulsului de mentinere (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Durată",
- "puls putere"
- ],
- "desc": "Durata pulsului de mentinere (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Setări",
- "din fabrică"
- ],
- "desc": "Reveniti la setările din fabrică"
- },
- "LanguageSwitch": {
- "text2": [
- "Limbă:",
- " RO Română"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "RO",
+ "languageLocalName": "Română",
+ "tempUnitFahrenheit": true,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Setările au fost\nresetate!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Fără accelerometru\ndetectat!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Fără USB-PD IC\ndetectat!"
+ },
+ "LockingKeysString": {
+ "message": "BLOCAT"
+ },
+ "UnlockingKeysString": {
+ "message": "DEBLOCAT"
+ },
+ "WarningKeysLockedString": {
+ "message": "!BLOCAT!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Încălzire\nEşuată"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Înainte de repornire, asiguraţi-vă că vârful şi mânerul sunt la temperatura camerei!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrare\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Sigur doriţi să restauraţi la setările implicite?"
+ },
+ "UVLOWarningString": {
+ "message": "DC SCĂZUT"
+ },
+ "UndervoltageString": {
+ "message": "Voltaj scăzut\n"
+ },
+ "InputVoltageString": {
+ "message": "Intrare V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Adormit...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Tip: \n"
+ },
+ "OffString": {
+ "message": "Nu"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Dispozitivul dvs. este cel mai probabil un fals!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "D",
+ "SettingLeftChar": "S",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "Î",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "R",
+ "SettingStartNoneChar": "O",
+ "SettingStartSolderingChar": "S",
+ "SettingStartSleepChar": "Z",
+ "SettingStartSleepOffChar": "R",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Setări de\nalimentare",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Setări de\nlipire",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Modul\nrepaus",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Interfaţă\nutilizator",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Opţiuni\navansate",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Sursa de\nalimentare",
+ "description": "Sursa de alimentare. Setează tensiunea de întrerupere. (DC 10V) (S 3.3V per celulă, dezactivaţi limita de alimentare)"
+ },
+ "MinVolCell": {
+ "displayText": "Voltaj\nminim",
+ "description": "Tensiunea minimă admisă pe celulă (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC\nvoltaj",
+ "description": "Tensiunea maximă QC dorită pentru care negociază letconul"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "Timp limită de negociere pentru tranzacţia PD, în paşi de 100ms, pentru compatibilitate cu alimentatoarele QC"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Modifică\ntemp. impuls",
+ "description": "Temperatura utilizată în \"modul de impuls\""
+ },
+ "AutoStart": {
+ "displayText": "Auto\nstart",
+ "description": "Start letcon în modul de lipire la pornire (O=oprit | S=lipire | Z=repaus | R=repaus la temperatura camerei)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Schimbare temp.\napăsare scută",
+ "description": "Schimbarea temperaturii la apăsarea scurtă a butonului"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Schimbare temp.\napăsare lungă",
+ "description": "Schimbarea temperaturii la apăsarea lungă a butonului"
+ },
+ "LockingMode": {
+ "displayText": "Blocare\nbutoane",
+ "description": "Când lipiţi, apăsaţi lung ambele butoane, pentru a le bloca (D=dezactivare | B=numai \"modul boost\" | F=blocare completă)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Sensibilitate\nla miscare",
+ "description": "Sensibilitate senzor miscare (0=oprit | 1=puţin sensibil | ... | 9=cel mai sensibil)"
+ },
+ "SleepTemperature": {
+ "displayText": "Temp\nrepaus",
+ "description": "Temperatura vârfului în \"modul repaus\""
+ },
+ "SleepTimeout": {
+ "displayText": "Expirare\nrepaus",
+ "description": "Interval înainte de lansarea \"modului de repaus\" în (s=secunde | m=minute)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Expirare\noprire",
+ "description": "Interval înainte ca letconul să se oprească (m=minute)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Sensibilitate\nsenzor Hall",
+ "description": "Sensibilitate senzor cu efect Hall pentru a detecta repausul (0=oprit | 1=putin sensibil | ... | 9=cel mai sensibil)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Unitate de\ntemperatură",
+ "description": "C=Celsius | F=Fahrenheit"
+ },
+ "DisplayRotation": {
+ "displayText": "Orientare\necran",
+ "description": "R=dreptaci | L=stângaci | A=auto"
+ },
+ "CooldownBlink": {
+ "displayText": "Clipeşte\nla răcire",
+ "description": "Clipeşte temperatura după oprirea încălzirii, în timp ce vârful este încă fierbinte"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Viteză\nderulare",
+ "description": "Viteză derulare text cu informatii la (S=lent | F=rapid)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Inversare\n+ - butoane",
+ "description": "Inversarea butoanelor de reglare a temperaturii"
+ },
+ "AnimSpeed": {
+ "displayText": "Animaţii\nviteză",
+ "description": "Ritmul animaţiilor pictogramei din meniu (O=oprit | Î=încet | M=mediu | R=rapid)"
+ },
+ "AnimLoop": {
+ "displayText": "Animaţii\nbuclă",
+ "description": "Animaţii de pictograme în meniul principal"
+ },
+ "Brightness": {
+ "displayText": "Ecranului\nluminozitatea",
+ "description": "Ajusteaza luminozitatea ecranului"
+ },
+ "ColourInversion": {
+ "displayText": "Inversează\nculoarea",
+ "description": "Inversează culoarea ecranului"
+ },
+ "LOGOTime": {
+ "displayText": "Durată\nlogo încărcare",
+ "description": "Setaţi durată logo de pornire (s=secunde)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Detalii,\necran inactiv",
+ "description": "Afisaţi informaţii detaliate într-un font mai mic pe ecranul de repaus"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Detalii\necran lipire",
+ "description": "Afisaţi informaţii detaliate într-un font mai mic pe ecranul de lipire"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Activează BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Putere\nlimită",
+ "description": "Puterea maximă pe care letconul o poate folosi (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrare CJC\nla următoarea pornire",
+ "description": "La următorul vârf de pornire, compensarea joncţiunii reci va fi calibrată (nu este necesară dacă Delta T este < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Calibrare tens.\nde intrare?",
+ "description": "Porniţi calibrarea VIN (apăsaţi lung pentru a ieşi)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Putere\npuls",
+ "description": "Puterea pulsului de menţinere activă a blocului de alimentare (watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Întârziere\npuls putere",
+ "description": "Perioada pulsului de mentinere (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Durată\npuls putere",
+ "description": "Durata pulsului de menţinere (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Setări\ndin fabrică",
+ "description": "Reveniţi la setările din fabrică"
+ },
+ "LanguageSwitch": {
+ "displayText": "Limbă:\n RO Română",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_RU.json b/Translations/translation_RU.json
index a6dfab42..fe52dc9a 100644
--- a/Translations/translation_RU.json
+++ b/Translations/translation_RU.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "RU",
- "languageLocalName": "Русский",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Пожалуйста, убедитесь, что жало и корпус имеют комнатную температуру при следующей загрузке!",
- "CJCCalibrating": "калибровка",
- "SettingsResetWarning": "Вы уверены, что хотите сбросить настройки к значениям по умолчанию?",
- "UVLOWarningString": "НАПРЯЖ--",
- "UndervoltageString": "Низ. напряжение",
- "InputVoltageString": "Питание В: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Ожидание...",
- "SleepingTipAdvancedString": "Жало:",
- "OffString": "Вык",
- "DeviceFailedValidationWarning": "Скорее всего, это устройство подделка!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Сброс OK",
- "SettingsResetMessage": [
- "Настройки",
- "сброшены!"
- ],
- "NoAccelerometerMessage": [
- "Не определен",
- "акселерометр!"
- ],
- "NoPowerDeliveryMessage": [
- "USB-PD питание",
- "не обнаружено"
- ],
- "LockingKeysString": "ЗАБЛОК",
- "UnlockingKeysString": "РАЗБЛОК",
- "WarningKeysLockedString": "!ЗАБЛОК!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "П",
- "SettingLeftChar": "Л",
- "SettingAutoChar": "А",
- "SettingOffChar": "О",
- "SettingSlowChar": "М",
- "SettingMediumChar": "С",
- "SettingFastChar": "Б",
- "SettingStartNoneChar": "В",
- "SettingStartSolderingChar": "П",
- "SettingStartSleepChar": "О",
- "SettingStartSleepOffChar": "К",
- "SettingSensitivityOff": "О",
- "SettingSensitivityLow": "Н",
- "SettingSensitivityMedium": "С",
- "SettingSensitivityHigh": "В",
- "SettingLockDisableChar": "О",
- "SettingLockBoostChar": "Т",
- "SettingLockFullChar": "П"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Параметры",
- "питания"
- ],
- "desc": "Настройки питания (от аккумуляторов, QC, PD и т.п."
- },
- "SolderingMenu": {
- "text2": [
- "Параметры",
- "пайки"
- ],
- "desc": "Найстроки режимов и паяния, турбо-режима"
- },
- "PowerSavingMenu": {
- "text2": [
- "Режимы",
- "сна"
- ],
- "desc": "Режимы сна для экономии питания"
- },
- "UIMenu": {
- "text2": [
- "Параметры",
- "интерфейса"
- ],
- "desc": "Настройки интерфейса"
- },
- "AdvancedMenu": {
- "text2": [
- "Дополнител.",
- "настройки"
- ],
- "desc": "Дополнительные настройки"
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Источник",
- "питания"
- ],
- "desc": "Источник питания. Устанавливает напряжение отсечки. (DC 10В) (S 3,3В на ячейку, без лимита мощности)"
- },
- "MinVolCell": {
- "text2": [
- "Мин.",
- "напр."
- ],
- "desc": "Минимальное разрешенное напряжение на ячейку (3S: 3 - 3,7V | 4S-6S: 2,4 - 3,7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Ограничение",
- "напряжения QC"
- ],
- "desc": "Максимальное напряжение для согласования с QC источником питания"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "тайм-аут"
- ],
- "desc": "Power Delivery тайм-аут согласования с шагом 100 мс для совместимости с некоторыми быстрыми зарядными QC (0: отключено)"
- },
- "BoostTemperature": {
- "text2": [
- "t° турбо",
- "режима"
- ],
- "desc": "Температура жала в турбо-режиме"
- },
- "AutoStart": {
- "text2": [
- "Авто",
- "старт"
- ],
- "desc": "Режим, в котором запускается паяльник при подаче питания (В=Выкл. | П=Пайка | О=Ожидание | К=Ожидание при комн. темп.)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Шаг темп.",
- "кор. наж."
- ],
- "desc": "Шаг изменения температуры при коротком нажатии кнопок"
- },
- "TempChangeLongStep": {
- "text2": [
- "Шаг темп.",
- "длин. наж."
- ],
- "desc": "Шаг изменения температуры при длинном нажатии кнопок"
- },
- "LockingMode": {
- "text2": [
- "Разрешить",
- "блок. кнопок"
- ],
- "desc": "При работе длинное нажатие обеих кнопок блокирует их (О=Отключено | Т=Только турбо | П=Полная блокировка)"
- },
- "MotionSensitivity": {
- "text2": [
- "Чувствительн.",
- "акселерометра"
- ],
- "desc": "Чувствительность акселерометра (0=Выкл. | 1=мин. | ... | 9=макс.)"
- },
- "SleepTemperature": {
- "text2": [
- "Темп.",
- "ожидания"
- ],
- "desc": "Температура жала в режиме ожидания"
- },
- "SleepTimeout": {
- "text2": [
- "Таймаут",
- "ожидания"
- ],
- "desc": "Время до перехода в режим ожидания (Минуты | Секунды)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Таймаут",
- "выключения"
- ],
- "desc": "Время до выключения паяльника (минуты)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Датчик",
- "Холла"
- ],
- "desc": "Чувствительность датчика Холла к переходу в спящий режим (0=Выкл. | 1=мин. | ... | 9=макс.)"
- },
- "TemperatureUnit": {
- "text2": [
- "Единицы",
- "температуры"
- ],
- "desc": "Единицы измерения температуры (C=°Цельcия | F=°Фаренгейта)"
- },
- "DisplayRotation": {
- "text2": [
- "Ориентация",
- "экрана"
- ],
- "desc": "Ориентация экрана (П=Правая рука | Л=Левая рука | А=Авто)"
- },
- "CooldownBlink": {
- "text2": [
- "Мигание t°",
- "при остывании"
- ],
- "desc": "Мигать температурой на экране охлаждения, пока жало еще горячее"
- },
- "ScrollingSpeed": {
- "text2": [
- "Скорость",
- "текста"
- ],
- "desc": "Скорость прокрутки текста (М=медленно | Б=быстро)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Поменять",
- "кнопки+-"
- ],
- "desc": "Поменять кнопки изменения температуры"
- },
- "AnimSpeed": {
- "text2": [
- "Скорость",
- "анимации"
- ],
- "desc": "Скорость анимации иконок в главном меню (Милисекунды) (О=Отключено | Н=Низкий | С=Средний | В=Высокий)"
- },
- "AnimLoop": {
- "text2": [
- "Зацикленная",
- "анимация"
- ],
- "desc": "Зацикленная анимация иконок в главном меню"
- },
- "Brightness": {
- "text2": [
- "Яркость",
- "экрана"
- ],
- "desc": "Настройки контраста/яркости OLED экрана"
- },
- "ColourInversion": {
- "text2": [
- "Инверсия",
- "экрана"
- ],
- "desc": "Инвертировать цвета на OLED экране"
- },
- "LOGOTime": {
- "text2": [
- "Длительность",
- "показа логотипа"
- ],
- "desc": "Длительность отображения логотипа (в секундах)"
- },
- "AdvancedIdle": {
- "text2": [
- "Подробный",
- "реж. ожидания"
- ],
- "desc": "Отображать детальную информацию уменьшенным шрифтом на экране ожидания"
- },
- "AdvancedSoldering": {
- "text2": [
- "Подробный",
- "экран пайки"
- ],
- "desc": "Показывать детальную информацию на экране пайки"
- },
- "PowerLimit": {
- "text2": [
- "Предел",
- "мощности"
- ],
- "desc": "Максимальная мощность, которую может использовать паяльник (Ватт)"
- },
- "CalibrateCJC": {
- "text2": [
- "Калибровка",
- "температуры"
- ],
- "desc": "Калибровка температуры (CJC) при следующем включении (не требуется при разнице менее 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Калибровка",
- "напряжения"
- ],
- "desc": "Калибровка входного напряжения (долгое нажатие для выхода)"
- },
- "PowerPulsePower": {
- "text2": [
- "Сила имп.",
- "питания Вт"
- ],
- "desc": "Сила импульса удерживающего от сна повербанк или другой источник питания"
- },
- "PowerPulseWait": {
- "text2": [
- "Пауза имп.",
- "питания с"
- ],
- "desc": "Пауза между импульсами удерживающими источник питания от сна (x 2,5с)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Длина имп.",
- "питания мс"
- ],
- "desc": "Длина импульса удерживающего от сна источник питания (x 250мс)"
- },
- "SettingsReset": {
- "text2": [
- "Сброс",
- "Настроек"
- ],
- "desc": "Сброс настроек к значеням по умолчанию"
- },
- "LanguageSwitch": {
- "text2": [
- "Язык:",
- " RU Русский"
- ],
- "desc": "Выбор языка"
- }
- }
-}
+{
+ "languageCode": "RU",
+ "languageLocalName": "Русский",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Калибровка\nзавершена!"
+ },
+ "ResetOKMessage": {
+ "message": "Сброс OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Настройки\nсброшены!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Не определен\nакселерометр!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "USB-PD питание\nне обнаружено"
+ },
+ "LockingKeysString": {
+ "message": "ЗАБЛОК"
+ },
+ "UnlockingKeysString": {
+ "message": "РАЗБЛОК"
+ },
+ "WarningKeysLockedString": {
+ "message": "!ЗАБЛОК!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Неуправляемый\nРазогрев"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Пожалуйста, убедитесь, что жало и корпус имеют комнатную температуру при следующей загрузке!"
+ },
+ "CJCCalibrating": {
+ "message": "калибровка\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Вы уверены, что хотите сбросить настройки к значениям по умолчанию?"
+ },
+ "UVLOWarningString": {
+ "message": "НАПРЯЖ--"
+ },
+ "UndervoltageString": {
+ "message": "Низ. напряжение\n"
+ },
+ "InputVoltageString": {
+ "message": "Питание В: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Ожидание...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Жало: \n"
+ },
+ "OffString": {
+ "message": "Вык"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Скорее всего, это устройство подделка!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "П",
+ "SettingLeftChar": "Л",
+ "SettingAutoChar": "А",
+ "SettingOffChar": "О",
+ "SettingSlowChar": "М",
+ "SettingMediumChar": "С",
+ "SettingFastChar": "Б",
+ "SettingStartNoneChar": "В",
+ "SettingStartSolderingChar": "П",
+ "SettingStartSleepChar": "О",
+ "SettingStartSleepOffChar": "К",
+ "SettingLockDisableChar": "О",
+ "SettingLockBoostChar": "Т",
+ "SettingLockFullChar": "П"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Параметры\nпитания",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Параметры\nпайки",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Режимы\nсна",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Параметры\nинтерфейса",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Дополнител.\nнастройки",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Источник\nпитания",
+ "description": "Источник питания. Устанавливает напряжение отсечки. (DC 10В) (S 3,3В на ячейку, без лимита мощности)"
+ },
+ "MinVolCell": {
+ "displayText": "Мин.\nнапр.",
+ "description": "Минимальное разрешенное напряжение на ячейку (3S: 3 - 3,7V | 4S-6S: 2,4 - 3,7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Ограничение\nнапряжения QC",
+ "description": "Максимальное напряжение для согласования с QC источником питания"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\nтайм-аут",
+ "description": "Power Delivery тайм-аут согласования с шагом 100 мс для совместимости с некоторыми быстрыми зарядными QC (0: отключено)"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Включает режимы PPS & EPR."
+ },
+ "BoostTemperature": {
+ "displayText": "t° турбо\nрежима",
+ "description": "Температура жала в турбо-режиме"
+ },
+ "AutoStart": {
+ "displayText": "Авто\nстарт",
+ "description": "Режим, в котором запускается паяльник при подаче питания (В=Выкл. | П=Пайка | О=Ожидание | К=Ожидание при комн. темп.)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Шаг темп.\nкор. наж.",
+ "description": "Шаг изменения температуры при коротком нажатии кнопок"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Шаг темп.\nдлин. наж.",
+ "description": "Шаг изменения температуры при длинном нажатии кнопок"
+ },
+ "LockingMode": {
+ "displayText": "Разрешить\nблок. кнопок",
+ "description": "При работе длинное нажатие обеих кнопок блокирует их (О=Отключено | Т=Только турбо | П=Полная блокировка)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Чувствительн.\nакселерометра",
+ "description": "Чувствительность акселерометра (0=Выкл. | 1=мин. | ... | 9=макс.)"
+ },
+ "SleepTemperature": {
+ "displayText": "Темп.\nожидания",
+ "description": "Температура жала в режиме ожидания"
+ },
+ "SleepTimeout": {
+ "displayText": "Таймаут\nожидания",
+ "description": "Время до перехода в режим ожидания (Минуты | Секунды)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Таймаут\nвыключения",
+ "description": "Время до выключения паяльника (минуты)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Датчик\nХолла",
+ "description": "Чувствительность датчика Холла к переходу в спящий режим (0=Выкл. | 1=мин. | ... | 9=макс.)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Единицы\nтемпературы",
+ "description": "Единицы измерения температуры (C=°Цельcия | F=°Фаренгейта)"
+ },
+ "DisplayRotation": {
+ "displayText": "Ориентация\nэкрана",
+ "description": "Ориентация экрана (П=Правая рука | Л=Левая рука | А=Авто)"
+ },
+ "CooldownBlink": {
+ "displayText": "Мигание t°\nпри остывании",
+ "description": "Мигать температурой на экране охлаждения, пока жало еще горячее"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Скорость\nтекста",
+ "description": "Скорость прокрутки текста (М=медленно | Б=быстро)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Поменять\nкнопки+-",
+ "description": "Поменять кнопки изменения температуры"
+ },
+ "AnimSpeed": {
+ "displayText": "Скорость\nанимации",
+ "description": "Скорость анимации иконок в главном меню (Милисекунды) (О=Отключено | Н=Низкий | С=Средний | В=Высокий)"
+ },
+ "AnimLoop": {
+ "displayText": "Зацикленная\nанимация",
+ "description": "Зацикленная анимация иконок в главном меню"
+ },
+ "Brightness": {
+ "displayText": "Яркость\nэкрана",
+ "description": "Настройки контраста/яркости OLED экрана"
+ },
+ "ColourInversion": {
+ "displayText": "Инверсия\nэкрана",
+ "description": "Инвертировать цвета на OLED экране"
+ },
+ "LOGOTime": {
+ "displayText": "Длительность\nпоказа логотипа",
+ "description": "Длительность отображения логотипа (в секундах)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Подробный\nреж. ожидания",
+ "description": "Отображать детальную информацию уменьшенным шрифтом на экране ожидания"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Подробный\nэкран пайки",
+ "description": "Показывать детальную информацию на экране пайки"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Предел\nмощности",
+ "description": "Максимальная мощность, которую может использовать паяльник (Ватт)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Калибровка\nтемпературы",
+ "description": "Калибровка температуры (CJC) при следующем включении (не требуется при разнице менее 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Калибровка\nнапряжения",
+ "description": "Калибровка входного напряжения (долгое нажатие для выхода)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Сила имп.\nпитания Вт",
+ "description": "Сила импульса удерживающего от сна повербанк или другой источник питания"
+ },
+ "PowerPulseWait": {
+ "displayText": "Пауза имп.\nпитания с",
+ "description": "Пауза между импульсами удерживающими источник питания от сна (x 2,5с)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Длина имп.\nпитания мс",
+ "description": "Длина импульса удерживающего от сна источник питания (x 250мс)"
+ },
+ "SettingsReset": {
+ "displayText": "Сброс\nНастроек",
+ "description": "Сброс настроек к значеням по умолчанию"
+ },
+ "LanguageSwitch": {
+ "displayText": "Язык:\n RU Русский",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_SK.json b/Translations/translation_SK.json
index ad6bfd7d..1642a2fc 100644
--- a/Translations/translation_SK.json
+++ b/Translations/translation_SK.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "SK",
- "languageLocalName": "Slovenčina",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Naozaj chcete obnoviť továrenské nastavenia?",
- "UVLOWarningString": "Nízke U!",
- "UndervoltageString": "Nízke napätie",
- "InputVoltageString": "Vstupné U: ",
- "SleepingSimpleString": "Chrr",
- "SleepingAdvancedString": "Pokojový režim.",
- "SleepingTipAdvancedString": "Hrot:",
- "OffString": "Vyp",
- "DeviceFailedValidationWarning": "Vaše zariadenie je pravdepodobne falzifikát!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Nastavenia",
- "resetované"
- ],
- "NoAccelerometerMessage": [
- "Bez pohybového",
- "senzora!"
- ],
- "NoPowerDeliveryMessage": [
- "Chýba čip",
- "USB-PD!"
- ],
- "LockingKeysString": "ZABLOK.",
- "UnlockingKeysString": "ODBLOK.",
- "WarningKeysLockedString": "!ZABLOK!",
- "WarningThermalRunaway": [
- "Únik",
- "Tepla"
- ]
- },
- "characters": {
- "SettingRightChar": "P",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "Z",
- "SettingSlowChar": "P",
- "SettingMediumChar": "S",
- "SettingFastChar": "R",
- "SettingStartNoneChar": "V",
- "SettingStartSolderingChar": "Z",
- "SettingStartSleepChar": "S",
- "SettingStartSleepOffChar": "I",
- "SettingSensitivityOff": "Z",
- "SettingSensitivityLow": "N",
- "SettingSensitivityMedium": "S",
- "SettingSensitivityHigh": "V",
- "SettingLockDisableChar": "Z",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "P"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Nastavenie",
- "výkonu"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Nastavenie",
- "spájkovania"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Úsporný",
- "režim"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Nastavenie",
- "zobrazenia"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Pokročilé",
- "nastavenia"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Zdroj",
- "napätia"
- ],
- "desc": "Zdroj napätia. Nastavenie napätia pre vypnutie (cutoff) (DC=10V | nS=n*3.3V pre LiIon články)"
- },
- "MinVolCell": {
- "text2": [
- "Minimálne",
- "napätie"
- ],
- "desc": "Minimálne napätie povolené na jeden článok (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Obmedzenie QC",
- "napätia"
- ],
- "desc": "Maximálne QC napätie ktoré si má systém vyžiadať"
- },
- "PDNegTimeout": {
- "text2": [
- "Čas vypršania",
- "Power Delivery"
- ],
- "desc": "Čas vyjednávania Power Delivery v 100ms krokoch pre kompatibilitu s niektorými QC nabíjačkami (0: vypnuté)"
- },
- "BoostTemperature": {
- "text2": [
- "Boost",
- "teplota"
- ],
- "desc": "Cieľová teplota pre prudký náhrev (v nastavených jednotkách)"
- },
- "AutoStart": {
- "text2": [
- "Automatické",
- "spustenie"
- ],
- "desc": "Pri štarte spustiť režim spájkovania (V=Vyp | Z=Spájkovanie | S=Spanok | I=Spanok izbová teplota)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Malý krok",
- "teploty"
- ],
- "desc": "Zmena teploty pri krátkom stlačení tlačidla"
- },
- "TempChangeLongStep": {
- "text2": [
- "Veľký krok",
- "teploty"
- ],
- "desc": "Zmena teploty pri držaní tlačidla"
- },
- "LockingMode": {
- "text2": [
- "Povoliť zámok",
- "tlačidiel"
- ],
- "desc": "Zamknutie tlačidiel - dlhé stlačenie oboch naraz počas spájkovania (Z=Zakázať | B=Okrem boost | P=Plné zamknutie)"
- },
- "MotionSensitivity": {
- "text2": [
- "Citlivosť",
- "pohybu"
- ],
- "desc": "Citlivosť detekcie pohybu (0=Vyp | 1=Min | ... | 9=Max)"
- },
- "SleepTemperature": {
- "text2": [
- "Pokojová",
- "teplota"
- ],
- "desc": "Pokojová teplota (v nastavených jednotkách)"
- },
- "SleepTimeout": {
- "text2": [
- "Pokojový",
- "režim po"
- ],
- "desc": "Pokojový režim po (s=sekundách | m=minútach)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Vypnutie",
- "po"
- ],
- "desc": "Čas na vypnutie (minúty)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Citliv.",
- "Hall"
- ],
- "desc": "Citlivosť Hallovho senzora pre detekciu spánku (0=Vyp | 1=Min | ... | 9=Max)"
- },
- "TemperatureUnit": {
- "text2": [
- "Jednotka",
- "teploty"
- ],
- "desc": "Jednotky merania teploty (C=stupne Celzia | F=stupne Fahrenheita)"
- },
- "DisplayRotation": {
- "text2": [
- "Orientácia",
- "displeja"
- ],
- "desc": "Orientácia displeja (P=Pravák | L=Ľavák | A=Auto)"
- },
- "CooldownBlink": {
- "text2": [
- "Blikanie pri",
- "chladnutí"
- ],
- "desc": "Blikanie ukazovateľa teploty počas chladnutia hrotu"
- },
- "ScrollingSpeed": {
- "text2": [
- "Rýchlosť",
- "skrolovania"
- ],
- "desc": "Rýchlosť pohybu tohto textu"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Otočenie",
- "tlačidiel +/-"
- ],
- "desc": "Prehodenie tlačidiel na nastavovanie teploty"
- },
- "AnimSpeed": {
- "text2": [
- "Rýchlosť",
- "animácií"
- ],
- "desc": "Rýchlosť animácií ikoniek v menu (O=off | P=pomaly | S=stredne | R=rýchlo)"
- },
- "AnimLoop": {
- "text2": [
- "Opakovanie",
- "animácií"
- ],
- "desc": "Opakovanie animácií ikoniek v hlavnom menu"
- },
- "Brightness": {
- "text2": [
- "Jas",
- "obrazovky"
- ],
- "desc": "Mení jas/kontrast OLED displeja"
- },
- "ColourInversion": {
- "text2": [
- "Invertovať",
- "obrazovku"
- ],
- "desc": "Invertovať farby OLED displeja"
- },
- "LOGOTime": {
- "text2": [
- "Trvanie",
- "boot loga"
- ],
- "desc": "Doba trvania boot loga (s=sekundy)"
- },
- "AdvancedIdle": {
- "text2": [
- "Detaily v",
- "pokoj. režime"
- ],
- "desc": "Zobraziť detailné informácie v pokojovom režime (T=Zap | F=Vyp)"
- },
- "AdvancedSoldering": {
- "text2": [
- "Detaily počas",
- "spájkovania"
- ],
- "desc": "Zobrazenie detailov počas spájkovania"
- },
- "PowerLimit": {
- "text2": [
- "Obmedzenie",
- "výkonu"
- ],
- "desc": "Obmedzenie výkonu podľa použitého zdroja (watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibrácia",
- "nap. napätia"
- ],
- "desc": "Kalibrácia napájacieho napätia. Krátke stlačenie mení nastavenie, dlhé stlačenie pre návrat"
- },
- "PowerPulsePower": {
- "text2": [
- "Intenzita",
- "impulzu"
- ],
- "desc": "Impulz udržujúci napájací zdroj zapnutý (power banky) (watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Interval",
- "impulzu"
- ],
- "desc": "Interval medzi impulzami udržujúcimi napájací zdroj zapnutý (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Dĺžka impulzu",
- ""
- ],
- "desc": "Dĺžka impulzu udržujúci napájací zdroj zapnutý (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Obnovenie",
- "nastavení"
- ],
- "desc": "Obnovenie nastavení na pôvodné hodnoty"
- },
- "LanguageSwitch": {
- "text2": [
- "Jazyk:",
- " SK Slovenčina"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "SK",
+ "languageLocalName": "Slovenčina",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Nastavenia\nresetované"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Bez pohybového\nsenzora!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Chýba čip\nUSB-PD!"
+ },
+ "LockingKeysString": {
+ "message": "ZABLOK."
+ },
+ "UnlockingKeysString": {
+ "message": "ODBLOK."
+ },
+ "WarningKeysLockedString": {
+ "message": "!ZABLOK!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Únik\nTepla"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Naozaj chcete obnoviť továrenské nastavenia?"
+ },
+ "UVLOWarningString": {
+ "message": "Nízke U!"
+ },
+ "UndervoltageString": {
+ "message": "Nízke napätie\n"
+ },
+ "InputVoltageString": {
+ "message": "Vstupné U: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Chrr"
+ },
+ "SleepingAdvancedString": {
+ "message": "Pokojový režim.\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Hrot: \n"
+ },
+ "OffString": {
+ "message": "Vyp"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Vaše zariadenie je pravdepodobne falzifikát!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "P",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "Z",
+ "SettingSlowChar": "P",
+ "SettingMediumChar": "S",
+ "SettingFastChar": "R",
+ "SettingStartNoneChar": "V",
+ "SettingStartSolderingChar": "Z",
+ "SettingStartSleepChar": "S",
+ "SettingStartSleepOffChar": "I",
+ "SettingLockDisableChar": "Z",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "P"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Nastavenie\nvýkonu",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Nastavenie\nspájkovania",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Úsporný\nrežim",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Nastavenie\nzobrazenia",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Pokročilé\nnastavenia",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Zdroj\nnapätia",
+ "description": "Zdroj napätia. Nastavenie napätia pre vypnutie (cutoff) (DC=10V | nS=n*3.3V pre LiIon články)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimálne\nnapätie",
+ "description": "Minimálne napätie povolené na jeden článok (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Obmedzenie QC\nnapätia",
+ "description": "Maximálne QC napätie ktoré si má systém vyžiadať"
+ },
+ "PDNegTimeout": {
+ "displayText": "Čas vypršania\nPower Delivery",
+ "description": "Čas vyjednávania Power Delivery v 100ms krokoch pre kompatibilitu s niektorými QC nabíjačkami (0: vypnuté)"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Boost\nteplota",
+ "description": "Cieľová teplota pre prudký náhrev (v nastavených jednotkách)"
+ },
+ "AutoStart": {
+ "displayText": "Automatické\nspustenie",
+ "description": "Pri štarte spustiť režim spájkovania (V=Vyp | Z=Spájkovanie | S=Spanok | I=Spanok izbová teplota)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Malý krok\nteploty",
+ "description": "Zmena teploty pri krátkom stlačení tlačidla"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Veľký krok\nteploty",
+ "description": "Zmena teploty pri držaní tlačidla"
+ },
+ "LockingMode": {
+ "displayText": "Povoliť zámok\ntlačidiel",
+ "description": "Zamknutie tlačidiel - dlhé stlačenie oboch naraz počas spájkovania (Z=Zakázať | B=Okrem boost | P=Plné zamknutie)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Citlivosť\npohybu",
+ "description": "Citlivosť detekcie pohybu (0=Vyp | 1=Min | ... | 9=Max)"
+ },
+ "SleepTemperature": {
+ "displayText": "Pokojová\nteplota",
+ "description": "Pokojová teplota (v nastavených jednotkách)"
+ },
+ "SleepTimeout": {
+ "displayText": "Pokojový\nrežim po",
+ "description": "Pokojový režim po (s=sekundách | m=minútach)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Vypnutie\npo",
+ "description": "Čas na vypnutie (minúty)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Citliv.\nHall",
+ "description": "Citlivosť Hallovho senzora pre detekciu spánku (0=Vyp | 1=Min | ... | 9=Max)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Jednotka\nteploty",
+ "description": "Jednotky merania teploty (C=stupne Celzia | F=stupne Fahrenheita)"
+ },
+ "DisplayRotation": {
+ "displayText": "Orientácia\ndispleja",
+ "description": "Orientácia displeja (P=Pravák | L=Ľavák | A=Auto)"
+ },
+ "CooldownBlink": {
+ "displayText": "Blikanie pri\nchladnutí",
+ "description": "Blikanie ukazovateľa teploty počas chladnutia hrotu"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Rýchlosť\nskrolovania",
+ "description": "Rýchlosť pohybu tohto textu"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Otočenie\ntlačidiel +/-",
+ "description": "Prehodenie tlačidiel na nastavovanie teploty"
+ },
+ "AnimSpeed": {
+ "displayText": "Rýchlosť\nanimácií",
+ "description": "Rýchlosť animácií ikoniek v menu (O=off | P=pomaly | S=stredne | R=rýchlo)"
+ },
+ "AnimLoop": {
+ "displayText": "Opakovanie\nanimácií",
+ "description": "Opakovanie animácií ikoniek v hlavnom menu"
+ },
+ "Brightness": {
+ "displayText": "Jas\nobrazovky",
+ "description": "Mení jas/kontrast OLED displeja"
+ },
+ "ColourInversion": {
+ "displayText": "Invertovať\nobrazovku",
+ "description": "Invertovať farby OLED displeja"
+ },
+ "LOGOTime": {
+ "displayText": "Trvanie\nboot loga",
+ "description": "Doba trvania boot loga (s=sekundy)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Detaily v\npokoj. režime",
+ "description": "Zobraziť detailné informácie v pokojovom režime (T=Zap | F=Vyp)"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Detaily počas\nspájkovania",
+ "description": "Zobrazenie detailov počas spájkovania"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Obmedzenie\nvýkonu",
+ "description": "Obmedzenie výkonu podľa použitého zdroja (watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibrácia\nnap. napätia",
+ "description": "Kalibrácia napájacieho napätia. Krátke stlačenie mení nastavenie, dlhé stlačenie pre návrat"
+ },
+ "PowerPulsePower": {
+ "displayText": "Intenzita\nimpulzu",
+ "description": "Impulz udržujúci napájací zdroj zapnutý (power banky) (watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Interval\nimpulzu",
+ "description": "Interval medzi impulzami udržujúcimi napájací zdroj zapnutý (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Dĺžka\nimpulzu",
+ "description": "Dĺžka impulzu udržujúci napájací zdroj zapnutý (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Obnovenie\nnastavení",
+ "description": "Obnovenie nastavení na pôvodné hodnoty"
+ },
+ "LanguageSwitch": {
+ "displayText": "Jazyk:\n SK Slovenčina",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_SL.json b/Translations/translation_SL.json
index 3f259a56..5e775923 100644
--- a/Translations/translation_SL.json
+++ b/Translations/translation_SL.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "SL",
- "languageLocalName": "Slovenščina",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Res želite ponastaviti na privzete nastavitve?",
- "UVLOWarningString": "NIZKA U",
- "UndervoltageString": "Nizka napetost",
- "InputVoltageString": "Vhodna U: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Spim...",
- "SleepingTipAdvancedString": "Konica",
- "OffString": "Off",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Nastavitve OK!",
- ""
- ],
- "NoAccelerometerMessage": [
- "Ni pospeševalnik",
- ""
- ],
- "NoPowerDeliveryMessage": [
- "Ni USB-PD čipa!",
- ""
- ],
- "LockingKeysString": "ZAKLENJ.",
- "UnlockingKeysString": "ODKLENJ.",
- "WarningKeysLockedString": "ZAKLENJ.",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "D",
- "SettingLeftChar": "L",
- "SettingAutoChar": "S",
- "SettingOffChar": "U",
- "SettingSlowChar": "P",
- "SettingMediumChar": "M",
- "SettingFastChar": "H",
- "SettingStartNoneChar": "U",
- "SettingStartSolderingChar": "S",
- "SettingStartSleepChar": "Z",
- "SettingStartSleepOffChar": "V",
- "SettingSensitivityOff": "U",
- "SettingSensitivityLow": "N",
- "SettingSensitivityMedium": "S",
- "SettingSensitivityHigh": "V",
- "SettingLockDisableChar": "O",
- "SettingLockBoostChar": "L",
- "SettingLockFullChar": "P"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Power",
- "settings"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Nastavitve",
- "spajkanja"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Način",
- "spanja"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Uporabniški",
- "vmesnik"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Napredne",
- "možnosti"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Vir",
- "napajanja"
- ],
- "desc": "Vir napajanja. Nastavi napetost izklopa. (DC 10V) (S 3.3V na celico)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "voltage"
- ],
- "desc": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC",
- "napetost"
- ],
- "desc": "Moč napajalnega vira v vatih [W]"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
- },
- "BoostTemperature": {
- "text2": [
- "Pospešena",
- "temp."
- ],
- "desc": "Temperatura v pospešenem načinu"
- },
- "AutoStart": {
- "text2": [
- "Samodejni",
- "zagon"
- ],
- "desc": "Samodejno gretje konice ob vklopu (U=ugasnjeno | S=spajkanje | Z=spanje | V=spanje na sobni temperaturi)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Kratka sprememba",
- "temperature?"
- ],
- "desc": "Temperatura se spremeni ob kratkem pritisku na gumb."
- },
- "TempChangeLongStep": {
- "text2": [
- "Dolga sprememba",
- "temperature?"
- ],
- "desc": "Temperatura se spremeni ob dolgem pritisku na gumb."
- },
- "LockingMode": {
- "text2": [
- "Omogoči",
- "zaklep gumbov"
- ],
- "desc": "Za zaklep med spajkanjem drži oba gumba (O=onemogoči | L=le pospešeno | P=polno)"
- },
- "MotionSensitivity": {
- "text2": [
- "Občutljivost",
- "premikanja"
- ],
- "desc": "0=izklopljeno | 1=najmanjša | ... | 9=največja"
- },
- "SleepTemperature": {
- "text2": [
- "Temp. med",
- "spanjem"
- ],
- "desc": "Temperatura med spanjem"
- },
- "SleepTimeout": {
- "text2": [
- "Čas do",
- "spanja"
- ],
- "desc": "Čas pred spanjem (s=sekunde | m=minute)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Čas do",
- "izklopa"
- ],
- "desc": "Čas do izklopa (m=minute)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Občut.",
- "Hall son"
- ],
- "desc": "Občutljivost Hallove sonde za zaznavanje spanja (0=izklopljeno | 1=najmanjša | ... | 9=največja)"
- },
- "TemperatureUnit": {
- "text2": [
- "Enota za",
- "temperaturo"
- ],
- "desc": "Enota za temperaturo (C=celzij | F=fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "Orientacija",
- "zaslona"
- ],
- "desc": "D=desničar | L=levičar | S=samodejno"
- },
- "CooldownBlink": {
- "text2": [
- "Utripanje med",
- "hlajenjem"
- ],
- "desc": "Ko je konica še vroča, utripaj prikaz temperature med hlajenjem."
- },
- "ScrollingSpeed": {
- "text2": [
- "Hitrost",
- "besedila"
- ],
- "desc": "Hitrost, s katero se prikazuje besedilo (P=počasi | H=hitro)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Obrni",
- "tipki + -?"
- ],
- "desc": "Zamenjaj funkciji gumbov."
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "speed"
- ],
- "desc": "Pace of icon animations in menu (O=off | P=slow | M=medium | H=fast)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loop icon animations in main menu"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Več info. na",
- "mir. zaslonu"
- ],
- "desc": "Prikaži več informacij z manjšo pisavo na mirovalnem zaslonu."
- },
- "AdvancedSoldering": {
- "text2": [
- "Več info na",
- "zaslonu spaj."
- ],
- "desc": "Prikaže več informacij z manjšo pisavo na zaslonu med spajkanjem."
- },
- "PowerLimit": {
- "text2": [
- "Meja",
- "moči"
- ],
- "desc": "Največja dovoljena moč v vatih [W]"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibriram",
- "vhodno napetost?"
- ],
- "desc": "Kalibracija VIN (nastavitve z gumbi, dolg pritisk za izhod)"
- },
- "PowerPulsePower": {
- "text2": [
- "Pulz",
- "moči"
- ],
- "desc": "Velikost moči za vzdrževanje budnosti."
- },
- "PowerPulseWait": {
- "text2": [
- "Power pulse",
- "delay"
- ],
- "desc": "Delay before keep-awake-pulse is triggered (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duration"
- ],
- "desc": "Keep-awake-pulse duration (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Tovarniške",
- "nastavitve?"
- ],
- "desc": "Ponastavitev vseh nastavitev"
- },
- "LanguageSwitch": {
- "text2": [
- "Jezik:",
- " SL Slovenščina"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "SL",
+ "languageLocalName": "Slovenščina",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Nastavitve \nOK!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Ni \npospeševalnik"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Ni USB-PD \nčipa!"
+ },
+ "LockingKeysString": {
+ "message": "ZAKLENJ."
+ },
+ "UnlockingKeysString": {
+ "message": "ODKLENJ."
+ },
+ "WarningKeysLockedString": {
+ "message": "ZAKLENJ."
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Res želite ponastaviti na privzete nastavitve?"
+ },
+ "UVLOWarningString": {
+ "message": "NIZKA U"
+ },
+ "UndervoltageString": {
+ "message": "Nizka napetost\n"
+ },
+ "InputVoltageString": {
+ "message": "Vhodna U: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Spim...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Konica \n"
+ },
+ "OffString": {
+ "message": "Off"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "D",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "S",
+ "SettingOffChar": "U",
+ "SettingSlowChar": "P",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "H",
+ "SettingStartNoneChar": "U",
+ "SettingStartSolderingChar": "S",
+ "SettingStartSleepChar": "Z",
+ "SettingStartSleepOffChar": "V",
+ "SettingLockDisableChar": "O",
+ "SettingLockBoostChar": "L",
+ "SettingLockFullChar": "P"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Power\nsettings",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Nastavitve\nspajkanja",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Način\nspanja",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Uporabniški\nvmesnik",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Napredne\nmožnosti",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Vir\nnapajanja",
+ "description": "Vir napajanja. Nastavi napetost izklopa. (DC 10V) (S 3.3V na celico)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nvoltage",
+ "description": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC\nnapetost",
+ "description": "Moč napajalnega vira v vatih [W]"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Pospešena\ntemp.",
+ "description": "Temperatura v pospešenem načinu"
+ },
+ "AutoStart": {
+ "displayText": "Samodejni\nzagon",
+ "description": "Samodejno gretje konice ob vklopu (U=ugasnjeno | S=spajkanje | Z=spanje | V=spanje na sobni temperaturi)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Kratka sprememba\ntemperature?",
+ "description": "Temperatura se spremeni ob kratkem pritisku na gumb."
+ },
+ "TempChangeLongStep": {
+ "displayText": "Dolga sprememba\ntemperature?",
+ "description": "Temperatura se spremeni ob dolgem pritisku na gumb."
+ },
+ "LockingMode": {
+ "displayText": "Omogoči\nzaklep gumbov",
+ "description": "Za zaklep med spajkanjem drži oba gumba (O=onemogoči | L=le pospešeno | P=polno)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Občutljivost\npremikanja",
+ "description": "0=izklopljeno | 1=najmanjša | ... | 9=največja"
+ },
+ "SleepTemperature": {
+ "displayText": "Temp. med\nspanjem",
+ "description": "Temperatura med spanjem"
+ },
+ "SleepTimeout": {
+ "displayText": "Čas do\nspanja",
+ "description": "Čas pred spanjem (s=sekunde | m=minute)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Čas do\nizklopa",
+ "description": "Čas do izklopa (m=minute)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Občut.\nHall son",
+ "description": "Občutljivost Hallove sonde za zaznavanje spanja (0=izklopljeno | 1=najmanjša | ... | 9=največja)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Enota za\ntemperaturo",
+ "description": "Enota za temperaturo (C=celzij | F=fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "Orientacija\nzaslona",
+ "description": "D=desničar | L=levičar | S=samodejno"
+ },
+ "CooldownBlink": {
+ "displayText": "Utripanje med\nhlajenjem",
+ "description": "Ko je konica še vroča, utripaj prikaz temperature med hlajenjem."
+ },
+ "ScrollingSpeed": {
+ "displayText": "Hitrost\nbesedila",
+ "description": "Hitrost, s katero se prikazuje besedilo (P=počasi | H=hitro)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Obrni\ntipki + -?",
+ "description": "Zamenjaj funkciji gumbov."
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nspeed",
+ "description": "Pace of icon animations in menu (O=off | P=slow | M=medium | H=fast)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nloop",
+ "description": "Loop icon animations in main menu"
+ },
+ "Brightness": {
+ "displayText": "Screen\nbrightness",
+ "description": "Adjust the OLED screen brightness"
+ },
+ "ColourInversion": {
+ "displayText": "Invert\nscreen",
+ "description": "Invert the OLED screen colors"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Več info. na\nmir. zaslonu",
+ "description": "Prikaži več informacij z manjšo pisavo na mirovalnem zaslonu."
+ },
+ "AdvancedSoldering": {
+ "displayText": "Več info na\nzaslonu spaj.",
+ "description": "Prikaže več informacij z manjšo pisavo na zaslonu med spajkanjem."
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Meja\nmoči",
+ "description": "Največja dovoljena moč v vatih [W]"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibriram\nvhodno napetost?",
+ "description": "Kalibracija VIN (nastavitve z gumbi, dolg pritisk za izhod)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Pulz\nmoči",
+ "description": "Velikost moči za vzdrževanje budnosti."
+ },
+ "PowerPulseWait": {
+ "displayText": "Power pulse\ndelay",
+ "description": "Delay before keep-awake-pulse is triggered (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Power pulse\nduration",
+ "description": "Keep-awake-pulse duration (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Tovarniške\nnastavitve?",
+ "description": "Ponastavitev vseh nastavitev"
+ },
+ "LanguageSwitch": {
+ "displayText": "Jezik:\n SL Slovenščina",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_SR_CYRL.json b/Translations/translation_SR_CYRL.json
index c268f8c2..bca7ab62 100644
--- a/Translations/translation_SR_CYRL.json
+++ b/Translations/translation_SR_CYRL.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "SR_CYRL",
- "languageLocalName": "Српски",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Да ли заиста желите да вратите поставке на фабричке вредности?",
- "UVLOWarningString": "НИЗ.НАП.",
- "UndervoltageString": "ПРЕНИЗАК НАПОН",
- "InputVoltageString": "Ул. напон: ",
- "SleepingSimpleString": "Сан",
- "SleepingAdvancedString": "Спавање...",
- "SleepingTipAdvancedString": "Врх:",
- "OffString": "Иск",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Certain settings",
- "were changed!"
- ],
- "NoAccelerometerMessage": [
- "No accelerometer",
- "detected!"
- ],
- "NoPowerDeliveryMessage": [
- "No USB-PD IC",
- "detected!"
- ],
- "LockingKeysString": "LOCKED",
- "UnlockingKeysString": "UNLOCKED",
- "WarningKeysLockedString": "!LOCKED!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "Д",
- "SettingLeftChar": "Л",
- "SettingAutoChar": "А",
- "SettingOffChar": "O",
- "SettingSlowChar": "С",
- "SettingMediumChar": "M",
- "SettingFastChar": "Б",
- "SettingStartNoneChar": "И",
- "SettingStartSolderingChar": "Л",
- "SettingStartSleepChar": "С",
- "SettingStartSleepOffChar": "X",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Power",
- "settings"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Поставке",
- "лемљења"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Уштеда",
- "енергије"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Корисничко",
- "сучеље"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Напредне",
- "поставке"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Врста",
- "напајања"
- ],
- "desc": "Тип напајања; одређује најнижи радни напон. (DC=адаптер [10V] | S=батерија [3,3V по ћелији])"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "voltage"
- ],
- "desc": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Улазна",
- "снага"
- ],
- "desc": "Снага напајања у ватима."
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
- },
- "BoostTemperature": {
- "text2": [
- "Темп.",
- "појачања"
- ],
- "desc": "Температура врха лемилице у току појачања."
- },
- "AutoStart": {
- "text2": [
- "Врући",
- "старт"
- ],
- "desc": "Лемилица одмах по покретању прелази у режим лемљења и греје се. (И=искључити | Л=лемљење | С=спавати | X=спавати собна температура)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp change",
- "short"
- ],
- "desc": "Temperature-change-increment on short button press"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp change",
- "long"
- ],
- "desc": "Temperature-change-increment on long button press"
- },
- "LockingMode": {
- "text2": [
- "Allow locking",
- "buttons"
- ],
- "desc": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
- },
- "MotionSensitivity": {
- "text2": [
- "Осетљивост",
- "на покрет"
- ],
- "desc": "Осетљивост сензора покрета. (0=искључено | 1=најмање осетљиво | ... | 9=најосетљивије)"
- },
- "SleepTemperature": {
- "text2": [
- "Темп.",
- "спавања"
- ],
- "desc": "Температура на коју се спушта лемилица након одређеног времена мировања. (C | F)"
- },
- "SleepTimeout": {
- "text2": [
- "Време до",
- "спавања"
- ],
- "desc": "Време мировања након кога лемилица спушта температуру. (m=минути | s=секунде)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Време до",
- "гашења"
- ],
- "desc": "Време мировања након кога се лемилица гаси. (m=минути)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall sensor",
- "sensitivity"
- ],
- "desc": "Sensitivity to magnets (0=искључено | 1=најмање осетљиво | ... | 9=најосетљивије)"
- },
- "TemperatureUnit": {
- "text2": [
- "Јединица",
- "температуре"
- ],
- "desc": "Јединице у којима се приказује температура. (C=целзијус | F=фаренхајт)"
- },
- "DisplayRotation": {
- "text2": [
- "Оријентација",
- "екрана"
- ],
- "desc": "Како је окренут екран. (Д=за десноруке | Л=за леворуке | А=аутоматски)"
- },
- "CooldownBlink": {
- "text2": [
- "Упозорење",
- "при хлађењу"
- ],
- "desc": "Приказ температуре трепће приликом хлађења докле год је врх и даље врућ."
- },
- "ScrollingSpeed": {
- "text2": [
- "Брзина",
- "порука"
- ],
- "desc": "Брзина кретања описних порука попут ове. (С=споро | Б=брзо)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Swap",
- "+ - keys"
- ],
- "desc": "Reverse assignment of buttons for temperature adjustment"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "speed"
- ],
- "desc": "Pace of icon animations in menu (O=off | С=slow | M=medium | Б=fast)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loop icon animations in main menu"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Детаљи током",
- "мировања"
- ],
- "desc": "Приказивање детаљних информација на екрану током мировања."
- },
- "AdvancedSoldering": {
- "text2": [
- "Детаљи током",
- "лемљења"
- ],
- "desc": "Приказивање детаљних информација на екрану током лемљења."
- },
- "PowerLimit": {
- "text2": [
- "Power",
- "limit"
- ],
- "desc": "Maximum power the iron can use (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Калибрација",
- "улазног напона"
- ],
- "desc": "Калибрисање улазног напона. Подешава се на тастере; дуги притисак за крај."
- },
- "PowerPulsePower": {
- "text2": [
- "Power",
- "pulse"
- ],
- "desc": "Intensity of power of keep-awake-pulse (W=watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Power pulse",
- "delay"
- ],
- "desc": "Delay before keep-awake-pulse is triggered (x 2.5с)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duration"
- ],
- "desc": "Keep-awake-pulse duration (x 250мс)"
- },
- "SettingsReset": {
- "text2": [
- "Фабричке",
- "поставке"
- ],
- "desc": "Враћање свих поставки на фабричке вредности."
- },
- "LanguageSwitch": {
- "text2": [
- "Jезик:",
- " SR Српски"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "SR_CYRL",
+ "languageLocalName": "Српски",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Certain settings\nwere changed!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "No accelerometer\ndetected!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "No USB-PD IC\ndetected!"
+ },
+ "LockingKeysString": {
+ "message": "LOCKED"
+ },
+ "UnlockingKeysString": {
+ "message": "UNLOCKED"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LOCKED!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Да ли заиста желите да вратите поставке на фабричке вредности?"
+ },
+ "UVLOWarningString": {
+ "message": "НИЗ.НАП."
+ },
+ "UndervoltageString": {
+ "message": "ПРЕНИЗАК НАПОН\n"
+ },
+ "InputVoltageString": {
+ "message": "Ул. напон: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Сан"
+ },
+ "SleepingAdvancedString": {
+ "message": "Спавање...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Врх: \n"
+ },
+ "OffString": {
+ "message": "Иск"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "Д",
+ "SettingLeftChar": "Л",
+ "SettingAutoChar": "А",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "С",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "Б",
+ "SettingStartNoneChar": "И",
+ "SettingStartSolderingChar": "Л",
+ "SettingStartSleepChar": "С",
+ "SettingStartSleepOffChar": "X",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Power\nsettings",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Поставке\nлемљења",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Уштеда\nенергије",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Корисничко\nсучеље",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Напредне\nпоставке",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Врста\nнапајања",
+ "description": "Тип напајања; одређује најнижи радни напон. (DC=адаптер [10V] | S=батерија [3,3V по ћелији])"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nvoltage",
+ "description": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Улазна\nснага",
+ "description": "Снага напајања у ватима."
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Темп.\nпојачања",
+ "description": "Температура врха лемилице у току појачања."
+ },
+ "AutoStart": {
+ "displayText": "Врући\nстарт",
+ "description": "Лемилица одмах по покретању прелази у режим лемљења и греје се. (И=искључити | Л=лемљење | С=спавати | X=спавати собна температура)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp change\nshort",
+ "description": "Temperature-change-increment on short button press"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp change\nlong",
+ "description": "Temperature-change-increment on long button press"
+ },
+ "LockingMode": {
+ "displayText": "Allow locking\nbuttons",
+ "description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Осетљивост\nна покрет",
+ "description": "Осетљивост сензора покрета. (0=искључено | 1=најмање осетљиво | ... | 9=најосетљивије)"
+ },
+ "SleepTemperature": {
+ "displayText": "Темп.\nспавања",
+ "description": "Температура на коју се спушта лемилица након одређеног времена мировања. (C | F)"
+ },
+ "SleepTimeout": {
+ "displayText": "Време до\nспавања",
+ "description": "Време мировања након кога лемилица спушта температуру. (m=минути | s=секунде)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Време до\nгашења",
+ "description": "Време мировања након кога се лемилица гаси. (m=минути)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall sensor\nsensitivity",
+ "description": "Sensitivity to magnets (0=искључено | 1=најмање осетљиво | ... | 9=најосетљивије)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Јединица\nтемпературе",
+ "description": "Јединице у којима се приказује температура. (C=целзијус | F=фаренхајт)"
+ },
+ "DisplayRotation": {
+ "displayText": "Оријентација\nекрана",
+ "description": "Како је окренут екран. (Д=за десноруке | Л=за леворуке | А=аутоматски)"
+ },
+ "CooldownBlink": {
+ "displayText": "Упозорење\nпри хлађењу",
+ "description": "Приказ температуре трепће приликом хлађења докле год је врх и даље врућ."
+ },
+ "ScrollingSpeed": {
+ "displayText": "Брзина\nпорука",
+ "description": "Брзина кретања описних порука попут ове. (С=споро | Б=брзо)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Swap\n+ - keys",
+ "description": "Reverse assignment of buttons for temperature adjustment"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nspeed",
+ "description": "Pace of icon animations in menu (O=off | С=slow | M=medium | Б=fast)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nloop",
+ "description": "Loop icon animations in main menu"
+ },
+ "Brightness": {
+ "displayText": "Screen\nbrightness",
+ "description": "Adjust the OLED screen brightness"
+ },
+ "ColourInversion": {
+ "displayText": "Invert\nscreen",
+ "description": "Invert the OLED screen colors"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Детаљи током\nмировања",
+ "description": "Приказивање детаљних информација на екрану током мировања."
+ },
+ "AdvancedSoldering": {
+ "displayText": "Детаљи током\nлемљења",
+ "description": "Приказивање детаљних информација на екрану током лемљења."
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Power\nlimit",
+ "description": "Maximum power the iron can use (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Калибрација\nулазног напона",
+ "description": "Калибрисање улазног напона. Подешава се на тастере; дуги притисак за крај."
+ },
+ "PowerPulsePower": {
+ "displayText": "Power\npulse",
+ "description": "Intensity of power of keep-awake-pulse (W=watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Power pulse\ndelay",
+ "description": "Delay before keep-awake-pulse is triggered (x 2.5с)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Power pulse\nduration",
+ "description": "Keep-awake-pulse duration (x 250мс)"
+ },
+ "SettingsReset": {
+ "displayText": "Фабричке\nпоставке",
+ "description": "Враћање свих поставки на фабричке вредности."
+ },
+ "LanguageSwitch": {
+ "displayText": "Jезик:\n SR Српски",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_SR_LATN.json b/Translations/translation_SR_LATN.json
index 6416e085..83774e18 100644
--- a/Translations/translation_SR_LATN.json
+++ b/Translations/translation_SR_LATN.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "SR_LATN",
- "languageLocalName": "Srpski",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Da li zaista želite da vratite postavke na fabričke vrednosti?",
- "UVLOWarningString": "NIZ.NAP.",
- "UndervoltageString": "PRENIZAK NAPON",
- "InputVoltageString": "Ul. napon: ",
- "SleepingSimpleString": "Zzz",
- "SleepingAdvancedString": "Spavanje...",
- "SleepingTipAdvancedString": "Vrh:",
- "OffString": "Isk",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Certain settings",
- "were changed!"
- ],
- "NoAccelerometerMessage": [
- "No accelerometer",
- "detected!"
- ],
- "NoPowerDeliveryMessage": [
- "No USB-PD IC",
- "detected!"
- ],
- "LockingKeysString": "LOCKED",
- "UnlockingKeysString": "UNLOCKED",
- "WarningKeysLockedString": "!LOCKED!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "D",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "S",
- "SettingMediumChar": "M",
- "SettingFastChar": "B",
- "SettingStartNoneChar": "I",
- "SettingStartSolderingChar": "L",
- "SettingStartSleepChar": "S",
- "SettingStartSleepOffChar": "X",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Power",
- "settings"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Postavke",
- "lemljenja"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Ušteda",
- "energije"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Korisničko",
- "sučelje"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Napredne",
- "postavke"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Vrsta",
- "napajanja"
- ],
- "desc": "Tip napajanja; određuje najniži radni napon. (DC=adapter [10V], S=baterija [3,3V po ćeliji])"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "voltage"
- ],
- "desc": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Ulazna",
- "snaga"
- ],
- "desc": "Snaga napajanja u vatima."
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
- },
- "BoostTemperature": {
- "text2": [
- "Temp.",
- "pojačanja"
- ],
- "desc": "Temperatura vrha lemilice u toku pojačanja."
- },
- "AutoStart": {
- "text2": [
- "Vrući",
- "start"
- ],
- "desc": "Lemilica odmah po pokretanju prelazi u režim lemljenja i greje se. (I=isključiti | L=lemljenje | S=spavati | X=spavati sobna temperatura)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp change",
- "short"
- ],
- "desc": "Temperature-change-increment on short button press"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp change",
- "long"
- ],
- "desc": "Temperature-change-increment on long button press"
- },
- "LockingMode": {
- "text2": [
- "Allow locking",
- "buttons"
- ],
- "desc": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
- },
- "MotionSensitivity": {
- "text2": [
- "Osetljivost",
- "na pokret"
- ],
- "desc": "Osetljivost senzora pokreta. (0=isključeno | 1=najmanje osetljivo | ... | 9=najosetljivije)"
- },
- "SleepTemperature": {
- "text2": [
- "Temp.",
- "spavanja"
- ],
- "desc": "Temperatura na koju se spušta lemilica nakon određenog vremena mirovanja. (C | F)"
- },
- "SleepTimeout": {
- "text2": [
- "Vreme do",
- "spavanja"
- ],
- "desc": "Vreme mirovanja nakon koga lemilica spušta temperaturu. (m=minuti | s=sekunde)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Vreme do",
- "gašenja"
- ],
- "desc": "Vreme mirovanja nakon koga se lemilica gasi. (m=minuti)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall sensor",
- "sensitivity"
- ],
- "desc": "Sensitivity to magnets (0=isključeno | 1=najmanje osetljivo | ... | 9=najosetljivije)"
- },
- "TemperatureUnit": {
- "text2": [
- "Jedinica",
- "temperature"
- ],
- "desc": "Jedinice u kojima se prikazuje temperatura. (C=celzijus | F=farenhajt)"
- },
- "DisplayRotation": {
- "text2": [
- "Orijentacija",
- "ekrana"
- ],
- "desc": "Kako je okrenut ekran. (D=za desnoruke | L=za levoruke | A=automatski)"
- },
- "CooldownBlink": {
- "text2": [
- "Upozorenje",
- "pri hlađenju"
- ],
- "desc": "Prikaz temperature trepće prilikom hlađenja dokle god je vrh i dalje vruć."
- },
- "ScrollingSpeed": {
- "text2": [
- "Brzina",
- "poruka"
- ],
- "desc": "Brzina kretanja opisnih poruka poput ove. (S=sporo | B=brzo)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Swap",
- "+ - keys"
- ],
- "desc": "Reverse assignment of buttons for temperature adjustment"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "speed"
- ],
- "desc": "Pace of icon animations in menu (O=off | S=slow | M=medium | B=fast)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loop icon animations in main menu"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Detalji tokom",
- "mirovanja"
- ],
- "desc": "Prikazivanje detaljnih informacija na ekranu tokom mirovanja."
- },
- "AdvancedSoldering": {
- "text2": [
- "Detalji tokom",
- "lemljenja"
- ],
- "desc": "Prikazivanje detaljnih informacija na ekranu tokom lemljenja."
- },
- "PowerLimit": {
- "text2": [
- "Power",
- "limit"
- ],
- "desc": "Maximum power the iron can use (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibracija",
- "ulaznog napona"
- ],
- "desc": "Kalibrisanje ulaznog napona. Podešava se na tastere; dugi pritisak za kraj."
- },
- "PowerPulsePower": {
- "text2": [
- "Power",
- "pulse"
- ],
- "desc": "Intensity of power of keep-awake-pulse (W=watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Power pulse",
- "delay"
- ],
- "desc": "Delay before keep-awake-pulse is triggered (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duration"
- ],
- "desc": "Keep-awake-pulse duration (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Fabričke",
- "postavke"
- ],
- "desc": "Vraćanje svih postavki na fabričke vrednosti."
- },
- "LanguageSwitch": {
- "text2": [
- "Jezik:",
- " SR Srpski"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "SR_LATN",
+ "languageLocalName": "Srpski",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Certain settings\nwere changed!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "No accelerometer\ndetected!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "No USB-PD IC\ndetected!"
+ },
+ "LockingKeysString": {
+ "message": "LOCKED"
+ },
+ "UnlockingKeysString": {
+ "message": "UNLOCKED"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LOCKED!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Da li zaista želite da vratite postavke na fabričke vrednosti?"
+ },
+ "UVLOWarningString": {
+ "message": "NIZ.NAP."
+ },
+ "UndervoltageString": {
+ "message": "PRENIZAK NAPON\n"
+ },
+ "InputVoltageString": {
+ "message": "Ul. napon: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Spavanje...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Vrh: \n"
+ },
+ "OffString": {
+ "message": "Isk"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "D",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "S",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "B",
+ "SettingStartNoneChar": "I",
+ "SettingStartSolderingChar": "L",
+ "SettingStartSleepChar": "S",
+ "SettingStartSleepOffChar": "X",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Power\nsettings",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Postavke\nlemljenja",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Ušteda\nenergije",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Korisničko\nsučelje",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Napredne\npostavke",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Vrsta\nnapajanja",
+ "description": "Tip napajanja; određuje najniži radni napon. (DC=adapter [10V], S=baterija [3,3V po ćeliji])"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nvoltage",
+ "description": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Ulazna\nsnaga",
+ "description": "Snaga napajanja u vatima."
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Temp.\npojačanja",
+ "description": "Temperatura vrha lemilice u toku pojačanja."
+ },
+ "AutoStart": {
+ "displayText": "Vrući\nstart",
+ "description": "Lemilica odmah po pokretanju prelazi u režim lemljenja i greje se. (I=isključiti | L=lemljenje | S=spavati | X=spavati sobna temperatura)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp change\nshort",
+ "description": "Temperature-change-increment on short button press"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp change\nlong",
+ "description": "Temperature-change-increment on long button press"
+ },
+ "LockingMode": {
+ "displayText": "Allow locking\nbuttons",
+ "description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Osetljivost\nna pokret",
+ "description": "Osetljivost senzora pokreta. (0=isključeno | 1=najmanje osetljivo | ... | 9=najosetljivije)"
+ },
+ "SleepTemperature": {
+ "displayText": "Temp.\nspavanja",
+ "description": "Temperatura na koju se spušta lemilica nakon određenog vremena mirovanja. (C | F)"
+ },
+ "SleepTimeout": {
+ "displayText": "Vreme do\nspavanja",
+ "description": "Vreme mirovanja nakon koga lemilica spušta temperaturu. (m=minuti | s=sekunde)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Vreme do\ngašenja",
+ "description": "Vreme mirovanja nakon koga se lemilica gasi. (m=minuti)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall sensor\nsensitivity",
+ "description": "Sensitivity to magnets (0=isključeno | 1=najmanje osetljivo | ... | 9=najosetljivije)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Jedinica\ntemperature",
+ "description": "Jedinice u kojima se prikazuje temperatura. (C=celzijus | F=farenhajt)"
+ },
+ "DisplayRotation": {
+ "displayText": "Orijentacija\nekrana",
+ "description": "Kako je okrenut ekran. (D=za desnoruke | L=za levoruke | A=automatski)"
+ },
+ "CooldownBlink": {
+ "displayText": "Upozorenje\npri hlađenju",
+ "description": "Prikaz temperature trepće prilikom hlađenja dokle god je vrh i dalje vruć."
+ },
+ "ScrollingSpeed": {
+ "displayText": "Brzina\nporuka",
+ "description": "Brzina kretanja opisnih poruka poput ove. (S=sporo | B=brzo)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Swap\n+ - keys",
+ "description": "Reverse assignment of buttons for temperature adjustment"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nspeed",
+ "description": "Pace of icon animations in menu (O=off | S=slow | M=medium | B=fast)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nloop",
+ "description": "Loop icon animations in main menu"
+ },
+ "Brightness": {
+ "displayText": "Screen\nbrightness",
+ "description": "Adjust the OLED screen brightness"
+ },
+ "ColourInversion": {
+ "displayText": "Invert\nscreen",
+ "description": "Invert the OLED screen colors"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Detalji tokom\nmirovanja",
+ "description": "Prikazivanje detaljnih informacija na ekranu tokom mirovanja."
+ },
+ "AdvancedSoldering": {
+ "displayText": "Detalji tokom\nlemljenja",
+ "description": "Prikazivanje detaljnih informacija na ekranu tokom lemljenja."
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Power\nlimit",
+ "description": "Maximum power the iron can use (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibracija\nulaznog napona",
+ "description": "Kalibrisanje ulaznog napona. Podešava se na tastere; dugi pritisak za kraj."
+ },
+ "PowerPulsePower": {
+ "displayText": "Power\npulse",
+ "description": "Intensity of power of keep-awake-pulse (W=watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Power pulse\ndelay",
+ "description": "Delay before keep-awake-pulse is triggered (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Power pulse\nduration",
+ "description": "Keep-awake-pulse duration (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Fabričke\npostavke",
+ "description": "Vraćanje svih postavki na fabričke vrednosti."
+ },
+ "LanguageSwitch": {
+ "displayText": "Jezik:\n SR Srpski",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_SV.json b/Translations/translation_SV.json
index 6680841a..075bcd30 100644
--- a/Translations/translation_SV.json
+++ b/Translations/translation_SV.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "SV",
- "languageLocalName": "Svenska",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Är du säker på att du vill återställa inställningarna?",
- "UVLOWarningString": "DC LÅG",
- "UndervoltageString": "Underspänning",
- "InputVoltageString": "Inspän. V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Viloläge...",
- "SleepingTipAdvancedString": "Spets:",
- "OffString": "Av",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Inställningar",
- "återställda"
- ],
- "NoAccelerometerMessage": [
- "Ingen",
- "accelerometer"
- ],
- "NoPowerDeliveryMessage": [
- "Ingen USB-PD IC",
- "hittades!"
- ],
- "LockingKeysString": "LÅST",
- "UnlockingKeysString": "UPPLÅST",
- "WarningKeysLockedString": "!LÅST!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "H",
- "SettingLeftChar": "V",
- "SettingAutoChar": "A",
- "SettingOffChar": "A",
- "SettingSlowChar": "L",
- "SettingMediumChar": "M",
- "SettingFastChar": "S",
- "SettingStartNoneChar": "A",
- "SettingStartSolderingChar": "L",
- "SettingStartSleepChar": "V",
- "SettingStartSleepOffChar": "R",
- "SettingSensitivityOff": "A",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "A",
- "SettingLockBoostChar": "T",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Effekt-",
- "inställning"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Lödnings-",
- "inställning"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Vilo-",
- "läge"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Användar-",
- "gränssnitt"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Avancerade",
- "alternativ"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Ström-",
- "källa"
- ],
- "desc": "Strömkälla. Anger lägsta spänning. (DC 10V) (S 3.3V per cell)"
- },
- "MinVolCell": {
- "text2": [
- "Minimim-",
- "spänning"
- ],
- "desc": "Minimumspänning per cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC",
- "spänning"
- ],
- "desc": "Maximal QC-spänning enheten skall efterfråga"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
- },
- "BoostTemperature": {
- "text2": [
- "Turbo-",
- "temp"
- ],
- "desc": "Temperatur i \"turbo-läge\""
- },
- "AutoStart": {
- "text2": [
- "Auto",
- "start"
- ],
- "desc": "Startar automatiskt lödpennan vid uppstart. (A=Av | L=Lödning | V=Viloläge | R=Viloläge Rumstemperatur)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp.just",
- "korttryck"
- ],
- "desc": "Temperaturjustering vid kort knapptryckning"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp.just",
- "långtryck"
- ],
- "desc": "Temperaturjustering vid lång knapptryckning"
- },
- "LockingMode": {
- "text2": [
- "Tillåt lås",
- "via knappar"
- ],
- "desc": "Vid lödning, håll nere bägge knappar för att slå på lås (A=Av | T=Bara turbo | F=Fullt lås)"
- },
- "MotionSensitivity": {
- "text2": [
- "Rörelse-",
- "känslighet"
- ],
- "desc": "Rörelsekänslighet (0=Av | 1=minst känslig | ... | 9=mest känslig)"
- },
- "SleepTemperature": {
- "text2": [
- "Vilo-",
- "temp"
- ],
- "desc": "Vilotemperatur (C)"
- },
- "SleepTimeout": {
- "text2": [
- "Vilo-",
- "timeout"
- ],
- "desc": "Vilo-timeout (m=Minuter | s=Sekunder)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Avstängn.",
- "timeout"
- ],
- "desc": "Avstängnings-timeout (Minuter)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Sensor-",
- "känslght"
- ],
- "desc": "Känslighet för halleffekt-sensorn för viloläges-detektering (0=Av | 1=minst känslig | ... | 9=mest känslig)"
- },
- "TemperatureUnit": {
- "text2": [
- "Temperatur-",
- "enheter"
- ],
- "desc": "Temperaturenhet (C=Celsius | F=Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "Visnings",
- "läge"
- ],
- "desc": "Visningsläge (H=Högerhänt | V=Vänsterhänt | A=Automatisk)"
- },
- "CooldownBlink": {
- "text2": [
- "Nedkylnings-",
- "blink"
- ],
- "desc": "Blinka temperaturen medan spetsen kyls av och fortfarande är varm."
- },
- "ScrollingSpeed": {
- "text2": [
- "Beskrivning",
- "rullhast."
- ],
- "desc": "Hastighet som den här texten rullar i"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Omvända",
- "+- knappar"
- ],
- "desc": "Omvänd ordning för temperaturjustering via plus/minus knapparna"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.-",
- "hastighet"
- ],
- "desc": "Animationshastighet för ikoner i menyer (A=av | L=långsam | M=medel | S=snabb)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loopa animationer i huvudmeny"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Detaljerad",
- "vid inaktiv"
- ],
- "desc": "Visa detaljerad information i mindre typsnitt när inaktiv."
- },
- "AdvancedSoldering": {
- "text2": [
- "Detaljerad",
- "lödng.skärm"
- ],
- "desc": "Visa detaljerad information vid lödning"
- },
- "PowerLimit": {
- "text2": [
- "Max-",
- "effekt"
- ],
- "desc": "Maximal effekt som enheten kan använda (Watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Kalibrera",
- "inspänning?"
- ],
- "desc": "Inspänningskalibrering. Knapparna justerar, håll inne för avslut"
- },
- "PowerPulsePower": {
- "text2": [
- "Power",
- "pulse"
- ],
- "desc": "Intensity of power of keep-awake-pulse (W=watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Power pulse",
- "delay"
- ],
- "desc": "Delay before keep-awake-pulse is triggered (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duration"
- ],
- "desc": "Keep-awake-pulse duration (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Fabriks-",
- "inställ?"
- ],
- "desc": "Återställ alla inställningar"
- },
- "LanguageSwitch": {
- "text2": [
- "Språk:",
- " SV Svenska"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "SV",
+ "languageLocalName": "Svenska",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Inställningar\nåterställda"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Ingen\naccelerometer"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Ingen USB-PD IC\nhittades!"
+ },
+ "LockingKeysString": {
+ "message": "LÅST"
+ },
+ "UnlockingKeysString": {
+ "message": "UPPLÅST"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LÅST!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Är du säker på att du vill återställa inställningarna?"
+ },
+ "UVLOWarningString": {
+ "message": "DC LÅG"
+ },
+ "UndervoltageString": {
+ "message": "Underspänning\n"
+ },
+ "InputVoltageString": {
+ "message": "Inspän. V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Viloläge...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Spets: \n"
+ },
+ "OffString": {
+ "message": "Av"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "H",
+ "SettingLeftChar": "V",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "A",
+ "SettingSlowChar": "L",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "S",
+ "SettingStartNoneChar": "A",
+ "SettingStartSolderingChar": "L",
+ "SettingStartSleepChar": "V",
+ "SettingStartSleepOffChar": "R",
+ "SettingLockDisableChar": "A",
+ "SettingLockBoostChar": "T",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Effekt-\ninställning",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Lödnings-\ninställning",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Vilo-\nläge",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Användar-\ngränssnitt",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Avancerade\nalternativ",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Ström-\nkälla",
+ "description": "Strömkälla. Anger lägsta spänning. (DC 10V) (S 3.3V per cell)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimim-\nspänning",
+ "description": "Minimumspänning per cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC\nspänning",
+ "description": "Maximal QC-spänning enheten skall efterfråga"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Turbo-\ntemp",
+ "description": "Temperatur i \"turbo-läge\""
+ },
+ "AutoStart": {
+ "displayText": "Auto\nstart",
+ "description": "Startar automatiskt lödpennan vid uppstart. (A=Av | L=Lödning | V=Viloläge | R=Viloläge Rumstemperatur)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp.just\nkorttryck",
+ "description": "Temperaturjustering vid kort knapptryckning"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp.just\nlångtryck",
+ "description": "Temperaturjustering vid lång knapptryckning"
+ },
+ "LockingMode": {
+ "displayText": "Tillåt lås\nvia knappar",
+ "description": "Vid lödning, håll nere bägge knappar för att slå på lås (A=Av | T=Bara turbo | F=Fullt lås)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Rörelse-\nkänslighet",
+ "description": "Rörelsekänslighet (0=Av | 1=minst känslig | ... | 9=mest känslig)"
+ },
+ "SleepTemperature": {
+ "displayText": "Vilo-\ntemp",
+ "description": "Vilotemperatur (C)"
+ },
+ "SleepTimeout": {
+ "displayText": "Vilo-\ntimeout",
+ "description": "Vilo-timeout (m=Minuter | s=Sekunder)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Avstängn.\ntimeout",
+ "description": "Avstängnings-timeout (Minuter)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Sensor-\nkänslght",
+ "description": "Känslighet för halleffekt-sensorn för viloläges-detektering (0=Av | 1=minst känslig | ... | 9=mest känslig)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Temperatur-\nenheter",
+ "description": "Temperaturenhet (C=Celsius | F=Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "Visnings\nläge",
+ "description": "Visningsläge (H=Högerhänt | V=Vänsterhänt | A=Automatisk)"
+ },
+ "CooldownBlink": {
+ "displayText": "Nedkylnings-\nblink",
+ "description": "Blinka temperaturen medan spetsen kyls av och fortfarande är varm."
+ },
+ "ScrollingSpeed": {
+ "displayText": "Beskrivning\nrullhast.",
+ "description": "Hastighet som den här texten rullar i"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Omvända\n+- knappar",
+ "description": "Omvänd ordning för temperaturjustering via plus/minus knapparna"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.-\nhastighet",
+ "description": "Animationshastighet för ikoner i menyer (A=av | L=långsam | M=medel | S=snabb)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nloop",
+ "description": "Loopa animationer i huvudmeny"
+ },
+ "Brightness": {
+ "displayText": "Screen\nbrightness",
+ "description": "Adjust the OLED screen brightness"
+ },
+ "ColourInversion": {
+ "displayText": "Invert\nscreen",
+ "description": "Invert the OLED screen colors"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Detaljerad\nvid inaktiv",
+ "description": "Visa detaljerad information i mindre typsnitt när inaktiv."
+ },
+ "AdvancedSoldering": {
+ "displayText": "Detaljerad\nlödng.skärm",
+ "description": "Visa detaljerad information vid lödning"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Max-\neffekt",
+ "description": "Maximal effekt som enheten kan använda (Watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Kalibrera\ninspänning?",
+ "description": "Inspänningskalibrering. Knapparna justerar, håll inne för avslut"
+ },
+ "PowerPulsePower": {
+ "displayText": "Power\npulse",
+ "description": "Intensity of power of keep-awake-pulse (W=watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Power pulse\ndelay",
+ "description": "Delay before keep-awake-pulse is triggered (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Power pulse\nduration",
+ "description": "Keep-awake-pulse duration (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Fabriks-\ninställ?",
+ "description": "Återställ alla inställningar"
+ },
+ "LanguageSwitch": {
+ "displayText": "Språk:\n SV Svenska",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_TR.json b/Translations/translation_TR.json
index 0a63c7dd..e22aa7e5 100644
--- a/Translations/translation_TR.json
+++ b/Translations/translation_TR.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "TR",
- "languageLocalName": "Türkçe",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Ayarları varsayılan değerlere sıfırlamak istediğinizden emin misiniz?",
- "UVLOWarningString": "Güç Az",
- "UndervoltageString": "Düşük Voltaj",
- "InputVoltageString": "Giriş V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Bekleme Modu ...",
- "SleepingTipAdvancedString": "Uç:",
- "OffString": "Kapalı",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "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!",
- "WarningThermalRunaway": [
- "Thermal",
- "Runaway"
- ]
- },
- "characters": {
- "SettingRightChar": "R",
- "SettingLeftChar": "L",
- "SettingAutoChar": "O",
- "SettingOffChar": "K",
- "SettingSlowChar": "Y",
- "SettingMediumChar": "O",
- "SettingFastChar": "H",
- "SettingStartNoneChar": "K",
- "SettingStartSolderingChar": "L",
- "SettingStartSleepChar": "U",
- "SettingStartSleepOffChar": "S",
- "SettingSensitivityOff": "K",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "O",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "K",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Power",
- "settings"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Lehimleme",
- "Ayarları"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Uyku",
- "Modları"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Kullanıcı",
- "Arayüzü"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Gelişmiş",
- "Ayarlar"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "GÇKYN",
- ""
- ],
- "desc": "\"Güç Kaynağı\". En düşük çalışma voltajını ayarlar. (DC 10V) (S 3.3V hücre başına)"
- },
- "MinVolCell": {
- "text2": [
- "Minimum",
- "voltage"
- ],
- "desc": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC",
- "voltage"
- ],
- "desc": "Max QC voltage the iron should negotiate for"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "timeout"
- ],
- "desc": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
- },
- "BoostTemperature": {
- "text2": [
- "YKSC",
- ""
- ],
- "desc": "Yüksek Performans Modu Sıcaklığı"
- },
- "AutoStart": {
- "text2": [
- "OTOBAŞ",
- ""
- ],
- "desc": "Güç verildiğinde otomatik olarak lehimleme modunda başlat. (K=Kapalı | L=Lehimleme Modu | U=Uyku Modu | S=Uyku Modu Oda Sıcaklığı)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Temp change",
- "short"
- ],
- "desc": "Kısa basışlardaki sıcaklık derecesi atlama oranı"
- },
- "TempChangeLongStep": {
- "text2": [
- "Temp change",
- "long"
- ],
- "desc": "Uzun başışlardaki sıcaklık derecesi atlama oranı"
- },
- "LockingMode": {
- "text2": [
- "Allow locking",
- "buttons"
- ],
- "desc": "While soldering, hold down both buttons to toggle locking them (K=Kapalı | B=boost mode only | F=full locking)"
- },
- "MotionSensitivity": {
- "text2": [
- "HARHAS",
- ""
- ],
- "desc": "Hareket Hassasiyeti (0=Kapalı | 1=En az duyarlı | ... | 9=En duyarlı)"
- },
- "SleepTemperature": {
- "text2": [
- "BKSC",
- ""
- ],
- "desc": "Bekleme Modu Sıcaklığı (C)"
- },
- "SleepTimeout": {
- "text2": [
- "BMZA",
- ""
- ],
- "desc": "Bekleme Modu Zaman Aşımı (Dakika | Saniye)"
- },
- "ShutdownTimeout": {
- "text2": [
- "KPTZA",
- ""
- ],
- "desc": "Kapatma Zaman Aşımı (Dakika)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall sensor",
- "sensitivity"
- ],
- "desc": "Sensitivity to magnets (0=Kapalı | 1=En az duyarlı | ... | 9=En duyarlı)"
- },
- "TemperatureUnit": {
- "text2": [
- "SCKBRM",
- ""
- ],
- "desc": "Sıcaklık Birimi (C=Celsius | F=Fahrenheit)"
- },
- "DisplayRotation": {
- "text2": [
- "GRNYÖN",
- ""
- ],
- "desc": "Görüntü Yönlendirme (R=Sağlak | L=Solak | O=Otomatik)"
- },
- "CooldownBlink": {
- "text2": [
- "SĞGÖST",
- ""
- ],
- "desc": "Soğutma ekranında uç hala sıcakken derece gösterilsin."
- },
- "ScrollingSpeed": {
- "text2": [
- "YZKYHZ",
- ""
- ],
- "desc": "Bu yazının kayma hızı (Y=Yavaş | H=Hızlı)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Swap",
- "+ - keys"
- ],
- "desc": "\"Düğme Yerleri Rotasyonu\" Sıcaklık ayar düğmelerinin yerini değiştirin"
- },
- "AnimSpeed": {
- "text2": [
- "Anim.",
- "speed"
- ],
- "desc": "Pace of icon animations in menu (K=Kapalı | Y=Yavaş | O=Orta | H=Hızlı)"
- },
- "AnimLoop": {
- "text2": [
- "Anim.",
- "loop"
- ],
- "desc": "Loop icon animations in main menu"
- },
- "Brightness": {
- "text2": [
- "Screen",
- "brightness"
- ],
- "desc": "Adjust the OLED screen brightness"
- },
- "ColourInversion": {
- "text2": [
- "Invert",
- "screen"
- ],
- "desc": "Invert the OLED screen colors"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "AYRBİL",
- ""
- ],
- "desc": "Boş ekranda ayrıntılı bilgileri daha küçük bir yazı tipi ile göster."
- },
- "AdvancedSoldering": {
- "text2": [
- "GELLHM",
- ""
- ],
- "desc": "\"Gelişmiş Lehimleme\" Lehimleme yaparken detaylı bilgi göster"
- },
- "PowerLimit": {
- "text2": [
- "Power",
- "limit"
- ],
- "desc": "Havyanın kullanacağı en yüksek güç (W=Watts)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "VOL KAL?",
- ""
- ],
- "desc": "Voltaj Girişi Kalibrasyonu. Düğmeler ayarlar, çıkmak için uzun bas."
- },
- "PowerPulsePower": {
- "text2": [
- "Power",
- "pulse"
- ],
- "desc": "Güç girişi voltajı ölçüm yoğunluğunu sık tut."
- },
- "PowerPulseWait": {
- "text2": [
- "Power pulse",
- "delay"
- ],
- "desc": "Delay before keep-awake-pulse is triggered (x 2.5s)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Power pulse",
- "duration"
- ],
- "desc": "Keep-awake-pulse duration (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "SIFIRLA?",
- ""
- ],
- "desc": "Bütün ayarları sıfırlar"
- },
- "LanguageSwitch": {
- "text2": [
- "Dil:",
- " TR Türkçe"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "TR",
+ "languageLocalName": "Türkçe",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Sıfırlama Tamam"
+ },
+ "SettingsResetMessage": {
+ "message": "Ayarlar\nSıfırlandı"
+ },
+ "NoAccelerometerMessage": {
+ "message": "No accelerometer\ndetected!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "No USB-PD IC\ndetected!"
+ },
+ "LockingKeysString": {
+ "message": "LOCKED"
+ },
+ "UnlockingKeysString": {
+ "message": "UNLOCKED"
+ },
+ "WarningKeysLockedString": {
+ "message": "!LOCKED!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Thermal\nRunaway"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Ayarları varsayılan değerlere sıfırlamak istediğinizden emin misiniz?"
+ },
+ "UVLOWarningString": {
+ "message": "Güç Az"
+ },
+ "UndervoltageString": {
+ "message": "Düşük Voltaj\n"
+ },
+ "InputVoltageString": {
+ "message": "Giriş V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Bekleme Modu...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Uç: \n"
+ },
+ "OffString": {
+ "message": "Kapalı"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "R",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "O",
+ "SettingOffChar": "K",
+ "SettingSlowChar": "Y",
+ "SettingMediumChar": "O",
+ "SettingFastChar": "H",
+ "SettingStartNoneChar": "K",
+ "SettingStartSolderingChar": "L",
+ "SettingStartSleepChar": "U",
+ "SettingStartSleepOffChar": "S",
+ "SettingLockDisableChar": "K",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Power\nsettings",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Lehimleme\nAyarları",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Uyku\nModları",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Kullanıcı\nArayüzü",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Gelişmiş\nAyarlar",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "GÇKYN\n",
+ "description": "\"Güç Kaynağı\". En düşük çalışma voltajını ayarlar. (DC 10V) (S 3.3V hücre başına)"
+ },
+ "MinVolCell": {
+ "displayText": "Minimum\nvoltage",
+ "description": "Minimum allowed voltage per battery cell (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC\nvoltage",
+ "description": "Max QC voltage the iron should negotiate for"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\ntimeout",
+ "description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "YKSC\n",
+ "description": "Yüksek Performans Modu Sıcaklığı"
+ },
+ "AutoStart": {
+ "displayText": "OTOBAŞ\n",
+ "description": "Güç verildiğinde otomatik olarak lehimleme modunda başlat. (K=Kapalı | L=Lehimleme Modu | U=Uyku Modu | S=Uyku Modu Oda Sıcaklığı)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Temp change\nshort",
+ "description": "Kısa basışlardaki sıcaklık derecesi atlama oranı"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Temp change\nlong",
+ "description": "Uzun başışlardaki sıcaklık derecesi atlama oranı"
+ },
+ "LockingMode": {
+ "displayText": "Allow locking\nbuttons",
+ "description": "While soldering, hold down both buttons to toggle locking them (K=Kapalı | B=boost mode only | F=full locking)"
+ },
+ "MotionSensitivity": {
+ "displayText": "HARHAS\n",
+ "description": "Hareket Hassasiyeti (0=Kapalı | 1=En az duyarlı | ... | 9=En duyarlı)"
+ },
+ "SleepTemperature": {
+ "displayText": "BKSC\n",
+ "description": "Bekleme Modu Sıcaklığı (C)"
+ },
+ "SleepTimeout": {
+ "displayText": "BMZA\n",
+ "description": "Bekleme Modu Zaman Aşımı (Dakika | Saniye)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "KPTZA\n",
+ "description": "Kapatma Zaman Aşımı (Dakika)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall sensor\nsensitivity",
+ "description": "Sensitivity to magnets (0=Kapalı | 1=En az duyarlı | ... | 9=En duyarlı)"
+ },
+ "TemperatureUnit": {
+ "displayText": "SCKBRM\n",
+ "description": "Sıcaklık Birimi (C=Celsius | F=Fahrenheit)"
+ },
+ "DisplayRotation": {
+ "displayText": "GRNYÖN\n",
+ "description": "Görüntü Yönlendirme (R=Sağlak | L=Solak | O=Otomatik)"
+ },
+ "CooldownBlink": {
+ "displayText": "SĞGÖST\n",
+ "description": "Soğutma ekranında uç hala sıcakken derece gösterilsin."
+ },
+ "ScrollingSpeed": {
+ "displayText": "YZKYHZ\n",
+ "description": "Bu yazının kayma hızı (Y=Yavaş | H=Hızlı)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Swap\n+ - keys",
+ "description": "\"Düğme Yerleri Rotasyonu\" Sıcaklık ayar düğmelerinin yerini değiştirin"
+ },
+ "AnimSpeed": {
+ "displayText": "Anim.\nspeed",
+ "description": "Pace of icon animations in menu (K=Kapalı | Y=Yavaş | O=Orta | H=Hızlı)"
+ },
+ "AnimLoop": {
+ "displayText": "Anim.\nloop",
+ "description": "Loop icon animations in main menu"
+ },
+ "Brightness": {
+ "displayText": "Screen\nbrightness",
+ "description": "Adjust the OLED screen brightness"
+ },
+ "ColourInversion": {
+ "displayText": "Invert\nscreen",
+ "description": "Invert the OLED screen colors"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "AYRBİL\n",
+ "description": "Boş ekranda ayrıntılı bilgileri daha küçük bir yazı tipi ile göster."
+ },
+ "AdvancedSoldering": {
+ "displayText": "GELLHM\n",
+ "description": "\"Gelişmiş Lehimleme\" Lehimleme yaparken detaylı bilgi göster"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Power\nlimit",
+ "description": "Havyanın kullanacağı en yüksek güç (W=Watts)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "VOL KAL?\n",
+ "description": "Voltaj Girişi Kalibrasyonu. Düğmeler ayarlar, çıkmak için uzun bas."
+ },
+ "PowerPulsePower": {
+ "displayText": "Power\npulse",
+ "description": "Güç girişi voltajı ölçüm yoğunluğunu sık tut."
+ },
+ "PowerPulseWait": {
+ "displayText": "Power pulse\ndelay",
+ "description": "Delay before keep-awake-pulse is triggered (x 2.5s)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Power pulse\nduration",
+ "description": "Keep-awake-pulse duration (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "SIFIRLA?\n",
+ "description": "Bütün ayarları sıfırlar"
+ },
+ "LanguageSwitch": {
+ "displayText": "Dil:\n TR Türkçe",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_UK.json b/Translations/translation_UK.json
index fc9f297f..873c3f16 100644
--- a/Translations/translation_UK.json
+++ b/Translations/translation_UK.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "UK",
- "languageLocalName": "Українська",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Під час наступного завантаження переконайтеся, що жало і ручка мають кімнатну температуру!",
- "CJCCalibrating": "калібрування",
- "SettingsResetWarning": "Ви дійсно хочете скинути налаштування до значень за замовчуванням? (A=Так, В=Ні)",
- "UVLOWarningString": "АККУМ--",
- "UndervoltageString": "Низька напруга",
- "InputVoltageString": "Жив.(B): ",
- "SleepingSimpleString": "ZzZzz",
- "SleepingAdvancedString": "Очікування...",
- "SleepingTipAdvancedString": "Жало:",
- "OffString": "Вимк",
- "DeviceFailedValidationWarning": "Вірогідно ваш пристрій підробний!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "КХС",
- "відкалібровано!"
- ],
- "ResetOKMessage": "Скид. OK",
- "SettingsResetMessage": [
- "Налаштування",
- "скинуті!"
- ],
- "NoAccelerometerMessage": [
- "Акселерометр",
- "не виявлено!"
- ],
- "NoPowerDeliveryMessage": [
- "USB-PD IC",
- "не виявлено!"
- ],
- "LockingKeysString": "ЗАБЛОК.",
- "UnlockingKeysString": "РОЗБЛОК.",
- "WarningKeysLockedString": "!ЗАБЛОК!",
- "WarningThermalRunaway": [
- "Некерований",
- "розігрів"
- ]
- },
- "characters": {
- "SettingRightChar": "П",
- "SettingLeftChar": "Л",
- "SettingAutoChar": "A",
- "SettingOffChar": "B",
- "SettingSlowChar": "Н",
- "SettingMediumChar": "M",
- "SettingFastChar": "М",
- "SettingStartNoneChar": "В",
- "SettingStartSolderingChar": "П",
- "SettingStartSleepChar": "О",
- "SettingStartSleepOffChar": "К",
- "SettingSensitivityOff": "В",
- "SettingSensitivityLow": "Н",
- "SettingSensitivityMedium": "С",
- "SettingSensitivityHigh": "М",
- "SettingLockDisableChar": "В",
- "SettingLockBoostChar": "Т",
- "SettingLockFullChar": "П"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Параметри",
- "живлення"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Параметри",
- "пайки"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Режим",
- "сну"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Параметри",
- "інтерфейсу"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Додаткові",
- "параметри"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Джерело",
- "живлення"
- ],
- "desc": "Встановлює напругу відсічки. (DC - 10V) (3S - 9.9V | 4S - 13.2V | 5S - 16.5V | 6S - 19.8V)"
- },
- "MinVolCell": {
- "text2": [
- "Мін.",
- "напруга"
- ],
- "desc": "Мінімальна дозволена напруга на комірку (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "Потужність",
- "дж. живлення"
- ],
- "desc": "Потужність джерела живлення в Ватах"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "затримка"
- ],
- "desc": "Затримка у 100мс інкрементах для PD для сумісності з деякими QC зарядними пристроями (0: вимкнено)"
- },
- "BoostTemperature": {
- "text2": [
- "Темпер.",
- "Турбо"
- ],
- "desc": "Температура в \"Турбо\" режимі"
- },
- "AutoStart": {
- "text2": [
- "Гарячий",
- "старт"
- ],
- "desc": "Режим в якому запускається паяльник при ввімкненні (В=Вимк. | П=Пайка | О=Очікування | К=Очікування при кімн. темп.)"
- },
- "TempChangeShortStep": {
- "text2": [
- "Зміна темп.",
- "коротко?"
- ],
- "desc": "Змінювати температуру при короткому натисканні!"
- },
- "TempChangeLongStep": {
- "text2": [
- "Зміна темп.",
- "довго?"
- ],
- "desc": "Змінювати температуру при довгому натисканні!"
- },
- "LockingMode": {
- "text2": [
- "Дозволити",
- "блок. кнопок"
- ],
- "desc": "Під час пайки тривале натискання обох кнопок заблокує їх (В=Вимк | Т=Тільки турбо | П=Повне)"
- },
- "MotionSensitivity": {
- "text2": [
- "Чутливість",
- "сенсору руху"
- ],
- "desc": "Акселерометр (0=Вимк. | 1=мін. чутливості | ... | 9=макс. чутливості)"
- },
- "SleepTemperature": {
- "text2": [
- "Темпер.",
- "сну"
- ],
- "desc": "Температура режиму очікування (C° | F°)"
- },
- "SleepTimeout": {
- "text2": [
- "Тайм-аут",
- "сну"
- ],
- "desc": "Час до переходу в режим очікування (Хвилини | Секунди)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Часу до",
- "вимкнення"
- ],
- "desc": "Час до вимкнення (Хвилини)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Чутливість",
- "Ефекту Холла"
- ],
- "desc": "Чутливість датчика ефекту Холла при виявленні сну (0=Вимк. | 1=мін. чутливості | ... | 9=макс. чутливості)"
- },
- "TemperatureUnit": {
- "text2": [
- "Формат темпе-",
- "ратури(C°/F°)"
- ],
- "desc": "Одиниця виміру температури (C=Цельсій | F=Фаренгейт)"
- },
- "DisplayRotation": {
- "text2": [
- "Автоповорот",
- "екрану"
- ],
- "desc": "Орієнтація дисплея (П=Правша | Л=Лівша | A=Автоповорот)"
- },
- "CooldownBlink": {
- "text2": [
- "Показ t° при",
- "охолодженні"
- ],
- "desc": "Показувати температуру на екрані охолодження, поки жало залишається гарячим, при цьому екран моргає"
- },
- "ScrollingSpeed": {
- "text2": [
- "Швидкість",
- "тексту"
- ],
- "desc": "Швидкість прокрутки тексту (П=повільно | Ш=швидко)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Інвертувати",
- "кнопки +-?"
- ],
- "desc": "Інвертувати кнопки зміни температури."
- },
- "AnimSpeed": {
- "text2": [
- "Швидкість",
- "анімації"
- ],
- "desc": "Швидкість анімації іконок у головному меню (Мілісекунди) (В=Вимк | Н=Низькa | С=Середня | М=Макс)"
- },
- "AnimLoop": {
- "text2": [
- "Циклічна",
- "анімація"
- ],
- "desc": "Циклічна анімація іконок в головному меню"
- },
- "Brightness": {
- "text2": [
- "Яскравість",
- "екрану"
- ],
- "desc": "Налаштування контрасту/яскравості OLED екрану"
- },
- "ColourInversion": {
- "text2": [
- "Інверт",
- "екрану"
- ],
- "desc": "Інвертувати кольори на OLED екрані"
- },
- "LOGOTime": {
- "text2": [
- "Тривалість",
- "логотипу завантаження"
- ],
- "desc": "Встановити тривалість показу лого при завантаженні (с=секунд)"
- },
- "AdvancedIdle": {
- "text2": [
- "Детальний ре-",
- "жим очікуван."
- ],
- "desc": "Показувати детальну інформацію маленьким шрифтом на домашньому екрані"
- },
- "AdvancedSoldering": {
- "text2": [
- "Детальний",
- "режим пайки"
- ],
- "desc": "Показувати детальну інформацію при пайці."
- },
- "PowerLimit": {
- "text2": [
- "Макс.",
- "потуж."
- ],
- "desc": "Макс. потужність, яку може використовувати паяльник (Ват)"
- },
- "CalibrateCJC": {
- "text2": [
- "Калібрувати КХС",
- "при наступному завантаженні"
- ],
- "desc": "При наступному завантаження буде відкалібровано Компенсацію Холодного Спаю жала (непотрібне при різниці температур < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Калібрування",
- "напруги"
- ],
- "desc": "Калібрування напруги входу. Налаштувати кнопками, натиснути і утримати щоб завершити."
- },
- "PowerPulsePower": {
- "text2": [
- "Пульс.",
- "Навантаж."
- ],
- "desc": "Деякі PowerBank-и з часом вимк. живлення, якщо пристрій споживає дуже мало енергії)"
- },
- "PowerPulseWait": {
- "text2": [
- "Час між імп.",
- "напруги"
- ],
- "desc": "Час між імпульсами напруги яка не дає PowerBank-у заснути (x 2.5с)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Тривалість",
- "імп. напруги"
- ],
- "desc": "Тривалість імпульсу напруги яка не дає PowerBank-у заснути (x 250мс)"
- },
- "SettingsReset": {
- "text2": [
- "Скинути всі",
- "налаштування?"
- ],
- "desc": "Скидання всіх параметрів до стандартних значень."
- },
- "LanguageSwitch": {
- "text2": [
- "Мова:",
- " UK Українська"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "UK",
+ "languageLocalName": "Українська",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "КХС\nвідкалібровано!"
+ },
+ "ResetOKMessage": {
+ "message": "Скид. OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Налаштування\nскинуті!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Акселерометр\nне виявлено!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "USB-PD IC\nне виявлено!"
+ },
+ "LockingKeysString": {
+ "message": "ЗАБЛОК."
+ },
+ "UnlockingKeysString": {
+ "message": "РОЗБЛОК."
+ },
+ "WarningKeysLockedString": {
+ "message": "!ЗАБЛОК!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Некерований\nрозігрів"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Під час наступного завантаження переконайтеся, що жало і ручка мають кімнатну температуру!"
+ },
+ "CJCCalibrating": {
+ "message": "калібрування\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Ви дійсно хочете скинути налаштування до значень за замовчуванням? (A=Так, В=Ні)"
+ },
+ "UVLOWarningString": {
+ "message": "АККУМ--"
+ },
+ "UndervoltageString": {
+ "message": "Низька напруга\n"
+ },
+ "InputVoltageString": {
+ "message": "Жив.(B): \n"
+ },
+ "SleepingSimpleString": {
+ "message": "ZzZzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Очікування...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Жало: \n"
+ },
+ "OffString": {
+ "message": "Вимк"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Вірогідно ваш пристрій підробний!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "П",
+ "SettingLeftChar": "Л",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "B",
+ "SettingSlowChar": "Н",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "М",
+ "SettingStartNoneChar": "В",
+ "SettingStartSolderingChar": "П",
+ "SettingStartSleepChar": "О",
+ "SettingStartSleepOffChar": "К",
+ "SettingLockDisableChar": "В",
+ "SettingLockBoostChar": "Т",
+ "SettingLockFullChar": "П"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Параметри\nживлення",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Параметри\nпайки",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Режим\nсну",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Параметри\nінтерфейсу",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Додаткові\nпараметри",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Джерело\nживлення",
+ "description": "Встановлює напругу відсічки. (DC - 10V) (3S - 9.9V | 4S - 13.2V | 5S - 16.5V | 6S - 19.8V)"
+ },
+ "MinVolCell": {
+ "displayText": "Мін.\nнапруга",
+ "description": "Мінімальна дозволена напруга на комірку (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "Потужність\nдж. живлення",
+ "description": "Потужність джерела живлення в Ватах"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\nзатримка",
+ "description": "Затримка у 100мс інкрементах для PD для сумісності з деякими QC зарядними пристроями (0: вимкнено)"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Вмикає режими PPS & EPR."
+ },
+ "BoostTemperature": {
+ "displayText": "Темпер.\nТурбо",
+ "description": "Температура в \"Турбо\" режимі"
+ },
+ "AutoStart": {
+ "displayText": "Гарячий\nстарт",
+ "description": "Режим в якому запускається паяльник при ввімкненні (В=Вимк. | П=Пайка | О=Очікування | К=Очікування при кімн. темп.)"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Зміна темп.\nкоротко?",
+ "description": "Змінювати температуру при короткому натисканні!"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Зміна темп.\nдовго?",
+ "description": "Змінювати температуру при довгому натисканні!"
+ },
+ "LockingMode": {
+ "displayText": "Дозволити\nблок. кнопок",
+ "description": "Під час пайки тривале натискання обох кнопок заблокує їх (В=Вимк | Т=Тільки турбо | П=Повне)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Чутливість\nсенсору руху",
+ "description": "Акселерометр (0=Вимк. | 1=мін. чутливості | ... | 9=макс. чутливості)"
+ },
+ "SleepTemperature": {
+ "displayText": "Темпер.\nсну",
+ "description": "Температура режиму очікування (C° | F°)"
+ },
+ "SleepTimeout": {
+ "displayText": "Тайм-аут\nсну",
+ "description": "Час до переходу в режим очікування (Хвилини | Секунди)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Часу до\nвимкнення",
+ "description": "Час до вимкнення (Хвилини)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Чутливість\nЕфекту Холла",
+ "description": "Чутливість датчика ефекту Холла при виявленні сну (0=Вимк. | 1=мін. чутливості | ... | 9=макс. чутливості)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Формат темпе-\nратури(C°/F°)",
+ "description": "Одиниця виміру температури (C=Цельсій | F=Фаренгейт)"
+ },
+ "DisplayRotation": {
+ "displayText": "Автоповорот\nекрану",
+ "description": "Орієнтація дисплея (П=Правша | Л=Лівша | A=Автоповорот)"
+ },
+ "CooldownBlink": {
+ "displayText": "Показ t° при\nохолодженні",
+ "description": "Показувати температуру на екрані охолодження, поки жало залишається гарячим, при цьому екран моргає"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Швидкість\nтексту",
+ "description": "Швидкість прокрутки тексту (П=повільно | Ш=швидко)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Інвертувати\nкнопки +-?",
+ "description": "Інвертувати кнопки зміни температури."
+ },
+ "AnimSpeed": {
+ "displayText": "Швидкість\nанімації",
+ "description": "Швидкість анімації іконок у головному меню (Мілісекунди) (В=Вимк | Н=Низькa | С=Середня | М=Макс)"
+ },
+ "AnimLoop": {
+ "displayText": "Циклічна\nанімація",
+ "description": "Циклічна анімація іконок в головному меню"
+ },
+ "Brightness": {
+ "displayText": "Яскравість\nекрану",
+ "description": "Налаштування контрасту/яскравості OLED екрану"
+ },
+ "ColourInversion": {
+ "displayText": "Інверт\nекрану",
+ "description": "Інвертувати кольори на OLED екрані"
+ },
+ "LOGOTime": {
+ "displayText": "Тривалість\nлоготипу завантаження",
+ "description": "Встановити тривалість показу лого при завантаженні (с=секунд)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Детальний ре-\nжим очікуван.",
+ "description": "Показувати детальну інформацію маленьким шрифтом на домашньому екрані"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Детальний\nрежим пайки",
+ "description": "Показувати детальну інформацію при пайці."
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Макс.\nпотуж.",
+ "description": "Макс. потужність, яку може використовувати паяльник (Ват)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Калібрувати КХС\nпри наступному завантаженні",
+ "description": "При наступному завантаження буде відкалібровано Компенсацію Холодного Спаю жала (непотрібне при різниці температур < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Калібрування\nнапруги",
+ "description": "Калібрування напруги входу. Налаштувати кнопками, натиснути і утримати щоб завершити."
+ },
+ "PowerPulsePower": {
+ "displayText": "Пульс.\nНавантаж.",
+ "description": "Деякі PowerBank-и з часом вимк. живлення, якщо пристрій споживає дуже мало енергії)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Час між імп.\nнапруги",
+ "description": "Час між імпульсами напруги яка не дає PowerBank-у заснути (x 2.5с)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Тривалість\nімп. напруги",
+ "description": "Тривалість імпульсу напруги яка не дає PowerBank-у заснути (x 250мс)"
+ },
+ "SettingsReset": {
+ "displayText": "Скинути всі\nналаштування?",
+ "description": "Скидання всіх параметрів до стандартних значень."
+ },
+ "LanguageSwitch": {
+ "displayText": "Мова:\n UK Українська",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_VI.json b/Translations/translation_VI.json
index 67bf683f..e4dbeb3d 100644
--- a/Translations/translation_VI.json
+++ b/Translations/translation_VI.json
@@ -1,341 +1,251 @@
-{
- "languageCode": "VI",
- "languageLocalName": "Tieng Viet",
- "tempUnitFahrenheit": false,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "Ban chac chan muon khôi phuc tat ca cài đat ve mac đinh?",
- "UVLOWarningString": "DC thap",
- "UndervoltageString": "Đien áp thap",
- "InputVoltageString": "Đau vào V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Đang ngu...",
- "SleepingTipAdvancedString": "Meo:",
- "OffString": "Tat",
- "DeviceFailedValidationWarning": "Your device is most likely a counterfeit!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": [
- "Calibration",
- "done!"
- ],
- "ResetOKMessage": "Reset OK",
- "SettingsResetMessage": [
- "Mot so cài đat",
- "đã thay đoi"
- ],
- "NoAccelerometerMessage": [
- "Không phát hien",
- "gia toc ke!"
- ],
- "NoPowerDeliveryMessage": [
- "Không phát hien",
- "USB-PD IC!"
- ],
- "LockingKeysString": "Đã khóa",
- "UnlockingKeysString": "Mo khóa",
- "WarningKeysLockedString": "Đã khóa!",
- "WarningThermalRunaway": [
- "Nhiet",
- "Tat gia nhiet"
- ]
- },
- "characters": {
- "SettingRightChar": "R",
- "SettingLeftChar": "L",
- "SettingAutoChar": "A",
- "SettingOffChar": "O",
- "SettingSlowChar": "S",
- "SettingMediumChar": "M",
- "SettingFastChar": "F",
- "SettingStartNoneChar": "O",
- "SettingStartSolderingChar": "S",
- "SettingStartSleepChar": "Z",
- "SettingStartSleepOffChar": "R",
- "SettingSensitivityOff": "O",
- "SettingSensitivityLow": "L",
- "SettingSensitivityMedium": "M",
- "SettingSensitivityHigh": "H",
- "SettingLockDisableChar": "D",
- "SettingLockBoostChar": "B",
- "SettingLockFullChar": "F"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": [
- "Cài đat",
- "nguon đien"
- ],
- "desc": ""
- },
- "SolderingMenu": {
- "text2": [
- "Cài đat",
- "tay hàn"
- ],
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": [
- "Che đo",
- "ngu"
- ],
- "desc": ""
- },
- "UIMenu": {
- "text2": [
- "Giao dien",
- "nguoi dùng"
- ],
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": [
- "Cài đat",
- "nâng cao"
- ],
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": [
- "Nguon",
- "đien"
- ],
- "desc": "Nguon đien, đat đien áp giam. (DC 10V) (S 3.3V moi cell, tat gioi han công suat)"
- },
- "MinVolCell": {
- "text2": [
- "Voltage",
- "toi thieu"
- ],
- "desc": "Đien áp toi thieu cho phép trên moi cell (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
- },
- "QCMaxVoltage": {
- "text2": [
- "QC",
- "voltage"
- ],
- "desc": "Đien áp QC toi đa mà tay hàn yêu cau"
- },
- "PDNegTimeout": {
- "text2": [
- "PD",
- "sau"
- ],
- "desc": "Thoi gian cho đàm phán PD trong các buoc 100ms đe tuong thích voi mot so bo sac QC"
- },
- "BoostTemperature": {
- "text2": [
- "Tăng",
- "nhiet đo"
- ],
- "desc": "Nhiet đo dùng trong che đo \"tăng cuong\""
- },
- "AutoStart": {
- "text2": [
- "Nhiet đo",
- "đang tăng"
- ],
- "desc": "- O=tat | S=nhiet đo hàn | Z=cho o nhiet đo ngu đen khi cu đong | R=cho mà không gia nhiet đen khi cu đong"
- },
- "TempChangeShortStep": {
- "text2": [
- "Thay đoi n.đo",
- "an nút nhanh"
- ],
- "desc": "Biên đo tăng/giam nhiet đo khi an nút nhanh"
- },
- "TempChangeLongStep": {
- "text2": [
- "Thay đoi n.đo",
- "an nút lâu"
- ],
- "desc": "Biên đo tăng/giam nhiet đo khi an nút lâu"
- },
- "LockingMode": {
- "text2": [
- "Cho phép khóa",
- "các nút"
- ],
- "desc": "Trong khi hàn, giu ca 2 nút đe khóa(D=tat | B=chi che đo tăng cuong | F=khóa hoàn toàn)"
- },
- "MotionSensitivity": {
- "text2": [
- "Cam bien",
- "cu đong"
- ],
- "desc": "- 0=tat | 1=đo nhay thap nhat| ... | 9=đo nhay cao nhat"
- },
- "SleepTemperature": {
- "text2": [
- "Nhiet đo",
- "khi ngu"
- ],
- "desc": "Giam nhiet đo khi o \"Che đo ngu\""
- },
- "SleepTimeout": {
- "text2": [
- "Ngu",
- "sau"
- ],
- "desc": "- thoi gian truoc khi \"Che đo ngu\" bat đau (s=giây | m=phút)"
- },
- "ShutdownTimeout": {
- "text2": [
- "Tat",
- "sau"
- ],
- "desc": "- khoang thoi gian truoc khi tay hàn tat (m=phút)"
- },
- "HallEffSensitivity": {
- "text2": [
- "Hall",
- "đo nhay"
- ],
- "desc": "Đo nhay cam bien Hall đe phát hien che đo ngu (0=tat | 1=ít nhay nhat |...| 9=nhay nhat)"
- },
- "TemperatureUnit": {
- "text2": [
- "Đon vi",
- "nhiet đo"
- ],
- "desc": "C= Đo C | F= Đo F"
- },
- "DisplayRotation": {
- "text2": [
- "Huong",
- "hien thi"
- ],
- "desc": "- R=huong tay phai | L=huong tay trái | A=tu đong"
- },
- "CooldownBlink": {
- "text2": [
- "Nguoi đi",
- "chop mat"
- ],
- "desc": "-Nhap nháy nhiet đo sau khi viec gia nhiet tam dung trong khi mui hàn van nóng"
- },
- "ScrollingSpeed": {
- "text2": [
- "Toc đo",
- "cuon"
- ],
- "desc": "Toc đo cuon văn ban(S=cham | F=nhanh)"
- },
- "ReverseButtonTempChange": {
- "text2": [
- "Đao nguoc",
- "nút + -"
- ],
- "desc": "Đao nguoc chuc năng các nút đieu chinh nhiet đo"
- },
- "AnimSpeed": {
- "text2": [
- "Toc đo",
- "hoat anh"
- ],
- "desc": "-Toc đo cua hoat anh menu (O=tat | S=cham | M=trung bình | F=nhanh)"
- },
- "AnimLoop": {
- "text2": [
- "Hoat anh",
- "lap lai"
- ],
- "desc": "Lap lai các hoat anh trong màn hình chính"
- },
- "Brightness": {
- "text2": [
- "Đo tuong phan",
- "màn hình"
- ],
- "desc": "-Đieu chinh đo sáng màn hình OLED"
- },
- "ColourInversion": {
- "text2": [
- "Đao nguoc màu",
- "màn hình"
- ],
- "desc": "-Đao nguoc màu màn hình OLED"
- },
- "LOGOTime": {
- "text2": [
- "Boot logo",
- "duration"
- ],
- "desc": "Set boot logo duration (s=seconds)"
- },
- "AdvancedIdle": {
- "text2": [
- "Chi tiet",
- "màn hình cho"
- ],
- "desc": "- hien thi thông tin chi tiet bang phông chu nho hon trên màn hình cho"
- },
- "AdvancedSoldering": {
- "text2": [
- "Chi tiet",
- "màn hình hàn"
- ],
- "desc": "-Hien thi thông tin bang phông chu nho hon trên màn hình hàn"
- },
- "PowerLimit": {
- "text2": [
- "Công suat",
- "gioi han"
- ],
- "desc": "-Công suat toi đa mà tay hàn có the su dung (W=watt)"
- },
- "CalibrateCJC": {
- "text2": [
- "Calibrate CJC",
- "at next boot"
- ],
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
- },
- "VoltageCalibration": {
- "text2": [
- "Hieu chinh",
- "đien áp đau vào?"
- ],
- "desc": "-bat đau hieu chuan VIN (nhan và giu đe thoát)"
- },
- "PowerPulsePower": {
- "text2": [
- "Công suat",
- "kích nguon"
- ],
- "desc": "-Cuong đo công suat kích nguon (watt)"
- },
- "PowerPulseWait": {
- "text2": [
- "Trì hoãn",
- "đien áp kích"
- ],
- "desc": "Trì hoãn truoc khi kích hoat kích nguon(x 2,5 giây)"
- },
- "PowerPulseDuration": {
- "text2": [
- "Thoi luong",
- "kích nguon"
- ],
- "desc": "-thoi luong kích nguon (x 250ms)"
- },
- "SettingsReset": {
- "text2": [
- "Khôi phuc",
- "cài đat goc?"
- ],
- "desc": "-đat lai tat ca cài đat ve mac đinh"
- },
- "LanguageSwitch": {
- "text2": [
- "Ngôn ngu:",
- " VI Tieng Viet"
- ],
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "VI",
+ "languageLocalName": "Tieng Viet",
+ "tempUnitFahrenheit": false,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration\ndone!"
+ },
+ "ResetOKMessage": {
+ "message": "Reset OK"
+ },
+ "SettingsResetMessage": {
+ "message": "Mot so cài đat\nđã thay đoi"
+ },
+ "NoAccelerometerMessage": {
+ "message": "Không phát hien\ngia toc ke!"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "Không phát hien\nUSB-PD IC!"
+ },
+ "LockingKeysString": {
+ "message": "Đã khóa"
+ },
+ "UnlockingKeysString": {
+ "message": "Mo khóa"
+ },
+ "WarningKeysLockedString": {
+ "message": "Đã khóa!"
+ },
+ "WarningThermalRunaway": {
+ "message": "Nhiet\nTat gia nhiet"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating\n"
+ },
+ "SettingsResetWarning": {
+ "message": "Ban chac chan muon khôi phuc tat ca cài đat ve mac đinh?"
+ },
+ "UVLOWarningString": {
+ "message": "DC thap"
+ },
+ "UndervoltageString": {
+ "message": "Đien áp thap\n"
+ },
+ "InputVoltageString": {
+ "message": "Đau vào V: \n"
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Đang ngu...\n"
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Meo: \n"
+ },
+ "OffString": {
+ "message": "Tat"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "Your device is most likely a counterfeit!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "R",
+ "SettingLeftChar": "L",
+ "SettingAutoChar": "A",
+ "SettingOffChar": "O",
+ "SettingSlowChar": "S",
+ "SettingMediumChar": "M",
+ "SettingFastChar": "F",
+ "SettingStartNoneChar": "O",
+ "SettingStartSolderingChar": "S",
+ "SettingStartSleepChar": "Z",
+ "SettingStartSleepOffChar": "R",
+ "SettingLockDisableChar": "D",
+ "SettingLockBoostChar": "B",
+ "SettingLockFullChar": "F"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "Cài đat\nnguon đien",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "Cài đat\ntay hàn",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "Che đo\nngu",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "Giao dien\nnguoi dùng",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "Cài đat\nnâng cao",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "Nguon\nđien",
+ "description": "Nguon đien, đat đien áp giam. (DC 10V) (S 3.3V moi cell, tat gioi han công suat)"
+ },
+ "MinVolCell": {
+ "displayText": "Voltage\ntoi thieu",
+ "description": "Đien áp toi thieu cho phép trên moi cell (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC\nvoltage",
+ "description": "Đien áp QC toi đa mà tay hàn yêu cau"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD\nsau",
+ "description": "Thoi gian cho đàm phán PD trong các buoc 100ms đe tuong thích voi mot so bo sac QC"
+ },
+ "PDVpdo": {
+ "displayText": "PD\nVPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "Tăng\nnhiet đo",
+ "description": "Nhiet đo dùng trong che đo \"tăng cuong\""
+ },
+ "AutoStart": {
+ "displayText": "Nhiet đo\nđang tăng",
+ "description": "- O=tat | S=nhiet đo hàn | Z=cho o nhiet đo ngu đen khi cu đong | R=cho mà không gia nhiet đen khi cu đong"
+ },
+ "TempChangeShortStep": {
+ "displayText": "Thay đoi n.đo\nan nút nhanh",
+ "description": "Biên đo tăng/giam nhiet đo khi an nút nhanh"
+ },
+ "TempChangeLongStep": {
+ "displayText": "Thay đoi n.đo\nan nút lâu",
+ "description": "Biên đo tăng/giam nhiet đo khi an nút lâu"
+ },
+ "LockingMode": {
+ "displayText": "Cho phép khóa\ncác nút",
+ "description": "Trong khi hàn, giu ca 2 nút đe khóa(D=tat | B=chi che đo tăng cuong | F=khóa hoàn toàn)"
+ },
+ "MotionSensitivity": {
+ "displayText": "Cam bien\ncu đong",
+ "description": "- 0=tat | 1=đo nhay thap nhat| ... | 9=đo nhay cao nhat"
+ },
+ "SleepTemperature": {
+ "displayText": "Nhiet đo\nkhi ngu",
+ "description": "Giam nhiet đo khi o \"Che đo ngu\""
+ },
+ "SleepTimeout": {
+ "displayText": "Ngu\nsau",
+ "description": "- thoi gian truoc khi \"Che đo ngu\" bat đau (s=giây | m=phút)"
+ },
+ "ShutdownTimeout": {
+ "displayText": "Tat\nsau",
+ "description": "- khoang thoi gian truoc khi tay hàn tat (m=phút)"
+ },
+ "HallEffSensitivity": {
+ "displayText": "Hall\nđo nhay",
+ "description": "Đo nhay cam bien Hall đe phát hien che đo ngu (0=tat | 1=ít nhay nhat |...| 9=nhay nhat)"
+ },
+ "TemperatureUnit": {
+ "displayText": "Đon vi\nnhiet đo",
+ "description": "C= Đo C | F= Đo F"
+ },
+ "DisplayRotation": {
+ "displayText": "Huong\nhien thi",
+ "description": "- R=huong tay phai | L=huong tay trái | A=tu đong"
+ },
+ "CooldownBlink": {
+ "displayText": "Nguoi đi\nchop mat",
+ "description": "-Nhap nháy nhiet đo sau khi viec gia nhiet tam dung trong khi mui hàn van nóng"
+ },
+ "ScrollingSpeed": {
+ "displayText": "Toc đo\ncuon",
+ "description": "Toc đo cuon văn ban(S=cham | F=nhanh)"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "Đao nguoc\nnút + -",
+ "description": "Đao nguoc chuc năng các nút đieu chinh nhiet đo"
+ },
+ "AnimSpeed": {
+ "displayText": "Toc đo\nhoat anh",
+ "description": "-Toc đo cua hoat anh menu (O=tat | S=cham | M=trung bình | F=nhanh)"
+ },
+ "AnimLoop": {
+ "displayText": "Hoat anh\nlap lai",
+ "description": "Lap lai các hoat anh trong màn hình chính"
+ },
+ "Brightness": {
+ "displayText": "Đo tuong phan\nmàn hình",
+ "description": "-Đieu chinh đo sáng màn hình OLED"
+ },
+ "ColourInversion": {
+ "displayText": "Đao nguoc màu\nmàn hình",
+ "description": "-Đao nguoc màu màn hình OLED"
+ },
+ "LOGOTime": {
+ "displayText": "Boot logo\nduration",
+ "description": "Set boot logo duration (s=seconds)"
+ },
+ "AdvancedIdle": {
+ "displayText": "Chi tiet\nmàn hình cho",
+ "description": "- hien thi thông tin chi tiet bang phông chu nho hon trên màn hình cho"
+ },
+ "AdvancedSoldering": {
+ "displayText": "Chi tiet\nmàn hình hàn",
+ "description": "-Hien thi thông tin bang phông chu nho hon trên màn hình hàn"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth\n",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "Công suat\ngioi han",
+ "description": "-Công suat toi đa mà tay hàn có the su dung (W=watt)"
+ },
+ "CalibrateCJC": {
+ "displayText": "Calibrate CJC\nat next boot",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "Hieu chinh\nđien áp đau vào?",
+ "description": "-bat đau hieu chuan VIN (nhan và giu đe thoát)"
+ },
+ "PowerPulsePower": {
+ "displayText": "Công suat\nkích nguon",
+ "description": "-Cuong đo công suat kích nguon (watt)"
+ },
+ "PowerPulseWait": {
+ "displayText": "Trì hoãn\nđien áp kích",
+ "description": "Trì hoãn truoc khi kích hoat kích nguon(x 2,5 giây)"
+ },
+ "PowerPulseDuration": {
+ "displayText": "Thoi luong\nkích nguon",
+ "description": "-thoi luong kích nguon (x 250ms)"
+ },
+ "SettingsReset": {
+ "displayText": "Khôi phuc\ncài đat goc?",
+ "description": "-đat lai tat ca cài đat ve mac đinh"
+ },
+ "LanguageSwitch": {
+ "displayText": "Ngôn ngu:\n VI Tieng Viet",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_YUE_HK.json b/Translations/translation_YUE_HK.json
index 8a343953..069671b4 100644
--- a/Translations/translation_YUE_HK.json
+++ b/Translations/translation_YUE_HK.json
@@ -1,209 +1,251 @@
-{
- "languageCode": "YUE_HK",
- "languageLocalName": "廣東話 (香港)",
- "tempUnitFahrenheit": true,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "你係咪確定要將全部設定重設到預設值?",
- "UVLOWarningString": "電壓過低",
- "UndervoltageString": "Undervoltage",
- "InputVoltageString": "Input V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Sleeping...",
- "SleepingTipAdvancedString": "Tip:",
- "OffString": "關",
- "DeviceFailedValidationWarning": "依支焫雞好有可能係冒牌貨!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": "Calibration done!",
- "ResetOKMessage": "已重設!",
- "SettingsResetMessage": "設定已被重設!",
- "NoAccelerometerMessage": "未能偵測加速度計",
- "NoPowerDeliveryMessage": "未能偵測PD晶片",
- "LockingKeysString": "已鎖定",
- "UnlockingKeysString": "已解除鎖定",
- "WarningKeysLockedString": "!撳掣鎖定!",
- "WarningThermalRunaway": "加熱失控"
- },
- "characters": {
- "SettingRightChar": "右",
- "SettingLeftChar": "左",
- "SettingAutoChar": "自",
- "SettingOffChar": "關",
- "SettingSlowChar": "慢",
- "SettingMediumChar": "中",
- "SettingFastChar": "快",
- "SettingStartNoneChar": "無",
- "SettingStartSolderingChar": "焊",
- "SettingStartSleepChar": "待",
- "SettingStartSleepOffChar": "室",
- "SettingSensitivityOff": "關",
- "SettingSensitivityLow": "低",
- "SettingSensitivityMedium": "中",
- "SettingSensitivityHigh": "高",
- "SettingLockDisableChar": "無",
- "SettingLockBoostChar": "增",
- "SettingLockFullChar": "全"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": "電源設定",
- "desc": ""
- },
- "SolderingMenu": {
- "text2": "焊接設定",
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": "待機設定",
- "desc": ""
- },
- "UIMenu": {
- "text2": "使用者介面",
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": "進階設定",
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": "電源",
- "desc": "輸入電源;設定自動停機電壓 "
- },
- "MinVolCell": {
- "text2": "最低電壓",
- "desc": "每粒電池嘅最低可用電壓 <伏特> <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
- },
- "QCMaxVoltage": {
- "text2": "QC電壓",
- "desc": "使用QC電源時請求嘅最高目標電壓"
- },
- "PDNegTimeout": {
- "text2": "PD逾時",
- "desc": "設定USB PD協定交涉嘅逾時時限;為兼容某啲QC電源而設 "
- },
- "BoostTemperature": {
- "text2": "增熱温度",
- "desc": "喺增熱模式時使用嘅温度"
- },
- "AutoStart": {
- "text2": "自動啓用",
- "desc": "開機時自動啓用 <無=停用 | 焊=焊接模式 | 待=待機模式 | 室=室温待機>"
- },
- "TempChangeShortStep": {
- "text2": "温度調整 短",
- "desc": "調校温度時短撳一下嘅温度變幅"
- },
- "TempChangeLongStep": {
- "text2": "温度調整 長",
- "desc": "調校温度時長撳嘅温度變幅"
- },
- "LockingMode": {
- "text2": "撳掣鎖定",
- "desc": "喺焊接模式時,同時長撳兩粒掣啓用撳掣鎖定 <無=停用 | 增=淨係容許增熱模式 | 全=鎖定全部>"
- },
- "MotionSensitivity": {
- "text2": "動作敏感度",
- "desc": "0=停用 | 1=最低敏感度 | ... | 9=最高敏感度"
- },
- "SleepTemperature": {
- "text2": "待機温度",
- "desc": "喺待機模式時嘅焫雞咀温度"
- },
- "SleepTimeout": {
- "text2": "待機延時",
- "desc": "自動進入待機模式前嘅閒置等候時間 "
- },
- "ShutdownTimeout": {
- "text2": "自動熄機",
- "desc": "自動熄機前嘅閒置等候時間 "
- },
- "HallEffSensitivity": {
- "text2": "磁場敏感度",
- "desc": "磁場感應器用嚟啓動待機模式嘅敏感度 <0=停用 | 1=最低敏感度 | ... | 9=最高敏感度>"
- },
- "TemperatureUnit": {
- "text2": "温度單位",
- "desc": "C=攝氏 | F=華氏"
- },
- "DisplayRotation": {
- "text2": "畫面方向",
- "desc": "右=使用右手 | 左=使用左手 | 自=自動"
- },
- "CooldownBlink": {
- "text2": "降温時閃爍",
- "desc": "停止加熱之後,當焫雞咀仲係熱嗰陣閃爍畫面"
- },
- "ScrollingSpeed": {
- "text2": "捲動速度",
- "desc": "解說文字嘅捲動速度"
- },
- "ReverseButtonTempChange": {
- "text2": "反轉加減掣",
- "desc": "反轉調校温度時加減掣嘅方向"
- },
- "AnimSpeed": {
- "text2": "動畫速度",
- "desc": "功能表圖示動畫嘅速度 <關=不顯示動畫 | 慢=慢速 | 中=中速 | 快=快速>"
- },
- "AnimLoop": {
- "text2": "動畫循環",
- "desc": "循環顯示功能表圖示動畫"
- },
- "Brightness": {
- "text2": "熒幕亮度",
- "desc": "設定OLED熒幕嘅亮度"
- },
- "ColourInversion": {
- "text2": "熒幕反轉色",
- "desc": "反轉OLED熒幕嘅黑白色"
- },
- "LOGOTime": {
- "text2": "開機畫面",
- "desc": "設定開機畫面顯示時長 "
- },
- "AdvancedIdle": {
- "text2": "詳細閒置畫面",
- "desc": "喺閒置畫面以英文細字顯示詳細嘅資料"
- },
- "AdvancedSoldering": {
- "text2": "詳細焊接畫面",
- "desc": "喺焊接模式畫面以英文細字顯示詳細嘅資料"
- },
- "PowerLimit": {
- "text2": "功率限制",
- "desc": "限制焫雞可用嘅最大功率 "
- },
- "CalibrateCJC": {
- "text2": "校正CJC",
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
- },
- "VoltageCalibration": {
- "text2": "輸入電壓校正?",
- "desc": "開始校正VIN輸入電壓 <長撳以退出>"
- },
- "PowerPulsePower": {
- "text2": "電源脈衝",
- "desc": "為保持電源喚醒而通電所用嘅功率 "
- },
- "PowerPulseWait": {
- "text2": "電源脈衝間隔",
- "desc": "為保持電源喚醒,每次通電之間嘅間隔時間 "
- },
- "PowerPulseDuration": {
- "text2": "電源脈衝時長",
- "desc": "為保持電源喚醒,每次通電脈衝嘅時間長度 "
- },
- "SettingsReset": {
- "text2": "全部重設?",
- "desc": "將所有設定重設到預設值"
- },
- "LanguageSwitch": {
- "text2": "語言: 廣東話",
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "YUE_HK",
+ "languageLocalName": "廣東話 (香港)",
+ "tempUnitFahrenheit": true,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration done!"
+ },
+ "ResetOKMessage": {
+ "message": "已重設!"
+ },
+ "SettingsResetMessage": {
+ "message": "設定已被重設!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "未能偵測加速度計"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "未能偵測PD晶片"
+ },
+ "LockingKeysString": {
+ "message": "已鎖定"
+ },
+ "UnlockingKeysString": {
+ "message": "已解除鎖定"
+ },
+ "WarningKeysLockedString": {
+ "message": "!撳掣鎖定!"
+ },
+ "WarningThermalRunaway": {
+ "message": "加熱失控"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating"
+ },
+ "SettingsResetWarning": {
+ "message": "你係咪確定要將全部設定重設到預設值?"
+ },
+ "UVLOWarningString": {
+ "message": "電壓過低"
+ },
+ "UndervoltageString": {
+ "message": "Undervoltage"
+ },
+ "InputVoltageString": {
+ "message": "Input V: "
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Sleeping..."
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Tip: "
+ },
+ "OffString": {
+ "message": "關"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "依支焫雞好有可能係冒牌貨!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "右",
+ "SettingLeftChar": "左",
+ "SettingAutoChar": "自",
+ "SettingOffChar": "關",
+ "SettingSlowChar": "慢",
+ "SettingMediumChar": "中",
+ "SettingFastChar": "快",
+ "SettingStartNoneChar": "無",
+ "SettingStartSolderingChar": "焊",
+ "SettingStartSleepChar": "待",
+ "SettingStartSleepOffChar": "室",
+ "SettingLockDisableChar": "無",
+ "SettingLockBoostChar": "增",
+ "SettingLockFullChar": "全"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "電源設定",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "焊接設定",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "待機設定",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "使用者介面",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "進階設定",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "電源",
+ "description": "輸入電源;設定自動停機電壓 "
+ },
+ "MinVolCell": {
+ "displayText": "最低電壓",
+ "description": "每粒電池嘅最低可用電壓 <伏特> <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC電壓",
+ "description": "使用QC電源時請求嘅最高目標電壓"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD逾時",
+ "description": "設定USB PD協定交涉嘅逾時時限;為兼容某啲QC電源而設 "
+ },
+ "PDVpdo": {
+ "displayText": "PD VPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "增熱温度",
+ "description": "喺增熱模式時使用嘅温度"
+ },
+ "AutoStart": {
+ "displayText": "自動啓用",
+ "description": "開機時自動啓用 <無=停用 | 焊=焊接模式 | 待=待機模式 | 室=室温待機>"
+ },
+ "TempChangeShortStep": {
+ "displayText": "温度調整 短",
+ "description": "調校温度時短撳一下嘅温度變幅"
+ },
+ "TempChangeLongStep": {
+ "displayText": "温度調整 長",
+ "description": "調校温度時長撳嘅温度變幅"
+ },
+ "LockingMode": {
+ "displayText": "撳掣鎖定",
+ "description": "喺焊接模式時,同時長撳兩粒掣啓用撳掣鎖定 <無=停用 | 增=淨係容許增熱模式 | 全=鎖定全部>"
+ },
+ "MotionSensitivity": {
+ "displayText": "動作敏感度",
+ "description": "0=停用 | 1=最低敏感度 | ... | 9=最高敏感度"
+ },
+ "SleepTemperature": {
+ "displayText": "待機温度",
+ "description": "喺待機模式時嘅焫雞咀温度"
+ },
+ "SleepTimeout": {
+ "displayText": "待機延時",
+ "description": "自動進入待機模式前嘅閒置等候時間 "
+ },
+ "ShutdownTimeout": {
+ "displayText": "自動熄機",
+ "description": "自動熄機前嘅閒置等候時間 "
+ },
+ "HallEffSensitivity": {
+ "displayText": "磁場敏感度",
+ "description": "磁場感應器用嚟啓動待機模式嘅敏感度 <0=停用 | 1=最低敏感度 | ... | 9=最高敏感度>"
+ },
+ "TemperatureUnit": {
+ "displayText": "温度單位",
+ "description": "C=攝氏 | F=華氏"
+ },
+ "DisplayRotation": {
+ "displayText": "畫面方向",
+ "description": "右=使用右手 | 左=使用左手 | 自=自動"
+ },
+ "CooldownBlink": {
+ "displayText": "降温時閃爍",
+ "description": "停止加熱之後,當焫雞咀仲係熱嗰陣閃爍畫面"
+ },
+ "ScrollingSpeed": {
+ "displayText": "捲動速度",
+ "description": "解說文字嘅捲動速度"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "反轉加減掣",
+ "description": "反轉調校温度時加減掣嘅方向"
+ },
+ "AnimSpeed": {
+ "displayText": "動畫速度",
+ "description": "功能表圖示動畫嘅速度 <關=不顯示動畫 | 慢=慢速 | 中=中速 | 快=快速>"
+ },
+ "AnimLoop": {
+ "displayText": "動畫循環",
+ "description": "循環顯示功能表圖示動畫"
+ },
+ "Brightness": {
+ "displayText": "熒幕亮度",
+ "description": "設定OLED熒幕嘅亮度"
+ },
+ "ColourInversion": {
+ "displayText": "熒幕反轉色",
+ "description": "反轉OLED熒幕嘅黑白色"
+ },
+ "LOGOTime": {
+ "displayText": "開機畫面",
+ "description": "設定開機畫面顯示時長 "
+ },
+ "AdvancedIdle": {
+ "displayText": "詳細閒置畫面",
+ "description": "喺閒置畫面以英文細字顯示詳細嘅資料"
+ },
+ "AdvancedSoldering": {
+ "displayText": "詳細焊接畫面",
+ "description": "喺焊接模式畫面以英文細字顯示詳細嘅資料"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "功率限制",
+ "description": "限制焫雞可用嘅最大功率 "
+ },
+ "CalibrateCJC": {
+ "displayText": "校正CJC",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "輸入電壓校正?",
+ "description": "開始校正VIN輸入電壓 <長撳以退出>"
+ },
+ "PowerPulsePower": {
+ "displayText": "電源脈衝",
+ "description": "為保持電源喚醒而通電所用嘅功率 "
+ },
+ "PowerPulseWait": {
+ "displayText": "電源脈衝間隔",
+ "description": "為保持電源喚醒,每次通電之間嘅間隔時間 "
+ },
+ "PowerPulseDuration": {
+ "displayText": "電源脈衝時長",
+ "description": "為保持電源喚醒,每次通電脈衝嘅時間長度 "
+ },
+ "SettingsReset": {
+ "displayText": "全部重設?",
+ "description": "將所有設定重設到預設值"
+ },
+ "LanguageSwitch": {
+ "displayText": "語言: 廣東話",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_ZH_CN.json b/Translations/translation_ZH_CN.json
index a005fa84..5ef18c92 100644
--- a/Translations/translation_ZH_CN.json
+++ b/Translations/translation_ZH_CN.json
@@ -1,209 +1,251 @@
-{
- "languageCode": "ZH_CN",
- "languageLocalName": "简体中文",
- "tempUnitFahrenheit": true,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "你是否确定要将全部设定重置为默认值?",
- "UVLOWarningString": "电压过低",
- "UndervoltageString": "Undervoltage",
- "InputVoltageString": "VIN: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Zzzz...",
- "SleepingTipAdvancedString": "--->",
- "OffString": "关",
- "DeviceFailedValidationWarning": "这支电烙铁很有可能是冒牌货!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": "Calibration done!",
- "ResetOKMessage": "已重置!",
- "SettingsResetMessage": "设定已被重置!",
- "NoAccelerometerMessage": "未检测到加速度计",
- "NoPowerDeliveryMessage": "未检测到PD电路",
- "LockingKeysString": "已锁定",
- "UnlockingKeysString": "已解锁",
- "WarningKeysLockedString": "!按键锁定!",
- "WarningThermalRunaway": "加热失控"
- },
- "characters": {
- "SettingRightChar": "右",
- "SettingLeftChar": "左",
- "SettingAutoChar": "自",
- "SettingOffChar": "关",
- "SettingSlowChar": "慢",
- "SettingMediumChar": "中",
- "SettingFastChar": "快",
- "SettingStartNoneChar": "无",
- "SettingStartSolderingChar": "焊",
- "SettingStartSleepChar": "待",
- "SettingStartSleepOffChar": "室",
- "SettingSensitivityOff": "关",
- "SettingSensitivityLow": "低",
- "SettingSensitivityMedium": "中",
- "SettingSensitivityHigh": "高",
- "SettingLockDisableChar": "无",
- "SettingLockBoostChar": "增",
- "SettingLockFullChar": "全"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": "电源设置",
- "desc": ""
- },
- "SolderingMenu": {
- "text2": "焊接设置",
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": "待机设置",
- "desc": ""
- },
- "UIMenu": {
- "text2": "用户界面",
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": "高级设置",
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": "下限电压",
- "desc": "设置自动停机电压 "
- },
- "MinVolCell": {
- "text2": "最低电压",
- "desc": "每节电池的最低允许电压 <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
- },
- "QCMaxVoltage": {
- "text2": "QC电压",
- "desc": "使用QC电源时请求的最高目标电压"
- },
- "PDNegTimeout": {
- "text2": "PD超时",
- "desc": "设定USB-PD协议交涉的超时时限;为兼容某些QC电源而设 "
- },
- "BoostTemperature": {
- "text2": "增热温度",
- "desc": "增热模式时使用的温度"
- },
- "AutoStart": {
- "text2": "自动启动",
- "desc": "开机时自动启动 <无=禁用 | 焊=焊接模式 | 待=待机模式 | 室=室温待机>"
- },
- "TempChangeShortStep": {
- "text2": "短按温度调整",
- "desc": "调校温度时短按按键的温度变幅"
- },
- "TempChangeLongStep": {
- "text2": "长按温度调整",
- "desc": "调校温度时长按按键的温度变幅"
- },
- "LockingMode": {
- "text2": "按键锁定",
- "desc": "焊接模式时,同时长按两个按键启用按键锁定 <无=禁用 | 增=只容许增热模式 | 全=完全锁定>"
- },
- "MotionSensitivity": {
- "text2": "动作灵敏度",
- "desc": "0=禁用 | 1=最低灵敏度 | ... | 9=最高灵敏度"
- },
- "SleepTemperature": {
- "text2": "待机温度",
- "desc": "待机模式时的烙铁头温度"
- },
- "SleepTimeout": {
- "text2": "待机超时",
- "desc": "自动进入待机模式前的等候时间 "
- },
- "ShutdownTimeout": {
- "text2": "自动关机",
- "desc": "自动关机前的等候时间 "
- },
- "HallEffSensitivity": {
- "text2": "磁场灵敏度",
- "desc": "霍尔效应传感器用作启动待机模式的灵敏度 <0=禁用 | 1=最低灵敏度 | ... | 9=最高灵敏度>"
- },
- "TemperatureUnit": {
- "text2": "温度单位",
- "desc": "C=摄氏 | F=华氏"
- },
- "DisplayRotation": {
- "text2": "显示方向",
- "desc": "右=右手 | 左=左手 | 自=自动"
- },
- "CooldownBlink": {
- "text2": "降温时闪显",
- "desc": "停止加热之后,闪动温度显示提醒烙铁头仍处于高温状态"
- },
- "ScrollingSpeed": {
- "text2": "滚动速度",
- "desc": "解说文字的滚动速度"
- },
- "ReverseButtonTempChange": {
- "text2": "调换加减键",
- "desc": "调校温度时更换加减键的方向"
- },
- "AnimSpeed": {
- "text2": "动画速度",
- "desc": "主菜单中功能图标动画的播放速度 <关=不显示动画 | 慢=慢速 | 中=中速 | 快=快速>"
- },
- "AnimLoop": {
- "text2": "动画循环",
- "desc": "主菜单中循环播放功能图标动画"
- },
- "Brightness": {
- "text2": "屏幕亮度",
- "desc": "调整OLED屏幕的亮度"
- },
- "ColourInversion": {
- "text2": "反转屏幕颜色",
- "desc": "反转OLED黑/白屏幕"
- },
- "LOGOTime": {
- "text2": "开机画面",
- "desc": "设定开机画面显示时长 "
- },
- "AdvancedIdle": {
- "text2": "闲置画面详情",
- "desc": "闲置画面以英语小字体显示详情"
- },
- "AdvancedSoldering": {
- "text2": "焊接画面详情",
- "desc": "焊接模式画面以英语小字体显示详请"
- },
- "PowerLimit": {
- "text2": "功率限制",
- "desc": "限制烙铁可用的最大功率 "
- },
- "CalibrateCJC": {
- "text2": "校正CJC",
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
- },
- "VoltageCalibration": {
- "text2": "输入电压校正?",
- "desc": "开始校正输入电压(VIN)<长按以退出>"
- },
- "PowerPulsePower": {
- "text2": "电源脉冲",
- "desc": "为保持电源处于唤醒状态所用的功率 "
- },
- "PowerPulseWait": {
- "text2": "电源脉冲间隔",
- "desc": "为保持电源处于唤醒状态,每次通电之间的间隔时间 "
- },
- "PowerPulseDuration": {
- "text2": "电源脉冲时长",
- "desc": "为保持电源处于唤醒状态,每次通电脉冲的时间长度 "
- },
- "SettingsReset": {
- "text2": "全部重置?",
- "desc": "将所有设定重置为默认值"
- },
- "LanguageSwitch": {
- "text2": "语言:简体中文",
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "ZH_CN",
+ "languageLocalName": "简体中文",
+ "tempUnitFahrenheit": true,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration done!"
+ },
+ "ResetOKMessage": {
+ "message": "已重置!"
+ },
+ "SettingsResetMessage": {
+ "message": "设定已被重置!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "未检测到加速度计"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "未检测到PD电路"
+ },
+ "LockingKeysString": {
+ "message": "已锁定"
+ },
+ "UnlockingKeysString": {
+ "message": "已解锁"
+ },
+ "WarningKeysLockedString": {
+ "message": "!按键锁定!"
+ },
+ "WarningThermalRunaway": {
+ "message": "加热失控"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating"
+ },
+ "SettingsResetWarning": {
+ "message": "你是否确定要将全部设定重置为默认值?"
+ },
+ "UVLOWarningString": {
+ "message": "电压过低"
+ },
+ "UndervoltageString": {
+ "message": "Undervoltage"
+ },
+ "InputVoltageString": {
+ "message": "VIN: "
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Zzzz..."
+ },
+ "SleepingTipAdvancedString": {
+ "message": "<--- "
+ },
+ "OffString": {
+ "message": "关"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "这支电烙铁很有可能是冒牌货!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "右",
+ "SettingLeftChar": "左",
+ "SettingAutoChar": "自",
+ "SettingOffChar": "关",
+ "SettingSlowChar": "慢",
+ "SettingMediumChar": "中",
+ "SettingFastChar": "快",
+ "SettingStartNoneChar": "无",
+ "SettingStartSolderingChar": "焊",
+ "SettingStartSleepChar": "待",
+ "SettingStartSleepOffChar": "室",
+ "SettingLockDisableChar": "无",
+ "SettingLockBoostChar": "增",
+ "SettingLockFullChar": "全"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "电源设置",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "焊接设置",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "待机设置",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "用户界面",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "高级设置",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "下限电压",
+ "description": "设置自动停机电压 "
+ },
+ "MinVolCell": {
+ "displayText": "最低电压",
+ "description": "每节电池的最低允许电压 <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC电压",
+ "description": "使用QC电源时请求的最高目标电压"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD超时",
+ "description": "设定USB-PD协议交涉的超时时限;为兼容某些QC电源而设 "
+ },
+ "PDVpdo": {
+ "displayText": "PD VPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "增热温度",
+ "description": "增热模式时使用的温度"
+ },
+ "AutoStart": {
+ "displayText": "自动启动",
+ "description": "开机时自动启动 <无=禁用 | 焊=焊接模式 | 待=待机模式 | 室=室温待机>"
+ },
+ "TempChangeShortStep": {
+ "displayText": "短按温度调整",
+ "description": "调校温度时短按按键的温度变幅"
+ },
+ "TempChangeLongStep": {
+ "displayText": "长按温度调整",
+ "description": "调校温度时长按按键的温度变幅"
+ },
+ "LockingMode": {
+ "displayText": "按键锁定",
+ "description": "焊接模式时,同时长按两个按键启用按键锁定 <无=禁用 | 增=只容许增热模式 | 全=完全锁定>"
+ },
+ "MotionSensitivity": {
+ "displayText": "动作灵敏度",
+ "description": "0=禁用 | 1=最低灵敏度 | ... | 9=最高灵敏度"
+ },
+ "SleepTemperature": {
+ "displayText": "待机温度",
+ "description": "待机模式时的烙铁头温度"
+ },
+ "SleepTimeout": {
+ "displayText": "待机超时",
+ "description": "自动进入待机模式前的等候时间 "
+ },
+ "ShutdownTimeout": {
+ "displayText": "自动关机",
+ "description": "自动关机前的等候时间 "
+ },
+ "HallEffSensitivity": {
+ "displayText": "磁场灵敏度",
+ "description": "霍尔效应传感器用作启动待机模式的灵敏度 <0=禁用 | 1=最低灵敏度 | ... | 9=最高灵敏度>"
+ },
+ "TemperatureUnit": {
+ "displayText": "温度单位",
+ "description": "C=摄氏 | F=华氏"
+ },
+ "DisplayRotation": {
+ "displayText": "显示方向",
+ "description": "右=右手 | 左=左手 | 自=自动"
+ },
+ "CooldownBlink": {
+ "displayText": "降温时闪显",
+ "description": "停止加热之后,闪动温度显示提醒烙铁头仍处于高温状态"
+ },
+ "ScrollingSpeed": {
+ "displayText": "滚动速度",
+ "description": "解说文字的滚动速度"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "调换加减键",
+ "description": "调校温度时更换加减键的方向"
+ },
+ "AnimSpeed": {
+ "displayText": "动画速度",
+ "description": "主菜单中功能图标动画的播放速度 <关=不显示动画 | 慢=慢速 | 中=中速 | 快=快速>"
+ },
+ "AnimLoop": {
+ "displayText": "动画循环",
+ "description": "主菜单中循环播放功能图标动画"
+ },
+ "Brightness": {
+ "displayText": "屏幕亮度",
+ "description": "调整OLED屏幕的亮度"
+ },
+ "ColourInversion": {
+ "displayText": "反转屏幕颜色",
+ "description": "反转OLED黑/白屏幕"
+ },
+ "LOGOTime": {
+ "displayText": "开机画面",
+ "description": "设定开机画面显示时长 "
+ },
+ "AdvancedIdle": {
+ "displayText": "闲置画面详情",
+ "description": "闲置画面以英语小字体显示详情"
+ },
+ "AdvancedSoldering": {
+ "displayText": "焊接画面详情",
+ "description": "焊接模式画面以英语小字体显示详请"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "功率限制",
+ "description": "限制烙铁可用的最大功率 "
+ },
+ "CalibrateCJC": {
+ "displayText": "校正CJC",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "输入电压校正?",
+ "description": "开始校正输入电压(VIN)<长按以退出>"
+ },
+ "PowerPulsePower": {
+ "displayText": "电源脉冲",
+ "description": "为保持电源处于唤醒状态所用的功率 "
+ },
+ "PowerPulseWait": {
+ "displayText": "电源脉冲间隔",
+ "description": "为保持电源处于唤醒状态,每次通电之间的间隔时间 "
+ },
+ "PowerPulseDuration": {
+ "displayText": "电源脉冲时长",
+ "description": "为保持电源处于唤醒状态,每次通电脉冲的时间长度 "
+ },
+ "SettingsReset": {
+ "displayText": "全部重置?",
+ "description": "将所有设定重置为默认值"
+ },
+ "LanguageSwitch": {
+ "displayText": "语言:简体中文",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translation_ZH_TW.json b/Translations/translation_ZH_TW.json
index 1f2ab233..0be42f53 100644
--- a/Translations/translation_ZH_TW.json
+++ b/Translations/translation_ZH_TW.json
@@ -1,209 +1,251 @@
-{
- "languageCode": "ZH_TW",
- "languageLocalName": "正體中文",
- "tempUnitFahrenheit": true,
- "messages": {
- "SettingsCalibrationWarning": "Before rebooting, make sure tip & handle are at room temperature!",
- "CJCCalibrating": "calibrating",
- "SettingsResetWarning": "你是否確定要將全部設定重設到預設值?",
- "UVLOWarningString": "電壓過低",
- "UndervoltageString": "Undervoltage",
- "InputVoltageString": "Input V: ",
- "SleepingSimpleString": "Zzzz",
- "SleepingAdvancedString": "Sleeping...",
- "SleepingTipAdvancedString": "Tip:",
- "OffString": "關",
- "DeviceFailedValidationWarning": "這支電烙鐵很有可能是冒牌貨!"
- },
- "messagesWarn": {
- "CJCCalibrationDone": "Calibration done!",
- "ResetOKMessage": "已重設!",
- "SettingsResetMessage": "設定已被重設!",
- "NoAccelerometerMessage": "未能偵測加速度計",
- "NoPowerDeliveryMessage": "未能偵測PD晶片",
- "LockingKeysString": "已鎖定",
- "UnlockingKeysString": "已解除鎖定",
- "WarningKeysLockedString": "!按鍵鎖定!",
- "WarningThermalRunaway": "加熱失控"
- },
- "characters": {
- "SettingRightChar": "右",
- "SettingLeftChar": "左",
- "SettingAutoChar": "自",
- "SettingOffChar": "關",
- "SettingSlowChar": "慢",
- "SettingMediumChar": "中",
- "SettingFastChar": "快",
- "SettingStartNoneChar": "無",
- "SettingStartSolderingChar": "焊",
- "SettingStartSleepChar": "待",
- "SettingStartSleepOffChar": "室",
- "SettingSensitivityOff": "關",
- "SettingSensitivityLow": "低",
- "SettingSensitivityMedium": "中",
- "SettingSensitivityHigh": "高",
- "SettingLockDisableChar": "無",
- "SettingLockBoostChar": "增",
- "SettingLockFullChar": "全"
- },
- "menuGroups": {
- "PowerMenu": {
- "text2": "電源設定",
- "desc": ""
- },
- "SolderingMenu": {
- "text2": "焊接設定",
- "desc": ""
- },
- "PowerSavingMenu": {
- "text2": "待機設定",
- "desc": ""
- },
- "UIMenu": {
- "text2": "使用者介面",
- "desc": ""
- },
- "AdvancedMenu": {
- "text2": "進階設定",
- "desc": ""
- }
- },
- "menuOptions": {
- "DCInCutoff": {
- "text2": "電源",
- "desc": "輸入電源;設定自動停機電壓 "
- },
- "MinVolCell": {
- "text2": "最低電壓",
- "desc": "每顆電池的最低可用電壓 <伏特> <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
- },
- "QCMaxVoltage": {
- "text2": "QC電壓",
- "desc": "使用QC電源時請求的最高目標電壓"
- },
- "PDNegTimeout": {
- "text2": "PD逾時",
- "desc": "設定USB PD協定交涉的逾時時限;為兼容某些QC電源而設 "
- },
- "BoostTemperature": {
- "text2": "增熱溫度",
- "desc": "於增熱模式時使用的溫度"
- },
- "AutoStart": {
- "text2": "自動啟用",
- "desc": "開機時自動啟用 <無=停用 | 焊=焊接模式 | 待=待機模式 | 室=室溫待機>"
- },
- "TempChangeShortStep": {
- "text2": "溫度調整 短",
- "desc": "調校溫度時短按一下的溫度變幅"
- },
- "TempChangeLongStep": {
- "text2": "溫度調整 長",
- "desc": "調校溫度時長按按鍵的溫度變幅"
- },
- "LockingMode": {
- "text2": "按鍵鎖定",
- "desc": "於焊接模式時,同時長按兩個按鍵啟用按鍵鎖定 <無=停用 | 增=只容許增熱模式 | 全=鎖定全部>"
- },
- "MotionSensitivity": {
- "text2": "動作敏感度",
- "desc": "0=停用 | 1=最低敏感度 | ... | 9=最高敏感度"
- },
- "SleepTemperature": {
- "text2": "待機溫度",
- "desc": "於待機模式時的烙鐵頭溫度"
- },
- "SleepTimeout": {
- "text2": "待機延時",
- "desc": "自動進入待機模式前的閒置等候時間 "
- },
- "ShutdownTimeout": {
- "text2": "自動關機",
- "desc": "自動關機前的閒置等候時間 "
- },
- "HallEffSensitivity": {
- "text2": "磁場敏感度",
- "desc": "磁場感應器用作啟動待機模式的敏感度 <0=停用 | 1=最低敏感度 | ... | 9=最高敏感度>"
- },
- "TemperatureUnit": {
- "text2": "溫標",
- "desc": "C=攝氏 | F=華氏"
- },
- "DisplayRotation": {
- "text2": "畫面方向",
- "desc": "右=使用右手 | 左=使用左手 | 自=自動"
- },
- "CooldownBlink": {
- "text2": "降溫時閃爍",
- "desc": "停止加熱之後,當烙鐵頭仍處於高溫時閃爍畫面"
- },
- "ScrollingSpeed": {
- "text2": "捲動速度",
- "desc": "解說文字的捲動速度"
- },
- "ReverseButtonTempChange": {
- "text2": "調換加減鍵",
- "desc": "調校溫度時調換加減鍵的方向"
- },
- "AnimSpeed": {
- "text2": "動畫速度",
- "desc": "功能表圖示動畫的速度 <關=不顯示動畫 | 慢=慢速 | 中=中速 | 快=快速>"
- },
- "AnimLoop": {
- "text2": "動畫循環",
- "desc": "循環顯示功能表圖示動畫"
- },
- "Brightness": {
- "text2": "螢幕亮度",
- "desc": "設定OLED螢幕的亮度"
- },
- "ColourInversion": {
- "text2": "螢幕反轉色",
- "desc": "反轉OLED螢幕的黑白色彩"
- },
- "LOGOTime": {
- "text2": "開機畫面",
- "desc": "設定開機畫面顯示時長 "
- },
- "AdvancedIdle": {
- "text2": "詳細閒置畫面",
- "desc": "於閒置畫面以英文小字型顯示詳細資料"
- },
- "AdvancedSoldering": {
- "text2": "詳細焊接畫面",
- "desc": "於焊接模式畫面以英文小字型顯示詳細資料"
- },
- "PowerLimit": {
- "text2": "功率限制",
- "desc": "限制烙鐵可用的最大功率 "
- },
- "CalibrateCJC": {
- "text2": "校正CJC",
- "desc": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
- },
- "VoltageCalibration": {
- "text2": "輸入電壓校正?",
- "desc": "開始校正VIN輸入電壓 <長按以退出>"
- },
- "PowerPulsePower": {
- "text2": "電源脈衝",
- "desc": "為保持電源喚醒而通電所用的功率 "
- },
- "PowerPulseWait": {
- "text2": "電源脈衝間隔",
- "desc": "為保持電源喚醒,每次通電之間的間隔時間 "
- },
- "PowerPulseDuration": {
- "text2": "電源脈衝時長",
- "desc": "為保持電源喚醒,每次通電脈衝的時間長度 "
- },
- "SettingsReset": {
- "text2": "全部重設?",
- "desc": "將所有設定重設到預設值"
- },
- "LanguageSwitch": {
- "text2": "語言:正體中文",
- "desc": ""
- }
- }
-}
\ No newline at end of file
+{
+ "languageCode": "ZH_TW",
+ "languageLocalName": "正體中文",
+ "tempUnitFahrenheit": true,
+ "messagesWarn": {
+ "CJCCalibrationDone": {
+ "message": "Calibration done!"
+ },
+ "ResetOKMessage": {
+ "message": "已重設!"
+ },
+ "SettingsResetMessage": {
+ "message": "設定已被重設!"
+ },
+ "NoAccelerometerMessage": {
+ "message": "未能偵測加速度計"
+ },
+ "NoPowerDeliveryMessage": {
+ "message": "未能偵測PD晶片"
+ },
+ "LockingKeysString": {
+ "message": "已鎖定"
+ },
+ "UnlockingKeysString": {
+ "message": "已解除鎖定"
+ },
+ "WarningKeysLockedString": {
+ "message": "!按鍵鎖定!"
+ },
+ "WarningThermalRunaway": {
+ "message": "加熱失控"
+ },
+ "SettingsCalibrationWarning": {
+ "message": "Before rebooting, make sure tip & handle are at room temperature!"
+ },
+ "CJCCalibrating": {
+ "message": "calibrating"
+ },
+ "SettingsResetWarning": {
+ "message": "你是否確定要將全部設定重設到預設值?"
+ },
+ "UVLOWarningString": {
+ "message": "電壓過低"
+ },
+ "UndervoltageString": {
+ "message": "Undervoltage"
+ },
+ "InputVoltageString": {
+ "message": "Input V: "
+ },
+ "SleepingSimpleString": {
+ "message": "Zzzz"
+ },
+ "SleepingAdvancedString": {
+ "message": "Sleeping..."
+ },
+ "SleepingTipAdvancedString": {
+ "message": "Tip: "
+ },
+ "OffString": {
+ "message": "關"
+ },
+ "DeviceFailedValidationWarning": {
+ "message": "這支電烙鐵很有可能是冒牌貨!"
+ }
+ },
+ "characters": {
+ "SettingRightChar": "右",
+ "SettingLeftChar": "左",
+ "SettingAutoChar": "自",
+ "SettingOffChar": "關",
+ "SettingSlowChar": "慢",
+ "SettingMediumChar": "中",
+ "SettingFastChar": "快",
+ "SettingStartNoneChar": "無",
+ "SettingStartSolderingChar": "焊",
+ "SettingStartSleepChar": "待",
+ "SettingStartSleepOffChar": "室",
+ "SettingLockDisableChar": "無",
+ "SettingLockBoostChar": "增",
+ "SettingLockFullChar": "全"
+ },
+ "menuGroups": {
+ "PowerMenu": {
+ "displayText": "電源設定",
+ "description": ""
+ },
+ "SolderingMenu": {
+ "displayText": "焊接設定",
+ "description": ""
+ },
+ "PowerSavingMenu": {
+ "displayText": "待機設定",
+ "description": ""
+ },
+ "UIMenu": {
+ "displayText": "使用者介面",
+ "description": ""
+ },
+ "AdvancedMenu": {
+ "displayText": "進階設定",
+ "description": ""
+ }
+ },
+ "menuOptions": {
+ "DCInCutoff": {
+ "displayText": "電源",
+ "description": "輸入電源;設定自動停機電壓 "
+ },
+ "MinVolCell": {
+ "displayText": "最低電壓",
+ "description": "每顆電池的最低可用電壓 <伏特> <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
+ },
+ "QCMaxVoltage": {
+ "displayText": "QC電壓",
+ "description": "使用QC電源時請求的最高目標電壓"
+ },
+ "PDNegTimeout": {
+ "displayText": "PD逾時",
+ "description": "設定USB PD協定交涉的逾時時限;為兼容某些QC電源而設 "
+ },
+ "PDVpdo": {
+ "displayText": "PD VPDO",
+ "description": "Enables PPS & EPR modes"
+ },
+ "BoostTemperature": {
+ "displayText": "增熱溫度",
+ "description": "於增熱模式時使用的溫度"
+ },
+ "AutoStart": {
+ "displayText": "自動啟用",
+ "description": "開機時自動啟用 <無=停用 | 焊=焊接模式 | 待=待機模式 | 室=室溫待機>"
+ },
+ "TempChangeShortStep": {
+ "displayText": "溫度調整 短",
+ "description": "調校溫度時短按一下的溫度變幅"
+ },
+ "TempChangeLongStep": {
+ "displayText": "溫度調整 長",
+ "description": "調校溫度時長按按鍵的溫度變幅"
+ },
+ "LockingMode": {
+ "displayText": "按鍵鎖定",
+ "description": "於焊接模式時,同時長按兩個按鍵啟用按鍵鎖定 <無=停用 | 增=只容許增熱模式 | 全=鎖定全部>"
+ },
+ "MotionSensitivity": {
+ "displayText": "動作敏感度",
+ "description": "0=停用 | 1=最低敏感度 | ... | 9=最高敏感度"
+ },
+ "SleepTemperature": {
+ "displayText": "待機溫度",
+ "description": "於待機模式時的烙鐵頭溫度"
+ },
+ "SleepTimeout": {
+ "displayText": "待機延時",
+ "description": "自動進入待機模式前的閒置等候時間 "
+ },
+ "ShutdownTimeout": {
+ "displayText": "自動關機",
+ "description": "自動關機前的閒置等候時間 "
+ },
+ "HallEffSensitivity": {
+ "displayText": "磁場敏感度",
+ "description": "磁場感應器用作啟動待機模式的敏感度 <0=停用 | 1=最低敏感度 | ... | 9=最高敏感度>"
+ },
+ "TemperatureUnit": {
+ "displayText": "溫標",
+ "description": "C=攝氏 | F=華氏"
+ },
+ "DisplayRotation": {
+ "displayText": "畫面方向",
+ "description": "右=使用右手 | 左=使用左手 | 自=自動"
+ },
+ "CooldownBlink": {
+ "displayText": "降溫時閃爍",
+ "description": "停止加熱之後,當烙鐵頭仍處於高溫時閃爍畫面"
+ },
+ "ScrollingSpeed": {
+ "displayText": "捲動速度",
+ "description": "解說文字的捲動速度"
+ },
+ "ReverseButtonTempChange": {
+ "displayText": "調換加減鍵",
+ "description": "調校溫度時調換加減鍵的方向"
+ },
+ "AnimSpeed": {
+ "displayText": "動畫速度",
+ "description": "功能表圖示動畫的速度 <關=不顯示動畫 | 慢=慢速 | 中=中速 | 快=快速>"
+ },
+ "AnimLoop": {
+ "displayText": "動畫循環",
+ "description": "循環顯示功能表圖示動畫"
+ },
+ "Brightness": {
+ "displayText": "螢幕亮度",
+ "description": "設定OLED螢幕的亮度"
+ },
+ "ColourInversion": {
+ "displayText": "螢幕反轉色",
+ "description": "反轉OLED螢幕的黑白色彩"
+ },
+ "LOGOTime": {
+ "displayText": "開機畫面",
+ "description": "設定開機畫面顯示時長 "
+ },
+ "AdvancedIdle": {
+ "displayText": "詳細閒置畫面",
+ "description": "於閒置畫面以英文小字型顯示詳細資料"
+ },
+ "AdvancedSoldering": {
+ "displayText": "詳細焊接畫面",
+ "description": "於焊接模式畫面以英文小字型顯示詳細資料"
+ },
+ "BluetoothLE": {
+ "displayText": "Bluetooth",
+ "description": "Enables BLE"
+ },
+ "PowerLimit": {
+ "displayText": "功率限制",
+ "description": "限制烙鐵可用的最大功率 "
+ },
+ "CalibrateCJC": {
+ "displayText": "校正CJC",
+ "description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
+ },
+ "VoltageCalibration": {
+ "displayText": "輸入電壓校正?",
+ "description": "開始校正VIN輸入電壓 <長按以退出>"
+ },
+ "PowerPulsePower": {
+ "displayText": "電源脈衝",
+ "description": "為保持電源喚醒而通電所用的功率 "
+ },
+ "PowerPulseWait": {
+ "displayText": "電源脈衝間隔",
+ "description": "為保持電源喚醒,每次通電之間的間隔時間 "
+ },
+ "PowerPulseDuration": {
+ "displayText": "電源脈衝時長",
+ "description": "為保持電源喚醒,每次通電脈衝的時間長度 "
+ },
+ "SettingsReset": {
+ "displayText": "全部重設?",
+ "description": "將所有設定重設到預設值"
+ },
+ "LanguageSwitch": {
+ "displayText": "語言:正體中文",
+ "description": ""
+ }
+ }
+}
diff --git a/Translations/translations.css b/Translations/translations.css
deleted file mode 100644
index 21d808af..00000000
--- a/Translations/translations.css
+++ /dev/null
@@ -1,110 +0,0 @@
-* {
- font-family: sans-serif;
-}
-
-h1 {
- color: #66A;
-}
-
-h1 span {
- color: #000;
-}
-
-table.data, div.data {
- border: 1px solid #888;
- width: 100%;
-}
-
-div.value {
- margin: 2px;
-}
-
-.header input {
- width: 50% !important;
-}
-
-input.short {
- width: 150px !important;
- font-family: monospace;
-}
-
-.header .selected {
- display: block;
- font-family: monospace;
-}
-
-.stringId {
- font-family: monospace;
- font-weight: bold;
-}
-
-.label {
- background-color: #ddf;
- padding: 0.5em;
- width: 20%;
- color: #66A;
-}
-
-.value {
- background-color: #eef;
-}
-
-.value .label {
- width: 99%;
- font-weight: bold;
-}
-
-td input {
- width: 99%;
-}
-
-input.unchanged, input.empty, .unchanged input, .empty input {
- background-color: #ffc;
-}
-
-input.invalid, .invalid input {
- background-color: #f99;
-}
-
-.ref, .tran input {
- font-family: monospace;
-}
-
-.ref::before, .ref::after {
- color: #99F;
- font-family: sans-serif;
- content: "\"";
-}
-
-.note {
- color : #66A;
- font-style: italic;
-}
-
-div.constraint {
- float: right;
- display: inline-block;
- font-family: monospace;
- color: #66A;
-}
-
-.invalid .constraint {
- color: #f00;
-}
-
-.value {
- font-size: smaller;
-}
-
-.hidden {
- display: none;
-}
-
-.footer {
- margin-top: 0.5em;
- margin-bottom: 0.5em;
-}
-
-.saved {
- background-color: #ddd;
-}
\ No newline at end of file
diff --git a/Translations/translations_commons.js b/Translations/translations_commons.js
deleted file mode 100644
index 53f77c36..00000000
--- a/Translations/translations_commons.js
+++ /dev/null
@@ -1,68 +0,0 @@
-function saveToFile(txt, filename){
- var a = document.createElement('a');
- a.setAttribute("style", "display: none");
- document.body.appendChild(a);
- a.setAttribute('href', 'data:application/json;charset=utf-8,'+encodeURIComponent(txt));
- a.setAttribute('download', filename);
- a.click();
- document.body.removeChild(a);
-}
-
-function saveJSON(obj, filename){
- var txt = JSON.stringify(obj,"", "\t");
- saveToFile(txt, filename);
-}
-
-function showJSON(obj, filename) {
- var txt = JSON.stringify(obj,"", "\t");
- var a = window.open("", "_blank").document;
- a.write("");
- a.write(txt);
- a.title = filename;
-}
-
-function startsWith(str, prefix) {
- return str.substring(0, prefix.length) == prefix;
-}
-
-function endsWith(str, suffix) {
- return str.substring(str.length-suffix.length) == suffix;
-}
-
-function isDefined(obj) {
- return typeof obj !== 'undefined';
-}
-
-function isNumber(obj) {
- return isDefined(obj) && obj != null;
-}
-
-function isDefinedNN(obj) {
- return isDefined(obj) && obj != null;
-}
-
-function padLeft(str, chr, maxLen) {
- str = str.toString();
- return str.length < maxLen ? padLeft(chr + str, chr, maxLen) : str;
-}
-
-// sourceArray contains a list of objects that have a property "id". This methods makes a map using the "id" as a key, and the owning object as a value.
-function copyArrayToMap(sourceArray, map) {
- if (!isDefined(map)) {
- map = {};
- }
- var len = sourceArray.length;
- for (var i = 0; i ADC_Vin;
history ADC_Temp;
history ADC_Tip;
+volatile uint8_t ADCBurstCounter = 0;
void adc_fifo_irq(void) {
if (ADC_GetIntStatus(ADC_INT_FIFO_READY) == SET) {
// Read out all entries in the fifo
while (ADC_Get_FIFO_Count()) {
+ ADCBurstCounter++;
volatile uint32_t reading = ADC_Read_FIFO();
// As per manual, 26 bit reading; lowest 16 are the ADC
uint16_t sample = reading & 0xFFFF;
@@ -46,12 +49,17 @@ void adc_fifo_irq(void) {
}
}
- // unblock the PID controller thread
- if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
- BaseType_t xHigherPriorityTaskWoken = pdFALSE;
- if (pidTaskNotification) {
- vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken);
- portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
+ if (ADCBurstCounter >= 8) {
+ ADCBurstCounter = 0;
+ start_PWM_output();
+
+ // unblock the PID controller thread
+ if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
+ BaseType_t xHigherPriorityTaskWoken = pdFALSE;
+ if (pidTaskNotification) {
+ vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken);
+ portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
+ }
}
}
}
@@ -66,12 +74,8 @@ volatile uint16_t PWMSafetyTimer = 0;
volatile uint8_t pendingPWM = 0;
volatile bool lastPeriodWasFast = false;
-// Timer 0 is used to co-ordinate the ADC and the output PWM
-void timer0_comp0_callback(void) { ADC_Start(); }
-void timer0_comp1_callback(void) { PWM_Channel_Disable(PWM_Channel); }
-void timer0_comp2_callback(void) {
+void start_PWM_output(void) {
- // This occurs at timer rollover, so if we want to turn on the output PWM; we do so
if (PWMSafetyTimer) {
PWMSafetyTimer--;
if (lastPeriodWasFast != fastPWM) {
@@ -93,8 +97,16 @@ void timer0_comp2_callback(void) {
} else {
PWM_Channel_Disable(PWM_Channel);
}
+ TIMER_Enable(TIMER_CH0);
}
+// Timer 0 is used to co-ordinate the ADC and the output PWM
+void timer0_comp0_callback(void) {
+ TIMER_Disable(TIMER_CH0);
+ ADC_Start();
+}
+void timer0_comp1_callback(void) { PWM_Channel_Disable(PWM_Channel); } // Trigged at end of output cycle; turn off the tip PWM
+
void switchToFastPWM(void) {
fastPWM = true;
totalPWM = powerPWM + tempMeasureTicks + holdoffTicks;
diff --git a/source/Core/BSP/Pinecilv2/MemMang/heap_5.c b/source/Core/BSP/Pinecilv2/MemMang/heap_5.c
new file mode 100644
index 00000000..aab4f8f4
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/MemMang/heap_5.c
@@ -0,0 +1,550 @@
+/*
+ * FreeRTOS Kernel V10.4.1
+ * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ * 1 tab == 4 spaces!
+ */
+
+/*
+ * A sample implementation of pvPortMalloc() that allows the heap to be defined
+ * across multiple non-contigous blocks and combines (coalescences) adjacent
+ * memory blocks as they are freed.
+ *
+ * See heap_1.c, heap_2.c, heap_3.c and heap_4.c for alternative
+ * implementations, and the memory management pages of https://www.FreeRTOS.org
+ * for more information.
+ *
+ * Usage notes:
+ *
+ * vPortDefineHeapRegions() ***must*** be called before pvPortMalloc().
+ * pvPortMalloc() will be called if any task objects (tasks, queues, event
+ * groups, etc.) are created, therefore vPortDefineHeapRegions() ***must*** be
+ * called before any other objects are defined.
+ *
+ * vPortDefineHeapRegions() takes a single parameter. The parameter is an array
+ * of HeapRegion_t structures. HeapRegion_t is defined in portable.h as
+ *
+ * typedef struct HeapRegion
+ * {
+ * uint8_t *pucStartAddress; << Start address of a block of memory that will be part of the heap.
+ * size_t xSizeInBytes; << Size of the block of memory.
+ * } HeapRegion_t;
+ *
+ * The array is terminated using a NULL zero sized region definition, and the
+ * memory regions defined in the array ***must*** appear in address order from
+ * low address to high address. So the following is a valid example of how
+ * to use the function.
+ *
+ * HeapRegion_t xHeapRegions[] =
+ * {
+ * { ( uint8_t * ) 0x80000000UL, 0x10000 }, << Defines a block of 0x10000 bytes starting at address 0x80000000
+ * { ( uint8_t * ) 0x90000000UL, 0xa0000 }, << Defines a block of 0xa0000 bytes starting at address of 0x90000000
+ * { NULL, 0 } << Terminates the array.
+ * };
+ *
+ * vPortDefineHeapRegions( xHeapRegions ); << Pass the array into vPortDefineHeapRegions().
+ *
+ * Note 0x80000000 is the lower address so appears in the array first.
+ *
+ */
+#include
+
+/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
+ * all the API functions to use the MPU wrappers. That should only be done when
+ * task.h is included from an application file. */
+#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
+
+#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 )
+ #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0
+#endif
+
+/* Block sizes must not get too small. */
+#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) )
+
+/* Assumes 8bit bytes! */
+#define heapBITS_PER_BYTE ( ( size_t ) 8 )
+
+/* Define the linked list structure. This is used to link free blocks in order
+ * of their memory address. */
+typedef struct A_BLOCK_LINK
+{
+ struct A_BLOCK_LINK * pxNextFreeBlock; /*<< The next free block in the list. */
+ size_t xBlockSize; /*<< The size of the free block. */
+} BlockLink_t;
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Inserts a block of memory that is being freed into the correct position in
+ * the list of free memory blocks. The block being freed will be merged with
+ * the block in front it and/or the block behind it if the memory blocks are
+ * adjacent to each other.
+ */
+static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert );
+
+/*-----------------------------------------------------------*/
+
+/* The size of the structure placed at the beginning of each allocated memory
+ * block must by correctly byte aligned. */
+static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK );
+
+/* Create a couple of list links to mark the start and end of the list. */
+static BlockLink_t xStart, * pxEnd = NULL;
+
+/* Keeps track of the number of calls to allocate and free memory as well as the
+ * number of free bytes remaining, but says nothing about fragmentation. */
+static size_t xFreeBytesRemaining = 0U;
+static size_t xMinimumEverFreeBytesRemaining = 0U;
+static size_t xNumberOfSuccessfulAllocations = 0;
+static size_t xNumberOfSuccessfulFrees = 0;
+
+/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize
+ * member of an BlockLink_t structure is set then the block belongs to the
+ * application. When the bit is free the block is still part of the free heap
+ * space. */
+static size_t xBlockAllocatedBit = 0;
+
+/*-----------------------------------------------------------*/
+
+void * pvPortMalloc( size_t xWantedSize )
+{
+ BlockLink_t * pxBlock, * pxPreviousBlock, * pxNewBlockLink;
+ void * pvReturn = NULL;
+
+ /* The heap must be initialised before the first call to
+ * prvPortMalloc(). */
+ configASSERT( pxEnd );
+
+ vTaskSuspendAll();
+ {
+ /* Check the requested block size is not so large that the top bit is
+ * set. The top bit of the block size member of the BlockLink_t structure
+ * is used to determine who owns the block - the application or the
+ * kernel, so it must be free. */
+ if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
+ {
+ /* The wanted size is increased so it can contain a BlockLink_t
+ * structure in addition to the requested amount of bytes. */
+ if( xWantedSize > 0 )
+ {
+ xWantedSize += xHeapStructSize;
+
+ /* Ensure that blocks are always aligned to the required number
+ * of bytes. */
+ if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
+ {
+ /* Byte alignment required. */
+ xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+
+ if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
+ {
+ /* Traverse the list from the start (lowest address) block until
+ * one of adequate size is found. */
+ pxPreviousBlock = &xStart;
+ pxBlock = xStart.pxNextFreeBlock;
+
+ while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
+ {
+ pxPreviousBlock = pxBlock;
+ pxBlock = pxBlock->pxNextFreeBlock;
+ }
+
+ /* If the end marker was reached then a block of adequate size
+ * was not found. */
+ if( pxBlock != pxEnd )
+ {
+ /* Return the memory space pointed to - jumping over the
+ * BlockLink_t structure at its start. */
+ pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
+
+ /* This block is being returned for use so must be taken out
+ * of the list of free blocks. */
+ pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
+
+ /* If the block is larger than required it can be split into
+ * two. */
+ if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
+ {
+ /* This block is to be split into two. Create a new
+ * block following the number of bytes requested. The void
+ * cast is used to prevent byte alignment warnings from the
+ * compiler. */
+ pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
+
+ /* Calculate the sizes of two blocks split from the
+ * single block. */
+ pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
+ pxBlock->xBlockSize = xWantedSize;
+
+ /* Insert the new block into the list of free blocks. */
+ prvInsertBlockIntoFreeList( ( pxNewBlockLink ) );
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+
+ xFreeBytesRemaining -= pxBlock->xBlockSize;
+
+ if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
+ {
+ xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+
+ /* The block is being returned - it is allocated and owned
+ * by the application and has no "next" block. */
+ pxBlock->xBlockSize |= xBlockAllocatedBit;
+ pxBlock->pxNextFreeBlock = NULL;
+ xNumberOfSuccessfulAllocations++;
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+
+ traceMALLOC( pvReturn, xWantedSize );
+ }
+ ( void ) xTaskResumeAll();
+
+ #if ( configUSE_MALLOC_FAILED_HOOK == 1 )
+ {
+ if( pvReturn == NULL )
+ {
+ extern void vApplicationMallocFailedHook( void );
+ vApplicationMallocFailedHook();
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+ }
+ #endif /* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */
+
+ return pvReturn;
+}
+/*-----------------------------------------------------------*/
+
+void vPortFree( void * pv )
+{
+ uint8_t * puc = ( uint8_t * ) pv;
+ BlockLink_t * pxLink;
+
+ if( pv != NULL )
+ {
+ /* The memory being freed will have an BlockLink_t structure immediately
+ * before it. */
+ puc -= xHeapStructSize;
+
+ /* This casting is to keep the compiler from issuing warnings. */
+ pxLink = ( void * ) puc;
+
+ /* Check the block is actually allocated. */
+ configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
+ configASSERT( pxLink->pxNextFreeBlock == NULL );
+
+ if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )
+ {
+ if( pxLink->pxNextFreeBlock == NULL )
+ {
+ /* The block is being returned to the heap - it is no longer
+ * allocated. */
+ pxLink->xBlockSize &= ~xBlockAllocatedBit;
+
+ vTaskSuspendAll();
+ {
+ /* Add this block to the list of free blocks. */
+ xFreeBytesRemaining += pxLink->xBlockSize;
+ traceFREE( pv, pxLink->xBlockSize );
+ prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
+ xNumberOfSuccessfulFrees++;
+ }
+ ( void ) xTaskResumeAll();
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+ }
+}
+/*-----------------------------------------------------------*/
+
+size_t xPortGetFreeHeapSize( void )
+{
+ return xFreeBytesRemaining;
+}
+/*-----------------------------------------------------------*/
+
+size_t xPortGetMinimumEverFreeHeapSize( void )
+{
+ return xMinimumEverFreeBytesRemaining;
+}
+/*-----------------------------------------------------------*/
+
+static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert )
+{
+ BlockLink_t * pxIterator;
+ uint8_t * puc;
+
+ /* Iterate through the list until a block is found that has a higher address
+ * than the block being inserted. */
+ for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
+ {
+ /* Nothing to do here, just iterate to the right position. */
+ }
+
+ /* Do the block being inserted, and the block it is being inserted after
+ * make a contiguous block of memory? */
+ puc = ( uint8_t * ) pxIterator;
+
+ if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
+ {
+ pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
+ pxBlockToInsert = pxIterator;
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+
+ /* Do the block being inserted, and the block it is being inserted before
+ * make a contiguous block of memory? */
+ puc = ( uint8_t * ) pxBlockToInsert;
+
+ if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
+ {
+ if( pxIterator->pxNextFreeBlock != pxEnd )
+ {
+ /* Form one big block from the two blocks. */
+ pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
+ pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
+ }
+ else
+ {
+ pxBlockToInsert->pxNextFreeBlock = pxEnd;
+ }
+ }
+ else
+ {
+ pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
+ }
+
+ /* If the block being inserted plugged a gab, so was merged with the block
+ * before and the block after, then it's pxNextFreeBlock pointer will have
+ * already been set, and should not be set here as that would make it point
+ * to itself. */
+ if( pxIterator != pxBlockToInsert )
+ {
+ pxIterator->pxNextFreeBlock = pxBlockToInsert;
+ }
+ else
+ {
+ mtCOVERAGE_TEST_MARKER();
+ }
+}
+/*-----------------------------------------------------------*/
+
+void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions )
+{
+ BlockLink_t * pxFirstFreeBlockInRegion = NULL, * pxPreviousFreeBlock;
+ size_t xAlignedHeap;
+ size_t xTotalRegionSize, xTotalHeapSize = 0;
+ BaseType_t xDefinedRegions = 0;
+ size_t xAddress;
+ const HeapRegion_t * pxHeapRegion;
+
+ /* Can only call once! */
+ configASSERT( pxEnd == NULL );
+
+ pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] );
+
+ while( pxHeapRegion->xSizeInBytes > 0 )
+ {
+ xTotalRegionSize = pxHeapRegion->xSizeInBytes;
+
+ /* Ensure the heap region starts on a correctly aligned boundary. */
+ xAddress = ( size_t ) pxHeapRegion->pucStartAddress;
+
+ if( ( xAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
+ {
+ xAddress += ( portBYTE_ALIGNMENT - 1 );
+ xAddress &= ~portBYTE_ALIGNMENT_MASK;
+
+ /* Adjust the size for the bytes lost to alignment. */
+ xTotalRegionSize -= xAddress - ( size_t ) pxHeapRegion->pucStartAddress;
+ }
+
+ xAlignedHeap = xAddress;
+
+ /* Set xStart if it has not already been set. */
+ if( xDefinedRegions == 0 )
+ {
+ /* xStart is used to hold a pointer to the first item in the list of
+ * free blocks. The void cast is used to prevent compiler warnings. */
+ xStart.pxNextFreeBlock = ( BlockLink_t * ) xAlignedHeap;
+ xStart.xBlockSize = ( size_t ) 0;
+ }
+ else
+ {
+ /* Should only get here if one region has already been added to the
+ * heap. */
+ configASSERT( pxEnd != NULL );
+
+ /* Check blocks are passed in with increasing start addresses. */
+ configASSERT( xAddress > ( size_t ) pxEnd );
+ }
+
+ /* Remember the location of the end marker in the previous region, if
+ * any. */
+ pxPreviousFreeBlock = pxEnd;
+
+ /* pxEnd is used to mark the end of the list of free blocks and is
+ * inserted at the end of the region space. */
+ xAddress = xAlignedHeap + xTotalRegionSize;
+ xAddress -= xHeapStructSize;
+ xAddress &= ~portBYTE_ALIGNMENT_MASK;
+ pxEnd = ( BlockLink_t * ) xAddress;
+ pxEnd->xBlockSize = 0;
+ pxEnd->pxNextFreeBlock = NULL;
+
+ /* To start with there is a single free block in this region that is
+ * sized to take up the entire heap region minus the space taken by the
+ * free block structure. */
+ pxFirstFreeBlockInRegion = ( BlockLink_t * ) xAlignedHeap;
+ pxFirstFreeBlockInRegion->xBlockSize = xAddress - ( size_t ) pxFirstFreeBlockInRegion;
+ pxFirstFreeBlockInRegion->pxNextFreeBlock = pxEnd;
+
+ /* If this is not the first region that makes up the entire heap space
+ * then link the previous region to this region. */
+ if( pxPreviousFreeBlock != NULL )
+ {
+ pxPreviousFreeBlock->pxNextFreeBlock = pxFirstFreeBlockInRegion;
+ }
+
+ xTotalHeapSize += pxFirstFreeBlockInRegion->xBlockSize;
+
+ /* Move onto the next HeapRegion_t structure. */
+ xDefinedRegions++;
+ pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] );
+ }
+
+ xMinimumEverFreeBytesRemaining = xTotalHeapSize;
+ xFreeBytesRemaining = xTotalHeapSize;
+
+ /* Check something was actually defined before it is accessed. */
+ configASSERT( xTotalHeapSize );
+
+ /* Work out the position of the top bit in a size_t variable. */
+ xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 );
+}
+/*-----------------------------------------------------------*/
+
+void vPortGetHeapStats( HeapStats_t * pxHeapStats )
+{
+ BlockLink_t * pxBlock;
+ size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */
+
+ vTaskSuspendAll();
+ {
+ pxBlock = xStart.pxNextFreeBlock;
+
+ /* pxBlock will be NULL if the heap has not been initialised. The heap
+ * is initialised automatically when the first allocation is made. */
+ if( pxBlock != NULL )
+ {
+ do
+ {
+ /* Increment the number of blocks and record the largest block seen
+ * so far. */
+ xBlocks++;
+
+ if( pxBlock->xBlockSize > xMaxSize )
+ {
+ xMaxSize = pxBlock->xBlockSize;
+ }
+
+ /* Heap five will have a zero sized block at the end of each
+ * each region - the block is only used to link to the next
+ * heap region so it not a real block. */
+ if( pxBlock->xBlockSize != 0 )
+ {
+ if( pxBlock->xBlockSize < xMinSize )
+ {
+ xMinSize = pxBlock->xBlockSize;
+ }
+ }
+
+ /* Move to the next block in the chain until the last block is
+ * reached. */
+ pxBlock = pxBlock->pxNextFreeBlock;
+ } while( pxBlock != pxEnd );
+ }
+ }
+ ( void ) xTaskResumeAll();
+
+ pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize;
+ pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize;
+ pxHeapStats->xNumberOfFreeBlocks = xBlocks;
+
+ taskENTER_CRITICAL();
+ {
+ pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining;
+ pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations;
+ pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees;
+ pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining;
+ }
+ taskEXIT_CRITICAL();
+}
diff --git a/source/Core/BSP/Pinecilv2/Pins.h b/source/Core/BSP/Pinecilv2/Pins.h
index 3baf060c..6037c1f9 100644
--- a/source/Core/BSP/Pinecilv2/Pins.h
+++ b/source/Core/BSP/Pinecilv2/Pins.h
@@ -8,6 +8,7 @@
#ifndef BSP_PINE64_PINS_H_
#define BSP_PINE64_PINS_H_
#include "bl702_adc.h"
+#include "bl702_pwm.h"
#include "hal_gpio.h"
#define KEY_B_Pin GPIO_PIN_28
diff --git a/source/Core/BSP/Pinecilv2/Setup.cpp b/source/Core/BSP/Pinecilv2/Setup.cpp
index d221f8ef..aec09031 100644
--- a/source/Core/BSP/Pinecilv2/Setup.cpp
+++ b/source/Core/BSP/Pinecilv2/Setup.cpp
@@ -8,21 +8,46 @@
#include "BSP.h"
#include "Debug.h"
#include "FreeRTOSConfig.h"
-#include "Pins.h"
-
#include "IRQ.h"
+#include "Pins.h"
+#include "bl702_sec_eng.h"
#include "history.hpp"
#include
#define ADC_NORM_SAMPLES 16
#define ADC_FILTER_LEN 4
uint16_t ADCReadings[ADC_NORM_SAMPLES]; // room for 32 lots of the pair of readings
+// Heap
+
+extern uint8_t _heap_start;
+extern uint8_t _heap_size; // @suppress("Type cannot be resolved")
+static HeapRegion_t xHeapRegions[] = {
+ {&_heap_start, (unsigned int)&_heap_size},
+ {NULL, 0}, /* Terminates the array. */
+ {NULL, 0} /* Terminates the array. */
+};
+
// Functions
void setup_timer_scheduler(void);
void setup_pwm(void);
void setup_adc(void);
void hardware_init() {
+
+ vPortDefineHeapRegions(xHeapRegions);
+ HBN_Set_XCLK_CLK_Sel(HBN_XCLK_CLK_XTAL);
+
+ // Set capcode
+ {
+ uint32_t tmpVal = 0;
+ tmpVal = BL_RD_REG(AON_BASE, AON_XTAL_CFG);
+ tmpVal = BL_SET_REG_BITS_VAL(tmpVal, AON_XTAL_CAPCODE_IN_AON, 33);
+ tmpVal = BL_SET_REG_BITS_VAL(tmpVal, AON_XTAL_CAPCODE_OUT_AON, 33);
+ BL_WR_REG(AON_BASE, AON_XTAL_CFG, tmpVal);
+ }
+
+ Sec_Eng_Trng_Enable();
+
gpio_set_mode(OLED_RESET_Pin, GPIO_OUTPUT_MODE);
gpio_set_mode(KEY_A_Pin, GPIO_INPUT_PD_MODE);
gpio_set_mode(KEY_B_Pin, GPIO_INPUT_PD_MODE);
@@ -37,10 +62,10 @@ void hardware_init() {
setup_timer_scheduler();
setup_adc();
setup_pwm();
- I2C_SetSclSync(I2C0_ID,1);
- I2C_SetDeglitchCount(I2C0_ID,1); // Turn on de-glitch
- //Note on I2C clock rate @ 100Khz the screen update == 20ms which is too long for USB-PD to work
- //200kHz and above works
+ I2C_SetSclSync(I2C0_ID, 1);
+ I2C_SetDeglitchCount(I2C0_ID, 1); // Turn on de-glitch
+ // Note on I2C clock rate @ 100Khz the screen update == 20ms which is too long for USB-PD to work
+ // 200kHz and above works
I2C_ClockSet(I2C0_ID, 300000); // Sets clock to around 25 kHz less than set here
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, 0);
}
@@ -114,32 +139,28 @@ void setup_timer_scheduler() {
TIMER_Disable(TIMER_CH0);
TIMER_CFG_Type cfg = {
- TIMER_CH0, // Channel
- TIMER_CLKSRC_32K, // Clock source
- TIMER_PRELOAD_TRIG_COMP2, // Trigger
- TIMER_COUNT_PRELOAD, // Counter mode
- 22, // Clock div
- (uint16_t)(powerPWM + holdoffTicks), // CH0 compare (adc)
- 0, // CH1 compare (pwm out)
- (uint16_t)(powerPWM + tempMeasureTicks + holdoffTicks), // CH2 comapre (total period)
- 0, // Preload
+ TIMER_CH0, // Channel
+ TIMER_CLKSRC_32K, // Clock source
+ TIMER_PRELOAD_TRIG_COMP0, // Trigger; reset after trigger 0
+ TIMER_COUNT_PRELOAD, // Counter mode
+ 22, // Clock div
+ (uint16_t)(powerPWM + holdoffTicks), // CH0 compare (adc)
+ 0, // CH1 compare (pwm out)
+ 0, // CH2 compare not used
+ 0, // Preload
};
TIMER_Init(&cfg);
Timer_Int_Callback_Install(TIMER_CH0, TIMER_INT_COMP_0, timer0_comp0_callback);
Timer_Int_Callback_Install(TIMER_CH0, TIMER_INT_COMP_1, timer0_comp1_callback);
- Timer_Int_Callback_Install(TIMER_CH0, TIMER_INT_COMP_2, timer0_comp2_callback);
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_0);
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_1);
- TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_2);
TIMER_IntMask(TIMER_CH0, TIMER_INT_COMP_0, UNMASK);
TIMER_IntMask(TIMER_CH0, TIMER_INT_COMP_1, UNMASK);
- TIMER_IntMask(TIMER_CH0, TIMER_INT_COMP_2, UNMASK);
CPU_Interrupt_Enable(TIMER_CH0_IRQn);
TIMER_Enable(TIMER_CH0);
- // switchToSlowPWM();
}
void setupFUSBIRQ() {
@@ -150,12 +171,3 @@ void setupFUSBIRQ() {
CPU_Interrupt_Enable(GPIO_INT0_IRQn);
gpio_irq_enable(FUSB302_IRQ_Pin, ENABLE);
}
-
-void vAssertCalled(void) {
- MSG((char *)"vAssertCalled\r\n");
- PWM_Channel_Disable(PWM_Channel);
- gpio_set_mode(PWM_Out_Pin, GPIO_INPUT_PD_MODE);
-
- while (1)
- ;
-}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/bl702_rf/lib/libbl702_rf.a b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/bl702_rf/lib/libbl702_rf.a
new file mode 100644
index 00000000..eb99532e
Binary files /dev/null and b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/bl702_rf/lib/libbl702_rf.a differ
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.c
new file mode 100644
index 00000000..238b9b20
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.c
@@ -0,0 +1,323 @@
+/*****************************************************************************************
+*
+* @file bl_hci_wrapper.c
+*
+* @brief Bouffalo Lab hci wrapper functions
+*
+* Copyright (C) Bouffalo Lab 2018
+*
+* History: 2018-08 crealted by llgong @ Shanghai
+*
+*****************************************************************************************/
+
+#include
+#include
+#include "hci_host.h"
+#include "bl_hci_wrapper.h"
+#include "hci_driver.h"
+#include "../common/include/errno.h"
+#include "byteorder.h"
+#include "hci_onchip.h"
+
+#define DATA_MSG_CNT 10
+
+struct rx_msg_struct data_msg[DATA_MSG_CNT];
+struct k_queue msg_queue;
+#if defined(BFLB_BLE_NOTIFY_ADV_DISCARDED)
+extern void ble_controller_notify_adv_discarded(uint8_t *adv_bd_addr, uint8_t adv_type);
+#endif
+
+struct rx_msg_struct *bl_find_valid_data_msg()
+{
+ struct rx_msg_struct empty_msg;
+ memset(&empty_msg, 0, sizeof(struct rx_msg_struct));
+
+ for (int i = 0; i < DATA_MSG_CNT; i++) {
+ if (!memcmp(&data_msg[i], &empty_msg, sizeof(struct rx_msg_struct))) {
+ return (data_msg + i);
+ }
+ }
+
+ return NULL;
+}
+
+int bl_onchiphci_send_2_controller(struct net_buf *buf)
+{
+ uint16_t opcode;
+ uint16_t dest_id = 0x00;
+ uint8_t buf_type;
+ uint8_t pkt_type;
+ hci_pkt_struct pkt;
+
+ buf_type = bt_buf_get_type(buf);
+ switch (buf_type) {
+ case BT_BUF_CMD: {
+ struct bt_hci_cmd_hdr *chdr;
+
+ if (buf->len < sizeof(struct bt_hci_cmd_hdr)) {
+ return -EINVAL;
+ }
+
+ chdr = (void *)buf->data;
+
+ if (buf->len < chdr->param_len) {
+ return -EINVAL;
+ }
+
+ pkt_type = BT_HCI_CMD;
+ opcode = sys_le16_to_cpu(chdr->opcode);
+ //move buf to the payload
+ net_buf_pull(buf, sizeof(struct bt_hci_cmd_hdr));
+ switch (opcode) {
+ //ble refer to hci_cmd_desc_tab_le, for the ones of which dest_ll is BLE_CTRL
+ case BT_HCI_OP_LE_CONN_UPDATE:
+ case BT_HCI_OP_LE_READ_CHAN_MAP:
+ case BT_HCI_OP_LE_READ_REMOTE_FEATURES:
+ case BT_HCI_OP_LE_START_ENCRYPTION:
+ case BT_HCI_OP_LE_LTK_REQ_REPLY:
+ case BT_HCI_OP_LE_LTK_REQ_NEG_REPLY:
+ case BT_HCI_OP_LE_CONN_PARAM_REQ_REPLY:
+ case BT_HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY:
+ case BT_HCI_OP_LE_SET_DATA_LEN:
+ case BT_HCI_OP_LE_READ_PHY:
+ case BT_HCI_OP_LE_SET_PHY:
+ //bredr identify link id, according to dest_id
+ case BT_HCI_OP_READ_REMOTE_FEATURES:
+ case BT_HCI_OP_READ_REMOTE_EXT_FEATURES:
+ case BT_HCI_OP_READ_ENCRYPTION_KEY_SIZE: {
+ //dest_id is connectin handle
+ dest_id = buf->data[0];
+ }
+ default:
+ break;
+ }
+ pkt.p.hci_cmd.opcode = opcode;
+ pkt.p.hci_cmd.param_len = chdr->param_len;
+ pkt.p.hci_cmd.params = buf->data;
+
+ break;
+ }
+
+ case BT_BUF_ACL_OUT: {
+ struct bt_hci_acl_hdr *acl;
+ //connhandle +l2cap field
+ uint16_t connhdl_l2cf, tlt_len;
+
+ if (buf->len < sizeof(struct bt_hci_acl_hdr)) {
+ return -EINVAL;
+ }
+
+ pkt_type = BT_HCI_ACL_DATA;
+ acl = (void *)buf->data;
+ tlt_len = sys_le16_to_cpu(acl->len);
+ connhdl_l2cf = sys_le16_to_cpu(acl->handle);
+ //move buf to the payload
+ net_buf_pull(buf, sizeof(struct bt_hci_acl_hdr));
+
+ if (buf->len < tlt_len) {
+ return -EINVAL;
+ }
+
+ //get connection_handle
+ dest_id = bt_acl_handle(connhdl_l2cf);
+ pkt.p.acl_data.conhdl = dest_id;
+ pkt.p.acl_data.pb_bc_flag = bt_acl_flags(connhdl_l2cf);
+ pkt.p.acl_data.len = tlt_len;
+ pkt.p.acl_data.buffer = (uint8_t *)buf->data;
+
+ break;
+ }
+
+ default:
+ return -EINVAL;
+ }
+
+ return bt_onchiphci_send(pkt_type, dest_id, &pkt);
+}
+
+void bl_packet_to_host(uint8_t pkt_type, uint16_t src_id, uint8_t *param, uint8_t param_len, struct net_buf *buf)
+{
+ uint16_t tlt_len;
+ bool prio = true;
+ uint8_t nb_h2c_cmd_pkts = 0x01;
+
+ uint8_t *buf_data = net_buf_tail(buf);
+ bt_buf_set_rx_adv(buf, false);
+
+ switch (pkt_type) {
+ case BT_HCI_CMD_CMP_EVT: {
+ tlt_len = BT_HCI_EVT_CC_PARAM_OFFSET + param_len;
+ *buf_data++ = BT_HCI_EVT_CMD_COMPLETE;
+ *buf_data++ = BT_HCI_CCEVT_HDR_PARLEN + param_len;
+ *buf_data++ = nb_h2c_cmd_pkts;
+ sys_put_le16(src_id, buf_data);
+ buf_data += 2;
+ memcpy(buf_data, param, param_len);
+ break;
+ }
+ case BT_HCI_CMD_STAT_EVT: {
+ tlt_len = BT_HCI_CSEVT_LEN;
+ *buf_data++ = BT_HCI_EVT_CMD_STATUS;
+ *buf_data++ = BT_HCI_CSVT_PARLEN;
+ *buf_data++ = *(uint8_t *)param;
+ *buf_data++ = nb_h2c_cmd_pkts;
+ sys_put_le16(src_id, buf_data);
+ break;
+ }
+ case BT_HCI_LE_EVT: {
+ prio = false;
+ bt_buf_set_type(buf, BT_BUF_EVT);
+ if (param[0] == BT_HCI_EVT_LE_ADVERTISING_REPORT) {
+ bt_buf_set_rx_adv(buf, true);
+ }
+ tlt_len = BT_HCI_EVT_LE_PARAM_OFFSET + param_len;
+ *buf_data++ = BT_HCI_EVT_LE_META_EVENT;
+ *buf_data++ = param_len;
+ memcpy(buf_data, param, param_len);
+ break;
+ }
+ case BT_HCI_EVT: {
+ if (src_id != BT_HCI_EVT_NUM_COMPLETED_PACKETS) {
+ prio = false;
+ }
+ bt_buf_set_type(buf, BT_BUF_EVT);
+ tlt_len = BT_HCI_EVT_LE_PARAM_OFFSET + param_len;
+ *buf_data++ = src_id;
+ *buf_data++ = param_len;
+ memcpy(buf_data, param, param_len);
+ break;
+ }
+ case BT_HCI_ACL_DATA: {
+ prio = false;
+ bt_buf_set_type(buf, BT_BUF_ACL_IN);
+ tlt_len = bt_onchiphci_hanlde_rx_acl(param, buf_data);
+ break;
+ }
+ default: {
+ net_buf_unref(buf);
+ return;
+ }
+ }
+
+ net_buf_add(buf, tlt_len);
+
+ if (prio) {
+ bt_recv_prio(buf);
+ } else {
+ hci_driver_enque_recvq(buf);
+ }
+}
+
+void bl_trigger_queued_msg()
+{
+ struct net_buf *buf = NULL;
+ struct rx_msg_struct *msg = NULL;
+
+ do {
+ unsigned int lock = irq_lock();
+
+ if (k_queue_is_empty(&msg_queue)) {
+ break;
+ }
+
+ if (bt_buf_get_rx_avail_cnt() <= CONFIG_BT_RX_BUF_RSV_COUNT)
+ break;
+
+ buf = bt_buf_get_rx(BT_BUF_ACL_IN, K_NO_WAIT);
+ if (!buf) {
+ break;
+ }
+
+ msg = k_fifo_get(&msg_queue, K_NO_WAIT);
+
+ BT_ASSERT(msg);
+
+ bl_packet_to_host(msg->pkt_type, msg->src_id, msg->param, msg->param_len, buf);
+
+ irq_unlock(lock);
+
+ if (msg->param) {
+ k_free(msg->param);
+ }
+ memset(msg, 0, sizeof(struct rx_msg_struct));
+
+ } while (buf);
+}
+
+static void bl_onchiphci_rx_packet_handler(uint8_t pkt_type, uint16_t src_id, uint8_t *param, uint8_t param_len)
+{
+ struct net_buf *buf = NULL;
+ struct rx_msg_struct *rx_msg = NULL;
+
+ if (pkt_type == BT_HCI_CMD_CMP_EVT || pkt_type == BT_HCI_CMD_STAT_EVT) {
+ buf = bt_buf_get_cmd_complete(K_FOREVER);
+ bl_packet_to_host(pkt_type, src_id, param, param_len, buf);
+ return;
+ } else if (pkt_type == BT_HCI_LE_EVT && param[0] == BT_HCI_EVT_LE_ADVERTISING_REPORT) {
+ if (bt_buf_get_rx_avail_cnt() <= CONFIG_BT_RX_BUF_RSV_COUNT) {
+ BT_INFO("Discard adv report.");
+#if defined(BFLB_BLE_NOTIFY_ADV_DISCARDED)
+ ble_controller_notify_adv_discarded(¶m[4], param[2]);
+#endif
+ return;
+ }
+ buf = bt_buf_get_rx(BT_BUF_ACL_IN, K_NO_WAIT);
+ if (buf)
+ bl_packet_to_host(pkt_type, src_id, param, param_len, buf);
+ return;
+ } else {
+ if (pkt_type != BT_HCI_ACL_DATA) {
+ /* Using the reserved buf (CONFIG_BT_RX_BUF_RSV_COUNT) firstly. */
+ buf = bt_buf_get_rx(BT_BUF_ACL_IN, K_NO_WAIT);
+ if (buf) {
+ bl_packet_to_host(pkt_type, src_id, param, param_len, buf);
+ return;
+ }
+ }
+
+ rx_msg = bl_find_valid_data_msg();
+ }
+
+ BT_ASSERT(rx_msg);
+
+ rx_msg->pkt_type = pkt_type;
+ rx_msg->src_id = src_id;
+ rx_msg->param_len = param_len;
+ if (param_len) {
+ rx_msg->param = k_malloc(param_len);
+ memcpy(rx_msg->param, param, param_len);
+ }
+
+ k_fifo_put(&msg_queue, rx_msg);
+
+ bl_trigger_queued_msg();
+}
+
+uint8_t bl_onchiphci_interface_init(void)
+{
+ for (int i = 0; i < DATA_MSG_CNT; i++) {
+ memset(data_msg + i, 0, sizeof(struct rx_msg_struct));
+ }
+
+ k_queue_init(&msg_queue, DATA_MSG_CNT);
+
+ return bt_onchiphci_interface_init(bl_onchiphci_rx_packet_handler);
+}
+
+void bl_onchiphci_interface_deinit(void)
+{
+ struct rx_msg_struct *msg;
+
+ do {
+ msg = k_fifo_get(&msg_queue, K_NO_WAIT);
+ if (msg) {
+ if (msg->param) {
+ k_free(msg->param);
+ }
+ } else {
+ break;
+ }
+ } while (1);
+
+ k_queue_free(&msg_queue);
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.h
new file mode 100644
index 00000000..6d13fa9a
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.h
@@ -0,0 +1,26 @@
+#ifndef __BL_HCI_WRAPPER_H__
+#define __BL_HCI_WRAPPER_H__
+
+#include "net/buf.h"
+#include "bluetooth.h"
+
+struct rx_msg_struct {
+ uint8_t pkt_type;
+ uint16_t src_id;
+ uint8_t *param;
+ uint8_t param_len;
+} __packed;
+
+typedef enum {
+ DATA_TYPE_COMMAND = 1,
+ DATA_TYPE_ACL = 2,
+ DATA_TYPE_SCO = 3,
+ DATA_TYPE_EVENT = 4
+} serial_data_type_t;
+
+uint8_t bl_onchiphci_interface_init(void);
+void bl_onchiphci_interface_deinit(void);
+void bl_trigger_queued_msg(void);
+int bl_onchiphci_send_2_controller(struct net_buf *buf);
+
+#endif //__BL_CONTROLLER_H__
\ No newline at end of file
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/atomic_c.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/atomic_c.c
new file mode 100644
index 00000000..25c27fb6
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/atomic_c.c
@@ -0,0 +1,353 @@
+/*
+ * Copyright (c) 2016 Intel Corporation
+ * Copyright (c) 2011-2014 Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file Atomic ops in pure C
+ *
+ * This module provides the atomic operators for processors
+ * which do not support native atomic operations.
+ *
+ * The atomic operations are guaranteed to be atomic with respect
+ * to interrupt service routines, and to operations performed by peer
+ * processors.
+ *
+ * (originally from x86's atomic.c)
+ */
+#include
+#include
+#include "bl_port.h"
+//#include
+//#include
+
+/**
+ *
+ * @brief Atomic compare-and-set primitive
+ *
+ * This routine provides the compare-and-set operator. If the original value at
+ * equals , then is stored at and the
+ * function returns 1.
+ *
+ * If the original value at does not equal , then the store
+ * is not done and the function returns 0.
+ *
+ * The reading of the original value at , the comparison,
+ * and the write of the new value (if it occurs) all happen atomically with
+ * respect to both interrupts and accesses of other processors to .
+ *
+ * @param target address to be tested
+ * @param old_value value to compare against
+ * @param new_value value to compare against
+ * @return Returns 1 if is written, 0 otherwise.
+ */
+int atomic_cas(atomic_t *target, atomic_val_t old_value,
+ atomic_val_t new_value)
+{
+ unsigned int key;
+ int ret = 0;
+
+ key = irq_lock();
+
+ if (*target == old_value) {
+ *target = new_value;
+ ret = 1;
+ }
+
+ irq_unlock(key);
+
+ return ret;
+}
+
+/**
+ *
+ * @brief Atomic addition primitive
+ *
+ * This routine provides the atomic addition operator. The is
+ * atomically added to the value at , placing the result at ,
+ * and the old value from is returned.
+ *
+ * @param target memory location to add to
+ * @param value the value to add
+ *
+ * @return The previous value from
+ */
+atomic_val_t atomic_add(atomic_t *target, atomic_val_t value)
+{
+ unsigned int key;
+ atomic_val_t ret;
+
+ key = irq_lock();
+
+ ret = *target;
+ *target += value;
+
+ irq_unlock(key);
+
+ return ret;
+}
+
+/**
+ *
+ * @brief Atomic subtraction primitive
+ *
+ * This routine provides the atomic subtraction operator. The is
+ * atomically subtracted from the value at , placing the result at
+ * , and the old value from is returned.
+ *
+ * @param target the memory location to subtract from
+ * @param value the value to subtract
+ *
+ * @return The previous value from
+ */
+atomic_val_t atomic_sub(atomic_t *target, atomic_val_t value)
+{
+ unsigned int key;
+ atomic_val_t ret;
+
+ key = irq_lock();
+
+ ret = *target;
+ *target -= value;
+
+ irq_unlock(key);
+
+ return ret;
+}
+
+/**
+ *
+ * @brief Atomic increment primitive
+ *
+ * @param target memory location to increment
+ *
+ * This routine provides the atomic increment operator. The value at
+ * is atomically incremented by 1, and the old value from is returned.
+ *
+ * @return The value from before the increment
+ */
+atomic_val_t atomic_inc(atomic_t *target)
+{
+ unsigned int key;
+ atomic_val_t ret;
+
+ key = irq_lock();
+
+ ret = *target;
+ (*target)++;
+
+ irq_unlock(key);
+
+ return ret;
+}
+
+/**
+ *
+ * @brief Atomic decrement primitive
+ *
+ * @param target memory location to decrement
+ *
+ * This routine provides the atomic decrement operator. The value at
+ * is atomically decremented by 1, and the old value from is returned.
+ *
+ * @return The value from prior to the decrement
+ */
+atomic_val_t atomic_dec(atomic_t *target)
+{
+ unsigned int key;
+ atomic_val_t ret;
+
+ key = irq_lock();
+
+ ret = *target;
+ (*target)--;
+
+ irq_unlock(key);
+
+ return ret;
+}
+
+/**
+ *
+ * @brief Atomic get primitive
+ *
+ * @param target memory location to read from
+ *
+ * This routine provides the atomic get primitive to atomically read
+ * a value from . It simply does an ordinary load. Note that
+ * is expected to be aligned to a 4-byte boundary.
+ *
+ * @return The value read from
+ */
+atomic_val_t atomic_get(const atomic_t *target)
+{
+ return *target;
+}
+
+/**
+ *
+ * @brief Atomic get-and-set primitive
+ *
+ * This routine provides the atomic set operator. The is atomically
+ * written at and the previous value at is returned.
+ *
+ * @param target the memory location to write to
+ * @param value the value to write
+ *
+ * @return The previous value from
+ */
+atomic_val_t atomic_set(atomic_t *target, atomic_val_t value)
+{
+ unsigned int key;
+ atomic_val_t ret;
+
+ key = irq_lock();
+
+ ret = *target;
+ *target = value;
+
+ irq_unlock(key);
+
+ return ret;
+}
+
+/**
+ *
+ * @brief Atomic clear primitive
+ *
+ * This routine provides the atomic clear operator. The value of 0 is atomically
+ * written at and the previous value at is returned. (Hence,
+ * atomic_clear(pAtomicVar) is equivalent to atomic_set(pAtomicVar, 0).)
+ *
+ * @param target the memory location to write
+ *
+ * @return The previous value from
+ */
+atomic_val_t atomic_clear(atomic_t *target)
+{
+ unsigned int key;
+ atomic_val_t ret;
+
+ key = irq_lock();
+
+ ret = *target;
+ *target = 0;
+
+ irq_unlock(key);
+
+ return ret;
+}
+
+/**
+ *
+ * @brief Atomic bitwise inclusive OR primitive
+ *
+ * This routine provides the atomic bitwise inclusive OR operator. The
+ * is atomically bitwise OR'ed with the value at , placing the result
+ * at , and the previous value at is returned.
+ *
+ * @param target the memory location to be modified
+ * @param value the value to OR
+ *
+ * @return The previous value from
+ */
+atomic_val_t atomic_or(atomic_t *target, atomic_val_t value)
+{
+ unsigned int key;
+ atomic_val_t ret;
+
+ key = irq_lock();
+
+ ret = *target;
+ *target |= value;
+
+ irq_unlock(key);
+
+ return ret;
+}
+
+/**
+ *
+ * @brief Atomic bitwise exclusive OR (XOR) primitive
+ *
+ * This routine provides the atomic bitwise exclusive OR operator. The
+ * is atomically bitwise XOR'ed with the value at , placing the result
+ * at , and the previous value at is returned.
+ *
+ * @param target the memory location to be modified
+ * @param value the value to XOR
+ *
+ * @return The previous value from
+ */
+atomic_val_t atomic_xor(atomic_t *target, atomic_val_t value)
+{
+ unsigned int key;
+ atomic_val_t ret;
+
+ key = irq_lock();
+
+ ret = *target;
+ *target ^= value;
+
+ irq_unlock(key);
+
+ return ret;
+}
+
+/**
+ *
+ * @brief Atomic bitwise AND primitive
+ *
+ * This routine provides the atomic bitwise AND operator. The is
+ * atomically bitwise AND'ed with the value at , placing the result
+ * at , and the previous value at is returned.
+ *
+ * @param target the memory location to be modified
+ * @param value the value to AND
+ *
+ * @return The previous value from
+ */
+atomic_val_t atomic_and(atomic_t *target, atomic_val_t value)
+{
+ unsigned int key;
+ atomic_val_t ret;
+
+ key = irq_lock();
+
+ ret = *target;
+ *target &= value;
+
+ irq_unlock(key);
+
+ return ret;
+}
+
+/**
+ *
+ * @brief Atomic bitwise NAND primitive
+ *
+ * This routine provides the atomic bitwise NAND operator. The is
+ * atomically bitwise NAND'ed with the value at , placing the result
+ * at , and the previous value at is returned.
+ *
+ * @param target the memory location to be modified
+ * @param value the value to NAND
+ *
+ * @return The previous value from
+ */
+atomic_val_t atomic_nand(atomic_t *target, atomic_val_t value)
+{
+ unsigned int key;
+ atomic_val_t ret;
+
+ key = irq_lock();
+
+ ret = *target;
+ *target = ~(*target & value);
+
+ irq_unlock(key);
+
+ return ret;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/buf.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/buf.c
new file mode 100644
index 00000000..44bdbda0
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/buf.c
@@ -0,0 +1,1137 @@
+/* buf.c - Buffer management */
+
+/*
+ * Copyright (c) 2015 Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#define LOG_MODULE_NAME net_buf
+
+#if !defined(BFLB_BLE)
+#define LOG_LEVEL CONFIG_NET_BUF_LOG_LEVEL
+#endif
+
+#include
+//LOG_MODULE_REGISTER(LOG_MODULE_NAME);
+
+#include
+#include
+#include
+#include
+#include
+#include
+#if defined(BFLB_BLE)
+#if defined(BFLB_DYNAMIC_ALLOC_MEM)
+#include "bl_port.h"
+#endif
+#include "bl_hci_wrapper.h"
+#endif
+
+#if defined(CONFIG_NET_BUF_LOG)
+#define NET_BUF_DBG(fmt, ...) LOG_DBG("(%p) " fmt, k_current_get(), \
+ ##__VA_ARGS__)
+#define NET_BUF_ERR(fmt, ...) LOG_ERR(fmt, ##__VA_ARGS__)
+#define NET_BUF_WARN(fmt, ...) LOG_WRN(fmt, ##__VA_ARGS__)
+#define NET_BUF_INFO(fmt, ...) LOG_INF(fmt, ##__VA_ARGS__)
+#define NET_BUF_ASSERT(cond) \
+ do { \
+ if (!(cond)) { \
+ NET_BUF_ERR("assert: '" #cond "' failed"); \
+ } \
+ } while (0)
+#else
+
+#define NET_BUF_DBG(fmt, ...)
+#define NET_BUF_ERR(fmt, ...)
+#define NET_BUF_WARN(fmt, ...)
+#define NET_BUF_INFO(fmt, ...)
+#define NET_BUF_ASSERT(cond)
+#endif /* CONFIG_NET_BUF_LOG */
+
+#if defined(CONFIG_NET_BUF_WARN_ALLOC_INTERVAL) && (CONFIG_NET_BUF_WARN_ALLOC_INTERVAL > 0)
+//#if CONFIG_NET_BUF_WARN_ALLOC_INTERVAL > 0
+#define WARN_ALLOC_INTERVAL K_SECONDS(CONFIG_NET_BUF_WARN_ALLOC_INTERVAL)
+#else
+#define WARN_ALLOC_INTERVAL K_FOREVER
+#endif
+
+#if defined(BFLB_DYNAMIC_ALLOC_MEM)
+extern struct net_buf_pool hci_cmd_pool;
+extern struct net_buf_pool hci_rx_pool;
+#if defined(CONFIG_BT_CONN)
+extern struct net_buf_pool acl_tx_pool;
+extern struct net_buf_pool num_complete_pool;
+#if CONFIG_BT_ATT_PREPARE_COUNT > 0
+extern struct net_buf_pool prep_pool;
+#endif
+#if defined(CONFIG_BT_HCI_ACL_FLOW_CONTROL)
+extern struct net_buf_pool acl_in_pool;
+#endif
+#if CONFIG_BT_ATT_PREPARE_COUNT > 0
+extern struct net_buf_pool frag_pool;
+#endif
+#endif //CONFIG_BT_CONN
+#if defined(CONFIG_BT_DISCARDABLE_BUF_COUNT)
+extern struct net_buf_pool discardable_pool;
+#endif
+#ifdef CONFIG_BT_MESH
+extern struct net_buf_pool adv_buf_pool;
+extern struct net_buf_pool loopback_buf_pool;
+#if defined(CONFIG_BT_MESH_FRIEND)
+extern struct net_buf_pool friend_buf_pool;
+#endif //CONFIG_BT_MESH_FRIEND
+#endif
+#if defined(CONFIG_BT_BREDR)
+extern struct net_buf_pool br_sig_pool;
+extern struct net_buf_pool sdp_pool;
+extern struct net_buf_pool hf_pool;
+extern struct net_buf_pool dummy_pool;
+#endif
+
+#if defined(CONFIG_AUTO_PTS)
+extern struct net_buf_pool server_pool;
+extern struct net_buf_pool data_pool;
+#endif
+
+struct net_buf_pool *_net_buf_pool_list[] = {
+ &hci_cmd_pool,
+ &hci_rx_pool,
+
+#if defined(CONFIG_BT_CONN)
+ &acl_tx_pool,
+ &num_complete_pool,
+#if CONFIG_BT_ATT_PREPARE_COUNT > 0
+ &prep_pool,
+#endif
+#if defined(CONFIG_BT_HCI_ACL_FLOW_CONTROL)
+ &acl_in_pool,
+#endif
+#if CONFIG_BT_L2CAP_TX_FRAG_COUNT > 0
+ &frag_pool,
+#endif
+#endif //defined(CONFIG_BT_CONN)
+#if defined(CONFIG_BT_DISCARDABLE_BUF_COUNT)
+ discardable_pool,
+#endif
+#ifdef CONFIG_BT_MESH
+ &adv_buf_pool,
+ &loopback_buf_pool,
+#if defined(CONFIG_BT_MESH_FRIEND)
+ &friend_buf_pool,
+#endif
+#endif
+#if defined(CONFIG_BT_BREDR)
+ &sdp_pool,
+ &br_sig_pool,
+ &hf_pool,
+ &dummy_pool,
+#endif
+#if defined(CONFIG_AUTO_PTS)
+ &server_pool,
+ &data_pool,
+#endif
+};
+
+#else
+extern struct net_buf_pool _net_buf_pool_list[];
+#endif //BFLB_DYNAMIC_ALLOC_MEM
+
+#if defined(BFLB_DYNAMIC_ALLOC_MEM)
+void net_buf_init(struct net_buf_pool *buf_pool, u16_t buf_count, size_t data_size, destroy_cb_t destroy)
+{
+ struct net_buf_pool_fixed *buf_fixed;
+ buf_pool->alloc = (struct net_buf_data_alloc *)k_malloc(sizeof(void *));
+ buf_pool->alloc->alloc_data = (struct net_buf_pool_fixed *)k_malloc(sizeof(void *));
+
+ buf_fixed = (struct net_buf_pool_fixed *)buf_pool->alloc->alloc_data;
+
+ buf_pool->alloc->cb = &net_buf_fixed_cb;
+ buf_fixed->data_size = data_size;
+ buf_fixed->data_pool = (u8_t *)k_malloc(buf_count * data_size);
+ buf_pool->__bufs = (struct net_buf *)k_malloc(buf_count * sizeof(struct net_buf));
+ buf_pool->buf_count = buf_count;
+ buf_pool->uninit_count = buf_count;
+#if defined(CONFIG_NET_BUF_POOL_USAGE)
+ buf_pool->avail_count = buf_count;
+#endif
+ buf_pool->destroy = destroy;
+
+ k_lifo_init(&(buf_pool->free), buf_count);
+}
+
+void net_buf_deinit(struct net_buf_pool *buf_pool)
+{
+ extern void bt_delete_queue(struct k_fifo * queue_to_del);
+ bt_delete_queue((struct k_fifo *)(&(buf_pool->free)));
+
+ struct net_buf_pool_fixed *buf_fixed = (struct net_buf_pool_fixed *)buf_pool->alloc->alloc_data;
+ k_free(buf_fixed->data_pool);
+ k_free(buf_pool->__bufs);
+ k_free(buf_pool->alloc->alloc_data);
+ k_free(buf_pool->alloc);
+}
+#endif
+
+struct net_buf_pool *net_buf_pool_get(int id)
+{
+#if defined(BFLB_DYNAMIC_ALLOC_MEM)
+ return _net_buf_pool_list[id];
+#else
+ return &_net_buf_pool_list[id];
+#endif
+}
+
+static int pool_id(struct net_buf_pool *pool)
+{
+#if defined(BFLB_DYNAMIC_ALLOC_MEM)
+ int index;
+
+ for (index = 0; index < (sizeof(_net_buf_pool_list) / 4); index++) {
+ if (_net_buf_pool_list[index] == pool) {
+ break;
+ }
+ }
+ NET_BUF_ASSERT(index < (sizeof(_net_buf_pool_list) / 4));
+ return index;
+#else
+ return pool - _net_buf_pool_list;
+#endif
+}
+
+int net_buf_id(struct net_buf *buf)
+{
+ struct net_buf_pool *pool = net_buf_pool_get(buf->pool_id);
+
+ return buf - pool->__bufs;
+}
+
+static inline struct net_buf *pool_get_uninit(struct net_buf_pool *pool,
+ u16_t uninit_count)
+{
+ struct net_buf *buf;
+
+ buf = &pool->__bufs[pool->buf_count - uninit_count];
+
+ buf->pool_id = pool_id(pool);
+
+ return buf;
+}
+
+void net_buf_reset(struct net_buf *buf)
+{
+ NET_BUF_ASSERT(buf->flags == 0U);
+ NET_BUF_ASSERT(buf->frags == NULL);
+
+ net_buf_simple_reset(&buf->b);
+}
+
+#if !defined(BFLB_BLE)
+static u8_t *generic_data_ref(struct net_buf *buf, u8_t *data)
+{
+ u8_t *ref_count;
+
+ ref_count = data - 1;
+ (*ref_count)++;
+
+ return data;
+}
+
+static u8_t *mem_pool_data_alloc(struct net_buf *buf, size_t *size,
+ s32_t timeout)
+{
+ struct net_buf_pool *buf_pool = net_buf_pool_get(buf->pool_id);
+ struct k_mem_pool *pool = buf_pool->alloc->alloc_data;
+ struct k_mem_block block;
+ u8_t *ref_count;
+
+ /* Reserve extra space for k_mem_block_id and ref-count (u8_t) */
+ if (k_mem_pool_alloc(pool, &block,
+ sizeof(struct k_mem_block_id) + 1 + *size,
+ timeout)) {
+ return NULL;
+ }
+
+ /* save the block descriptor info at the start of the actual block */
+ memcpy(block.data, &block.id, sizeof(block.id));
+
+ ref_count = (u8_t *)block.data + sizeof(block.id);
+ *ref_count = 1U;
+
+ /* Return pointer to the byte following the ref count */
+ return ref_count + 1;
+}
+
+static void mem_pool_data_unref(struct net_buf *buf, u8_t *data)
+{
+ struct k_mem_block_id id;
+ u8_t *ref_count;
+
+ ref_count = data - 1;
+ if (--(*ref_count)) {
+ return;
+ }
+
+ /* Need to copy to local variable due to alignment */
+ memcpy(&id, ref_count - sizeof(id), sizeof(id));
+ k_mem_pool_free_id(&id);
+}
+
+const struct net_buf_data_cb net_buf_var_cb = {
+ .alloc = mem_pool_data_alloc,
+ .ref = generic_data_ref,
+ .unref = mem_pool_data_unref,
+};
+#endif
+
+static u8_t *fixed_data_alloc(struct net_buf *buf, size_t *size, s32_t timeout)
+{
+ struct net_buf_pool *pool = net_buf_pool_get(buf->pool_id);
+ const struct net_buf_pool_fixed *fixed = pool->alloc->alloc_data;
+
+ *size = MIN(fixed->data_size, *size);
+
+ return fixed->data_pool + fixed->data_size * net_buf_id(buf);
+}
+
+static void fixed_data_unref(struct net_buf *buf, u8_t *data)
+{
+ /* Nothing needed for fixed-size data pools */
+}
+
+const struct net_buf_data_cb net_buf_fixed_cb = {
+ .alloc = fixed_data_alloc,
+ .unref = fixed_data_unref,
+};
+
+#if defined(CONFIG_HEAP_MEM_POOL_SIZE) && (CONFIG_HEAP_MEM_POOL_SIZE > 0)
+
+static u8_t *heap_data_alloc(struct net_buf *buf, size_t *size, s32_t timeout)
+{
+ u8_t *ref_count;
+
+ ref_count = k_malloc(1 + *size);
+ if (!ref_count) {
+ return NULL;
+ }
+
+ *ref_count = 1U;
+
+ return ref_count + 1;
+}
+
+static void heap_data_unref(struct net_buf *buf, u8_t *data)
+{
+ u8_t *ref_count;
+
+ ref_count = data - 1;
+ if (--(*ref_count)) {
+ return;
+ }
+
+ k_free(ref_count);
+}
+
+static const struct net_buf_data_cb net_buf_heap_cb = {
+ .alloc = heap_data_alloc,
+ .ref = generic_data_ref,
+ .unref = heap_data_unref,
+};
+
+const struct net_buf_data_alloc net_buf_heap_alloc = {
+ .cb = &net_buf_heap_cb,
+};
+
+#endif /* CONFIG_HEAP_MEM_POOL_SIZE > 0 */
+
+static u8_t *data_alloc(struct net_buf *buf, size_t *size, s32_t timeout)
+{
+ struct net_buf_pool *pool = net_buf_pool_get(buf->pool_id);
+
+ return pool->alloc->cb->alloc(buf, size, timeout);
+}
+
+static u8_t *data_ref(struct net_buf *buf, u8_t *data)
+{
+ struct net_buf_pool *pool = net_buf_pool_get(buf->pool_id);
+
+ return pool->alloc->cb->ref(buf, data);
+}
+
+static void data_unref(struct net_buf *buf, u8_t *data)
+{
+ struct net_buf_pool *pool = net_buf_pool_get(buf->pool_id);
+
+ if (buf->flags & NET_BUF_EXTERNAL_DATA) {
+ return;
+ }
+
+ pool->alloc->cb->unref(buf, data);
+}
+
+#if defined(CONFIG_NET_BUF_LOG)
+struct net_buf *net_buf_alloc_len_debug(struct net_buf_pool *pool, size_t size,
+ s32_t timeout, const char *func,
+ int line)
+#else
+struct net_buf *net_buf_alloc_len(struct net_buf_pool *pool, size_t size,
+ s32_t timeout)
+#endif
+{
+ u32_t alloc_start = k_uptime_get_32();
+ struct net_buf *buf;
+ unsigned int key;
+
+ NET_BUF_ASSERT(pool);
+
+ NET_BUF_DBG("%s():%d: pool %p size %zu timeout %d", func, line, pool,
+ size, timeout);
+
+ /* We need to lock interrupts temporarily to prevent race conditions
+ * when accessing pool->uninit_count.
+ */
+ key = irq_lock();
+
+ /* If there are uninitialized buffers we're guaranteed to succeed
+ * with the allocation one way or another.
+ */
+ if (pool->uninit_count) {
+ u16_t uninit_count;
+
+ /* If this is not the first access to the pool, we can
+ * be opportunistic and try to fetch a previously used
+ * buffer from the LIFO with K_NO_WAIT.
+ */
+ if (pool->uninit_count < pool->buf_count) {
+ buf = k_lifo_get(&pool->free, K_NO_WAIT);
+ if (buf) {
+ irq_unlock(key);
+ goto success;
+ }
+ }
+
+ uninit_count = pool->uninit_count--;
+ irq_unlock(key);
+
+ buf = pool_get_uninit(pool, uninit_count);
+ goto success;
+ }
+
+ irq_unlock(key);
+
+#if defined(CONFIG_NET_BUF_LOG) && (CONFIG_NET_BUF_LOG_LEVEL >= LOG_LEVEL_WRN)
+ if (timeout == K_FOREVER) {
+ u32_t ref = k_uptime_get_32();
+ buf = k_lifo_get(&pool->free, K_NO_WAIT);
+ while (!buf) {
+#if defined(CONFIG_NET_BUF_POOL_USAGE)
+ NET_BUF_WARN("%s():%d: Pool %s low on buffers.",
+ func, line, pool->name);
+#else
+ NET_BUF_WARN("%s():%d: Pool %p low on buffers.",
+ func, line, pool);
+#endif
+ buf = k_lifo_get(&pool->free, WARN_ALLOC_INTERVAL);
+#if defined(CONFIG_NET_BUF_POOL_USAGE)
+ NET_BUF_WARN("%s():%d: Pool %s blocked for %u secs",
+ func, line, pool->name,
+ (k_uptime_get_32() - ref) / MSEC_PER_SEC);
+#else
+ NET_BUF_WARN("%s():%d: Pool %p blocked for %u secs",
+ func, line, pool,
+ (k_uptime_get_32() - ref) / MSEC_PER_SEC);
+#endif
+ }
+ } else {
+ buf = k_lifo_get(&pool->free, timeout);
+ }
+#else
+ buf = k_lifo_get(&pool->free, timeout);
+#endif
+ if (!buf) {
+ NET_BUF_ERR("%s():%d: Failed to get free buffer", func, line);
+ return NULL;
+ }
+
+success:
+ NET_BUF_DBG("allocated buf %p", buf);
+
+ if (size) {
+ if (timeout != K_NO_WAIT && timeout != K_FOREVER) {
+ u32_t diff = k_uptime_get_32() - alloc_start;
+
+ timeout -= MIN(timeout, diff);
+ }
+
+ buf->__buf = data_alloc(buf, &size, timeout);
+ if (!buf->__buf) {
+ NET_BUF_ERR("%s():%d: Failed to allocate data",
+ func, line);
+ net_buf_destroy(buf);
+ return NULL;
+ }
+ } else {
+ buf->__buf = NULL;
+ }
+
+ buf->ref = 1U;
+ buf->flags = 0U;
+ buf->frags = NULL;
+ buf->size = size;
+ net_buf_reset(buf);
+
+#if defined(CONFIG_NET_BUF_POOL_USAGE)
+ pool->avail_count--;
+ NET_BUF_ASSERT(pool->avail_count >= 0);
+#endif
+
+ return buf;
+}
+
+#if defined(CONFIG_NET_BUF_LOG)
+struct net_buf *net_buf_alloc_fixed_debug(struct net_buf_pool *pool,
+ s32_t timeout, const char *func,
+ int line)
+{
+ const struct net_buf_pool_fixed *fixed = pool->alloc->alloc_data;
+
+ return net_buf_alloc_len_debug(pool, fixed->data_size, timeout, func,
+ line);
+}
+#else
+struct net_buf *net_buf_alloc_fixed(struct net_buf_pool *pool, s32_t timeout)
+{
+ const struct net_buf_pool_fixed *fixed = pool->alloc->alloc_data;
+
+ return net_buf_alloc_len(pool, fixed->data_size, timeout);
+}
+#endif
+
+#if defined(CONFIG_NET_BUF_LOG)
+struct net_buf *net_buf_alloc_with_data_debug(struct net_buf_pool *pool,
+ void *data, size_t size,
+ s32_t timeout, const char *func,
+ int line)
+#else
+struct net_buf *net_buf_alloc_with_data(struct net_buf_pool *pool,
+ void *data, size_t size,
+ s32_t timeout)
+#endif
+{
+ struct net_buf *buf;
+
+#if defined(CONFIG_NET_BUF_LOG)
+ buf = net_buf_alloc_len_debug(pool, 0, timeout, func, line);
+#else
+ buf = net_buf_alloc_len(pool, 0, timeout);
+#endif
+ if (!buf) {
+ return NULL;
+ }
+
+ buf->__buf = data;
+ buf->data = data;
+ buf->size = size;
+ buf->len = size;
+ buf->flags = NET_BUF_EXTERNAL_DATA;
+
+ return buf;
+}
+
+#if defined(CONFIG_NET_BUF_LOG)
+struct net_buf *net_buf_get_debug(struct k_fifo *fifo, s32_t timeout,
+ const char *func, int line)
+#else
+struct net_buf *net_buf_get(struct k_fifo *fifo, s32_t timeout)
+#endif
+{
+ struct net_buf *buf, *frag;
+
+ NET_BUF_DBG("%s():%d: fifo %p timeout %d", func, line, fifo, timeout);
+
+ buf = k_fifo_get(fifo, timeout);
+ if (!buf) {
+ return NULL;
+ }
+
+ NET_BUF_DBG("%s():%d: buf %p fifo %p", func, line, buf, fifo);
+
+ /* Get any fragments belonging to this buffer */
+ for (frag = buf; (frag->flags & NET_BUF_FRAGS); frag = frag->frags) {
+ frag->frags = k_fifo_get(fifo, K_NO_WAIT);
+ NET_BUF_ASSERT(frag->frags);
+
+ /* The fragments flag is only for FIFO-internal usage */
+ frag->flags &= ~NET_BUF_FRAGS;
+ }
+
+ /* Mark the end of the fragment list */
+ frag->frags = NULL;
+
+ return buf;
+}
+
+void net_buf_simple_init_with_data(struct net_buf_simple *buf,
+ void *data, size_t size)
+{
+ buf->__buf = data;
+ buf->data = data;
+ buf->size = size;
+ buf->len = size;
+}
+
+void net_buf_simple_reserve(struct net_buf_simple *buf, size_t reserve)
+{
+ NET_BUF_ASSERT(buf);
+ NET_BUF_ASSERT(buf->len == 0U);
+ NET_BUF_DBG("buf %p reserve %zu", buf, reserve);
+
+ buf->data = buf->__buf + reserve;
+}
+
+void net_buf_slist_put(sys_slist_t *list, struct net_buf *buf)
+{
+ struct net_buf *tail;
+ unsigned int key;
+
+ NET_BUF_ASSERT(list);
+ NET_BUF_ASSERT(buf);
+
+ for (tail = buf; tail->frags; tail = tail->frags) {
+ tail->flags |= NET_BUF_FRAGS;
+ }
+
+ key = irq_lock();
+ sys_slist_append_list(list, &buf->node, &tail->node);
+ irq_unlock(key);
+}
+
+struct net_buf *net_buf_slist_get(sys_slist_t *list)
+{
+ struct net_buf *buf, *frag;
+ unsigned int key;
+
+ NET_BUF_ASSERT(list);
+
+ key = irq_lock();
+ buf = (void *)sys_slist_get(list);
+ irq_unlock(key);
+
+ if (!buf) {
+ return NULL;
+ }
+
+ /* Get any fragments belonging to this buffer */
+ for (frag = buf; (frag->flags & NET_BUF_FRAGS); frag = frag->frags) {
+ key = irq_lock();
+ frag->frags = (void *)sys_slist_get(list);
+ irq_unlock(key);
+
+ NET_BUF_ASSERT(frag->frags);
+
+ /* The fragments flag is only for list-internal usage */
+ frag->flags &= ~NET_BUF_FRAGS;
+ }
+
+ /* Mark the end of the fragment list */
+ frag->frags = NULL;
+
+ return buf;
+}
+
+void net_buf_put(struct k_fifo *fifo, struct net_buf *buf)
+{
+ struct net_buf *tail;
+
+ NET_BUF_ASSERT(fifo);
+ NET_BUF_ASSERT(buf);
+
+ for (tail = buf; tail->frags; tail = tail->frags) {
+ tail->flags |= NET_BUF_FRAGS;
+ }
+
+ k_fifo_put_list(fifo, buf, tail);
+}
+
+#if defined(CONFIG_NET_BUF_LOG)
+void net_buf_unref_debug(struct net_buf *buf, const char *func, int line)
+#else
+void net_buf_unref(struct net_buf *buf)
+#endif
+{
+ NET_BUF_ASSERT(buf);
+
+ while (buf) {
+ struct net_buf *frags = buf->frags;
+ struct net_buf_pool *pool;
+
+#if defined(CONFIG_NET_BUF_LOG)
+ if (!buf->ref) {
+ NET_BUF_ERR("%s():%d: buf %p double free", func, line,
+ buf);
+ return;
+ }
+#endif
+ NET_BUF_DBG("buf %p ref %u pool_id %u frags %p", buf, buf->ref,
+ buf->pool_id, buf->frags);
+
+ unsigned int key = irq_lock(); /* Added by bouffalo lab, to protect ref decrease */
+ if (--buf->ref > 0) {
+ irq_unlock(key); /* Added by bouffalo lab */
+ return;
+ }
+ irq_unlock(key); /* Added by bouffalo lab */
+
+ if (buf->__buf) {
+ data_unref(buf, buf->__buf);
+ buf->__buf = NULL;
+ }
+
+ buf->data = NULL;
+ buf->frags = NULL;
+
+ pool = net_buf_pool_get(buf->pool_id);
+
+#if defined(CONFIG_NET_BUF_POOL_USAGE)
+ pool->avail_count++;
+ NET_BUF_ASSERT(pool->avail_count <= pool->buf_count);
+#endif
+
+ if (pool->destroy) {
+ pool->destroy(buf);
+ } else {
+ net_buf_destroy(buf);
+ }
+
+ buf = frags;
+
+#if defined(BFLB_BLE)
+ if (pool == &hci_rx_pool) {
+ bl_trigger_queued_msg();
+ return;
+ }
+#endif
+ }
+}
+
+struct net_buf *net_buf_ref(struct net_buf *buf)
+{
+ NET_BUF_ASSERT(buf);
+
+ NET_BUF_DBG("buf %p (old) ref %u pool_id %u",
+ buf, buf->ref, buf->pool_id);
+
+ unsigned int key = irq_lock(); /* Added by bouffalo lab, to protect ref increase */
+ buf->ref++;
+ irq_unlock(key); /* Added by bouffalo lab */
+ return buf;
+}
+
+struct net_buf *net_buf_clone(struct net_buf *buf, s32_t timeout)
+{
+ u32_t alloc_start = k_uptime_get_32();
+ struct net_buf_pool *pool;
+ struct net_buf *clone;
+
+ NET_BUF_ASSERT(buf);
+
+ pool = net_buf_pool_get(buf->pool_id);
+
+ clone = net_buf_alloc_len(pool, 0, timeout);
+ if (!clone) {
+ return NULL;
+ }
+
+ /* If the pool supports data referencing use that. Otherwise
+ * we need to allocate new data and make a copy.
+ */
+ if (pool->alloc->cb->ref && !(buf->flags & NET_BUF_EXTERNAL_DATA)) {
+ clone->__buf = data_ref(buf, buf->__buf);
+ clone->data = buf->data;
+ clone->len = buf->len;
+ clone->size = buf->size;
+ } else {
+ size_t size = buf->size;
+
+ if (timeout != K_NO_WAIT && timeout != K_FOREVER) {
+ u32_t diff = k_uptime_get_32() - alloc_start;
+
+ timeout -= MIN(timeout, diff);
+ }
+
+ clone->__buf = data_alloc(clone, &size, timeout);
+ if (!clone->__buf || size < buf->size) {
+ net_buf_destroy(clone);
+ return NULL;
+ }
+
+ clone->size = size;
+ clone->data = clone->__buf + net_buf_headroom(buf);
+ net_buf_add_mem(clone, buf->data, buf->len);
+ }
+
+ return clone;
+}
+
+struct net_buf *net_buf_frag_last(struct net_buf *buf)
+{
+ NET_BUF_ASSERT(buf);
+
+ while (buf->frags) {
+ buf = buf->frags;
+ }
+
+ return buf;
+}
+
+void net_buf_frag_insert(struct net_buf *parent, struct net_buf *frag)
+{
+ NET_BUF_ASSERT(parent);
+ NET_BUF_ASSERT(frag);
+
+ if (parent->frags) {
+ net_buf_frag_last(frag)->frags = parent->frags;
+ }
+ /* Take ownership of the fragment reference */
+ parent->frags = frag;
+}
+
+struct net_buf *net_buf_frag_add(struct net_buf *head, struct net_buf *frag)
+{
+ NET_BUF_ASSERT(frag);
+
+ if (!head) {
+ return net_buf_ref(frag);
+ }
+
+ net_buf_frag_insert(net_buf_frag_last(head), frag);
+
+ return head;
+}
+
+#if defined(CONFIG_NET_BUF_LOG)
+struct net_buf *net_buf_frag_del_debug(struct net_buf *parent,
+ struct net_buf *frag,
+ const char *func, int line)
+#else
+struct net_buf *net_buf_frag_del(struct net_buf *parent, struct net_buf *frag)
+#endif
+{
+ struct net_buf *next_frag;
+
+ NET_BUF_ASSERT(frag);
+
+ if (parent) {
+ NET_BUF_ASSERT(parent->frags);
+ NET_BUF_ASSERT(parent->frags == frag);
+ parent->frags = frag->frags;
+ }
+
+ next_frag = frag->frags;
+
+ frag->frags = NULL;
+
+#if defined(CONFIG_NET_BUF_LOG)
+ net_buf_unref_debug(frag, func, line);
+#else
+ net_buf_unref(frag);
+#endif
+
+ return next_frag;
+}
+
+size_t net_buf_linearize(void *dst, size_t dst_len, struct net_buf *src,
+ size_t offset, size_t len)
+{
+ struct net_buf *frag;
+ size_t to_copy;
+ size_t copied;
+
+ len = MIN(len, dst_len);
+
+ frag = src;
+
+ /* find the right fragment to start copying from */
+ while (frag && offset >= frag->len) {
+ offset -= frag->len;
+ frag = frag->frags;
+ }
+
+ /* traverse the fragment chain until len bytes are copied */
+ copied = 0;
+ while (frag && len > 0) {
+ to_copy = MIN(len, frag->len - offset);
+ memcpy((u8_t *)dst + copied, frag->data + offset, to_copy);
+
+ copied += to_copy;
+
+ /* to_copy is always <= len */
+ len -= to_copy;
+ frag = frag->frags;
+
+ /* after the first iteration, this value will be 0 */
+ offset = 0;
+ }
+
+ return copied;
+}
+
+/* This helper routine will append multiple bytes, if there is no place for
+ * the data in current fragment then create new fragment and add it to
+ * the buffer. It assumes that the buffer has at least one fragment.
+ */
+size_t net_buf_append_bytes(struct net_buf *buf, size_t len,
+ const void *value, s32_t timeout,
+ net_buf_allocator_cb allocate_cb, void *user_data)
+{
+ struct net_buf *frag = net_buf_frag_last(buf);
+ size_t added_len = 0;
+ const u8_t *value8 = value;
+
+ do {
+ u16_t count = MIN(len, net_buf_tailroom(frag));
+
+ net_buf_add_mem(frag, value8, count);
+ len -= count;
+ added_len += count;
+ value8 += count;
+
+ if (len == 0) {
+ return added_len;
+ }
+
+ frag = allocate_cb(timeout, user_data);
+ if (!frag) {
+ return added_len;
+ }
+
+ net_buf_frag_add(buf, frag);
+ } while (1);
+
+ /* Unreachable */
+ return 0;
+}
+
+#if defined(CONFIG_NET_BUF_SIMPLE_LOG)
+#define NET_BUF_SIMPLE_DBG(fmt, ...) NET_BUF_DBG(fmt, ##__VA_ARGS__)
+#define NET_BUF_SIMPLE_ERR(fmt, ...) NET_BUF_ERR(fmt, ##__VA_ARGS__)
+#define NET_BUF_SIMPLE_WARN(fmt, ...) NET_BUF_WARN(fmt, ##__VA_ARGS__)
+#define NET_BUF_SIMPLE_INFO(fmt, ...) NET_BUF_INFO(fmt, ##__VA_ARGS__)
+#define NET_BUF_SIMPLE_ASSERT(cond) NET_BUF_ASSERT(cond)
+#else
+#define NET_BUF_SIMPLE_DBG(fmt, ...)
+#define NET_BUF_SIMPLE_ERR(fmt, ...)
+#define NET_BUF_SIMPLE_WARN(fmt, ...)
+#define NET_BUF_SIMPLE_INFO(fmt, ...)
+#define NET_BUF_SIMPLE_ASSERT(cond)
+#endif /* CONFIG_NET_BUF_SIMPLE_LOG */
+
+void net_buf_simple_clone(const struct net_buf_simple *original,
+ struct net_buf_simple *clone)
+{
+ memcpy(clone, original, sizeof(struct net_buf_simple));
+}
+
+void *net_buf_simple_add(struct net_buf_simple *buf, size_t len)
+{
+ u8_t *tail = net_buf_simple_tail(buf);
+
+ NET_BUF_SIMPLE_DBG("buf %p len %zu", buf, len);
+
+ NET_BUF_SIMPLE_ASSERT(net_buf_simple_tailroom(buf) >= len);
+
+ buf->len += len;
+ return tail;
+}
+
+void *net_buf_simple_add_mem(struct net_buf_simple *buf, const void *mem,
+ size_t len)
+{
+ NET_BUF_SIMPLE_DBG("buf %p len %zu", buf, len);
+
+ return memcpy(net_buf_simple_add(buf, len), mem, len);
+}
+
+u8_t *net_buf_simple_add_u8(struct net_buf_simple *buf, u8_t val)
+{
+ u8_t *u8;
+
+ NET_BUF_SIMPLE_DBG("buf %p val 0x%02x", buf, val);
+
+ u8 = net_buf_simple_add(buf, 1);
+ *u8 = val;
+
+ return u8;
+}
+
+void net_buf_simple_add_le16(struct net_buf_simple *buf, u16_t val)
+{
+ NET_BUF_SIMPLE_DBG("buf %p val %u", buf, val);
+
+ sys_put_le16(val, net_buf_simple_add(buf, sizeof(val)));
+}
+
+void net_buf_simple_add_be16(struct net_buf_simple *buf, u16_t val)
+{
+ NET_BUF_SIMPLE_DBG("buf %p val %u", buf, val);
+
+ sys_put_be16(val, net_buf_simple_add(buf, sizeof(val)));
+}
+
+void net_buf_simple_add_le24(struct net_buf_simple *buf, uint32_t val)
+{
+ NET_BUF_SIMPLE_DBG("buf %p val %u", buf, val);
+
+ sys_put_le24(val, net_buf_simple_add(buf, 3));
+}
+
+void net_buf_simple_add_be24(struct net_buf_simple *buf, uint32_t val)
+{
+ NET_BUF_SIMPLE_DBG("buf %p val %u", buf, val);
+
+ sys_put_be24(val, net_buf_simple_add(buf, 3));
+}
+
+void net_buf_simple_add_le32(struct net_buf_simple *buf, u32_t val)
+{
+ NET_BUF_SIMPLE_DBG("buf %p val %u", buf, val);
+
+ sys_put_le32(val, net_buf_simple_add(buf, sizeof(val)));
+}
+
+void net_buf_simple_add_be32(struct net_buf_simple *buf, u32_t val)
+{
+ NET_BUF_SIMPLE_DBG("buf %p val %u", buf, val);
+
+ sys_put_be32(val, net_buf_simple_add(buf, sizeof(val)));
+}
+
+void *net_buf_simple_push(struct net_buf_simple *buf, size_t len)
+{
+ NET_BUF_SIMPLE_DBG("buf %p len %zu", buf, len);
+
+ NET_BUF_SIMPLE_ASSERT(net_buf_simple_headroom(buf) >= len);
+
+ buf->data -= len;
+ buf->len += len;
+ return buf->data;
+}
+
+void net_buf_simple_push_le16(struct net_buf_simple *buf, u16_t val)
+{
+ NET_BUF_SIMPLE_DBG("buf %p val %u", buf, val);
+
+ sys_put_le16(val, net_buf_simple_push(buf, sizeof(val)));
+}
+
+void net_buf_simple_push_be16(struct net_buf_simple *buf, u16_t val)
+{
+ NET_BUF_SIMPLE_DBG("buf %p val %u", buf, val);
+
+ sys_put_be16(val, net_buf_simple_push(buf, sizeof(val)));
+}
+
+void net_buf_simple_push_u8(struct net_buf_simple *buf, u8_t val)
+{
+ u8_t *data = net_buf_simple_push(buf, 1);
+
+ *data = val;
+}
+
+void net_buf_simple_push_le24(struct net_buf_simple *buf, uint32_t val)
+{
+ NET_BUF_SIMPLE_DBG("buf %p val %u", buf, val);
+
+ sys_put_le24(val, net_buf_simple_push(buf, 3));
+}
+
+void net_buf_simple_push_be24(struct net_buf_simple *buf, uint32_t val)
+{
+ NET_BUF_SIMPLE_DBG("buf %p val %u", buf, val);
+
+ sys_put_be24(val, net_buf_simple_push(buf, 3));
+}
+
+void *net_buf_simple_pull(struct net_buf_simple *buf, size_t len)
+{
+ NET_BUF_SIMPLE_DBG("buf %p len %zu", buf, len);
+
+ NET_BUF_SIMPLE_ASSERT(buf->len >= len);
+
+ buf->len -= len;
+ return buf->data += len;
+}
+
+void *net_buf_simple_pull_mem(struct net_buf_simple *buf, size_t len)
+{
+ void *data = buf->data;
+
+ NET_BUF_SIMPLE_DBG("buf %p len %zu", buf, len);
+
+ NET_BUF_SIMPLE_ASSERT(buf->len >= len);
+
+ buf->len -= len;
+ buf->data += len;
+
+ return data;
+}
+
+u8_t net_buf_simple_pull_u8(struct net_buf_simple *buf)
+{
+ u8_t val;
+
+ val = buf->data[0];
+ net_buf_simple_pull(buf, 1);
+
+ return val;
+}
+
+u16_t net_buf_simple_pull_le16(struct net_buf_simple *buf)
+{
+ u16_t val;
+
+ val = UNALIGNED_GET((u16_t *)buf->data);
+ net_buf_simple_pull(buf, sizeof(val));
+
+ return sys_le16_to_cpu(val);
+}
+
+u16_t net_buf_simple_pull_be16(struct net_buf_simple *buf)
+{
+ u16_t val;
+
+ val = UNALIGNED_GET((u16_t *)buf->data);
+ net_buf_simple_pull(buf, sizeof(val));
+
+ return sys_be16_to_cpu(val);
+}
+
+u32_t net_buf_simple_pull_le32(struct net_buf_simple *buf)
+{
+ u32_t val;
+
+ val = UNALIGNED_GET((u32_t *)buf->data);
+ net_buf_simple_pull(buf, sizeof(val));
+
+ return sys_le32_to_cpu(val);
+}
+
+u32_t net_buf_simple_pull_be32(struct net_buf_simple *buf)
+{
+ u32_t val;
+
+ val = UNALIGNED_GET((u32_t *)buf->data);
+ net_buf_simple_pull(buf, sizeof(val));
+
+ return sys_be32_to_cpu(val);
+}
+
+size_t net_buf_simple_headroom(struct net_buf_simple *buf)
+{
+ return buf->data - buf->__buf;
+}
+
+size_t net_buf_simple_tailroom(struct net_buf_simple *buf)
+{
+ return buf->size - net_buf_simple_headroom(buf) - buf->len;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/dec.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/dec.c
new file mode 100644
index 00000000..7c7f30c0
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/dec.c
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2019 Oticon A/S
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include
+
+u8_t u8_to_dec(char *buf, u8_t buflen, u8_t value)
+{
+ u8_t divisor = 100;
+ u8_t num_digits = 0;
+ u8_t digit;
+
+ while (buflen > 0 && divisor > 0) {
+ digit = value / divisor;
+ if (digit != 0 || divisor == 1 || num_digits != 0) {
+ *buf = (char)digit + '0';
+ buf++;
+ buflen--;
+ num_digits++;
+ }
+
+ value -= digit * divisor;
+ divisor /= 10;
+ }
+
+ if (buflen) {
+ *buf = '\0';
+ }
+
+ return num_digits;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/dummy.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/dummy.c
new file mode 100644
index 00000000..db90bb43
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/dummy.c
@@ -0,0 +1,40 @@
+/**
+ * @file dummy.c
+ * Static compilation checks.
+ */
+
+/*
+ * Copyright (c) 2017 Nordic Semiconductor ASA
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include
+
+#if defined(CONFIG_BT_HCI_HOST)
+/* The Bluetooth subsystem requires the Tx thread to execute at higher priority
+ * than the Rx thread as the Tx thread needs to process the acknowledgements
+ * before new Rx data is processed. This is a necessity to correctly detect
+ * transaction violations in ATT and SMP protocols.
+ */
+BUILD_ASSERT(CONFIG_BT_HCI_TX_PRIO < CONFIG_BT_RX_PRIO);
+#endif
+
+#if defined(CONFIG_BT_CTLR)
+/* The Bluetooth Controller's priority receive thread priority shall be higher
+ * than the Bluetooth Host's Tx and the Controller's receive thread priority.
+ * This is required in order to dispatch Number of Completed Packets event
+ * before any new data arrives on a connection to the Host threads.
+ */
+BUILD_ASSERT(CONFIG_BT_CTLR_RX_PRIO < CONFIG_BT_HCI_TX_PRIO);
+#endif /* CONFIG_BT_CTLR */
+
+/* Immediate logging is not supported with the software-based Link Layer
+ * since it introduces ISR latency due to outputting log messages with
+ * interrupts disabled.
+ */
+#if !defined(CONFIG_TEST) && !defined(CONFIG_ARCH_POSIX) && \
+ (defined(CONFIG_BT_LL_SW_SPLIT) || defined(CONFIG_BT_LL_SW_LEGACY))
+BUILD_ASSERT_MSG(!IS_ENABLED(CONFIG_LOG_IMMEDIATE), "Immediate logging not "
+ "supported with the software Link Layer");
+#endif
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/hex.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/hex.c
new file mode 100644
index 00000000..2d2425c0
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/hex.c
@@ -0,0 +1,11 @@
+/*
+ * Copyright (c) 2019 Nordic Semiconductor ASA
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include
+#include
+#include
+// #include
+
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/atomic.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/atomic.h
new file mode 100644
index 00000000..6f771c73
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/atomic.h
@@ -0,0 +1,444 @@
+/* atomic operations */
+
+/*
+ * Copyright (c) 1997-2015, Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef __ATOMIC_H__
+#define __ATOMIC_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int atomic_t;
+typedef atomic_t atomic_val_t;
+
+/**
+ * @defgroup atomic_apis Atomic Services APIs
+ * @ingroup kernel_apis
+ * @{
+ */
+
+/**
+ * @brief Atomic compare-and-set.
+ *
+ * This routine performs an atomic compare-and-set on @a target. If the current
+ * value of @a target equals @a old_value, @a target is set to @a new_value.
+ * If the current value of @a target does not equal @a old_value, @a target
+ * is left unchanged.
+ *
+ * @param target Address of atomic variable.
+ * @param old_value Original value to compare against.
+ * @param new_value New value to store.
+ * @return 1 if @a new_value is written, 0 otherwise.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline int atomic_cas(atomic_t *target, atomic_val_t old_value,
+ atomic_val_t new_value)
+{
+ return __atomic_compare_exchange_n(target, &old_value, new_value,
+ 0, __ATOMIC_SEQ_CST,
+ __ATOMIC_SEQ_CST);
+}
+#else
+extern int atomic_cas(atomic_t *target, atomic_val_t old_value,
+ atomic_val_t new_value);
+#endif
+
+/**
+ *
+ * @brief Atomic addition.
+ *
+ * This routine performs an atomic addition on @a target.
+ *
+ * @param target Address of atomic variable.
+ * @param value Value to add.
+ *
+ * @return Previous value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_add(atomic_t *target, atomic_val_t value)
+{
+ return __atomic_fetch_add(target, value, __ATOMIC_SEQ_CST);
+}
+#else
+extern atomic_val_t atomic_add(atomic_t *target, atomic_val_t value);
+#endif
+
+/**
+ *
+ * @brief Atomic subtraction.
+ *
+ * This routine performs an atomic subtraction on @a target.
+ *
+ * @param target Address of atomic variable.
+ * @param value Value to subtract.
+ *
+ * @return Previous value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_sub(atomic_t *target, atomic_val_t value)
+{
+ return __atomic_fetch_sub(target, value, __ATOMIC_SEQ_CST);
+}
+#else
+extern atomic_val_t atomic_sub(atomic_t *target, atomic_val_t value);
+#endif
+
+/**
+ *
+ * @brief Atomic increment.
+ *
+ * This routine performs an atomic increment by 1 on @a target.
+ *
+ * @param target Address of atomic variable.
+ *
+ * @return Previous value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_inc(atomic_t *target)
+{
+ return atomic_add(target, 1);
+}
+#else
+extern atomic_val_t atomic_inc(atomic_t *target);
+#endif
+
+/**
+ *
+ * @brief Atomic decrement.
+ *
+ * This routine performs an atomic decrement by 1 on @a target.
+ *
+ * @param target Address of atomic variable.
+ *
+ * @return Previous value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_dec(atomic_t *target)
+{
+ return atomic_sub(target, 1);
+}
+#else
+extern atomic_val_t atomic_dec(atomic_t *target);
+#endif
+
+/**
+ *
+ * @brief Atomic get.
+ *
+ * This routine performs an atomic read on @a target.
+ *
+ * @param target Address of atomic variable.
+ *
+ * @return Value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_get(const atomic_t *target)
+{
+ return __atomic_load_n(target, __ATOMIC_SEQ_CST);
+}
+#else
+extern atomic_val_t atomic_get(const atomic_t *target);
+#endif
+
+/**
+ *
+ * @brief Atomic get-and-set.
+ *
+ * This routine atomically sets @a target to @a value and returns
+ * the previous value of @a target.
+ *
+ * @param target Address of atomic variable.
+ * @param value Value to write to @a target.
+ *
+ * @return Previous value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_set(atomic_t *target, atomic_val_t value)
+{
+ /* This builtin, as described by Intel, is not a traditional
+ * test-and-set operation, but rather an atomic exchange operation. It
+ * writes value into *ptr, and returns the previous contents of *ptr.
+ */
+ return __atomic_exchange_n(target, value, __ATOMIC_SEQ_CST);
+}
+#else
+extern atomic_val_t atomic_set(atomic_t *target, atomic_val_t value);
+#endif
+
+/**
+ *
+ * @brief Atomic clear.
+ *
+ * This routine atomically sets @a target to zero and returns its previous
+ * value. (Hence, it is equivalent to atomic_set(target, 0).)
+ *
+ * @param target Address of atomic variable.
+ *
+ * @return Previous value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_clear(atomic_t *target)
+{
+ return atomic_set(target, 0);
+}
+#else
+extern atomic_val_t atomic_clear(atomic_t *target);
+#endif
+
+/**
+ *
+ * @brief Atomic bitwise inclusive OR.
+ *
+ * This routine atomically sets @a target to the bitwise inclusive OR of
+ * @a target and @a value.
+ *
+ * @param target Address of atomic variable.
+ * @param value Value to OR.
+ *
+ * @return Previous value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_or(atomic_t *target, atomic_val_t value)
+{
+ return __atomic_fetch_or(target, value, __ATOMIC_SEQ_CST);
+}
+#else
+extern atomic_val_t atomic_or(atomic_t *target, atomic_val_t value);
+#endif
+
+/**
+ *
+ * @brief Atomic bitwise exclusive OR (XOR).
+ *
+ * This routine atomically sets @a target to the bitwise exclusive OR (XOR) of
+ * @a target and @a value.
+ *
+ * @param target Address of atomic variable.
+ * @param value Value to XOR
+ *
+ * @return Previous value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_xor(atomic_t *target, atomic_val_t value)
+{
+ return __atomic_fetch_xor(target, value, __ATOMIC_SEQ_CST);
+}
+#else
+extern atomic_val_t atomic_xor(atomic_t *target, atomic_val_t value);
+#endif
+
+/**
+ *
+ * @brief Atomic bitwise AND.
+ *
+ * This routine atomically sets @a target to the bitwise AND of @a target
+ * and @a value.
+ *
+ * @param target Address of atomic variable.
+ * @param value Value to AND.
+ *
+ * @return Previous value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_and(atomic_t *target, atomic_val_t value)
+{
+ return __atomic_fetch_and(target, value, __ATOMIC_SEQ_CST);
+}
+#else
+extern atomic_val_t atomic_and(atomic_t *target, atomic_val_t value);
+#endif
+
+/**
+ *
+ * @brief Atomic bitwise NAND.
+ *
+ * This routine atomically sets @a target to the bitwise NAND of @a target
+ * and @a value. (This operation is equivalent to target = ~(target & value).)
+ *
+ * @param target Address of atomic variable.
+ * @param value Value to NAND.
+ *
+ * @return Previous value of @a target.
+ */
+#ifdef CONFIG_ATOMIC_OPERATIONS_BUILTIN
+static inline atomic_val_t atomic_nand(atomic_t *target, atomic_val_t value)
+{
+ return __atomic_fetch_nand(target, value, __ATOMIC_SEQ_CST);
+}
+#else
+extern atomic_val_t atomic_nand(atomic_t *target, atomic_val_t value);
+#endif
+
+/**
+ * @brief Initialize an atomic variable.
+ *
+ * This macro can be used to initialize an atomic variable. For example,
+ * @code atomic_t my_var = ATOMIC_INIT(75); @endcode
+ *
+ * @param i Value to assign to atomic variable.
+ */
+#define ATOMIC_INIT(i) (i)
+
+/**
+ * @cond INTERNAL_HIDDEN
+ */
+
+#define ATOMIC_BITS (sizeof(atomic_val_t) * 8)
+#define ATOMIC_MASK(bit) (1 << ((bit) & (ATOMIC_BITS - 1)))
+#define ATOMIC_ELEM(addr, bit) ((addr) + ((bit) / ATOMIC_BITS))
+
+/**
+ * INTERNAL_HIDDEN @endcond
+ */
+
+/**
+ * @brief Define an array of atomic variables.
+ *
+ * This macro defines an array of atomic variables containing at least
+ * @a num_bits bits.
+ *
+ * @note
+ * If used from file scope, the bits of the array are initialized to zero;
+ * if used from within a function, the bits are left uninitialized.
+ *
+ * @param name Name of array of atomic variables.
+ * @param num_bits Number of bits needed.
+ */
+#define ATOMIC_DEFINE(name, num_bits) \
+ atomic_t name[1 + ((num_bits)-1) / ATOMIC_BITS]
+
+/**
+ * @brief Atomically test a bit.
+ *
+ * This routine tests whether bit number @a bit of @a target is set or not.
+ * The target may be a single atomic variable or an array of them.
+ *
+ * @param target Address of atomic variable or array.
+ * @param bit Bit number (starting from 0).
+ *
+ * @return 1 if the bit was set, 0 if it wasn't.
+ */
+static inline int atomic_test_bit(const atomic_t *target, int bit)
+{
+ atomic_val_t val = atomic_get(ATOMIC_ELEM(target, bit));
+
+ return (1 & (val >> (bit & (ATOMIC_BITS - 1))));
+}
+
+/**
+ * @brief Atomically test and clear a bit.
+ *
+ * Atomically clear bit number @a bit of @a target and return its old value.
+ * The target may be a single atomic variable or an array of them.
+ *
+ * @param target Address of atomic variable or array.
+ * @param bit Bit number (starting from 0).
+ *
+ * @return 1 if the bit was set, 0 if it wasn't.
+ */
+static inline int atomic_test_and_clear_bit(atomic_t *target, int bit)
+{
+ atomic_val_t mask = ATOMIC_MASK(bit);
+ atomic_val_t old;
+
+ old = atomic_and(ATOMIC_ELEM(target, bit), ~mask);
+
+ return (old & mask) != 0;
+}
+
+/**
+ * @brief Atomically set a bit.
+ *
+ * Atomically set bit number @a bit of @a target and return its old value.
+ * The target may be a single atomic variable or an array of them.
+ *
+ * @param target Address of atomic variable or array.
+ * @param bit Bit number (starting from 0).
+ *
+ * @return 1 if the bit was set, 0 if it wasn't.
+ */
+static inline int atomic_test_and_set_bit(atomic_t *target, int bit)
+{
+ atomic_val_t mask = ATOMIC_MASK(bit);
+ atomic_val_t old;
+
+ old = atomic_or(ATOMIC_ELEM(target, bit), mask);
+
+ return (old & mask) != 0;
+}
+
+/**
+ * @brief Atomically clear a bit.
+ *
+ * Atomically clear bit number @a bit of @a target.
+ * The target may be a single atomic variable or an array of them.
+ *
+ * @param target Address of atomic variable or array.
+ * @param bit Bit number (starting from 0).
+ *
+ * @return N/A
+ */
+static inline void atomic_clear_bit(atomic_t *target, int bit)
+{
+ atomic_val_t mask = ATOMIC_MASK(bit);
+
+ atomic_and(ATOMIC_ELEM(target, bit), ~mask);
+}
+
+/**
+ * @brief Atomically set a bit.
+ *
+ * Atomically set bit number @a bit of @a target.
+ * The target may be a single atomic variable or an array of them.
+ *
+ * @param target Address of atomic variable or array.
+ * @param bit Bit number (starting from 0).
+ *
+ * @return N/A
+ */
+static inline void atomic_set_bit(atomic_t *target, int bit)
+{
+ atomic_val_t mask = ATOMIC_MASK(bit);
+
+ atomic_or(ATOMIC_ELEM(target, bit), mask);
+}
+
+/**
+ * @brief Atomically set a bit to a given value.
+ *
+ * Atomically set bit number @a bit of @a target to value @a val.
+ * The target may be a single atomic variable or an array of them.
+ *
+ * @param target Address of atomic variable or array.
+ * @param bit Bit number (starting from 0).
+ * @param val true for 1, false for 0.
+ *
+ * @return N/A
+ */
+static inline void atomic_set_bit_to(atomic_t *target, int bit, bool val)
+{
+ atomic_val_t mask = ATOMIC_MASK(bit);
+
+ if (val) {
+ (void)atomic_or(ATOMIC_ELEM(target, bit), mask);
+ } else {
+ (void)atomic_and(ATOMIC_ELEM(target, bit), ~mask);
+ }
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ATOMIC_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/errno.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/errno.h
new file mode 100644
index 00000000..5de315da
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/errno.h
@@ -0,0 +1,132 @@
+/* errno.h - errno numbers */
+
+/*
+ * Copyright (c) 1984-1999, 2012 Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ * @(#)errno.h 7.1 (Berkeley) 6/4/86
+ */
+
+#ifndef __INCerrnoh
+#define __INCerrnoh
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int *__errno(void);
+#define errno (*__errno())
+
+/*
+ * POSIX Error codes
+ */
+
+#define EPERM 1 /* Not owner */
+#define ENOENT 2 /* No such file or directory */
+#define ESRCH 3 /* No such context */
+#define EINTR 4 /* Interrupted system call */
+#define EIO 5 /* I/O error */
+#define ENXIO 6 /* No such device or address */
+#define E2BIG 7 /* Arg list too long */
+#define ENOEXEC 8 /* Exec format error */
+#define EBADF 9 /* Bad file number */
+#define ECHILD 10 /* No children */
+#define EAGAIN 11 /* No more contexts */
+#define ENOMEM 12 /* Not enough core */
+#define EACCES 13 /* Permission denied */
+#define EFAULT 14 /* Bad address */
+#define ENOTEMPTY 15 /* Directory not empty */
+#define EBUSY 16 /* Mount device busy */
+#define EEXIST 17 /* File exists */
+#define EXDEV 18 /* Cross-device link */
+#define ENODEV 19 /* No such device */
+#define ENOTDIR 20 /* Not a directory */
+#define EISDIR 21 /* Is a directory */
+#define EINVAL 22 /* Invalid argument */
+#define ENFILE 23 /* File table overflow */
+#define EMFILE 24 /* Too many open files */
+#define ENOTTY 25 /* Not a typewriter */
+#define ENAMETOOLONG 26 /* File name too long */
+#define EFBIG 27 /* File too large */
+#define ENOSPC 28 /* No space left on device */
+#define ESPIPE 29 /* Illegal seek */
+#define EROFS 30 /* Read-only file system */
+#define EMLINK 31 /* Too many links */
+#define EPIPE 32 /* Broken pipe */
+#define EDEADLK 33 /* Resource deadlock avoided */
+#define ENOLCK 34 /* No locks available */
+#define ENOTSUP 35 /* Unsupported value */
+#define EMSGSIZE 36 /* Message size */
+
+/* ANSI math software */
+#define EDOM 37 /* Argument too large */
+#define ERANGE 38 /* Result too large */
+
+/* ipc/network software */
+
+/* argument errors */
+#define EDESTADDRREQ 40 /* Destination address required */
+#define EPROTOTYPE 41 /* Protocol wrong type for socket */
+#define ENOPROTOOPT 42 /* Protocol not available */
+#define EPROTONOSUPPORT 43 /* Protocol not supported */
+#define ESOCKTNOSUPPORT 44 /* Socket type not supported */
+#define EOPNOTSUPP 45 /* Operation not supported on socket */
+#define EPFNOSUPPORT 46 /* Protocol family not supported */
+#define EAFNOSUPPORT 47 /* Addr family not supported */
+#define EADDRINUSE 48 /* Address already in use */
+#define EADDRNOTAVAIL 49 /* Can't assign requested address */
+#define ENOTSOCK 50 /* Socket operation on non-socket */
+
+/* operational errors */
+#define ENETUNREACH 51 /* Network is unreachable */
+#define ENETRESET 52 /* Network dropped connection on reset */
+#define ECONNABORTED 53 /* Software caused connection abort */
+#define ECONNRESET 54 /* Connection reset by peer */
+#define ENOBUFS 55 /* No buffer space available */
+#define EISCONN 56 /* Socket is already connected */
+#define ENOTCONN 57 /* Socket is not connected */
+#define ESHUTDOWN 58 /* Can't send after socket shutdown */
+#define ETOOMANYREFS 59 /* Too many references: can't splice */
+#define ETIMEDOUT 60 /* Connection timed out */
+#define ECONNREFUSED 61 /* Connection refused */
+#define ENETDOWN 62 /* Network is down */
+#define ETXTBSY 63 /* Text file busy */
+#define ELOOP 64 /* Too many levels of symbolic links */
+#define EHOSTUNREACH 65 /* No route to host */
+#define ENOTBLK 66 /* Block device required */
+#define EHOSTDOWN 67 /* Host is down */
+
+/* non-blocking and interrupt i/o */
+#define EINPROGRESS 68 /* Operation now in progress */
+#define EALREADY 69 /* Operation already in progress */
+#define EWOULDBLOCK EAGAIN /* Operation would block */
+
+#define ENOSYS 71 /* Function not implemented */
+
+/* aio errors (should be under posix) */
+#define ECANCELED 72 /* Operation canceled */
+
+#define ERRMAX 81
+
+/* specific STREAMS errno values */
+
+#define ENOSR 74 /* Insufficient memory */
+#define ENOSTR 75 /* STREAMS device required */
+#define EPROTO 76 /* Generic STREAMS error */
+#define EBADMSG 77 /* Invalid STREAMS message */
+#define ENODATA 78 /* Missing expected message data */
+#define ETIME 79 /* STREAMS timeout occurred */
+#define ENOMSG 80 /* Unexpected message type */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __INCerrnoh */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/__assert.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/__assert.h
new file mode 100644
index 00000000..a8cc8204
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/__assert.h
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2011-2014 Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief Debug aid
+ *
+ *
+ * The __ASSERT() macro can be used inside kernel code.
+ *
+ * Assertions are enabled by setting the __ASSERT_ON symbol to a non-zero value.
+ * There are two ways to do this:
+ * a) Use the ASSERT and ASSERT_LEVEL kconfig options
+ * b) Add "CFLAGS += -D__ASSERT_ON=" at the end of a project's Makefile
+ * The Makefile method takes precedence over the kconfig option if both are
+ * used.
+ *
+ * Specifying an assertion level of 1 causes the compiler to issue warnings that
+ * the kernel contains debug-type __ASSERT() statements; this reminder is issued
+ * since assertion code is not normally present in a final product. Specifying
+ * assertion level 2 suppresses these warnings.
+ *
+ * The __ASSERT_EVAL() macro can also be used inside kernel code.
+ *
+ * It makes use of the __ASSERT() macro, but has some extra flexibility. It
+ * allows the developer to specify different actions depending whether the
+ * __ASSERT() macro is enabled or not. This can be particularly useful to
+ * prevent the compiler from generating comments (errors, warnings or remarks)
+ * about variables that are only used with __ASSERT() being assigned a value,
+ * but otherwise unused when the __ASSERT() macro is disabled.
+ *
+ * Consider the following example:
+ *
+ * int x;
+ *
+ * x = foo ();
+ * __ASSERT (x != 0, "foo() returned zero!");
+ *
+ * If __ASSERT() is disabled, then 'x' is assigned a value, but never used.
+ * This type of situation can be resolved using the __ASSERT_EVAL() macro.
+ *
+ * __ASSERT_EVAL ((void) foo(),
+ * int x = foo(),
+ * x != 0,
+ * "foo() returned zero!");
+ *
+ * The first parameter tells __ASSERT_EVAL() what to do if __ASSERT() is
+ * disabled. The second parameter tells __ASSERT_EVAL() what to do if
+ * __ASSERT() is enabled. The third and fourth parameters are the parameters
+ * it passes to __ASSERT().
+ *
+ * The __ASSERT_NO_MSG() macro can be used to perform an assertion that reports
+ * the failed test and its location, but lacks additional debugging information
+ * provided to assist the user in diagnosing the problem; its use is
+ * discouraged.
+ */
+
+#ifndef ___ASSERT__H_
+#define ___ASSERT__H_
+
+#ifdef CONFIG_ASSERT
+#ifndef __ASSERT_ON
+#define __ASSERT_ON CONFIG_ASSERT_LEVEL
+#endif
+#endif
+
+#ifdef __ASSERT_ON
+#if (__ASSERT_ON < 0) || (__ASSERT_ON > 2)
+#error "Invalid __ASSERT() level: must be between 0 and 2"
+#endif
+
+#if __ASSERT_ON
+#include
+#define __ASSERT(test, fmt, ...) \
+ do { \
+ if (!(test)) { \
+ printk("ASSERTION FAIL [%s] @ %s:%d:\n\t", \
+ _STRINGIFY(test), \
+ __FILE__, \
+ __LINE__); \
+ printk(fmt, ##__VA_ARGS__); \
+ for (;;) \
+ ; /* spin thread */ \
+ } \
+ } while ((0))
+
+#define __ASSERT_EVAL(expr1, expr2, test, fmt, ...) \
+ do { \
+ expr2; \
+ __ASSERT(test, fmt, ##__VA_ARGS__); \
+ } while (0)
+
+#if (__ASSERT_ON == 1)
+#warning "__ASSERT() statements are ENABLED"
+#endif
+#else
+#define __ASSERT(test, fmt, ...) \
+ do { /* nothing */ \
+ } while ((0))
+#define __ASSERT_EVAL(expr1, expr2, test, fmt, ...) expr1
+#endif
+#else
+#define __ASSERT(test, fmt, ...) \
+ do { /* nothing */ \
+ } while ((0))
+#define __ASSERT_EVAL(expr1, expr2, test, fmt, ...) expr1
+#endif
+
+#define __ASSERT_NO_MSG(test) __ASSERT(test, "")
+
+#endif /* ___ASSERT__H_ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/byteorder.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/byteorder.h
new file mode 100644
index 00000000..e4180b34
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/byteorder.h
@@ -0,0 +1,441 @@
+/** @file
+ * @brief Byte order helpers.
+ */
+
+/*
+ * Copyright (c) 2015-2016, Intel Corporation.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef __BYTEORDER_H__
+#define __BYTEORDER_H__
+
+#include
+#include
+#include
+
+#ifndef __BYTE_ORDER__
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+#endif
+
+/* Internal helpers only used by the sys_* APIs further below */
+#define __bswap_16(x) ((u16_t)((((x) >> 8) & 0xff) | (((x)&0xff) << 8)))
+#define __bswap_32(x) ((u32_t)((((x) >> 24) & 0xff) | \
+ (((x) >> 8) & 0xff00) | \
+ (((x)&0xff00) << 8) | \
+ (((x)&0xff) << 24)))
+#define __bswap_64(x) ((u64_t)((((x) >> 56) & 0xff) | \
+ (((x) >> 40) & 0xff00) | \
+ (((x) >> 24) & 0xff0000) | \
+ (((x) >> 8) & 0xff000000) | \
+ (((x)&0xff000000) << 8) | \
+ (((x)&0xff0000) << 24) | \
+ (((x)&0xff00) << 40) | \
+ (((x)&0xff) << 56)))
+
+/** @def sys_le16_to_cpu
+ * @brief Convert 16-bit integer from little-endian to host endianness.
+ *
+ * @param val 16-bit integer in little-endian format.
+ *
+ * @return 16-bit integer in host endianness.
+ */
+
+/** @def sys_cpu_to_le16
+ * @brief Convert 16-bit integer from host endianness to little-endian.
+ *
+ * @param val 16-bit integer in host endianness.
+ *
+ * @return 16-bit integer in little-endian format.
+ */
+
+/** @def sys_be16_to_cpu
+ * @brief Convert 16-bit integer from big-endian to host endianness.
+ *
+ * @param val 16-bit integer in big-endian format.
+ *
+ * @return 16-bit integer in host endianness.
+ */
+
+/** @def sys_cpu_to_be16
+ * @brief Convert 16-bit integer from host endianness to big-endian.
+ *
+ * @param val 16-bit integer in host endianness.
+ *
+ * @return 16-bit integer in big-endian format.
+ */
+
+/** @def sys_le32_to_cpu
+ * @brief Convert 32-bit integer from little-endian to host endianness.
+ *
+ * @param val 32-bit integer in little-endian format.
+ *
+ * @return 32-bit integer in host endianness.
+ */
+
+/** @def sys_cpu_to_le32
+ * @brief Convert 32-bit integer from host endianness to little-endian.
+ *
+ * @param val 32-bit integer in host endianness.
+ *
+ * @return 32-bit integer in little-endian format.
+ */
+
+/** @def sys_be32_to_cpu
+ * @brief Convert 32-bit integer from big-endian to host endianness.
+ *
+ * @param val 32-bit integer in big-endian format.
+ *
+ * @return 32-bit integer in host endianness.
+ */
+
+/** @def sys_cpu_to_be32
+ * @brief Convert 32-bit integer from host endianness to big-endian.
+ *
+ * @param val 32-bit integer in host endianness.
+ *
+ * @return 32-bit integer in big-endian format.
+ */
+
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#define sys_le16_to_cpu(val) (val)
+#define sys_cpu_to_le16(val) (val)
+#define sys_be16_to_cpu(val) __bswap_16(val)
+#define sys_cpu_to_be16(val) __bswap_16(val)
+#define sys_le32_to_cpu(val) (val)
+#define sys_cpu_to_le32(val) (val)
+#define sys_le64_to_cpu(val) (val)
+#define sys_cpu_to_le64(val) (val)
+#define sys_be32_to_cpu(val) __bswap_32(val)
+#define sys_cpu_to_be32(val) __bswap_32(val)
+#define sys_be64_to_cpu(val) __bswap_64(val)
+#define sys_cpu_to_be64(val) __bswap_64(val)
+/********************************************************************************
+** Macros to get and put bytes to a stream (Little Endian format).
+*/
+#define UINT32_TO_STREAM(p, u32) \
+ { \
+ *(p)++ = (u8_t)(u32); \
+ *(p)++ = (u8_t)((u32) >> 8); \
+ *(p)++ = (u8_t)((u32) >> 16); \
+ *(p)++ = (u8_t)((u32) >> 24); \
+ }
+#define UINT24_TO_STREAM(p, u24) \
+ { \
+ *(p)++ = (u8_t)(u24); \
+ *(p)++ = (u8_t)((u24) >> 8); \
+ *(p)++ = (u8_t)((u24) >> 16); \
+ }
+#define UINT16_TO_STREAM(p, u16) \
+ { \
+ *(p)++ = (u8_t)(u16); \
+ *(p)++ = (u8_t)((u16) >> 8); \
+ }
+#define UINT8_TO_STREAM(p, u8) \
+ { \
+ *(p)++ = (u8_t)(u8); \
+ }
+
+#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#define sys_le16_to_cpu(val) __bswap_16(val)
+#define sys_cpu_to_le16(val) __bswap_16(val)
+#define sys_be16_to_cpu(val) (val)
+#define sys_cpu_to_be16(val) (val)
+#define sys_le32_to_cpu(val) __bswap_32(val)
+#define sys_cpu_to_le32(val) __bswap_32(val)
+#define sys_le64_to_cpu(val) __bswap_64(val)
+#define sys_cpu_to_le64(val) __bswap_64(val)
+#define sys_be32_to_cpu(val) (val)
+#define sys_cpu_to_be32(val) (val)
+#define sys_be64_to_cpu(val) (val)
+#define sys_cpu_to_be64(val) (val)
+/********************************************************************************
+** Macros to get and put bytes to a stream (Big Endian format)
+*/
+#define UINT32_TO_STREAM(p, u32) \
+ { \
+ *(p)++ = (u8_t)((u32) >> 24); \
+ *(p)++ = (u8_t)((u32) >> 16); \
+ *(p)++ = (u8_t)((u32) >> 8); \
+ *(p)++ = (u8_t)(u32); \
+ }
+#define UINT24_TO_STREAM(p, u24) \
+ { \
+ *(p)++ = (u8_t)((u24) >> 16); \
+ *(p)++ = (u8_t)((u24) >> 8); \
+ *(p)++ = (u8_t)(u24); \
+ }
+#define UINT16_TO_STREAM(p, u16) \
+ { \
+ *(p)++ = (u8_t)((u16) >> 8); \
+ *(p)++ = (u8_t)(u16); \
+ }
+#define UINT8_TO_STREAM(p, u8) \
+ { \
+ *(p)++ = (u8_t)(u8); \
+ }
+
+#else
+#error "Unknown byte order"
+#endif
+
+/**
+ * @brief Put a 16-bit integer as big-endian to arbitrary location.
+ *
+ * Put a 16-bit integer, originally in host endianness, to a
+ * potentially unaligned memory location in big-endian format.
+ *
+ * @param val 16-bit integer in host endianness.
+ * @param dst Destination memory address to store the result.
+ */
+static inline void sys_put_be16(u16_t val, u8_t dst[2])
+{
+ dst[0] = val >> 8;
+ dst[1] = val;
+}
+
+/**
+ * @brief Put a 24-bit integer as big-endian to arbitrary location.
+ *
+ * Put a 24-bit integer, originally in host endianness, to a
+ * potentially unaligned memory location in big-endian format.
+ *
+ * @param val 24-bit integer in host endianness.
+ * @param dst Destination memory address to store the result.
+ */
+static inline void sys_put_be24(uint32_t val, uint8_t dst[3])
+{
+ dst[0] = val >> 16;
+ sys_put_be16(val, &dst[1]);
+}
+
+/**
+ * @brief Put a 32-bit integer as big-endian to arbitrary location.
+ *
+ * Put a 32-bit integer, originally in host endianness, to a
+ * potentially unaligned memory location in big-endian format.
+ *
+ * @param val 32-bit integer in host endianness.
+ * @param dst Destination memory address to store the result.
+ */
+static inline void sys_put_be32(u32_t val, u8_t dst[4])
+{
+ sys_put_be16(val >> 16, dst);
+ sys_put_be16(val, &dst[2]);
+}
+
+/**
+ * @brief Put a 16-bit integer as little-endian to arbitrary location.
+ *
+ * Put a 16-bit integer, originally in host endianness, to a
+ * potentially unaligned memory location in little-endian format.
+ *
+ * @param val 16-bit integer in host endianness.
+ * @param dst Destination memory address to store the result.
+ */
+static inline void sys_put_le16(u16_t val, u8_t dst[2])
+{
+ dst[0] = val;
+ dst[1] = val >> 8;
+}
+
+/**
+ * @brief Put a 24-bit integer as little-endian to arbitrary location.
+ *
+ * Put a 24-bit integer, originally in host endianness, to a
+ * potentially unaligned memory location in littel-endian format.
+ *
+ * @param val 24-bit integer in host endianness.
+ * @param dst Destination memory address to store the result.
+ */
+static inline void sys_put_le24(uint32_t val, uint8_t dst[3])
+{
+ sys_put_le16(val, dst);
+ dst[2] = val >> 16;
+}
+
+/**
+ * @brief Put a 32-bit integer as little-endian to arbitrary location.
+ *
+ * Put a 32-bit integer, originally in host endianness, to a
+ * potentially unaligned memory location in little-endian format.
+ *
+ * @param val 32-bit integer in host endianness.
+ * @param dst Destination memory address to store the result.
+ */
+static inline void sys_put_le32(u32_t val, u8_t dst[4])
+{
+ sys_put_le16(val, dst);
+ sys_put_le16(val >> 16, &dst[2]);
+}
+
+/**
+ * @brief Put a 64-bit integer as little-endian to arbitrary location.
+ *
+ * Put a 64-bit integer, originally in host endianness, to a
+ * potentially unaligned memory location in little-endian format.
+ *
+ * @param val 64-bit integer in host endianness.
+ * @param dst Destination memory address to store the result.
+ */
+static inline void sys_put_le64(u64_t val, u8_t dst[8])
+{
+ sys_put_le32(val, dst);
+ sys_put_le32(val >> 32, &dst[4]);
+}
+
+/**
+ * @brief Get a 16-bit integer stored in big-endian format.
+ *
+ * Get a 16-bit integer, stored in big-endian format in a potentially
+ * unaligned memory location, and convert it to the host endianness.
+ *
+ * @param src Location of the big-endian 16-bit integer to get.
+ *
+ * @return 16-bit integer in host endianness.
+ */
+static inline u16_t sys_get_be16(const u8_t src[2])
+{
+ return ((u16_t)src[0] << 8) | src[1];
+}
+
+/**
+ * @brief Get a 24-bit integer stored in big-endian format.
+ *
+ * Get a 24-bit integer, stored in big-endian format in a potentially
+ * unaligned memory location, and convert it to the host endianness.
+ *
+ * @param src Location of the big-endian 24-bit integer to get.
+ *
+ * @return 24-bit integer in host endianness.
+ */
+static inline uint32_t sys_get_be24(const uint8_t src[3])
+{
+ return ((uint32_t)src[0] << 16) | sys_get_be16(&src[1]);
+}
+
+/**
+ * @brief Get a 32-bit integer stored in big-endian format.
+ *
+ * Get a 32-bit integer, stored in big-endian format in a potentially
+ * unaligned memory location, and convert it to the host endianness.
+ *
+ * @param src Location of the big-endian 32-bit integer to get.
+ *
+ * @return 32-bit integer in host endianness.
+ */
+static inline u32_t sys_get_be32(const u8_t src[4])
+{
+ return ((u32_t)sys_get_be16(&src[0]) << 16) | sys_get_be16(&src[2]);
+}
+
+/**
+ * @brief Get a 16-bit integer stored in little-endian format.
+ *
+ * Get a 16-bit integer, stored in little-endian format in a potentially
+ * unaligned memory location, and convert it to the host endianness.
+ *
+ * @param src Location of the little-endian 16-bit integer to get.
+ *
+ * @return 16-bit integer in host endianness.
+ */
+static inline u16_t sys_get_le16(const u8_t src[2])
+{
+ return ((u16_t)src[1] << 8) | src[0];
+}
+
+/**
+ * @brief Get a 24-bit integer stored in big-endian format.
+ *
+ * Get a 24-bit integer, stored in big-endian format in a potentially
+ * unaligned memory location, and convert it to the host endianness.
+ *
+ * @param src Location of the big-endian 24-bit integer to get.
+ *
+ * @return 24-bit integer in host endianness.
+ */
+static inline uint32_t sys_get_le24(const uint8_t src[3])
+{
+ return ((uint32_t)src[2] << 16) | sys_get_le16(&src[0]);
+}
+
+/**
+ * @brief Get a 32-bit integer stored in little-endian format.
+ *
+ * Get a 32-bit integer, stored in little-endian format in a potentially
+ * unaligned memory location, and convert it to the host endianness.
+ *
+ * @param src Location of the little-endian 32-bit integer to get.
+ *
+ * @return 32-bit integer in host endianness.
+ */
+static inline u32_t sys_get_le32(const u8_t src[4])
+{
+ return ((u32_t)sys_get_le16(&src[2]) << 16) | sys_get_le16(&src[0]);
+}
+
+/**
+ * @brief Get a 64-bit integer stored in little-endian format.
+ *
+ * Get a 64-bit integer, stored in little-endian format in a potentially
+ * unaligned memory location, and convert it to the host endianness.
+ *
+ * @param src Location of the little-endian 64-bit integer to get.
+ *
+ * @return 64-bit integer in host endianness.
+ */
+static inline u64_t sys_get_le64(const u8_t src[8])
+{
+ return ((u64_t)sys_get_le32(&src[4]) << 32) | sys_get_le32(&src[0]);
+}
+
+/**
+ * @brief Swap one buffer content into another
+ *
+ * Copy the content of src buffer into dst buffer in reversed order,
+ * i.e.: src[n] will be put in dst[end-n]
+ * Where n is an index and 'end' the last index in both arrays.
+ * The 2 memory pointers must be pointing to different areas, and have
+ * a minimum size of given length.
+ *
+ * @param dst A valid pointer on a memory area where to copy the data in
+ * @param src A valid pointer on a memory area where to copy the data from
+ * @param length Size of both dst and src memory areas
+ */
+static inline void sys_memcpy_swap(void *dst, const void *src, size_t length)
+{
+ __ASSERT(((src < dst && (src + length) <= dst) ||
+ (src > dst && (dst + length) <= src)),
+ "Source and destination buffers must not overlap");
+
+ src += length - 1;
+
+ for (; length > 0; length--) {
+ *((u8_t *)dst++) = *((u8_t *)src--);
+ }
+}
+
+/**
+ * @brief Swap buffer content
+ *
+ * In-place memory swap, where final content will be reversed.
+ * I.e.: buf[n] will be put in buf[end-n]
+ * Where n is an index and 'end' the last index of buf.
+ *
+ * @param buf A valid pointer on a memory area to swap
+ * @param length Size of buf memory area
+ */
+static inline void sys_mem_swap(void *buf, size_t length)
+{
+ size_t i;
+
+ for (i = 0; i < (length / 2); i++) {
+ u8_t tmp = ((u8_t *)buf)[i];
+
+ ((u8_t *)buf)[i] = ((u8_t *)buf)[length - 1 - i];
+ ((u8_t *)buf)[length - 1 - i] = tmp;
+ }
+}
+
+#endif /* __BYTEORDER_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/dlist.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/dlist.h
new file mode 100644
index 00000000..74d7ecf1
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/dlist.h
@@ -0,0 +1,501 @@
+/*
+ * Copyright (c) 2013-2015 Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief Doubly-linked list implementation
+ *
+ * Doubly-linked list implementation using inline macros/functions.
+ * This API is not thread safe, and thus if a list is used across threads,
+ * calls to functions must be protected with synchronization primitives.
+ *
+ * The lists are expected to be initialized such that both the head and tail
+ * pointers point to the list itself. Initializing the lists in such a fashion
+ * simplifies the adding and removing of nodes to/from the list.
+ */
+
+#ifndef _misc_dlist__h_
+#define _misc_dlist__h_
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _dnode {
+ union {
+ struct _dnode *head; /* ptr to head of list (sys_dlist_t) */
+ struct _dnode *next; /* ptr to next node (sys_dnode_t) */
+ };
+ union {
+ struct _dnode *tail; /* ptr to tail of list (sys_dlist_t) */
+ struct _dnode *prev; /* ptr to previous node (sys_dnode_t) */
+ };
+};
+
+typedef struct _dnode sys_dlist_t;
+typedef struct _dnode sys_dnode_t;
+
+/**
+ * @brief Provide the primitive to iterate on a list
+ * Note: the loop is unsafe and thus __dn should not be removed
+ *
+ * User _MUST_ add the loop statement curly braces enclosing its own code:
+ *
+ * SYS_DLIST_FOR_EACH_NODE(l, n) {
+ *
+ * }
+ *
+ * This and other SYS_DLIST_*() macros are not thread safe.
+ *
+ * @param __dl A pointer on a sys_dlist_t to iterate on
+ * @param __dn A sys_dnode_t pointer to peek each node of the list
+ */
+#define SYS_DLIST_FOR_EACH_NODE(__dl, __dn) \
+ for (__dn = sys_dlist_peek_head(__dl); __dn; \
+ __dn = sys_dlist_peek_next(__dl, __dn))
+
+/**
+ * @brief Provide the primitive to iterate on a list, from a node in the list
+ * Note: the loop is unsafe and thus __dn should not be removed
+ *
+ * User _MUST_ add the loop statement curly braces enclosing its own code:
+ *
+ * SYS_DLIST_ITERATE_FROM_NODE(l, n) {
+ *
+ * }
+ *
+ * Like SYS_DLIST_FOR_EACH_NODE(), but __dn already contains a node in the list
+ * where to start searching for the next entry from. If NULL, it starts from
+ * the head.
+ *
+ * This and other SYS_DLIST_*() macros are not thread safe.
+ *
+ * @param __dl A pointer on a sys_dlist_t to iterate on
+ * @param __dn A sys_dnode_t pointer to peek each node of the list;
+ * it contains the starting node, or NULL to start from the head
+ */
+#define SYS_DLIST_ITERATE_FROM_NODE(__dl, __dn) \
+ for (__dn = __dn ? sys_dlist_peek_next_no_check(__dl, __dn) : sys_dlist_peek_head(__dl); \
+ __dn; \
+ __dn = sys_dlist_peek_next(__dl, __dn))
+
+/**
+ * @brief Provide the primitive to safely iterate on a list
+ * Note: __dn can be removed, it will not break the loop.
+ *
+ * User _MUST_ add the loop statement curly braces enclosing its own code:
+ *
+ * SYS_DLIST_FOR_EACH_NODE_SAFE(l, n, s) {
+ *
+ * }
+ *
+ * This and other SYS_DLIST_*() macros are not thread safe.
+ *
+ * @param __dl A pointer on a sys_dlist_t to iterate on
+ * @param __dn A sys_dnode_t pointer to peek each node of the list
+ * @param __dns A sys_dnode_t pointer for the loop to run safely
+ */
+#define SYS_DLIST_FOR_EACH_NODE_SAFE(__dl, __dn, __dns) \
+ for (__dn = sys_dlist_peek_head(__dl), \
+ __dns = sys_dlist_peek_next(__dl, __dn); \
+ __dn; __dn = __dns, \
+ __dns = sys_dlist_peek_next(__dl, __dn))
+
+/*
+ * @brief Provide the primitive to resolve the container of a list node
+ * Note: it is safe to use with NULL pointer nodes
+ *
+ * @param __dn A pointer on a sys_dnode_t to get its container
+ * @param __cn Container struct type pointer
+ * @param __n The field name of sys_dnode_t within the container struct
+ */
+#define SYS_DLIST_CONTAINER(__dn, __cn, __n) \
+ (__dn ? CONTAINER_OF(__dn, __typeof__(*__cn), __n) : NULL)
+/*
+ * @brief Provide the primitive to peek container of the list head
+ *
+ * @param __dl A pointer on a sys_dlist_t to peek
+ * @param __cn Container struct type pointer
+ * @param __n The field name of sys_dnode_t within the container struct
+ */
+#define SYS_DLIST_PEEK_HEAD_CONTAINER(__dl, __cn, __n) \
+ SYS_DLIST_CONTAINER(sys_dlist_peek_head(__dl), __cn, __n)
+
+/*
+ * @brief Provide the primitive to peek the next container
+ *
+ * @param __dl A pointer on a sys_dlist_t to peek
+ * @param __cn Container struct type pointer
+ * @param __n The field name of sys_dnode_t within the container struct
+ */
+#define SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n) \
+ ((__cn) ? SYS_DLIST_CONTAINER(sys_dlist_peek_next(__dl, &(__cn->__n)), \
+ __cn, __n) : \
+ NULL)
+
+/**
+ * @brief Provide the primitive to iterate on a list under a container
+ * Note: the loop is unsafe and thus __cn should not be detached
+ *
+ * User _MUST_ add the loop statement curly braces enclosing its own code:
+ *
+ * SYS_DLIST_FOR_EACH_CONTAINER(l, c, n) {
+ *
+ * }
+ *
+ * @param __dl A pointer on a sys_dlist_t to iterate on
+ * @param __cn A pointer to peek each entry of the list
+ * @param __n The field name of sys_dnode_t within the container struct
+ */
+#define SYS_DLIST_FOR_EACH_CONTAINER(__dl, __cn, __n) \
+ for (__cn = SYS_DLIST_PEEK_HEAD_CONTAINER(__dl, __cn, __n); __cn; \
+ __cn = SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n))
+
+/**
+ * @brief Provide the primitive to safely iterate on a list under a container
+ * Note: __cn can be detached, it will not break the loop.
+ *
+ * User _MUST_ add the loop statement curly braces enclosing its own code:
+ *
+ * SYS_DLIST_FOR_EACH_CONTAINER_SAFE(l, c, cn, n) {
+ *
+ * }
+ *
+ * @param __dl A pointer on a sys_dlist_t to iterate on
+ * @param __cn A pointer to peek each entry of the list
+ * @param __cns A pointer for the loop to run safely
+ * @param __n The field name of sys_dnode_t within the container struct
+ */
+#define SYS_DLIST_FOR_EACH_CONTAINER_SAFE(__dl, __cn, __cns, __n) \
+ for (__cn = SYS_DLIST_PEEK_HEAD_CONTAINER(__dl, __cn, __n), \
+ __cns = SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n); \
+ __cn; \
+ __cn = __cns, \
+ __cns = SYS_DLIST_PEEK_NEXT_CONTAINER(__dl, __cn, __n))
+
+/**
+ * @brief initialize list
+ *
+ * @param list the doubly-linked list
+ *
+ * @return N/A
+ */
+
+static inline void sys_dlist_init(sys_dlist_t *list)
+{
+ list->head = (sys_dnode_t *)list;
+ list->tail = (sys_dnode_t *)list;
+}
+
+#define SYS_DLIST_STATIC_INIT(ptr_to_list) \
+ { \
+ { (ptr_to_list) }, \
+ { \
+ (ptr_to_list) \
+ } \
+ }
+
+/**
+ * @brief check if a node is the list's head
+ *
+ * @param list the doubly-linked list to operate on
+ * @param node the node to check
+ *
+ * @return 1 if node is the head, 0 otherwise
+ */
+
+static inline int sys_dlist_is_head(sys_dlist_t *list, sys_dnode_t *node)
+{
+ return list->head == node;
+}
+
+/**
+ * @brief check if a node is the list's tail
+ *
+ * @param list the doubly-linked list to operate on
+ * @param node the node to check
+ *
+ * @return 1 if node is the tail, 0 otherwise
+ */
+
+static inline int sys_dlist_is_tail(sys_dlist_t *list, sys_dnode_t *node)
+{
+ return list->tail == node;
+}
+
+/**
+ * @brief check if the list is empty
+ *
+ * @param list the doubly-linked list to operate on
+ *
+ * @return 1 if empty, 0 otherwise
+ */
+
+static inline int sys_dlist_is_empty(sys_dlist_t *list)
+{
+ return list->head == list;
+}
+
+/**
+ * @brief check if more than one node present
+ *
+ * This and other sys_dlist_*() functions are not thread safe.
+ *
+ * @param list the doubly-linked list to operate on
+ *
+ * @return 1 if multiple nodes, 0 otherwise
+ */
+
+static inline int sys_dlist_has_multiple_nodes(sys_dlist_t *list)
+{
+ return list->head != list->tail;
+}
+
+/**
+ * @brief get a reference to the head item in the list
+ *
+ * @param list the doubly-linked list to operate on
+ *
+ * @return a pointer to the head element, NULL if list is empty
+ */
+
+static inline sys_dnode_t *sys_dlist_peek_head(sys_dlist_t *list)
+{
+ return sys_dlist_is_empty(list) ? NULL : list->head;
+}
+
+/**
+ * @brief get a reference to the head item in the list
+ *
+ * The list must be known to be non-empty.
+ *
+ * @param list the doubly-linked list to operate on
+ *
+ * @return a pointer to the head element
+ */
+
+static inline sys_dnode_t *sys_dlist_peek_head_not_empty(sys_dlist_t *list)
+{
+ return list->head;
+}
+
+/**
+ * @brief get a reference to the next item in the list, node is not NULL
+ *
+ * Faster than sys_dlist_peek_next() if node is known not to be NULL.
+ *
+ * @param list the doubly-linked list to operate on
+ * @param node the node from which to get the next element in the list
+ *
+ * @return a pointer to the next element from a node, NULL if node is the tail
+ */
+
+static inline sys_dnode_t *sys_dlist_peek_next_no_check(sys_dlist_t *list,
+ sys_dnode_t *node)
+{
+ return (node == list->tail) ? NULL : node->next;
+}
+
+/**
+ * @brief get a reference to the next item in the list
+ *
+ * @param list the doubly-linked list to operate on
+ * @param node the node from which to get the next element in the list
+ *
+ * @return a pointer to the next element from a node, NULL if node is the tail
+ * or NULL (when node comes from reading the head of an empty list).
+ */
+
+static inline sys_dnode_t *sys_dlist_peek_next(sys_dlist_t *list,
+ sys_dnode_t *node)
+{
+ return node ? sys_dlist_peek_next_no_check(list, node) : NULL;
+}
+
+/**
+ * @brief get a reference to the tail item in the list
+ *
+ * @param list the doubly-linked list to operate on
+ *
+ * @return a pointer to the tail element, NULL if list is empty
+ */
+
+static inline sys_dnode_t *sys_dlist_peek_tail(sys_dlist_t *list)
+{
+ return sys_dlist_is_empty(list) ? NULL : list->tail;
+}
+
+/**
+ * @brief add node to tail of list
+ *
+ * This and other sys_dlist_*() functions are not thread safe.
+ *
+ * @param list the doubly-linked list to operate on
+ * @param node the element to append
+ *
+ * @return N/A
+ */
+
+static inline void sys_dlist_append(sys_dlist_t *list, sys_dnode_t *node)
+{
+ node->next = list;
+ node->prev = list->tail;
+
+ list->tail->next = node;
+ list->tail = node;
+}
+
+/**
+ * @brief add node to head of list
+ *
+ * This and other sys_dlist_*() functions are not thread safe.
+ *
+ * @param list the doubly-linked list to operate on
+ * @param node the element to append
+ *
+ * @return N/A
+ */
+
+static inline void sys_dlist_prepend(sys_dlist_t *list, sys_dnode_t *node)
+{
+ node->next = list->head;
+ node->prev = list;
+
+ list->head->prev = node;
+ list->head = node;
+}
+
+/**
+ * @brief insert node after a node
+ *
+ * Insert a node after a specified node in a list.
+ * This and other sys_dlist_*() functions are not thread safe.
+ *
+ * @param list the doubly-linked list to operate on
+ * @param insert_point the insert point in the list: if NULL, insert at head
+ * @param node the element to append
+ *
+ * @return N/A
+ */
+
+static inline void sys_dlist_insert_after(sys_dlist_t *list,
+ sys_dnode_t *insert_point, sys_dnode_t *node)
+{
+ if (!insert_point) {
+ sys_dlist_prepend(list, node);
+ } else {
+ node->next = insert_point->next;
+ node->prev = insert_point;
+ insert_point->next->prev = node;
+ insert_point->next = node;
+ }
+}
+
+/**
+ * @brief insert node before a node
+ *
+ * Insert a node before a specified node in a list.
+ * This and other sys_dlist_*() functions are not thread safe.
+ *
+ * @param list the doubly-linked list to operate on
+ * @param insert_point the insert point in the list: if NULL, insert at tail
+ * @param node the element to insert
+ *
+ * @return N/A
+ */
+
+static inline void sys_dlist_insert_before(sys_dlist_t *list,
+ sys_dnode_t *insert_point, sys_dnode_t *node)
+{
+ if (!insert_point) {
+ sys_dlist_append(list, node);
+ } else {
+ node->prev = insert_point->prev;
+ node->next = insert_point;
+ insert_point->prev->next = node;
+ insert_point->prev = node;
+ }
+}
+
+/**
+ * @brief insert node at position
+ *
+ * Insert a node in a location depending on a external condition. The cond()
+ * function checks if the node is to be inserted _before_ the current node
+ * against which it is checked.
+ * This and other sys_dlist_*() functions are not thread safe.
+ *
+ * @param list the doubly-linked list to operate on
+ * @param node the element to insert
+ * @param cond a function that determines if the current node is the correct
+ * insert point
+ * @param data parameter to cond()
+ *
+ * @return N/A
+ */
+
+static inline void sys_dlist_insert_at(sys_dlist_t *list, sys_dnode_t *node,
+ int (*cond)(sys_dnode_t *, void *), void *data)
+{
+ if (sys_dlist_is_empty(list)) {
+ sys_dlist_append(list, node);
+ } else {
+ sys_dnode_t *pos = sys_dlist_peek_head(list);
+
+ while (pos && !cond(pos, data)) {
+ pos = sys_dlist_peek_next(list, pos);
+ }
+ sys_dlist_insert_before(list, pos, node);
+ }
+}
+
+/**
+ * @brief remove a specific node from a list
+ *
+ * The list is implicit from the node. The node must be part of a list.
+ * This and other sys_dlist_*() functions are not thread safe.
+ *
+ * @param node the node to remove
+ *
+ * @return N/A
+ */
+
+static inline void sys_dlist_remove(sys_dnode_t *node)
+{
+ node->prev->next = node->next;
+ node->next->prev = node->prev;
+}
+
+/**
+ * @brief get the first node in a list
+ *
+ * This and other sys_dlist_*() functions are not thread safe.
+ *
+ * @param list the doubly-linked list to operate on
+ *
+ * @return the first node in the list, NULL if list is empty
+ */
+
+static inline sys_dnode_t *sys_dlist_get(sys_dlist_t *list)
+{
+ sys_dnode_t *node;
+
+ if (sys_dlist_is_empty(list)) {
+ return NULL;
+ }
+
+ node = list->head;
+ sys_dlist_remove(node);
+ return node;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _misc_dlist__h_ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/printk.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/printk.h
new file mode 100644
index 00000000..6759105d
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/printk.h
@@ -0,0 +1,28 @@
+/* printk.h - low-level debug output */
+
+/*
+ * Copyright (c) 2010-2012, 2014 Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+#ifndef _PRINTK_H_
+#define _PRINTK_H_
+
+#include
+#include
+#include
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define snprintk snprintf
+#define printk printf
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/slist.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/slist.h
new file mode 100644
index 00000000..0a638682
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/slist.h
@@ -0,0 +1,471 @@
+/*
+ * Copyright (c) 2016 Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ *
+ * @brief Single-linked list implementation
+ *
+ * Single-linked list implementation using inline macros/functions.
+ * This API is not thread safe, and thus if a list is used across threads,
+ * calls to functions must be protected with synchronization primitives.
+ */
+
+#ifndef __SLIST_H__
+#define __SLIST_H__
+
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _snode {
+ struct _snode *next;
+};
+
+typedef struct _snode sys_snode_t;
+
+struct _slist {
+ sys_snode_t *head;
+ sys_snode_t *tail;
+};
+
+typedef struct _slist sys_slist_t;
+
+/**
+ * @brief Provide the primitive to iterate on a list
+ * Note: the loop is unsafe and thus __sn should not be removed
+ *
+ * User _MUST_ add the loop statement curly braces enclosing its own code:
+ *
+ * SYS_SLIST_FOR_EACH_NODE(l, n) {
+ *
+ * }
+ *
+ * This and other SYS_SLIST_*() macros are not thread safe.
+ *
+ * @param __sl A pointer on a sys_slist_t to iterate on
+ * @param __sn A sys_snode_t pointer to peek each node of the list
+ */
+#define SYS_SLIST_FOR_EACH_NODE(__sl, __sn) \
+ for (__sn = sys_slist_peek_head(__sl); __sn; \
+ __sn = sys_slist_peek_next(__sn))
+
+/**
+ * @brief Provide the primitive to iterate on a list, from a node in the list
+ * Note: the loop is unsafe and thus __sn should not be removed
+ *
+ * User _MUST_ add the loop statement curly braces enclosing its own code:
+ *
+ * SYS_SLIST_ITERATE_FROM_NODE(l, n) {
+ *
+ * }
+ *
+ * Like SYS_SLIST_FOR_EACH_NODE(), but __dn already contains a node in the list
+ * where to start searching for the next entry from. If NULL, it starts from
+ * the head.
+ *
+ * This and other SYS_SLIST_*() macros are not thread safe.
+ *
+ * @param __sl A pointer on a sys_slist_t to iterate on
+ * @param __sn A sys_snode_t pointer to peek each node of the list
+ * it contains the starting node, or NULL to start from the head
+ */
+#define SYS_SLIST_ITERATE_FROM_NODE(__sl, __sn) \
+ for (__sn = __sn ? sys_slist_peek_next_no_check(__sn) : sys_slist_peek_head(__sl); \
+ __sn; \
+ __sn = sys_slist_peek_next(__sn))
+
+/**
+ * @brief Provide the primitive to safely iterate on a list
+ * Note: __sn can be removed, it will not break the loop.
+ *
+ * User _MUST_ add the loop statement curly braces enclosing its own code:
+ *
+ * SYS_SLIST_FOR_EACH_NODE_SAFE(l, n, s) {
+ *
+ * }
+ *
+ * This and other SYS_SLIST_*() macros are not thread safe.
+ *
+ * @param __sl A pointer on a sys_slist_t to iterate on
+ * @param __sn A sys_snode_t pointer to peek each node of the list
+ * @param __sns A sys_snode_t pointer for the loop to run safely
+ */
+#define SYS_SLIST_FOR_EACH_NODE_SAFE(__sl, __sn, __sns) \
+ for (__sn = sys_slist_peek_head(__sl), \
+ __sns = sys_slist_peek_next(__sn); \
+ __sn; __sn = __sns, \
+ __sns = sys_slist_peek_next(__sn))
+
+/*
+ * @brief Provide the primitive to resolve the container of a list node
+ * Note: it is safe to use with NULL pointer nodes
+ *
+ * @param __ln A pointer on a sys_node_t to get its container
+ * @param __cn Container struct type pointer
+ * @param __n The field name of sys_node_t within the container struct
+ */
+#define SYS_SLIST_CONTAINER(__ln, __cn, __n) \
+ ((__ln) ? CONTAINER_OF((__ln), __typeof__(*(__cn)), __n) : NULL)
+/*
+ * @brief Provide the primitive to peek container of the list head
+ *
+ * @param __sl A pointer on a sys_slist_t to peek
+ * @param __cn Container struct type pointer
+ * @param __n The field name of sys_node_t within the container struct
+ */
+#define SYS_SLIST_PEEK_HEAD_CONTAINER(__sl, __cn, __n) \
+ SYS_SLIST_CONTAINER(sys_slist_peek_head(__sl), __cn, __n)
+
+/*
+ * @brief Provide the primitive to peek container of the list tail
+ *
+ * @param __sl A pointer on a sys_slist_t to peek
+ * @param __cn Container struct type pointer
+ * @param __n The field name of sys_node_t within the container struct
+ */
+#define SYS_SLIST_PEEK_TAIL_CONTAINER(__sl, __cn, __n) \
+ SYS_SLIST_CONTAINER(sys_slist_peek_tail(__sl), __cn, __n)
+
+/*
+ * @brief Provide the primitive to peek the next container
+ *
+ * @param __cn Container struct type pointer
+ * @param __n The field name of sys_node_t within the container struct
+ */
+
+#define SYS_SLIST_PEEK_NEXT_CONTAINER(__cn, __n) \
+ ((__cn) ? SYS_SLIST_CONTAINER(sys_slist_peek_next(&((__cn)->__n)), \
+ __cn, __n) : \
+ NULL)
+
+/**
+ * @brief Provide the primitive to iterate on a list under a container
+ * Note: the loop is unsafe and thus __cn should not be detached
+ *
+ * User _MUST_ add the loop statement curly braces enclosing its own code:
+ *
+ * SYS_SLIST_FOR_EACH_CONTAINER(l, c, n) {
+ *
+ * }
+ *
+ * @param __sl A pointer on a sys_slist_t to iterate on
+ * @param __cn A pointer to peek each entry of the list
+ * @param __n The field name of sys_node_t within the container struct
+ */
+#define SYS_SLIST_FOR_EACH_CONTAINER(__sl, __cn, __n) \
+ for (__cn = SYS_SLIST_PEEK_HEAD_CONTAINER(__sl, __cn, __n); __cn; \
+ __cn = SYS_SLIST_PEEK_NEXT_CONTAINER(__cn, __n))
+
+/**
+ * @brief Provide the primitive to safely iterate on a list under a container
+ * Note: __cn can be detached, it will not break the loop.
+ *
+ * User _MUST_ add the loop statement curly braces enclosing its own code:
+ *
+ * SYS_SLIST_FOR_EACH_NODE_SAFE(l, c, cn, n) {
+ *
+ * }
+ *
+ * @param __sl A pointer on a sys_slist_t to iterate on
+ * @param __cn A pointer to peek each entry of the list
+ * @param __cns A pointer for the loop to run safely
+ * @param __n The field name of sys_node_t within the container struct
+ */
+#define SYS_SLIST_FOR_EACH_CONTAINER_SAFE(__sl, __cn, __cns, __n) \
+ for (__cn = SYS_SLIST_PEEK_HEAD_CONTAINER(__sl, __cn, __n), \
+ __cns = SYS_SLIST_PEEK_NEXT_CONTAINER(__cn, __n); \
+ __cn; \
+ __cn = __cns, __cns = SYS_SLIST_PEEK_NEXT_CONTAINER(__cn, __n))
+
+/**
+ * @brief Initialize a list
+ *
+ * @param list A pointer on the list to initialize
+ */
+static inline void sys_slist_init(sys_slist_t *list)
+{
+ list->head = NULL;
+ list->tail = NULL;
+}
+
+#define SYS_SLIST_STATIC_INIT(ptr_to_list) \
+ { \
+ NULL, NULL \
+ }
+
+/**
+ * @brief Test if the given list is empty
+ *
+ * @param list A pointer on the list to test
+ *
+ * @return a boolean, true if it's empty, false otherwise
+ */
+static inline bool sys_slist_is_empty(sys_slist_t *list)
+{
+ return (!list->head);
+}
+
+/**
+ * @brief Peek the first node from the list
+ *
+ * @param list A point on the list to peek the first node from
+ *
+ * @return A pointer on the first node of the list (or NULL if none)
+ */
+static inline sys_snode_t *sys_slist_peek_head(sys_slist_t *list)
+{
+ return list->head;
+}
+
+/**
+ * @brief Peek the last node from the list
+ *
+ * @param list A point on the list to peek the last node from
+ *
+ * @return A pointer on the last node of the list (or NULL if none)
+ */
+static inline sys_snode_t *sys_slist_peek_tail(sys_slist_t *list)
+{
+ return list->tail;
+}
+
+/**
+ * @brief Peek the next node from current node, node is not NULL
+ *
+ * Faster then sys_slist_peek_next() if node is known not to be NULL.
+ *
+ * @param node A pointer on the node where to peek the next node
+ *
+ * @return a pointer on the next node (or NULL if none)
+ */
+static inline sys_snode_t *sys_slist_peek_next_no_check(sys_snode_t *node)
+{
+ return node->next;
+}
+
+/**
+ * @brief Peek the next node from current node
+ *
+ * @param node A pointer on the node where to peek the next node
+ *
+ * @return a pointer on the next node (or NULL if none)
+ */
+static inline sys_snode_t *sys_slist_peek_next(sys_snode_t *node)
+{
+ return node ? sys_slist_peek_next_no_check(node) : NULL;
+}
+
+/**
+ * @brief Prepend a node to the given list
+ *
+ * This and other sys_slist_*() functions are not thread safe.
+ *
+ * @param list A pointer on the list to affect
+ * @param node A pointer on the node to prepend
+ */
+static inline void sys_slist_prepend(sys_slist_t *list,
+ sys_snode_t *node)
+{
+ node->next = list->head;
+ list->head = node;
+
+ if (!list->tail) {
+ list->tail = list->head;
+ }
+}
+
+/**
+ * @brief Append a node to the given list
+ *
+ * This and other sys_slist_*() functions are not thread safe.
+ *
+ * @param list A pointer on the list to affect
+ * @param node A pointer on the node to append
+ */
+static inline void sys_slist_append(sys_slist_t *list,
+ sys_snode_t *node)
+{
+ node->next = NULL;
+
+ if (!list->tail) {
+ list->tail = node;
+ list->head = node;
+ } else {
+ list->tail->next = node;
+ list->tail = node;
+ }
+}
+
+/**
+ * @brief Append a list to the given list
+ *
+ * Append a singly-linked, NULL-terminated list consisting of nodes containing
+ * the pointer to the next node as the first element of a node, to @a list.
+ * This and other sys_slist_*() functions are not thread safe.
+ *
+ * @param list A pointer on the list to affect
+ * @param head A pointer to the first element of the list to append
+ * @param tail A pointer to the last element of the list to append
+ */
+static inline void sys_slist_append_list(sys_slist_t *list,
+ void *head, void *tail)
+{
+ if (!list->tail) {
+ list->head = (sys_snode_t *)head;
+ list->tail = (sys_snode_t *)tail;
+ } else {
+ list->tail->next = (sys_snode_t *)head;
+ list->tail = (sys_snode_t *)tail;
+ }
+}
+
+/**
+ * @brief merge two slists, appending the second one to the first
+ *
+ * When the operation is completed, the appending list is empty.
+ * This and other sys_slist_*() functions are not thread safe.
+ *
+ * @param list A pointer on the list to affect
+ * @param list_to_append A pointer to the list to append.
+ */
+static inline void sys_slist_merge_slist(sys_slist_t *list,
+ sys_slist_t *list_to_append)
+{
+ sys_slist_append_list(list, list_to_append->head,
+ list_to_append->tail);
+ sys_slist_init(list_to_append);
+}
+
+/**
+ * @brief Insert a node to the given list
+ *
+ * This and other sys_slist_*() functions are not thread safe.
+ *
+ * @param list A pointer on the list to affect
+ * @param prev A pointer on the previous node
+ * @param node A pointer on the node to insert
+ */
+static inline void sys_slist_insert(sys_slist_t *list,
+ sys_snode_t *prev,
+ sys_snode_t *node)
+{
+ if (!prev) {
+ sys_slist_prepend(list, node);
+ } else if (!prev->next) {
+ sys_slist_append(list, node);
+ } else {
+ node->next = prev->next;
+ prev->next = node;
+ }
+}
+
+/**
+ * @brief Fetch and remove the first node of the given list
+ *
+ * List must be known to be non-empty.
+ * This and other sys_slist_*() functions are not thread safe.
+ *
+ * @param list A pointer on the list to affect
+ *
+ * @return A pointer to the first node of the list
+ */
+static inline sys_snode_t *sys_slist_get_not_empty(sys_slist_t *list)
+{
+ sys_snode_t *node = list->head;
+
+ list->head = node->next;
+ if (list->tail == node) {
+ list->tail = list->head;
+ }
+
+ return node;
+}
+
+/**
+ * @brief Fetch and remove the first node of the given list
+ *
+ * This and other sys_slist_*() functions are not thread safe.
+ *
+ * @param list A pointer on the list to affect
+ *
+ * @return A pointer to the first node of the list (or NULL if empty)
+ */
+static inline sys_snode_t *sys_slist_get(sys_slist_t *list)
+{
+ return sys_slist_is_empty(list) ? NULL : sys_slist_get_not_empty(list);
+}
+
+/**
+ * @brief Remove a node
+ *
+ * This and other sys_slist_*() functions are not thread safe.
+ *
+ * @param list A pointer on the list to affect
+ * @param prev_node A pointer on the previous node
+ * (can be NULL, which means the node is the list's head)
+ * @param node A pointer on the node to remove
+ */
+static inline void sys_slist_remove(sys_slist_t *list,
+ sys_snode_t *prev_node,
+ sys_snode_t *node)
+{
+ if (!prev_node) {
+ list->head = node->next;
+
+ /* Was node also the tail? */
+ if (list->tail == node) {
+ list->tail = list->head;
+ }
+ } else {
+ prev_node->next = node->next;
+
+ /* Was node the tail? */
+ if (list->tail == node) {
+ list->tail = prev_node;
+ }
+ }
+
+ node->next = NULL;
+}
+
+/**
+ * @brief Find and remove a node from a list
+ *
+ * This and other sys_slist_*() functions are not thread safe.
+ *
+ * @param list A pointer on the list to affect
+ * @param node A pointer on the node to remove from the list
+ *
+ * @return true if node was removed
+ */
+static inline bool sys_slist_find_and_remove(sys_slist_t *list,
+ sys_snode_t *node)
+{
+ sys_snode_t *prev = NULL;
+ sys_snode_t *test;
+
+ SYS_SLIST_FOR_EACH_NODE(list, test)
+ {
+ if (test == node) {
+ sys_slist_remove(list, prev, node);
+ return true;
+ }
+
+ prev = test;
+ }
+
+ return false;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SLIST_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/stack.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/stack.h
new file mode 100644
index 00000000..0fce5d45
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/stack.h
@@ -0,0 +1,87 @@
+/**
+ * @file stack.h
+ * Stack usage analysis helpers
+ */
+
+/*
+ * Copyright (c) 2015 Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef _MISC_STACK_H_
+#define _MISC_STACK_H_
+
+#include
+
+#if defined(CONFIG_INIT_STACKS)
+static inline size_t stack_unused_space_get(const char *stack, size_t size)
+{
+ size_t unused = 0;
+ int i;
+
+#ifdef CONFIG_STACK_SENTINEL
+ /* First 4 bytes of the stack buffer reserved for the sentinel
+ * value, it won't be 0xAAAAAAAA for thread stacks.
+ */
+ stack += 4;
+#endif
+
+ /* TODO Currently all supported platforms have stack growth down and
+ * there is no Kconfig option to configure it so this always build
+ * "else" branch. When support for platform with stack direction up
+ * (or configurable direction) is added this check should be confirmed
+ * that correct Kconfig option is used.
+ */
+#if defined(STACK_GROWS_UP)
+ for (i = size - 1; i >= 0; i--) {
+ if ((unsigned char)stack[i] == 0xaa) {
+ unused++;
+ } else {
+ break;
+ }
+ }
+#else
+ for (i = 0; i < size; i++) {
+ if ((unsigned char)stack[i] == 0xaa) {
+ unused++;
+ } else {
+ break;
+ }
+ }
+#endif
+ return unused;
+}
+#else
+static inline size_t stack_unused_space_get(const char *stack, size_t size)
+{
+ return 0;
+}
+#endif
+
+#if defined(CONFIG_INIT_STACKS) && defined(CONFIG_PRINTK)
+static inline void stack_analyze(const char *name, const char *stack,
+ unsigned int size)
+{
+ unsigned int pcnt, unused = 0;
+
+ unused = stack_unused_space_get(stack, size);
+
+ /* Calculate the real size reserved for the stack */
+ pcnt = ((size - unused) * 100) / size;
+
+ printk("%s (real size %u):\tunused %u\tusage %u / %u (%u %%)\n", name,
+ size, unused, size - unused, size, pcnt);
+}
+#else
+static inline void stack_analyze(const char *name, const char *stack,
+ unsigned int size)
+{
+}
+#endif
+
+#define STACK_ANALYZE(name, sym) \
+ stack_analyze(name, K_THREAD_STACK_BUFFER(sym), \
+ K_THREAD_STACK_SIZEOF(sym))
+
+#endif /* _MISC_STACK_H_ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/util.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/util.h
new file mode 100644
index 00000000..77c2958b
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/util.h
@@ -0,0 +1,379 @@
+/*
+ * Copyright (c) 2011-2014, Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief Misc utilities
+ *
+ * Misc utilities usable by the kernel and application code.
+ */
+
+#ifndef _UTIL__H_
+#define _UTIL__H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ASMLANGUAGE
+
+#include
+#if defined(BFLB_BLE)
+#include
+#include "utils_string.h"
+#endif
+
+/* Helper to pass a int as a pointer or vice-versa.
+ * Those are available for 32 bits architectures:
+ */
+#define POINTER_TO_UINT(x) ((u32_t)(x))
+#define UINT_TO_POINTER(x) ((void *)(x))
+#define POINTER_TO_INT(x) ((s32_t)(x))
+#define INT_TO_POINTER(x) ((void *)(x))
+
+/* Evaluates to 0 if cond is true-ish; compile error otherwise */
+#define ZERO_OR_COMPILE_ERROR(cond) ((int)sizeof(char[1 - 2 * !(cond)]) - 1)
+
+/* Evaluates to 0 if array is an array; compile error if not array (e.g.
+ * pointer)
+ */
+#define IS_ARRAY(array) \
+ ZERO_OR_COMPILE_ERROR( \
+ !__builtin_types_compatible_p(__typeof__(array), \
+ __typeof__(&(array)[0])))
+
+/* Evaluates to number of elements in an array; compile error if not
+ * an array (e.g. pointer)
+ */
+#define ARRAY_SIZE(array) \
+ ((unsigned long)(IS_ARRAY(array) + \
+ (sizeof(array) / sizeof((array)[0]))))
+
+/* Evaluates to 1 if ptr is part of array, 0 otherwise; compile error if
+ * "array" argument is not an array (e.g. "ptr" and "array" mixed up)
+ */
+#define PART_OF_ARRAY(array, ptr) \
+ ((ptr) && ((ptr) >= &array[0] && (ptr) < &array[ARRAY_SIZE(array)]))
+
+#define CONTAINER_OF(ptr, type, field) \
+ ((type *)(((char *)(ptr)) - offsetof(type, field)))
+
+/* round "x" up/down to next multiple of "align" (which must be a power of 2) */
+#define ROUND_UP(x, align) \
+ (((unsigned long)(x) + ((unsigned long)align - 1)) & \
+ ~((unsigned long)align - 1))
+#define ROUND_DOWN(x, align) ((unsigned long)(x) & ~((unsigned long)align - 1))
+
+#define ceiling_fraction(numerator, divider) \
+ (((numerator) + ((divider)-1)) / (divider))
+
+#ifdef INLINED
+#define INLINE inline
+#else
+#define INLINE
+#endif
+
+#ifndef MAX
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+#endif
+
+#ifndef MIN
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#endif
+
+void get_bytearray_from_string(char **params, uint8_t *result, int array_size);
+void get_uint8_from_string(char **params, uint8_t *result);
+void get_uint16_from_string(char **params, uint16_t *result);
+void get_uint32_from_string(char **params, uint32_t *result);
+void reverse_bytearray(uint8_t *src, uint8_t *result, int array_size);
+void reverse_bytearray(uint8_t *src, uint8_t *result, int array_size);
+unsigned int find_lsb_set(uint32_t data);
+
+static inline int is_power_of_two(unsigned int x)
+{
+ return (x != 0) && !(x & (x - 1));
+}
+
+static inline s64_t arithmetic_shift_right(s64_t value, u8_t shift)
+{
+ s64_t sign_ext;
+
+ if (shift == 0) {
+ return value;
+ }
+
+ /* extract sign bit */
+ sign_ext = (value >> 63) & 1;
+
+ /* make all bits of sign_ext be the same as the value's sign bit */
+ sign_ext = -sign_ext;
+
+ /* shift value and fill opened bit positions with sign bit */
+ return (value >> shift) | (sign_ext << (64 - shift));
+}
+
+#endif /* !_ASMLANGUAGE */
+
+/* KB, MB, GB */
+#define KB(x) ((x) << 10)
+#define MB(x) (KB(x) << 10)
+#define GB(x) (MB(x) << 10)
+
+/* KHZ, MHZ */
+#define KHZ(x) ((x)*1000)
+#define MHZ(x) (KHZ(x) * 1000)
+
+#define BIT_MASK(n) (BIT(n) - 1)
+
+/**
+ * @brief Check for macro definition in compiler-visible expressions
+ *
+ * This trick was pioneered in Linux as the config_enabled() macro.
+ * The madness has the effect of taking a macro value that may be
+ * defined to "1" (e.g. CONFIG_MYFEATURE), or may not be defined at
+ * all and turning it into a literal expression that can be used at
+ * "runtime". That is, it works similarly to
+ * "defined(CONFIG_MYFEATURE)" does except that it is an expansion
+ * that can exist in a standard expression and be seen by the compiler
+ * and optimizer. Thus much ifdef usage can be replaced with cleaner
+ * expressions like:
+ *
+ * if (IS_ENABLED(CONFIG_MYFEATURE))
+ * myfeature_enable();
+ *
+ * INTERNAL
+ * First pass just to expand any existing macros, we need the macro
+ * value to be e.g. a literal "1" at expansion time in the next macro,
+ * not "(1)", etc... Standard recursive expansion does not work.
+ */
+#define IS_ENABLED(config_macro) _IS_ENABLED1(config_macro)
+
+/* Now stick on a "_XXXX" prefix, it will now be "_XXXX1" if config_macro
+ * is "1", or just "_XXXX" if it's undefined.
+ * ENABLED: _IS_ENABLED2(_XXXX1)
+ * DISABLED _IS_ENABLED2(_XXXX)
+ */
+#define _IS_ENABLED1(config_macro) _IS_ENABLED2(_XXXX##config_macro)
+
+/* Here's the core trick, we map "_XXXX1" to "_YYYY," (i.e. a string
+ * with a trailing comma), so it has the effect of making this a
+ * two-argument tuple to the preprocessor only in the case where the
+ * value is defined to "1"
+ * ENABLED: _YYYY, <--- note comma!
+ * DISABLED: _XXXX
+ */
+#define _XXXX1 _YYYY,
+
+/* Then we append an extra argument to fool the gcc preprocessor into
+ * accepting it as a varargs macro.
+ * arg1 arg2 arg3
+ * ENABLED: _IS_ENABLED3(_YYYY, 1, 0)
+ * DISABLED _IS_ENABLED3(_XXXX 1, 0)
+ */
+#define _IS_ENABLED2(one_or_two_args) _IS_ENABLED3(one_or_two_args 1, 0)
+
+/* And our second argument is thus now cooked to be 1 in the case
+ * where the value is defined to 1, and 0 if not:
+ */
+#define _IS_ENABLED3(ignore_this, val, ...) val
+
+/**
+ * Macros for doing code-generation with the preprocessor.
+ *
+ * Generally it is better to generate code with the preprocessor than
+ * to copy-paste code or to generate code with the build system /
+ * python script's etc.
+ *
+ * http://stackoverflow.com/a/12540675
+ */
+#define UTIL_EMPTY(...)
+#define UTIL_DEFER(...) __VA_ARGS__ UTIL_EMPTY()
+#define UTIL_OBSTRUCT(...) __VA_ARGS__ UTIL_DEFER(UTIL_EMPTY)()
+#define UTIL_EXPAND(...) __VA_ARGS__
+
+#define UTIL_EVAL(...) UTIL_EVAL1(UTIL_EVAL1(UTIL_EVAL1(__VA_ARGS__)))
+#define UTIL_EVAL1(...) UTIL_EVAL2(UTIL_EVAL2(UTIL_EVAL2(__VA_ARGS__)))
+#define UTIL_EVAL2(...) UTIL_EVAL3(UTIL_EVAL3(UTIL_EVAL3(__VA_ARGS__)))
+#define UTIL_EVAL3(...) UTIL_EVAL4(UTIL_EVAL4(UTIL_EVAL4(__VA_ARGS__)))
+#define UTIL_EVAL4(...) UTIL_EVAL5(UTIL_EVAL5(UTIL_EVAL5(__VA_ARGS__)))
+#define UTIL_EVAL5(...) __VA_ARGS__
+
+#define UTIL_CAT(a, ...) UTIL_PRIMITIVE_CAT(a, __VA_ARGS__)
+#define UTIL_PRIMITIVE_CAT(a, ...) a##__VA_ARGS__
+
+#define UTIL_INC(x) UTIL_PRIMITIVE_CAT(UTIL_INC_, x)
+#define UTIL_INC_0 1
+#define UTIL_INC_1 2
+#define UTIL_INC_2 3
+#define UTIL_INC_3 4
+#define UTIL_INC_4 5
+#define UTIL_INC_5 6
+#define UTIL_INC_6 7
+#define UTIL_INC_7 8
+#define UTIL_INC_8 9
+#define UTIL_INC_9 10
+#define UTIL_INC_10 11
+#define UTIL_INC_11 12
+#define UTIL_INC_12 13
+#define UTIL_INC_13 14
+#define UTIL_INC_14 15
+#define UTIL_INC_15 16
+#define UTIL_INC_16 17
+#define UTIL_INC_17 18
+#define UTIL_INC_18 19
+#define UTIL_INC_19 19
+
+#define UTIL_DEC(x) UTIL_PRIMITIVE_CAT(UTIL_DEC_, x)
+#define UTIL_DEC_0 0
+#define UTIL_DEC_1 0
+#define UTIL_DEC_2 1
+#define UTIL_DEC_3 2
+#define UTIL_DEC_4 3
+#define UTIL_DEC_5 4
+#define UTIL_DEC_6 5
+#define UTIL_DEC_7 6
+#define UTIL_DEC_8 7
+#define UTIL_DEC_9 8
+#define UTIL_DEC_10 9
+#define UTIL_DEC_11 10
+#define UTIL_DEC_12 11
+#define UTIL_DEC_13 12
+#define UTIL_DEC_14 13
+#define UTIL_DEC_15 14
+#define UTIL_DEC_16 15
+#define UTIL_DEC_17 16
+#define UTIL_DEC_18 17
+#define UTIL_DEC_19 18
+
+#define UTIL_CHECK_N(x, n, ...) n
+#define UTIL_CHECK(...) UTIL_CHECK_N(__VA_ARGS__, 0, )
+
+#define UTIL_NOT(x) UTIL_CHECK(UTIL_PRIMITIVE_CAT(UTIL_NOT_, x))
+#define UTIL_NOT_0 ~, 1,
+
+#define UTIL_COMPL(b) UTIL_PRIMITIVE_CAT(UTIL_COMPL_, b)
+#define UTIL_COMPL_0 1
+#define UTIL_COMPL_1 0
+
+#define UTIL_BOOL(x) UTIL_COMPL(UTIL_NOT(x))
+
+#define UTIL_IIF(c) UTIL_PRIMITIVE_CAT(UTIL_IIF_, c)
+#define UTIL_IIF_0(t, ...) __VA_ARGS__
+#define UTIL_IIF_1(t, ...) t
+
+#define UTIL_IF(c) UTIL_IIF(UTIL_BOOL(c))
+
+#define UTIL_EAT(...)
+#define UTIL_EXPAND(...) __VA_ARGS__
+#define UTIL_WHEN(c) UTIL_IF(c) \
+(UTIL_EXPAND, UTIL_EAT)
+
+#define UTIL_REPEAT(count, macro, ...) \
+ UTIL_WHEN(count) \
+ ( \
+ UTIL_OBSTRUCT(UTIL_REPEAT_INDIRECT)()( \
+ UTIL_DEC(count), macro, __VA_ARGS__) \
+ UTIL_OBSTRUCT(macro)( \
+ UTIL_DEC(count), __VA_ARGS__))
+#define UTIL_REPEAT_INDIRECT() UTIL_REPEAT
+
+/**
+ * Generates a sequence of code.
+ * Useful for generating code like;
+ *
+ * NRF_PWM0, NRF_PWM1, NRF_PWM2,
+ *
+ * @arg LEN: The length of the sequence. Must be defined and less than
+ * 20.
+ *
+ * @arg F(i, F_ARG): A macro function that accepts two arguments.
+ * F is called repeatedly, the first argument
+ * is the index in the sequence, and the second argument is the third
+ * argument given to UTIL_LISTIFY.
+ *
+ * Example:
+ *
+ * \#define FOO(i, _) NRF_PWM ## i ,
+ * { UTIL_LISTIFY(PWM_COUNT, FOO) }
+ * // The above two lines will generate the below:
+ * { NRF_PWM0 , NRF_PWM1 , }
+ *
+ * @note Calling UTIL_LISTIFY with undefined arguments has undefined
+ * behaviour.
+ */
+#define UTIL_LISTIFY(LEN, F, F_ARG) UTIL_EVAL(UTIL_REPEAT(LEN, F, F_ARG))
+
+#if defined(BFLB_BLE)
+/**
+ * @brief Convert a single character into a hexadecimal nibble.
+ *
+ * @param[in] c The character to convert
+ * @param x The address of storage for the converted number.
+ *
+ * @return Zero on success or (negative) error code otherwise.
+ */
+int char2hex(char c, u8_t *x);
+
+/**
+ * @brief Convert a single hexadecimal nibble into a character.
+ *
+ * @param[in] c The number to convert
+ * @param x The address of storage for the converted character.
+ *
+ * @return Zero on success or (negative) error code otherwise.
+ */
+int hex2char(u8_t x, char *c);
+
+/**
+ * @brief Convert a binary array into string representation.
+ *
+ * @param[in] buf The binary array to convert
+ * @param[in] buflen The length of the binary array to convert
+ * @param[out] hex Address of where to store the string representation.
+ * @param[in] hexlen Size of the storage area for string representation.
+ *
+ * @return The length of the converted string, or 0 if an error occurred.
+ */
+size_t bin2hex(const u8_t *buf, size_t buflen, char *hex, size_t hexlen);
+
+/*
+ * Convert hex string to byte string
+ * Return number of bytes written to buf, or 0 on error
+ * @return The length of the converted array, or 0 if an error occurred.
+ */
+
+/**
+ * @brief Convert a hexadecimal string into a binary array.
+ *
+ * @param[in] hex The hexadecimal string to convert
+ * @param[in] hexlen The length of the hexadecimal string to convert.
+ * @param[out] buf Address of where to store the binary data
+ * @param[in] buflen Size of the storage area for binary data
+ *
+ * @return The length of the binary array , or 0 if an error occurred.
+ */
+size_t hex2bin(const char *hex, size_t hexlen, u8_t *buf, size_t buflen);
+
+/**
+ * @brief Convert a u8_t into decimal string representation.
+ *
+ * Convert a u8_t value into ASCII decimal string representation.
+ * The string is terminated if there is enough space in buf.
+ *
+ * @param[out] buf Address of where to store the string representation.
+ * @param[in] buflen Size of the storage area for string representation.
+ * @param[in] value The value to convert to decimal string
+ *
+ * @return The length of the converted string (excluding terminator if
+ * any), or 0 if an error occurred.
+ */
+u8_t u8_to_dec(char *buf, u8_t buflen, u8_t value);
+#endif //#if defined(BFLB_BLE)
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UTIL__H_ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/utils_string.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/utils_string.h
new file mode 100644
index 00000000..14b87157
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/misc/utils_string.h
@@ -0,0 +1,7 @@
+#ifndef __UTILS_STRING_H__
+#define __UTILS_STRING_H__
+void get_bytearray_from_string(char **params, uint8_t *result, int array_size);
+void get_uint8_from_string(char **params, uint8_t *result);
+void get_uint16_from_string(char **params, uint16_t *result);
+void get_uint32_from_string(char **params, uint32_t *result);
+#endif
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/net/buf.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/net/buf.h
new file mode 100644
index 00000000..b1b58fba
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/net/buf.h
@@ -0,0 +1,1542 @@
+/** @file
+ * @brief Buffer management.
+ */
+
+/*
+ * Copyright (c) 2015 Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+#ifndef __NET_BUF_H
+#define __NET_BUF_H
+
+#include
+#include
+#include
+#include
+#include "ble_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Network buffer library
+ * @defgroup net_buf Network Buffer Library
+ * @ingroup networking
+ * @{
+ */
+
+/* Alignment needed for various parts of the buffer definition */
+#define __net_buf_align __aligned(sizeof(int))
+
+/** @def NET_BUF_SIMPLE_DEFINE
+ * @brief Define a net_buf_simple stack variable.
+ *
+ * This is a helper macro which is used to define a net_buf_simple object
+ * on the stack.
+ *
+ * @param _name Name of the net_buf_simple object.
+ * @param _size Maximum data storage for the buffer.
+ */
+#define NET_BUF_SIMPLE_DEFINE(_name, _size) \
+ u8_t net_buf_data_##_name[_size]; \
+ struct net_buf_simple _name = { \
+ .data = net_buf_data_##_name, \
+ .len = 0, \
+ .size = _size, \
+ .__buf = net_buf_data_##_name, \
+ }
+
+/** @def NET_BUF_SIMPLE_DEFINE_STATIC
+ * @brief Define a static net_buf_simple variable.
+ *
+ * This is a helper macro which is used to define a static net_buf_simple
+ * object.
+ *
+ * @param _name Name of the net_buf_simple object.
+ * @param _size Maximum data storage for the buffer.
+ */
+#define NET_BUF_SIMPLE_DEFINE_STATIC(_name, _size) \
+ static /*__noinit*/ u8_t net_buf_data_##_name[_size]; \
+ static struct net_buf_simple _name = { \
+ .data = net_buf_data_##_name, \
+ .len = 0, \
+ .size = _size, \
+ .__buf = net_buf_data_##_name, \
+ }
+
+/** @brief Simple network buffer representation.
+ *
+ * This is a simpler variant of the net_buf object (in fact net_buf uses
+ * net_buf_simple internally). It doesn't provide any kind of reference
+ * counting, user data, dynamic allocation, or in general the ability to
+ * pass through kernel objects such as FIFOs.
+ *
+ * The main use of this is for scenarios where the meta-data of the normal
+ * net_buf isn't needed and causes too much overhead. This could be e.g.
+ * when the buffer only needs to be allocated on the stack or when the
+ * access to and lifetime of the buffer is well controlled and constrained.
+ *
+ */
+struct net_buf_simple {
+ /** Pointer to the start of data in the buffer. */
+ u8_t *data;
+
+ /** Length of the data behind the data pointer. */
+ u16_t len;
+
+ /** Amount of data that this buffer can store. */
+ u16_t size;
+
+ /** Start of the data storage. Not to be accessed directly
+ * (the data pointer should be used instead).
+ */
+ u8_t *__buf;
+};
+
+/** @def NET_BUF_SIMPLE
+ * @brief Define a net_buf_simple stack variable and get a pointer to it.
+ *
+ * This is a helper macro which is used to define a net_buf_simple object on
+ * the stack and the get a pointer to it as follows:
+ *
+ * struct net_buf_simple *my_buf = NET_BUF_SIMPLE(10);
+ *
+ * After creating the object it needs to be initialized by calling
+ * net_buf_simple_init().
+ *
+ * @param _size Maximum data storage for the buffer.
+ *
+ * @return Pointer to stack-allocated net_buf_simple object.
+ */
+#define NET_BUF_SIMPLE(_size) \
+ ((struct net_buf_simple *)(&(struct { \
+ struct net_buf_simple buf; \
+ u8_t data[_size] __net_buf_align; \
+ }){ \
+ .buf.size = _size, \
+ }))
+
+/** @brief Initialize a net_buf_simple object.
+ *
+ * This needs to be called after creating a net_buf_simple object using
+ * the NET_BUF_SIMPLE macro.
+ *
+ * @param buf Buffer to initialize.
+ * @param reserve_head Headroom to reserve.
+ */
+static inline void net_buf_simple_init(struct net_buf_simple *buf,
+ size_t reserve_head)
+{
+ if (!buf->__buf) {
+ buf->__buf = (u8_t *)buf + sizeof(*buf);
+ }
+
+ buf->data = buf->__buf + reserve_head;
+ buf->len = 0;
+}
+
+/**
+ * @brief Initialize a net_buf_simple object with data.
+ *
+ * Initialized buffer object with external data.
+ *
+ * @param buf Buffer to initialize.
+ * @param data External data pointer
+ * @param size Amount of data the pointed data buffer if able to fit.
+ */
+void net_buf_simple_init_with_data(struct net_buf_simple *buf,
+ void *data, size_t size);
+
+/**
+
+ * @brief Reset buffer
+ *
+ * Reset buffer data so it can be reused for other purposes.
+ *
+ * @param buf Buffer to reset.
+ */
+static inline void net_buf_simple_reset(struct net_buf_simple *buf)
+{
+ buf->len = 0;
+ buf->data = buf->__buf;
+}
+
+/**
+ * Clone buffer state, using the same data buffer.
+ *
+ * Initializes a buffer to point to the same data as an existing buffer.
+ * Allows operations on the same data without altering the length and
+ * offset of the original.
+ *
+ * @param original Buffer to clone.
+ * @param clone The new clone.
+ */
+void net_buf_simple_clone(const struct net_buf_simple *original,
+ struct net_buf_simple *clone);
+
+/**
+ * @brief Prepare data to be added at the end of the buffer
+ *
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param len Number of bytes to increment the length with.
+ *
+ * @return The original tail of the buffer.
+ */
+void *net_buf_simple_add(struct net_buf_simple *buf, size_t len);
+
+/**
+ * @brief Copy bytes from memory to the end of the buffer
+ *
+ * Copies the given number of bytes to the end of the buffer. Increments the
+ * data length of the buffer to account for more data at the end.
+ *
+ * @param buf Buffer to update.
+ * @param mem Location of data to be added.
+ * @param len Length of data to be added
+ *
+ * @return The original tail of the buffer.
+ */
+void *net_buf_simple_add_mem(struct net_buf_simple *buf, const void *mem,
+ size_t len);
+
+/**
+ * @brief Add (8-bit) byte at the end of the buffer
+ *
+ * Adds a byte at the end of the buffer. Increments the data length of
+ * the buffer to account for more data at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val byte value to be added.
+ *
+ * @return Pointer to the value added
+ */
+u8_t *net_buf_simple_add_u8(struct net_buf_simple *buf, u8_t val);
+
+/**
+ * @brief Add 16-bit value at the end of the buffer
+ *
+ * Adds 16-bit value in little endian format at the end of buffer.
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val 16-bit value to be added.
+ */
+void net_buf_simple_add_le16(struct net_buf_simple *buf, u16_t val);
+
+/**
+ * @brief Add 16-bit value at the end of the buffer
+ *
+ * Adds 16-bit value in big endian format at the end of buffer.
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val 16-bit value to be added.
+ */
+void net_buf_simple_add_be16(struct net_buf_simple *buf, u16_t val);
+
+/**
+ * @brief Add 24-bit value at the end of the buffer
+ *
+ * Adds 24-bit value in little endian format at the end of buffer.
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val 24-bit value to be added.
+ */
+void net_buf_simple_add_le24(struct net_buf_simple *buf, uint32_t val);
+
+/**
+ * @brief Add 24-bit value at the end of the buffer
+ *
+ * Adds 24-bit value in big endian format at the end of buffer.
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val 24-bit value to be added.
+ */
+void net_buf_simple_add_be24(struct net_buf_simple *buf, uint32_t val);
+
+/**
+ * @brief Add 32-bit value at the end of the buffer
+ *
+ * Adds 32-bit value in little endian format at the end of buffer.
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val 32-bit value to be added.
+ */
+void net_buf_simple_add_le32(struct net_buf_simple *buf, u32_t val);
+
+/**
+ * @brief Add 32-bit value at the end of the buffer
+ *
+ * Adds 32-bit value in big endian format at the end of buffer.
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val 32-bit value to be added.
+ */
+void net_buf_simple_add_be32(struct net_buf_simple *buf, u32_t val);
+
+/**
+ * @brief Push data to the beginning of the buffer.
+ *
+ * Modifies the data pointer and buffer length to account for more data
+ * in the beginning of the buffer.
+ *
+ * @param buf Buffer to update.
+ * @param len Number of bytes to add to the beginning.
+ *
+ * @return The new beginning of the buffer data.
+ */
+void *net_buf_simple_push(struct net_buf_simple *buf, size_t len);
+
+/**
+ * @brief Push 16-bit value to the beginning of the buffer
+ *
+ * Adds 16-bit value in little endian format to the beginning of the
+ * buffer.
+ *
+ * @param buf Buffer to update.
+ * @param val 16-bit value to be pushed to the buffer.
+ */
+void net_buf_simple_push_le16(struct net_buf_simple *buf, u16_t val);
+
+/**
+ * @brief Push 16-bit value to the beginning of the buffer
+ *
+ * Adds 16-bit value in big endian format to the beginning of the
+ * buffer.
+ *
+ * @param buf Buffer to update.
+ * @param val 16-bit value to be pushed to the buffer.
+ */
+void net_buf_simple_push_be16(struct net_buf_simple *buf, u16_t val);
+
+/**
+ * @brief Push 8-bit value to the beginning of the buffer
+ *
+ * Adds 8-bit value the beginning of the buffer.
+ *
+ * @param buf Buffer to update.
+ * @param val 8-bit value to be pushed to the buffer.
+ */
+void net_buf_simple_push_u8(struct net_buf_simple *buf, u8_t val);
+
+/**
+ * @brief Push 24-bit value to the beginning of the buffer
+ *
+ * Adds 24-bit value in little endian format to the beginning of the
+ * buffer.
+ *
+ * @param buf Buffer to update.
+ * @param val 24-bit value to be pushed to the buffer.
+ */
+void net_buf_simple_push_le24(struct net_buf_simple *buf, uint32_t val);
+
+/**
+ * @brief Push 24-bit value to the beginning of the buffer
+ *
+ * Adds 24-bit value in big endian format to the beginning of the
+ * buffer.
+ *
+ * @param buf Buffer to update.
+ * @param val 24-bit value to be pushed to the buffer.
+ */
+void net_buf_simple_push_be24(struct net_buf_simple *buf, uint32_t val);
+
+/**
+ * @brief Remove data from the beginning of the buffer.
+ *
+ * Removes data from the beginning of the buffer by modifying the data
+ * pointer and buffer length.
+ *
+ * @param buf Buffer to update.
+ * @param len Number of bytes to remove.
+ *
+ * @return New beginning of the buffer data.
+ */
+void *net_buf_simple_pull(struct net_buf_simple *buf, size_t len);
+
+/**
+ * @brief Remove data from the beginning of the buffer.
+ *
+ * Removes data from the beginning of the buffer by modifying the data
+ * pointer and buffer length.
+ *
+ * @param buf Buffer to update.
+ * @param len Number of bytes to remove.
+ *
+ * @return Pointer to the old location of the buffer data.
+ */
+void *net_buf_simple_pull_mem(struct net_buf_simple *buf, size_t len);
+
+/**
+ * @brief Remove a 8-bit value from the beginning of the buffer
+ *
+ * Same idea as with net_buf_simple_pull(), but a helper for operating
+ * on 8-bit values.
+ *
+ * @param buf A valid pointer on a buffer.
+ *
+ * @return The 8-bit removed value
+ */
+u8_t net_buf_simple_pull_u8(struct net_buf_simple *buf);
+
+/**
+ * @brief Remove and convert 16 bits from the beginning of the buffer.
+ *
+ * Same idea as with net_buf_simple_pull(), but a helper for operating
+ * on 16-bit little endian data.
+ *
+ * @param buf A valid pointer on a buffer.
+ *
+ * @return 16-bit value converted from little endian to host endian.
+ */
+u16_t net_buf_simple_pull_le16(struct net_buf_simple *buf);
+
+/**
+ * @brief Remove and convert 16 bits from the beginning of the buffer.
+ *
+ * Same idea as with net_buf_simple_pull(), but a helper for operating
+ * on 16-bit big endian data.
+ *
+ * @param buf A valid pointer on a buffer.
+ *
+ * @return 16-bit value converted from big endian to host endian.
+ */
+u16_t net_buf_simple_pull_be16(struct net_buf_simple *buf);
+
+/**
+ * @brief Remove and convert 32 bits from the beginning of the buffer.
+ *
+ * Same idea as with net_buf_simple_pull(), but a helper for operating
+ * on 32-bit little endian data.
+ *
+ * @param buf A valid pointer on a buffer.
+ *
+ * @return 32-bit value converted from little endian to host endian.
+ */
+u32_t net_buf_simple_pull_le32(struct net_buf_simple *buf);
+
+/**
+ * @brief Remove and convert 32 bits from the beginning of the buffer.
+ *
+ * Same idea as with net_buf_simple_pull(), but a helper for operating
+ * on 32-bit big endian data.
+ *
+ * @param buf A valid pointer on a buffer.
+ *
+ * @return 32-bit value converted from big endian to host endian.
+ */
+u32_t net_buf_simple_pull_be32(struct net_buf_simple *buf);
+
+/**
+ * @brief Get the tail pointer for a buffer.
+ *
+ * Get a pointer to the end of the data in a buffer.
+ *
+ * @param buf Buffer.
+ *
+ * @return Tail pointer for the buffer.
+ */
+static inline u8_t *net_buf_simple_tail(struct net_buf_simple *buf)
+{
+ return buf->data + buf->len;
+}
+
+/**
+ * @brief Check buffer headroom.
+ *
+ * Check how much free space there is in the beginning of the buffer.
+ *
+ * buf A valid pointer on a buffer
+ *
+ * @return Number of bytes available in the beginning of the buffer.
+ */
+size_t net_buf_simple_headroom(struct net_buf_simple *buf);
+
+/**
+ * @brief Check buffer tailroom.
+ *
+ * Check how much free space there is at the end of the buffer.
+ *
+ * @param buf A valid pointer on a buffer
+ *
+ * @return Number of bytes available at the end of the buffer.
+ */
+size_t net_buf_simple_tailroom(struct net_buf_simple *buf);
+
+/**
+ * @brief Parsing state of a buffer.
+ *
+ * This is used for temporarily storing the parsing state of a buffer
+ * while giving control of the parsing to a routine which we don't
+ * control.
+ */
+struct net_buf_simple_state {
+ /** Offset of the data pointer from the beginning of the storage */
+ u16_t offset;
+ /** Length of data */
+ u16_t len;
+};
+
+/**
+ * @brief Save the parsing state of a buffer.
+ *
+ * Saves the parsing state of a buffer so it can be restored later.
+ *
+ * @param buf Buffer from which the state should be saved.
+ * @param state Storage for the state.
+ */
+static inline void net_buf_simple_save(struct net_buf_simple *buf,
+ struct net_buf_simple_state *state)
+{
+ state->offset = net_buf_simple_headroom(buf);
+ state->len = buf->len;
+}
+
+/**
+ * @brief Restore the parsing state of a buffer.
+ *
+ * Restores the parsing state of a buffer from a state previously stored
+ * by net_buf_simple_save().
+ *
+ * @param buf Buffer to which the state should be restored.
+ * @param state Stored state.
+ */
+static inline void net_buf_simple_restore(struct net_buf_simple *buf,
+ struct net_buf_simple_state *state)
+{
+ buf->data = buf->__buf + state->offset;
+ buf->len = state->len;
+}
+
+/** Flag indicating that the buffer has associated fragments. Only used
+ * internally by the buffer handling code while the buffer is inside a
+ * FIFO, meaning this never needs to be explicitly set or unset by the
+ * net_buf API user. As long as the buffer is outside of a FIFO, i.e.
+ * in practice always for the user for this API, the buf->frags pointer
+ * should be used instead.
+ */
+#define NET_BUF_FRAGS BIT(0)
+/** Flag indicating that the buffer's associated data pointer, points to
+ * externally allocated memory. Therefore once ref goes down to zero, the
+ * pointed data will not need to be deallocated. This never needs to be
+ * explicitly set or unet by the net_buf API user. Such net_buf is
+ * exclusively instantiated via net_buf_alloc_with_data() function.
+ * Reference count mechanism however will behave the same way, and ref
+ * count going to 0 will free the net_buf but no the data pointer in it.
+ */
+#define NET_BUF_EXTERNAL_DATA BIT(1)
+
+/** @brief Network buffer representation.
+ *
+ * This struct is used to represent network buffers. Such buffers are
+ * normally defined through the NET_BUF_POOL_*_DEFINE() APIs and allocated
+ * using the net_buf_alloc() API.
+ */
+struct net_buf {
+ union {
+ /** Allow placing the buffer into sys_slist_t */
+ sys_snode_t node;
+
+ /** Fragments associated with this buffer. */
+ struct net_buf *frags;
+ };
+
+ /** Reference count. */
+ u8_t ref;
+
+ /** Bit-field of buffer flags. */
+ u8_t flags;
+
+ /** Where the buffer should go when freed up. */
+ u8_t pool_id;
+
+ /* Union for convenience access to the net_buf_simple members, also
+ * preserving the old API.
+ */
+ union {
+ /* The ABI of this struct must match net_buf_simple */
+ struct {
+ /** Pointer to the start of data in the buffer. */
+ u8_t *data;
+
+ /** Length of the data behind the data pointer. */
+ u16_t len;
+
+ /** Amount of data that this buffer can store. */
+ u16_t size;
+
+ /** Start of the data storage. Not to be accessed
+ * directly (the data pointer should be used
+ * instead).
+ */
+ u8_t *__buf;
+ };
+
+ struct net_buf_simple b;
+ };
+
+ /** System metadata for this buffer. */
+ u8_t user_data[CONFIG_NET_BUF_USER_DATA_SIZE] __net_buf_align;
+};
+
+#if defined(BFLB_DYNAMIC_ALLOC_MEM)
+typedef void (*destroy_cb_t)(struct net_buf *buf);
+#endif
+
+struct net_buf_data_cb {
+ u8_t *(*alloc)(struct net_buf *buf, size_t *size, s32_t timeout);
+ u8_t *(*ref)(struct net_buf *buf, u8_t *data);
+ void (*unref)(struct net_buf *buf, u8_t *data);
+};
+
+struct net_buf_data_alloc {
+ const struct net_buf_data_cb *cb;
+ void *alloc_data;
+};
+
+struct net_buf_pool {
+ /** LIFO to place the buffer into when free */
+ struct k_lifo free;
+
+/** Number of buffers in pool */
+#if defined(BFLB_DYNAMIC_ALLOC_MEM)
+ u16_t buf_count;
+#else
+ const u16_t buf_count;
+#endif
+ /** Number of uninitialized buffers */
+ u16_t uninit_count;
+
+#if defined(CONFIG_NET_BUF_POOL_USAGE)
+ /** Amount of available buffers in the pool. */
+ s16_t avail_count;
+
+ /** Total size of the pool. */
+ const u16_t pool_size;
+
+ /** Name of the pool. Used when printing pool information. */
+ const char *name;
+#endif /* CONFIG_NET_BUF_POOL_USAGE */
+#if defined(BFLB_DYNAMIC_ALLOC_MEM)
+ /** Optional destroy callback when buffer is freed. */
+ void (*destroy)(struct net_buf *buf);
+
+ /** Data allocation handlers. */
+ struct net_buf_data_alloc *alloc;
+
+ /** Start of buffer storage array */
+ struct net_buf *__bufs;
+#else
+ /** Optional destroy callback when buffer is freed. */
+ void (*const destroy)(struct net_buf *buf);
+
+ /** Data allocation handlers. */
+ const struct net_buf_data_alloc *alloc;
+
+ /** Start of buffer storage array */
+ struct net_buf *const __bufs;
+#endif
+};
+
+#if defined(CONFIG_NET_BUF_POOL_USAGE)
+#define NET_BUF_POOL_INITIALIZER(_pool, _alloc, _bufs, _count, _destroy) \
+ { \
+ .alloc = _alloc, \
+ .free = _K_LIFO_INITIALIZER(_pool.free), \
+ .__bufs = _bufs, \
+ .buf_count = _count, \
+ .uninit_count = _count, \
+ .avail_count = _count, \
+ .destroy = _destroy, \
+ .name = STRINGIFY(_pool), \
+ }
+#else
+#define NET_BUF_POOL_INITIALIZER(_pool, _alloc, _bufs, _count, _destroy) \
+ { \
+ .alloc = _alloc, \
+ .free = _K_LIFO_INITIALIZER(_pool.free), \
+ .__bufs = _bufs, \
+ .buf_count = _count, \
+ .uninit_count = _count, \
+ .destroy = _destroy, \
+ }
+#endif /* CONFIG_NET_BUF_POOL_USAGE */
+
+extern const struct net_buf_data_alloc net_buf_heap_alloc;
+
+/** @def NET_BUF_POOL_HEAP_DEFINE
+ * @brief Define a new pool for buffers using the heap for the data.
+ *
+ * Defines a net_buf_pool struct and the necessary memory storage (array of
+ * structs) for the needed amount of buffers. After this, the buffers can be
+ * accessed from the pool through net_buf_alloc. The pool is defined as a
+ * static variable, so if it needs to be exported outside the current module
+ * this needs to happen with the help of a separate pointer rather than an
+ * extern declaration.
+ *
+ * The data payload of the buffers will be allocated from the heap using
+ * k_malloc, so CONFIG_HEAP_MEM_POOL_SIZE must be set to a positive value.
+ * This kind of pool does not support blocking on the data allocation, so
+ * the timeout passed to net_buf_alloc will be always treated as K_NO_WAIT
+ * when trying to allocate the data. This means that allocation failures,
+ * i.e. NULL returns, must always be handled cleanly.
+ *
+ * If provided with a custom destroy callback, this callback is
+ * responsible for eventually calling net_buf_destroy() to complete the
+ * process of returning the buffer to the pool.
+ *
+ * @param _name Name of the pool variable.
+ * @param _count Number of buffers in the pool.
+ * @param _destroy Optional destroy callback when buffer is freed.
+ */
+#define NET_BUF_POOL_HEAP_DEFINE(_name, _count, _destroy) \
+ static struct net_buf net_buf_##_name[_count] __noinit; \
+ struct net_buf_pool _name __net_buf_align \
+ __in_section(_net_buf_pool, static, _name) = \
+ NET_BUF_POOL_INITIALIZER(_name, &net_buf_heap_alloc, \
+ net_buf_##_name, _count, _destroy)
+
+struct net_buf_pool_fixed {
+ size_t data_size;
+ u8_t *data_pool;
+};
+
+extern const struct net_buf_data_cb net_buf_fixed_cb;
+
+/** @def NET_BUF_POOL_FIXED_DEFINE
+ * @brief Define a new pool for buffers based on fixed-size data
+ *
+ * Defines a net_buf_pool struct and the necessary memory storage (array of
+ * structs) for the needed amount of buffers. After this, the buffers can be
+ * accessed from the pool through net_buf_alloc. The pool is defined as a
+ * static variable, so if it needs to be exported outside the current module
+ * this needs to happen with the help of a separate pointer rather than an
+ * extern declaration.
+ *
+ * The data payload of the buffers will be allocated from a byte array
+ * of fixed sized chunks. This kind of pool does not support blocking on
+ * the data allocation, so the timeout passed to net_buf_alloc will be
+ * always treated as K_NO_WAIT when trying to allocate the data. This means
+ * that allocation failures, i.e. NULL returns, must always be handled
+ * cleanly.
+ *
+ * If provided with a custom destroy callback, this callback is
+ * responsible for eventually calling net_buf_destroy() to complete the
+ * process of returning the buffer to the pool.
+ *
+ * @param _name Name of the pool variable.
+ * @param _count Number of buffers in the pool.
+ * @param _data_size Maximum data payload per buffer.
+ * @param _destroy Optional destroy callback when buffer is freed.
+ */
+#if !defined(BFLB_DYNAMIC_ALLOC_MEM)
+#define NET_BUF_POOL_FIXED_DEFINE(_name, _count, _data_size, _destroy) \
+ static struct net_buf net_buf_##_name[_count]; \
+ static u8_t net_buf_data_##_name[_count][_data_size]; \
+ static const struct net_buf_pool_fixed net_buf_fixed_##_name = { \
+ .data_size = _data_size, \
+ .data_pool = (u8_t *)net_buf_data_##_name, \
+ }; \
+ static const struct net_buf_data_alloc net_buf_fixed_alloc_##_name = { \
+ .cb = &net_buf_fixed_cb, \
+ .alloc_data = (void *)&net_buf_fixed_##_name, \
+ }; \
+ struct net_buf_pool _name __net_buf_align \
+ __in_section(_net_buf_pool, static, _name) = \
+ NET_BUF_POOL_INITIALIZER(_name, &net_buf_fixed_alloc_##_name, \
+ net_buf_##_name, _count, _destroy)
+#endif
+
+#if (!BFLB_BLE)
+extern const struct net_buf_data_cb net_buf_var_cb;
+
+/** @def NET_BUF_POOL_VAR_DEFINE
+ * @brief Define a new pool for buffers with variable size payloads
+ *
+ * Defines a net_buf_pool struct and the necessary memory storage (array of
+ * structs) for the needed amount of buffers. After this, the buffers can be
+ * accessed from the pool through net_buf_alloc. The pool is defined as a
+ * static variable, so if it needs to be exported outside the current module
+ * this needs to happen with the help of a separate pointer rather than an
+ * extern declaration.
+ *
+ * The data payload of the buffers will be based on a memory pool from which
+ * variable size payloads may be allocated.
+ *
+ * If provided with a custom destroy callback, this callback is
+ * responsible for eventually calling net_buf_destroy() to complete the
+ * process of returning the buffer to the pool.
+ *
+ * @param _name Name of the pool variable.
+ * @param _count Number of buffers in the pool.
+ * @param _data_size Total amount of memory available for data payloads.
+ * @param _destroy Optional destroy callback when buffer is freed.
+ */
+#define NET_BUF_POOL_VAR_DEFINE(_name, _count, _data_size, _destroy) \
+ static struct net_buf _net_buf_##_name[_count] __noinit; \
+ K_MEM_POOL_DEFINE(net_buf_mem_pool_##_name, 16, _data_size, 1, 4); \
+ static const struct net_buf_data_alloc net_buf_data_alloc_##_name = { \
+ .cb = &net_buf_var_cb, \
+ .alloc_data = &net_buf_mem_pool_##_name, \
+ }; \
+ struct net_buf_pool _name __net_buf_align \
+ __in_section(_net_buf_pool, static, _name) = \
+ NET_BUF_POOL_INITIALIZER(_name, &net_buf_data_alloc_##_name, \
+ _net_buf_##_name, _count, _destroy)
+#endif
+
+#if !defined(BFLB_DYNAMIC_ALLOC_MEM)
+/** @def NET_BUF_POOL_DEFINE
+ * @brief Define a new pool for buffers
+ *
+ * Defines a net_buf_pool struct and the necessary memory storage (array of
+ * structs) for the needed amount of buffers. After this,the buffers can be
+ * accessed from the pool through net_buf_alloc. The pool is defined as a
+ * static variable, so if it needs to be exported outside the current module
+ * this needs to happen with the help of a separate pointer rather than an
+ * extern declaration.
+ *
+ * If provided with a custom destroy callback this callback is
+ * responsible for eventually calling net_buf_destroy() to complete the
+ * process of returning the buffer to the pool.
+ *
+ * @param _name Name of the pool variable.
+ * @param _count Number of buffers in the pool.
+ * @param _size Maximum data size for each buffer.
+ * @param _ud_size Amount of user data space to reserve.
+ * @param _destroy Optional destroy callback when buffer is freed.
+ */
+#define NET_BUF_POOL_DEFINE(_name, _count, _size, _ud_size, _destroy) \
+ BUILD_ASSERT(_ud_size <= CONFIG_NET_BUF_USER_DATA_SIZE); \
+ NET_BUF_POOL_FIXED_DEFINE(_name, _count, _size, _destroy)
+#endif
+
+#if defined(BFLB_DYNAMIC_ALLOC_MEM)
+void net_buf_init(struct net_buf_pool *buf_pool, u16_t buf_count, size_t data_size, destroy_cb_t destroy);
+void net_buf_deinit(struct net_buf_pool *buf_pool);
+#endif
+/**
+ * @brief Looks up a pool based on its ID.
+ *
+ * @param id Pool ID (e.g. from buf->pool_id).
+ *
+ * @return Pointer to pool.
+ */
+struct net_buf_pool *net_buf_pool_get(int id);
+
+/**
+ * @brief Get a zero-based index for a buffer.
+ *
+ * This function will translate a buffer into a zero-based index,
+ * based on its placement in its buffer pool. This can be useful if you
+ * want to associate an external array of meta-data contexts with the
+ * buffers of a pool.
+ *
+ * @param buf Network buffer.
+ *
+ * @return Zero-based index for the buffer.
+ */
+int net_buf_id(struct net_buf *buf);
+
+/**
+ * @brief Allocate a new buffer from a pool.
+ *
+ * Allocate a new buffer from a pool.
+ *
+ * @param pool Which pool to allocate the buffer from.
+ * @param timeout Affects the action taken should the pool be empty.
+ * If K_NO_WAIT, then return immediately. If K_FOREVER, then
+ * wait as long as necessary. Otherwise, wait up to the specified
+ * number of milliseconds before timing out. Note that some types
+ * of data allocators do not support blocking (such as the HEAP
+ * type). In this case it's still possible for net_buf_alloc() to
+ * fail (return NULL) even if it was given K_FOREVER.
+ *
+ * @return New buffer or NULL if out of buffers.
+ */
+#if defined(CONFIG_NET_BUF_LOG)
+struct net_buf *net_buf_alloc_fixed_debug(struct net_buf_pool *pool,
+ s32_t timeout, const char *func,
+ int line);
+#define net_buf_alloc_fixed(_pool, _timeout) \
+ net_buf_alloc_fixed_debug(_pool, _timeout, __func__, __LINE__)
+#else
+struct net_buf *net_buf_alloc_fixed(struct net_buf_pool *pool, s32_t timeout);
+#endif
+
+#define net_buf_alloc(_pool, _timeout) net_buf_alloc_fixed(_pool, _timeout)
+
+/**
+ * @brief Allocate a new buffer from a pool.
+ *
+ * Allocate a new buffer from a pool.
+ *
+ * @param pool Which pool to allocate the buffer from.
+ * @param size Amount of data the buffer must be able to fit.
+ * @param timeout Affects the action taken should the pool be empty.
+ * If K_NO_WAIT, then return immediately. If K_FOREVER, then
+ * wait as long as necessary. Otherwise, wait up to the specified
+ * number of milliseconds before timing out. Note that some types
+ * of data allocators do not support blocking (such as the HEAP
+ * type). In this case it's still possible for net_buf_alloc() to
+ * fail (return NULL) even if it was given K_FOREVER.
+ *
+ * @return New buffer or NULL if out of buffers.
+ */
+#if defined(CONFIG_NET_BUF_LOG)
+struct net_buf *net_buf_alloc_len_debug(struct net_buf_pool *pool, size_t size,
+ s32_t timeout, const char *func,
+ int line);
+#define net_buf_alloc_len(_pool, _size, _timeout) \
+ net_buf_alloc_len_debug(_pool, _size, _timeout, __func__, __LINE__)
+#else
+struct net_buf *net_buf_alloc_len(struct net_buf_pool *pool, size_t size,
+ s32_t timeout);
+#endif
+
+/**
+ * @brief Allocate a new buffer from a pool but with external data pointer.
+ *
+ * Allocate a new buffer from a pool, where the data pointer comes from the
+ * user and not from the pool.
+ *
+ * @param pool Which pool to allocate the buffer from.
+ * @param data External data pointer
+ * @param size Amount of data the pointed data buffer if able to fit.
+ * @param timeout Affects the action taken should the pool be empty.
+ * If K_NO_WAIT, then return immediately. If K_FOREVER, then
+ * wait as long as necessary. Otherwise, wait up to the specified
+ * number of milliseconds before timing out. Note that some types
+ * of data allocators do not support blocking (such as the HEAP
+ * type). In this case it's still possible for net_buf_alloc() to
+ * fail (return NULL) even if it was given K_FOREVER.
+ *
+ * @return New buffer or NULL if out of buffers.
+ */
+#if defined(CONFIG_NET_BUF_LOG)
+struct net_buf *net_buf_alloc_with_data_debug(struct net_buf_pool *pool,
+ void *data, size_t size,
+ s32_t timeout, const char *func,
+ int line);
+#define net_buf_alloc_with_data(_pool, _data_, _size, _timeout) \
+ net_buf_alloc_with_data_debug(_pool, _data_, _size, _timeout, \
+ __func__, __LINE__)
+#else
+struct net_buf *net_buf_alloc_with_data(struct net_buf_pool *pool,
+ void *data, size_t size,
+ s32_t timeout);
+#endif
+
+/**
+ * @brief Get a buffer from a FIFO.
+ *
+ * Get buffer from a FIFO.
+ *
+ * @param fifo Which FIFO to take the buffer from.
+ * @param timeout Affects the action taken should the FIFO be empty.
+ * If K_NO_WAIT, then return immediately. If K_FOREVER, then wait as
+ * long as necessary. Otherwise, wait up to the specified number of
+ * milliseconds before timing out.
+ *
+ * @return New buffer or NULL if the FIFO is empty.
+ */
+#if defined(CONFIG_NET_BUF_LOG)
+struct net_buf *net_buf_get_debug(struct k_fifo *fifo, s32_t timeout,
+ const char *func, int line);
+#define net_buf_get(_fifo, _timeout) \
+ net_buf_get_debug(_fifo, _timeout, __func__, __LINE__)
+#else
+struct net_buf *net_buf_get(struct k_fifo *fifo, s32_t timeout);
+#endif
+
+/**
+ * @brief Destroy buffer from custom destroy callback
+ *
+ * This helper is only intended to be used from custom destroy callbacks.
+ * If no custom destroy callback is given to NET_BUF_POOL_*_DEFINE() then
+ * there is no need to use this API.
+ *
+ * @param buf Buffer to destroy.
+ */
+static inline void net_buf_destroy(struct net_buf *buf)
+{
+ struct net_buf_pool *pool = net_buf_pool_get(buf->pool_id);
+
+ k_lifo_put(&pool->free, buf);
+}
+
+/**
+ * @brief Reset buffer
+ *
+ * Reset buffer data and flags so it can be reused for other purposes.
+ *
+ * @param buf Buffer to reset.
+ */
+void net_buf_reset(struct net_buf *buf);
+
+/**
+ * @brief Initialize buffer with the given headroom.
+ *
+ * Initializes a buffer with a given headroom. The buffer is not expected to
+ * contain any data when this API is called.
+ *
+ * @param buf Buffer to initialize.
+ * @param reserve How much headroom to reserve.
+ */
+void net_buf_simple_reserve(struct net_buf_simple *buf, size_t reserve);
+
+/**
+ * @brief Put a buffer into a list
+ *
+ * Put a buffer to the end of a list. If the buffer contains follow-up
+ * fragments this function will take care of inserting them as well
+ * into the list.
+ *
+ * @param list Which list to append the buffer to.
+ * @param buf Buffer.
+ */
+void net_buf_slist_put(sys_slist_t *list, struct net_buf *buf);
+
+/**
+ * @brief Get a buffer from a list.
+ *
+ * Get buffer from a list. If the buffer had any fragments, these will
+ * automatically be recovered from the list as well and be placed to
+ * the buffer's fragment list.
+ *
+ * @param list Which list to take the buffer from.
+ *
+ * @return New buffer or NULL if the FIFO is empty.
+ */
+struct net_buf *net_buf_slist_get(sys_slist_t *list);
+
+/**
+ * @brief Put a buffer into a FIFO
+ *
+ * Put a buffer to the end of a FIFO. If the buffer contains follow-up
+ * fragments this function will take care of inserting them as well
+ * into the FIFO.
+ *
+ * @param fifo Which FIFO to put the buffer to.
+ * @param buf Buffer.
+ */
+void net_buf_put(struct k_fifo *fifo, struct net_buf *buf);
+
+/**
+ * @brief Decrements the reference count of a buffer.
+ *
+ * Decrements the reference count of a buffer and puts it back into the
+ * pool if the count reaches zero.
+ *
+ * @param buf A valid pointer on a buffer
+ */
+#if defined(CONFIG_NET_BUF_LOG)
+void net_buf_unref_debug(struct net_buf *buf, const char *func, int line);
+#define net_buf_unref(_buf) \
+ net_buf_unref_debug(_buf, __func__, __LINE__)
+#else
+void net_buf_unref(struct net_buf *buf);
+#endif
+
+/**
+ * @brief Increment the reference count of a buffer.
+ *
+ * @param buf A valid pointer on a buffer
+ *
+ * @return the buffer newly referenced
+ */
+struct net_buf *net_buf_ref(struct net_buf *buf);
+
+/**
+ * @brief Duplicate buffer
+ *
+ * Duplicate given buffer including any data and headers currently stored.
+ *
+ * @param buf A valid pointer on a buffer
+ * @param timeout Affects the action taken should the pool be empty.
+ * If K_NO_WAIT, then return immediately. If K_FOREVER, then
+ * wait as long as necessary. Otherwise, wait up to the specified
+ * number of milliseconds before timing out.
+ *
+ * @return Duplicated buffer or NULL if out of buffers.
+ */
+struct net_buf *net_buf_clone(struct net_buf *buf, s32_t timeout);
+
+/**
+ * @brief Get a pointer to the user data of a buffer.
+ *
+ * @param buf A valid pointer on a buffer
+ *
+ * @return Pointer to the user data of the buffer.
+ */
+static inline void *net_buf_user_data(const struct net_buf *buf)
+{
+ return (void *)buf->user_data;
+}
+
+/** @def net_buf_reserve
+ * @brief Initialize buffer with the given headroom.
+ *
+ * Initializes a buffer with a given headroom. The buffer is not expected to
+ * contain any data when this API is called.
+ *
+ * @param buf Buffer to initialize.
+ * @param reserve How much headroom to reserve.
+ */
+#define net_buf_reserve(buf, reserve) net_buf_simple_reserve(&(buf)->b, \
+ reserve)
+
+/**
+ * @def net_buf_add
+ * @brief Prepare data to be added at the end of the buffer
+ *
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param len Number of bytes to increment the length with.
+ *
+ * @return The original tail of the buffer.
+ */
+#define net_buf_add(buf, len) net_buf_simple_add(&(buf)->b, len)
+
+/**
+ * @def net_buf_add_mem
+ * @brief Copy bytes from memory to the end of the buffer
+ *
+ * Copies the given number of bytes to the end of the buffer. Increments the
+ * data length of the buffer to account for more data at the end.
+ *
+ * @param buf Buffer to update.
+ * @param mem Location of data to be added.
+ * @param len Length of data to be added
+ *
+ * @return The original tail of the buffer.
+ */
+#define net_buf_add_mem(buf, mem, len) net_buf_simple_add_mem(&(buf)->b, \
+ mem, len)
+
+/**
+ * @def net_buf_add_u8
+ * @brief Add (8-bit) byte at the end of the buffer
+ *
+ * Adds a byte at the end of the buffer. Increments the data length of
+ * the buffer to account for more data at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val byte value to be added.
+ *
+ * @return Pointer to the value added
+ */
+#define net_buf_add_u8(buf, val) net_buf_simple_add_u8(&(buf)->b, val)
+
+/**
+ * @def net_buf_add_le16
+ * @brief Add 16-bit value at the end of the buffer
+ *
+ * Adds 16-bit value in little endian format at the end of buffer.
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val 16-bit value to be added.
+ */
+#define net_buf_add_le16(buf, val) net_buf_simple_add_le16(&(buf)->b, val)
+
+/**
+ * @def net_buf_add_be16
+ * @brief Add 16-bit value at the end of the buffer
+ *
+ * Adds 16-bit value in big endian format at the end of buffer.
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val 16-bit value to be added.
+ */
+#define net_buf_add_be16(buf, val) net_buf_simple_add_be16(&(buf)->b, val)
+
+/**
+ * @def net_buf_add_le32
+ * @brief Add 32-bit value at the end of the buffer
+ *
+ * Adds 32-bit value in little endian format at the end of buffer.
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val 32-bit value to be added.
+ */
+#define net_buf_add_le32(buf, val) net_buf_simple_add_le32(&(buf)->b, val)
+
+/**
+ * @def net_buf_add_be32
+ * @brief Add 32-bit value at the end of the buffer
+ *
+ * Adds 32-bit value in big endian format at the end of buffer.
+ * Increments the data length of a buffer to account for more data
+ * at the end.
+ *
+ * @param buf Buffer to update.
+ * @param val 32-bit value to be added.
+ */
+#define net_buf_add_be32(buf, val) net_buf_simple_add_be32(&(buf)->b, val)
+
+/**
+ * @def net_buf_push
+ * @brief Push data to the beginning of the buffer.
+ *
+ * Modifies the data pointer and buffer length to account for more data
+ * in the beginning of the buffer.
+ *
+ * @param buf Buffer to update.
+ * @param len Number of bytes to add to the beginning.
+ *
+ * @return The new beginning of the buffer data.
+ */
+#define net_buf_push(buf, len) net_buf_simple_push(&(buf)->b, len)
+
+/**
+ * @def net_buf_push_le16
+ * @brief Push 16-bit value to the beginning of the buffer
+ *
+ * Adds 16-bit value in little endian format to the beginning of the
+ * buffer.
+ *
+ * @param buf Buffer to update.
+ * @param val 16-bit value to be pushed to the buffer.
+ */
+#define net_buf_push_le16(buf, val) net_buf_simple_push_le16(&(buf)->b, val)
+
+/**
+ * @def net_buf_push_be16
+ * @brief Push 16-bit value to the beginning of the buffer
+ *
+ * Adds 16-bit value in little endian format to the beginning of the
+ * buffer.
+ *
+ * @param buf Buffer to update.
+ * @param val 16-bit value to be pushed to the buffer.
+ */
+#define net_buf_push_be16(buf, val) net_buf_simple_push_be16(&(buf)->b, val)
+
+/**
+ * @def net_buf_push_u8
+ * @brief Push 8-bit value to the beginning of the buffer
+ *
+ * Adds 8-bit value the beginning of the buffer.
+ *
+ * @param buf Buffer to update.
+ * @param val 8-bit value to be pushed to the buffer.
+ */
+#define net_buf_push_u8(buf, val) net_buf_simple_push_u8(&(buf)->b, val)
+
+/**
+ * @def net_buf_pull
+ * @brief Remove data from the beginning of the buffer.
+ *
+ * Removes data from the beginning of the buffer by modifying the data
+ * pointer and buffer length.
+ *
+ * @param buf Buffer to update.
+ * @param len Number of bytes to remove.
+ *
+ * @return New beginning of the buffer data.
+ */
+#define net_buf_pull(buf, len) net_buf_simple_pull(&(buf)->b, len)
+
+/**
+ * @def net_buf_pull_mem
+ * @brief Remove data from the beginning of the buffer.
+ *
+ * Removes data from the beginning of the buffer by modifying the data
+ * pointer and buffer length.
+ *
+ * @param buf Buffer to update.
+ * @param len Number of bytes to remove.
+ *
+ * @return Pointer to the old beginning of the buffer data.
+ */
+#define net_buf_pull_mem(buf, len) net_buf_simple_pull_mem(&(buf)->b, len)
+
+/**
+ * @def net_buf_pull_u8
+ * @brief Remove a 8-bit value from the beginning of the buffer
+ *
+ * Same idea as with net_buf_pull(), but a helper for operating on
+ * 8-bit values.
+ *
+ * @param buf A valid pointer on a buffer.
+ *
+ * @return The 8-bit removed value
+ */
+#define net_buf_pull_u8(buf) net_buf_simple_pull_u8(&(buf)->b)
+
+/**
+ * @def net_buf_pull_le16
+ * @brief Remove and convert 16 bits from the beginning of the buffer.
+ *
+ * Same idea as with net_buf_pull(), but a helper for operating on
+ * 16-bit little endian data.
+ *
+ * @param buf A valid pointer on a buffer.
+ *
+ * @return 16-bit value converted from little endian to host endian.
+ */
+#define net_buf_pull_le16(buf) net_buf_simple_pull_le16(&(buf)->b)
+
+/**
+ * @def net_buf_pull_be16
+ * @brief Remove and convert 16 bits from the beginning of the buffer.
+ *
+ * Same idea as with net_buf_pull(), but a helper for operating on
+ * 16-bit big endian data.
+ *
+ * @param buf A valid pointer on a buffer.
+ *
+ * @return 16-bit value converted from big endian to host endian.
+ */
+#define net_buf_pull_be16(buf) net_buf_simple_pull_be16(&(buf)->b)
+
+/**
+ * @def net_buf_pull_le32
+ * @brief Remove and convert 32 bits from the beginning of the buffer.
+ *
+ * Same idea as with net_buf_pull(), but a helper for operating on
+ * 32-bit little endian data.
+ *
+ * @param buf A valid pointer on a buffer.
+ *
+ * @return 32-bit value converted from little endian to host endian.
+ */
+#define net_buf_pull_le32(buf) net_buf_simple_pull_le32(&(buf)->b)
+
+/**
+ * @def net_buf_pull_be32
+ * @brief Remove and convert 32 bits from the beginning of the buffer.
+ *
+ * Same idea as with net_buf_pull(), but a helper for operating on
+ * 32-bit big endian data.
+ *
+ * @param buf A valid pointer on a buffer
+ *
+ * @return 32-bit value converted from big endian to host endian.
+ */
+#define net_buf_pull_be32(buf) net_buf_simple_pull_be32(&(buf)->b)
+
+/**
+ * @def net_buf_tailroom
+ * @brief Check buffer tailroom.
+ *
+ * Check how much free space there is at the end of the buffer.
+ *
+ * @param buf A valid pointer on a buffer
+ *
+ * @return Number of bytes available at the end of the buffer.
+ */
+#define net_buf_tailroom(buf) net_buf_simple_tailroom(&(buf)->b)
+
+/**
+ * @def net_buf_headroom
+ * @brief Check buffer headroom.
+ *
+ * Check how much free space there is in the beginning of the buffer.
+ *
+ * buf A valid pointer on a buffer
+ *
+ * @return Number of bytes available in the beginning of the buffer.
+ */
+#define net_buf_headroom(buf) net_buf_simple_headroom(&(buf)->b)
+
+/**
+ * @def net_buf_tail
+ * @brief Get the tail pointer for a buffer.
+ *
+ * Get a pointer to the end of the data in a buffer.
+ *
+ * @param buf Buffer.
+ *
+ * @return Tail pointer for the buffer.
+ */
+#define net_buf_tail(buf) net_buf_simple_tail(&(buf)->b)
+
+/** @brief Find the last fragment in the fragment list.
+ *
+ * @return Pointer to last fragment in the list.
+ */
+struct net_buf *net_buf_frag_last(struct net_buf *frags);
+
+/** @brief Insert a new fragment to a chain of bufs.
+ *
+ * Insert a new fragment into the buffer fragments list after the parent.
+ *
+ * Note: This function takes ownership of the fragment reference so the
+ * caller is not required to unref.
+ *
+ * @param parent Parent buffer/fragment.
+ * @param frag Fragment to insert.
+ */
+void net_buf_frag_insert(struct net_buf *parent, struct net_buf *frag);
+
+/** @brief Add a new fragment to the end of a chain of bufs.
+ *
+ * Append a new fragment into the buffer fragments list.
+ *
+ * Note: This function takes ownership of the fragment reference so the
+ * caller is not required to unref.
+ *
+ * @param head Head of the fragment chain.
+ * @param frag Fragment to add.
+ *
+ * @return New head of the fragment chain. Either head (if head
+ * was non-NULL) or frag (if head was NULL).
+ */
+struct net_buf *net_buf_frag_add(struct net_buf *head, struct net_buf *frag);
+
+/** @brief Delete existing fragment from a chain of bufs.
+ *
+ * @param parent Parent buffer/fragment, or NULL if there is no parent.
+ * @param frag Fragment to delete.
+ *
+ * @return Pointer to the buffer following the fragment, or NULL if it
+ * had no further fragments.
+ */
+#if defined(CONFIG_NET_BUF_LOG)
+struct net_buf *net_buf_frag_del_debug(struct net_buf *parent,
+ struct net_buf *frag,
+ const char *func, int line);
+#define net_buf_frag_del(_parent, _frag) \
+ net_buf_frag_del_debug(_parent, _frag, __func__, __LINE__)
+#else
+struct net_buf *net_buf_frag_del(struct net_buf *parent, struct net_buf *frag);
+#endif
+
+/**
+ * @brief Copy len bytes from src starting from offset to dst buffer
+ *
+ * This routine assumes that dst is large enough to store @a len bytes
+ * starting from offset at src.
+ *
+ * @param dst Destination buffer
+ * @param dst_len Destination buffer max length
+ * @param src Source buffer that may be fragmented
+ * @param offset Starting point to copy from
+ * @param len Number of bytes to copy
+ * @return number of bytes copied if everything is ok
+ * @return -ENOMEM on error
+ */
+size_t net_buf_linearize(void *dst, size_t dst_len, struct net_buf *src,
+ size_t offset, size_t len);
+
+/**
+ * @typedef net_buf_allocator_cb
+ * @brief Network buffer allocator callback.
+ *
+ * @details The allocator callback is called when net_buf_append_bytes
+ * needs to allocate a new net_buf.
+ *
+ * @param timeout Affects the action taken should the net buf pool be empty.
+ * If K_NO_WAIT, then return immediately. If K_FOREVER, then
+ * wait as long as necessary. Otherwise, wait up to the specified
+ * number of milliseconds before timing out.
+ * @param user_data The user data given in net_buf_append_bytes call.
+ * @return pointer to allocated net_buf or NULL on error.
+ */
+typedef struct net_buf *(*net_buf_allocator_cb)(s32_t timeout, void *user_data);
+
+/**
+ * @brief Append data to a list of net_buf
+ *
+ * @details Append data to a net_buf. If there is not enough space in the
+ * net_buf then more net_buf will be added, unless there are no free net_buf
+ * and timeout occurs.
+ *
+ * @param buf Network buffer.
+ * @param len Total length of input data
+ * @param value Data to be added
+ * @param timeout Timeout is passed to the net_buf allocator callback.
+ * @param allocate_cb When a new net_buf is required, use this callback.
+ * @param user_data A user data pointer to be supplied to the allocate_cb.
+ * This pointer is can be anything from a mem_pool or a net_pkt, the
+ * logic is left up to the allocate_cb function.
+ *
+ * @return Length of data actually added. This may be less than input
+ * length if other timeout than K_FOREVER was used, and there
+ * were no free fragments in a pool to accommodate all data.
+ */
+size_t net_buf_append_bytes(struct net_buf *buf, size_t len,
+ const void *value, s32_t timeout,
+ net_buf_allocator_cb allocate_cb, void *user_data);
+
+/**
+ * @brief Skip N number of bytes in a net_buf
+ *
+ * @details Skip N number of bytes starting from fragment's offset. If the total
+ * length of data is placed in multiple fragments, this function will skip from
+ * all fragments until it reaches N number of bytes. Any fully skipped buffers
+ * are removed from the net_buf list.
+ *
+ * @param buf Network buffer.
+ * @param len Total length of data to be skipped.
+ *
+ * @return Pointer to the fragment or
+ * NULL and pos is 0 after successful skip,
+ * NULL and pos is 0xffff otherwise.
+ */
+static inline struct net_buf *net_buf_skip(struct net_buf *buf, u16_t len)
+{
+ while (buf && len--) {
+ net_buf_pull_u8(buf);
+ if (!buf->len) {
+ buf = net_buf_frag_del(NULL, buf);
+ }
+ }
+
+ return buf;
+}
+
+/** @brief Calculate amount of bytes stored in fragments.
+ *
+ * Calculates the total amount of data stored in the given buffer and the
+ * fragments linked to it.
+ *
+ * @param buf Buffer to start off with.
+ *
+ * @return Number of bytes in the buffer and its fragments.
+ */
+static inline size_t net_buf_frags_len(struct net_buf *buf)
+{
+ size_t bytes = 0;
+
+ while (buf) {
+ bytes += buf->len;
+ buf = buf->frags;
+ }
+
+ return bytes;
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __NET_BUF_H */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain.h
new file mode 100644
index 00000000..3bea0dbc
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2010-2014, Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief Macros to abstract toolchain specific capabilities
+ *
+ * This file contains various macros to abstract compiler capabilities that
+ * utilize toolchain specific attributes and/or pragmas.
+ */
+
+#ifndef _TOOLCHAIN_H
+#define _TOOLCHAIN_H
+
+#if defined(__XCC__)
+#include
+#elif defined(__GNUC__) || (defined(_LINKER) && defined(__GCC_LINKER_CMD__))
+#include
+#else
+#include
+#endif
+
+#endif /* _TOOLCHAIN_H */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain/common.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain/common.h
new file mode 100644
index 00000000..2b649dcb
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain/common.h
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2010-2014 Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef ZEPHYR_INCLUDE_TOOLCHAIN_COMMON_H_
+#define ZEPHYR_INCLUDE_TOOLCHAIN_COMMON_H_
+/**
+ * @file
+ * @brief Common toolchain abstraction
+ *
+ * Macros to abstract compiler capabilities (common to all toolchains).
+ */
+
+/* Abstract use of extern keyword for compatibility between C and C++ */
+#ifdef __cplusplus
+#define EXTERN_C extern "C"
+#else
+#define EXTERN_C extern
+#endif
+
+/* Use TASK_ENTRY_CPP to tag task entry points defined in C++ files. */
+
+#ifdef __cplusplus
+#define TASK_ENTRY_CPP extern "C"
+#endif
+
+/*
+ * Generate a reference to an external symbol.
+ * The reference indicates to the linker that the symbol is required
+ * by the module containing the reference and should be included
+ * in the image if the module is in the image.
+ *
+ * The assembler directive ".set" is used to define a local symbol.
+ * No memory is allocated, and the local symbol does not appear in
+ * the symbol table.
+ */
+
+#ifdef _ASMLANGUAGE
+#define REQUIRES(sym) .set sym##_Requires, sym
+#else
+#define REQUIRES(sym) __asm__(".set " #sym "_Requires, " #sym "\n\t");
+#endif
+
+#ifdef _ASMLANGUAGE
+#define SECTION .section
+#endif
+
+#define CONFIG_RISCV 1
+/*
+ * If the project is being built for speed (i.e. not for minimum size) then
+ * align functions and branches in executable sections to improve performance.
+ */
+
+#ifdef _ASMLANGUAGE
+
+#if defined(CONFIG_X86)
+
+#ifdef PERF_OPT
+#define PERFOPT_ALIGN .balign 16
+#else
+#define PERFOPT_ALIGN .balign 1
+#endif
+
+#elif defined(CONFIG_ARM)
+
+#define PERFOPT_ALIGN .balign 4
+
+#elif defined(CONFIG_ARC)
+
+#define PERFOPT_ALIGN .balign 4
+
+#elif defined(CONFIG_NIOS2) || defined(CONFIG_RISCV) || \
+ defined(CONFIG_XTENSA)
+#define PERFOPT_ALIGN .balign 4
+
+#elif defined(CONFIG_ARCH_POSIX)
+
+#else
+
+#error Architecture unsupported
+
+#endif
+
+#define GC_SECTION(sym) SECTION.text.##sym, "ax"
+
+#endif /* _ASMLANGUAGE */
+
+/* force inlining a function */
+
+#if !defined(_ASMLANGUAGE)
+#ifdef CONFIG_COVERAGE
+/*
+ * The always_inline attribute forces a function to be inlined,
+ * even ignoring -fno-inline. So for code coverage, do not
+ * force inlining of these functions to keep their bodies around
+ * so their number of executions can be counted.
+ *
+ * Note that "inline" is kept here for kobject_hash.c and
+ * priv_stacks_hash.c. These are built without compiler flags
+ * used for coverage. ALWAYS_INLINE cannot be empty as compiler
+ * would complain about unused functions. Attaching unused
+ * attribute would result in their text sections ballon more than
+ * 10 times in size, as those functions are kept in text section.
+ * So just keep "inline" here.
+ */
+#define ALWAYS_INLINE inline
+#else
+#define ALWAYS_INLINE inline __attribute__((always_inline))
+#endif
+#endif
+
+#define Z_STRINGIFY(x) #x
+#define STRINGIFY(s) Z_STRINGIFY(s)
+
+/* concatenate the values of the arguments into one */
+#define _DO_CONCAT(x, y) x##y
+#define _CONCAT(x, y) _DO_CONCAT(x, y)
+
+/* Additionally used as a sentinel by gen_syscalls.py to identify what
+ * functions are system calls
+ *
+ * Note POSIX unit tests don't still generate the system call stubs, so
+ * until https://github.com/zephyrproject-rtos/zephyr/issues/5006 is
+ * fixed via possibly #4174, we introduce this hack -- which will
+ * disallow us to test system calls in POSIX unit testing (currently
+ * not used).
+ */
+#ifndef ZTEST_UNITTEST
+#define __syscall static inline
+#else
+#define __syscall
+#endif /* #ifndef ZTEST_UNITTEST */
+
+#ifndef BUILD_ASSERT
+/* compile-time assertion that makes the build fail */
+#define BUILD_ASSERT(EXPR) \
+ enum _CONCAT(__build_assert_enum, __COUNTER__) { \
+ _CONCAT(__build_assert, __COUNTER__) = 1 / !!(EXPR) \
+ }
+#endif
+#ifndef BUILD_ASSERT_MSG
+/* build assertion with message -- common implementation swallows message. */
+#define BUILD_ASSERT_MSG(EXPR, MSG) BUILD_ASSERT(EXPR)
+#endif
+
+/*
+ * This is meant to be used in conjunction with __in_section() and similar
+ * where scattered structure instances are concatened together by the linker
+ * and walked by the code at run time just like a contiguous array of such
+ * structures.
+ *
+ * Assemblers and linkers may insert alignment padding by default whose
+ * size is larger than the natural alignment for those structures when
+ * gathering various section segments together, messing up the array walk.
+ * To prevent this, we need to provide an explicit alignment not to rely
+ * on the default that might just work by luck.
+ *
+ * Alignment statements in linker scripts are not sufficient as
+ * the assembler may add padding by itself to each segment when switching
+ * between sections within the same file even if it merges many such segments
+ * into a single section in the end.
+ */
+#define Z_DECL_ALIGN(type) __aligned(__alignof(type)) type
+
+/*
+ * Convenience helper combining __in_section() and Z_DECL_ALIGN().
+ * The section name is the struct type prepended with an underscore.
+ * The subsection is "static" and the subsubsection is the variable name.
+ */
+#define Z_STRUCT_SECTION_ITERABLE(struct_type, name) \
+ Z_DECL_ALIGN(struct struct_type) \
+ name \
+ __in_section(_##struct_type, static, name) __used
+
+/*
+ * Itterator for structure instances gathered by Z_STRUCT_SECTION_ITERABLE().
+ * The linker must provide a __list_start symbol and a
+ * __list_end symbol to mark the start and the end of the
+ * list of struct objects to iterate over.
+ */
+#define Z_STRUCT_SECTION_FOREACH(struct_type, iterator) \
+ extern struct struct_type _CONCAT(_##struct_type, _list_start)[]; \
+ extern struct struct_type _CONCAT(_##struct_type, _list_end)[]; \
+ for (struct struct_type *iterator = \
+ _CONCAT(_##struct_type, _list_start); \
+ ({ __ASSERT(iterator <= _CONCAT(_##struct_type, _list_end), \
+ "unexpected list end location"); \
+ iterator < _CONCAT(_##struct_type, _list_end); }); \
+ iterator++)
+
+#endif /* ZEPHYR_INCLUDE_TOOLCHAIN_COMMON_H_ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain/gcc.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain/gcc.h
new file mode 100644
index 00000000..7fd945fb
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain/gcc.h
@@ -0,0 +1,473 @@
+/*
+ * Copyright (c) 2010-2014,2017 Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef ZEPHYR_INCLUDE_TOOLCHAIN_GCC_H_
+#define ZEPHYR_INCLUDE_TOOLCHAIN_GCC_H_
+
+/**
+ * @file
+ * @brief GCC toolchain abstraction
+ *
+ * Macros to abstract compiler capabilities for GCC toolchain.
+ */
+
+/*
+ * Older versions of GCC do not define __BYTE_ORDER__, so it must be manually
+ * detected and defined using arch-specific definitions.
+ */
+
+#ifndef _LINKER
+
+#ifndef __ORDER_BIG_ENDIAN__
+#define __ORDER_BIG_ENDIAN__ (1)
+#endif
+
+#ifndef __ORDER_LITTLE_ENDIAN__
+#define __ORDER_LITTLE_ENDIAN__ (2)
+#endif
+
+#ifndef __BYTE_ORDER__
+#if defined(__BIG_ENDIAN__) || defined(__ARMEB__) || \
+ defined(__THUMBEB__) || defined(__AARCH64EB__) || \
+ defined(__MIPSEB__) || defined(__TC32EB__)
+
+#define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__
+
+#elif defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || \
+ defined(__THUMBEL__) || defined(__AARCH64EL__) || \
+ defined(__MIPSEL__) || defined(__TC32EL__)
+
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+
+#else
+#error "__BYTE_ORDER__ is not defined and cannot be automatically resolved"
+#endif
+#endif
+
+/* C++11 has static_assert built in */
+#ifdef __cplusplus
+#define BUILD_ASSERT(EXPR) static_assert(EXPR, "")
+#define BUILD_ASSERT_MSG(EXPR, MSG) static_assert(EXPR, MSG)
+/*
+ * GCC 4.6 and higher have the C11 _Static_assert built in, and its
+ * output is easier to understand than the common BUILD_ASSERT macros.
+ */
+#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) || \
+ (__STDC_VERSION__) >= 201100
+#define BUILD_ASSERT(EXPR) _Static_assert(EXPR, "")
+#define BUILD_ASSERT_MSG(EXPR, MSG) _Static_assert(EXPR, MSG)
+#endif
+
+#include
+#include
+
+#define ALIAS_OF(of) __attribute__((alias(#of)))
+
+#define FUNC_ALIAS(real_func, new_alias, return_type) \
+ return_type new_alias() ALIAS_OF(real_func)
+
+#if defined(CONFIG_ARCH_POSIX)
+#include
+
+/*let's not segfault if this were to happen for some reason*/
+#define CODE_UNREACHABLE \
+ { \
+ posix_print_error_and_exit("CODE_UNREACHABLE reached from %s:%d\n", \
+ __FILE__, __LINE__); \
+ __builtin_unreachable(); \
+ }
+#else
+#define CODE_UNREACHABLE __builtin_unreachable()
+#endif
+#define FUNC_NORETURN __attribute__((__noreturn__))
+
+/* The GNU assembler for Cortex-M3 uses # for immediate values, not
+ * comments, so the @nobits# trick does not work.
+ */
+#if defined(CONFIG_ARM)
+#define _NODATA_SECTION(segment) __attribute__((section(#segment)))
+#else
+#define _NODATA_SECTION(segment) \
+ __attribute__((section(#segment ",\"wa\",@nobits#")))
+#endif
+
+/* Unaligned access */
+#define UNALIGNED_GET(p) \
+ __extension__({ \
+ struct __attribute__((__packed__)) { \
+ __typeof__(*(p)) __v; \
+ } *__p = (__typeof__(__p))(p); \
+ __p->__v; \
+ })
+
+#if __GNUC__ >= 7 && defined(CONFIG_ARM)
+
+/* Version of UNALIGNED_PUT() which issues a compiler_barrier() after
+ * the store. It is required to workaround an apparent optimization
+ * bug in GCC for ARM Cortex-M3 and higher targets, when multiple
+ * byte, half-word and word stores (strb, strh, str instructions),
+ * which support unaligned access, can be coalesced into store double
+ * (strd) instruction, which doesn't support unaligned access (the
+ * compilers in question do this optimization ignoring __packed__
+ * attribute).
+ */
+#define UNALIGNED_PUT(v, p) \
+ do { \
+ struct __attribute__((__packed__)) { \
+ __typeof__(*p) __v; \
+ } *__p = (__typeof__(__p))(p); \
+ __p->__v = (v); \
+ compiler_barrier(); \
+ } while (false)
+
+#else
+
+#define UNALIGNED_PUT(v, p) \
+ do { \
+ struct __attribute__((__packed__)) { \
+ __typeof__(*p) __v; \
+ } *__p = (__typeof__(__p))(p); \
+ __p->__v = (v); \
+ } while (false)
+
+#endif
+
+/* Double indirection to ensure section names are expanded before
+ * stringification
+ */
+#define __GENERIC_SECTION(segment) __attribute__((section(STRINGIFY(segment))))
+#define Z_GENERIC_SECTION(segment) __GENERIC_SECTION(segment)
+
+#define ___in_section(a, b, c) \
+ __attribute__((section("." Z_STRINGIFY(a) "." Z_STRINGIFY(b) "." Z_STRINGIFY(c))))
+#define __in_section(a, b, c) ___in_section(a, b, c)
+
+#define __in_section_unique(seg) ___in_section(seg, __FILE__, __COUNTER__)
+
+/* When using XIP, using '__ramfunc' places a function into RAM instead
+ * of FLASH. Make sure '__ramfunc' is defined only when
+ * CONFIG_ARCH_HAS_RAMFUNC_SUPPORT is defined, so that the compiler can
+ * report an error if '__ramfunc' is used but the architecture does not
+ * support it.
+ */
+#if !defined(CONFIG_XIP)
+#define __ramfunc
+#elif defined(CONFIG_ARCH_HAS_RAMFUNC_SUPPORT)
+#define __ramfunc __attribute__((noinline)) \
+__attribute__((long_call, section(".ramfunc")))
+#endif /* !CONFIG_XIP */
+
+#ifndef __packed
+#define __packed __attribute__((__packed__))
+#endif
+#ifndef __aligned
+#define __aligned(x) __attribute__((__aligned__(x)))
+#endif
+#define __may_alias __attribute__((__may_alias__))
+#ifndef __printf_like
+#define __printf_like(f, a) __attribute__((format(printf, f, a)))
+#endif
+#define __used __attribute__((__used__))
+#ifndef __deprecated
+#define __deprecated __attribute__((deprecated))
+#endif
+#define ARG_UNUSED(x) (void)(x)
+
+#ifndef likely
+#define likely(x) __builtin_expect((bool)!!(x), true)
+#endif
+#ifndef unlikely
+#define unlikely(x) __builtin_expect((bool)!!(x), false)
+#endif
+
+#define popcount(x) __builtin_popcount(x)
+
+#ifndef __weak
+#define __weak __attribute__((__weak__))
+#endif
+#define __unused __attribute__((__unused__))
+
+/* Builtins with availability that depend on the compiler version. */
+#if __GNUC__ >= 5
+#define HAS_BUILTIN___builtin_add_overflow 1
+#define HAS_BUILTIN___builtin_sub_overflow 1
+#define HAS_BUILTIN___builtin_mul_overflow 1
+#define HAS_BUILTIN___builtin_div_overflow 1
+#endif
+#if __GNUC__ >= 4
+#define HAS_BUILTIN___builtin_clz 1
+#define HAS_BUILTIN___builtin_clzl 1
+#define HAS_BUILTIN___builtin_clzll 1
+#define HAS_BUILTIN___builtin_ctz 1
+#define HAS_BUILTIN___builtin_ctzl 1
+#define HAS_BUILTIN___builtin_ctzll 1
+#endif
+
+/* Be *very* careful with this, you cannot filter out with -wno-deprecated,
+ * which has implications for -Werror
+ */
+#define __DEPRECATED_MACRO _Pragma("GCC warning \"Macro is deprecated\"")
+
+/* These macros allow having ARM asm functions callable from thumb */
+
+#if defined(_ASMLANGUAGE)
+
+#ifdef CONFIG_ARM
+
+#if defined(CONFIG_ISA_THUMB2)
+
+#define FUNC_CODE() .thumb;
+#define FUNC_INSTR(a)
+
+#elif defined(CONFIG_ISA_ARM)
+
+#define FUNC_CODE() .code 32
+#define FUNC_INSTR(a)
+
+#else
+
+#error unknown instruction set
+
+#endif /* ISA */
+
+#else
+
+#define FUNC_CODE()
+#define FUNC_INSTR(a)
+
+#endif /* !CONFIG_ARM */
+
+#endif /* _ASMLANGUAGE */
+
+/*
+ * These macros are used to declare assembly language symbols that need
+ * to be typed properly(func or data) to be visible to the OMF tool.
+ * So that the build tool could mark them as an entry point to be linked
+ * correctly. This is an elfism. Use #if 0 for a.out.
+ */
+
+#if defined(_ASMLANGUAGE)
+
+#if defined(CONFIG_ARM) || defined(CONFIG_NIOS2) || defined(CONFIG_RISCV) || defined(CONFIG_XTENSA)
+#define GTEXT(sym) \
+ .global sym; \
+ .type sym, % function
+#define GDATA(sym) \
+ .global sym; \
+ .type sym, % object
+#define WTEXT(sym) \
+ .weak sym; \
+ .type sym, % function
+#define WDATA(sym) \
+ .weak sym; \
+ .type sym, % object
+#elif defined(CONFIG_ARC)
+/*
+ * Need to use assembly macros because ';' is interpreted as the start of
+ * a single line comment in the ARC assembler.
+ */
+
+.macro glbl_text symbol
+ .globl \symbol
+ .type \symbol,
+ % function
+ .endm
+
+ .macro glbl_data symbol
+ .globl \symbol
+ .type \symbol,
+ % object
+ .endm
+
+ .macro weak_data symbol
+ .weak \symbol
+ .type \symbol,
+ % object
+ .endm
+
+#define GTEXT(sym) glbl_text sym
+#define GDATA(sym) glbl_data sym
+#define WDATA(sym) weak_data sym
+
+#else /* !CONFIG_ARM && !CONFIG_ARC */
+#define GTEXT(sym) \
+ .globl sym; \
+ .type sym, @function
+#define GDATA(sym) \
+ .globl sym; \
+ .type sym, @object
+#endif
+
+/*
+ * These macros specify the section in which a given function or variable
+ * resides.
+ *
+ * - SECTION_FUNC allows only one function to reside in a sub-section
+ * - SECTION_SUBSEC_FUNC allows multiple functions to reside in a sub-section
+ * This ensures that garbage collection only discards the section
+ * if all functions in the sub-section are not referenced.
+ */
+
+#if defined(CONFIG_ARC)
+/*
+ * Need to use assembly macros because ';' is interpreted as the start of
+ * a single line comment in the ARC assembler.
+ *
+ * Also, '\()' is needed in the .section directive of these macros for
+ * correct substitution of the 'section' variable.
+ */
+
+.macro section_var section, symbol.section.\section\().\symbol
+ \symbol :.endm
+
+ .macro section_func section,
+ symbol
+ .section.\section\()
+ .\symbol,
+ "ax" FUNC_CODE()
+ PERFOPT_ALIGN
+ \symbol : FUNC_INSTR(\symbol)
+ .endm
+
+ .macro section_subsec_func section,
+ subsection, symbol.section.\section\().\subsection, "ax" PERFOPT_ALIGN
+ \symbol :.endm
+
+#define SECTION_VAR(sect, sym) section_var sect, sym
+#define SECTION_FUNC(sect, sym) section_func sect, sym
+#define SECTION_SUBSEC_FUNC(sect, subsec, sym) \
+ section_subsec_func sect, subsec, sym
+#else /* !CONFIG_ARC */
+
+#define SECTION_VAR(sect, sym) \
+ .section.sect.##sym; \
+ sym:
+#define SECTION_FUNC(sect, sym) \
+ .section.sect.sym, "ax"; \
+ FUNC_CODE() \
+ PERFOPT_ALIGN; \
+ sym: \
+ FUNC_INSTR(sym)
+#define SECTION_SUBSEC_FUNC(sect, subsec, sym) \
+ .section.sect.subsec, "ax"; \
+ PERFOPT_ALIGN; \
+ sym:
+
+#endif /* CONFIG_ARC */
+
+#endif /* _ASMLANGUAGE */
+
+#if defined(CONFIG_ARM) && defined(_ASMLANGUAGE)
+#if defined(CONFIG_ISA_THUMB2)
+/* '.syntax unified' is a gcc-ism used in thumb-2 asm files */
+#define _ASM_FILE_PROLOGUE \
+ .text; \
+ .syntax unified; \
+ .thumb
+#else
+#define _ASM_FILE_PROLOGUE \
+ .text; \
+ .code 32
+#endif
+#endif
+
+/*
+ * These macros generate absolute symbols for GCC
+ */
+
+/* create an extern reference to the absolute symbol */
+
+#define GEN_OFFSET_EXTERN(name) extern const char name[]
+
+#define GEN_ABS_SYM_BEGIN(name) \
+ EXTERN_C void name(void); \
+ void name(void) \
+ {
+#define GEN_ABS_SYM_END }
+
+#if defined(CONFIG_ARM)
+
+/*
+ * GNU/ARM backend does not have a proper operand modifier which does not
+ * produces prefix # followed by value, such as %0 for PowerPC, Intel, and
+ * MIPS. The workaround performed here is using %B0 which converts
+ * the value to ~(value). Thus "n"(~(value)) is set in operand constraint
+ * to output (value) in the ARM specific GEN_OFFSET macro.
+ */
+
+#define GEN_ABSOLUTE_SYM(name, value) \
+ __asm__(".globl\t" #name "\n\t.equ\t" #name \
+ ",%B0" \
+ "\n\t.type\t" #name ",%%object" \
+ : \
+ : "n"(~(value)))
+
+#elif defined(CONFIG_X86) || defined(CONFIG_ARC)
+
+#define GEN_ABSOLUTE_SYM(name, value) \
+ __asm__(".globl\t" #name "\n\t.equ\t" #name \
+ ",%c0" \
+ "\n\t.type\t" #name ",@object" \
+ : \
+ : "n"(value))
+
+#elif defined(CONFIG_NIOS2) || defined(CONFIG_RISCV) || defined(CONFIG_XTENSA)
+
+/* No special prefixes necessary for constants in this arch AFAICT */
+#define GEN_ABSOLUTE_SYM(name, value) \
+ __asm__(".globl\t" #name "\n\t.equ\t" #name \
+ ",%0" \
+ "\n\t.type\t" #name ",%%object" \
+ : \
+ : "n"(value))
+
+#elif defined(CONFIG_ARCH_POSIX)
+#define GEN_ABSOLUTE_SYM(name, value) \
+ __asm__(".globl\t" #name "\n\t.equ\t" #name \
+ ",%c0" \
+ "\n\t.type\t" #name ",@object" \
+ : \
+ : "n"(value))
+#else
+#error processor architecture not supported
+#endif
+
+#define compiler_barrier() \
+ do { \
+ __asm__ __volatile__("" :: \
+ : "memory"); \
+ } while (false)
+
+/** @brief Return larger value of two provided expressions.
+ *
+ * Macro ensures that expressions are evaluated only once.
+ *
+ * @note Macro has limited usage compared to the standard macro as it cannot be
+ * used:
+ * - to generate constant integer, e.g. __aligned(Z_MAX(4,5))
+ * - static variable, e.g. array like static u8_t array[Z_MAX(...)];
+ */
+#define Z_MAX(a, b) ({ \
+ /* random suffix to avoid naming conflict */ \
+ __typeof__(a) _value_a_ = (a); \
+ __typeof__(b) _value_b_ = (b); \
+ _value_a_ > _value_b_ ? _value_a_ : _value_b_; \
+})
+
+/** @brief Return smaller value of two provided expressions.
+ *
+ * Macro ensures that expressions are evaluated only once. See @ref Z_MAX for
+ * macro limitations.
+ */
+#define Z_MIN(a, b) ({ \
+ /* random suffix to avoid naming conflict */ \
+ __typeof__(a) _value_a_ = (a); \
+ __typeof__(b) _value_b_ = (b); \
+ _value_a_ < _value_b_ ? _value_a_ : _value_b_; \
+})
+
+#endif /* !_LINKER */
+#endif /* ZEPHYR_INCLUDE_TOOLCHAIN_GCC_H_ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain/xcc.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain/xcc.h
new file mode 100644
index 00000000..6ef926c8
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/toolchain/xcc.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef ZEPHYR_INCLUDE_TOOLCHAIN_XCC_H_
+#define ZEPHYR_INCLUDE_TOOLCHAIN_XCC_H_
+
+/* toolchain/gcc.h errors out if __BYTE_ORDER__ cannot be determined
+ * there. However, __BYTE_ORDER__ is actually being defined later in
+ * this file. So define __BYTE_ORDER__ to skip the check in gcc.h
+ * and undefine after including gcc.h.
+ */
+#define __BYTE_ORDER__
+#include
+#undef __BYTE_ORDER__
+
+#include
+
+/* XCC doesn't support __COUNTER__ but this should be good enough */
+#define __COUNTER__ __LINE__
+
+#undef __in_section_unique
+#define __in_section_unique(seg) \
+ __attribute__((section("." STRINGIFY(seg) "." STRINGIFY(__COUNTER__))))
+
+#ifndef __GCC_LINKER_CMD__
+#include
+
+/*
+ * XCC does not define the following macros with the expected names, but the
+ * HAL defines similar ones. Thus we include it and define the missing macros
+ * ourselves.
+ */
+#if XCHAL_MEMORY_ORDER == XTHAL_BIGENDIAN
+#define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__
+#elif XCHAL_MEMORY_ORDER == XTHAL_LITTLEENDIAN
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+#else
+#error "Cannot determine __BYTE_ORDER__"
+#endif
+
+#endif /* __GCC_LINKER_CMD__ */
+
+#define __builtin_unreachable() \
+ do { \
+ __ASSERT(false, "Unreachable code"); \
+ } while (true)
+
+#endif
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/work_q.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/work_q.h
new file mode 100644
index 00000000..6886cf7a
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/work_q.h
@@ -0,0 +1,60 @@
+#ifndef WORK_Q_H
+#define WORK_Q_H
+#include "atomic.h"
+#include "zephyr.h"
+
+#if defined(BFLB_BLE)
+struct k_work_q {
+ struct k_fifo fifo;
+};
+
+typedef struct {
+ bl_timer_t timer;
+ struct k_delayed_work *delay_work;
+} timer_rec_d;
+
+int k_work_q_start();
+
+enum {
+ K_WORK_STATE_PENDING,
+ K_WORK_STATE_PERIODIC,
+};
+struct k_work;
+/* work define*/
+typedef void (*k_work_handler_t)(struct k_work *work);
+struct k_work {
+ void *_reserved;
+ k_work_handler_t handler;
+ atomic_t flags[1];
+};
+
+#define _K_WORK_INITIALIZER(work_handler) \
+ { \
+ ._reserved = NULL, \
+ .handler = work_handler, \
+ .flags = { 0 } \
+ }
+
+#define K_WORK_INITIALIZER __DEPRECATED_MACRO _K_WORK_INITIALIZER
+
+int k_work_init(struct k_work *work, k_work_handler_t handler);
+void k_work_submit(struct k_work *work);
+
+/*delay work define*/
+struct k_delayed_work {
+ struct k_work work;
+ struct k_work_q *work_q;
+ k_timer_t timer;
+};
+
+void k_delayed_work_init(struct k_delayed_work *work, k_work_handler_t handler);
+int k_delayed_work_submit(struct k_delayed_work *work, uint32_t delay);
+/* Added by bouffalolab */
+int k_delayed_work_submit_periodic(struct k_delayed_work *work, s32_t period);
+int k_delayed_work_cancel(struct k_delayed_work *work);
+s32_t k_delayed_work_remaining_get(struct k_delayed_work *work);
+void k_delayed_work_del_timer(struct k_delayed_work *work);
+/* Added by bouffalolab */
+int k_delayed_work_free(struct k_delayed_work *work);
+#endif
+#endif /* WORK_Q_H */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/zephyr/types.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/zephyr/types.h
new file mode 100644
index 00000000..3b07e3b1
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/zephyr/types.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2017 Linaro Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef __Z_TYPES_H__
+#define __Z_TYPES_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef signed char s8_t;
+typedef signed short s16_t;
+typedef signed int s32_t;
+typedef signed long long s64_t;
+
+typedef unsigned char u8_t;
+typedef unsigned short u16_t;
+typedef unsigned int u32_t;
+typedef unsigned long long u64_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __Z_TYPES_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.c
new file mode 100644
index 00000000..3a579079
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.c
@@ -0,0 +1,61 @@
+/* log.c - logging helpers */
+
+/*
+ * Copyright (c) 2017 Nordic Semiconductor ASA
+ * Copyright (c) 2016 Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/* Helper for printk parameters to convert from binary to hex.
+ * We declare multiple buffers so the helper can be used multiple times
+ * in a single printk call.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+const char *bt_hex_real(const void *buf, size_t len)
+{
+ static const char hex[] = "0123456789abcdef";
+#if defined(CONFIG_BT_DEBUG_MONITOR)
+ static char str[255];
+#else
+ static char str[128];
+#endif
+ const u8_t *b = buf;
+ int i;
+
+ len = MIN(len, (sizeof(str) - 1) / 2);
+
+ for (i = 0; i < len; i++) {
+ str[i * 2] = hex[b[i] >> 4];
+ str[i * 2 + 1] = hex[b[i] & 0xf];
+ }
+
+ str[i * 2] = '\0';
+
+ return str;
+}
+
+const char *bt_addr_str_real(const bt_addr_t *addr)
+{
+ static char str[BT_ADDR_STR_LEN];
+
+ bt_addr_to_str(addr, str, sizeof(str));
+
+ return str;
+}
+
+const char *bt_addr_le_str_real(const bt_addr_le_t *addr)
+{
+ static char str[BT_ADDR_LE_STR_LEN];
+
+ bt_addr_le_to_str(addr, str, sizeof(str));
+
+ return str;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.h
new file mode 100644
index 00000000..74f9ec72
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.h
@@ -0,0 +1,142 @@
+/** @file
+ * @brief Bluetooth subsystem logging helpers.
+ */
+
+/*
+ * Copyright (c) 2017 Nordic Semiconductor ASA
+ * Copyright (c) 2015-2016 Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+#ifndef __BT_LOG_H
+#define __BT_LOG_H
+
+#if defined(BL_MCU_SDK)
+#include "bflb_platform.h"
+#endif
+
+#include
+
+#include
+#include
+
+#include "FreeRTOS.h"
+#include "task.h"
+#include "FreeRTOSConfig.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !defined(BT_DBG_ENABLED)
+#define BT_DBG_ENABLED 1
+#endif
+
+#if BT_DBG_ENABLED
+#define LOG_LEVEL LOG_LEVEL_DBG
+#else
+#define LOG_LEVEL CONFIG_BT_LOG_LEVEL
+#endif
+
+//LOG_MODULE_REGISTER(LOG_MODULE_NAME, LOG_LEVEL);
+
+#if defined(BFLB_BLE)
+
+#if defined(BL_MCU_SDK)
+#define BT_DBG(fmt, ...) //bflb_platform_printf(fmt", %s\r\n", ##__VA_ARGS__, __func__)
+#define BT_ERR(fmt, ...) bflb_platform_printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__)
+#else
+#define BT_DBG(fmt, ...) //printf(fmt", %s\r\n", ##__VA_ARGS__, __func__)
+#define BT_ERR(fmt, ...) printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__)
+#endif
+
+#if defined(CONFIG_BT_STACK_PTS) || defined(CONFIG_BT_MESH_PTS)
+#if defined(BL_MCU_SDK)
+#define BT_PTS(fmt, ...) bflb_platform_printf(fmt "\r\n", ##__VA_ARGS__)
+#else
+#define BT_PTS(fmt, ...) printf(fmt "\r\n", ##__VA_ARGS__)
+#endif
+
+#endif
+#if defined(BL_MCU_SDK)
+#define BT_WARN(fmt, ...) bflb_platform_printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__)
+#define BT_INFO(fmt, ...) //bflb_platform_printf(fmt", %s\r\n", ##__VA_ARGS__, __func__)
+#else
+#define BT_WARN(fmt, ...) printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__)
+#define BT_INFO(fmt, ...) //printf(fmt", %s\r\n", ##__VA_ARGS__, __func__)
+#endif
+
+#else /*BFLB_BLE*/
+
+#define BT_DBG(fmt, ...) LOG_DBG(fmt, ##__VA_ARGS__)
+#define BT_ERR(fmt, ...) LOG_ERR(fmt, ##__VA_ARGS__)
+#define BT_WARN(fmt, ...) LOG_WRN(fmt, ##__VA_ARGS__)
+#define BT_INFO(fmt, ...) LOG_INF(fmt, ##__VA_ARGS__)
+
+#if defined(CONFIG_BT_ASSERT_VERBOSE)
+#define BT_ASSERT_PRINT(fmt, ...) printk(fmt, ##__VA_ARGS__)
+#else
+#define BT_ASSERT_PRINT(fmt, ...)
+#endif /* CONFIG_BT_ASSERT_VERBOSE */
+
+#if defined(CONFIG_BT_ASSERT_PANIC)
+#define BT_ASSERT_DIE k_panic
+#else
+#define BT_ASSERT_DIE k_oops
+#endif /* CONFIG_BT_ASSERT_PANIC */
+
+#endif /*BFLB_BLE*/
+
+#if defined(CONFIG_BT_ASSERT)
+#if defined(BFLB_BLE)
+extern void vAssertCalled(void);
+#define BT_ASSERT(cond) \
+ if ((cond) == 0) \
+ vAssertCalled()
+#else
+#define BT_ASSERT(cond) \
+ if (!(cond)) { \
+ BT_ASSERT_PRINT("assert: '" #cond \
+ "' failed\n"); \
+ BT_ASSERT_DIE(); \
+ }
+#endif /*BFLB_BLE*/
+#else
+#if defined(BFLB_BLE)
+#define BT_ASSERT(cond)
+#else
+#define BT_ASSERT(cond) __ASSERT_NO_MSG(cond)
+#endif /*BFLB_BLE*/
+#endif /* CONFIG_BT_ASSERT*/
+
+#define BT_HEXDUMP_DBG(_data, _length, _str) \
+ LOG_HEXDUMP_DBG((const u8_t *)_data, _length, _str)
+
+#if defined(BFLB_BLE)
+static inline char *log_strdup(const char *str)
+{
+ return (char *)str;
+}
+#endif
+
+/* NOTE: These helper functions always encodes into the same buffer storage.
+ * It is the responsibility of the user of this function to copy the information
+ * in this string if needed.
+ */
+const char *bt_hex_real(const void *buf, size_t len);
+const char *bt_addr_str_real(const bt_addr_t *addr);
+const char *bt_addr_le_str_real(const bt_addr_le_t *addr);
+
+/* NOTE: log_strdup does not guarantee a duplication of the string.
+ * It is therefore still the responsibility of the user to handle the
+ * restrictions in the underlying function call.
+ */
+#define bt_hex(buf, len) log_strdup(bt_hex_real(buf, len))
+#define bt_addr_str(addr) log_strdup(bt_addr_str_real(addr))
+#define bt_addr_le_str(addr) log_strdup(bt_addr_le_str_real(addr))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BT_LOG_H */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/poll.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/poll.c
new file mode 100644
index 00000000..b97a4f79
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/poll.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2017 Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ *
+ * @brief Kernel asynchronous event polling interface.
+ *
+ * This polling mechanism allows waiting on multiple events concurrently,
+ * either events triggered directly, or from kernel objects or other kernel
+ * constructs.
+ */
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+struct k_sem g_poll_sem;
+
+void k_poll_event_init(struct k_poll_event *event, u32_t type,
+ int mode, void *obj)
+{
+ __ASSERT(mode == K_POLL_MODE_NOTIFY_ONLY,
+ "only NOTIFY_ONLY mode is supported\n");
+ __ASSERT(type < (1 << _POLL_NUM_TYPES), "invalid type\n");
+ __ASSERT(obj, "must provide an object\n");
+
+ event->poller = NULL;
+ /* event->tag is left uninitialized: the user will set it if needed */
+ event->type = type;
+ event->state = K_POLL_STATE_NOT_READY;
+ event->mode = mode;
+ event->unused = 0;
+ event->obj = obj;
+}
+
+/* must be called with interrupts locked */
+static inline int is_condition_met(struct k_poll_event *event, u32_t *state)
+{
+ switch (event->type) {
+ case K_POLL_TYPE_SEM_AVAILABLE:
+ if (k_sem_count_get(event->sem) > 0) {
+ *state = K_POLL_STATE_SEM_AVAILABLE;
+ return 1;
+ }
+ break;
+ case K_POLL_TYPE_DATA_AVAILABLE:
+ if (!k_queue_is_empty(event->queue)) {
+ *state = K_POLL_STATE_FIFO_DATA_AVAILABLE;
+ return 1;
+ }
+ break;
+ case K_POLL_TYPE_SIGNAL:
+ if (event->signal->signaled) {
+ *state = K_POLL_STATE_SIGNALED;
+ return 1;
+ }
+ break;
+ case K_POLL_TYPE_IGNORE:
+ return 0;
+ default:
+ __ASSERT(0, "invalid event type (0x%x)\n", event->type);
+ break;
+ }
+
+ return 0;
+}
+
+static inline void add_event(sys_dlist_t *events, struct k_poll_event *event,
+ struct _poller *poller)
+{
+ sys_dlist_append(events, &event->_node);
+}
+
+/* must be called with interrupts locked */
+static inline int register_event(struct k_poll_event *event,
+ struct _poller *poller)
+{
+ switch (event->type) {
+ case K_POLL_TYPE_SEM_AVAILABLE:
+ __ASSERT(event->sem, "invalid semaphore\n");
+ add_event(&event->sem->poll_events, event, poller);
+ break;
+ case K_POLL_TYPE_DATA_AVAILABLE:
+ __ASSERT(event->queue, "invalid queue\n");
+ add_event(&event->queue->poll_events, event, poller);
+ break;
+ case K_POLL_TYPE_SIGNAL:
+ __ASSERT(event->signal, "invalid poll signal\n");
+ add_event(&event->signal->poll_events, event, poller);
+ break;
+ case K_POLL_TYPE_IGNORE:
+ /* nothing to do */
+ break;
+ default:
+ __ASSERT(0, "invalid event type\n");
+ break;
+ }
+
+ event->poller = poller;
+
+ return 0;
+}
+
+/* must be called with interrupts locked */
+static inline void clear_event_registration(struct k_poll_event *event)
+{
+ event->poller = NULL;
+
+ switch (event->type) {
+ case K_POLL_TYPE_SEM_AVAILABLE:
+ __ASSERT(event->sem, "invalid semaphore\n");
+ sys_dlist_remove(&event->_node);
+ break;
+ case K_POLL_TYPE_DATA_AVAILABLE:
+ __ASSERT(event->queue, "invalid queue\n");
+ sys_dlist_remove(&event->_node);
+ break;
+ case K_POLL_TYPE_SIGNAL:
+ __ASSERT(event->signal, "invalid poll signal\n");
+ sys_dlist_remove(&event->_node);
+ break;
+ case K_POLL_TYPE_IGNORE:
+ /* nothing to do */
+ break;
+ default:
+ __ASSERT(0, "invalid event type\n");
+ break;
+ }
+}
+
+/* must be called with interrupts locked */
+static inline void clear_event_registrations(struct k_poll_event *events,
+ int last_registered,
+ unsigned int key)
+{
+ for (; last_registered >= 0; last_registered--) {
+ clear_event_registration(&events[last_registered]);
+ irq_unlock(key);
+ key = irq_lock();
+ }
+}
+
+static inline void set_event_ready(struct k_poll_event *event, u32_t state)
+{
+ event->poller = NULL;
+ event->state |= state;
+}
+
+static bool polling_events(struct k_poll_event *events, int num_events,
+ s32_t timeout, int *last_registered)
+{
+ int rc;
+ bool polling = true;
+ unsigned int key;
+
+ for (int ii = 0; ii < num_events; ii++) {
+ u32_t state;
+ key = irq_lock();
+ if (is_condition_met(&events[ii], &state)) {
+ set_event_ready(&events[ii], state);
+ polling = false;
+ } else if (timeout != K_NO_WAIT && polling) {
+ rc = register_event(&events[ii], NULL);
+ if (rc == 0) {
+ ++(*last_registered);
+ } else {
+ __ASSERT(0, "unexpected return code\n");
+ }
+ }
+ irq_unlock(key);
+ }
+ return polling;
+}
+
+int k_poll(struct k_poll_event *events, int num_events, s32_t timeout)
+{
+ __ASSERT(events, "NULL events\n");
+ __ASSERT(num_events > 0, "zero events\n");
+
+ int last_registered = -1;
+ unsigned int key;
+ bool polling = true;
+
+ /* find events whose condition is already fulfilled */
+ polling = polling_events(events, num_events, timeout, &last_registered);
+
+ if (polling == false) {
+ goto exit;
+ }
+
+ k_sem_take(&g_poll_sem, timeout);
+
+ last_registered = -1;
+ polling_events(events, num_events, timeout, &last_registered);
+exit:
+ key = irq_lock();
+ clear_event_registrations(events, last_registered, key);
+ irq_unlock(key);
+ return 0;
+}
+
+/* must be called with interrupts locked */
+static int _signal_poll_event(struct k_poll_event *event, u32_t state,
+ int *must_reschedule)
+{
+ *must_reschedule = 0;
+ set_event_ready(event, state);
+ return 0;
+}
+
+int k_poll_signal_raise(struct k_poll_signal *signal, int result)
+{
+ unsigned int key = irq_lock();
+ struct k_poll_event *poll_event;
+ int must_reschedule;
+
+ signal->result = result;
+ signal->signaled = 1;
+
+ poll_event = (struct k_poll_event *)sys_dlist_get(&signal->poll_events);
+ if (!poll_event) {
+ irq_unlock(key);
+ return 0;
+ }
+
+ int rc = _signal_poll_event(poll_event, K_POLL_STATE_SIGNALED,
+ &must_reschedule);
+
+ k_sem_give(&g_poll_sem);
+ irq_unlock(key);
+ return rc;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.c
new file mode 100644
index 00000000..231ca221
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.c
@@ -0,0 +1,106 @@
+/**
+ * @file rpa.c
+ * Resolvable Private Address Generation and Resolution
+ */
+
+/*
+ * Copyright (c) 2017 Nordic Semiconductor ASA
+ * Copyright (c) 2015-2016 Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include <../include/bluetooth/crypto.h>
+
+#define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_RPA)
+#define LOG_MODULE_NAME bt_rpa
+#include "log.h"
+
+#if defined(CONFIG_BT_CTLR_PRIVACY) || defined(CONFIG_BT_PRIVACY) || defined(CONFIG_BT_SMP)
+static int ah(const u8_t irk[16], const u8_t r[3], u8_t out[3])
+{
+ u8_t res[16];
+ int err;
+
+ BT_DBG("irk %s", bt_hex(irk, 16));
+ BT_DBG("r %s", bt_hex(r, 3));
+
+ /* r' = padding || r */
+ memcpy(res, r, 3);
+ (void)memset(res + 3, 0, 13);
+
+ err = bt_encrypt_le(irk, res, res);
+ if (err) {
+ return err;
+ }
+
+ /* The output of the random address function ah is:
+ * ah(h, r) = e(k, r') mod 2^24
+ * The output of the security function e is then truncated to 24 bits
+ * by taking the least significant 24 bits of the output of e as the
+ * result of ah.
+ */
+ memcpy(out, res, 3);
+
+ return 0;
+}
+#endif
+
+#if defined(CONFIG_BT_SMP) || defined(CONFIG_BT_CTLR_PRIVACY)
+bool bt_rpa_irk_matches(const u8_t irk[16], const bt_addr_t *addr)
+{
+ u8_t hash[3];
+ int err;
+
+ BT_DBG("IRK %s bdaddr %s", bt_hex(irk, 16), bt_addr_str(addr));
+
+ err = ah(irk, addr->val + 3, hash);
+ if (err) {
+ return false;
+ }
+
+ return !memcmp(addr->val, hash, 3);
+}
+#endif
+
+#if defined(CONFIG_BT_PRIVACY) || defined(CONFIG_BT_CTLR_PRIVACY)
+int bt_rpa_create(const u8_t irk[16], bt_addr_t *rpa)
+{
+ int err;
+
+ err = bt_rand(rpa->val + 3, 3);
+ if (err) {
+ return err;
+ }
+
+ BT_ADDR_SET_RPA(rpa);
+
+ err = ah(irk, rpa->val + 3, rpa->val);
+ if (err) {
+ return err;
+ }
+
+ BT_DBG("Created RPA %s", bt_addr_str((bt_addr_t *)rpa->val));
+
+ return 0;
+}
+#else
+int bt_rpa_create(const u8_t irk[16], bt_addr_t *rpa)
+{
+ return -ENOTSUP;
+}
+#endif /* CONFIG_BT_PRIVACY */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.h
new file mode 100644
index 00000000..dca68f15
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.h
@@ -0,0 +1,16 @@
+/* rpa.h - Bluetooth Resolvable Private Addresses (RPA) generation and
+ * resolution
+ */
+
+/*
+ * Copyright (c) 2017 Nordic Semiconductor ASA
+ * Copyright (c) 2015-2016 Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "bluetooth.h"
+#include "hci_host.h"
+
+bool bt_rpa_irk_matches(const u8_t irk[16], const bt_addr_t *addr);
+int bt_rpa_create(const u8_t irk[16], bt_addr_t *rpa);
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/Kconfig b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/Kconfig
new file mode 100644
index 00000000..1f62654e
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/Kconfig
@@ -0,0 +1,116 @@
+# Kconfig - Cryptography primitive options for TinyCrypt version 2.0
+
+#
+# Copyright (c) 2015 Intel Corporation
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+config TINYCRYPT
+ bool
+ prompt "TinyCrypt Support"
+ default n
+ help
+ This option enables the TinyCrypt cryptography library.
+
+config TINYCRYPT_CTR_PRNG
+ bool
+ prompt "PRNG in counter mode"
+ depends on TINYCRYPT
+ default n
+ help
+ This option enables support for the pseudo-random number
+ generator in counter mode.
+
+config TINYCRYPT_SHA256
+ bool
+ prompt "SHA-256 Hash function support"
+ depends on TINYCRYPT
+ default n
+ help
+ This option enables support for SHA-256
+ hash function primitive.
+
+config TINYCRYPT_SHA256_HMAC
+ bool
+ prompt "HMAC (via SHA256) message auth support"
+ depends on TINYCRYPT_SHA256
+ default n
+ help
+ This option enables support for HMAC using SHA-256
+ message authentication code.
+
+config TINYCRYPT_SHA256_HMAC_PRNG
+ bool
+ prompt "PRNG (via HMAC-SHA256) support"
+ depends on TINYCRYPT_SHA256_HMAC
+ default n
+ help
+ This option enables support for pseudo-random number
+ generator.
+
+config TINYCRYPT_ECC_DH
+ bool
+ prompt "ECC_DH anonymous key agreement protocol"
+ depends on TINYCRYPT
+ select ENTROPY_GENERATOR
+ default n
+ help
+ This option enables support for the Elliptic curve
+ Diffie-Hellman anonymous key agreement protocol.
+
+ Enabling ECC requires a cryptographically secure random number
+ generator.
+
+config TINYCRYPT_ECC_DSA
+ bool
+ prompt "ECC_DSA digital signature algorithm"
+ depends on TINYCRYPT
+ select ENTROPY_GENERATOR
+ default n
+ help
+ This option enables support for the Elliptic Curve Digital
+ Signature Algorithm (ECDSA).
+
+ Enabling ECC requires a cryptographically secure random number
+ generator.
+
+config TINYCRYPT_AES
+ bool
+ prompt "AES-128 decrypt/encrypt"
+ depends on TINYCRYPT
+ default n
+ help
+ This option enables support for AES-128 decrypt and encrypt.
+
+config TINYCRYPT_AES_CBC
+ bool
+ prompt "AES-128 block cipher"
+ depends on TINYCRYPT_AES
+ default n
+ help
+ This option enables support for AES-128 block cipher mode.
+
+config TINYCRYPT_AES_CTR
+ bool
+ prompt "AES-128 counter mode"
+ depends on TINYCRYPT_AES
+ default n
+ help
+ This option enables support for AES-128 counter mode.
+
+config TINYCRYPT_AES_CCM
+ bool
+ prompt "AES-128 CCM mode"
+ depends on TINYCRYPT_AES
+ default n
+ help
+ This option enables support for AES-128 CCM mode.
+
+config TINYCRYPT_AES_CMAC
+ bool
+ prompt "AES-128 CMAC mode"
+ depends on TINYCRYPT_AES
+ default n
+ help
+ This option enables support for AES-128 CMAC mode.
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/README b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/README
new file mode 100644
index 00000000..20cbc5ab
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/README
@@ -0,0 +1,71 @@
+The TinyCrypt library in Zephyr is a downstream of an externally maintained
+open source project. The original upstream code can be found at:
+
+https://github.com/01org/tinycrypt
+
+At revision c214460d7f760e2a75908cb41000afcc0bfca282, version 0.2.7
+
+Any changes to the local version should include Zephyr's TinyCrypt
+maintainer in the review. That can be found via the git history.
+
+The following is the license information for this code:
+
+================================================================================
+
+ TinyCrypt Cryptographic Library
+
+================================================================================
+
+ Copyright (c) 2017, Intel Corporation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ - Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ - Neither the name of the Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+================================================================================
+
+Copyright (c) 2013, Kenneth MacKay
+All rights reserved.
+
+https://github.com/kmackay/micro-ecc
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/aes.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/aes.h
new file mode 100644
index 00000000..05c5a4aa
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/aes.h
@@ -0,0 +1,130 @@
+/* aes.h - TinyCrypt interface to an AES-128 implementation */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief -- Interface to an AES-128 implementation.
+ *
+ * Overview: AES-128 is a NIST approved block cipher specified in
+ * FIPS 197. Block ciphers are deterministic algorithms that
+ * perform a transformation specified by a symmetric key in fixed-
+ * length data sets, also called blocks.
+ *
+ * Security: AES-128 provides approximately 128 bits of security.
+ *
+ * Usage: 1) call tc_aes128_set_encrypt/decrypt_key to set the key.
+ *
+ * 2) call tc_aes_encrypt/decrypt to process the data.
+ */
+
+#ifndef __TC_AES_H__
+#define __TC_AES_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define Nb (4) /* number of columns (32-bit words) comprising the state */
+#define Nk (4) /* number of 32-bit words comprising the key */
+#define Nr (10) /* number of rounds */
+#define TC_AES_BLOCK_SIZE (Nb * Nk)
+#define TC_AES_KEY_SIZE (Nb * Nk)
+
+typedef struct tc_aes_key_sched_struct {
+ unsigned int words[Nb * (Nr + 1)];
+} * TCAesKeySched_t;
+
+/**
+ * @brief Set AES-128 encryption key
+ * Uses key k to initialize s
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if: s == NULL or k == NULL
+ * @note This implementation skips the additional steps required for keys
+ * larger than 128 bits, and must not be used for AES-192 or
+ * AES-256 key schedule -- see FIPS 197 for details
+ * @param s IN/OUT -- initialized struct tc_aes_key_sched_struct
+ * @param k IN -- points to the AES key
+ */
+int tc_aes128_set_encrypt_key(TCAesKeySched_t s, const uint8_t *k);
+
+/**
+ * @brief AES-128 Encryption procedure
+ * Encrypts contents of in buffer into out buffer under key;
+ * schedule s
+ * @note Assumes s was initialized by aes_set_encrypt_key;
+ * out and in point to 16 byte buffers
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if: out == NULL or in == NULL or s == NULL
+ * @param out IN/OUT -- buffer to receive ciphertext block
+ * @param in IN -- a plaintext block to encrypt
+ * @param s IN -- initialized AES key schedule
+ */
+int tc_aes_encrypt(uint8_t *out, const uint8_t *in,
+ const TCAesKeySched_t s);
+
+/**
+ * @brief Set the AES-128 decryption key
+ * Uses key k to initialize s
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if: s == NULL or k == NULL
+ * @note This is the implementation of the straightforward inverse cipher
+ * using the cipher documented in FIPS-197 figure 12, not the
+ * equivalent inverse cipher presented in Figure 15
+ * @warning This routine skips the additional steps required for keys larger
+ * than 128, and must not be used for AES-192 or AES-256 key
+ * schedule -- see FIPS 197 for details
+ * @param s IN/OUT -- initialized struct tc_aes_key_sched_struct
+ * @param k IN -- points to the AES key
+ */
+int tc_aes128_set_decrypt_key(TCAesKeySched_t s, const uint8_t *k);
+
+/**
+ * @brief AES-128 Encryption procedure
+ * Decrypts in buffer into out buffer under key schedule s
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if: out is NULL or in is NULL or s is NULL
+ * @note Assumes s was initialized by aes_set_encrypt_key
+ * out and in point to 16 byte buffers
+ * @param out IN/OUT -- buffer to receive ciphertext block
+ * @param in IN -- a plaintext block to encrypt
+ * @param s IN -- initialized AES key schedule
+ */
+int tc_aes_decrypt(uint8_t *out, const uint8_t *in,
+ const TCAesKeySched_t s);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_AES_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/cbc_mode.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/cbc_mode.h
new file mode 100644
index 00000000..50c750c3
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/cbc_mode.h
@@ -0,0 +1,151 @@
+/* cbc_mode.h - TinyCrypt interface to a CBC mode implementation */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Interface to a CBC mode implementation.
+ *
+ * Overview: CBC (for "cipher block chaining") mode is a NIST approved mode of
+ * operation defined in SP 800-38a. It can be used with any block
+ * cipher to provide confidentiality of strings whose lengths are
+ * multiples of the block_size of the underlying block cipher.
+ * TinyCrypt hard codes AES as the block cipher.
+ *
+ * Security: CBC mode provides data confidentiality given that the maximum
+ * number q of blocks encrypted under a single key satisfies
+ * q < 2^63, which is not a practical constraint (it is considered a
+ * good practice to replace the encryption when q == 2^56). CBC mode
+ * provides NO data integrity.
+ *
+ * CBC mode assumes that the IV value input into the
+ * tc_cbc_mode_encrypt is randomly generated. The TinyCrypt library
+ * provides HMAC-PRNG module, which generates suitable IVs. Other
+ * methods for generating IVs are acceptable, provided that the
+ * values of the IVs generated appear random to any adversary,
+ * including someone with complete knowledge of the system design.
+ *
+ * The randomness property on which CBC mode's security depends is
+ * the unpredictability of the IV. Since it is unpredictable, this
+ * means in practice that CBC mode requires that the IV is stored
+ * somehow with the ciphertext in order to recover the plaintext.
+ *
+ * TinyCrypt CBC encryption prepends the IV to the ciphertext,
+ * because this affords a more efficient (few buffers) decryption.
+ * Hence tc_cbc_mode_encrypt assumes the ciphertext buffer is always
+ * 16 bytes larger than the plaintext buffer.
+ *
+ * Requires: AES-128
+ *
+ * Usage: 1) call tc_cbc_mode_encrypt to encrypt data.
+ *
+ * 2) call tc_cbc_mode_decrypt to decrypt data.
+ *
+ */
+
+#ifndef __TC_CBC_MODE_H__
+#define __TC_CBC_MODE_H__
+
+#include "aes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief CBC encryption procedure
+ * CBC encrypts inlen bytes of the in buffer into the out buffer
+ * using the encryption key schedule provided, prepends iv to out
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * out == NULL or
+ * in == NULL or
+ * ctr == NULL or
+ * sched == NULL or
+ * inlen == 0 or
+ * (inlen % TC_AES_BLOCK_SIZE) != 0 or
+ * (outlen % TC_AES_BLOCK_SIZE) != 0 or
+ * outlen != inlen + TC_AES_BLOCK_SIZE
+ * @note Assumes: - sched has been configured by aes_set_encrypt_key
+ * - iv contains a 16 byte random string
+ * - out buffer is large enough to hold the ciphertext + iv
+ * - out buffer is a contiguous buffer
+ * - in holds the plaintext and is a contiguous buffer
+ * - inlen gives the number of bytes in the in buffer
+ * @param out IN/OUT -- buffer to receive the ciphertext
+ * @param outlen IN -- length of ciphertext buffer in bytes
+ * @param in IN -- plaintext to encrypt
+ * @param inlen IN -- length of plaintext buffer in bytes
+ * @param iv IN -- the IV for the this encrypt/decrypt
+ * @param sched IN -- AES key schedule for this encrypt
+ */
+int tc_cbc_mode_encrypt(uint8_t *out, unsigned int outlen, const uint8_t *in,
+ unsigned int inlen, const uint8_t *iv,
+ const TCAesKeySched_t sched);
+
+/**
+ * @brief CBC decryption procedure
+ * CBC decrypts inlen bytes of the in buffer into the out buffer
+ * using the provided encryption key schedule
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * out == NULL or
+ * in == NULL or
+ * sched == NULL or
+ * inlen == 0 or
+ * outlen == 0 or
+ * (inlen % TC_AES_BLOCK_SIZE) != 0 or
+ * (outlen % TC_AES_BLOCK_SIZE) != 0 or
+ * outlen != inlen + TC_AES_BLOCK_SIZE
+ * @note Assumes:- in == iv + ciphertext, i.e. the iv and the ciphertext are
+ * contiguous. This allows for a very efficient decryption
+ * algorithm that would not otherwise be possible
+ * - sched was configured by aes_set_decrypt_key
+ * - out buffer is large enough to hold the decrypted plaintext
+ * and is a contiguous buffer
+ * - inlen gives the number of bytes in the in buffer
+ * @param out IN/OUT -- buffer to receive decrypted data
+ * @param outlen IN -- length of plaintext buffer in bytes
+ * @param in IN -- ciphertext to decrypt, including IV
+ * @param inlen IN -- length of ciphertext buffer in bytes
+ * @param iv IN -- the IV for the this encrypt/decrypt
+ * @param sched IN -- AES key schedule for this decrypt
+ *
+ */
+int tc_cbc_mode_decrypt(uint8_t *out, unsigned int outlen, const uint8_t *in,
+ unsigned int inlen, const uint8_t *iv,
+ const TCAesKeySched_t sched);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_CBC_MODE_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ccm_mode.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ccm_mode.h
new file mode 100644
index 00000000..fa80c8bf
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ccm_mode.h
@@ -0,0 +1,211 @@
+/* ccm_mode.h - TinyCrypt interface to a CCM mode implementation */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Interface to a CCM mode implementation.
+ *
+ * Overview: CCM (for "Counter with CBC-MAC") mode is a NIST approved mode of
+ * operation defined in SP 800-38C.
+ *
+ * TinyCrypt CCM implementation accepts:
+ *
+ * 1) Both non-empty payload and associated data (it encrypts and
+ * authenticates the payload and also authenticates the associated
+ * data);
+ * 2) Non-empty payload and empty associated data (it encrypts and
+ * authenticates the payload);
+ * 3) Non-empty associated data and empty payload (it degenerates to
+ * an authentication mode on the associated data).
+ *
+ * TinyCrypt CCM implementation accepts associated data of any length
+ * between 0 and (2^16 - 2^8) bytes.
+ *
+ * Security: The mac length parameter is an important parameter to estimate the
+ * security against collision attacks (that aim at finding different
+ * messages that produce the same authentication tag). TinyCrypt CCM
+ * implementation accepts any even integer between 4 and 16, as
+ * suggested in SP 800-38C.
+ *
+ * RFC-3610, which also specifies CCM, presents a few relevant
+ * security suggestions, such as: it is recommended for most
+ * applications to use a mac length greater than 8. Besides, the
+ * usage of the same nonce for two different messages which are
+ * encrypted with the same key destroys the security of CCM mode.
+ *
+ * Requires: AES-128
+ *
+ * Usage: 1) call tc_ccm_config to configure.
+ *
+ * 2) call tc_ccm_mode_encrypt to encrypt data and generate tag.
+ *
+ * 3) call tc_ccm_mode_decrypt to decrypt data and verify tag.
+ */
+
+#ifndef __TC_CCM_MODE_H__
+#define __TC_CCM_MODE_H__
+
+#include "aes.h"
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* max additional authenticated size in bytes: 2^16 - 2^8 = 65280 */
+#define TC_CCM_AAD_MAX_BYTES 0xff00
+
+/* max message size in bytes: 2^(8L) = 2^16 = 65536 */
+#define TC_CCM_PAYLOAD_MAX_BYTES 0x10000
+
+/* struct tc_ccm_mode_struct represents the state of a CCM computation */
+typedef struct tc_ccm_mode_struct {
+ TCAesKeySched_t sched; /* AES key schedule */
+ uint8_t *nonce; /* nonce required by CCM */
+ unsigned int mlen; /* mac length in bytes (parameter t in SP-800 38C) */
+} * TCCcmMode_t;
+
+/**
+ * @brief CCM configuration procedure
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * c == NULL or
+ * sched == NULL or
+ * nonce == NULL or
+ * mlen != {4, 6, 8, 10, 12, 16}
+ * @param c -- CCM state
+ * @param sched IN -- AES key schedule
+ * @param nonce IN - nonce
+ * @param nlen -- nonce length in bytes
+ * @param mlen -- mac length in bytes (parameter t in SP-800 38C)
+ */
+int tc_ccm_config(TCCcmMode_t c, TCAesKeySched_t sched, uint8_t *nonce,
+ unsigned int nlen, unsigned int mlen);
+
+/**
+ * @brief CCM tag generation and encryption procedure
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * out == NULL or
+ * c == NULL or
+ * ((plen > 0) and (payload == NULL)) or
+ * ((alen > 0) and (associated_data == NULL)) or
+ * (alen >= TC_CCM_AAD_MAX_BYTES) or
+ * (plen >= TC_CCM_PAYLOAD_MAX_BYTES) or
+ * (olen < plen + maclength)
+ *
+ * @param out OUT -- encrypted data
+ * @param olen IN -- output length in bytes
+ * @param associated_data IN -- associated data
+ * @param alen IN -- associated data length in bytes
+ * @param payload IN -- payload
+ * @param plen IN -- payload length in bytes
+ * @param c IN -- CCM state
+ *
+ * @note: out buffer should be at least (plen + c->mlen) bytes long.
+ *
+ * @note: The sequence b for encryption is formatted as follows:
+ * b = [FLAGS | nonce | counter ], where:
+ * FLAGS is 1 byte long
+ * nonce is 13 bytes long
+ * counter is 2 bytes long
+ * The byte FLAGS is composed by the following 8 bits:
+ * 0-2 bits: used to represent the value of q-1
+ * 3-7 btis: always 0's
+ *
+ * @note: The sequence b for authentication is formatted as follows:
+ * b = [FLAGS | nonce | length(mac length)], where:
+ * FLAGS is 1 byte long
+ * nonce is 13 bytes long
+ * length(mac length) is 2 bytes long
+ * The byte FLAGS is composed by the following 8 bits:
+ * 0-2 bits: used to represent the value of q-1
+ * 3-5 bits: mac length (encoded as: (mlen-2)/2)
+ * 6: Adata (0 if alen == 0, and 1 otherwise)
+ * 7: always 0
+ */
+int tc_ccm_generation_encryption(uint8_t *out, unsigned int olen,
+ const uint8_t *associated_data,
+ unsigned int alen, const uint8_t *payload,
+ unsigned int plen, TCCcmMode_t c);
+
+/**
+ * @brief CCM decryption and tag verification procedure
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * out == NULL or
+ * c == NULL or
+ * ((plen > 0) and (payload == NULL)) or
+ * ((alen > 0) and (associated_data == NULL)) or
+ * (alen >= TC_CCM_AAD_MAX_BYTES) or
+ * (plen >= TC_CCM_PAYLOAD_MAX_BYTES) or
+ * (olen < plen - c->mlen)
+ *
+ * @param out OUT -- decrypted data
+ * @param associated_data IN -- associated data
+ * @param alen IN -- associated data length in bytes
+ * @param payload IN -- payload
+ * @param plen IN -- payload length in bytes
+ * @param c IN -- CCM state
+ *
+ * @note: out buffer should be at least (plen - c->mlen) bytes long.
+ *
+ * @note: The sequence b for encryption is formatted as follows:
+ * b = [FLAGS | nonce | counter ], where:
+ * FLAGS is 1 byte long
+ * nonce is 13 bytes long
+ * counter is 2 bytes long
+ * The byte FLAGS is composed by the following 8 bits:
+ * 0-2 bits: used to represent the value of q-1
+ * 3-7 btis: always 0's
+ *
+ * @note: The sequence b for authentication is formatted as follows:
+ * b = [FLAGS | nonce | length(mac length)], where:
+ * FLAGS is 1 byte long
+ * nonce is 13 bytes long
+ * length(mac length) is 2 bytes long
+ * The byte FLAGS is composed by the following 8 bits:
+ * 0-2 bits: used to represent the value of q-1
+ * 3-5 bits: mac length (encoded as: (mlen-2)/2)
+ * 6: Adata (0 if alen == 0, and 1 otherwise)
+ * 7: always 0
+ */
+int tc_ccm_decryption_verification(uint8_t *out, unsigned int olen,
+ const uint8_t *associated_data,
+ unsigned int alen, const uint8_t *payload, unsigned int plen,
+ TCCcmMode_t c);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_CCM_MODE_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/cmac_mode.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/cmac_mode.h
new file mode 100644
index 00000000..5240c87e
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/cmac_mode.h
@@ -0,0 +1,194 @@
+/* cmac_mode.h -- interface to a CMAC implementation */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Interface to a CMAC implementation.
+ *
+ * Overview: CMAC is defined NIST in SP 800-38B, and is the standard algorithm
+ * for computing a MAC using a block cipher. It can compute the MAC
+ * for a byte string of any length. It is distinguished from CBC-MAC
+ * in the processing of the final message block; CMAC uses a
+ * different technique to compute the final message block is full
+ * size or only partial, while CBC-MAC uses the same technique for
+ * both. This difference permits CMAC to be applied to variable
+ * length messages, while all messages authenticated by CBC-MAC must
+ * be the same length.
+ *
+ * Security: AES128-CMAC mode of operation offers 64 bits of security against
+ * collision attacks. Note however that an external attacker cannot
+ * generate the tags him/herself without knowing the MAC key. In this
+ * sense, to attack the collision property of AES128-CMAC, an
+ * external attacker would need the cooperation of the legal user to
+ * produce an exponentially high number of tags (e.g. 2^64) to
+ * finally be able to look for collisions and benefit from them. As
+ * an extra precaution, the current implementation allows to at most
+ * 2^48 calls to the tc_cmac_update function before re-calling
+ * tc_cmac_setup (allowing a new key to be set), as suggested in
+ * Appendix B of SP 800-38B.
+ *
+ * Requires: AES-128
+ *
+ * Usage: This implementation provides a "scatter-gather" interface, so that
+ * the CMAC value can be computed incrementally over a message
+ * scattered in different segments throughout memory. Experience shows
+ * this style of interface tends to minimize the burden of programming
+ * correctly. Like all symmetric key operations, it is session
+ * oriented.
+ *
+ * To begin a CMAC session, use tc_cmac_setup to initialize a struct
+ * tc_cmac_struct with encryption key and buffer. Our implementation
+ * always assume that the AES key to be the same size as the block
+ * cipher block size. Once setup, this data structure can be used for
+ * many CMAC computations.
+ *
+ * Once the state has been setup with a key, computing the CMAC of
+ * some data requires three steps:
+ *
+ * (1) first use tc_cmac_init to initialize a new CMAC computation.
+ * (2) next mix all of the data into the CMAC computation state using
+ * tc_cmac_update. If all of the data resides in a single data
+ * segment then only one tc_cmac_update call is needed; if data
+ * is scattered throughout memory in n data segments, then n calls
+ * will be needed. CMAC IS ORDER SENSITIVE, to be able to detect
+ * attacks that swap bytes, so the order in which data is mixed
+ * into the state is critical!
+ * (3) Once all of the data for a message has been mixed, use
+ * tc_cmac_final to compute the CMAC tag value.
+ *
+ * Steps (1)-(3) can be repeated as many times as you want to CMAC
+ * multiple messages. A practical limit is 2^48 1K messages before you
+ * have to change the key.
+ *
+ * Once you are done computing CMAC with a key, it is a good idea to
+ * destroy the state so an attacker cannot recover the key; use
+ * tc_cmac_erase to accomplish this.
+ */
+
+#ifndef __TC_CMAC_MODE_H__
+#define __TC_CMAC_MODE_H__
+
+#include
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* padding for last message block */
+#define TC_CMAC_PADDING 0x80
+
+/* struct tc_cmac_struct represents the state of a CMAC computation */
+typedef struct tc_cmac_struct {
+ /* initialization vector */
+ uint8_t iv[TC_AES_BLOCK_SIZE];
+ /* used if message length is a multiple of block_size bytes */
+ uint8_t K1[TC_AES_BLOCK_SIZE];
+ /* used if message length isn't a multiple block_size bytes */
+ uint8_t K2[TC_AES_BLOCK_SIZE];
+ /* where to put bytes that didn't fill a block */
+ uint8_t leftover[TC_AES_BLOCK_SIZE];
+ /* identifies the encryption key */
+ unsigned int keyid;
+ /* next available leftover location */
+ unsigned int leftover_offset;
+ /* AES key schedule */
+ TCAesKeySched_t sched;
+ /* calls to tc_cmac_update left before re-key */
+ uint64_t countdown;
+} * TCCmacState_t;
+
+/**
+ * @brief Configures the CMAC state to use the given AES key
+ * @return returns TC_CRYPTO_SUCCESS (1) after having configured the CMAC state
+ * returns TC_CRYPTO_FAIL (0) if:
+ * s == NULL or
+ * key == NULL
+ *
+ * @param s IN/OUT -- the state to set up
+ * @param key IN -- the key to use
+ * @param sched IN -- AES key schedule
+ */
+int tc_cmac_setup(TCCmacState_t s, const uint8_t *key,
+ TCAesKeySched_t sched);
+
+/**
+ * @brief Erases the CMAC state
+ * @return returns TC_CRYPTO_SUCCESS (1) after having configured the CMAC state
+ * returns TC_CRYPTO_FAIL (0) if:
+ * s == NULL
+ *
+ * @param s IN/OUT -- the state to erase
+ */
+int tc_cmac_erase(TCCmacState_t s);
+
+/**
+ * @brief Initializes a new CMAC computation
+ * @return returns TC_CRYPTO_SUCCESS (1) after having initialized the CMAC state
+ * returns TC_CRYPTO_FAIL (0) if:
+ * s == NULL
+ *
+ * @param s IN/OUT -- the state to initialize
+ */
+int tc_cmac_init(TCCmacState_t s);
+
+/**
+ * @brief Incrementally computes CMAC over the next data segment
+ * @return returns TC_CRYPTO_SUCCESS (1) after successfully updating the CMAC state
+ * returns TC_CRYPTO_FAIL (0) if:
+ * s == NULL or
+ * if data == NULL when dlen > 0
+ *
+ * @param s IN/OUT -- the CMAC state
+ * @param data IN -- the next data segment to MAC
+ * @param dlen IN -- the length of data in bytes
+ */
+int tc_cmac_update(TCCmacState_t s, const uint8_t *data, size_t dlen);
+
+/**
+ * @brief Generates the tag from the CMAC state
+ * @return returns TC_CRYPTO_SUCCESS (1) after successfully generating the tag
+ * returns TC_CRYPTO_FAIL (0) if:
+ * tag == NULL or
+ * s == NULL
+ *
+ * @param tag OUT -- the CMAC tag
+ * @param s IN -- CMAC state
+ */
+int tc_cmac_final(uint8_t *tag, TCCmacState_t s);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_CMAC_MODE_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/constants.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/constants.h
new file mode 100644
index 00000000..6b82c47a
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/constants.h
@@ -0,0 +1,61 @@
+/* constants.h - TinyCrypt interface to constants */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief -- Interface to constants.
+ *
+ */
+
+#ifndef __TC_CONSTANTS_H__
+#define __TC_CONSTANTS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include
+
+#ifndef NULL
+#define NULL ((void *)0)
+#endif
+
+#define TC_CRYPTO_SUCCESS 1
+#define TC_CRYPTO_FAIL 0
+
+#define TC_ZERO_BYTE 0x00
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_CONSTANTS_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ctr_mode.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ctr_mode.h
new file mode 100644
index 00000000..d994e3a7
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ctr_mode.h
@@ -0,0 +1,108 @@
+/* ctr_mode.h - TinyCrypt interface to CTR mode */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Interface to CTR mode.
+ *
+ * Overview: CTR (pronounced "counter") mode is a NIST approved mode of
+ * operation defined in SP 800-38a. It can be used with any
+ * block cipher to provide confidentiality of strings of any
+ * length. TinyCrypt hard codes AES128 as the block cipher.
+ *
+ * Security: CTR mode achieves confidentiality only if the counter value is
+ * never reused with a same encryption key. If the counter is
+ * repeated, than an adversary might be able to defeat the scheme.
+ *
+ * A usual method to ensure different counter values refers to
+ * initialize the counter in a given value (0, for example) and
+ * increases it every time a new block is enciphered. This naturally
+ * leaves to a limitation on the number q of blocks that can be
+ * enciphered using a same key: q < 2^(counter size).
+ *
+ * TinyCrypt uses a counter of 32 bits. This means that after 2^32
+ * block encryptions, the counter will be reused (thus losing CBC
+ * security). 2^32 block encryptions should be enough for most of
+ * applications targeting constrained devices. Applications intended
+ * to encrypt a larger number of blocks must replace the key after
+ * 2^32 block encryptions.
+ *
+ * CTR mode provides NO data integrity.
+ *
+ * Requires: AES-128
+ *
+ * Usage: 1) call tc_ctr_mode to process the data to encrypt/decrypt.
+ *
+ */
+
+#ifndef __TC_CTR_MODE_H__
+#define __TC_CTR_MODE_H__
+
+#include "aes.h"
+#include "constants.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief CTR mode encryption/decryption procedure.
+ * CTR mode encrypts (or decrypts) inlen bytes from in buffer into out buffer
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * out == NULL or
+ * in == NULL or
+ * ctr == NULL or
+ * sched == NULL or
+ * inlen == 0 or
+ * outlen == 0 or
+ * inlen != outlen
+ * @note Assumes:- The current value in ctr has NOT been used with sched
+ * - out points to inlen bytes
+ * - in points to inlen bytes
+ * - ctr is an integer counter in littleEndian format
+ * - sched was initialized by aes_set_encrypt_key
+ * @param out OUT -- produced ciphertext (plaintext)
+ * @param outlen IN -- length of ciphertext buffer in bytes
+ * @param in IN -- data to encrypt (or decrypt)
+ * @param inlen IN -- length of input data in bytes
+ * @param ctr IN/OUT -- the current counter value
+ * @param sched IN -- an initialized AES key schedule
+ */
+int tc_ctr_mode(uint8_t *out, unsigned int outlen, const uint8_t *in,
+ unsigned int inlen, uint8_t *ctr, const TCAesKeySched_t sched);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_CTR_MODE_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ctr_prng.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ctr_prng.h
new file mode 100644
index 00000000..3ebdb543
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ctr_prng.h
@@ -0,0 +1,165 @@
+/* ctr_prng.h - TinyCrypt interface to a CTR-PRNG implementation */
+
+/*
+ * Copyright (c) 2016, Chris Morrison
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Interface to a CTR-PRNG implementation.
+ *
+ * Overview: A pseudo-random number generator (PRNG) generates a sequence
+ * of numbers that have a distribution close to the one expected
+ * for a sequence of truly random numbers. The NIST Special
+ * Publication 800-90A specifies several mechanisms to generate
+ * sequences of pseudo random numbers, including the CTR-PRNG one
+ * which is based on AES. TinyCrypt implements CTR-PRNG with
+ * AES-128.
+ *
+ * Security: A cryptographically secure PRNG depends on the existence of an
+ * entropy source to provide a truly random seed as well as the
+ * security of the primitives used as the building blocks (AES-128
+ * in this instance).
+ *
+ * Requires: - AES-128
+ *
+ * Usage: 1) call tc_ctr_prng_init to seed the prng context
+ *
+ * 2) call tc_ctr_prng_reseed to mix in additional entropy into
+ * the prng context
+ *
+ * 3) call tc_ctr_prng_generate to output the pseudo-random data
+ *
+ * 4) call tc_ctr_prng_uninstantiate to zero out the prng context
+ */
+
+#ifndef __TC_CTR_PRNG_H__
+#define __TC_CTR_PRNG_H__
+
+#include "aes.h"
+
+#define TC_CTR_PRNG_RESEED_REQ -1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+ /* updated each time another BLOCKLEN_BYTES bytes are produced */
+ uint8_t V[TC_AES_BLOCK_SIZE];
+
+ /* updated whenever the PRNG is reseeded */
+ struct tc_aes_key_sched_struct key;
+
+ /* number of requests since initialization/reseeding */
+ uint64_t reseedCount;
+} TCCtrPrng_t;
+
+/**
+ * @brief CTR-PRNG initialization procedure
+ * Initializes prng context with entropy and personalization string (if any)
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * ctx == NULL,
+ * entropy == NULL,
+ * entropyLen < (TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE)
+ * @note Only the first (TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE) bytes of
+ * both the entropy and personalization inputs are used -
+ * supplying additional bytes has no effect.
+ * @param ctx IN/OUT -- the PRNG context to initialize
+ * @param entropy IN -- entropy used to seed the PRNG
+ * @param entropyLen IN -- entropy length in bytes
+ * @param personalization IN -- personalization string used to seed the PRNG
+ * (may be null)
+ * @param plen IN -- personalization length in bytes
+ *
+ */
+int tc_ctr_prng_init(TCCtrPrng_t *const ctx,
+ uint8_t const *const entropy,
+ unsigned int entropyLen,
+ uint8_t const *const personalization,
+ unsigned int pLen);
+
+/**
+ * @brief CTR-PRNG reseed procedure
+ * Mixes entropy and additional_input into the prng context
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * ctx == NULL,
+ * entropy == NULL,
+ * entropylen < (TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE)
+ * @note It is better to reseed an existing prng context rather than
+ * re-initialise, so that any existing entropy in the context is
+ * presereved. This offers some protection against undetected failures
+ * of the entropy source.
+ * @note Assumes tc_ctr_prng_init has been called for ctx
+ * @param ctx IN/OUT -- the PRNG state
+ * @param entropy IN -- entropy to mix into the prng
+ * @param entropylen IN -- length of entropy in bytes
+ * @param additional_input IN -- additional input to the prng (may be null)
+ * @param additionallen IN -- additional input length in bytes
+ */
+int tc_ctr_prng_reseed(TCCtrPrng_t *const ctx,
+ uint8_t const *const entropy,
+ unsigned int entropyLen,
+ uint8_t const *const additional_input,
+ unsigned int additionallen);
+
+/**
+ * @brief CTR-PRNG generate procedure
+ * Generates outlen pseudo-random bytes into out buffer, updates prng
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CTR_PRNG_RESEED_REQ (-1) if a reseed is needed
+ * returns TC_CRYPTO_FAIL (0) if:
+ * ctx == NULL,
+ * out == NULL,
+ * outlen >= 2^16
+ * @note Assumes tc_ctr_prng_init has been called for ctx
+ * @param ctx IN/OUT -- the PRNG context
+ * @param additional_input IN -- additional input to the prng (may be null)
+ * @param additionallen IN -- additional input length in bytes
+ * @param out IN/OUT -- buffer to receive output
+ * @param outlen IN -- size of out buffer in bytes
+ */
+int tc_ctr_prng_generate(TCCtrPrng_t *const ctx,
+ uint8_t const *const additional_input,
+ unsigned int additionallen,
+ uint8_t *const out,
+ unsigned int outlen);
+
+/**
+ * @brief CTR-PRNG uninstantiate procedure
+ * Zeroes the internal state of the supplied prng context
+ * @return none
+ * @param ctx IN/OUT -- the PRNG context
+ */
+void tc_ctr_prng_uninstantiate(TCCtrPrng_t *const ctx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_CTR_PRNG_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc.h
new file mode 100644
index 00000000..efe8ff47
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc.h
@@ -0,0 +1,537 @@
+/* ecc.h - TinyCrypt interface to common ECC functions */
+
+/* Copyright (c) 2014, Kenneth MacKay
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief -- Interface to common ECC functions.
+ *
+ * Overview: This software is an implementation of common functions
+ * necessary to elliptic curve cryptography. This implementation uses
+ * curve NIST p-256.
+ *
+ * Security: The curve NIST p-256 provides approximately 128 bits of security.
+ *
+ */
+
+#ifndef __TC_UECC_H__
+#define __TC_UECC_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Word size (4 bytes considering 32-bits architectures) */
+#define uECC_WORD_SIZE 4
+
+/* setting max number of calls to prng: */
+#ifndef uECC_RNG_MAX_TRIES
+#define uECC_RNG_MAX_TRIES 64
+#endif
+
+/* defining data types to store word and bit counts: */
+typedef int8_t wordcount_t;
+typedef int16_t bitcount_t;
+/* defining data type for comparison result: */
+typedef int8_t cmpresult_t;
+/* defining data type to store ECC coordinate/point in 32bits words: */
+typedef unsigned int uECC_word_t;
+/* defining data type to store an ECC coordinate/point in 64bits words: */
+typedef uint64_t uECC_dword_t;
+
+/* defining masks useful for ecc computations: */
+#define HIGH_BIT_SET 0x80000000
+#define uECC_WORD_BITS 32
+#define uECC_WORD_BITS_SHIFT 5
+#define uECC_WORD_BITS_MASK 0x01F
+
+/* Number of words of 32 bits to represent an element of the the curve p-256: */
+#define NUM_ECC_WORDS 8
+/* Number of bytes to represent an element of the the curve p-256: */
+#define NUM_ECC_BYTES (uECC_WORD_SIZE * NUM_ECC_WORDS)
+
+/* structure that represents an elliptic curve (e.g. p256):*/
+struct uECC_Curve_t;
+typedef const struct uECC_Curve_t *uECC_Curve;
+struct uECC_Curve_t {
+ wordcount_t num_words;
+ wordcount_t num_bytes;
+ bitcount_t num_n_bits;
+ uECC_word_t p[NUM_ECC_WORDS];
+ uECC_word_t n[NUM_ECC_WORDS];
+ uECC_word_t G[NUM_ECC_WORDS * 2];
+ uECC_word_t b[NUM_ECC_WORDS];
+ void (*double_jacobian)(uECC_word_t *X1, uECC_word_t *Y1, uECC_word_t *Z1,
+ uECC_Curve curve);
+ void (*x_side)(uECC_word_t *result, const uECC_word_t *x, uECC_Curve curve);
+ void (*mmod_fast)(uECC_word_t *result, uECC_word_t *product);
+};
+
+/*
+ * @brief computes doubling of point ion jacobian coordinates, in place.
+ * @param X1 IN/OUT -- x coordinate
+ * @param Y1 IN/OUT -- y coordinate
+ * @param Z1 IN/OUT -- z coordinate
+ * @param curve IN -- elliptic curve
+ */
+void double_jacobian_default(uECC_word_t *X1, uECC_word_t *Y1,
+ uECC_word_t *Z1, uECC_Curve curve);
+
+/*
+ * @brief Computes x^3 + ax + b. result must not overlap x.
+ * @param result OUT -- x^3 + ax + b
+ * @param x IN -- value of x
+ * @param curve IN -- elliptic curve
+ */
+void x_side_default(uECC_word_t *result, const uECC_word_t *x,
+ uECC_Curve curve);
+
+/*
+ * @brief Computes result = product % curve_p
+ * from http://www.nsa.gov/ia/_files/nist-routines.pdf
+ * @param result OUT -- product % curve_p
+ * @param product IN -- value to be reduced mod curve_p
+ */
+void vli_mmod_fast_secp256r1(unsigned int *result, unsigned int *product);
+
+/* Bytes to words ordering: */
+#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) 0x##d##c##b##a, 0x##h##g##f##e
+#define BYTES_TO_WORDS_4(a, b, c, d) 0x##d##c##b##a
+#define BITS_TO_WORDS(num_bits) \
+ ((num_bits + ((uECC_WORD_SIZE * 8) - 1)) / (uECC_WORD_SIZE * 8))
+#define BITS_TO_BYTES(num_bits) ((num_bits + 7) / 8)
+
+/* definition of curve NIST p-256: */
+static const struct uECC_Curve_t curve_secp256r1 = {
+ NUM_ECC_WORDS,
+ NUM_ECC_BYTES,
+ 256,
+ /* num_n_bits */ { BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF), BYTES_TO_WORDS_8(FF, FF, FF, FF, 00, 00, 00, 00), BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00), BYTES_TO_WORDS_8(01, 00, 00, 00, FF, FF, FF, FF) },
+ { BYTES_TO_WORDS_8(51, 25, 63, FC, C2, CA, B9, F3),
+ BYTES_TO_WORDS_8(84, 9E, 17, A7, AD, FA, E6, BC),
+ BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),
+ BYTES_TO_WORDS_8(00, 00, 00, 00, FF, FF, FF, FF) },
+ { BYTES_TO_WORDS_8(96, C2, 98, D8, 45, 39, A1, F4),
+ BYTES_TO_WORDS_8(A0, 33, EB, 2D, 81, 7D, 03, 77),
+ BYTES_TO_WORDS_8(F2, 40, A4, 63, E5, E6, BC, F8),
+ BYTES_TO_WORDS_8(47, 42, 2C, E1, F2, D1, 17, 6B),
+
+ BYTES_TO_WORDS_8(F5, 51, BF, 37, 68, 40, B6, CB),
+ BYTES_TO_WORDS_8(CE, 5E, 31, 6B, 57, 33, CE, 2B),
+ BYTES_TO_WORDS_8(16, 9E, 0F, 7C, 4A, EB, E7, 8E),
+ BYTES_TO_WORDS_8(9B, 7F, 1A, FE, E2, 42, E3, 4F) },
+ { BYTES_TO_WORDS_8(4B, 60, D2, 27, 3E, 3C, CE, 3B),
+ BYTES_TO_WORDS_8(F6, B0, 53, CC, B0, 06, 1D, 65),
+ BYTES_TO_WORDS_8(BC, 86, 98, 76, 55, BD, EB, B3),
+ BYTES_TO_WORDS_8(E7, 93, 3A, AA, D8, 35, C6, 5A) },
+ &double_jacobian_default,
+ &x_side_default,
+ &vli_mmod_fast_secp256r1
+};
+
+uECC_Curve uECC_secp256r1(void);
+
+/*
+ * @brief Generates a random integer in the range 0 < random < top.
+ * Both random and top have num_words words.
+ * @param random OUT -- random integer in the range 0 < random < top
+ * @param top IN -- upper limit
+ * @param num_words IN -- number of words
+ * @return a random integer in the range 0 < random < top
+ */
+int uECC_generate_random_int(uECC_word_t *random, const uECC_word_t *top,
+ wordcount_t num_words);
+
+/* uECC_RNG_Function type
+ * The RNG function should fill 'size' random bytes into 'dest'. It should
+ * return 1 if 'dest' was filled with random data, or 0 if the random data could
+ * not be generated. The filled-in values should be either truly random, or from
+ * a cryptographically-secure PRNG.
+ *
+ * A correctly functioning RNG function must be set (using uECC_set_rng())
+ * before calling uECC_make_key() or uECC_sign().
+ *
+ * Setting a correctly functioning RNG function improves the resistance to
+ * side-channel attacks for uECC_shared_secret().
+ *
+ * A correct RNG function is set by default. If you are building on another
+ * POSIX-compliant system that supports /dev/random or /dev/urandom, you can
+ * define uECC_POSIX to use the predefined RNG.
+ */
+typedef int (*uECC_RNG_Function)(uint8_t *dest, unsigned int size);
+
+/*
+ * @brief Set the function that will be used to generate random bytes. The RNG
+ * function should return 1 if the random data was generated, or 0 if the random
+ * data could not be generated.
+ *
+ * @note On platforms where there is no predefined RNG function, this must be
+ * called before uECC_make_key() or uECC_sign() are used.
+ *
+ * @param rng_function IN -- function that will be used to generate random bytes
+ */
+void uECC_set_rng(uECC_RNG_Function rng_function);
+
+/*
+ * @brief provides current uECC_RNG_Function.
+ * @return Returns the function that will be used to generate random bytes.
+ */
+uECC_RNG_Function uECC_get_rng(void);
+
+/*
+ * @brief computes the size of a private key for the curve in bytes.
+ * @param curve IN -- elliptic curve
+ * @return size of a private key for the curve in bytes.
+ */
+int uECC_curve_private_key_size(uECC_Curve curve);
+
+/*
+ * @brief computes the size of a public key for the curve in bytes.
+ * @param curve IN -- elliptic curve
+ * @return the size of a public key for the curve in bytes.
+ */
+int uECC_curve_public_key_size(uECC_Curve curve);
+
+/*
+ * @brief Compute the corresponding public key for a private key.
+ * @param private_key IN -- The private key to compute the public key for
+ * @param public_key OUT -- Will be filled in with the corresponding public key
+ * @param curve
+ * @return Returns 1 if key was computed successfully, 0 if an error occurred.
+ */
+int uECC_compute_public_key(const uint8_t *private_key,
+ uint8_t *public_key, uECC_Curve curve);
+
+/*
+ * @brief Compute public-key.
+ * @return corresponding public-key.
+ * @param result OUT -- public-key
+ * @param private_key IN -- private-key
+ * @param curve IN -- elliptic curve
+ */
+uECC_word_t EccPoint_compute_public_key(uECC_word_t *result,
+ uECC_word_t *private_key, uECC_Curve curve);
+
+/*
+ * @brief Regularize the bitcount for the private key so that attackers cannot
+ * use a side channel attack to learn the number of leading zeros.
+ * @return Regularized k
+ * @param k IN -- private-key
+ * @param k0 IN/OUT -- regularized k
+ * @param k1 IN/OUT -- regularized k
+ * @param curve IN -- elliptic curve
+ */
+uECC_word_t regularize_k(const uECC_word_t *const k, uECC_word_t *k0,
+ uECC_word_t *k1, uECC_Curve curve);
+
+/*
+ * @brief Point multiplication algorithm using Montgomery's ladder with co-Z
+ * coordinates. See http://eprint.iacr.org/2011/338.pdf.
+ * @note Result may overlap point.
+ * @param result OUT -- returns scalar*point
+ * @param point IN -- elliptic curve point
+ * @param scalar IN -- scalar
+ * @param initial_Z IN -- initial value for z
+ * @param num_bits IN -- number of bits in scalar
+ * @param curve IN -- elliptic curve
+ */
+void EccPoint_mult(uECC_word_t *result, const uECC_word_t *point,
+ const uECC_word_t *scalar, const uECC_word_t *initial_Z,
+ bitcount_t num_bits, uECC_Curve curve);
+
+/*
+ * @brief Constant-time comparison to zero - secure way to compare long integers
+ * @param vli IN -- very long integer
+ * @param num_words IN -- number of words in the vli
+ * @return 1 if vli == 0, 0 otherwise.
+ */
+uECC_word_t uECC_vli_isZero(const uECC_word_t *vli, wordcount_t num_words);
+
+/*
+ * @brief Check if 'point' is the point at infinity
+ * @param point IN -- elliptic curve point
+ * @param curve IN -- elliptic curve
+ * @return if 'point' is the point at infinity, 0 otherwise.
+ */
+uECC_word_t EccPoint_isZero(const uECC_word_t *point, uECC_Curve curve);
+
+/*
+ * @brief computes the sign of left - right, in constant time.
+ * @param left IN -- left term to be compared
+ * @param right IN -- right term to be compared
+ * @param num_words IN -- number of words
+ * @return the sign of left - right
+ */
+cmpresult_t uECC_vli_cmp(const uECC_word_t *left, const uECC_word_t *right,
+ wordcount_t num_words);
+
+/*
+ * @brief computes sign of left - right, not in constant time.
+ * @note should not be used if inputs are part of a secret
+ * @param left IN -- left term to be compared
+ * @param right IN -- right term to be compared
+ * @param num_words IN -- number of words
+ * @return the sign of left - right
+ */
+cmpresult_t uECC_vli_cmp_unsafe(const uECC_word_t *left, const uECC_word_t *right,
+ wordcount_t num_words);
+
+/*
+ * @brief Computes result = (left - right) % mod.
+ * @note Assumes that (left < mod) and (right < mod), and that result does not
+ * overlap mod.
+ * @param result OUT -- (left - right) % mod
+ * @param left IN -- leftright term in modular subtraction
+ * @param right IN -- right term in modular subtraction
+ * @param mod IN -- mod
+ * @param num_words IN -- number of words
+ */
+void uECC_vli_modSub(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, const uECC_word_t *mod,
+ wordcount_t num_words);
+
+/*
+ * @brief Computes P' = (x1', y1', Z3), P + Q = (x3, y3, Z3) or
+ * P => P', Q => P + Q
+ * @note assumes Input P = (x1, y1, Z), Q = (x2, y2, Z)
+ * @param X1 IN -- x coordinate of P
+ * @param Y1 IN -- y coordinate of P
+ * @param X2 IN -- x coordinate of Q
+ * @param Y2 IN -- y coordinate of Q
+ * @param curve IN -- elliptic curve
+ */
+void XYcZ_add(uECC_word_t *X1, uECC_word_t *Y1, uECC_word_t *X2,
+ uECC_word_t *Y2, uECC_Curve curve);
+
+/*
+ * @brief Computes (x1 * z^2, y1 * z^3)
+ * @param X1 IN -- previous x1 coordinate
+ * @param Y1 IN -- previous y1 coordinate
+ * @param Z IN -- z value
+ * @param curve IN -- elliptic curve
+ */
+void apply_z(uECC_word_t *X1, uECC_word_t *Y1, const uECC_word_t *const Z,
+ uECC_Curve curve);
+
+/*
+ * @brief Check if bit is set.
+ * @return Returns nonzero if bit 'bit' of vli is set.
+ * @warning It is assumed that the value provided in 'bit' is within the
+ * boundaries of the word-array 'vli'.
+ * @note The bit ordering layout assumed for vli is: {31, 30, ..., 0},
+ * {63, 62, ..., 32}, {95, 94, ..., 64}, {127, 126,..., 96} for a vli consisting
+ * of 4 uECC_word_t elements.
+ */
+uECC_word_t uECC_vli_testBit(const uECC_word_t *vli, bitcount_t bit);
+
+/*
+ * @brief Computes result = product % mod, where product is 2N words long.
+ * @param result OUT -- product % mod
+ * @param mod IN -- module
+ * @param num_words IN -- number of words
+ * @warning Currently only designed to work for curve_p or curve_n.
+ */
+void uECC_vli_mmod(uECC_word_t *result, uECC_word_t *product,
+ const uECC_word_t *mod, wordcount_t num_words);
+
+/*
+ * @brief Computes modular product (using curve->mmod_fast)
+ * @param result OUT -- (left * right) mod % curve_p
+ * @param left IN -- left term in product
+ * @param right IN -- right term in product
+ * @param curve IN -- elliptic curve
+ */
+void uECC_vli_modMult_fast(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, uECC_Curve curve);
+
+/*
+ * @brief Computes result = left - right.
+ * @note Can modify in place.
+ * @param result OUT -- left - right
+ * @param left IN -- left term in subtraction
+ * @param right IN -- right term in subtraction
+ * @param num_words IN -- number of words
+ * @return borrow
+ */
+uECC_word_t uECC_vli_sub(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, wordcount_t num_words);
+
+/*
+ * @brief Constant-time comparison function(secure way to compare long ints)
+ * @param left IN -- left term in comparison
+ * @param right IN -- right term in comparison
+ * @param num_words IN -- number of words
+ * @return Returns 0 if left == right, 1 otherwise.
+ */
+uECC_word_t uECC_vli_equal(const uECC_word_t *left, const uECC_word_t *right,
+ wordcount_t num_words);
+
+/*
+ * @brief Computes (left * right) % mod
+ * @param result OUT -- (left * right) % mod
+ * @param left IN -- left term in product
+ * @param right IN -- right term in product
+ * @param mod IN -- mod
+ * @param num_words IN -- number of words
+ */
+void uECC_vli_modMult(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, const uECC_word_t *mod,
+ wordcount_t num_words);
+
+/*
+ * @brief Computes (1 / input) % mod
+ * @note All VLIs are the same size.
+ * @note See "Euclid's GCD to Montgomery Multiplication to the Great Divide"
+ * @param result OUT -- (1 / input) % mod
+ * @param input IN -- value to be modular inverted
+ * @param mod IN -- mod
+ * @param num_words -- number of words
+ */
+void uECC_vli_modInv(uECC_word_t *result, const uECC_word_t *input,
+ const uECC_word_t *mod, wordcount_t num_words);
+
+/*
+ * @brief Sets dest = src.
+ * @param dest OUT -- destination buffer
+ * @param src IN -- origin buffer
+ * @param num_words IN -- number of words
+ */
+void uECC_vli_set(uECC_word_t *dest, const uECC_word_t *src,
+ wordcount_t num_words);
+
+/*
+ * @brief Computes (left + right) % mod.
+ * @note Assumes that (left < mod) and right < mod), and that result does not
+ * overlap mod.
+ * @param result OUT -- (left + right) % mod.
+ * @param left IN -- left term in addition
+ * @param right IN -- right term in addition
+ * @param mod IN -- mod
+ * @param num_words IN -- number of words
+ */
+void uECC_vli_modAdd(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, const uECC_word_t *mod,
+ wordcount_t num_words);
+
+/*
+ * @brief Counts the number of bits required to represent vli.
+ * @param vli IN -- very long integer
+ * @param max_words IN -- number of words
+ * @return number of bits in given vli
+ */
+bitcount_t uECC_vli_numBits(const uECC_word_t *vli,
+ const wordcount_t max_words);
+
+/*
+ * @brief Erases (set to 0) vli
+ * @param vli IN -- very long integer
+ * @param num_words IN -- number of words
+ */
+void uECC_vli_clear(uECC_word_t *vli, wordcount_t num_words);
+
+/*
+ * @brief check if it is a valid point in the curve
+ * @param point IN -- point to be checked
+ * @param curve IN -- elliptic curve
+ * @return 0 if point is valid
+ * @exception returns -1 if it is a point at infinity
+ * @exception returns -2 if x or y is smaller than p,
+ * @exception returns -3 if y^2 != x^3 + ax + b.
+ */
+int uECC_valid_point(const uECC_word_t *point, uECC_Curve curve);
+
+/*
+ * @brief Check if a public key is valid.
+ * @param public_key IN -- The public key to be checked.
+ * @return returns 0 if the public key is valid
+ * @exception returns -1 if it is a point at infinity
+ * @exception returns -2 if x or y is smaller than p,
+ * @exception returns -3 if y^2 != x^3 + ax + b.
+ * @exception returns -4 if public key is the group generator.
+ *
+ * @note Note that you are not required to check for a valid public key before
+ * using any other uECC functions. However, you may wish to avoid spending CPU
+ * time computing a shared secret or verifying a signature using an invalid
+ * public key.
+ */
+int uECC_valid_public_key(const uint8_t *public_key, uECC_Curve curve);
+
+/*
+ * @brief Converts an integer in uECC native format to big-endian bytes.
+ * @param bytes OUT -- bytes representation
+ * @param num_bytes IN -- number of bytes
+ * @param native IN -- uECC native representation
+ */
+void uECC_vli_nativeToBytes(uint8_t *bytes, int num_bytes,
+ const unsigned int *native);
+
+/*
+ * @brief Converts big-endian bytes to an integer in uECC native format.
+ * @param native OUT -- uECC native representation
+ * @param bytes IN -- bytes representation
+ * @param num_bytes IN -- number of bytes
+ */
+void uECC_vli_bytesToNative(unsigned int *native, const uint8_t *bytes,
+ int num_bytes);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_UECC_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc_dh.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc_dh.h
new file mode 100644
index 00000000..0ce0f44c
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc_dh.h
@@ -0,0 +1,131 @@
+/* ecc_dh.h - TinyCrypt interface to EC-DH implementation */
+
+/*
+ * Copyright (c) 2014, Kenneth MacKay
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief -- Interface to EC-DH implementation.
+ *
+ * Overview: This software is an implementation of EC-DH. This implementation
+ * uses curve NIST p-256.
+ *
+ * Security: The curve NIST p-256 provides approximately 128 bits of security.
+ */
+
+#ifndef __TC_ECC_DH_H__
+#define __TC_ECC_DH_H__
+
+#include "ecc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Create a public/private key pair.
+ * @return returns TC_CRYPTO_SUCCESS (1) if the key pair was generated successfully
+ * returns TC_CRYPTO_FAIL (0) if error while generating key pair
+ *
+ * @param p_public_key OUT -- Will be filled in with the public key. Must be at
+ * least 2 * the curve size (in bytes) long. For curve secp256r1, p_public_key
+ * must be 64 bytes long.
+ * @param p_private_key OUT -- Will be filled in with the private key. Must be as
+ * long as the curve order (for secp256r1, p_private_key must be 32 bytes long).
+ *
+ * @note side-channel countermeasure: algorithm strengthened against timing
+ * attack.
+ * @warning A cryptographically-secure PRNG function must be set (using
+ * uECC_set_rng()) before calling uECC_make_key().
+ */
+int uECC_make_key(uint8_t *p_public_key, uint8_t *p_private_key, uECC_Curve curve);
+
+#ifdef ENABLE_TESTS
+
+/**
+ * @brief Create a public/private key pair given a specific d.
+ *
+ * @note THIS FUNCTION SHOULD BE CALLED ONLY FOR TEST PURPOSES. Refer to
+ * uECC_make_key() function for real applications.
+ */
+int uECC_make_key_with_d(uint8_t *p_public_key, uint8_t *p_private_key,
+ unsigned int *d, uECC_Curve curve);
+#endif
+
+/**
+ * @brief Compute a shared secret given your secret key and someone else's
+ * public key.
+ * @return returns TC_CRYPTO_SUCCESS (1) if the shared secret was computed successfully
+ * returns TC_CRYPTO_FAIL (0) otherwise
+ *
+ * @param p_secret OUT -- Will be filled in with the shared secret value. Must be
+ * the same size as the curve size (for curve secp256r1, secret must be 32 bytes
+ * long.
+ * @param p_public_key IN -- The public key of the remote party.
+ * @param p_private_key IN -- Your private key.
+ *
+ * @warning It is recommended to use the output of uECC_shared_secret() as the
+ * input of a recommended Key Derivation Function (see NIST SP 800-108) in
+ * order to produce a cryptographically secure symmetric key.
+ */
+int uECC_shared_secret(const uint8_t *p_public_key, const uint8_t *p_private_key,
+ uint8_t *p_secret, uECC_Curve curve);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_ECC_DH_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc_dsa.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc_dsa.h
new file mode 100644
index 00000000..355ee239
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc_dsa.h
@@ -0,0 +1,139 @@
+/* ecc_dh.h - TinyCrypt interface to EC-DSA implementation */
+
+/*
+ * Copyright (c) 2014, Kenneth MacKay
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief -- Interface to EC-DSA implementation.
+ *
+ * Overview: This software is an implementation of EC-DSA. This implementation
+ * uses curve NIST p-256.
+ *
+ * Security: The curve NIST p-256 provides approximately 128 bits of security.
+ *
+ * Usage: - To sign: Compute a hash of the data you wish to sign (SHA-2 is
+ * recommended) and pass it in to ecdsa_sign function along with your
+ * private key and a random number. You must use a new non-predictable
+ * random number to generate each new signature.
+ * - To verify a signature: Compute the hash of the signed data using
+ * the same hash as the signer and pass it to this function along with
+ * the signer's public key and the signature values (r and s).
+ */
+
+#ifndef __TC_ECC_DSA_H__
+#define __TC_ECC_DSA_H__
+
+#include "ecc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Generate an ECDSA signature for a given hash value.
+ * @return returns TC_CRYPTO_SUCCESS (1) if the signature generated successfully
+ * returns TC_CRYPTO_FAIL (0) if an error occurred.
+ *
+ * @param p_private_key IN -- Your private key.
+ * @param p_message_hash IN -- The hash of the message to sign.
+ * @param p_hash_size IN -- The size of p_message_hash in bytes.
+ * @param p_signature OUT -- Will be filled in with the signature value. Must be
+ * at least 2 * curve size long (for secp256r1, signature must be 64 bytes long).
+ *
+ * @warning A cryptographically-secure PRNG function must be set (using
+ * uECC_set_rng()) before calling uECC_sign().
+ * @note Usage: Compute a hash of the data you wish to sign (SHA-2 is
+ * recommended) and pass it in to this function along with your private key.
+ * @note side-channel countermeasure: algorithm strengthened against timing
+ * attack.
+ */
+int uECC_sign(const uint8_t *p_private_key, const uint8_t *p_message_hash,
+ unsigned p_hash_size, uint8_t *p_signature, uECC_Curve curve);
+
+#ifdef ENABLE_TESTS
+/*
+ * THIS FUNCTION SHOULD BE CALLED FOR TEST PURPOSES ONLY.
+ * Refer to uECC_sign() function for real applications.
+ */
+int uECC_sign_with_k(const uint8_t *private_key, const uint8_t *message_hash,
+ unsigned int hash_size, uECC_word_t *k, uint8_t *signature,
+ uECC_Curve curve);
+#endif
+
+/**
+ * @brief Verify an ECDSA signature.
+ * @return returns TC_SUCCESS (1) if the signature is valid
+ * returns TC_FAIL (0) if the signature is invalid.
+ *
+ * @param p_public_key IN -- The signer's public key.
+ * @param p_message_hash IN -- The hash of the signed data.
+ * @param p_hash_size IN -- The size of p_message_hash in bytes.
+ * @param p_signature IN -- The signature values.
+ *
+ * @note Usage: Compute the hash of the signed data using the same hash as the
+ * signer and pass it to this function along with the signer's public key and
+ * the signature values (hash_size and signature).
+ */
+int uECC_verify(const uint8_t *p_public_key, const uint8_t *p_message_hash,
+ unsigned int p_hash_size, const uint8_t *p_signature, uECC_Curve curve);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_ECC_DSA_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc_platform_specific.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc_platform_specific.h
new file mode 100644
index 00000000..e2c88235
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/ecc_platform_specific.h
@@ -0,0 +1,81 @@
+/* uECC_platform_specific.h - Interface to platform specific functions*/
+
+/* Copyright (c) 2014, Kenneth MacKay
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.*/
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * uECC_platform_specific.h -- Interface to platform specific functions
+ */
+
+#ifndef __UECC_PLATFORM_SPECIFIC_H_
+#define __UECC_PLATFORM_SPECIFIC_H_
+
+/*
+ * The RNG function should fill 'size' random bytes into 'dest'. It should
+ * return 1 if 'dest' was filled with random data, or 0 if the random data could
+ * not be generated. The filled-in values should be either truly random, or from
+ * a cryptographically-secure PRNG.
+ *
+ * A cryptographically-secure PRNG function must be set (using uECC_set_rng())
+ * before calling uECC_make_key() or uECC_sign().
+ *
+ * Setting a cryptographically-secure PRNG function improves the resistance to
+ * side-channel attacks for uECC_shared_secret().
+ *
+ * A correct PRNG function is set by default (default_RNG_defined = 1) and works
+ * for some platforms, such as Unix and Linux. For other platforms, you may need
+ * to provide another PRNG function.
+*/
+#define default_RNG_defined 1
+
+int default_CSPRNG(uint8_t *dest, unsigned int size);
+
+#endif /* __UECC_PLATFORM_SPECIFIC_H_ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/hmac.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/hmac.h
new file mode 100644
index 00000000..b8d913f9
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/hmac.h
@@ -0,0 +1,139 @@
+/* hmac.h - TinyCrypt interface to an HMAC implementation */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Interface to an HMAC implementation.
+ *
+ * Overview: HMAC is a message authentication code based on hash functions.
+ * TinyCrypt hard codes SHA-256 as the hash function. A message
+ * authentication code based on hash functions is also called a
+ * keyed cryptographic hash function since it performs a
+ * transformation specified by a key in an arbitrary length data
+ * set into a fixed length data set (also called tag).
+ *
+ * Security: The security of the HMAC depends on the length of the key and
+ * on the security of the hash function. Note that HMAC primitives
+ * are much less affected by collision attacks than their
+ * corresponding hash functions.
+ *
+ * Requires: SHA-256
+ *
+ * Usage: 1) call tc_hmac_set_key to set the HMAC key.
+ *
+ * 2) call tc_hmac_init to initialize a struct hash_state before
+ * processing the data.
+ *
+ * 3) call tc_hmac_update to process the next input segment;
+ * tc_hmac_update can be called as many times as needed to process
+ * all of the segments of the input; the order is important.
+ *
+ * 4) call tc_hmac_final to out put the tag.
+ */
+
+#ifndef __TC_HMAC_H__
+#define __TC_HMAC_H__
+
+#include "sha256.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct tc_hmac_state_struct {
+ /* the internal state required by h */
+ struct tc_sha256_state_struct hash_state;
+ /* HMAC key schedule */
+ uint8_t key[2 * TC_SHA256_BLOCK_SIZE];
+};
+typedef struct tc_hmac_state_struct *TCHmacState_t;
+
+/**
+ * @brief HMAC set key procedure
+ * Configures ctx to use key
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if
+ * ctx == NULL or
+ * key == NULL or
+ * key_size == 0
+ * @param ctx IN/OUT -- the struct tc_hmac_state_struct to initial
+ * @param key IN -- the HMAC key to configure
+ * @param key_size IN -- the HMAC key size
+ */
+int tc_hmac_set_key(TCHmacState_t ctx, const uint8_t *key,
+ unsigned int key_size);
+
+/**
+ * @brief HMAC init procedure
+ * Initializes ctx to begin the next HMAC operation
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if: ctx == NULL or key == NULL
+ * @param ctx IN/OUT -- struct tc_hmac_state_struct buffer to init
+ */
+int tc_hmac_init(TCHmacState_t ctx);
+
+/**
+ * @brief HMAC update procedure
+ * Mixes data_length bytes addressed by data into state
+ * @return returns TC_CRYPTO_SUCCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if: ctx == NULL or key == NULL
+ * @note Assumes state has been initialized by tc_hmac_init
+ * @param ctx IN/OUT -- state of HMAC computation so far
+ * @param data IN -- data to incorporate into state
+ * @param data_length IN -- size of data in bytes
+ */
+int tc_hmac_update(TCHmacState_t ctx, const void *data,
+ unsigned int data_length);
+
+/**
+ * @brief HMAC final procedure
+ * Writes the HMAC tag into the tag buffer
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * tag == NULL or
+ * ctx == NULL or
+ * key == NULL or
+ * taglen != TC_SHA256_DIGEST_SIZE
+ * @note ctx is erased before exiting. This should never be changed/removed.
+ * @note Assumes the tag bufer is at least sizeof(hmac_tag_size(state)) bytes
+ * state has been initialized by tc_hmac_init
+ * @param tag IN/OUT -- buffer to receive computed HMAC tag
+ * @param taglen IN -- size of tag in bytes
+ * @param ctx IN/OUT -- the HMAC state for computing tag
+ */
+int tc_hmac_final(uint8_t *tag, unsigned int taglen, TCHmacState_t ctx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__TC_HMAC_H__*/
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/hmac_prng.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/hmac_prng.h
new file mode 100644
index 00000000..164db43e
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/hmac_prng.h
@@ -0,0 +1,164 @@
+/* hmac_prng.h - TinyCrypt interface to an HMAC-PRNG implementation */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Interface to an HMAC-PRNG implementation.
+ *
+ * Overview: A pseudo-random number generator (PRNG) generates a sequence
+ * of numbers that have a distribution close to the one expected
+ * for a sequence of truly random numbers. The NIST Special
+ * Publication 800-90A specifies several mechanisms to generate
+ * sequences of pseudo random numbers, including the HMAC-PRNG one
+ * which is based on HMAC. TinyCrypt implements HMAC-PRNG with
+ * certain modifications from the NIST SP 800-90A spec.
+ *
+ * Security: A cryptographically secure PRNG depends on the existence of an
+ * entropy source to provide a truly random seed as well as the
+ * security of the primitives used as the building blocks (HMAC and
+ * SHA256, for TinyCrypt).
+ *
+ * The NIST SP 800-90A standard tolerates a null personalization,
+ * while TinyCrypt requires a non-null personalization. This is
+ * because a personalization string (the host name concatenated
+ * with a time stamp, for example) is easily computed and might be
+ * the last line of defense against failure of the entropy source.
+ *
+ * Requires: - SHA-256
+ * - HMAC
+ *
+ * Usage: 1) call tc_hmac_prng_init to set the HMAC key and process the
+ * personalization data.
+ *
+ * 2) call tc_hmac_prng_reseed to process the seed and additional
+ * input.
+ *
+ * 3) call tc_hmac_prng_generate to out put the pseudo-random data.
+ */
+
+#ifndef __TC_HMAC_PRNG_H__
+#define __TC_HMAC_PRNG_H__
+
+#include "sha256.h"
+#include "hmac.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TC_HMAC_PRNG_RESEED_REQ -1
+
+struct tc_hmac_prng_struct {
+ /* the HMAC instance for this PRNG */
+ struct tc_hmac_state_struct h;
+ /* the PRNG key */
+ uint8_t key[TC_SHA256_DIGEST_SIZE];
+ /* PRNG state */
+ uint8_t v[TC_SHA256_DIGEST_SIZE];
+ /* calls to tc_hmac_prng_generate left before re-seed */
+ unsigned int countdown;
+};
+
+typedef struct tc_hmac_prng_struct *TCHmacPrng_t;
+
+/**
+ * @brief HMAC-PRNG initialization procedure
+ * Initializes prng with personalization, disables tc_hmac_prng_generate
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * prng == NULL,
+ * personalization == NULL,
+ * plen > MAX_PLEN
+ * @note Assumes: - personalization != NULL.
+ * The personalization is a platform unique string (e.g., the host
+ * name) and is the last line of defense against failure of the
+ * entropy source
+ * @warning NIST SP 800-90A specifies 3 items as seed material during
+ * initialization: entropy seed, personalization, and an optional
+ * nonce. TinyCrypts requires instead a non-null personalization
+ * (which is easily computed) and indirectly requires an entropy
+ * seed (since the reseed function is mandatorily called after
+ * init)
+ * @param prng IN/OUT -- the PRNG state to initialize
+ * @param personalization IN -- personalization string
+ * @param plen IN -- personalization length in bytes
+ */
+int tc_hmac_prng_init(TCHmacPrng_t prng,
+ const uint8_t *personalization,
+ unsigned int plen);
+
+/**
+ * @brief HMAC-PRNG reseed procedure
+ * Mixes seed into prng, enables tc_hmac_prng_generate
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * prng == NULL,
+ * seed == NULL,
+ * seedlen < MIN_SLEN,
+ * seendlen > MAX_SLEN,
+ * additional_input != (const uint8_t *) 0 && additionallen == 0,
+ * additional_input != (const uint8_t *) 0 && additionallen > MAX_ALEN
+ * @note Assumes:- tc_hmac_prng_init has been called for prng
+ * - seed has sufficient entropy.
+ *
+ * @param prng IN/OUT -- the PRNG state
+ * @param seed IN -- entropy to mix into the prng
+ * @param seedlen IN -- length of seed in bytes
+ * @param additional_input IN -- additional input to the prng
+ * @param additionallen IN -- additional input length in bytes
+ */
+int tc_hmac_prng_reseed(TCHmacPrng_t prng, const uint8_t *seed,
+ unsigned int seedlen, const uint8_t *additional_input,
+ unsigned int additionallen);
+
+/**
+ * @brief HMAC-PRNG generate procedure
+ * Generates outlen pseudo-random bytes into out buffer, updates prng
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_HMAC_PRNG_RESEED_REQ (-1) if a reseed is needed
+ * returns TC_CRYPTO_FAIL (0) if:
+ * out == NULL,
+ * prng == NULL,
+ * outlen == 0,
+ * outlen >= MAX_OUT
+ * @note Assumes tc_hmac_prng_init has been called for prng
+ * @param out IN/OUT -- buffer to receive output
+ * @param outlen IN -- size of out buffer in bytes
+ * @param prng IN/OUT -- the PRNG state
+ */
+int tc_hmac_prng_generate(uint8_t *out, unsigned int outlen, TCHmacPrng_t prng);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_HMAC_PRNG_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/sha256.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/sha256.h
new file mode 100644
index 00000000..c3eb4f7b
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/sha256.h
@@ -0,0 +1,129 @@
+/* sha256.h - TinyCrypt interface to a SHA-256 implementation */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Interface to a SHA-256 implementation.
+ *
+ * Overview: SHA-256 is a NIST approved cryptographic hashing algorithm
+ * specified in FIPS 180. A hash algorithm maps data of arbitrary
+ * size to data of fixed length.
+ *
+ * Security: SHA-256 provides 128 bits of security against collision attacks
+ * and 256 bits of security against pre-image attacks. SHA-256 does
+ * NOT behave like a random oracle, but it can be used as one if
+ * the string being hashed is prefix-free encoded before hashing.
+ *
+ * Usage: 1) call tc_sha256_init to initialize a struct
+ * tc_sha256_state_struct before hashing a new string.
+ *
+ * 2) call tc_sha256_update to hash the next string segment;
+ * tc_sha256_update can be called as many times as needed to hash
+ * all of the segments of a string; the order is important.
+ *
+ * 3) call tc_sha256_final to out put the digest from a hashing
+ * operation.
+ */
+
+#ifndef __TC_SHA256_H__
+#define __TC_SHA256_H__
+
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TC_SHA256_BLOCK_SIZE (64)
+#define TC_SHA256_DIGEST_SIZE (32)
+#define TC_SHA256_STATE_BLOCKS (TC_SHA256_DIGEST_SIZE / 4)
+
+struct tc_sha256_state_struct {
+ unsigned int iv[TC_SHA256_STATE_BLOCKS];
+ uint64_t bits_hashed;
+ uint8_t leftover[TC_SHA256_BLOCK_SIZE];
+ size_t leftover_offset;
+};
+
+typedef struct tc_sha256_state_struct *TCSha256State_t;
+
+/**
+ * @brief SHA256 initialization procedure
+ * Initializes s
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if s == NULL
+ * @param s Sha256 state struct
+ */
+int tc_sha256_init(TCSha256State_t s);
+
+/**
+ * @brief SHA256 update procedure
+ * Hashes data_length bytes addressed by data into state s
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * s == NULL,
+ * s->iv == NULL,
+ * data == NULL
+ * @note Assumes s has been initialized by tc_sha256_init
+ * @warning The state buffer 'leftover' is left in memory after processing
+ * If your application intends to have sensitive data in this
+ * buffer, remind to erase it after the data has been processed
+ * @param s Sha256 state struct
+ * @param data message to hash
+ * @param datalen length of message to hash
+ */
+int tc_sha256_update(TCSha256State_t s, const uint8_t *data, size_t datalen);
+
+/**
+ * @brief SHA256 final procedure
+ * Inserts the completed hash computation into digest
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * s == NULL,
+ * s->iv == NULL,
+ * digest == NULL
+ * @note Assumes: s has been initialized by tc_sha256_init
+ * digest points to at least TC_SHA256_DIGEST_SIZE bytes
+ * @warning The state buffer 'leftover' is left in memory after processing
+ * If your application intends to have sensitive data in this
+ * buffer, remind to erase it after the data has been processed
+ * @param digest unsigned eight bit integer
+ * @param Sha256 state struct
+ */
+int tc_sha256_final(uint8_t *digest, TCSha256State_t s);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_SHA256_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/utils.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/utils.h
new file mode 100644
index 00000000..34a6bc55
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/include/tinycrypt/utils.h
@@ -0,0 +1,122 @@
+/* utils.h - TinyCrypt interface to platform-dependent run-time operations */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Interface to platform-dependent run-time operations.
+ *
+ */
+
+#ifndef __TC_UTILS_H__
+#define __TC_UTILS_H__
+
+#include
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Copy the the buffer 'from' to the buffer 'to'.
+ * @return returns TC_CRYPTO_SUCCESS (1)
+ * returns TC_CRYPTO_FAIL (0) if:
+ * from_len > to_len.
+ *
+ * @param to OUT -- destination buffer
+ * @param to_len IN -- length of destination buffer
+ * @param from IN -- origin buffer
+ * @param from_len IN -- length of origin buffer
+ */
+unsigned int _copy(uint8_t *to, unsigned int to_len,
+ const uint8_t *from, unsigned int from_len);
+
+/**
+ * @brief Set the value 'val' into the buffer 'to', 'len' times.
+ *
+ * @param to OUT -- destination buffer
+ * @param val IN -- value to be set in 'to'
+ * @param len IN -- number of times the value will be copied
+ */
+void _set(void *to, uint8_t val, unsigned int len);
+
+/**
+ * @brief Set the value 'val' into the buffer 'to', 'len' times, in a way
+ * which does not risk getting optimized out by the compiler
+ * In cases where the compiler does not set __GNUC__ and where the
+ * optimization level removes the memset, it may be necessary to
+ * implement a _set_secure function and define the
+ * TINYCRYPT_ARCH_HAS_SET_SECURE, which then can ensure that the
+ * memset does not get optimized out.
+ *
+ * @param to OUT -- destination buffer
+ * @param val IN -- value to be set in 'to'
+ * @param len IN -- number of times the value will be copied
+ */
+#ifdef TINYCRYPT_ARCH_HAS_SET_SECURE
+extern void _set_secure(void *to, uint8_t val, unsigned int len);
+#else /* ! TINYCRYPT_ARCH_HAS_SET_SECURE */
+static inline void _set_secure(void *to, uint8_t val, unsigned int len)
+{
+ (void)memset(to, val, len);
+#ifdef __GNUC__
+ __asm__ __volatile__("" ::"g"(to)
+ : "memory");
+#endif /* __GNUC__ */
+}
+#endif /* TINYCRYPT_ARCH_HAS_SET_SECURE */
+
+/*
+ * @brief AES specific doubling function, which utilizes
+ * the finite field used by AES.
+ * @return Returns a^2
+ *
+ * @param a IN/OUT -- value to be doubled
+ */
+uint8_t _double_byte(uint8_t a);
+
+/*
+ * @brief Constant-time algorithm to compare if two sequences of bytes are equal
+ * @return Returns 0 if equal, and non-zero otherwise
+ *
+ * @param a IN -- sequence of bytes a
+ * @param b IN -- sequence of bytes b
+ * @param size IN -- size of sequences a and b
+ */
+int _compare(const uint8_t *a, const uint8_t *b, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TC_UTILS_H__ */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/aes_decrypt.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/aes_decrypt.c
new file mode 100644
index 00000000..83719acc
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/aes_decrypt.c
@@ -0,0 +1,183 @@
+/* aes_decrypt.c - TinyCrypt implementation of AES decryption procedure */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+
+static const uint8_t inv_sbox[256] = {
+ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
+ 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
+ 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
+ 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
+ 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
+ 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
+ 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
+ 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
+ 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
+ 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
+ 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
+ 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
+ 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
+ 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
+ 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
+ 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
+ 0x55, 0x21, 0x0c, 0x7d
+};
+
+int tc_aes128_set_decrypt_key(TCAesKeySched_t s, const uint8_t *k)
+{
+ return tc_aes128_set_encrypt_key(s, k);
+}
+
+#define mult8(a) (_double_byte(_double_byte(_double_byte(a))))
+#define mult9(a) (mult8(a) ^ (a))
+#define multb(a) (mult8(a) ^ _double_byte(a) ^ (a))
+#define multd(a) (mult8(a) ^ _double_byte(_double_byte(a)) ^ (a))
+#define multe(a) (mult8(a) ^ _double_byte(_double_byte(a)) ^ _double_byte(a))
+
+static inline void mult_row_column(uint8_t *out, const uint8_t *in)
+{
+ out[0] = multe(in[0]) ^ multb(in[1]) ^ multd(in[2]) ^ mult9(in[3]);
+ out[1] = mult9(in[0]) ^ multe(in[1]) ^ multb(in[2]) ^ multd(in[3]);
+ out[2] = multd(in[0]) ^ mult9(in[1]) ^ multe(in[2]) ^ multb(in[3]);
+ out[3] = multb(in[0]) ^ multd(in[1]) ^ mult9(in[2]) ^ multe(in[3]);
+}
+
+static inline void inv_mix_columns(uint8_t *s)
+{
+ uint8_t t[Nb * Nk];
+
+ mult_row_column(t, s);
+ mult_row_column(&t[Nb], s + Nb);
+ mult_row_column(&t[2 * Nb], s + (2 * Nb));
+ mult_row_column(&t[3 * Nb], s + (3 * Nb));
+ (void)_copy(s, sizeof(t), t, sizeof(t));
+}
+
+static inline void add_round_key(uint8_t *s, const unsigned int *k)
+{
+ s[0] ^= (uint8_t)(k[0] >> 24);
+ s[1] ^= (uint8_t)(k[0] >> 16);
+ s[2] ^= (uint8_t)(k[0] >> 8);
+ s[3] ^= (uint8_t)(k[0]);
+ s[4] ^= (uint8_t)(k[1] >> 24);
+ s[5] ^= (uint8_t)(k[1] >> 16);
+ s[6] ^= (uint8_t)(k[1] >> 8);
+ s[7] ^= (uint8_t)(k[1]);
+ s[8] ^= (uint8_t)(k[2] >> 24);
+ s[9] ^= (uint8_t)(k[2] >> 16);
+ s[10] ^= (uint8_t)(k[2] >> 8);
+ s[11] ^= (uint8_t)(k[2]);
+ s[12] ^= (uint8_t)(k[3] >> 24);
+ s[13] ^= (uint8_t)(k[3] >> 16);
+ s[14] ^= (uint8_t)(k[3] >> 8);
+ s[15] ^= (uint8_t)(k[3]);
+}
+
+static inline void inv_sub_bytes(uint8_t *s)
+{
+ unsigned int i;
+
+ for (i = 0; i < (Nb * Nk); ++i) {
+ s[i] = inv_sbox[s[i]];
+ }
+}
+
+/*
+ * This inv_shift_rows also implements the matrix flip required for
+ * inv_mix_columns, but performs it here to reduce the number of memory
+ * operations.
+ */
+static inline void inv_shift_rows(uint8_t *s)
+{
+ uint8_t t[Nb * Nk];
+
+ t[0] = s[0];
+ t[1] = s[13];
+ t[2] = s[10];
+ t[3] = s[7];
+ t[4] = s[4];
+ t[5] = s[1];
+ t[6] = s[14];
+ t[7] = s[11];
+ t[8] = s[8];
+ t[9] = s[5];
+ t[10] = s[2];
+ t[11] = s[15];
+ t[12] = s[12];
+ t[13] = s[9];
+ t[14] = s[6];
+ t[15] = s[3];
+ (void)_copy(s, sizeof(t), t, sizeof(t));
+}
+
+int tc_aes_decrypt(uint8_t *out, const uint8_t *in, const TCAesKeySched_t s)
+{
+ uint8_t state[Nk * Nb];
+ unsigned int i;
+
+ if (out == (uint8_t *)0) {
+ return TC_CRYPTO_FAIL;
+ } else if (in == (const uint8_t *)0) {
+ return TC_CRYPTO_FAIL;
+ } else if (s == (TCAesKeySched_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ (void)_copy(state, sizeof(state), in, sizeof(state));
+
+ add_round_key(state, s->words + Nb * Nr);
+
+ for (i = Nr - 1; i > 0; --i) {
+ inv_shift_rows(state);
+ inv_sub_bytes(state);
+ add_round_key(state, s->words + Nb * i);
+ inv_mix_columns(state);
+ }
+
+ inv_shift_rows(state);
+ inv_sub_bytes(state);
+ add_round_key(state, s->words);
+
+ (void)_copy(out, sizeof(state), state, sizeof(state));
+
+ /*zeroing out the state buffer */
+ _set(state, TC_ZERO_BYTE, sizeof(state));
+
+ return TC_CRYPTO_SUCCESS;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/aes_encrypt.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/aes_encrypt.c
new file mode 100644
index 00000000..0cb47b84
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/aes_encrypt.c
@@ -0,0 +1,211 @@
+/* aes_encrypt.c - TinyCrypt implementation of AES encryption procedure */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "aes.h"
+#include "utils.h"
+#include "constants.h"
+
+static const uint8_t sbox[256] = {
+ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
+ 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+ 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
+ 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
+ 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+ 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
+ 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
+ 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+ 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
+ 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
+ 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+ 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
+ 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
+ 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+ 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
+ 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
+ 0xb0, 0x54, 0xbb, 0x16
+};
+
+static inline unsigned int rotword(unsigned int a)
+{
+ return (((a) >> 24) | ((a) << 8));
+}
+
+#define subbyte(a, o) (sbox[((a) >> (o)) & 0xff] << (o))
+#define subword(a) (subbyte(a, 24) | subbyte(a, 16) | subbyte(a, 8) | subbyte(a, 0))
+
+int tc_aes128_set_encrypt_key(TCAesKeySched_t s, const uint8_t *k)
+{
+ const unsigned int rconst[11] = {
+ 0x00000000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
+ 0x20000000, 0x40000000, 0x80000000, 0x1b000000, 0x36000000
+ };
+ unsigned int i;
+ unsigned int t;
+
+ if (s == (TCAesKeySched_t)0) {
+ return TC_CRYPTO_FAIL;
+ } else if (k == (const uint8_t *)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ for (i = 0; i < Nk; ++i) {
+ s->words[i] = (k[Nb * i] << 24) | (k[Nb * i + 1] << 16) |
+ (k[Nb * i + 2] << 8) | (k[Nb * i + 3]);
+ }
+
+ for (; i < (Nb * (Nr + 1)); ++i) {
+ t = s->words[i - 1];
+ if ((i % Nk) == 0) {
+ t = subword(rotword(t)) ^ rconst[i / Nk];
+ }
+ s->words[i] = s->words[i - Nk] ^ t;
+ }
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+static inline void add_round_key(uint8_t *s, const unsigned int *k)
+{
+ s[0] ^= (uint8_t)(k[0] >> 24);
+ s[1] ^= (uint8_t)(k[0] >> 16);
+ s[2] ^= (uint8_t)(k[0] >> 8);
+ s[3] ^= (uint8_t)(k[0]);
+ s[4] ^= (uint8_t)(k[1] >> 24);
+ s[5] ^= (uint8_t)(k[1] >> 16);
+ s[6] ^= (uint8_t)(k[1] >> 8);
+ s[7] ^= (uint8_t)(k[1]);
+ s[8] ^= (uint8_t)(k[2] >> 24);
+ s[9] ^= (uint8_t)(k[2] >> 16);
+ s[10] ^= (uint8_t)(k[2] >> 8);
+ s[11] ^= (uint8_t)(k[2]);
+ s[12] ^= (uint8_t)(k[3] >> 24);
+ s[13] ^= (uint8_t)(k[3] >> 16);
+ s[14] ^= (uint8_t)(k[3] >> 8);
+ s[15] ^= (uint8_t)(k[3]);
+}
+
+static inline void sub_bytes(uint8_t *s)
+{
+ unsigned int i;
+
+ for (i = 0; i < (Nb * Nk); ++i) {
+ s[i] = sbox[s[i]];
+ }
+}
+
+#define triple(a) (_double_byte(a) ^ (a))
+
+static inline void mult_row_column(uint8_t *out, const uint8_t *in)
+{
+ out[0] = _double_byte(in[0]) ^ triple(in[1]) ^ in[2] ^ in[3];
+ out[1] = in[0] ^ _double_byte(in[1]) ^ triple(in[2]) ^ in[3];
+ out[2] = in[0] ^ in[1] ^ _double_byte(in[2]) ^ triple(in[3]);
+ out[3] = triple(in[0]) ^ in[1] ^ in[2] ^ _double_byte(in[3]);
+}
+
+static inline void mix_columns(uint8_t *s)
+{
+ uint8_t t[Nb * Nk];
+
+ mult_row_column(t, s);
+ mult_row_column(&t[Nb], s + Nb);
+ mult_row_column(&t[2 * Nb], s + (2 * Nb));
+ mult_row_column(&t[3 * Nb], s + (3 * Nb));
+ (void)_copy(s, sizeof(t), t, sizeof(t));
+}
+
+/*
+ * This shift_rows also implements the matrix flip required for mix_columns, but
+ * performs it here to reduce the number of memory operations.
+ */
+static inline void shift_rows(uint8_t *s)
+{
+ uint8_t t[Nb * Nk];
+
+ t[0] = s[0];
+ t[1] = s[5];
+ t[2] = s[10];
+ t[3] = s[15];
+ t[4] = s[4];
+ t[5] = s[9];
+ t[6] = s[14];
+ t[7] = s[3];
+ t[8] = s[8];
+ t[9] = s[13];
+ t[10] = s[2];
+ t[11] = s[7];
+ t[12] = s[12];
+ t[13] = s[1];
+ t[14] = s[6];
+ t[15] = s[11];
+ (void)_copy(s, sizeof(t), t, sizeof(t));
+}
+
+int tc_aes_encrypt(uint8_t *out, const uint8_t *in, const TCAesKeySched_t s)
+{
+ uint8_t state[Nk * Nb];
+ unsigned int i;
+
+ if (out == (uint8_t *)0) {
+ return TC_CRYPTO_FAIL;
+ } else if (in == (const uint8_t *)0) {
+ return TC_CRYPTO_FAIL;
+ } else if (s == (TCAesKeySched_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ (void)_copy(state, sizeof(state), in, sizeof(state));
+ add_round_key(state, s->words);
+
+ for (i = 0; i < (Nr - 1); ++i) {
+ sub_bytes(state);
+ shift_rows(state);
+ mix_columns(state);
+ add_round_key(state, s->words + Nb * (i + 1));
+ }
+
+ sub_bytes(state);
+ shift_rows(state);
+ add_round_key(state, s->words + Nb * (i + 1));
+
+ (void)_copy(out, sizeof(state), state, sizeof(state));
+
+ /* zeroing out the state buffer */
+ _set(state, TC_ZERO_BYTE, sizeof(state));
+
+ return TC_CRYPTO_SUCCESS;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/cbc_mode.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/cbc_mode.c
new file mode 100644
index 00000000..b405d7d2
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/cbc_mode.c
@@ -0,0 +1,112 @@
+/* cbc_mode.c - TinyCrypt implementation of CBC mode encryption & decryption */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "cbc_mode.h"
+#include "constants.h"
+#include "utils.h"
+
+int tc_cbc_mode_encrypt(uint8_t *out, unsigned int outlen, const uint8_t *in,
+ unsigned int inlen, const uint8_t *iv,
+ const TCAesKeySched_t sched)
+{
+ uint8_t buffer[TC_AES_BLOCK_SIZE];
+ unsigned int n, m;
+
+ /* input sanity check: */
+ if (out == (uint8_t *)0 ||
+ in == (const uint8_t *)0 ||
+ sched == (TCAesKeySched_t)0 ||
+ inlen == 0 ||
+ outlen == 0 ||
+ (inlen % TC_AES_BLOCK_SIZE) != 0 ||
+ (outlen % TC_AES_BLOCK_SIZE) != 0 ||
+ outlen != inlen + TC_AES_BLOCK_SIZE) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ /* copy iv to the buffer */
+ (void)_copy(buffer, TC_AES_BLOCK_SIZE, iv, TC_AES_BLOCK_SIZE);
+ /* copy iv to the output buffer */
+ (void)_copy(out, TC_AES_BLOCK_SIZE, iv, TC_AES_BLOCK_SIZE);
+ out += TC_AES_BLOCK_SIZE;
+
+ for (n = m = 0; n < inlen; ++n) {
+ buffer[m++] ^= *in++;
+ if (m == TC_AES_BLOCK_SIZE) {
+ (void)tc_aes_encrypt(buffer, buffer, sched);
+ (void)_copy(out, TC_AES_BLOCK_SIZE,
+ buffer, TC_AES_BLOCK_SIZE);
+ out += TC_AES_BLOCK_SIZE;
+ m = 0;
+ }
+ }
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_cbc_mode_decrypt(uint8_t *out, unsigned int outlen, const uint8_t *in,
+ unsigned int inlen, const uint8_t *iv,
+ const TCAesKeySched_t sched)
+{
+ uint8_t buffer[TC_AES_BLOCK_SIZE];
+ const uint8_t *p;
+ unsigned int n, m;
+
+ /* sanity check the inputs */
+ if (out == (uint8_t *)0 ||
+ in == (const uint8_t *)0 ||
+ sched == (TCAesKeySched_t)0 ||
+ inlen == 0 ||
+ outlen == 0 ||
+ (inlen % TC_AES_BLOCK_SIZE) != 0 ||
+ (outlen % TC_AES_BLOCK_SIZE) != 0 ||
+ outlen != inlen) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ /*
+ * Note that in == iv + ciphertext, i.e. the iv and the ciphertext are
+ * contiguous. This allows for a very efficient decryption algorithm
+ * that would not otherwise be possible.
+ */
+ p = iv;
+ for (n = m = 0; n < outlen; ++n) {
+ if ((n % TC_AES_BLOCK_SIZE) == 0) {
+ (void)tc_aes_decrypt(buffer, in, sched);
+ in += TC_AES_BLOCK_SIZE;
+ m = 0;
+ }
+ *out++ = buffer[m++] ^ *p++;
+ }
+
+ return TC_CRYPTO_SUCCESS;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ccm_mode.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ccm_mode.c
new file mode 100644
index 00000000..ed94e75b
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ccm_mode.c
@@ -0,0 +1,263 @@
+/* ccm_mode.c - TinyCrypt implementation of CCM mode */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ccm_mode.h"
+#include "constants.h"
+#include "utils.h"
+
+#include
+
+int tc_ccm_config(TCCcmMode_t c, TCAesKeySched_t sched, uint8_t *nonce,
+ unsigned int nlen, unsigned int mlen)
+{
+ /* input sanity check: */
+ if (c == (TCCcmMode_t)0 ||
+ sched == (TCAesKeySched_t)0 ||
+ nonce == (uint8_t *)0) {
+ return TC_CRYPTO_FAIL;
+ } else if (nlen != 13) {
+ return TC_CRYPTO_FAIL; /* The allowed nonce size is: 13. See documentation.*/
+ } else if ((mlen < 4) || (mlen > 16) || (mlen & 1)) {
+ return TC_CRYPTO_FAIL; /* The allowed mac sizes are: 4, 6, 8, 10, 12, 14, 16.*/
+ }
+
+ c->mlen = mlen;
+ c->sched = sched;
+ c->nonce = nonce;
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+/**
+ * Variation of CBC-MAC mode used in CCM.
+ */
+static void ccm_cbc_mac(uint8_t *T, const uint8_t *data, unsigned int dlen,
+ unsigned int flag, TCAesKeySched_t sched)
+{
+ unsigned int i;
+
+ if (flag > 0) {
+ T[0] ^= (uint8_t)(dlen >> 8);
+ T[1] ^= (uint8_t)(dlen);
+ dlen += 2;
+ i = 2;
+ } else {
+ i = 0;
+ }
+
+ while (i < dlen) {
+ T[i++ % (Nb * Nk)] ^= *data++;
+ if (((i % (Nb * Nk)) == 0) || dlen == i) {
+ (void)tc_aes_encrypt(T, T, sched);
+ }
+ }
+}
+
+/**
+ * Variation of CTR mode used in CCM.
+ * The CTR mode used by CCM is slightly different than the conventional CTR
+ * mode (the counter is increased before encryption, instead of after
+ * encryption). Besides, it is assumed that the counter is stored in the last
+ * 2 bytes of the nonce.
+ */
+static int ccm_ctr_mode(uint8_t *out, unsigned int outlen, const uint8_t *in,
+ unsigned int inlen, uint8_t *ctr, const TCAesKeySched_t sched)
+{
+ uint8_t buffer[TC_AES_BLOCK_SIZE];
+ uint8_t nonce[TC_AES_BLOCK_SIZE];
+ uint16_t block_num;
+ unsigned int i;
+
+ /* input sanity check: */
+ if (out == (uint8_t *)0 ||
+ in == (uint8_t *)0 ||
+ ctr == (uint8_t *)0 ||
+ sched == (TCAesKeySched_t)0 ||
+ inlen == 0 ||
+ outlen == 0 ||
+ outlen != inlen) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ /* copy the counter to the nonce */
+ (void)_copy(nonce, sizeof(nonce), ctr, sizeof(nonce));
+
+ /* select the last 2 bytes of the nonce to be incremented */
+ block_num = (uint16_t)((nonce[14] << 8) | (nonce[15]));
+ for (i = 0; i < inlen; ++i) {
+ if ((i % (TC_AES_BLOCK_SIZE)) == 0) {
+ block_num++;
+ nonce[14] = (uint8_t)(block_num >> 8);
+ nonce[15] = (uint8_t)(block_num);
+ if (!tc_aes_encrypt(buffer, nonce, sched)) {
+ return TC_CRYPTO_FAIL;
+ }
+ }
+ /* update the output */
+ *out++ = buffer[i % (TC_AES_BLOCK_SIZE)] ^ *in++;
+ }
+
+ /* update the counter */
+ ctr[14] = nonce[14];
+ ctr[15] = nonce[15];
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_ccm_generation_encryption(uint8_t *out, unsigned int olen,
+ const uint8_t *associated_data,
+ unsigned int alen, const uint8_t *payload,
+ unsigned int plen, TCCcmMode_t c)
+{
+ /* input sanity check: */
+ if ((out == (uint8_t *)0) ||
+ (c == (TCCcmMode_t)0) ||
+ ((plen > 0) && (payload == (uint8_t *)0)) ||
+ ((alen > 0) && (associated_data == (uint8_t *)0)) ||
+ (alen >= TC_CCM_AAD_MAX_BYTES) || /* associated data size unsupported */
+ (plen >= TC_CCM_PAYLOAD_MAX_BYTES) || /* payload size unsupported */
+ (olen < (plen + c->mlen))) { /* invalid output buffer size */
+ return TC_CRYPTO_FAIL;
+ }
+
+ uint8_t b[Nb * Nk];
+ uint8_t tag[Nb * Nk];
+ unsigned int i;
+
+ /* GENERATING THE AUTHENTICATION TAG: */
+
+ /* formatting the sequence b for authentication: */
+ b[0] = ((alen > 0) ? 0x40 : 0) | (((c->mlen - 2) / 2 << 3)) | (1);
+ for (i = 1; i <= 13; ++i) {
+ b[i] = c->nonce[i - 1];
+ }
+ b[14] = (uint8_t)(plen >> 8);
+ b[15] = (uint8_t)(plen);
+
+ /* computing the authentication tag using cbc-mac: */
+ (void)tc_aes_encrypt(tag, b, c->sched);
+ if (alen > 0) {
+ ccm_cbc_mac(tag, associated_data, alen, 1, c->sched);
+ }
+ if (plen > 0) {
+ ccm_cbc_mac(tag, payload, plen, 0, c->sched);
+ }
+
+ /* ENCRYPTION: */
+
+ /* formatting the sequence b for encryption: */
+ b[0] = 1; /* q - 1 = 2 - 1 = 1 */
+ b[14] = b[15] = TC_ZERO_BYTE;
+
+ /* encrypting payload using ctr mode: */
+ ccm_ctr_mode(out, plen, payload, plen, b, c->sched);
+
+ b[14] = b[15] = TC_ZERO_BYTE; /* restoring initial counter for ctr_mode (0):*/
+
+ /* encrypting b and adding the tag to the output: */
+ (void)tc_aes_encrypt(b, b, c->sched);
+ out += plen;
+ for (i = 0; i < c->mlen; ++i) {
+ *out++ = tag[i] ^ b[i];
+ }
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_ccm_decryption_verification(uint8_t *out, unsigned int olen,
+ const uint8_t *associated_data,
+ unsigned int alen, const uint8_t *payload,
+ unsigned int plen, TCCcmMode_t c)
+{
+ /* input sanity check: */
+ if ((out == (uint8_t *)0) ||
+ (c == (TCCcmMode_t)0) ||
+ ((plen > 0) && (payload == (uint8_t *)0)) ||
+ ((alen > 0) && (associated_data == (uint8_t *)0)) ||
+ (alen >= TC_CCM_AAD_MAX_BYTES) || /* associated data size unsupported */
+ (plen >= TC_CCM_PAYLOAD_MAX_BYTES) || /* payload size unsupported */
+ (olen < plen - c->mlen)) { /* invalid output buffer size */
+ return TC_CRYPTO_FAIL;
+ }
+
+ uint8_t b[Nb * Nk];
+ uint8_t tag[Nb * Nk];
+ unsigned int i;
+
+ /* DECRYPTION: */
+
+ /* formatting the sequence b for decryption: */
+ b[0] = 1; /* q - 1 = 2 - 1 = 1 */
+ for (i = 1; i < 14; ++i) {
+ b[i] = c->nonce[i - 1];
+ }
+ b[14] = b[15] = TC_ZERO_BYTE; /* initial counter value is 0 */
+
+ /* decrypting payload using ctr mode: */
+ ccm_ctr_mode(out, plen - c->mlen, payload, plen - c->mlen, b, c->sched);
+
+ b[14] = b[15] = TC_ZERO_BYTE; /* restoring initial counter value (0) */
+
+ /* encrypting b and restoring the tag from input: */
+ (void)tc_aes_encrypt(b, b, c->sched);
+ for (i = 0; i < c->mlen; ++i) {
+ tag[i] = *(payload + plen - c->mlen + i) ^ b[i];
+ }
+
+ /* VERIFYING THE AUTHENTICATION TAG: */
+
+ /* formatting the sequence b for authentication: */
+ b[0] = ((alen > 0) ? 0x40 : 0) | (((c->mlen - 2) / 2 << 3)) | (1);
+ for (i = 1; i < 14; ++i) {
+ b[i] = c->nonce[i - 1];
+ }
+ b[14] = (uint8_t)((plen - c->mlen) >> 8);
+ b[15] = (uint8_t)(plen - c->mlen);
+
+ /* computing the authentication tag using cbc-mac: */
+ (void)tc_aes_encrypt(b, b, c->sched);
+ if (alen > 0) {
+ ccm_cbc_mac(b, associated_data, alen, 1, c->sched);
+ }
+ if (plen > 0) {
+ ccm_cbc_mac(b, out, plen - c->mlen, 0, c->sched);
+ }
+
+ /* comparing the received tag and the computed one: */
+ if (_compare(b, tag, c->mlen) == 0) {
+ return TC_CRYPTO_SUCCESS;
+ } else {
+ /* erase the decrypted buffer in case of mac validation failure: */
+ _set(out, 0, plen - c->mlen);
+ return TC_CRYPTO_FAIL;
+ }
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/cmac_mode.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/cmac_mode.c
new file mode 100644
index 00000000..97e7dd34
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/cmac_mode.c
@@ -0,0 +1,252 @@
+/* cmac_mode.c - TinyCrypt CMAC mode implementation */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "aes.h"
+#include "cmac_mode.h"
+#include "constants.h"
+#include "utils.h"
+
+/* max number of calls until change the key (2^48).*/
+static const uint64_t MAX_CALLS = ((uint64_t)1 << 48);
+
+/*
+ * gf_wrap -- In our implementation, GF(2^128) is represented as a 16 byte
+ * array with byte 0 the most significant and byte 15 the least significant.
+ * High bit carry reduction is based on the primitive polynomial
+ *
+ * X^128 + X^7 + X^2 + X + 1,
+ *
+ * which leads to the reduction formula X^128 = X^7 + X^2 + X + 1. Indeed,
+ * since 0 = (X^128 + X^7 + X^2 + 1) mod (X^128 + X^7 + X^2 + X + 1) and since
+ * addition of polynomials with coefficients in Z/Z(2) is just XOR, we can
+ * add X^128 to both sides to get
+ *
+ * X^128 = (X^7 + X^2 + X + 1) mod (X^128 + X^7 + X^2 + X + 1)
+ *
+ * and the coefficients of the polynomial on the right hand side form the
+ * string 1000 0111 = 0x87, which is the value of gf_wrap.
+ *
+ * This gets used in the following way. Doubling in GF(2^128) is just a left
+ * shift by 1 bit, except when the most significant bit is 1. In the latter
+ * case, the relation X^128 = X^7 + X^2 + X + 1 says that the high order bit
+ * that overflows beyond 128 bits can be replaced by addition of
+ * X^7 + X^2 + X + 1 <--> 0x87 to the low order 128 bits. Since addition
+ * in GF(2^128) is represented by XOR, we therefore only have to XOR 0x87
+ * into the low order byte after a left shift when the starting high order
+ * bit is 1.
+ */
+const unsigned char gf_wrap = 0x87;
+
+/*
+ * assumes: out != NULL and points to a GF(2^n) value to receive the
+ * doubled value;
+ * in != NULL and points to a 16 byte GF(2^n) value
+ * to double;
+ * the in and out buffers do not overlap.
+ * effects: doubles the GF(2^n) value pointed to by "in" and places
+ * the result in the GF(2^n) value pointed to by "out."
+ */
+void gf_double(uint8_t *out, uint8_t *in)
+{
+ /* start with low order byte */
+ uint8_t *x = in + (TC_AES_BLOCK_SIZE - 1);
+
+ /* if msb == 1, we need to add the gf_wrap value, otherwise add 0 */
+ uint8_t carry = (in[0] >> 7) ? gf_wrap : 0;
+
+ out += (TC_AES_BLOCK_SIZE - 1);
+ for (;;) {
+ *out-- = (*x << 1) ^ carry;
+ if (x == in) {
+ break;
+ }
+ carry = *x-- >> 7;
+ }
+}
+
+int tc_cmac_setup(TCCmacState_t s, const uint8_t *key, TCAesKeySched_t sched)
+{
+ /* input sanity check: */
+ if (s == (TCCmacState_t)0 ||
+ key == (const uint8_t *)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ /* put s into a known state */
+ _set(s, 0, sizeof(*s));
+ s->sched = sched;
+
+ /* configure the encryption key used by the underlying block cipher */
+ tc_aes128_set_encrypt_key(s->sched, key);
+
+ /* compute s->K1 and s->K2 from s->iv using s->keyid */
+ _set(s->iv, 0, TC_AES_BLOCK_SIZE);
+ tc_aes_encrypt(s->iv, s->iv, s->sched);
+ gf_double(s->K1, s->iv);
+ gf_double(s->K2, s->K1);
+
+ /* reset s->iv to 0 in case someone wants to compute now */
+ tc_cmac_init(s);
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_cmac_erase(TCCmacState_t s)
+{
+ if (s == (TCCmacState_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ /* destroy the current state */
+ _set(s, 0, sizeof(*s));
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_cmac_init(TCCmacState_t s)
+{
+ /* input sanity check: */
+ if (s == (TCCmacState_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ /* CMAC starts with an all zero initialization vector */
+ _set(s->iv, 0, TC_AES_BLOCK_SIZE);
+
+ /* and the leftover buffer is empty */
+ _set(s->leftover, 0, TC_AES_BLOCK_SIZE);
+ s->leftover_offset = 0;
+
+ /* Set countdown to max number of calls allowed before re-keying: */
+ s->countdown = MAX_CALLS;
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_cmac_update(TCCmacState_t s, const uint8_t *data, size_t data_length)
+{
+ unsigned int i;
+
+ /* input sanity check: */
+ if (s == (TCCmacState_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+ if (data_length == 0) {
+ return TC_CRYPTO_SUCCESS;
+ }
+ if (data == (const uint8_t *)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ if (s->countdown == 0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ s->countdown--;
+
+ if (s->leftover_offset > 0) {
+ /* last data added to s didn't end on a TC_AES_BLOCK_SIZE byte boundary */
+ size_t remaining_space = TC_AES_BLOCK_SIZE - s->leftover_offset;
+
+ if (data_length < remaining_space) {
+ /* still not enough data to encrypt this time either */
+ _copy(&s->leftover[s->leftover_offset], data_length, data, data_length);
+ s->leftover_offset += data_length;
+ return TC_CRYPTO_SUCCESS;
+ }
+ /* leftover block is now full; encrypt it first */
+ _copy(&s->leftover[s->leftover_offset],
+ remaining_space,
+ data,
+ remaining_space);
+ data_length -= remaining_space;
+ data += remaining_space;
+ s->leftover_offset = 0;
+
+ for (i = 0; i < TC_AES_BLOCK_SIZE; ++i) {
+ s->iv[i] ^= s->leftover[i];
+ }
+ tc_aes_encrypt(s->iv, s->iv, s->sched);
+ }
+
+ /* CBC encrypt each (except the last) of the data blocks */
+ while (data_length > TC_AES_BLOCK_SIZE) {
+ for (i = 0; i < TC_AES_BLOCK_SIZE; ++i) {
+ s->iv[i] ^= data[i];
+ }
+ tc_aes_encrypt(s->iv, s->iv, s->sched);
+ data += TC_AES_BLOCK_SIZE;
+ data_length -= TC_AES_BLOCK_SIZE;
+ }
+
+ if (data_length > 0) {
+ /* save leftover data for next time */
+ _copy(s->leftover, data_length, data, data_length);
+ s->leftover_offset = data_length;
+ }
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_cmac_final(uint8_t *tag, TCCmacState_t s)
+{
+ uint8_t *k;
+ unsigned int i;
+
+ /* input sanity check: */
+ if (tag == (uint8_t *)0 ||
+ s == (TCCmacState_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ if (s->leftover_offset == TC_AES_BLOCK_SIZE) {
+ /* the last message block is a full-sized block */
+ k = (uint8_t *)s->K1;
+ } else {
+ /* the final message block is not a full-sized block */
+ size_t remaining = TC_AES_BLOCK_SIZE - s->leftover_offset;
+
+ _set(&s->leftover[s->leftover_offset], 0, remaining);
+ s->leftover[s->leftover_offset] = TC_CMAC_PADDING;
+ k = (uint8_t *)s->K2;
+ }
+ for (i = 0; i < TC_AES_BLOCK_SIZE; ++i) {
+ s->iv[i] ^= s->leftover[i] ^ k[i];
+ }
+
+ tc_aes_encrypt(tag, s->iv, s->sched);
+
+ /* erasing state: */
+ tc_cmac_erase(s);
+
+ return TC_CRYPTO_SUCCESS;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ctr_mode.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ctr_mode.c
new file mode 100644
index 00000000..c9808338
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ctr_mode.c
@@ -0,0 +1,86 @@
+/* ctr_mode.c - TinyCrypt CTR mode implementation */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "constants.h"
+#include "ctr_mode.h"
+#include "utils.h"
+
+int tc_ctr_mode(uint8_t *out, unsigned int outlen, const uint8_t *in,
+ unsigned int inlen, uint8_t *ctr, const TCAesKeySched_t sched)
+{
+ uint8_t buffer[TC_AES_BLOCK_SIZE];
+ uint8_t nonce[TC_AES_BLOCK_SIZE];
+ unsigned int block_num;
+ unsigned int i;
+
+ /* input sanity check: */
+ if (out == (uint8_t *)0 ||
+ in == (uint8_t *)0 ||
+ ctr == (uint8_t *)0 ||
+ sched == (TCAesKeySched_t)0 ||
+ inlen == 0 ||
+ outlen == 0 ||
+ outlen != inlen) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ /* copy the ctr to the nonce */
+ (void)_copy(nonce, sizeof(nonce), ctr, sizeof(nonce));
+
+ /* select the last 4 bytes of the nonce to be incremented */
+ block_num = (nonce[12] << 24) | (nonce[13] << 16) |
+ (nonce[14] << 8) | (nonce[15]);
+ for (i = 0; i < inlen; ++i) {
+ if ((i % (TC_AES_BLOCK_SIZE)) == 0) {
+ /* encrypt data using the current nonce */
+ if (tc_aes_encrypt(buffer, nonce, sched)) {
+ block_num++;
+ nonce[12] = (uint8_t)(block_num >> 24);
+ nonce[13] = (uint8_t)(block_num >> 16);
+ nonce[14] = (uint8_t)(block_num >> 8);
+ nonce[15] = (uint8_t)(block_num);
+ } else {
+ return TC_CRYPTO_FAIL;
+ }
+ }
+ /* update the output */
+ *out++ = buffer[i % (TC_AES_BLOCK_SIZE)] ^ *in++;
+ }
+
+ /* update the counter */
+ ctr[12] = nonce[12];
+ ctr[13] = nonce[13];
+ ctr[14] = nonce[14];
+ ctr[15] = nonce[15];
+
+ return TC_CRYPTO_SUCCESS;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ctr_prng.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ctr_prng.c
new file mode 100644
index 00000000..d3410bc5
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ctr_prng.c
@@ -0,0 +1,279 @@
+/* ctr_prng.c - TinyCrypt implementation of CTR-PRNG */
+
+/*
+ * Copyright (c) 2016, Chris Morrison
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ctr_prng.h"
+#include "utils.h"
+#include "constants.h"
+#include
+
+/*
+ * This PRNG is based on the CTR_DRBG described in Recommendation for Random
+ * Number Generation Using Deterministic Random Bit Generators,
+ * NIST SP 800-90A Rev. 1.
+ *
+ * Annotations to particular steps (e.g. 10.2.1.2 Step 1) refer to the steps
+ * described in that document.
+ *
+ */
+
+/**
+ * @brief Array incrementer
+ * Treats the supplied array as one contiguous number (MSB in arr[0]), and
+ * increments it by one
+ * @return none
+ * @param arr IN/OUT -- array to be incremented
+ * @param len IN -- size of arr in bytes
+ */
+static void arrInc(uint8_t arr[], unsigned int len)
+{
+ unsigned int i;
+ if (0 != arr) {
+ for (i = len; i > 0U; i--) {
+ if (++arr[i - 1] != 0U) {
+ break;
+ }
+ }
+ }
+}
+
+/**
+ * @brief CTR PRNG update
+ * Updates the internal state of supplied the CTR PRNG context
+ * increments it by one
+ * @return none
+ * @note Assumes: providedData is (TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE) bytes long
+ * @param ctx IN/OUT -- CTR PRNG state
+ * @param providedData IN -- data used when updating the internal state
+ */
+static void tc_ctr_prng_update(TCCtrPrng_t *const ctx, uint8_t const *const providedData)
+{
+ if (0 != ctx) {
+ /* 10.2.1.2 step 1 */
+ uint8_t temp[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE];
+ unsigned int len = 0U;
+
+ /* 10.2.1.2 step 2 */
+ while (len < sizeof temp) {
+ unsigned int blocklen = sizeof(temp) - len;
+ uint8_t output_block[TC_AES_BLOCK_SIZE];
+
+ /* 10.2.1.2 step 2.1 */
+ arrInc(ctx->V, sizeof ctx->V);
+
+ /* 10.2.1.2 step 2.2 */
+ if (blocklen > TC_AES_BLOCK_SIZE) {
+ blocklen = TC_AES_BLOCK_SIZE;
+ }
+ (void)tc_aes_encrypt(output_block, ctx->V, &ctx->key);
+
+ /* 10.2.1.2 step 2.3/step 3 */
+ memcpy(&(temp[len]), output_block, blocklen);
+
+ len += blocklen;
+ }
+
+ /* 10.2.1.2 step 4 */
+ if (0 != providedData) {
+ unsigned int i;
+ for (i = 0U; i < sizeof temp; i++) {
+ temp[i] ^= providedData[i];
+ }
+ }
+
+ /* 10.2.1.2 step 5 */
+ (void)tc_aes128_set_encrypt_key(&ctx->key, temp);
+
+ /* 10.2.1.2 step 6 */
+ memcpy(ctx->V, &(temp[TC_AES_KEY_SIZE]), TC_AES_BLOCK_SIZE);
+ }
+}
+
+int tc_ctr_prng_init(TCCtrPrng_t *const ctx,
+ uint8_t const *const entropy,
+ unsigned int entropyLen,
+ uint8_t const *const personalization,
+ unsigned int pLen)
+{
+ int result = TC_CRYPTO_FAIL;
+ unsigned int i;
+ uint8_t personalization_buf[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE] = { 0U };
+ uint8_t seed_material[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE];
+ uint8_t zeroArr[TC_AES_BLOCK_SIZE] = { 0U };
+
+ if (0 != personalization) {
+ /* 10.2.1.3.1 step 1 */
+ unsigned int len = pLen;
+ if (len > sizeof personalization_buf) {
+ len = sizeof personalization_buf;
+ }
+
+ /* 10.2.1.3.1 step 2 */
+ memcpy(personalization_buf, personalization, len);
+ }
+
+ if ((0 != ctx) && (0 != entropy) && (entropyLen >= sizeof seed_material)) {
+ /* 10.2.1.3.1 step 3 */
+ memcpy(seed_material, entropy, sizeof seed_material);
+ for (i = 0U; i < sizeof seed_material; i++) {
+ seed_material[i] ^= personalization_buf[i];
+ }
+
+ /* 10.2.1.3.1 step 4 */
+ (void)tc_aes128_set_encrypt_key(&ctx->key, zeroArr);
+
+ /* 10.2.1.3.1 step 5 */
+ memset(ctx->V, 0x00, sizeof ctx->V);
+
+ /* 10.2.1.3.1 step 6 */
+ tc_ctr_prng_update(ctx, seed_material);
+
+ /* 10.2.1.3.1 step 7 */
+ ctx->reseedCount = 1U;
+
+ result = TC_CRYPTO_SUCCESS;
+ }
+ return result;
+}
+
+int tc_ctr_prng_reseed(TCCtrPrng_t *const ctx,
+ uint8_t const *const entropy,
+ unsigned int entropyLen,
+ uint8_t const *const additional_input,
+ unsigned int additionallen)
+{
+ unsigned int i;
+ int result = TC_CRYPTO_FAIL;
+ uint8_t additional_input_buf[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE] = { 0U };
+ uint8_t seed_material[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE];
+
+ if (0 != additional_input) {
+ /* 10.2.1.4.1 step 1 */
+ unsigned int len = additionallen;
+ if (len > sizeof additional_input_buf) {
+ len = sizeof additional_input_buf;
+ }
+
+ /* 10.2.1.4.1 step 2 */
+ memcpy(additional_input_buf, additional_input, len);
+ }
+
+ unsigned int seedlen = (unsigned int)TC_AES_KEY_SIZE + (unsigned int)TC_AES_BLOCK_SIZE;
+ if ((0 != ctx) && (entropyLen >= seedlen)) {
+ /* 10.2.1.4.1 step 3 */
+ memcpy(seed_material, entropy, sizeof seed_material);
+ for (i = 0U; i < sizeof seed_material; i++) {
+ seed_material[i] ^= additional_input_buf[i];
+ }
+
+ /* 10.2.1.4.1 step 4 */
+ tc_ctr_prng_update(ctx, seed_material);
+
+ /* 10.2.1.4.1 step 5 */
+ ctx->reseedCount = 1U;
+
+ result = TC_CRYPTO_SUCCESS;
+ }
+ return result;
+}
+
+int tc_ctr_prng_generate(TCCtrPrng_t *const ctx,
+ uint8_t const *const additional_input,
+ unsigned int additionallen,
+ uint8_t *const out,
+ unsigned int outlen)
+{
+ /* 2^48 - see section 10.2.1 */
+ static const uint64_t MAX_REQS_BEFORE_RESEED = 0x1000000000000ULL;
+
+ /* 2^19 bits - see section 10.2.1 */
+ static const unsigned int MAX_BYTES_PER_REQ = 65536U;
+
+ unsigned int result = TC_CRYPTO_FAIL;
+
+ if ((0 != ctx) && (0 != out) && (outlen < MAX_BYTES_PER_REQ)) {
+ /* 10.2.1.5.1 step 1 */
+ if (ctx->reseedCount > MAX_REQS_BEFORE_RESEED) {
+ result = TC_CTR_PRNG_RESEED_REQ;
+ } else {
+ uint8_t additional_input_buf[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE] = { 0U };
+ if (0 != additional_input) {
+ /* 10.2.1.5.1 step 2 */
+ unsigned int len = additionallen;
+ if (len > sizeof additional_input_buf) {
+ len = sizeof additional_input_buf;
+ }
+ memcpy(additional_input_buf, additional_input, len);
+ tc_ctr_prng_update(ctx, additional_input_buf);
+ }
+
+ /* 10.2.1.5.1 step 3 - implicit */
+
+ /* 10.2.1.5.1 step 4 */
+ unsigned int len = 0U;
+ while (len < outlen) {
+ unsigned int blocklen = outlen - len;
+ uint8_t output_block[TC_AES_BLOCK_SIZE];
+
+ /* 10.2.1.5.1 step 4.1 */
+ arrInc(ctx->V, sizeof ctx->V);
+
+ /* 10.2.1.5.1 step 4.2 */
+ (void)tc_aes_encrypt(output_block, ctx->V, &ctx->key);
+
+ /* 10.2.1.5.1 step 4.3/step 5 */
+ if (blocklen > TC_AES_BLOCK_SIZE) {
+ blocklen = TC_AES_BLOCK_SIZE;
+ }
+ memcpy(&(out[len]), output_block, blocklen);
+
+ len += blocklen;
+ }
+
+ /* 10.2.1.5.1 step 6 */
+ tc_ctr_prng_update(ctx, additional_input_buf);
+
+ /* 10.2.1.5.1 step 7 */
+ ctx->reseedCount++;
+
+ /* 10.2.1.5.1 step 8 */
+ result = TC_CRYPTO_SUCCESS;
+ }
+ }
+
+ return result;
+}
+
+void tc_ctr_prng_uninstantiate(TCCtrPrng_t *const ctx)
+{
+ if (0 != ctx) {
+ memset(ctx->key.words, 0x00, sizeof ctx->key.words);
+ memset(ctx->V, 0x00, sizeof ctx->V);
+ ctx->reseedCount = 0U;
+ }
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc.c
new file mode 100644
index 00000000..eb3fa223
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc.c
@@ -0,0 +1,923 @@
+/* ecc.c - TinyCrypt implementation of common ECC functions */
+
+/*
+ * Copyright (c) 2014, Kenneth MacKay
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ecc.h"
+#include "ecc_platform_specific.h"
+#include
+
+/* IMPORTANT: Make sure a cryptographically-secure PRNG is set and the platform
+ * has access to enough entropy in order to feed the PRNG regularly. */
+#if default_RNG_defined
+static uECC_RNG_Function g_rng_function = &default_CSPRNG;
+#else
+static uECC_RNG_Function g_rng_function = 0;
+#endif
+
+void uECC_set_rng(uECC_RNG_Function rng_function)
+{
+ g_rng_function = rng_function;
+}
+
+uECC_RNG_Function uECC_get_rng(void)
+{
+ return g_rng_function;
+}
+
+int uECC_curve_private_key_size(uECC_Curve curve)
+{
+ return BITS_TO_BYTES(curve->num_n_bits);
+}
+
+int uECC_curve_public_key_size(uECC_Curve curve)
+{
+ return 2 * curve->num_bytes;
+}
+
+void uECC_vli_clear(uECC_word_t *vli, wordcount_t num_words)
+{
+ wordcount_t i;
+ for (i = 0; i < num_words; ++i) {
+ vli[i] = 0;
+ }
+}
+
+uECC_word_t uECC_vli_isZero(const uECC_word_t *vli, wordcount_t num_words)
+{
+ uECC_word_t bits = 0;
+ wordcount_t i;
+ for (i = 0; i < num_words; ++i) {
+ bits |= vli[i];
+ }
+ return (bits == 0);
+}
+
+uECC_word_t uECC_vli_testBit(const uECC_word_t *vli, bitcount_t bit)
+{
+ return (vli[bit >> uECC_WORD_BITS_SHIFT] &
+ ((uECC_word_t)1 << (bit & uECC_WORD_BITS_MASK)));
+}
+
+/* Counts the number of words in vli. */
+static wordcount_t vli_numDigits(const uECC_word_t *vli,
+ const wordcount_t max_words)
+{
+ wordcount_t i;
+ /* Search from the end until we find a non-zero digit. We do it in reverse
+ * because we expect that most digits will be nonzero. */
+ for (i = max_words - 1; i >= 0 && vli[i] == 0; --i) {
+ }
+
+ return (i + 1);
+}
+
+bitcount_t uECC_vli_numBits(const uECC_word_t *vli,
+ const wordcount_t max_words)
+{
+ uECC_word_t i;
+ uECC_word_t digit;
+
+ wordcount_t num_digits = vli_numDigits(vli, max_words);
+ if (num_digits == 0) {
+ return 0;
+ }
+
+ digit = vli[num_digits - 1];
+ for (i = 0; digit; ++i) {
+ digit >>= 1;
+ }
+
+ return (((bitcount_t)(num_digits - 1) << uECC_WORD_BITS_SHIFT) + i);
+}
+
+void uECC_vli_set(uECC_word_t *dest, const uECC_word_t *src,
+ wordcount_t num_words)
+{
+ wordcount_t i;
+
+ for (i = 0; i < num_words; ++i) {
+ dest[i] = src[i];
+ }
+}
+
+cmpresult_t uECC_vli_cmp_unsafe(const uECC_word_t *left,
+ const uECC_word_t *right,
+ wordcount_t num_words)
+{
+ wordcount_t i;
+
+ for (i = num_words - 1; i >= 0; --i) {
+ if (left[i] > right[i]) {
+ return 1;
+ } else if (left[i] < right[i]) {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+uECC_word_t uECC_vli_equal(const uECC_word_t *left, const uECC_word_t *right,
+ wordcount_t num_words)
+{
+ uECC_word_t diff = 0;
+ wordcount_t i;
+
+ for (i = num_words - 1; i >= 0; --i) {
+ diff |= (left[i] ^ right[i]);
+ }
+ return !(diff == 0);
+}
+
+uECC_word_t cond_set(uECC_word_t p_true, uECC_word_t p_false, unsigned int cond)
+{
+ return (p_true * (cond)) | (p_false * (!cond));
+}
+
+/* Computes result = left - right, returning borrow, in constant time.
+ * Can modify in place. */
+uECC_word_t uECC_vli_sub(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, wordcount_t num_words)
+{
+ uECC_word_t borrow = 0;
+ wordcount_t i;
+ for (i = 0; i < num_words; ++i) {
+ uECC_word_t diff = left[i] - right[i] - borrow;
+ uECC_word_t val = (diff > left[i]);
+ borrow = cond_set(val, borrow, (diff != left[i]));
+
+ result[i] = diff;
+ }
+ return borrow;
+}
+
+/* Computes result = left + right, returning carry, in constant time.
+ * Can modify in place. */
+static uECC_word_t uECC_vli_add(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, wordcount_t num_words)
+{
+ uECC_word_t carry = 0;
+ wordcount_t i;
+ for (i = 0; i < num_words; ++i) {
+ uECC_word_t sum = left[i] + right[i] + carry;
+ uECC_word_t val = (sum < left[i]);
+ carry = cond_set(val, carry, (sum != left[i]));
+ result[i] = sum;
+ }
+ return carry;
+}
+
+cmpresult_t uECC_vli_cmp(const uECC_word_t *left, const uECC_word_t *right,
+ wordcount_t num_words)
+{
+ uECC_word_t tmp[NUM_ECC_WORDS];
+ uECC_word_t neg = !!uECC_vli_sub(tmp, left, right, num_words);
+ uECC_word_t equal = uECC_vli_isZero(tmp, num_words);
+ return (!equal - 2 * neg);
+}
+
+/* Computes vli = vli >> 1. */
+static void uECC_vli_rshift1(uECC_word_t *vli, wordcount_t num_words)
+{
+ uECC_word_t *end = vli;
+ uECC_word_t carry = 0;
+
+ vli += num_words;
+ while (vli-- > end) {
+ uECC_word_t temp = *vli;
+ *vli = (temp >> 1) | carry;
+ carry = temp << (uECC_WORD_BITS - 1);
+ }
+}
+
+static void muladd(uECC_word_t a, uECC_word_t b, uECC_word_t *r0,
+ uECC_word_t *r1, uECC_word_t *r2)
+{
+ uECC_dword_t p = (uECC_dword_t)a * b;
+ uECC_dword_t r01 = ((uECC_dword_t)(*r1) << uECC_WORD_BITS) | *r0;
+ r01 += p;
+ *r2 += (r01 < p);
+ *r1 = r01 >> uECC_WORD_BITS;
+ *r0 = (uECC_word_t)r01;
+}
+
+/* Computes result = left * right. Result must be 2 * num_words long. */
+static void uECC_vli_mult(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, wordcount_t num_words)
+{
+ uECC_word_t r0 = 0;
+ uECC_word_t r1 = 0;
+ uECC_word_t r2 = 0;
+ wordcount_t i, k;
+
+ /* Compute each digit of result in sequence, maintaining the carries. */
+ for (k = 0; k < num_words; ++k) {
+ for (i = 0; i <= k; ++i) {
+ muladd(left[i], right[k - i], &r0, &r1, &r2);
+ }
+
+ result[k] = r0;
+ r0 = r1;
+ r1 = r2;
+ r2 = 0;
+ }
+
+ for (k = num_words; k < num_words * 2 - 1; ++k) {
+ for (i = (k + 1) - num_words; i < num_words; ++i) {
+ muladd(left[i], right[k - i], &r0, &r1, &r2);
+ }
+ result[k] = r0;
+ r0 = r1;
+ r1 = r2;
+ r2 = 0;
+ }
+ result[num_words * 2 - 1] = r0;
+}
+
+void uECC_vli_modAdd(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, const uECC_word_t *mod,
+ wordcount_t num_words)
+{
+ uECC_word_t carry = uECC_vli_add(result, left, right, num_words);
+ if (carry || uECC_vli_cmp_unsafe(mod, result, num_words) != 1) {
+ /* result > mod (result = mod + remainder), so subtract mod to get
+ * remainder. */
+ uECC_vli_sub(result, result, mod, num_words);
+ }
+}
+
+void uECC_vli_modSub(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, const uECC_word_t *mod,
+ wordcount_t num_words)
+{
+ uECC_word_t l_borrow = uECC_vli_sub(result, left, right, num_words);
+ if (l_borrow) {
+ /* In this case, result == -diff == (max int) - diff. Since -x % d == d - x,
+ * we can get the correct result from result + mod (with overflow). */
+ uECC_vli_add(result, result, mod, num_words);
+ }
+}
+
+/* Computes result = product % mod, where product is 2N words long. */
+/* Currently only designed to work for curve_p or curve_n. */
+void uECC_vli_mmod(uECC_word_t *result, uECC_word_t *product,
+ const uECC_word_t *mod, wordcount_t num_words)
+{
+ uECC_word_t mod_multiple[2 * NUM_ECC_WORDS];
+ uECC_word_t tmp[2 * NUM_ECC_WORDS];
+ uECC_word_t *v[2] = { tmp, product };
+ uECC_word_t index;
+
+ /* Shift mod so its highest set bit is at the maximum position. */
+ bitcount_t shift = (num_words * 2 * uECC_WORD_BITS) -
+ uECC_vli_numBits(mod, num_words);
+ wordcount_t word_shift = shift / uECC_WORD_BITS;
+ wordcount_t bit_shift = shift % uECC_WORD_BITS;
+ uECC_word_t carry = 0;
+ uECC_vli_clear(mod_multiple, word_shift);
+ if (bit_shift > 0) {
+ for (index = 0; index < (uECC_word_t)num_words; ++index) {
+ mod_multiple[word_shift + index] = (mod[index] << bit_shift) | carry;
+ carry = mod[index] >> (uECC_WORD_BITS - bit_shift);
+ }
+ } else {
+ uECC_vli_set(mod_multiple + word_shift, mod, num_words);
+ }
+
+ for (index = 1; shift >= 0; --shift) {
+ uECC_word_t borrow = 0;
+ wordcount_t i;
+ for (i = 0; i < num_words * 2; ++i) {
+ uECC_word_t diff = v[index][i] - mod_multiple[i] - borrow;
+ if (diff != v[index][i]) {
+ borrow = (diff > v[index][i]);
+ }
+ v[1 - index][i] = diff;
+ }
+ /* Swap the index if there was no borrow */
+ index = !(index ^ borrow);
+ uECC_vli_rshift1(mod_multiple, num_words);
+ mod_multiple[num_words - 1] |= mod_multiple[num_words] << (uECC_WORD_BITS - 1);
+ uECC_vli_rshift1(mod_multiple + num_words, num_words);
+ }
+ uECC_vli_set(result, v[index], num_words);
+}
+
+void uECC_vli_modMult(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, const uECC_word_t *mod,
+ wordcount_t num_words)
+{
+ uECC_word_t product[2 * NUM_ECC_WORDS];
+ uECC_vli_mult(product, left, right, num_words);
+ uECC_vli_mmod(result, product, mod, num_words);
+}
+
+void uECC_vli_modMult_fast(uECC_word_t *result, const uECC_word_t *left,
+ const uECC_word_t *right, uECC_Curve curve)
+{
+ uECC_word_t product[2 * NUM_ECC_WORDS];
+ uECC_vli_mult(product, left, right, curve->num_words);
+
+ curve->mmod_fast(result, product);
+}
+
+static void uECC_vli_modSquare_fast(uECC_word_t *result,
+ const uECC_word_t *left,
+ uECC_Curve curve)
+{
+ uECC_vli_modMult_fast(result, left, left, curve);
+}
+
+#define EVEN(vli) (!(vli[0] & 1))
+
+static void vli_modInv_update(uECC_word_t *uv,
+ const uECC_word_t *mod,
+ wordcount_t num_words)
+{
+ uECC_word_t carry = 0;
+
+ if (!EVEN(uv)) {
+ carry = uECC_vli_add(uv, uv, mod, num_words);
+ }
+ uECC_vli_rshift1(uv, num_words);
+ if (carry) {
+ uv[num_words - 1] |= HIGH_BIT_SET;
+ }
+}
+
+void uECC_vli_modInv(uECC_word_t *result, const uECC_word_t *input,
+ const uECC_word_t *mod, wordcount_t num_words)
+{
+ uECC_word_t a[NUM_ECC_WORDS], b[NUM_ECC_WORDS];
+ uECC_word_t u[NUM_ECC_WORDS], v[NUM_ECC_WORDS];
+ cmpresult_t cmpResult;
+
+ if (uECC_vli_isZero(input, num_words)) {
+ uECC_vli_clear(result, num_words);
+ return;
+ }
+
+ uECC_vli_set(a, input, num_words);
+ uECC_vli_set(b, mod, num_words);
+ uECC_vli_clear(u, num_words);
+ u[0] = 1;
+ uECC_vli_clear(v, num_words);
+ while ((cmpResult = uECC_vli_cmp_unsafe(a, b, num_words)) != 0) {
+ if (EVEN(a)) {
+ uECC_vli_rshift1(a, num_words);
+ vli_modInv_update(u, mod, num_words);
+ } else if (EVEN(b)) {
+ uECC_vli_rshift1(b, num_words);
+ vli_modInv_update(v, mod, num_words);
+ } else if (cmpResult > 0) {
+ uECC_vli_sub(a, a, b, num_words);
+ uECC_vli_rshift1(a, num_words);
+ if (uECC_vli_cmp_unsafe(u, v, num_words) < 0) {
+ uECC_vli_add(u, u, mod, num_words);
+ }
+ uECC_vli_sub(u, u, v, num_words);
+ vli_modInv_update(u, mod, num_words);
+ } else {
+ uECC_vli_sub(b, b, a, num_words);
+ uECC_vli_rshift1(b, num_words);
+ if (uECC_vli_cmp_unsafe(v, u, num_words) < 0) {
+ uECC_vli_add(v, v, mod, num_words);
+ }
+ uECC_vli_sub(v, v, u, num_words);
+ vli_modInv_update(v, mod, num_words);
+ }
+ }
+ uECC_vli_set(result, u, num_words);
+}
+
+/* ------ Point operations ------ */
+
+void double_jacobian_default(uECC_word_t *X1, uECC_word_t *Y1,
+ uECC_word_t *Z1, uECC_Curve curve)
+{
+ /* t1 = X, t2 = Y, t3 = Z */
+ uECC_word_t t4[NUM_ECC_WORDS];
+ uECC_word_t t5[NUM_ECC_WORDS];
+ wordcount_t num_words = curve->num_words;
+
+ if (uECC_vli_isZero(Z1, num_words)) {
+ return;
+ }
+
+ uECC_vli_modSquare_fast(t4, Y1, curve); /* t4 = y1^2 */
+ uECC_vli_modMult_fast(t5, X1, t4, curve); /* t5 = x1*y1^2 = A */
+ uECC_vli_modSquare_fast(t4, t4, curve); /* t4 = y1^4 */
+ uECC_vli_modMult_fast(Y1, Y1, Z1, curve); /* t2 = y1*z1 = z3 */
+ uECC_vli_modSquare_fast(Z1, Z1, curve); /* t3 = z1^2 */
+
+ uECC_vli_modAdd(X1, X1, Z1, curve->p, num_words); /* t1 = x1 + z1^2 */
+ uECC_vli_modAdd(Z1, Z1, Z1, curve->p, num_words); /* t3 = 2*z1^2 */
+ uECC_vli_modSub(Z1, X1, Z1, curve->p, num_words); /* t3 = x1 - z1^2 */
+ uECC_vli_modMult_fast(X1, X1, Z1, curve); /* t1 = x1^2 - z1^4 */
+
+ uECC_vli_modAdd(Z1, X1, X1, curve->p, num_words); /* t3 = 2*(x1^2 - z1^4) */
+ uECC_vli_modAdd(X1, X1, Z1, curve->p, num_words); /* t1 = 3*(x1^2 - z1^4) */
+ if (uECC_vli_testBit(X1, 0)) {
+ uECC_word_t l_carry = uECC_vli_add(X1, X1, curve->p, num_words);
+ uECC_vli_rshift1(X1, num_words);
+ X1[num_words - 1] |= l_carry << (uECC_WORD_BITS - 1);
+ } else {
+ uECC_vli_rshift1(X1, num_words);
+ }
+
+ /* t1 = 3/2*(x1^2 - z1^4) = B */
+ uECC_vli_modSquare_fast(Z1, X1, curve); /* t3 = B^2 */
+ uECC_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - A */
+ uECC_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - 2A = x3 */
+ uECC_vli_modSub(t5, t5, Z1, curve->p, num_words); /* t5 = A - x3 */
+ uECC_vli_modMult_fast(X1, X1, t5, curve); /* t1 = B * (A - x3) */
+ /* t4 = B * (A - x3) - y1^4 = y3: */
+ uECC_vli_modSub(t4, X1, t4, curve->p, num_words);
+
+ uECC_vli_set(X1, Z1, num_words);
+ uECC_vli_set(Z1, Y1, num_words);
+ uECC_vli_set(Y1, t4, num_words);
+}
+
+void x_side_default(uECC_word_t *result,
+ const uECC_word_t *x,
+ uECC_Curve curve)
+{
+ uECC_word_t _3[NUM_ECC_WORDS] = { 3 }; /* -a = 3 */
+ wordcount_t num_words = curve->num_words;
+
+ uECC_vli_modSquare_fast(result, x, curve); /* r = x^2 */
+ uECC_vli_modSub(result, result, _3, curve->p, num_words); /* r = x^2 - 3 */
+ uECC_vli_modMult_fast(result, result, x, curve); /* r = x^3 - 3x */
+ /* r = x^3 - 3x + b: */
+ uECC_vli_modAdd(result, result, curve->b, curve->p, num_words);
+}
+
+uECC_Curve uECC_secp256r1(void)
+{
+ return &curve_secp256r1;
+}
+
+void vli_mmod_fast_secp256r1(unsigned int *result, unsigned int *product)
+{
+ unsigned int tmp[NUM_ECC_WORDS];
+ int carry;
+
+ /* t */
+ uECC_vli_set(result, product, NUM_ECC_WORDS);
+
+ /* s1 */
+ tmp[0] = tmp[1] = tmp[2] = 0;
+ tmp[3] = product[11];
+ tmp[4] = product[12];
+ tmp[5] = product[13];
+ tmp[6] = product[14];
+ tmp[7] = product[15];
+ carry = uECC_vli_add(tmp, tmp, tmp, NUM_ECC_WORDS);
+ carry += uECC_vli_add(result, result, tmp, NUM_ECC_WORDS);
+
+ /* s2 */
+ tmp[3] = product[12];
+ tmp[4] = product[13];
+ tmp[5] = product[14];
+ tmp[6] = product[15];
+ tmp[7] = 0;
+ carry += uECC_vli_add(tmp, tmp, tmp, NUM_ECC_WORDS);
+ carry += uECC_vli_add(result, result, tmp, NUM_ECC_WORDS);
+
+ /* s3 */
+ tmp[0] = product[8];
+ tmp[1] = product[9];
+ tmp[2] = product[10];
+ tmp[3] = tmp[4] = tmp[5] = 0;
+ tmp[6] = product[14];
+ tmp[7] = product[15];
+ carry += uECC_vli_add(result, result, tmp, NUM_ECC_WORDS);
+
+ /* s4 */
+ tmp[0] = product[9];
+ tmp[1] = product[10];
+ tmp[2] = product[11];
+ tmp[3] = product[13];
+ tmp[4] = product[14];
+ tmp[5] = product[15];
+ tmp[6] = product[13];
+ tmp[7] = product[8];
+ carry += uECC_vli_add(result, result, tmp, NUM_ECC_WORDS);
+
+ /* d1 */
+ tmp[0] = product[11];
+ tmp[1] = product[12];
+ tmp[2] = product[13];
+ tmp[3] = tmp[4] = tmp[5] = 0;
+ tmp[6] = product[8];
+ tmp[7] = product[10];
+ carry -= uECC_vli_sub(result, result, tmp, NUM_ECC_WORDS);
+
+ /* d2 */
+ tmp[0] = product[12];
+ tmp[1] = product[13];
+ tmp[2] = product[14];
+ tmp[3] = product[15];
+ tmp[4] = tmp[5] = 0;
+ tmp[6] = product[9];
+ tmp[7] = product[11];
+ carry -= uECC_vli_sub(result, result, tmp, NUM_ECC_WORDS);
+
+ /* d3 */
+ tmp[0] = product[13];
+ tmp[1] = product[14];
+ tmp[2] = product[15];
+ tmp[3] = product[8];
+ tmp[4] = product[9];
+ tmp[5] = product[10];
+ tmp[6] = 0;
+ tmp[7] = product[12];
+ carry -= uECC_vli_sub(result, result, tmp, NUM_ECC_WORDS);
+
+ /* d4 */
+ tmp[0] = product[14];
+ tmp[1] = product[15];
+ tmp[2] = 0;
+ tmp[3] = product[9];
+ tmp[4] = product[10];
+ tmp[5] = product[11];
+ tmp[6] = 0;
+ tmp[7] = product[13];
+ carry -= uECC_vli_sub(result, result, tmp, NUM_ECC_WORDS);
+
+ if (carry < 0) {
+ do {
+ carry += uECC_vli_add(result, result, curve_secp256r1.p, NUM_ECC_WORDS);
+ } while (carry < 0);
+ } else {
+ while (carry ||
+ uECC_vli_cmp_unsafe(curve_secp256r1.p, result, NUM_ECC_WORDS) != 1) {
+ carry -= uECC_vli_sub(result, result, curve_secp256r1.p, NUM_ECC_WORDS);
+ }
+ }
+}
+
+uECC_word_t EccPoint_isZero(const uECC_word_t *point, uECC_Curve curve)
+{
+ return uECC_vli_isZero(point, curve->num_words * 2);
+}
+
+void apply_z(uECC_word_t *X1, uECC_word_t *Y1, const uECC_word_t *const Z,
+ uECC_Curve curve)
+{
+ uECC_word_t t1[NUM_ECC_WORDS];
+
+ uECC_vli_modSquare_fast(t1, Z, curve); /* z^2 */
+ uECC_vli_modMult_fast(X1, X1, t1, curve); /* x1 * z^2 */
+ uECC_vli_modMult_fast(t1, t1, Z, curve); /* z^3 */
+ uECC_vli_modMult_fast(Y1, Y1, t1, curve); /* y1 * z^3 */
+}
+
+/* P = (x1, y1) => 2P, (x2, y2) => P' */
+static void XYcZ_initial_double(uECC_word_t *X1, uECC_word_t *Y1,
+ uECC_word_t *X2, uECC_word_t *Y2,
+ const uECC_word_t *const initial_Z,
+ uECC_Curve curve)
+{
+ uECC_word_t z[NUM_ECC_WORDS];
+ wordcount_t num_words = curve->num_words;
+ if (initial_Z) {
+ uECC_vli_set(z, initial_Z, num_words);
+ } else {
+ uECC_vli_clear(z, num_words);
+ z[0] = 1;
+ }
+
+ uECC_vli_set(X2, X1, num_words);
+ uECC_vli_set(Y2, Y1, num_words);
+
+ apply_z(X1, Y1, z, curve);
+ curve->double_jacobian(X1, Y1, z, curve);
+ apply_z(X2, Y2, z, curve);
+}
+
+void XYcZ_add(uECC_word_t *X1, uECC_word_t *Y1,
+ uECC_word_t *X2, uECC_word_t *Y2,
+ uECC_Curve curve)
+{
+ /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */
+ uECC_word_t t5[NUM_ECC_WORDS];
+ wordcount_t num_words = curve->num_words;
+
+ uECC_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */
+ uECC_vli_modSquare_fast(t5, t5, curve); /* t5 = (x2 - x1)^2 = A */
+ uECC_vli_modMult_fast(X1, X1, t5, curve); /* t1 = x1*A = B */
+ uECC_vli_modMult_fast(X2, X2, t5, curve); /* t3 = x2*A = C */
+ uECC_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */
+ uECC_vli_modSquare_fast(t5, Y2, curve); /* t5 = (y2 - y1)^2 = D */
+
+ uECC_vli_modSub(t5, t5, X1, curve->p, num_words); /* t5 = D - B */
+ uECC_vli_modSub(t5, t5, X2, curve->p, num_words); /* t5 = D - B - C = x3 */
+ uECC_vli_modSub(X2, X2, X1, curve->p, num_words); /* t3 = C - B */
+ uECC_vli_modMult_fast(Y1, Y1, X2, curve); /* t2 = y1*(C - B) */
+ uECC_vli_modSub(X2, X1, t5, curve->p, num_words); /* t3 = B - x3 */
+ uECC_vli_modMult_fast(Y2, Y2, X2, curve); /* t4 = (y2 - y1)*(B - x3) */
+ uECC_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y3 */
+
+ uECC_vli_set(X2, t5, num_words);
+}
+
+/* Input P = (x1, y1, Z), Q = (x2, y2, Z)
+ Output P + Q = (x3, y3, Z3), P - Q = (x3', y3', Z3)
+ or P => P - Q, Q => P + Q
+ */
+static void XYcZ_addC(uECC_word_t *X1, uECC_word_t *Y1,
+ uECC_word_t *X2, uECC_word_t *Y2,
+ uECC_Curve curve)
+{
+ /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */
+ uECC_word_t t5[NUM_ECC_WORDS];
+ uECC_word_t t6[NUM_ECC_WORDS];
+ uECC_word_t t7[NUM_ECC_WORDS];
+ wordcount_t num_words = curve->num_words;
+
+ uECC_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */
+ uECC_vli_modSquare_fast(t5, t5, curve); /* t5 = (x2 - x1)^2 = A */
+ uECC_vli_modMult_fast(X1, X1, t5, curve); /* t1 = x1*A = B */
+ uECC_vli_modMult_fast(X2, X2, t5, curve); /* t3 = x2*A = C */
+ uECC_vli_modAdd(t5, Y2, Y1, curve->p, num_words); /* t5 = y2 + y1 */
+ uECC_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */
+
+ uECC_vli_modSub(t6, X2, X1, curve->p, num_words); /* t6 = C - B */
+ uECC_vli_modMult_fast(Y1, Y1, t6, curve); /* t2 = y1 * (C - B) = E */
+ uECC_vli_modAdd(t6, X1, X2, curve->p, num_words); /* t6 = B + C */
+ uECC_vli_modSquare_fast(X2, Y2, curve); /* t3 = (y2 - y1)^2 = D */
+ uECC_vli_modSub(X2, X2, t6, curve->p, num_words); /* t3 = D - (B + C) = x3 */
+
+ uECC_vli_modSub(t7, X1, X2, curve->p, num_words); /* t7 = B - x3 */
+ uECC_vli_modMult_fast(Y2, Y2, t7, curve); /* t4 = (y2 - y1)*(B - x3) */
+ /* t4 = (y2 - y1)*(B - x3) - E = y3: */
+ uECC_vli_modSub(Y2, Y2, Y1, curve->p, num_words);
+
+ uECC_vli_modSquare_fast(t7, t5, curve); /* t7 = (y2 + y1)^2 = F */
+ uECC_vli_modSub(t7, t7, t6, curve->p, num_words); /* t7 = F - (B + C) = x3' */
+ uECC_vli_modSub(t6, t7, X1, curve->p, num_words); /* t6 = x3' - B */
+ uECC_vli_modMult_fast(t6, t6, t5, curve); /* t6 = (y2+y1)*(x3' - B) */
+ /* t2 = (y2+y1)*(x3' - B) - E = y3': */
+ uECC_vli_modSub(Y1, t6, Y1, curve->p, num_words);
+
+ uECC_vli_set(X1, t7, num_words);
+}
+
+void EccPoint_mult(uECC_word_t *result, const uECC_word_t *point,
+ const uECC_word_t *scalar,
+ const uECC_word_t *initial_Z,
+ bitcount_t num_bits, uECC_Curve curve)
+{
+ /* R0 and R1 */
+ uECC_word_t Rx[2][NUM_ECC_WORDS];
+ uECC_word_t Ry[2][NUM_ECC_WORDS];
+ uECC_word_t z[NUM_ECC_WORDS];
+ bitcount_t i;
+ uECC_word_t nb;
+ wordcount_t num_words = curve->num_words;
+
+ uECC_vli_set(Rx[1], point, num_words);
+ uECC_vli_set(Ry[1], point + num_words, num_words);
+
+ XYcZ_initial_double(Rx[1], Ry[1], Rx[0], Ry[0], initial_Z, curve);
+
+ for (i = num_bits - 2; i > 0; --i) {
+ nb = !uECC_vli_testBit(scalar, i);
+ XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb], curve);
+ XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb], curve);
+ }
+
+ nb = !uECC_vli_testBit(scalar, 0);
+ XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb], curve);
+
+ /* Find final 1/Z value. */
+ uECC_vli_modSub(z, Rx[1], Rx[0], curve->p, num_words); /* X1 - X0 */
+ uECC_vli_modMult_fast(z, z, Ry[1 - nb], curve); /* Yb * (X1 - X0) */
+ uECC_vli_modMult_fast(z, z, point, curve); /* xP * Yb * (X1 - X0) */
+ uECC_vli_modInv(z, z, curve->p, num_words); /* 1 / (xP * Yb * (X1 - X0))*/
+ /* yP / (xP * Yb * (X1 - X0)) */
+ uECC_vli_modMult_fast(z, z, point + num_words, curve);
+ /* Xb * yP / (xP * Yb * (X1 - X0)) */
+ uECC_vli_modMult_fast(z, z, Rx[1 - nb], curve);
+ /* End 1/Z calculation */
+
+ XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb], curve);
+ apply_z(Rx[0], Ry[0], z, curve);
+
+ uECC_vli_set(result, Rx[0], num_words);
+ uECC_vli_set(result + num_words, Ry[0], num_words);
+}
+
+uECC_word_t regularize_k(const uECC_word_t *const k, uECC_word_t *k0,
+ uECC_word_t *k1, uECC_Curve curve)
+{
+ wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);
+
+ bitcount_t num_n_bits = curve->num_n_bits;
+
+ uECC_word_t carry = uECC_vli_add(k0, k, curve->n, num_n_words) ||
+ (num_n_bits < ((bitcount_t)num_n_words * uECC_WORD_SIZE * 8) &&
+ uECC_vli_testBit(k0, num_n_bits));
+
+ uECC_vli_add(k1, k0, curve->n, num_n_words);
+
+ return carry;
+}
+
+uECC_word_t EccPoint_compute_public_key(uECC_word_t *result,
+ uECC_word_t *private_key,
+ uECC_Curve curve)
+{
+ uECC_word_t tmp1[NUM_ECC_WORDS];
+ uECC_word_t tmp2[NUM_ECC_WORDS];
+ uECC_word_t *p2[2] = { tmp1, tmp2 };
+ uECC_word_t carry;
+
+ /* Regularize the bitcount for the private key so that attackers cannot
+ * use a side channel attack to learn the number of leading zeros. */
+ carry = regularize_k(private_key, tmp1, tmp2, curve);
+
+ EccPoint_mult(result, curve->G, p2[!carry], 0, curve->num_n_bits + 1, curve);
+
+ if (EccPoint_isZero(result, curve)) {
+ return 0;
+ }
+ return 1;
+}
+
+/* Converts an integer in uECC native format to big-endian bytes. */
+void uECC_vli_nativeToBytes(uint8_t *bytes, int num_bytes,
+ const unsigned int *native)
+{
+ wordcount_t i;
+ for (i = 0; i < num_bytes; ++i) {
+ unsigned b = num_bytes - 1 - i;
+ bytes[i] = native[b / uECC_WORD_SIZE] >> (8 * (b % uECC_WORD_SIZE));
+ }
+}
+
+/* Converts big-endian bytes to an integer in uECC native format. */
+void uECC_vli_bytesToNative(unsigned int *native, const uint8_t *bytes,
+ int num_bytes)
+{
+ wordcount_t i;
+ uECC_vli_clear(native, (num_bytes + (uECC_WORD_SIZE - 1)) / uECC_WORD_SIZE);
+ for (i = 0; i < num_bytes; ++i) {
+ unsigned b = num_bytes - 1 - i;
+ native[b / uECC_WORD_SIZE] |=
+ (uECC_word_t)bytes[i] << (8 * (b % uECC_WORD_SIZE));
+ }
+}
+
+int uECC_generate_random_int(uECC_word_t *random, const uECC_word_t *top,
+ wordcount_t num_words)
+{
+ uECC_word_t mask = (uECC_word_t)-1;
+ uECC_word_t tries;
+ bitcount_t num_bits = uECC_vli_numBits(top, num_words);
+
+ if (!g_rng_function) {
+ return 0;
+ }
+
+ for (tries = 0; tries < uECC_RNG_MAX_TRIES; ++tries) {
+ if (!g_rng_function((uint8_t *)random, num_words * uECC_WORD_SIZE)) {
+ return 0;
+ }
+ random[num_words - 1] &=
+ mask >> ((bitcount_t)(num_words * uECC_WORD_SIZE * 8 - num_bits));
+ if (!uECC_vli_isZero(random, num_words) &&
+ uECC_vli_cmp(top, random, num_words) == 1) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+int uECC_valid_point(const uECC_word_t *point, uECC_Curve curve)
+{
+ uECC_word_t tmp1[NUM_ECC_WORDS];
+ uECC_word_t tmp2[NUM_ECC_WORDS];
+ wordcount_t num_words = curve->num_words;
+
+ /* The point at infinity is invalid. */
+ if (EccPoint_isZero(point, curve)) {
+ return -1;
+ }
+
+ /* x and y must be smaller than p. */
+ if (uECC_vli_cmp_unsafe(curve->p, point, num_words) != 1 ||
+ uECC_vli_cmp_unsafe(curve->p, point + num_words, num_words) != 1) {
+ return -2;
+ }
+
+ uECC_vli_modSquare_fast(tmp1, point + num_words, curve);
+ curve->x_side(tmp2, point, curve); /* tmp2 = x^3 + ax + b */
+
+ /* Make sure that y^2 == x^3 + ax + b */
+ if (uECC_vli_equal(tmp1, tmp2, num_words) != 0)
+ return -3;
+
+ return 0;
+}
+
+int uECC_valid_public_key(const uint8_t *public_key, uECC_Curve curve)
+{
+ uECC_word_t _public[NUM_ECC_WORDS * 2];
+
+ uECC_vli_bytesToNative(_public, public_key, curve->num_bytes);
+ uECC_vli_bytesToNative(
+ _public + curve->num_words,
+ public_key + curve->num_bytes,
+ curve->num_bytes);
+
+ if (uECC_vli_cmp_unsafe(_public, curve->G, NUM_ECC_WORDS * 2) == 0) {
+ return -4;
+ }
+
+ return uECC_valid_point(_public, curve);
+}
+
+int uECC_compute_public_key(const uint8_t *private_key, uint8_t *public_key,
+ uECC_Curve curve)
+{
+ uECC_word_t _private[NUM_ECC_WORDS];
+ uECC_word_t _public[NUM_ECC_WORDS * 2];
+
+ uECC_vli_bytesToNative(
+ _private,
+ private_key,
+ BITS_TO_BYTES(curve->num_n_bits));
+
+ /* Make sure the private key is in the range [1, n-1]. */
+ if (uECC_vli_isZero(_private, BITS_TO_WORDS(curve->num_n_bits))) {
+ return 0;
+ }
+
+ if (uECC_vli_cmp(curve->n, _private, BITS_TO_WORDS(curve->num_n_bits)) != 1) {
+ return 0;
+ }
+
+ /* Compute public key. */
+ if (!EccPoint_compute_public_key(_public, _private, curve)) {
+ return 0;
+ }
+
+ uECC_vli_nativeToBytes(public_key, curve->num_bytes, _public);
+ uECC_vli_nativeToBytes(
+ public_key +
+ curve->num_bytes,
+ curve->num_bytes, _public + curve->num_words);
+ return 1;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_dh.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_dh.c
new file mode 100644
index 00000000..e2995ef2
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_dh.c
@@ -0,0 +1,198 @@
+/* ec_dh.c - TinyCrypt implementation of EC-DH */
+
+/*
+ * Copyright (c) 2014, Kenneth MacKay
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "constants.h"
+#include "ecc.h"
+#include "ecc_dh.h"
+#if defined(BFLB_BLE)
+#include "utils.h"
+#endif
+#include
+#if defined(BL_MCU_SDK)
+#include "ecc_platform_specific.h"
+#endif
+
+#if default_RNG_defined
+static uECC_RNG_Function g_rng_function = &default_CSPRNG;
+#else
+static uECC_RNG_Function g_rng_function = 0;
+#endif
+
+int uECC_make_key_with_d(uint8_t *public_key, uint8_t *private_key,
+ unsigned int *d, uECC_Curve curve)
+{
+ uECC_word_t _private[NUM_ECC_WORDS];
+ uECC_word_t _public[NUM_ECC_WORDS * 2];
+
+ /* This function is designed for test purposes-only (such as validating NIST
+ * test vectors) as it uses a provided value for d instead of generating
+ * it uniformly at random. */
+ memcpy(_private, d, NUM_ECC_BYTES);
+
+ /* Computing public-key from private: */
+ if (EccPoint_compute_public_key(_public, _private, curve)) {
+ /* Converting buffers to correct bit order: */
+ uECC_vli_nativeToBytes(private_key,
+ BITS_TO_BYTES(curve->num_n_bits),
+ _private);
+ uECC_vli_nativeToBytes(public_key,
+ curve->num_bytes,
+ _public);
+ uECC_vli_nativeToBytes(public_key + curve->num_bytes,
+ curve->num_bytes,
+ _public + curve->num_words);
+
+ /* erasing temporary buffer used to store secret: */
+ _set_secure(_private, 0, NUM_ECC_BYTES);
+
+ return 1;
+ }
+ return 0;
+}
+
+int uECC_make_key(uint8_t *public_key, uint8_t *private_key, uECC_Curve curve)
+{
+ uECC_word_t _random[NUM_ECC_WORDS * 2];
+ uECC_word_t _private[NUM_ECC_WORDS];
+ uECC_word_t _public[NUM_ECC_WORDS * 2];
+ uECC_word_t tries;
+
+ for (tries = 0; tries < uECC_RNG_MAX_TRIES; ++tries) {
+ /* Generating _private uniformly at random: */
+ uECC_RNG_Function rng_function = uECC_get_rng();
+ if (!rng_function ||
+ !rng_function((uint8_t *)_random, 2 * NUM_ECC_WORDS * uECC_WORD_SIZE)) {
+ return 0;
+ }
+
+ /* computing modular reduction of _random (see FIPS 186.4 B.4.1): */
+ uECC_vli_mmod(_private, _random, curve->n, BITS_TO_WORDS(curve->num_n_bits));
+
+ /* Computing public-key from private: */
+ if (EccPoint_compute_public_key(_public, _private, curve)) {
+ /* Converting buffers to correct bit order: */
+ uECC_vli_nativeToBytes(private_key,
+ BITS_TO_BYTES(curve->num_n_bits),
+ _private);
+ uECC_vli_nativeToBytes(public_key,
+ curve->num_bytes,
+ _public);
+ uECC_vli_nativeToBytes(public_key + curve->num_bytes,
+ curve->num_bytes,
+ _public + curve->num_words);
+
+ /* erasing temporary buffer that stored secret: */
+ _set_secure(_private, 0, NUM_ECC_BYTES);
+
+ return 1;
+ }
+ }
+ return 0;
+}
+
+int uECC_shared_secret(const uint8_t *public_key, const uint8_t *private_key,
+ uint8_t *secret, uECC_Curve curve)
+{
+ uECC_word_t _public[NUM_ECC_WORDS * 2];
+ uECC_word_t _private[NUM_ECC_WORDS];
+
+ uECC_word_t tmp[NUM_ECC_WORDS];
+ uECC_word_t *p2[2] = { _private, tmp };
+ uECC_word_t *initial_Z = 0;
+ uECC_word_t carry;
+ wordcount_t num_words = curve->num_words;
+ wordcount_t num_bytes = curve->num_bytes;
+ int r;
+
+ /* Converting buffers to correct bit order: */
+ uECC_vli_bytesToNative(_private,
+ private_key,
+ BITS_TO_BYTES(curve->num_n_bits));
+ uECC_vli_bytesToNative(_public,
+ public_key,
+ num_bytes);
+ uECC_vli_bytesToNative(_public + num_words,
+ public_key + num_bytes,
+ num_bytes);
+
+ /* Regularize the bitcount for the private key so that attackers cannot use a
+ * side channel attack to learn the number of leading zeros. */
+ carry = regularize_k(_private, _private, tmp, curve);
+
+ /* If an RNG function was specified, try to get a random initial Z value to
+ * improve protection against side-channel attacks. */
+ if (g_rng_function) {
+ if (!uECC_generate_random_int(p2[carry], curve->p, num_words)) {
+ r = 0;
+ goto clear_and_out;
+ }
+ initial_Z = p2[carry];
+ }
+
+ EccPoint_mult(_public, _public, p2[!carry], initial_Z, curve->num_n_bits + 1,
+ curve);
+
+ uECC_vli_nativeToBytes(secret, num_bytes, _public);
+ r = !EccPoint_isZero(_public, curve);
+
+clear_and_out:
+ /* erasing temporary buffer used to store secret: */
+ _set_secure(p2, 0, sizeof(p2));
+ _set_secure(tmp, 0, sizeof(tmp));
+ _set_secure(_private, 0, sizeof(_private));
+
+ return r;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_dsa.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_dsa.c
new file mode 100644
index 00000000..117e3d26
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_dsa.c
@@ -0,0 +1,294 @@
+/* ec_dsa.c - TinyCrypt implementation of EC-DSA */
+
+/* Copyright (c) 2014, Kenneth MacKay
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.*/
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "constants.h"
+#include "ecc.h"
+#include "ecc_dsa.h"
+#if defined(BL_MCU_SDK)
+#include "ecc_platform_specific.h"
+#endif
+
+#if default_RNG_defined
+static uECC_RNG_Function g_rng_function = &default_CSPRNG;
+#else
+static uECC_RNG_Function g_rng_function = 0;
+#endif
+
+static void bits2int(uECC_word_t *native, const uint8_t *bits,
+ unsigned bits_size, uECC_Curve curve)
+{
+ unsigned num_n_bytes = BITS_TO_BYTES(curve->num_n_bits);
+ unsigned num_n_words = BITS_TO_WORDS(curve->num_n_bits);
+ int shift;
+ uECC_word_t carry;
+ uECC_word_t *ptr;
+
+ if (bits_size > num_n_bytes) {
+ bits_size = num_n_bytes;
+ }
+
+ uECC_vli_clear(native, num_n_words);
+ uECC_vli_bytesToNative(native, bits, bits_size);
+ if (bits_size * 8 <= (unsigned)curve->num_n_bits) {
+ return;
+ }
+ shift = bits_size * 8 - curve->num_n_bits;
+ carry = 0;
+ ptr = native + num_n_words;
+ while (ptr-- > native) {
+ uECC_word_t temp = *ptr;
+ *ptr = (temp >> shift) | carry;
+ carry = temp << (uECC_WORD_BITS - shift);
+ }
+
+ /* Reduce mod curve_n */
+ if (uECC_vli_cmp_unsafe(curve->n, native, num_n_words) != 1) {
+ uECC_vli_sub(native, native, curve->n, num_n_words);
+ }
+}
+
+int uECC_sign_with_k(const uint8_t *private_key, const uint8_t *message_hash,
+ unsigned hash_size, uECC_word_t *k, uint8_t *signature,
+ uECC_Curve curve)
+{
+ uECC_word_t tmp[NUM_ECC_WORDS];
+ uECC_word_t s[NUM_ECC_WORDS];
+ uECC_word_t *k2[2] = { tmp, s };
+ uECC_word_t p[NUM_ECC_WORDS * 2];
+ uECC_word_t carry;
+ wordcount_t num_words = curve->num_words;
+ wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);
+ bitcount_t num_n_bits = curve->num_n_bits;
+
+ /* Make sure 0 < k < curve_n */
+ if (uECC_vli_isZero(k, num_words) ||
+ uECC_vli_cmp(curve->n, k, num_n_words) != 1) {
+ return 0;
+ }
+
+ carry = regularize_k(k, tmp, s, curve);
+ EccPoint_mult(p, curve->G, k2[!carry], 0, num_n_bits + 1, curve);
+ if (uECC_vli_isZero(p, num_words)) {
+ return 0;
+ }
+
+ /* If an RNG function was specified, get a random number
+ to prevent side channel analysis of k. */
+ if (!g_rng_function) {
+ uECC_vli_clear(tmp, num_n_words);
+ tmp[0] = 1;
+ } else if (!uECC_generate_random_int(tmp, curve->n, num_n_words)) {
+ return 0;
+ }
+
+ /* Prevent side channel analysis of uECC_vli_modInv() to determine
+ bits of k / the private key by premultiplying by a random number */
+ uECC_vli_modMult(k, k, tmp, curve->n, num_n_words); /* k' = rand * k */
+ uECC_vli_modInv(k, k, curve->n, num_n_words); /* k = 1 / k' */
+ uECC_vli_modMult(k, k, tmp, curve->n, num_n_words); /* k = 1 / k */
+
+ uECC_vli_nativeToBytes(signature, curve->num_bytes, p); /* store r */
+
+ /* tmp = d: */
+ uECC_vli_bytesToNative(tmp, private_key, BITS_TO_BYTES(curve->num_n_bits));
+
+ s[num_n_words - 1] = 0;
+ uECC_vli_set(s, p, num_words);
+ uECC_vli_modMult(s, tmp, s, curve->n, num_n_words); /* s = r*d */
+
+ bits2int(tmp, message_hash, hash_size, curve);
+ uECC_vli_modAdd(s, tmp, s, curve->n, num_n_words); /* s = e + r*d */
+ uECC_vli_modMult(s, s, k, curve->n, num_n_words); /* s = (e + r*d) / k */
+ if (uECC_vli_numBits(s, num_n_words) > (bitcount_t)curve->num_bytes * 8) {
+ return 0;
+ }
+
+ uECC_vli_nativeToBytes(signature + curve->num_bytes, curve->num_bytes, s);
+ return 1;
+}
+
+int uECC_sign(const uint8_t *private_key, const uint8_t *message_hash,
+ unsigned hash_size, uint8_t *signature, uECC_Curve curve)
+{
+ uECC_word_t _random[2 * NUM_ECC_WORDS];
+ uECC_word_t k[NUM_ECC_WORDS];
+ uECC_word_t tries;
+
+ for (tries = 0; tries < uECC_RNG_MAX_TRIES; ++tries) {
+ /* Generating _random uniformly at random: */
+ uECC_RNG_Function rng_function = uECC_get_rng();
+ if (!rng_function ||
+ !rng_function((uint8_t *)_random, 2 * NUM_ECC_WORDS * uECC_WORD_SIZE)) {
+ return 0;
+ }
+
+ // computing k as modular reduction of _random (see FIPS 186.4 B.5.1):
+ uECC_vli_mmod(k, _random, curve->n, BITS_TO_WORDS(curve->num_n_bits));
+
+ if (uECC_sign_with_k(private_key, message_hash, hash_size, k, signature,
+ curve)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static bitcount_t smax(bitcount_t a, bitcount_t b)
+{
+ return (a > b ? a : b);
+}
+
+int uECC_verify(const uint8_t *public_key, const uint8_t *message_hash,
+ unsigned hash_size, const uint8_t *signature,
+ uECC_Curve curve)
+{
+ uECC_word_t u1[NUM_ECC_WORDS], u2[NUM_ECC_WORDS];
+ uECC_word_t z[NUM_ECC_WORDS];
+ uECC_word_t sum[NUM_ECC_WORDS * 2];
+ uECC_word_t rx[NUM_ECC_WORDS];
+ uECC_word_t ry[NUM_ECC_WORDS];
+ uECC_word_t tx[NUM_ECC_WORDS];
+ uECC_word_t ty[NUM_ECC_WORDS];
+ uECC_word_t tz[NUM_ECC_WORDS];
+ const uECC_word_t *points[4];
+ const uECC_word_t *point;
+ bitcount_t num_bits;
+ bitcount_t i;
+
+ uECC_word_t _public[NUM_ECC_WORDS * 2];
+ uECC_word_t r[NUM_ECC_WORDS], s[NUM_ECC_WORDS];
+ wordcount_t num_words = curve->num_words;
+ wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);
+
+ rx[num_n_words - 1] = 0;
+ r[num_n_words - 1] = 0;
+ s[num_n_words - 1] = 0;
+
+ uECC_vli_bytesToNative(_public, public_key, curve->num_bytes);
+ uECC_vli_bytesToNative(_public + num_words, public_key + curve->num_bytes,
+ curve->num_bytes);
+ uECC_vli_bytesToNative(r, signature, curve->num_bytes);
+ uECC_vli_bytesToNative(s, signature + curve->num_bytes, curve->num_bytes);
+
+ /* r, s must not be 0. */
+ if (uECC_vli_isZero(r, num_words) || uECC_vli_isZero(s, num_words)) {
+ return 0;
+ }
+
+ /* r, s must be < n. */
+ if (uECC_vli_cmp_unsafe(curve->n, r, num_n_words) != 1 ||
+ uECC_vli_cmp_unsafe(curve->n, s, num_n_words) != 1) {
+ return 0;
+ }
+
+ /* Calculate u1 and u2. */
+ uECC_vli_modInv(z, s, curve->n, num_n_words); /* z = 1/s */
+ u1[num_n_words - 1] = 0;
+ bits2int(u1, message_hash, hash_size, curve);
+ uECC_vli_modMult(u1, u1, z, curve->n, num_n_words); /* u1 = e/s */
+ uECC_vli_modMult(u2, r, z, curve->n, num_n_words); /* u2 = r/s */
+
+ /* Calculate sum = G + Q. */
+ uECC_vli_set(sum, _public, num_words);
+ uECC_vli_set(sum + num_words, _public + num_words, num_words);
+ uECC_vli_set(tx, curve->G, num_words);
+ uECC_vli_set(ty, curve->G + num_words, num_words);
+ uECC_vli_modSub(z, sum, tx, curve->p, num_words); /* z = x2 - x1 */
+ XYcZ_add(tx, ty, sum, sum + num_words, curve);
+ uECC_vli_modInv(z, z, curve->p, num_words); /* z = 1/z */
+ apply_z(sum, sum + num_words, z, curve);
+
+ /* Use Shamir's trick to calculate u1*G + u2*Q */
+ points[0] = 0;
+ points[1] = curve->G;
+ points[2] = _public;
+ points[3] = sum;
+ num_bits = smax(uECC_vli_numBits(u1, num_n_words),
+ uECC_vli_numBits(u2, num_n_words));
+
+ point = points[(!!uECC_vli_testBit(u1, num_bits - 1)) |
+ ((!!uECC_vli_testBit(u2, num_bits - 1)) << 1)];
+ uECC_vli_set(rx, point, num_words);
+ uECC_vli_set(ry, point + num_words, num_words);
+ uECC_vli_clear(z, num_words);
+ z[0] = 1;
+
+ for (i = num_bits - 2; i >= 0; --i) {
+ uECC_word_t index;
+ curve->double_jacobian(rx, ry, z, curve);
+
+ index = (!!uECC_vli_testBit(u1, i)) | ((!!uECC_vli_testBit(u2, i)) << 1);
+ point = points[index];
+ if (point) {
+ uECC_vli_set(tx, point, num_words);
+ uECC_vli_set(ty, point + num_words, num_words);
+ apply_z(tx, ty, z, curve);
+ uECC_vli_modSub(tz, rx, tx, curve->p, num_words); /* Z = x2 - x1 */
+ XYcZ_add(tx, ty, rx, ry, curve);
+ uECC_vli_modMult_fast(z, z, tz, curve);
+ }
+ }
+
+ uECC_vli_modInv(z, z, curve->p, num_words); /* Z = 1/Z */
+ apply_z(rx, ry, z, curve);
+
+ /* v = x1 (mod n) */
+ if (uECC_vli_cmp_unsafe(curve->n, rx, num_n_words) != 1) {
+ uECC_vli_sub(rx, rx, curve->n, num_n_words);
+ }
+
+ /* Accept only if v == r. */
+ return (int)(uECC_vli_equal(rx, r, num_words) == 0);
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_platform_specific.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_platform_specific.c
new file mode 100644
index 00000000..42dfee82
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_platform_specific.c
@@ -0,0 +1,103 @@
+/* uECC_platform_specific.c - Implementation of platform specific functions*/
+
+/* Copyright (c) 2014, Kenneth MacKay
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.*/
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * uECC_platform_specific.c -- Implementation of platform specific functions
+ */
+
+#if defined(unix) || defined(__linux__) || defined(__unix__) || \
+ defined(__unix) | (defined(__APPLE__) && defined(__MACH__)) || \
+ defined(uECC_POSIX)
+
+/* Some POSIX-like system with /dev/urandom or /dev/random. */
+#include
+#include
+#include
+
+#include
+
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+
+int default_CSPRNG(uint8_t *dest, unsigned int size)
+{
+ /* input sanity check: */
+ if (dest == (uint8_t *)0 || (size <= 0))
+ return 0;
+
+ int fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
+ if (fd == -1) {
+ fd = open("/dev/random", O_RDONLY | O_CLOEXEC);
+ if (fd == -1) {
+ return 0;
+ }
+ }
+
+ char *ptr = (char *)dest;
+ size_t left = (size_t)size;
+ while (left > 0) {
+ ssize_t bytes_read = read(fd, ptr, left);
+ if (bytes_read <= 0) { // read failed
+ close(fd);
+ return 0;
+ }
+ left -= bytes_read;
+ ptr += bytes_read;
+ }
+
+ close(fd);
+ return 1;
+}
+
+#endif /* platform */
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/hmac.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/hmac.c
new file mode 100644
index 00000000..aee8a44e
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/hmac.c
@@ -0,0 +1,145 @@
+/* hmac.c - TinyCrypt implementation of the HMAC algorithm */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "hmac.h"
+#include "constants.h"
+#include "utils.h"
+
+static void rekey(uint8_t *key, const uint8_t *new_key, unsigned int key_size)
+{
+ const uint8_t inner_pad = (uint8_t)0x36;
+ const uint8_t outer_pad = (uint8_t)0x5c;
+ unsigned int i;
+
+ for (i = 0; i < key_size; ++i) {
+ key[i] = inner_pad ^ new_key[i];
+ key[i + TC_SHA256_BLOCK_SIZE] = outer_pad ^ new_key[i];
+ }
+ for (; i < TC_SHA256_BLOCK_SIZE; ++i) {
+ key[i] = inner_pad;
+ key[i + TC_SHA256_BLOCK_SIZE] = outer_pad;
+ }
+}
+
+int tc_hmac_set_key(TCHmacState_t ctx, const uint8_t *key,
+ unsigned int key_size)
+{
+ /* Input sanity check */
+ if (ctx == (TCHmacState_t)0 ||
+ key == (const uint8_t *)0 ||
+ key_size == 0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ const uint8_t dummy_key[TC_SHA256_BLOCK_SIZE];
+ struct tc_hmac_state_struct dummy_state;
+
+ if (key_size <= TC_SHA256_BLOCK_SIZE) {
+ /*
+ * The next three calls are dummy calls just to avoid
+ * certain timing attacks. Without these dummy calls,
+ * adversaries would be able to learn whether the key_size is
+ * greater than TC_SHA256_BLOCK_SIZE by measuring the time
+ * consumed in this process.
+ */
+ (void)tc_sha256_init(&dummy_state.hash_state);
+ (void)tc_sha256_update(&dummy_state.hash_state,
+ dummy_key,
+ key_size);
+ (void)tc_sha256_final(&dummy_state.key[TC_SHA256_DIGEST_SIZE],
+ &dummy_state.hash_state);
+
+ /* Actual code for when key_size <= TC_SHA256_BLOCK_SIZE: */
+ rekey(ctx->key, key, key_size);
+ } else {
+ (void)tc_sha256_init(&ctx->hash_state);
+ (void)tc_sha256_update(&ctx->hash_state, key, key_size);
+ (void)tc_sha256_final(&ctx->key[TC_SHA256_DIGEST_SIZE],
+ &ctx->hash_state);
+ rekey(ctx->key,
+ &ctx->key[TC_SHA256_DIGEST_SIZE],
+ TC_SHA256_DIGEST_SIZE);
+ }
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_hmac_init(TCHmacState_t ctx)
+{
+ /* input sanity check: */
+ if (ctx == (TCHmacState_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ (void)tc_sha256_init(&ctx->hash_state);
+ (void)tc_sha256_update(&ctx->hash_state, ctx->key, TC_SHA256_BLOCK_SIZE);
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_hmac_update(TCHmacState_t ctx,
+ const void *data,
+ unsigned int data_length)
+{
+ /* input sanity check: */
+ if (ctx == (TCHmacState_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ (void)tc_sha256_update(&ctx->hash_state, data, data_length);
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_hmac_final(uint8_t *tag, unsigned int taglen, TCHmacState_t ctx)
+{
+ /* input sanity check: */
+ if (tag == (uint8_t *)0 ||
+ taglen != TC_SHA256_DIGEST_SIZE ||
+ ctx == (TCHmacState_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ (void)tc_sha256_final(tag, &ctx->hash_state);
+
+ (void)tc_sha256_init(&ctx->hash_state);
+ (void)tc_sha256_update(&ctx->hash_state,
+ &ctx->key[TC_SHA256_BLOCK_SIZE],
+ TC_SHA256_BLOCK_SIZE);
+ (void)tc_sha256_update(&ctx->hash_state, tag, TC_SHA256_DIGEST_SIZE);
+ (void)tc_sha256_final(tag, &ctx->hash_state);
+
+ /* destroy the current state */
+ _set(ctx, 0, sizeof(*ctx));
+
+ return TC_CRYPTO_SUCCESS;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/hmac_prng.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/hmac_prng.c
new file mode 100644
index 00000000..8ef3c0c2
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/hmac_prng.c
@@ -0,0 +1,230 @@
+/* hmac_prng.c - TinyCrypt implementation of HMAC-PRNG */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "hmac_prng.h"
+#include "hmac.h"
+#include "constants.h"
+#include "utils.h"
+
+/*
+ * min bytes in the seed string.
+ * MIN_SLEN*8 must be at least the expected security level.
+ */
+static const unsigned int MIN_SLEN = 32;
+
+/*
+ * max bytes in the seed string;
+ * SP800-90A specifies a maximum of 2^35 bits (i.e., 2^32 bytes).
+ */
+static const unsigned int MAX_SLEN = UINT32_MAX;
+
+/*
+ * max bytes in the personalization string;
+ * SP800-90A specifies a maximum of 2^35 bits (i.e., 2^32 bytes).
+ */
+static const unsigned int MAX_PLEN = UINT32_MAX;
+
+/*
+ * max bytes in the additional_info string;
+ * SP800-90A specifies a maximum of 2^35 bits (i.e., 2^32 bytes).
+ */
+static const unsigned int MAX_ALEN = UINT32_MAX;
+
+/*
+ * max number of generates between re-seeds;
+ * TinyCrypt accepts up to (2^32 - 1) which is the maximal value of
+ * a 32-bit unsigned int variable, while SP800-90A specifies a maximum of 2^48.
+ */
+static const unsigned int MAX_GENS = UINT32_MAX;
+
+/*
+ * maximum bytes per generate call;
+ * SP800-90A specifies a maximum up to 2^19.
+ */
+static const unsigned int MAX_OUT = (1 << 19);
+
+/*
+ * Assumes: prng != NULL
+ */
+static void update(TCHmacPrng_t prng, const uint8_t *data, unsigned int datalen, const uint8_t *additional_data, unsigned int additional_datalen)
+{
+ const uint8_t separator0 = 0x00;
+ const uint8_t separator1 = 0x01;
+
+ /* configure the new prng key into the prng's instance of hmac */
+ tc_hmac_set_key(&prng->h, prng->key, sizeof(prng->key));
+
+ /* use current state, e and separator 0 to compute a new prng key: */
+ (void)tc_hmac_init(&prng->h);
+ (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v));
+ (void)tc_hmac_update(&prng->h, &separator0, sizeof(separator0));
+
+ if (data && datalen)
+ (void)tc_hmac_update(&prng->h, data, datalen);
+ if (additional_data && additional_datalen)
+ (void)tc_hmac_update(&prng->h, additional_data, additional_datalen);
+
+ (void)tc_hmac_final(prng->key, sizeof(prng->key), &prng->h);
+
+ /* configure the new prng key into the prng's instance of hmac */
+ (void)tc_hmac_set_key(&prng->h, prng->key, sizeof(prng->key));
+
+ /* use the new key to compute a new state variable v */
+ (void)tc_hmac_init(&prng->h);
+ (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v));
+ (void)tc_hmac_final(prng->v, sizeof(prng->v), &prng->h);
+
+ if (data == 0 || datalen == 0)
+ return;
+
+ /* configure the new prng key into the prng's instance of hmac */
+ tc_hmac_set_key(&prng->h, prng->key, sizeof(prng->key));
+
+ /* use current state, e and separator 1 to compute a new prng key: */
+ (void)tc_hmac_init(&prng->h);
+ (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v));
+ (void)tc_hmac_update(&prng->h, &separator1, sizeof(separator1));
+ (void)tc_hmac_update(&prng->h, data, datalen);
+ if (additional_data && additional_datalen)
+ (void)tc_hmac_update(&prng->h, additional_data, additional_datalen);
+ (void)tc_hmac_final(prng->key, sizeof(prng->key), &prng->h);
+
+ /* configure the new prng key into the prng's instance of hmac */
+ (void)tc_hmac_set_key(&prng->h, prng->key, sizeof(prng->key));
+
+ /* use the new key to compute a new state variable v */
+ (void)tc_hmac_init(&prng->h);
+ (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v));
+ (void)tc_hmac_final(prng->v, sizeof(prng->v), &prng->h);
+}
+
+int tc_hmac_prng_init(TCHmacPrng_t prng,
+ const uint8_t *personalization,
+ unsigned int plen)
+{
+ /* input sanity check: */
+ if (prng == (TCHmacPrng_t)0 ||
+ personalization == (uint8_t *)0 ||
+ plen > MAX_PLEN) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ /* put the generator into a known state: */
+ _set(prng->key, 0x00, sizeof(prng->key));
+ _set(prng->v, 0x01, sizeof(prng->v));
+
+ update(prng, personalization, plen, 0, 0);
+
+ /* force a reseed before allowing tc_hmac_prng_generate to succeed: */
+ prng->countdown = 0;
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_hmac_prng_reseed(TCHmacPrng_t prng,
+ const uint8_t *seed,
+ unsigned int seedlen,
+ const uint8_t *additional_input,
+ unsigned int additionallen)
+{
+ /* input sanity check: */
+ if (prng == (TCHmacPrng_t)0 ||
+ seed == (const uint8_t *)0 ||
+ seedlen < MIN_SLEN ||
+ seedlen > MAX_SLEN) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ if (additional_input != (const uint8_t *)0) {
+ /*
+ * Abort if additional_input is provided but has inappropriate
+ * length
+ */
+ if (additionallen == 0 ||
+ additionallen > MAX_ALEN) {
+ return TC_CRYPTO_FAIL;
+ } else {
+ /* call update for the seed and additional_input */
+ update(prng, seed, seedlen, additional_input, additionallen);
+ }
+ } else {
+ /* call update only for the seed */
+ update(prng, seed, seedlen, 0, 0);
+ }
+
+ /* ... and enable hmac_prng_generate */
+ prng->countdown = MAX_GENS;
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_hmac_prng_generate(uint8_t *out, unsigned int outlen, TCHmacPrng_t prng)
+{
+ unsigned int bufferlen;
+
+ /* input sanity check: */
+ if (out == (uint8_t *)0 ||
+ prng == (TCHmacPrng_t)0 ||
+ outlen == 0 ||
+ outlen > MAX_OUT) {
+ return TC_CRYPTO_FAIL;
+ } else if (prng->countdown == 0) {
+ return TC_HMAC_PRNG_RESEED_REQ;
+ }
+
+ prng->countdown--;
+
+ while (outlen != 0) {
+ /* configure the new prng key into the prng's instance of hmac */
+ tc_hmac_set_key(&prng->h, prng->key, sizeof(prng->key));
+
+ /* operate HMAC in OFB mode to create "random" outputs */
+ (void)tc_hmac_init(&prng->h);
+ (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v));
+ (void)tc_hmac_final(prng->v, sizeof(prng->v), &prng->h);
+
+ bufferlen = (TC_SHA256_DIGEST_SIZE > outlen) ?
+ outlen :
+ TC_SHA256_DIGEST_SIZE;
+ (void)_copy(out, bufferlen, prng->v, bufferlen);
+
+ out += bufferlen;
+ outlen = (outlen > TC_SHA256_DIGEST_SIZE) ?
+ (outlen - TC_SHA256_DIGEST_SIZE) :
+ 0;
+ }
+
+ /* block future PRNG compromises from revealing past state */
+ update(prng, 0, 0, 0, 0);
+
+ return TC_CRYPTO_SUCCESS;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/sha256.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/sha256.c
new file mode 100644
index 00000000..57952104
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/sha256.c
@@ -0,0 +1,241 @@
+/* sha256.c - TinyCrypt SHA-256 crypto hash algorithm implementation */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "sha256.h"
+#include "constants.h"
+#include "utils.h"
+
+static void compress(unsigned int *iv, const uint8_t *data);
+
+int tc_sha256_init(TCSha256State_t s)
+{
+ /* input sanity check: */
+ if (s == (TCSha256State_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ /*
+ * Setting the initial state values.
+ * These values correspond to the first 32 bits of the fractional parts
+ * of the square roots of the first 8 primes: 2, 3, 5, 7, 11, 13, 17
+ * and 19.
+ */
+ _set((uint8_t *)s, 0x00, sizeof(*s));
+ s->iv[0] = 0x6a09e667;
+ s->iv[1] = 0xbb67ae85;
+ s->iv[2] = 0x3c6ef372;
+ s->iv[3] = 0xa54ff53a;
+ s->iv[4] = 0x510e527f;
+ s->iv[5] = 0x9b05688c;
+ s->iv[6] = 0x1f83d9ab;
+ s->iv[7] = 0x5be0cd19;
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_sha256_update(TCSha256State_t s, const uint8_t *data, size_t datalen)
+{
+ /* input sanity check: */
+ if (s == (TCSha256State_t)0 ||
+ data == (void *)0) {
+ return TC_CRYPTO_FAIL;
+ } else if (datalen == 0) {
+ return TC_CRYPTO_SUCCESS;
+ }
+
+ while (datalen-- > 0) {
+ s->leftover[s->leftover_offset++] = *(data++);
+ if (s->leftover_offset >= TC_SHA256_BLOCK_SIZE) {
+ compress(s->iv, s->leftover);
+ s->leftover_offset = 0;
+ s->bits_hashed += (TC_SHA256_BLOCK_SIZE << 3);
+ }
+ }
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+int tc_sha256_final(uint8_t *digest, TCSha256State_t s)
+{
+ unsigned int i;
+
+ /* input sanity check: */
+ if (digest == (uint8_t *)0 ||
+ s == (TCSha256State_t)0) {
+ return TC_CRYPTO_FAIL;
+ }
+
+ s->bits_hashed += (s->leftover_offset << 3);
+
+ s->leftover[s->leftover_offset++] = 0x80; /* always room for one byte */
+ if (s->leftover_offset > (sizeof(s->leftover) - 8)) {
+ /* there is not room for all the padding in this block */
+ _set(s->leftover + s->leftover_offset, 0x00,
+ sizeof(s->leftover) - s->leftover_offset);
+ compress(s->iv, s->leftover);
+ s->leftover_offset = 0;
+ }
+
+ /* add the padding and the length in big-Endian format */
+ _set(s->leftover + s->leftover_offset, 0x00,
+ sizeof(s->leftover) - 8 - s->leftover_offset);
+ s->leftover[sizeof(s->leftover) - 1] = (uint8_t)(s->bits_hashed);
+ s->leftover[sizeof(s->leftover) - 2] = (uint8_t)(s->bits_hashed >> 8);
+ s->leftover[sizeof(s->leftover) - 3] = (uint8_t)(s->bits_hashed >> 16);
+ s->leftover[sizeof(s->leftover) - 4] = (uint8_t)(s->bits_hashed >> 24);
+ s->leftover[sizeof(s->leftover) - 5] = (uint8_t)(s->bits_hashed >> 32);
+ s->leftover[sizeof(s->leftover) - 6] = (uint8_t)(s->bits_hashed >> 40);
+ s->leftover[sizeof(s->leftover) - 7] = (uint8_t)(s->bits_hashed >> 48);
+ s->leftover[sizeof(s->leftover) - 8] = (uint8_t)(s->bits_hashed >> 56);
+
+ /* hash the padding and length */
+ compress(s->iv, s->leftover);
+
+ /* copy the iv out to digest */
+ for (i = 0; i < TC_SHA256_STATE_BLOCKS; ++i) {
+ unsigned int t = *((unsigned int *)&s->iv[i]);
+ *digest++ = (uint8_t)(t >> 24);
+ *digest++ = (uint8_t)(t >> 16);
+ *digest++ = (uint8_t)(t >> 8);
+ *digest++ = (uint8_t)(t);
+ }
+
+ /* destroy the current state */
+ _set(s, 0, sizeof(*s));
+
+ return TC_CRYPTO_SUCCESS;
+}
+
+/*
+ * Initializing SHA-256 Hash constant words K.
+ * These values correspond to the first 32 bits of the fractional parts of the
+ * cube roots of the first 64 primes between 2 and 311.
+ */
+static const unsigned int k256[64] = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
+ 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
+ 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
+ 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
+ 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
+ 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+};
+
+static inline unsigned int ROTR(unsigned int a, unsigned int n)
+{
+ return (((a) >> n) | ((a) << (32 - n)));
+}
+
+#define Sigma0(a) (ROTR((a), 2) ^ ROTR((a), 13) ^ ROTR((a), 22))
+#define Sigma1(a) (ROTR((a), 6) ^ ROTR((a), 11) ^ ROTR((a), 25))
+#define sigma0(a) (ROTR((a), 7) ^ ROTR((a), 18) ^ ((a) >> 3))
+#define sigma1(a) (ROTR((a), 17) ^ ROTR((a), 19) ^ ((a) >> 10))
+
+#define Ch(a, b, c) (((a) & (b)) ^ ((~(a)) & (c)))
+#define Maj(a, b, c) (((a) & (b)) ^ ((a) & (c)) ^ ((b) & (c)))
+
+static inline unsigned int BigEndian(const uint8_t **c)
+{
+ unsigned int n = 0;
+
+ n = (((unsigned int)(*((*c)++))) << 24);
+ n |= ((unsigned int)(*((*c)++)) << 16);
+ n |= ((unsigned int)(*((*c)++)) << 8);
+ n |= ((unsigned int)(*((*c)++)));
+ return n;
+}
+
+static void compress(unsigned int *iv, const uint8_t *data)
+{
+ unsigned int a, b, c, d, e, f, g, h;
+ unsigned int s0, s1;
+ unsigned int t1, t2;
+ unsigned int work_space[16];
+ unsigned int n;
+ unsigned int i;
+
+ a = iv[0];
+ b = iv[1];
+ c = iv[2];
+ d = iv[3];
+ e = iv[4];
+ f = iv[5];
+ g = iv[6];
+ h = iv[7];
+
+ for (i = 0; i < 16; ++i) {
+ n = BigEndian(&data);
+ t1 = work_space[i] = n;
+ t1 += h + Sigma1(e) + Ch(e, f, g) + k256[i];
+ t2 = Sigma0(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + t1;
+ d = c;
+ c = b;
+ b = a;
+ a = t1 + t2;
+ }
+
+ for (; i < 64; ++i) {
+ s0 = work_space[(i + 1) & 0x0f];
+ s0 = sigma0(s0);
+ s1 = work_space[(i + 14) & 0x0f];
+ s1 = sigma1(s1);
+
+ t1 = work_space[i & 0xf] += s0 + s1 + work_space[(i + 9) & 0xf];
+ t1 += h + Sigma1(e) + Ch(e, f, g) + k256[i];
+ t2 = Sigma0(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + t1;
+ d = c;
+ c = b;
+ b = a;
+ a = t1 + t2;
+ }
+
+ iv[0] += a;
+ iv[1] += b;
+ iv[2] += c;
+ iv[3] += d;
+ iv[4] += e;
+ iv[5] += f;
+ iv[6] += g;
+ iv[7] += h;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/utils.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/utils.c
new file mode 100644
index 00000000..137702a8
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/utils.c
@@ -0,0 +1,74 @@
+/* utils.c - TinyCrypt platform-dependent run-time operations */
+
+/*
+ * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "utils.h"
+#include "constants.h"
+
+#include
+
+#define MASK_TWENTY_SEVEN 0x1b
+
+unsigned int _copy(uint8_t *to, unsigned int to_len,
+ const uint8_t *from, unsigned int from_len)
+{
+ if (from_len <= to_len) {
+ (void)memcpy(to, from, from_len);
+ return from_len;
+ } else {
+ return TC_CRYPTO_FAIL;
+ }
+}
+
+void _set(void *to, uint8_t val, unsigned int len)
+{
+ (void)memset(to, val, len);
+}
+
+/*
+ * Doubles the value of a byte for values up to 127.
+ */
+uint8_t _double_byte(uint8_t a)
+{
+ return ((a << 1) ^ ((a >> 7) * MASK_TWENTY_SEVEN));
+}
+
+int _compare(const uint8_t *a, const uint8_t *b, size_t size)
+{
+ const uint8_t *tempa = a;
+ const uint8_t *tempb = b;
+ uint8_t result = 0;
+
+ for (unsigned int i = 0; i < size; i++) {
+ result |= tempa[i] ^ tempb[i];
+ }
+ return result;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/utils.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/utils.c
new file mode 100644
index 00000000..bde33926
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/utils.c
@@ -0,0 +1,132 @@
+/*****************************************************************************************
+*
+* @file utils.c
+*
+* @brief entry
+*
+* Copyright (C) Bouffalo Lab 2019
+*
+* History: 2019-11 crealted by Lanlan Gong @ Shanghai
+*
+*****************************************************************************************/
+#include
+#include
+#include
+
+void reverse_bytearray(uint8_t *src, uint8_t *result, int array_size)
+{
+ for (int i = 0; i < array_size; i++) {
+ result[array_size - i - 1] = src[i];
+ }
+}
+
+unsigned int find_msb_set(uint32_t data)
+{
+ uint32_t count = 0;
+ uint32_t mask = 0x80000000;
+
+ if (!data) {
+ return 0;
+ }
+ while ((data & mask) == 0) {
+ count += 1u;
+ mask = mask >> 1u;
+ }
+ return (32 - count);
+}
+
+unsigned int find_lsb_set(uint32_t data)
+{
+ uint32_t count = 0;
+ uint32_t mask = 0x00000001;
+
+ if (!data) {
+ return 0;
+ }
+ while ((data & mask) == 0) {
+ count += 1u;
+ mask = mask << 1u;
+ }
+ return (1 + count);
+}
+
+int char2hex(char c, uint8_t *x)
+{
+ if (c >= '0' && c <= '9') {
+ *x = c - '0';
+ } else if (c >= 'a' && c <= 'f') {
+ *x = c - 'a' + 10;
+ } else if (c >= 'A' && c <= 'F') {
+ *x = c - 'A' + 10;
+ } else {
+ return -1;
+ }
+
+ return 0;
+}
+
+int hex2char(uint8_t x, char *c)
+{
+ if (x <= 9) {
+ *c = x + '0';
+ } else if (x <= 15) {
+ *c = x - 10 + 'a';
+ } else {
+ return -1;
+ }
+
+ return 0;
+}
+
+size_t bin2hex(const uint8_t *buf, size_t buflen, char *hex, size_t hexlen)
+{
+ if ((hexlen + 1) < buflen * 2) {
+ return 0;
+ }
+
+ for (size_t i = 0; i < buflen; i++) {
+ if (hex2char(buf[i] >> 4, &hex[2 * i]) < 0) {
+ return 0;
+ }
+ if (hex2char(buf[i] & 0xf, &hex[2 * i + 1]) < 0) {
+ return 0;
+ }
+ }
+
+ hex[2 * buflen] = '\0';
+ return 2 * buflen;
+}
+
+size_t hex2bin(const char *hex, size_t hexlen, uint8_t *buf, size_t buflen)
+{
+ uint8_t dec;
+
+ if (buflen < hexlen / 2 + hexlen % 2) {
+ return 0;
+ }
+
+ /* if hexlen is uneven, insert leading zero nibble */
+ if (hexlen % 2) {
+ if (char2hex(hex[0], &dec) < 0) {
+ return 0;
+ }
+ buf[0] = dec;
+ hex++;
+ buf++;
+ }
+
+ /* regular hex conversion */
+ for (size_t i = 0; i < hexlen / 2; i++) {
+ if (char2hex(hex[2 * i], &dec) < 0) {
+ return 0;
+ }
+ buf[i] = dec << 4;
+
+ if (char2hex(hex[2 * i + 1], &dec) < 0) {
+ return 0;
+ }
+ buf[i] += dec;
+ }
+
+ return hexlen / 2 + hexlen % 2;
+}
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/work_q.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/work_q.c
new file mode 100644
index 00000000..f8f72ad6
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/work_q.c
@@ -0,0 +1,348 @@
+/*
+ * Copyright (c) 2016 Intel Corporation
+ * Copyright (c) 2016 Wind River Systems, Inc.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ *
+ * Workqueue support functions
+ */
+
+#include
+#include
+#include "errno.h"
+
+struct k_thread work_q_thread;
+#if !defined(BFLB_BLE)
+static BT_STACK_NOINIT(work_q_stack, CONFIG_BT_WORK_QUEUE_STACK_SIZE);
+#endif
+struct k_work_q g_work_queue_main;
+
+static void k_work_submit_to_queue(struct k_work_q *work_q,
+ struct k_work *work)
+{
+ if (!atomic_test_and_set_bit(work->flags, K_WORK_STATE_PENDING)) {
+ k_fifo_put(&work_q->fifo, work);
+ }
+}
+
+#if defined(BFLB_BLE)
+static void work_queue_main(void *p1)
+{
+ struct k_work *work;
+ UNUSED(p1);
+
+ while (1) {
+ work = k_fifo_get(&g_work_queue_main.fifo, K_FOREVER);
+
+ if (atomic_test_and_clear_bit(work->flags, K_WORK_STATE_PENDING)) {
+ work->handler(work);
+ }
+
+ k_yield();
+ }
+}
+
+int k_work_q_start(void)
+{
+ k_fifo_init(&g_work_queue_main.fifo, 20);
+ return k_thread_create(&work_q_thread, "work_q_thread",
+ CONFIG_BT_WORK_QUEUE_STACK_SIZE,
+ work_queue_main, CONFIG_BT_WORK_QUEUE_PRIO);
+}
+
+int k_work_init(struct k_work *work, k_work_handler_t handler)
+{
+ ASSERT(work, "work is NULL");
+
+ atomic_clear(work->flags);
+ work->handler = handler;
+ return 0;
+}
+
+void k_work_submit(struct k_work *work)
+{
+ k_work_submit_to_queue(&g_work_queue_main, work);
+}
+
+static void work_timeout(void *timer)
+{
+ /* Parameter timer type is */
+ struct k_delayed_work *w = (struct k_delayed_work *)k_timer_get_id(timer);
+ if (w->work_q == NULL) {
+ return;
+ }
+
+ /* submit work to workqueue */
+ if (!atomic_test_bit(w->work.flags, K_WORK_STATE_PERIODIC)) {
+ k_work_submit_to_queue(w->work_q, &w->work);
+ /* detach from workqueue, for cancel to return appropriate status */
+ w->work_q = NULL;
+ } else {
+ /* For periodic timer, restart it.*/
+ k_timer_reset(&w->timer);
+ k_work_submit_to_queue(w->work_q, &w->work);
+ }
+}
+
+void k_delayed_work_init(struct k_delayed_work *work, k_work_handler_t handler)
+{
+ ASSERT(work, "delay work is NULL");
+ /* Added by bouffalolab */
+ k_work_init(&work->work, handler);
+ k_timer_init(&work->timer, work_timeout, work);
+ work->work_q = NULL;
+}
+
+static int k_delayed_work_submit_to_queue(struct k_work_q *work_q,
+ struct k_delayed_work *work,
+ uint32_t delay)
+{
+ int err;
+
+ /* Work cannot be active in multiple queues */
+ if (work->work_q && work->work_q != work_q) {
+ err = -EADDRINUSE;
+ goto done;
+ }
+
+ /* Cancel if work has been submitted */
+ if (work->work_q == work_q) {
+ err = k_delayed_work_cancel(work);
+
+ if (err < 0) {
+ goto done;
+ }
+ }
+
+ if (!delay) {
+ /* Submit work if no ticks is 0 */
+ k_work_submit_to_queue(work_q, &work->work);
+ work->work_q = NULL;
+ } else {
+ /* Add timeout */
+ /* Attach workqueue so the timeout callback can submit it */
+ k_timer_start(&work->timer, delay);
+ work->work_q = work_q;
+ }
+
+ err = 0;
+
+done:
+ return err;
+}
+
+int k_delayed_work_submit(struct k_delayed_work *work, uint32_t delay)
+{
+ atomic_clear_bit(work->work.flags, K_WORK_STATE_PERIODIC);
+ return k_delayed_work_submit_to_queue(&g_work_queue_main, work, delay);
+}
+
+/* Added by bouffalolab */
+int k_delayed_work_submit_periodic(struct k_delayed_work *work, s32_t period)
+{
+ atomic_set_bit(work->work.flags, K_WORK_STATE_PERIODIC);
+ return k_delayed_work_submit_to_queue(&g_work_queue_main, work, period);
+}
+
+int k_delayed_work_cancel(struct k_delayed_work *work)
+{
+ int err = 0;
+
+ if (atomic_test_bit(work->work.flags, K_WORK_STATE_PENDING)) {
+ err = -EINPROGRESS;
+ goto exit;
+ }
+
+ if (!work->work_q) {
+ err = -EINVAL;
+ goto exit;
+ }
+
+ k_timer_stop(&work->timer);
+ work->work_q = NULL;
+ work->timer.timeout = 0;
+ work->timer.start_ms = 0;
+
+exit:
+ return err;
+}
+
+s32_t k_delayed_work_remaining_get(struct k_delayed_work *work)
+{
+ int32_t remain;
+ k_timer_t *timer;
+
+ if (work == NULL) {
+ return 0;
+ }
+
+ timer = &work->timer;
+ remain = timer->timeout - (k_now_ms() - timer->start_ms);
+ if (remain < 0) {
+ remain = 0;
+ }
+ return remain;
+}
+
+void k_delayed_work_del_timer(struct k_delayed_work *work)
+{
+ if (NULL == work || NULL == work->timer.timer.hdl)
+ return;
+
+ k_timer_delete(&work->timer);
+ work->timer.timer.hdl = NULL;
+}
+
+/* Added by bouffalolab */
+int k_delayed_work_free(struct k_delayed_work *work)
+{
+ int err = 0;
+
+ if (atomic_test_bit(work->work.flags, K_WORK_STATE_PENDING)) {
+ err = -EINPROGRESS;
+ goto exit;
+ }
+
+ k_delayed_work_del_timer(work);
+ work->work_q = NULL;
+ work->timer.timeout = 0;
+ work->timer.start_ms = 0;
+
+exit:
+ return err;
+}
+
+#else
+static void work_q_main(void *work_q_ptr, void *p2, void *p3)
+{
+ struct k_work_q *work_q = work_q_ptr;
+
+ ARG_UNUSED(p2);
+ ARG_UNUSED(p3);
+
+ while (1) {
+ struct k_work *work;
+ k_work_handler_t handler;
+
+ work = k_queue_get(&work_q->queue, K_FOREVER);
+ if (!work) {
+ continue;
+ }
+
+ handler = work->handler;
+
+ /* Reset pending state so it can be resubmitted by handler */
+ if (atomic_test_and_clear_bit(work->flags,
+ K_WORK_STATE_PENDING)) {
+ handler(work);
+ }
+
+ /* Make sure we don't hog up the CPU if the FIFO never (or
+ * very rarely) gets empty.
+ */
+ k_yield();
+ }
+}
+
+void k_work_q_start(struct k_work_q *work_q, k_thread_stack_t *stack,
+ size_t stack_size, int prio)
+{
+ k_queue_init(&work_q->queue, 20);
+ k_thread_create(&work_q->thread, stack, stack_size, work_q_main,
+ work_q, 0, 0, prio, 0, 0);
+ _k_object_init(work_q);
+}
+
+#ifdef CONFIG_SYS_CLOCK_EXISTS
+static void work_timeout(struct _timeout *t)
+{
+ struct k_delayed_work *w = CONTAINER_OF(t, struct k_delayed_work,
+ timeout);
+
+ /* submit work to workqueue */
+ k_work_submit_to_queue(w->work_q, &w->work);
+}
+
+void k_delayed_work_init(struct k_delayed_work *work, k_work_handler_t handler)
+{
+ k_work_init(&work->work, handler);
+ _init_timeout(&work->timeout, work_timeout);
+ work->work_q = NULL;
+
+ _k_object_init(work);
+}
+
+int k_delayed_work_submit_to_queue(struct k_work_q *work_q,
+ struct k_delayed_work *work,
+ s32_t delay)
+{
+ unsigned int key = irq_lock();
+ int err;
+
+ /* Work cannot be active in multiple queues */
+ if (work->work_q && work->work_q != work_q) {
+ err = -EADDRINUSE;
+ goto done;
+ }
+
+ /* Cancel if work has been submitted */
+ if (work->work_q == work_q) {
+ err = k_delayed_work_cancel(work);
+ if (err < 0) {
+ goto done;
+ }
+ }
+
+ /* Attach workqueue so the timeout callback can submit it */
+ work->work_q = work_q;
+
+ if (!delay) {
+ /* Submit work if no ticks is 0 */
+ k_work_submit_to_queue(work_q, &work->work);
+ } else {
+ /* Add timeout */
+ _add_timeout(NULL, &work->timeout, NULL,
+ _TICK_ALIGN + _ms_to_ticks(delay));
+ }
+
+ err = 0;
+
+done:
+ irq_unlock(key);
+
+ return err;
+}
+
+int k_delayed_work_cancel(struct k_delayed_work *work)
+{
+ unsigned int key = irq_lock();
+
+ if (!work->work_q) {
+ irq_unlock(key);
+ return -EINVAL;
+ }
+
+ if (k_work_pending(&work->work)) {
+ /* Remove from the queue if already submitted */
+ if (!k_queue_remove(&work->work_q->queue, &work->work)) {
+ irq_unlock(key);
+ return -EINVAL;
+ }
+ } else {
+ _abort_timeout(&work->timeout);
+ }
+
+ /* Detach from workqueue */
+ work->work_q = NULL;
+
+ atomic_clear_bit(work->work.flags, K_WORK_STATE_PENDING);
+ irq_unlock(key);
+
+ return 0;
+}
+#endif /* CONFIG_SYS_CLOCK_EXISTS */
+#endif /* BFLB_BLE */
\ No newline at end of file
diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/hci_onchip/hci_driver.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/hci_onchip/hci_driver.c
new file mode 100644
index 00000000..a992c5d1
--- /dev/null
+++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/hci_onchip/hci_driver.c
@@ -0,0 +1,560 @@
+/*
+ * Copyright (c) 2016 Nordic Semiconductor ASA
+ * Copyright (c) 2016 Vinayak Kariappa Chettimada
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include
+#include