Compare commits
93 Commits
epr-pineci
...
v2.22-rc2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0a5e244b9 | ||
|
|
f99aed5785 | ||
|
|
64ccbd4334 | ||
|
|
0a5b84fea9 | ||
|
|
c2229f096b | ||
|
|
53bb8355f8 | ||
|
|
95160b7afd | ||
|
|
5754622fea | ||
|
|
2b0bd00603 | ||
|
|
20e085487e | ||
|
|
4cb47cf1a2 | ||
|
|
33439aaa22 | ||
|
|
6111b58e04 | ||
|
|
d6286b9e2b | ||
|
|
f69c37c4aa | ||
|
|
230e42b614 | ||
|
|
caedce0300 | ||
|
|
748ab1c354 | ||
|
|
33a2958203 | ||
|
|
8430a114fa | ||
|
|
9cc0a56057 | ||
|
|
db3d8a2de0 | ||
|
|
4460782dd4 | ||
|
|
d1e03c34be | ||
|
|
b493f4d0e1 | ||
|
|
fb48ff8b91 | ||
|
|
3f8f60f4c7 | ||
|
|
130e73c1fe | ||
|
|
26197f6ed7 | ||
|
|
d5035bb956 | ||
|
|
c0f1c35ba5 | ||
|
|
477fdc489c | ||
|
|
4f2fb2083d | ||
|
|
15ab87f3bc | ||
|
|
8b90666f30 | ||
|
|
c03e1842aa | ||
|
|
524d121fcb | ||
|
|
97c0fee358 | ||
|
|
17b39de903 | ||
|
|
3f880d9e26 | ||
|
|
4533c2f497 | ||
|
|
c120af398a | ||
|
|
2d7abc274a | ||
|
|
80c4b58976 | ||
|
|
a7df1cc5be | ||
|
|
584b3826c3 | ||
|
|
c4fd383694 | ||
|
|
bd9c63f55d | ||
|
|
45f89f8f9c | ||
|
|
f61376a404 | ||
|
|
703a32f68a | ||
|
|
e0f373a88a | ||
|
|
05d0ef66ef | ||
|
|
6d18e860f8 | ||
|
|
344068d480 | ||
|
|
13e1c24152 | ||
|
|
7254b78404 | ||
|
|
55d36c98f1 | ||
|
|
65ac2e25a6 | ||
|
|
ea1906e499 | ||
|
|
9a3fef92c3 | ||
|
|
118fa09ce7 | ||
|
|
6ba2a5c259 | ||
|
|
0f6c1b686e | ||
|
|
f83ebc8c81 | ||
|
|
65dd3e879c | ||
|
|
52dd27cc07 | ||
|
|
8ac43645b7 | ||
|
|
1c9d3940ca | ||
|
|
297a4dffa5 | ||
|
|
93a18e5076 | ||
|
|
bfbdf8c941 | ||
|
|
b00d26cb9c | ||
|
|
78a4cfecfe | ||
|
|
c7574c4d0c | ||
|
|
1d820acbee | ||
|
|
d95af7d1a0 | ||
|
|
ca79638a74 | ||
|
|
4649df6914 | ||
|
|
cd7696b66f | ||
|
|
552b582bcb | ||
|
|
311dbeac6f | ||
|
|
6ff7bec4a4 | ||
|
|
b80716e2a7 | ||
|
|
7b57cc981f | ||
|
|
f72bc969ac | ||
|
|
0be83598f1 | ||
|
|
88f62941ec | ||
|
|
cbde61edb4 | ||
|
|
8c17a085f1 | ||
|
|
3a8eb3c511 | ||
|
|
f81257562d | ||
|
|
5d96470e45 |
2
.github/workflows/docs.yml
vendored
2
.github/workflows/docs.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-python@v4
|
- uses: actions/setup-python@v4
|
||||||
|
|||||||
106
.github/workflows/push.yml
vendored
106
.github/workflows/push.yml
vendored
@@ -3,6 +3,8 @@ name: CI
|
|||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
|
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
@@ -19,20 +21,21 @@ jobs:
|
|||||||
- name: Install dependencies (python)
|
- name: Install dependencies (python)
|
||||||
run: python3 -m pip install bdflib
|
run: python3 -m pip install bdflib
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
||||||
- name: Git ownership exception
|
- name: Git ownership exception
|
||||||
run: git config --global --add safe.directory /__w/IronOS/IronOS && git config --global safe.directory "$GITHUB_WORKSPACE"
|
run: git config --global --add safe.directory /__w/IronOS/IronOS && git config --global safe.directory "$GITHUB_WORKSPACE"
|
||||||
|
|
||||||
- name: build ${{ matrix.model }}
|
- name: Git meta info
|
||||||
|
run: echo "GITHUB_CI_PR_SHA=${{github.event.pull_request.head.sha}}" >> "${GITHUB_ENV}"
|
||||||
|
|
||||||
|
- name: Build ${{ matrix.model }}
|
||||||
run: cd source && ./build.sh -m ${{ matrix.model }}
|
run: cd source && ./build.sh -m ${{ matrix.model }}
|
||||||
|
|
||||||
- name: copy license text
|
- name: Copy license files
|
||||||
run: |
|
run: cp LICENSE scripts/LICENSE_RELEASE.md source/Hexfile/
|
||||||
cp LICENSE source/Hexfile/LICENSE
|
|
||||||
cp scripts/LICENSE_RELEASE.md source/Hexfile/LICENSE_RELEASE.md
|
|
||||||
|
|
||||||
- name: Archive ${{ matrix.model }} artifacts
|
- name: Archive ${{ matrix.model }} artifacts
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
@@ -47,7 +50,7 @@ jobs:
|
|||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
- name: Generate json index file
|
- name: Generate json index file
|
||||||
run: cd source && python3 metadata.py ${{ matrix.model }}.json
|
run: ./source/metadata.py ${{ matrix.model }}.json
|
||||||
|
|
||||||
- name: Archive ${{ matrix.model }} index file
|
- name: Archive ${{ matrix.model }} index file
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
@@ -55,6 +58,7 @@ jobs:
|
|||||||
name: metadata
|
name: metadata
|
||||||
path: source/Hexfile/${{ matrix.model }}.json
|
path: source/Hexfile/${{ matrix.model }}.json
|
||||||
|
|
||||||
|
|
||||||
build_multi-lang:
|
build_multi-lang:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
@@ -70,20 +74,21 @@ jobs:
|
|||||||
- name: Install dependencies (python)
|
- name: Install dependencies (python)
|
||||||
run: python3 -m pip install bdflib
|
run: python3 -m pip install bdflib
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
||||||
- name: Git ownership exception
|
- name: Git ownership exception
|
||||||
run: git config --global --add safe.directory /__w/IronOS/IronOS && git config --global safe.directory "$GITHUB_WORKSPACE"
|
run: git config --global --add safe.directory /__w/IronOS/IronOS && git config --global safe.directory "$GITHUB_WORKSPACE"
|
||||||
|
|
||||||
- name: build ${{ matrix.model }}
|
- name: Git meta info
|
||||||
run: cd source && make -j$(nproc) model="${{ matrix.model }}" firmware-multi_compressed_European firmware-multi_compressed_Bulgarian+Russian+Serbian+Ukrainian firmware-multi_Chinese+Japanese
|
run: echo "GITHUB_CI_PR_SHA=${{github.event.pull_request.head.sha}}" >> "${GITHUB_ENV}"
|
||||||
|
|
||||||
- name: copy license text
|
- name: Build ${{ matrix.model }}
|
||||||
run: |
|
run: make -C source/ -j$(nproc) model="${{ matrix.model }}" firmware-multi_compressed_European firmware-multi_compressed_Bulgarian+Russian+Serbian+Ukrainian firmware-multi_Chinese+Japanese
|
||||||
cp LICENSE source/Hexfile/LICENSE
|
|
||||||
cp scripts/LICENSE_RELEASE.md source/Hexfile/LICENSE_RELEASE.md
|
- name: Copy license files
|
||||||
|
run: cp LICENSE scripts/LICENSE_RELEASE.md source/Hexfile/
|
||||||
|
|
||||||
- name: Archive ${{ matrix.model }} artifacts
|
- name: Archive ${{ matrix.model }} artifacts
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
@@ -98,7 +103,7 @@ jobs:
|
|||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
- name: Generate json index file
|
- name: Generate json index file
|
||||||
run: cd source && python3 metadata.py ${{ matrix.model }}_multi-lang.json
|
run: ./source/metadata.py ${{ matrix.model }}_multi-lang.json
|
||||||
|
|
||||||
- name: Archive ${{ matrix.model }} index file
|
- name: Archive ${{ matrix.model }} index file
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
@@ -106,51 +111,62 @@ jobs:
|
|||||||
name: metadata
|
name: metadata
|
||||||
path: source/Hexfile/${{ matrix.model }}_multi-lang.json
|
path: source/Hexfile/${{ matrix.model }}_multi-lang.json
|
||||||
|
|
||||||
|
|
||||||
tests:
|
tests:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
image: alpine:3.16
|
image: alpine:3.16
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: deps
|
- name: Install dependencies (apk)
|
||||||
run: apk add --no-cache python3 py3-pip make git bash findutils gcc musl-dev
|
run: apk add --no-cache python3 py3-pip make git bash findutils gcc musl-dev
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
||||||
- name: install black
|
- name: Install dependencies (python)
|
||||||
run: python3 -m pip install bdflib
|
run: python3 -m pip install bdflib
|
||||||
|
|
||||||
- name: Run python tests
|
- name: Run python tests
|
||||||
run: cd Translations && chmod +x make_translation_test.py && ./make_translation_test.py
|
run: ./Translations/make_translation_test.py
|
||||||
|
|
||||||
- name: Run BriefLZ tests
|
- name: Run BriefLZ tests
|
||||||
run: |
|
run: make -C source/ Objects/host/brieflz/libbrieflz.so && ./Translations/brieflz_test.py
|
||||||
cd source
|
|
||||||
make Objects/host/brieflz/libbrieflz.so
|
|
||||||
cd ../Translations
|
|
||||||
chmod +x brieflz_test.py
|
|
||||||
./brieflz_test.py
|
|
||||||
|
|
||||||
check_formatting:
|
|
||||||
|
check_c-cpp:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
image: alpine:3.16
|
image: alpine:3.16
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: deps
|
- name: Install dependencies (apk)
|
||||||
run: apk add --no-cache python3 py3-pip make git black
|
run: apk add --no-cache make git diffutils findutils clang-extra-tools bash
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
||||||
- name: install black
|
- name: Check format style with clang-format
|
||||||
run: python3 -m pip install bdflib flake8
|
run: make clean check-style
|
||||||
|
|
||||||
- name: Check formatting with clang-format
|
|
||||||
run: cd source && make clean && make check-style
|
check_python:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
container:
|
||||||
|
image: alpine:3.16
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies (apk)
|
||||||
|
run: apk add --no-cache python3 py3-pip make git black
|
||||||
|
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
- name: Install dependencies (python)
|
||||||
|
run: python3 -m pip install bdflib flake8
|
||||||
|
|
||||||
- name: Check python formatting with black
|
- name: Check python formatting with black
|
||||||
run: black --check Translations
|
run: black --check Translations
|
||||||
@@ -158,11 +174,12 @@ jobs:
|
|||||||
- name: Check python with flake8
|
- name: Check python with flake8
|
||||||
run: flake8 Translations
|
run: flake8 Translations
|
||||||
|
|
||||||
shellcheck:
|
|
||||||
name: runner / shellcheck
|
check_shell:
|
||||||
|
name: check_shell
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: shellcheck
|
- name: shellcheck
|
||||||
uses: reviewdog/action-shellcheck@v1
|
uses: reviewdog/action-shellcheck@v1
|
||||||
with:
|
with:
|
||||||
@@ -170,3 +187,20 @@ jobs:
|
|||||||
reporter: github-pr-review # Change reporter.
|
reporter: github-pr-review # Change reporter.
|
||||||
exclude: "./.git/*" # Optional.
|
exclude: "./.git/*" # Optional.
|
||||||
check_all_files_with_shebangs: "false" # Optional.
|
check_all_files_with_shebangs: "false" # Optional.
|
||||||
|
|
||||||
|
|
||||||
|
check_readme:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
container:
|
||||||
|
image: alpine:3.16
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies (apk)
|
||||||
|
run: apk add --no-cache git
|
||||||
|
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
- name: Check autogenerated Documentation/README.md
|
||||||
|
run: /bin/sh ./scripts/deploy.sh docs_readme
|
||||||
|
|||||||
81
.gitignore
vendored
81
.gitignore
vendored
@@ -1,3 +1,5 @@
|
|||||||
|
#### Generic ####
|
||||||
|
|
||||||
# Object files
|
# Object files
|
||||||
*.o
|
*.o
|
||||||
*.ko
|
*.ko
|
||||||
@@ -5,6 +7,7 @@
|
|||||||
*.elf
|
*.elf
|
||||||
*.d
|
*.d
|
||||||
*.DS_Store
|
*.DS_Store
|
||||||
|
|
||||||
# Precompiled Headers
|
# Precompiled Headers
|
||||||
*.gch
|
*.gch
|
||||||
*.pch
|
*.pch
|
||||||
@@ -31,33 +34,22 @@
|
|||||||
# Debug files
|
# Debug files
|
||||||
*.dSYM/
|
*.dSYM/
|
||||||
*.su
|
*.su
|
||||||
source/.metadata/*
|
|
||||||
|
|
||||||
TS100/KiCad/TS100.bak
|
# Custom scripts & misc. files
|
||||||
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/obj/
|
|
||||||
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/bin/
|
|
||||||
*.cache
|
|
||||||
Translation Editor/.vscode/
|
|
||||||
Translation Editor/__pycache__/
|
|
||||||
*.pyc
|
*.pyc
|
||||||
*.lst
|
*.lst
|
||||||
*.mk
|
*.mk
|
||||||
*.list
|
*.list
|
||||||
source/Hexfile/
|
|
||||||
source/Objects/
|
|
||||||
|
|
||||||
ci/artefacts/
|
|
||||||
ci/secrets/unencrypted/
|
|
||||||
codeship.aes
|
|
||||||
.vscode/settings.json
|
|
||||||
|
|
||||||
# Auto generated files
|
# Auto generated files
|
||||||
source/Core/Inc/unit.h
|
*.cache
|
||||||
source/Core/Gen/
|
codeship.aes
|
||||||
|
CoreCompileInputs.cache
|
||||||
|
|
||||||
# IDE configs
|
# IDE configs
|
||||||
.vs/*
|
.vs/*
|
||||||
.settings/*
|
.settings/*
|
||||||
..cproject.swp
|
.cproject.swp
|
||||||
|
|
||||||
# Visual Studios
|
# Visual Studios
|
||||||
.vscode/*
|
.vscode/*
|
||||||
@@ -65,6 +57,7 @@ source/Core/Gen/
|
|||||||
!.vscode/tasks.json
|
!.vscode/tasks.json
|
||||||
!.vscode/launch.json
|
!.vscode/launch.json
|
||||||
!.vscode/extensions.json
|
!.vscode/extensions.json
|
||||||
|
.vscode/settings.json
|
||||||
|
|
||||||
# Eclipse
|
# Eclipse
|
||||||
.metadata
|
.metadata
|
||||||
@@ -120,11 +113,24 @@ local.properties
|
|||||||
.scala_dependencies
|
.scala_dependencies
|
||||||
.worksheet
|
.worksheet
|
||||||
|
|
||||||
# Jetbrains
|
# source code tagging systems (GNU Global, ctags, cscope)
|
||||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
GPATH
|
||||||
|
GRTAGS
|
||||||
|
GTAGS
|
||||||
|
*tags
|
||||||
|
*tags/
|
||||||
|
.*tags
|
||||||
|
.*tags/
|
||||||
|
cscope.*
|
||||||
|
cscope/
|
||||||
|
.cscope/
|
||||||
|
|
||||||
|
|
||||||
|
#### Jetbrains: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm ####
|
||||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
# User-specific stuff
|
# User-specific stuff
|
||||||
|
.idea/
|
||||||
.idea/**/workspace.xml
|
.idea/**/workspace.xml
|
||||||
.idea/**/tasks.xml
|
.idea/**/tasks.xml
|
||||||
.idea/**/usage.statistics.xml
|
.idea/**/usage.statistics.xml
|
||||||
@@ -174,7 +180,38 @@ fabric.properties
|
|||||||
# Editor-based Rest Client
|
# Editor-based Rest Client
|
||||||
.idea/httpRequests
|
.idea/httpRequests
|
||||||
|
|
||||||
CoreCompileInputs.cache
|
|
||||||
.vscode/settings.json
|
#### IronOS project specific files ####
|
||||||
|
|
||||||
|
# Binaries
|
||||||
|
source/Hexfile/
|
||||||
|
source/Objects/
|
||||||
|
BUILDS/
|
||||||
|
|
||||||
|
# Autogenerated
|
||||||
|
source/Core/Gen/
|
||||||
|
source/Core/Inc/unit.h
|
||||||
|
|
||||||
|
# Deploy
|
||||||
|
scripts/ci/artefacts/
|
||||||
|
scripts/ci/secrets/unencrypted/
|
||||||
|
|
||||||
|
# Generated static local docs
|
||||||
|
site/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Translations/__pycache__/
|
||||||
|
Translation Editor/__pycache__/
|
||||||
|
Translation Editor/.vscode/
|
||||||
|
|
||||||
|
# misc.
|
||||||
source/compile_commands.json
|
source/compile_commands.json
|
||||||
.idea/
|
source/.metadata/*
|
||||||
|
|
||||||
|
# TS100 related
|
||||||
|
TS100/KiCad/TS100.bak
|
||||||
|
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/obj/
|
||||||
|
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/bin/
|
||||||
|
|
||||||
|
# Tests/linters/sanitizers
|
||||||
|
source/check-style.log
|
||||||
|
|||||||
99
Documentation/Bluetooth.md
Normal file
99
Documentation/Bluetooth.md
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
# Bluetooth Low Energy
|
||||||
|
|
||||||
|
The Pinecilv2 has hardware support for Bluetooth Low Energy (BLE). This protocol allows reading and writing of parameters to the Pinecil during runtime.
|
||||||
|
|
||||||
|
The BLE interface advertises three services, these provide access to live telemetry as well as the ability to read/write settings.
|
||||||
|
These are outlined in more detail below.
|
||||||
|
|
||||||
|
Pinecil devices advertise themselves on BLE as `Pinecil-XXXXXXX`.
|
||||||
|
They also include the UUID `9eae1000-9d0d-48c5-AA55-33e27f9bc533` in the advertisement packet to allow for filtering.
|
||||||
|
|
||||||
|
Unless otherwise noted, all data is sent and received as Little-Endian.
|
||||||
|
|
||||||
|
As of the time of writing this, notifications are not fully implemented so data will need to be polled. Notification/Indication support will come when there is time to implement it.
|
||||||
|
|
||||||
|
## Using the BLE Interface
|
||||||
|
|
||||||
|
It is advised to follow the below points when first implementing a BLE integration. Of course once the integration is working feel free to deviate from these. These are just _suggested_ ideas to help kickstart.
|
||||||
|
|
||||||
|
1. When filtering for devices, its preferable to filter by the UUID `9eae1000-9d0d-48c5-AA55-33e27f9bc533`, rather than by the device name if possible.
|
||||||
|
2. Upon first collection check if the three expected services exist; if they don't the user may have selected an incorrect device.
|
||||||
|
3. It's best to read the live bulk endpoint over the live service when its easy to do so (one read vs ~15).
|
||||||
|
1. However if you are just updating one or two line items it may be more efficient to just read these on the live service.
|
||||||
|
2. Feel free to test both and decide.
|
||||||
|
4. When reading settings from the device; the association of number <-> setting is fixed, but you may see settings you don't yet know about, make sure you can handle these.
|
||||||
|
5. You probably don't want to show unknown setting's to the user though.
|
||||||
|
6. Read the device firmware revision and ensure you can decode it. If BLE is revised it may be essential for handling versions cleanly.
|
||||||
|
7. It's advisable to keep an eye on the IronOS repository or at least setup the Github watch for release notifications.
|
||||||
|
1. Future releases may revise some BLE aspects or add new settings for example.
|
||||||
|
|
||||||
|
## Services
|
||||||
|
|
||||||
|
Below is a description of each service. Note that the exact settings are not listed for brevity; it's best to refer to [the uuid lists](https://github.com/Ralim/IronOS/blob/dev/source/Core/BSP/Pinecilv2/ble_characteristics.h) and the [handlers](https://github.com/Ralim/IronOS/blob/dev/source/Core/BSP/Pinecilv2/ble_handlers.cpp) alongside this.
|
||||||
|
|
||||||
|
### Live
|
||||||
|
|
||||||
|
`UUID: d85ef000-168e-4a71-AA55-33e27f9bc533`
|
||||||
|
|
||||||
|
The live services has one characteristic per reading. The readings (in order) are:
|
||||||
|
When implementing these; the ones that are not obvious are generally found in the debugging menu. Values are encoded as an unsigned 32 bit number for all results.
|
||||||
|
|
||||||
|
1. Live temperature (In C)
|
||||||
|
2. Live set point
|
||||||
|
3. DC input voltage
|
||||||
|
4. Handle temperature (In C)
|
||||||
|
5. Power level
|
||||||
|
6. Power source
|
||||||
|
7. Tip resistance
|
||||||
|
8. uptime
|
||||||
|
9. Time of last movement
|
||||||
|
10. Maximum temperature settable
|
||||||
|
11. Raw tip reading
|
||||||
|
12. Hall sensor
|
||||||
|
13. Operating mode
|
||||||
|
14. Estimated wattage
|
||||||
|
|
||||||
|
### Settings
|
||||||
|
|
||||||
|
`UUID: f6d80000-5a10-4eba-AA55-33e27f9bc533`
|
||||||
|
|
||||||
|
The settings service has two special entries; for saving and resetting settings.
|
||||||
|
Otherwise all settings are enumerated using UUID's of the format : `f6d7ZZZZ-5a10-4eba-AA55-33e27f9bc533))` where `ZZZZ` is the setting number as matched from [Settings.h](https://github.com/Ralim/IronOS/blob/dev/source/Core/Inc/Settings.h#L16).
|
||||||
|
|
||||||
|
All data is read and written in fixed unsigned 16 bit numbers.
|
||||||
|
|
||||||
|
#### Settings save
|
||||||
|
|
||||||
|
To save the settings write a `0x0001` to `f6d7FFFF-5a10-4eba-AA55-33e27f9bc533`.
|
||||||
|
Its advised to not save settings on each change but instead to give the user a save button _or_ save after a timeout. This is just to reduce write cycles on the internal flash.
|
||||||
|
|
||||||
|
#### Settings reset
|
||||||
|
|
||||||
|
To reset all settings to defaults; write a `0x0001` to `f6d7FFFE-5a10-4eba-AA55-33e27f9bc533`.
|
||||||
|
This will reset settings immediately.
|
||||||
|
|
||||||
|
### Bulk
|
||||||
|
|
||||||
|
`UUID: 9eae1000-9d0d-48c5-AA55-33e27f9bc533`
|
||||||
|
|
||||||
|
The bulk endpoint is where extra data is located with varying read sizes.
|
||||||
|
|
||||||
|
#### Live data
|
||||||
|
|
||||||
|
The bulk live data endpoint provides all of the data provided in the live endpoint, as one large single-read binary blob. This is designed for applications that are showing large amounts of data as this is more efficient for reading.
|
||||||
|
|
||||||
|
#### Accelerometer Name
|
||||||
|
|
||||||
|
_Not yet implemented_
|
||||||
|
|
||||||
|
#### Build ID
|
||||||
|
|
||||||
|
This encodes the current build ID to allow viewing and handling when the BLE format changes.
|
||||||
|
|
||||||
|
#### Device Serial Number
|
||||||
|
|
||||||
|
This is generally the device CPU serial number. For most devices this can be used as an ID. On PinecilV2 its the MAC address.
|
||||||
|
|
||||||
|
#### Device Unique ID
|
||||||
|
|
||||||
|
This is only relevant on the PinecilV2. This is a random ID that is burned in at the factory. This is used by the online authenticity checker tool.
|
||||||
@@ -9,9 +9,43 @@ This menu is meant to be simple, so it has no fancy GUI animations.
|
|||||||
|
|
||||||
## Menu items
|
## Menu items
|
||||||
|
|
||||||
Items are shown in the menu on a single line, so they use short codes and appear in this order:
|
Items are shown in the menu on a single line, so they use short codes.
|
||||||
|
|
||||||
|
### Version
|
||||||
|
|
||||||
|
There is a static line on top which is presented on every sub-screen and reflects exact version of firmware. Version line on top has the following format - `vX.YYN.[ZZZZZZZZ]`:
|
||||||
|
|
||||||
|
- X: major version
|
||||||
|
- Y: minor version
|
||||||
|
- N: build type:
|
||||||
|
- R - git-related **r**elease tag vXX.YY
|
||||||
|
- T - git-related release **t**ag but version is not vXX.YY !
|
||||||
|
- D - git-related **d**ev branch
|
||||||
|
- B - git-related custom **b**ranch
|
||||||
|
- E - git-related from d**e**tached commit
|
||||||
|
- G - neither above but **g**it-related
|
||||||
|
- C - build from github **C**I during _pull request_
|
||||||
|
- H - build outside of a git tree (i.e. release tarball or **h**omebrew customization without git)
|
||||||
|
- S - something **s**pecial[^ERR]
|
||||||
|
- V - something **v**ery special[^ERR]
|
||||||
|
[^ERR]: `S` and `V` are reserved letters for cases when source of firmware is having very unique origin & configuration
|
||||||
|
- Z: short commit ID hash with 8 digits generated automatically from git (for git-related build types only)
|
||||||
|
|
||||||
|
I.e.:
|
||||||
|
- `v2.22H` means firmware built locally from tarball with release version of `2.22`
|
||||||
|
- `v2.22D.1A2B3C4D` means firmware with development version of `2.22` from git `dev` branch & with commit ID `1A2B3C4D` (so it can be traced for debug purposes)
|
||||||
|
- `v2.22R.5E6F7G8H` means firmware with official release version of `2.22` and it's properly tagged with `v2.22` git tag & with commit ID `5E6F7G8H`'
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Additional scroll-able items appear in this order**:
|
||||||
|
|
||||||
|
### Date
|
||||||
|
|
||||||
|
- This is a date of firmware compilation and it has the following format: `DD-MM-YY` (i.e., `01-07-23` means it has been built in July, 1st, 2023)
|
||||||
|
|
||||||
### ID
|
### ID
|
||||||
|
|
||||||
- This is used by Irons that have an ID and serial number to help check if the iron is authentic. All Pinecil V1 show the same ID number as this is the number programmed into the MCU.
|
- This is used by Irons that have an ID and serial number to help check if the iron is authentic. All Pinecil V1 show the same ID number as this is the number programmed into the MCU.
|
||||||
- The new Pinecil V2 released Aug. 2, 2022 now uses MCU BL706, which enables generating a unique ID/Serial number to every iron. This can be used to verify your [Pinecil authenticity here](https://pinecil.pine64.org/).
|
- The new Pinecil V2 released Aug. 2, 2022 now uses MCU BL706, which enables generating a unique ID/Serial number to every iron. This can be used to verify your [Pinecil authenticity here](https://pinecil.pine64.org/).
|
||||||
|
|
||||||
@@ -52,7 +86,6 @@ This is the handle temperature or more accurately the reading of the Cold Juncti
|
|||||||
This is used for CJC of the tip temperature.
|
This is used for CJC of the tip temperature.
|
||||||
> If CHan is extremely high, this indicates the temperature sensor isn't reading correctly ([see Troubleshooting](https://ralim.github.io/IronOS/Troubleshooting/))
|
> If CHan is extremely high, this indicates the temperature sensor isn't reading correctly ([see Troubleshooting](https://ralim.github.io/IronOS/Troubleshooting/))
|
||||||
|
|
||||||
|
|
||||||
### Max C
|
### Max C
|
||||||
|
|
||||||
This indicates the max temperature in °C that the system estimates it can measure the tip reliably to.
|
This indicates the max temperature in °C that the system estimates it can measure the tip reliably to.
|
||||||
@@ -106,6 +139,7 @@ Pressing (`+`) cycles through elements, and (`-`) or unplugging will exit the me
|
|||||||
The first page shows the PD negotiation stage number; which can be used for diagnosing if PD is not working. Once negotiation is complete; use (`+`) button to advance to other screens which show the different proposals advertised for voltage and current (State 12 means all is good with the PD charger).
|
The first page shows the PD negotiation stage number; which can be used for diagnosing if PD is not working. Once negotiation is complete; use (`+`) button to advance to other screens which show the different proposals advertised for voltage and current (State 12 means all is good with the PD charger).
|
||||||
|
|
||||||
#### Below is a method for user modification to convert some early models of Pinecil V1 to safely support 24V on the DC5525 barrel.
|
#### Below is a method for user modification to convert some early models of Pinecil V1 to safely support 24V on the DC5525 barrel.
|
||||||
|
|
||||||
⚠️ Warning: do this at your own risk, read everything in this document, and go to the [Pine64 community chat](https://wiki.pine64.org/wiki/Pinecil#Community_links) if you desire advice. An incorrect cut of the trace could render the Pinecil non-working.
|
⚠️ Warning: do this at your own risk, read everything in this document, and go to the [Pine64 community chat](https://wiki.pine64.org/wiki/Pinecil#Community_links) if you desire advice. An incorrect cut of the trace could render the Pinecil non-working.
|
||||||
|
|
||||||
Background: a simple user modification to the PCB on _some models_ of original V1 allows it to safely use DC barrel 24V by cutting a trace line to the Vbus which held it back to 21V. You can check whether your Pinecil V1 needs the update or can benefit from it by using a hidden trick in the PD debug menu.
|
Background: a simple user modification to the PCB on _some models_ of original V1 allows it to safely use DC barrel 24V by cutting a trace line to the Vbus which held it back to 21V. You can check whether your Pinecil V1 needs the update or can benefit from it by using a hidden trick in the PD debug menu.
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ On Windows follow the instructions on the official documentation to install 'Win
|
|||||||
3. Build the firmware for Pinecil V2:
|
3. Build the firmware for Pinecil V2:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd source/source
|
cd source/
|
||||||
./build.sh -l EN -m Pinecilv2
|
./build.sh -l EN -m Pinecilv2
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,62 @@
|
|||||||
## Notes on the various supported hardware
|
## Notes on the various supported hardware
|
||||||
|
|
||||||
|
|
||||||
|
### TS100
|
||||||
|
|
||||||
|
TS100\* is a neat soldering iron:
|
||||||
|
|
||||||
|
- can run from 9-25V DC;
|
||||||
|
- provides a power range that is determined by the input voltage;
|
||||||
|
- voltages below 12V don't overly work well for any substantial mass;
|
||||||
|
- the default firmware can be found [here](https://www.minidso.com/forum.php?mod=viewthread&tid=892&extra=page%3D1).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### TS80
|
||||||
|
|
||||||
|
TS80\* is a successor to TS100:
|
||||||
|
|
||||||
|
- uses _Quick Charge 3.0_ / _QC3_ capable charger only (18W max);
|
||||||
|
- doesn't support PD as it is not designed on the hardware level;
|
||||||
|
- the default firmware can be found [here](https://www.minidso.com/forum.php?mod=viewthread&tid=3208&extra=page%3D1).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### TS80P
|
||||||
|
|
||||||
|
TS80P\* is a successor to TS80:
|
||||||
|
|
||||||
|
- supports _Quick Charge 3.0_ (_QC3_: 9V/3A, 18W max);
|
||||||
|
- supports _Power Delivery_ (_PD_: 9V/3A & 12V/3A, 30W max)\*\*;
|
||||||
|
- the default firmware can be found [here](https://www.minidso.com/forum.php?mod=viewthread&tid=4085&extra=page%3D1).
|
||||||
|
|
||||||
|
\*\*: use valid PD device that supports 12V/3A as power source to get full 30W potential, otherwise the iron will fall back to 9V/18W power mode.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
### MHP30
|
### MHP30
|
||||||
|
|
||||||
- Accelerometer is the MSA301, this is mounted roughly in the middle of the unit
|
MHP30 is a **M**ini **H**ot **P**late:
|
||||||
- USB-PD is using the FUSB302
|
|
||||||
- The hardware I2C bus on PB6/7 is used for the MSA301 and FUSB302
|
- accelerometer is the MSA301, this is mounted roughly in the middle of the unit;
|
||||||
- The OLED is the same SSD1306 as everything else, but it’s on a bit-banged bus
|
- USB-PD is using the FUSB302;
|
||||||
|
- the hardware I2C bus on PB6/7 is used for the MSA301 and FUSB302;
|
||||||
|
- the OLED is the same SSD1306 as everything else, but it’s on a bit-banged bus.
|
||||||
|
|
||||||
|
|
||||||
|
### Pinecil
|
||||||
|
|
||||||
|
Pincecil\*:
|
||||||
|
|
||||||
|
- first model of soldering iron from PINE64;
|
||||||
|
- the default firmware can be found [here](https://files.pine64.org/os/Pinecil/Pinecil_firmware_20201115.zip).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
\*: Please note: these soldering irons do *NOT* contain DC/DC converters. This means that your power at the tip is a function of the supplied voltage. Just because the iron "supports" running at a wide range of voltages, you should always use a voltage near the upper limit where possible. It is highly recommended to use a PD adapter where possible as this allows the iron to _know_ the limitations of your supply. The marked irons can only turn the tip on and off in software, this means that they can't control the maximum power drawn from the supply. This is why when using PD the iron may select a lower voltage than your power supplies maximum. This is to prevent your power supply failing from over current. For more information about power management underhood, please, [see the related documentation section](https://ralim.github.io/IronOS/Power/).
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,36 @@
|
|||||||
# Version Changes
|
# Version Changes
|
||||||
|
|
||||||
## V2.19
|
|
||||||
|
# V2.21
|
||||||
|
|
||||||
|
### Features & changes
|
||||||
|
|
||||||
|
- Bluetooth Low Energy support for PinecilV2
|
||||||
|
- Large cleanup of translation files; and refactor of how we handle fonts for translations
|
||||||
|
- Fixes for I2C corruption on PinecilV2
|
||||||
|
- Option for using adjustable profiles on USB-PD or not
|
||||||
|
- Cleanups and improvements to the generated [documents website](https://ralim.github.io/IronOS)
|
||||||
|
|
||||||
|
### PinecilV2 notes
|
||||||
|
|
||||||
|
For Pinecil V2 users blisp is currently my recommended CLI tool for updating the device. It is built for all main OS's automatically. This does not apply to V1 devices. If your iron came with a blue grip, its a V1 and update the same as always. If your device came with a green silicone grip its a V2 device.
|
||||||
|
|
||||||
|
Alternatively you can use Spagett1's PineFlash tool that should provide a GUI interface for PinecilV1 & PinecilV2.
|
||||||
|
|
||||||
|
For a small number of V2 Pinecil devices there appears to be an interference issue between the Bluetooth Low Energy and some devices; more information here. If this occurs to you, please let us know in the issue and rollback to 2.20 for now.
|
||||||
|
|
||||||
|
|
||||||
|
# V2.20
|
||||||
|
|
||||||
|
- First "full" release for PinecilV2
|
||||||
|
- Loots of documentation updates
|
||||||
|
- Documentation is [now nicely readable as a site](https://ralim.github.io/IronOS/GettingStarted)
|
||||||
|
- A fair collection of bugfixes for PinecilV2
|
||||||
|
- Cold Junction Calibration was reworked and now occurs _at next boot_ to make it easier to perform when the device is cold
|
||||||
|
|
||||||
|
|
||||||
|
# V2.19
|
||||||
|
|
||||||
- Bug-fix Infinite Boot Logo
|
- Bug-fix Infinite Boot Logo
|
||||||
- Shutdown settings for MHP30
|
- Shutdown settings for MHP30
|
||||||
- Accelerometer sensitivity for MHP30
|
- Accelerometer sensitivity for MHP30
|
||||||
@@ -9,7 +39,9 @@
|
|||||||
- Updated translations
|
- Updated translations
|
||||||
- Improved documents, added features table
|
- Improved documents, added features table
|
||||||
|
|
||||||
## V2.18
|
|
||||||
|
# V2.18
|
||||||
|
|
||||||
- Support for animated bootup logo's
|
- Support for animated bootup logo's
|
||||||
- Bootup logo's moved to their own IronOS-Meta repo
|
- Bootup logo's moved to their own IronOS-Meta repo
|
||||||
- New Vietnamese translation (limited due to screen size)
|
- New Vietnamese translation (limited due to screen size)
|
||||||
@@ -17,8 +49,11 @@
|
|||||||
- Updated translations
|
- Updated translations
|
||||||
- Better Instructions/documents
|
- Better Instructions/documents
|
||||||
|
|
||||||
## V2.17
|
|
||||||
### Big changes
|
# V2.17
|
||||||
|
|
||||||
|
### Features & changes
|
||||||
|
|
||||||
- Indicate status of VBus for modding Pinecil (debug menu)
|
- Indicate status of VBus for modding Pinecil (debug menu)
|
||||||
- Better hall effect sensor sensitivity adjustment (larger range with more steps)
|
- Better hall effect sensor sensitivity adjustment (larger range with more steps)
|
||||||
- Temperature increment will "round" to nearest multiple of increase amount
|
- Temperature increment will "round" to nearest multiple of increase amount
|
||||||
@@ -32,7 +67,9 @@
|
|||||||
- Fixed automatic orientation for newer TS80P's with the SC7 accelerometer
|
- Fixed automatic orientation for newer TS80P's with the SC7 accelerometer
|
||||||
- User interface slight changes
|
- User interface slight changes
|
||||||
- New `metadata.zip` file to allow the Pine Updater to automatically fetch information on releases
|
- New `metadata.zip` file to allow the Pine Updater to automatically fetch information on releases
|
||||||
|
|
||||||
### Notes
|
### Notes
|
||||||
|
|
||||||
- VBus mod detection may not play well with all PPS chargers. If your iron reboots when you view this in the debug menu its not a fault. ([#1226](https://github.com/Ralim/IronOS/issues/1226))
|
- VBus mod detection may not play well with all PPS chargers. If your iron reboots when you view this in the debug menu its not a fault. ([#1226](https://github.com/Ralim/IronOS/issues/1226))
|
||||||
- `metadata.zip` is only designed for use by automatic software, ignore it for normal use
|
- `metadata.zip` is only designed for use by automatic software, ignore it for normal use
|
||||||
- More details on Pinecil VBus mod coming via other channels.
|
- More details on Pinecil VBus mod coming via other channels.
|
||||||
@@ -41,39 +78,38 @@
|
|||||||
- -> Release has been updated to build `e065be3` after one bug with the BMA223 was found.
|
- -> Release has been updated to build `e065be3` after one bug with the BMA223 was found.
|
||||||
|
|
||||||
|
|
||||||
## V2.16
|
# V2.16
|
||||||
|
|
||||||
* Overhaul of the Timer+ADC setup with help from @sandmanRO
|
- Overhaul of the Timer+ADC setup with help from @sandmanRO
|
||||||
* Overhaul of the PID with help from @sandmanRO
|
- Overhaul of the PID with help from @sandmanRO
|
||||||
* Settings _should_ now upgrade in place to future versions, with resets only happening to new/changed settings
|
- Settings _should_ now upgrade in place to future versions, with resets only happening to new/changed settings
|
||||||
* Shows error if tip runaway (failed temperature sensor) is detected
|
- Shows error if tip runaway (failed temperature sensor) is detected
|
||||||
* USB-PD now has a timeout, to allow forcing QC3 negotiation to start faster
|
- USB-PD now has a timeout, to allow forcing QC3 negotiation to start faster
|
||||||
* QC3 Voltages are now adjustable to user desired setpoint
|
- QC3 Voltages are now adjustable to user desired setpoint
|
||||||
* Added a small tolerance to allow "overvoltage" on QC3 above unit specifications.
|
- Added a small tolerance to allow "overvoltage" on QC3 above unit specifications.
|
||||||
* * Please note: Doing this is entirely at your own risk!
|
- Please note: Doing this is entirely at your own risk!
|
||||||
* New Advanced view that is much nicer to use and a very good daily driver option from @Mel-kior
|
- New Advanced view that is much nicer to use and a very good daily driver option from @Mel-kior
|
||||||
* OLED brightness and contrast thanks to @alvinhochun
|
- OLED brightness and contrast thanks to @alvinhochun
|
||||||
* Scrollbar is fixed so it doesnt jump around when menus are shown/hidden
|
- Scrollbar is fixed so it doesnt jump around when menus are shown/hidden
|
||||||
* Moved to `.dfu` files from `.bin` to make flashing commands easier
|
- Moved to `.dfu` files from `.bin` to make flashing commands easier
|
||||||
* Every language had translation updates I believe
|
- Every language had translation updates I believe
|
||||||
* Romanian language added
|
- Romanian language added
|
||||||
|
|
||||||
|
|
||||||
## V2.15
|
# V2.15
|
||||||
|
|
||||||
|
### Features & changes
|
||||||
|
|
||||||
## Feature upgrades:
|
- MHP30 support
|
||||||
|
- Multi-lingual firmware combinations now exist for Pinecil
|
||||||
|
- More fine grained voltage controlled options
|
||||||
|
- USB-PD improvements (version one and two)
|
||||||
|
- More configuration options for power pulse
|
||||||
|
- All font / character encoding has been very reworked
|
||||||
|
- More translation updates than one can count
|
||||||
|
- More languages 😱
|
||||||
|
|
||||||
* MHP30 support
|
### MHP30 support
|
||||||
* Multi-lingual firmware combinations now exist for Pinecil
|
|
||||||
* More fine grained voltage controlled options
|
|
||||||
* USB-PD improvements (version one and two)
|
|
||||||
* More configuration options for power pulse
|
|
||||||
* All font / character encoding has been very reworked
|
|
||||||
* More translation updates than one can count
|
|
||||||
* More languages 😱
|
|
||||||
|
|
||||||
### MHP30
|
|
||||||
|
|
||||||
The MHP30 is a small reflow station from Miniware.
|
The MHP30 is a small reflow station from Miniware.
|
||||||
Thanks to a massive amount of help from @g3gg0 this firmware brings the beginnings of support for this unit.
|
Thanks to a massive amount of help from @g3gg0 this firmware brings the beginnings of support for this unit.
|
||||||
@@ -84,7 +120,8 @@ Programs the same as any one Miniware unit using drag and drop.
|
|||||||
|
|
||||||
The flood doors are now open for feature requests for this unit :)
|
The flood doors are now open for feature requests for this unit :)
|
||||||
|
|
||||||
## V2.14
|
|
||||||
|
# V2.14
|
||||||
|
|
||||||
- Fixing auto rotation bug in the LIS accelerometer in the TS80/TS80P
|
- Fixing auto rotation bug in the LIS accelerometer in the TS80/TS80P
|
||||||
- Adds support for two new accelerometers
|
- Adds support for two new accelerometers
|
||||||
@@ -101,7 +138,8 @@ The flood doors are now open for feature requests for this unit :)
|
|||||||
- Cleanup the folder name of the source code #800
|
- Cleanup the folder name of the source code #800
|
||||||
- clang-format spec setup #801
|
- clang-format spec setup #801
|
||||||
|
|
||||||
## V2.13
|
|
||||||
|
# V2.13
|
||||||
|
|
||||||
- First _official_ Pinecil release
|
- First _official_ Pinecil release
|
||||||
- All of the wire for Pinecil releases added
|
- All of the wire for Pinecil releases added
|
||||||
@@ -118,7 +156,8 @@ The flood doors are now open for feature requests for this unit :)
|
|||||||
- Fixed bug with accelerometer model on Pinecil
|
- Fixed bug with accelerometer model on Pinecil
|
||||||
- Rework of all of the temperature curves for better accuracy
|
- Rework of all of the temperature curves for better accuracy
|
||||||
|
|
||||||
## V2.12
|
|
||||||
|
# V2.12
|
||||||
|
|
||||||
- Only released as pre-release
|
- Only released as pre-release
|
||||||
- [TS80P] Improvements to the PD negotiation to handle a few more adapters cleanly
|
- [TS80P] Improvements to the PD negotiation to handle a few more adapters cleanly
|
||||||
@@ -126,36 +165,42 @@ The flood doors are now open for feature requests for this unit :)
|
|||||||
- Clean up the menu (removed both enables and settings, so that you can turn things off easier)
|
- Clean up the menu (removed both enables and settings, so that you can turn things off easier)
|
||||||
- Removing the very old single line menu style.
|
- Removing the very old single line menu style.
|
||||||
|
|
||||||
## V2.11
|
|
||||||
|
# V2.11
|
||||||
|
|
||||||
- First TS80P support
|
- First TS80P support
|
||||||
- Added in a USB-PD driver stack for the FUSB302
|
- Added in a USB-PD driver stack for the FUSB302
|
||||||
- Fixed some graphical glitches
|
- Fixed some graphical glitches
|
||||||
|
|
||||||
## V2.10
|
|
||||||
|
# V2.10
|
||||||
|
|
||||||
- GUI polish (animations and scroll bars)
|
- GUI polish (animations and scroll bars)
|
||||||
- Power pulse to keep power supplies alive
|
- Power pulse to keep power supplies alive
|
||||||
- Adjustable tip response gain
|
- Adjustable tip response gain
|
||||||
|
|
||||||
## V2.09
|
|
||||||
|
# V2.09
|
||||||
|
|
||||||
- Adjustable steps in temperature adjustment
|
- Adjustable steps in temperature adjustment
|
||||||
- Git hash now in build string
|
- Git hash now in build string
|
||||||
- Adjustable language to set if US units are available or not
|
- Adjustable language to set if US units are available or not
|
||||||
- Some minor QC3 improvements
|
- Some minor QC3 improvements
|
||||||
|
|
||||||
## V2.08
|
|
||||||
|
# V2.08
|
||||||
|
|
||||||
- Fixes auto start in sleep mode
|
- Fixes auto start in sleep mode
|
||||||
- Power limiters
|
- Power limiters
|
||||||
|
|
||||||
## V2.07
|
|
||||||
|
# V2.07
|
||||||
|
|
||||||
- QC fixes
|
- QC fixes
|
||||||
- Cosmetic fixes for leading 0's
|
- Cosmetic fixes for leading 0's
|
||||||
|
|
||||||
## V2.06
|
|
||||||
|
# V2.06
|
||||||
|
|
||||||
- Warning on settings reset
|
- Warning on settings reset
|
||||||
- Temp temp re-write
|
- Temp temp re-write
|
||||||
@@ -163,27 +208,33 @@ The flood doors are now open for feature requests for this unit :)
|
|||||||
- Hide some leading 0's
|
- Hide some leading 0's
|
||||||
- Menu timeouts
|
- Menu timeouts
|
||||||
|
|
||||||
## V2.05
|
|
||||||
|
# V2.05
|
||||||
|
|
||||||
- Language updates
|
- Language updates
|
||||||
|
|
||||||
## V2.04
|
|
||||||
|
# V2.04
|
||||||
|
|
||||||
- GUI updates
|
- GUI updates
|
||||||
|
|
||||||
## V2.03
|
|
||||||
|
# V2.03
|
||||||
|
|
||||||
- Support for new accelerometers
|
- Support for new accelerometers
|
||||||
|
|
||||||
## V2.02
|
|
||||||
|
# V2.02
|
||||||
|
|
||||||
- Adds small font
|
- Adds small font
|
||||||
|
|
||||||
## V2.01
|
|
||||||
|
# V2.01
|
||||||
|
|
||||||
- Newer settings menu
|
- Newer settings menu
|
||||||
|
|
||||||
## V2.00
|
|
||||||
|
# V2.00
|
||||||
|
|
||||||
- Complete re-write of the low layer system to use the STM32 HAL for easier development
|
- Complete re-write of the low layer system to use the STM32 HAL for easier development
|
||||||
- This allowed easier setup for the new ADC auto measuring system
|
- This allowed easier setup for the new ADC auto measuring system
|
||||||
@@ -193,80 +244,96 @@ The flood doors are now open for feature requests for this unit :)
|
|||||||
- Added detailed screen views
|
- Added detailed screen views
|
||||||
- Added smaller font for said screen views
|
- Added smaller font for said screen views
|
||||||
|
|
||||||
## V1.17
|
|
||||||
|
# V1.17
|
||||||
|
|
||||||
- Added blinking cooldown display
|
- Added blinking cooldown display
|
||||||
- Allowed smaller sleep timeout values
|
- Allowed smaller sleep timeout values
|
||||||
- New font!
|
- New font!
|
||||||
- Automatic startup option
|
- Automatic startup option
|
||||||
|
|
||||||
## V1.16
|
|
||||||
|
# V1.16
|
||||||
|
|
||||||
- Added automatic rotation support
|
- Added automatic rotation support
|
||||||
- Added power display graph
|
- Added power display graph
|
||||||
|
|
||||||
## V1.15
|
|
||||||
|
# V1.15
|
||||||
|
|
||||||
- Added support for a custom bootup logo to be programmed via the DFU bootloader
|
- Added support for a custom bootup logo to be programmed via the DFU bootloader
|
||||||
|
|
||||||
## V1.14
|
|
||||||
|
# V1.14
|
||||||
|
|
||||||
- Changed input voltage cutoff to be based on cell count rather than voltage
|
- Changed input voltage cutoff to be based on cell count rather than voltage
|
||||||
|
|
||||||
## V1.13
|
|
||||||
|
# V1.13
|
||||||
|
|
||||||
- Swapped buttons for menu to prevent accidentally changing first menu item
|
- Swapped buttons for menu to prevent accidentally changing first menu item
|
||||||
- Added auto key repeat
|
- Added auto key repeat
|
||||||
|
|
||||||
## V1.12
|
|
||||||
|
# V1.12
|
||||||
|
|
||||||
- Increases sensitivity options to be 1\*9 with 0 off state
|
- Increases sensitivity options to be 1\*9 with 0 off state
|
||||||
- Fixes issue where going from COOL \*> soldering can leave screen off
|
- Fixes issue where going from COOL \*> soldering can leave screen off
|
||||||
|
|
||||||
## V1.11
|
|
||||||
|
# V1.11
|
||||||
|
|
||||||
- Boost mode
|
- Boost mode
|
||||||
- Change sensitivity options to be 1\*8
|
- Change sensitivity options to be 1\*8
|
||||||
|
|
||||||
## V1.10
|
|
||||||
|
# V1.10
|
||||||
|
|
||||||
- Adds help text to settings
|
- Adds help text to settings
|
||||||
- Improves settings for the display update rate
|
- Improves settings for the display update rate
|
||||||
|
|
||||||
## V1.09
|
|
||||||
|
# V1.09
|
||||||
|
|
||||||
- Adds display modes, for slowing down or simplifying the display
|
- Adds display modes, for slowing down or simplifying the display
|
||||||
|
|
||||||
## V1.08
|
|
||||||
|
# V1.08
|
||||||
|
|
||||||
- Fix settings menu not showing flip display
|
- Fix settings menu not showing flip display
|
||||||
|
|
||||||
## V1.07
|
|
||||||
|
# V1.07
|
||||||
|
|
||||||
- Adds shutdown time to automatically shutdown the iron after inactivity
|
- Adds shutdown time to automatically shutdown the iron after inactivity
|
||||||
|
|
||||||
## V1.06
|
|
||||||
|
# V1.06
|
||||||
|
|
||||||
- Changes H and C when the iron is heating to the minidso chevron like images
|
- Changes H and C when the iron is heating to the minidso chevron like images
|
||||||
|
|
||||||
## V1.05
|
|
||||||
|
# V1.05
|
||||||
|
|
||||||
- Adds ability to calibrate the input voltage measurement
|
- Adds ability to calibrate the input voltage measurement
|
||||||
|
|
||||||
## V1.04
|
|
||||||
|
# V1.04
|
||||||
|
|
||||||
- Increased accuracy of the temperature control
|
- Increased accuracy of the temperature control
|
||||||
- Improved PID response slightly
|
- Improved PID response slightly
|
||||||
- Allows temperature offset calibration
|
- Allows temperature offset calibration
|
||||||
- Nicer idle screen
|
- Nicer idle screen
|
||||||
|
|
||||||
## V1.03
|
|
||||||
|
# V1.03
|
||||||
|
|
||||||
- Improved Button handling
|
- Improved Button handling
|
||||||
- Ability to set motion sensitivity
|
- Ability to set motion sensitivity
|
||||||
- DC voltmeter page shows input voltage
|
- DC voltmeter page shows input voltage
|
||||||
|
|
||||||
## V1.02
|
|
||||||
|
# V1.02
|
||||||
|
|
||||||
- Adds hold both buttons on IDLE to access the therometer mode
|
- Adds hold both buttons on IDLE to access the therometer mode
|
||||||
- Changes the exit soldering mode to be holding both buttons (Like original firmware)
|
- Changes the exit soldering mode to be holding both buttons (Like original firmware)
|
||||||
|
|||||||
@@ -1,56 +1,79 @@
|
|||||||
# Startup Logos
|
# Startup Logo / Animation
|
||||||
|
|
||||||
This firmware supports a user created bootup logo.
|
When the device starts, you can have it optionally show either a static image or an animation. You can also set if these should stay on the screen or dismiss after some amount of time.
|
||||||
By default, there is _not_ one included in the firmware. This means that once flashed they generally stay. If you want no logo again, you would have to flash a blank image to the bootup logo.
|
These can be an elegant way to personalise your device or just mark it as your one at a meetup where there may be multiple.
|
||||||
|
|
||||||
|
All devices supported by IronOS support this logo, and follow a similar process for setting one up. Please read the below general information as well as any model specific notes.
|
||||||
|
|
||||||
|
Bootup logos are stored at the end of the flash storage in the Iron; next to the user settings. By locating them at the end of storage they are not erased during the normal firmware upgrade process. Once a logo is set it should stay (unless we need to change things in the main firmware); so to erase your logo you will also find that we generate an erase file. Alternatively your method of flashing _may_ support doing a full erase flash which will also work for this.
|
||||||
|
|
||||||
## Generating the Logo files
|
## Generating the Logo files
|
||||||
|
|
||||||
There are community logo's already converted and ready to use in [IronOS-Meta/releases](https://github.com/Ralim/IronOS-Meta/releases).
|
Because logos are stored at a fixed location in the device's internal flash; we can use the same method to flash these as you would normal firmware.
|
||||||
|
This does also mean that we need to convert the image/animation file into the format that IronOS understands.
|
||||||
|
|
||||||
|
IronOS uses a pre-processed file format to dramatically reduce the amount of space required to store the image; allowing for animations and saving space.
|
||||||
|
|
||||||
|
In the [IronOS-Meta](https://github.com/Ralim/IronOS-Meta) repository is a `python` script to convert images into this pre-processed file format.
|
||||||
|
Additionally, memebers of the community have contributed back their logo images as well. We provide these pre-converted for all models and ready to use in [IronOS-Meta/releases](https://github.com/Ralim/IronOS-Meta/releases).
|
||||||
Download the zip for Pinecil or Miniware and then install using the instructions in the Flashing section below.
|
Download the zip for Pinecil or Miniware and then install using the instructions in the Flashing section below.
|
||||||
|
|
||||||
If you want to make custom art then it needs to be converted with a Python script. The script and other needed files are in [IronOS-Meta](https://github.com/Ralim/IronOS-Meta/). Go to that folder, then it is easiest to select the green Code button (upper right), then Download Zip. This way you get all the files you need and some extras. You only need what is inside Boot Logos. Put your custom image inside the Boot Logos folder with all python script files already there.
|
If you want to make custom art then it needs to be converted with the Python script.
|
||||||
|
You can checkout the repository or use the download-as-zip button in the Github web interface to download the code.
|
||||||
|
|
||||||
The Python script converts an image passed into it on the command line into both a `.hex` file and a `.dfu` to be uploaded to the iron in DFU mode. The image can be in color and any size, but it will be resized and converted to 1-bit color. However, it looks best if you create a 96x16 image (Png or Bmp) in any image editor and color the pixels black & white manually.
|
Inside the download code is a `Boot Logos` folder, inside here is the python script required for logo conversion.
|
||||||
|
It is easiest if you copy your logo file to be converted into this folder too, in order to keep commands shorter.
|
||||||
|
|
||||||
The converter requires at least Python3 and Pillow apps. Follow online instructions for installing Python and Pillow.
|
The image can be in color and any size, but it will be resized and converted to 1-bit color. However, it looks best if you create a 96x16 image (`png` or `bmp`) in any image editor and color the pixels black & white manually. The thresholding used for converting colour to B&W may not always work as well as one would hope.
|
||||||
|
|
||||||
For Windows, it is recommended to use Windows PowerShell instead of Command.
|
The converter requires at least Python3 and Pillow apps. Follow online instructions for installing Python and Pillow on your machine. Any reasonably recent version should work well.
|
||||||
Open Powershell (run as administrator), type python to install it, it will open microsoft store where you can install it free.
|
|
||||||
Go back to Powershell and install Pillow. What works can vary, but this command may work:
|
|
||||||
|
|
||||||
python -m pip install Pillow
|
When running the script on the Windows operating system; it is recommended to use `Powershell` rather than the old `Command Prompt`.
|
||||||
or
|
|
||||||
python3 -m pip install pillow
|
|
||||||
|
|
||||||
If the above does not work, see [this page](https://stackoverflow.com/a/20061019/6705343) on StackOverflow about installing Pillow.
|
For installing pillow; you can install it via your package manager (Debian and similar distros) or via pip. To install via pip the command should be `python -m pip install pillow`.
|
||||||
Now that Python and Pillow are successfuly installed, you can convert an image.
|
|
||||||
|
|
||||||
Go back to Powershell and type this command (change infile.png to the name of your image):
|
In your shell you can now execute `python img2logo.py input.png out -m ${model}` to convert the file `input.png` and create output files in the folder `out`.
|
||||||
|
The model should be replaced by one of the following options:
|
||||||
|
|
||||||
- `python img2logo.py infile.png out -m` for Miniware
|
- `miniware` for older Miniware Irons -> TS100, TS80, TS80P
|
||||||
- `python img2logo.py infile.png out -p` for Pinecil
|
- `pinecilv1` for the Pinecil V1
|
||||||
|
- `pinecilv2` for the Pinecil V2
|
||||||
|
- `ts101` for the Miniware TS101 [^1]
|
||||||
|
- `s60` for the Squire S60 [^1]
|
||||||
|
- `mhp30` for the Miniware MHP30
|
||||||
|
|
||||||
Run `python img2logo.py --help` to see available options. Replace the word python with python3 if you have multiple versions of python installed.
|
Different models are used for different flash locations for the image storage.
|
||||||
|
This means that files are **not** interchangeable between devices. If you are flashing multiple devices you will need to create a different file for different models.
|
||||||
|
|
||||||
|
After processing its expected to have a `.hex` and `.dfu` file created to be used. Which one to use will depend on your device.
|
||||||
|
|
||||||
Note: make sure your image file is in the same folder as script files (img2logo.py, output_dfu.py, output_hex.py).
|
Note: make sure your image file is in the same folder as script files (img2logo.py, output_dfu.py, output_hex.py).
|
||||||
|
|
||||||
|
[^1] Note that these devices have larger resolution screens that the logo system supports right now. Fixes are coming for this soon, roughly scheduled for 2.23.
|
||||||
|
|
||||||
## Flashing the Logo
|
## Flashing the Logo
|
||||||
|
|
||||||
### Miniware (TS100/TS80/TS80P)
|
### Upload via virtual disk (TS100,TS101,TS80,TS80P,S60,MHP30)
|
||||||
|
|
||||||
Upload the HEX file to the iron in DFU mode and, if the file's extension changes to .RDY, your custom splash screen should show up on startup.
|
If you normally update your firmware by having your device show up as a flash drive this is the method for you.
|
||||||
You perform this the same way as if you were flashing a new firmware, and all the existing notes around this apply.
|
This applies to all Miniware + S60 devices running the stock DFU bootloader.
|
||||||
|
|
||||||
If you have flashed the `IronOS-dfu` alternative bootloader, you should use the `.dfu` files instead
|
Place your device into update mode (usually by holding the B button when connecting your device to your pc via USB).
|
||||||
|
Upload the `.hex` file you created earlier as if it was a firmware update. Do any normal tricks required for firmware flashing if any are required.
|
||||||
|
Afterwards the firmware should indicate that it has worked (often by creating a `.rdy` file).
|
||||||
|
|
||||||
### Pinecil V1
|
At this point unplug your iron and re-connect it to power to start normally and the logo should welcome you.
|
||||||
|
|
||||||
For Pinecil V1, we require using dfu-util to flash the logo art (Pinecil does not use hex).
|
### Upload via GUI flash tool (PinecilV1/V2)
|
||||||
[Pine64 Updater](https://github.com/pine64/pine64_updater/releases) is the easiest way to load the Bootup logo onto Pinecil as it already includes the necessary DFU library. Connect Pinecil to a PC, and open the Updater the same as updating firmware.
|
|
||||||
Select Custom > Browse to the DFU image file you just made > Update to install.
|
|
||||||
|
|
||||||
The bootup logo is stored in a separate location than the IronOS firmware and you do not have to worry about it changing or breaking the IronOS.
|
If you normally upload your firmware using a helper application, they should accept the files from the bootlogo the same as the normal firmware.
|
||||||
|
Try the `.dfu` file first and then the `.hex`. If neither work then the application may not be updated to be able to handle boot logos. And you may need to use a different/newer tool.
|
||||||
|
|
||||||
You could also use dfu-util and use Command line to install it.
|
### Upload via dfu-util (PinecilV1/IronOS-DFU)
|
||||||
|
|
||||||
- `dfu-util -D logo_file.dfu`
|
For the PinecilV1 and for any devices that have been converted to use `IronOS-DFU` as the bootloader you can flash these via the `dfu-util` command line tool.
|
||||||
|
For these flash as per usual using the `.dfu` file. Afterwards power cycle and the logo should show up.
|
||||||
|
|
||||||
|
### Upload via blisp (PinecilV2)
|
||||||
|
|
||||||
|
For the PinecilV2 we suggest `blisp` as the command line tool to use if you are not using a GUI tool. `blsip` has been updated to accept `.dfu` files as well as the `.bin` files it historically used. As such you use the `.dfu` file for the logo and flash as per normal otherwise and it will work and reboot at the end. It should show you your new logo after flashing.
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ The resistance of the tip is a fixed constant in ohms (Ω):
|
|||||||
This means the power delivered to the soldering tip is proportional to the voltage squared.
|
This means the power delivered to the soldering tip is proportional to the voltage squared.
|
||||||
Therefore the Pinecil and TS100 perform poorly when run off 12V power supplies and may issue a `Thermal Runaway` message (weak power supply).
|
Therefore the Pinecil and TS100 perform poorly when run off 12V power supplies and may issue a `Thermal Runaway` message (weak power supply).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### Use an [Ohm calculator](https://www.rapidtables.com/calc/electric/power-calculator.html#dc) to quickly derive watts.
|
#### Use an [Ohm calculator](https://www.rapidtables.com/calc/electric/power-calculator.html#dc) to quickly derive watts.
|
||||||
|
|
||||||
| Type | Volts| / | Tip Ω | = | Amps | * | Volts | = | Watts |
|
| Type | Volts| / | Tip Ω | = | Amps | * | Volts | = | Watts |
|
||||||
@@ -44,3 +46,8 @@ To measure the tip temperature in the iron, the iron has a small op-amp connecte
|
|||||||
Once the output is turned off (via the FET), the system has a recovery time as the tip capacitance discharges and the op-amp exits saturation. After this delay period, the MCU's ADC (analog-to-digital converter) samples the output of the op-amp 8 times quickly and then sets a flag to turn the PWM output back on.
|
Once the output is turned off (via the FET), the system has a recovery time as the tip capacitance discharges and the op-amp exits saturation. After this delay period, the MCU's ADC (analog-to-digital converter) samples the output of the op-amp 8 times quickly and then sets a flag to turn the PWM output back on.
|
||||||
This enforces a small dead time in the output signal while this occurs, so there is a balance between sampling the temperature often to maintain a stable tip temperature control and sampling less often to increase the maximum power deliverable to the tip ([see Complexity of measurement](https://ralim.github.io/IronOS/Temperature/#complexity-of-measurement)).
|
This enforces a small dead time in the output signal while this occurs, so there is a balance between sampling the temperature often to maintain a stable tip temperature control and sampling less often to increase the maximum power deliverable to the tip ([see Complexity of measurement](https://ralim.github.io/IronOS/Temperature/#complexity-of-measurement)).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Power sources
|
||||||
|
|
||||||
|
Supported by IronOS hardware may use different power sources (chargers/powerbanks/battery packs) with different standards & protocols (QC/PD/etc). For more information collected by the community on that, please, [see the related documentation section](https://ralim.github.io/IronOS/PowerSources/).
|
||||||
|
|||||||
80
Documentation/PowerSources.md
Normal file
80
Documentation/PowerSources.md
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
# Power sources
|
||||||
|
|
||||||
|
Supported by IronOS hardware may use different power sources (chargers/powerbanks/battery packs) with different standards & protocols (QC/PD/etc). This document contains information collected by the community with tested power sources.
|
||||||
|
|
||||||
|
This is not ads but first hands-on experience results from real users since some chargers/powerbanks regardless labels on the box may not fully support what's declared!
|
||||||
|
|
||||||
|
|
||||||
|
## QC(3)
|
||||||
|
|
||||||
|
|
||||||
|
### Compatible Devices (QuickCharge for TS80/P)
|
||||||
|
|
||||||
|
The following table is the list of compatible device and remarks when powering up the TS80 through it for both stock firmware from MiniDso and IronOS. The list of devices below are primarily taken from [#349](https://github.com/Ralim/ts100/issues/349#issuecomment-449559806)
|
||||||
|
|
||||||
|
| Device Name | Stock FW | IronOS FW |
|
||||||
|
|-------------|:--------:|:---------:|
|
||||||
|
| Anker PowerCore II Slim 10000 Powerbank | Not Working | Good |
|
||||||
|
| [Aukey 26.5/30 Ah Powerbank (PB-Y3)](https://www.aukey.com/products/30000mah-power-bank-with-quick-charge-3-0/) | OK\*\* (15sec t/o) | OK\*\* (15sec t/o) |
|
||||||
|
| Aukey QC3 Charger | Good | Only 5V |
|
||||||
|
| [Aukey QC3 Charging Station (PA-T11)](https://www.aukey.com/products/6-port-charging-station-with-quick-charge-3-0-pa-t11/) | Good | Good |
|
||||||
|
| Besiter 20000mah QC3 | Not Working | Only 5V |
|
||||||
|
| BlitzWolf BW-P5 | Not Working\* | Unknown |
|
||||||
|
| BlitzWolf BW-PF2 | OK\*\* (10sec t/o) | OK\*\* (10sec t/o) |
|
||||||
|
| BlitzWolf BW-PL3 | Low Voltage | OK |
|
||||||
|
| BlitzWolf BW-PL4 | Unknown | Not Working |
|
||||||
|
| BlitzWolf BW-S6 | Unknown | OK |
|
||||||
|
| Charmast 20800 mAh QC 3.0 | Low Voltage\* | Good |
|
||||||
|
| Clas Ohlson Powerbank USB-C 10050 mAh, Clas Ohlson | Unknown | OK\*\* |
|
||||||
|
| [Cygnett 20,000mAh USB-C](https://www.cygnett.com/products/20-000mah-usb-c-power-bank-in-black)| Not Working | Good |
|
||||||
|
| [HAME H13D](https://www.amazon.com/dp/B07GWMFW82) 10000mAh PD/QC3.0 Power Bank | OK\*\* (30sec t/o) | OK\*\* (30sec t/o?) |
|
||||||
|
| HIPER 10000 mAh 18W PD+QC3.0 (MPX10000) | Low Voltage | OK\*\* (30sec t/o) |
|
||||||
|
| [iMuto Portable Charger 30000mAh](https://www.amazon.com/gp/product/B01MXCMGB8/ref=ppx_yo_dt_b_asin_title_o05_s00) | Low Voltage | Good |
|
||||||
|
| ISDT BG-8S | Good | Good |
|
||||||
|
| [iVoler Quick Charge 3.0 USB C 30W 2-Port USB](https://www.amazon.de/dp/B077P8ZZB8/) | Good | Good |
|
||||||
|
| [imuto X6L Pro 30000 mah](https://www.amazon.com/dp/B01MXCMGB8) | Not Working | Bad |
|
||||||
|
| Interstep 10000 mAh 18W PD+QC3.0+FCP+AFC (MPX10000) | Good | OK\*\* (30sec t/o) |
|
||||||
|
| Jackery Black 420 | Low Voltage | Good |
|
||||||
|
| Kogan Premium 80W 5 Port USB Charger| Low Voltage | Good |
|
||||||
|
| Nokia AD-18WE | Unknown | OK |
|
||||||
|
| [Omars 2000mAh USB-C PD+QC3.0 (OMPB20KBUPLT / OMPB20KPLT)](https://www.amazon.com/dp/B07CMLVR6C) | OK\*\* (20sec t/o) | Unknown |
|
||||||
|
| Polaroid PS100 Powerbank (https://polaroid.com/products/ps100) | Good | Good |
|
||||||
|
| Xiaomi 10000mAh Mi Power Bank Pro (PLM03ZM) | Good | Unknown |
|
||||||
|
| Xiaomi 10000mAh Mi Power Bank 2i (PLM09ZM) | Good | Good |
|
||||||
|
| Xiaomi 20000mAh Mi Power Bank 3 (PLM07ZM) | Unknown | Good Type A, Bad Type C |
|
||||||
|
| [ZeroLemon ToughJuice](https://www.amazon.com/dp/B01CZR3LT2/) 30000mAh PD/QC2.0 Power Bank | OK\*\* (20sec t/o) | OK\*\* (20sec t/o?) |
|
||||||
|
| [URUAV XT-60 to USB module](https://www.banggood.com/URUAV-XT-60-to-USB-Charger-Converter-Support-3S-6S-LiPo-Battery-10_5V-32V-Input-3V-20V-Output-45W-Max-Fast-Charging-Adapter-For-RC-Racing-Drone-p-1475876.html) | Unknown | Good |
|
||||||
|
|
||||||
|
|
||||||
|
\* Need further tests on newer firmware
|
||||||
|
|
||||||
|
\*\* Most Power Banks shut down if current draw drops below 50mA, assuming that charging is complete and avoiding overcharging. Custom firmware is designed to avoid this until it enters Zzzz mode.
|
||||||
|
|
||||||
|
|
||||||
|
### DIY QC3.0
|
||||||
|
|
||||||
|
You may also build your own QC3.0 power source that requires this little [thing](https://www.tindie.com/products/soubitos/qualcomm-qc2-3-diy-8-32vin-36-12vout-3a-max/) and have at least 3S lithium packs or any input voltage from 8 to 32V.
|
||||||
|
|
||||||
|
You can also go for an [alternate module](https://www.banggood.com/DC-Buck-Module-12V24V-to-QC3_0-Single-USB-Mobile-Charging-Board-p-1310585.html) which has at least one good review of it.
|
||||||
|
|
||||||
|
**DISCLAIMER:** _**We do not hold any responsibility for accidents that happen when building your own QC3.0 power source!!!**_
|
||||||
|
|
||||||
|
|
||||||
|
## PD
|
||||||
|
|
||||||
|
The following additional table is the list of devices compatible with hardware which requires Power Delivery support (>= 30W). Devices from the list have been successfully tested & used with TS80P in PD mode. Please, keep in mind that:
|
||||||
|
|
||||||
|
- PD can be provided only through usb-c <-> usb-c cable;
|
||||||
|
- not only a charger but a cable itself should be capable to carry higher wattages.
|
||||||
|
|
||||||
|
|
||||||
|
### Compatible Devices (PowerDelivery for TS80P)
|
||||||
|
|
||||||
|
| Device Name | IronOS FW |
|
||||||
|
|-------------|:---------:|
|
||||||
|
| Traver Charger QC09 (45W max)\* | OK |
|
||||||
|
| Xiaomi AD65GEU Mi 65W Fast Charger with GaN Tech (AD65GEU, 65W max) | OK |
|
||||||
|
|
||||||
|
\* Comes as an _option_ for extra price in the package with TS80P from [official store](https://aliexpress.com/item/4000764937427.html) or from [NovelLife store separately](https://aliexpress.com/item/4001316262433.html) on AliExpress.
|
||||||
|
|
||||||
|
Please, DO NOT BUY cheap "fast chargers with QC/PD support" for a few dollars online (i.e., less than ~10$): if you check reviews, then you see that they are phonies - even if you get lucky, you probably get 5V/1A max from them.
|
||||||
32
Documentation/README.md
Normal file
32
Documentation/README.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
<!-- THIS FILE IS AUTOGENERATED by "scripts/deploy.sh docs_readme" based on nav section in scripts/IronOS-mkdocs.yml config -->
|
||||||
|
<!-- THIS FILE IS NOT SUPPOSED TO BE EDITED MANUALLY -->
|
||||||
|
|
||||||
|
#### This is autogenerated README for brief navigation through github over official documentation for IronOS project
|
||||||
|
#### This documentation is also available [here online](https://ralim.github.io/IronOS)
|
||||||
|
|
||||||
|
- [Home](../Documentation/index.md)
|
||||||
|
- [Getting Started](../Documentation/GettingStarted.md)
|
||||||
|
- Flashing the firmware
|
||||||
|
- [MHP30](../Documentation/Flashing/MHP30.md)
|
||||||
|
- [Pinecil V1](../Documentation/Flashing/Pinecil%20V1.md)
|
||||||
|
- [Pinecil V2](../Documentation/Flashing/Pinecil%20V2.md)
|
||||||
|
- [TS80(P)](../Documentation/Flashing/TS80(P).md)
|
||||||
|
- [TS100](../Documentation/Flashing/TS100.md)
|
||||||
|
- Operation
|
||||||
|
- [Main Menu](../Documentation/Menu.md)
|
||||||
|
- [Settings](../Documentation/Settings.md)
|
||||||
|
- [Debug Menu](../Documentation/DebugMenu.md)
|
||||||
|
- [Power](../Documentation/Power.md)
|
||||||
|
- [Temperature](../Documentation/Temperature.md)
|
||||||
|
- [Startup Logo](../Documentation/Logo.md)
|
||||||
|
- Hardware
|
||||||
|
- [Hall Sensor (Pinecil)](../Documentation/HallSensor.md)
|
||||||
|
- [Bluetooth (Pinecil V2)](../Documentation/Bluetooth.md)
|
||||||
|
- [Hardware Notes](../Documentation/Hardware.md)
|
||||||
|
- [Troubleshooting](../Documentation/Troubleshooting.md)
|
||||||
|
- [Known Hardware Issues](../Documentation/HardwareIssues.md)
|
||||||
|
- [Power sources](../Documentation/PowerSources.md)
|
||||||
|
- [Translations](../Documentation/Translation.md)
|
||||||
|
- [Development](../Documentation/Development.md)
|
||||||
|
- [Changelog](../Documentation/History.md)
|
||||||
@@ -14,6 +14,18 @@ But it is helpful to do some basic diagnostics first just in case the issue is e
|
|||||||
The **VAST** majority of issues are poor soldering or cold solder joints.
|
The **VAST** majority of issues are poor soldering or cold solder joints.
|
||||||
If you can open up your iron, give it a good look at all the connection points, and use another iron to reflow any suspicious ones, this can fix most issues.
|
If you can open up your iron, give it a good look at all the connection points, and use another iron to reflow any suspicious ones, this can fix most issues.
|
||||||
|
|
||||||
|
## Tip Shorted warning
|
||||||
|
|
||||||
|
If you are powering up a device that supports tip resistance detection (TS101 and Pinecilv2 as of present), the firmware checks the readings of the raw tip resistance and sorts these into three "bins". `8 ohm tips`, `6.2 ohm tips` and `tip-shorted`. The tip resistance is used when negotiating USB-PD and in thermal calculations.
|
||||||
|
The `tip-shorted` option is selected if your tip is measured to be abnormally small. This could indicate a failed driver mosfet or a failed tip.
|
||||||
|
|
||||||
|
When this warning is shown; heating will be disabled to protect from damage. As trying to heat a shorted tip can damage the iron itself.
|
||||||
|
|
||||||
|
It is best to take out your tip and manually measure and verify the tip's resistance. It should be 6-8 ohms (depending on tip type). When measuring resistances this small some multimeters can struggle. If you have access to a current limited bench power supply, you can try doing a 4 wire measurement by measuring the voltage drop on the tip while applying a known current. `(R=V/I)`.
|
||||||
|
|
||||||
|
If the tip measures correctly you may have a damaged driver mosfet; it would be ideal to open your iron and test the mosfet is operating correctly.
|
||||||
|
If after both of these checks everything looks as expected, feel free to open a discussion on IronOS to talk about the issue (Or for Pinecil the community chat can be a much faster response).
|
||||||
|
|
||||||
## High tip temp reading when the tip is cool
|
## High tip temp reading when the tip is cool
|
||||||
|
|
||||||
If you are finding the tip is reading high; the first fields to check in the Debug menu are `RTip` and `CHan`.
|
If you are finding the tip is reading high; the first fields to check in the Debug menu are `RTip` and `CHan`.
|
||||||
@@ -63,10 +75,23 @@ If the tip does not heat up, it is worth trying to reflash the firmware first in
|
|||||||
The main failure mode of the OLED display module is usually poor soldering on the OLED display cable to the main PCB.
|
The main failure mode of the OLED display module is usually poor soldering on the OLED display cable to the main PCB.
|
||||||
As this is soldered by hand generally, it's the most prone to failures.
|
As this is soldered by hand generally, it's the most prone to failures.
|
||||||
|
|
||||||
If you have a poor connection or a floating pin, you can end up with a state where the screen works _sometimes_ and then freezes or only works on some power cycles. It might work on very old versions of IronOS but not the newest ones. You could try to reflow the pins for the OLED. On 96x16 screens, carefully peel it back from the adhesive and reflow the solder on the pins. If needed, replacement Oled screens are common and low cost.
|
If you have a poor connection or a floating pin, you can end up with a state where the screen works _sometimes_ and then freezes or only works on some power cycles. It might work on very old versions of IronOS but not the newest ones. You could try to reflow the pins for the OLED. On 96x16 screens, carefully peel it back from the adhesive and reflow the solder on the pins.
|
||||||
|
|
||||||
As the OLED runs on an I2C bus, there are pull up resistors on the SDA and SCL pins. It is worth checking these as well, while they don't often fail, issues with these can cause _weird_ display issues.
|
As the OLED runs on an I2C bus, there are pull up resistors on the SDA and SCL pins. It is worth checking these as well, while they don't often fail, issues with these can cause _weird_ display issues.
|
||||||
|
|
||||||
|
If after all of the checks OLED is still blank, or screen works but pixels are barely visible, although soldering iron itself is working (i.e., you can safely check that it's turning on, heating up & melting solder successfully), then it means that _most likely_ OLED is dead. But it can be relatively easily replaced. Models like `TS100`, `TS80`, and `TS80P` share the same OLED screen which can be bought online and used for replacement. To do so:
|
||||||
|
|
||||||
|
- find & buy at electronics shop [of your choice] display with the following spec line:
|
||||||
|
```OLED 0.69 inch / 14 pins / 96 x 16 pixels / **9616TSWC** / I2C IIC```
|
||||||
|
|
||||||
|
- disassemble your soldering iron;
|
||||||
|
- desolder old OLED and solder back new one;
|
||||||
|
- assemble your soldering iron back.
|
||||||
|
|
||||||
|
There are a few youtube videos how to do it like [this one for `TS100`](https://www.youtube.com/watch?v=HlWAY0oYPFI).
|
||||||
|
|
||||||
|
Unfortunately, this is a well-known issue of screens with OLED technology: sooner or later the brightness is starting to _"fade out"_ until complete off. Usually common recommendations to prolong its lifetime are: reduce brightness & reduce too often updates (i.e., disable animations). But your results may vary since there were reports when users couldn't see anything after turning on soldering irons which were just laying in a box for a few months after buying. And there are users with first `TS100` models not having any issues with display at all.
|
||||||
|
|
||||||
## Tip heats when not in heating mode
|
## Tip heats when not in heating mode
|
||||||
|
|
||||||
⚠️ DISCONNECT YOUR TIP ⚠️
|
⚠️ DISCONNECT YOUR TIP ⚠️
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ For soldering irons that are designed to be powered by batteries (TS100 & Pineci
|
|||||||
|
|
||||||
Currently **31** languages are supported. When downloading the firmware for your soldering iron, take note of the language code in the file name.
|
Currently **31** languages are supported. When downloading the firmware for your soldering iron, take note of the language code in the file name.
|
||||||
|
|
||||||
This project is considered feature complete for use as a soldering iron, _so please suggest any feature improvements you would like!_
|
This project is considered stable & feature complete for everyday use with a supported device, _so please suggest any feature improvements you would like!_
|
||||||
|
|
||||||
_This firmware does **NOT** support the USB port while running for changing settings. This is done through the onscreen menu only. Logos are edited on a computer and flashed like firmware._
|
_This firmware does **NOT** support the USB port while running for changing settings. This is done through the onscreen menu only. Logos are edited on a computer and flashed like firmware._
|
||||||
|
|
||||||
@@ -39,6 +39,12 @@ For notes on installation for your device, please refer to the flashing guide fo
|
|||||||
- [TS80 / TS80P](https://ralim.github.io/IronOS/Flashing/TS80%28P%29/)
|
- [TS80 / TS80P](https://ralim.github.io/IronOS/Flashing/TS80%28P%29/)
|
||||||
- [TS100](https://ralim.github.io/IronOS/Flashing/TS100)
|
- [TS100](https://ralim.github.io/IronOS/Flashing/TS100)
|
||||||
|
|
||||||
|
But the _generic_ [TL;DR](https://www.merriam-webster.com/dictionary/TL%3BDR) is to:
|
||||||
|
|
||||||
|
- [download firmware from here](https://github.com/Ralim/IronOS/releases) for the correct model with suitable language support;
|
||||||
|
- put a device into DFU/bootloader mode (usually by keep holding A/+/front button while connecting a device to power source to power device on);
|
||||||
|
- flash the firmware by drag-n-drop the firmware file using a file manager of your OS **or** using a separate flashing tool.
|
||||||
|
|
||||||
## Key Features
|
## Key Features
|
||||||
|
|
||||||
- PID style iron temperature control
|
- PID style iron temperature control
|
||||||
@@ -70,3 +76,25 @@ When on the main screen and having the tip plugged in, the unit shows a pair of
|
|||||||
- Holding down the button near the USB end will show the _[debug menu](https://ralim.github.io/IronOS/DebugMenu/)._ In _soldering mode_ this ends the heating.
|
- Holding down the button near the USB end will show the _[debug menu](https://ralim.github.io/IronOS/DebugMenu/)._ In _soldering mode_ this ends the heating.
|
||||||
|
|
||||||
Operation details are over in the [Menu information.](https://ralim.github.io/IronOS/Menu/)
|
Operation details are over in the [Menu information.](https://ralim.github.io/IronOS/Menu/)
|
||||||
|
|
||||||
|
## Feedback
|
||||||
|
|
||||||
|
If you would like to:
|
||||||
|
|
||||||
|
- report any issue related to IronOS
|
||||||
|
- request a feature
|
||||||
|
- provide some suggestion
|
||||||
|
|
||||||
|
then you can [fill this form](https://github.com/Ralim/IronOS/issues/new/choose) using github account\*.
|
||||||
|
|
||||||
|
And if you would like to:
|
||||||
|
|
||||||
|
- ask more generic question about IronOS/supported hardware/something you're curious about/etc.
|
||||||
|
- reach out community to chat with
|
||||||
|
- share your soldering & DIY skills
|
||||||
|
- share some interesting finding
|
||||||
|
- share useful related hardware/software with others
|
||||||
|
|
||||||
|
or _anything_ like that, then you can use forum-like [Discussions here](https://github.com/Ralim/IronOS/discussions).
|
||||||
|
|
||||||
|
\*: You may need to create it first if you don't have one - it's free of charge.
|
||||||
|
|||||||
3
Env.yml
3
Env.yml
@@ -9,5 +9,4 @@ services:
|
|||||||
dockerfile: scripts/IronOS.Dockerfile
|
dockerfile: scripts/IronOS.Dockerfile
|
||||||
command: /bin/sh
|
command: /bin/sh
|
||||||
volumes:
|
volumes:
|
||||||
- ./scripts/ci:/build/ci:Z
|
- ./:/build/ironos:Z
|
||||||
- ./:/build/source:Z
|
|
||||||
|
|||||||
192
Makefile
192
Makefile
@@ -19,8 +19,6 @@ ifdef DOCKER_COMPOSE
|
|||||||
DOCKER_BIN:=$(DOCKER_COMPOSE)
|
DOCKER_BIN:=$(DOCKER_COMPOSE)
|
||||||
else ifdef DOCKER_TOOL
|
else ifdef DOCKER_TOOL
|
||||||
DOCKER_BIN:=$(DOCKER_TOOL) compose
|
DOCKER_BIN:=$(DOCKER_TOOL) compose
|
||||||
else
|
|
||||||
$(error ERROR: Can't find docker-compose nor docker tool. Please, install docker and try again)
|
|
||||||
endif # DOCKER_* checks
|
endif # DOCKER_* checks
|
||||||
endif # DOCKER_BIN
|
endif # DOCKER_BIN
|
||||||
|
|
||||||
@@ -29,6 +27,14 @@ ifndef MKDOCS
|
|||||||
MKDOCS:=mkdocs
|
MKDOCS:=mkdocs
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# build output related directories
|
||||||
|
ifdef OUT
|
||||||
|
OUT_DIR=$(OUT)
|
||||||
|
else
|
||||||
|
OUT_DIR=$(CURDIR)/BUILDS
|
||||||
|
endif
|
||||||
|
OUT_HEX=$(CURDIR)/source/Hexfile
|
||||||
|
|
||||||
|
|
||||||
### global static variables
|
### global static variables
|
||||||
|
|
||||||
@@ -45,64 +51,91 @@ DOCKER_CMD=$(DOCKER_BIN) -f $(DOCKER_YML) run --rm builder
|
|||||||
# MkDocs config
|
# MkDocs config
|
||||||
MKDOCS_YML=$(CURDIR)/scripts/IronOS-mkdocs.yml
|
MKDOCS_YML=$(CURDIR)/scripts/IronOS-mkdocs.yml
|
||||||
|
|
||||||
|
# supported models
|
||||||
|
MODELS=TS100 TS80 TS80P Pinecil MHP30 Pinecilv2 S60 TS101 # target names & dir names
|
||||||
|
MODELS_ML=Pinecil Pinecilv2 # target names
|
||||||
|
MODELS_MULTILANG=Pinecil_multi-lang Pinecilv2_multi-lang # dir names
|
||||||
|
|
||||||
|
# zip command (to pack artifacts)
|
||||||
|
ZIP=zip -q -j -r
|
||||||
|
|
||||||
|
|
||||||
### targets
|
### targets
|
||||||
|
|
||||||
# default target to show help
|
# default target to show help
|
||||||
help:
|
help:
|
||||||
@echo
|
@echo
|
||||||
@echo "Welcome!\nThis is $(INFO)"
|
@echo "Welcome!"
|
||||||
|
@echo "This is $(INFO)"
|
||||||
@echo "To read more about supported commands (aka \"targets\"), type \"make list\"."
|
@echo "To read more about supported commands (aka \"targets\"), type \"make list\"."
|
||||||
@echo "But if you're impatient then just type \"make docker-build\" - it will:"
|
@echo "But if you're impatient then just type \"make docker-build\" - it will:"
|
||||||
@echo "\t * download, configure & start docker container"
|
@echo " * download, configure & start docker container"
|
||||||
@echo "\t * compile builds of IronOS firmware for all supported models inside that container"
|
@echo " * compile builds of IronOS firmware for all supported models inside that container"
|
||||||
@echo "\t * export generated binaries to \"scripts/ci/artefacts/\" local directory"
|
@echo " * export generated binaries to \"scripts/ci/artefacts/\" local directory"
|
||||||
@echo "Patches are welcome. Happy Hacking!"
|
@echo "Patches are welcome. Happy Hacking!"
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
# target to list supported targets with additional info
|
# target to list supported targets with additional info
|
||||||
list:
|
list:
|
||||||
@echo ""
|
@echo
|
||||||
@echo "Supported top-level targets:"
|
@echo "Supported top-level targets:"
|
||||||
@echo "\t * help - shows short basic help"
|
@echo " * help - shows short basic help"
|
||||||
@echo "\t * list - this output"
|
@echo " * list - this output"
|
||||||
@echo "\t * docker-shell - start docker container with shell inside to work on IronOS with all tools needed"
|
@echo " * docker-shell - start docker container with shell inside to work on IronOS with all tools needed"
|
||||||
@echo "\t * docker-build - compile builds of IronOS for supported models inside docker container and place them to \"scripts/ci/artefacts/\""
|
@echo " * docker-build - compile builds of IronOS for supported models inside docker container and place them to $(OUT_DIR) (set OUT env var to override: OUT=/path/to/dir make ...)"
|
||||||
@echo "\t * docker-clean - delete created docker container (but not pre-downloaded data for it)"
|
@echo " * docker-clean - delete created docker image for IronOS & its build cache objects (to free a lot of space)"
|
||||||
@echo "\t * docs - generate \"site\"/ directory with documentation in a form of static html files using ReadTheDocs framework and $(MKDOCS_YML) local config file"
|
@echo " * docker-clean-cache - delete build cache objects of IronOS docker image EXCEPT the image itself"
|
||||||
@echo "\t * docs-deploy - generate & deploy docs online to gh-pages branch of current github repo"
|
@echo " * docker-clean-image - delete docker image for IronOS EXCEPT its build cache objects"
|
||||||
@echo "\t * clean-full - delete files & directories generated by all the targets above "
|
@echo " * docs - generate \"site\"/ directory with documentation in a form of static html files using ReadTheDocs framework and $(MKDOCS_YML) local config file"
|
||||||
|
@echo " * docs-deploy - generate & deploy docs online to gh-pages branch of current github repo"
|
||||||
|
@echo " * tests - run set of checks, linters & tests (equivalent of github CI IronOS project settings for push trigger)"
|
||||||
|
@echo " * clean-build - delete generated files & dirs produced during builds EXCEPT docker image & its build cache"
|
||||||
|
@echo " * clean-full - delete generated files & dirs produced during builds INCLUDING docker image & its build cache"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "NOTES on supported pass-trough targets:"
|
@echo "NOTES on supported pass-trough targets:"
|
||||||
@echo "\t * main Makefile is located in source/ directory and used to build the firmware itself;"
|
@echo " * main Makefile is located in source/ directory and used to build the firmware itself;"
|
||||||
@echo "\t * this top-level Makefile supports to call targets from source/Makefile;"
|
@echo " * this top-level Makefile supports to call targets from source/Makefile;"
|
||||||
@echo "\t * if you set up development environment right on your host, then to build firmware locally, you can just type right from here:"
|
@echo " * if you set up development environment right on your host, then to build firmware locally, you can just type right from here:"
|
||||||
@echo
|
@echo
|
||||||
@echo "\t> make firmware-LANG_ID model=MODEL_ID"
|
@echo " $$ make firmware-LANG_ID model=MODEL_ID"
|
||||||
@echo
|
@echo
|
||||||
@echo "Full list of current supported IDs:"
|
@echo "Full list of current supported IDs:"
|
||||||
@echo "\t * LANG_ID: BE BG CS DA DE EL EN ES FI FR HR HU IT JA_JP LT NB NL_BE NL PL PT RO RU SK SL SR_CYRL SR_LATN SV TR UK VI YUE_HK ZH_CN ZH_TW"
|
@echo " * LANG_ID: $(shell echo "`ls Translations/ | grep -e "^translation_.*.json$$" | sed -e 's,^translation_,,g; s,\.json$$,,g; ' | tr '\n' ' '`")"
|
||||||
@echo "\t * MODEL_ID: TS100 TS101 TS80 TS80P MHP30 Pinecil Pinecilv2 S60"
|
@echo " * MODEL_ID: $(MODELS)"
|
||||||
@echo
|
@echo
|
||||||
@echo "For example, to make a local build of IronOS firmware for TS100 with English language, just type:"
|
@echo "For example, to make a local build of IronOS firmware for TS100 with English language, just type:"
|
||||||
@echo "\n\t> make firmware-EN model=TS100"
|
@echo
|
||||||
|
@echo " $$ make firmware-EN model=TS100"
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
# bash one-liner to generate langs for "make list":
|
# detect availability of docker
|
||||||
# echo "`ls Translations/ | grep -e "^translation_.*.json$" | sed -e 's,^translation_,,g; s,\.json$,,g; ' | tr '\n' ' '`"
|
docker-check:
|
||||||
|
ifeq ($(DOCKER_BIN),)
|
||||||
|
@echo "ERROR: Can't find docker-compose nor docker tool. Please, install docker and try again"
|
||||||
|
@exit 1
|
||||||
|
else
|
||||||
|
@true
|
||||||
|
endif
|
||||||
|
|
||||||
# former start_dev.sh
|
# former start_dev.sh
|
||||||
docker-shell: $(DOCKER_DEPS)
|
docker-shell: docker-check $(DOCKER_DEPS)
|
||||||
$(DOCKER_CMD)
|
$(DOCKER_CMD)
|
||||||
|
|
||||||
# former build.sh
|
# former build.sh
|
||||||
docker-build: $(DOCKER_DEPS)
|
docker-build: docker-check $(DOCKER_DEPS)
|
||||||
$(DOCKER_CMD) /bin/bash /build/ci/buildAll.sh
|
$(DOCKER_CMD) make build-all
|
||||||
|
|
||||||
# delete container
|
# delete docker image
|
||||||
docker-clean:
|
docker-clean-image:
|
||||||
-docker rmi ironos-builder:latest
|
-docker rmi ironos-builder:latest
|
||||||
|
|
||||||
|
# delete docker build cache objects
|
||||||
|
docker-clean-cache:
|
||||||
|
-docker system prune --filter label=ironos-builder:latest --force
|
||||||
|
|
||||||
|
# delete docker image & cache related to IronOS container
|
||||||
|
docker-clean: docker-clean-image docker-clean-cache
|
||||||
|
|
||||||
# generate docs in site/ directory (DIR for -d is relative to mkdocs.yml file location, hence use default name/location site by setting up ../site)
|
# generate docs in site/ directory (DIR for -d is relative to mkdocs.yml file location, hence use default name/location site by setting up ../site)
|
||||||
docs: $(MKDOCS_YML) Documentation/* Documentation/Flashing/* Documentation/images/*
|
docs: $(MKDOCS_YML) Documentation/* Documentation/Flashing/* Documentation/images/*
|
||||||
$(MKDOCS) build -f $(MKDOCS_YML) -d ../site
|
$(MKDOCS) build -f $(MKDOCS_YML) -d ../site
|
||||||
@@ -111,15 +144,102 @@ docs: $(MKDOCS_YML) Documentation/* Documentation/Flashing/* Documentation/im
|
|||||||
docs-deploy: $(MKDOCS_YML) Documentation/* Documentation/Flashing/* Documentation/images/*
|
docs-deploy: $(MKDOCS_YML) Documentation/* Documentation/Flashing/* Documentation/images/*
|
||||||
$(MKDOCS) gh-deploy -f $(MKDOCS_YML) -d ../site
|
$(MKDOCS) gh-deploy -f $(MKDOCS_YML) -d ../site
|
||||||
|
|
||||||
|
# routine check for autogenerated Documentation/README.md
|
||||||
|
test-md:
|
||||||
|
@echo ""
|
||||||
|
@echo "---- Checking REAMDE.md... ----"
|
||||||
|
@echo ""
|
||||||
|
@/bin/sh ./scripts/deploy.sh docs_readme
|
||||||
|
|
||||||
|
# shell style & linter check (github CI version of shellcheck is more recent than alpine one so the latter may not catch some policies)
|
||||||
|
test-sh:
|
||||||
|
@echo ""
|
||||||
|
@echo "---- Checking shell scripts... ----"
|
||||||
|
@echo ""
|
||||||
|
@for f in `find ./scripts -type f -iname "*.sh" ! -name "flash_ts100_linux.sh"` ; do shellcheck "$${f}"; done;
|
||||||
|
|
||||||
|
# python-related tests & checks
|
||||||
|
test-py:
|
||||||
|
@echo ""
|
||||||
|
@echo "---- Checking python code... ----"
|
||||||
|
@echo ""
|
||||||
|
flake8 Translations
|
||||||
|
black --check Translations
|
||||||
|
@$(MAKE) -C source/ Objects/host/brieflz/libbrieflz.so
|
||||||
|
./Translations/brieflz_test.py
|
||||||
|
./Translations/make_translation_test.py
|
||||||
|
|
||||||
|
# clang-format check for C/C++ code style
|
||||||
|
test-ccpp:
|
||||||
|
@echo ""
|
||||||
|
@echo "---- Checking C/C++ code... ----"
|
||||||
|
@echo ""
|
||||||
|
$(MAKE) -C source/ clean check-style
|
||||||
|
|
||||||
|
# meta target for tests & checks based on .github/workflows/push
|
||||||
|
tests: test-md test-sh test-py test-ccpp
|
||||||
|
@echo ""
|
||||||
|
@echo "All tests & checks have been completed successfully."
|
||||||
|
@echo ""
|
||||||
|
|
||||||
|
# former scripts/ci/buildAll.sh - all in one to build all firmware & place the produced binaries into one output directory
|
||||||
|
build-all:
|
||||||
|
@mkdir -p $(OUT_DIR)
|
||||||
|
@chmod 0777 $(OUT_DIR)
|
||||||
|
cd source && bash ./build.sh
|
||||||
|
@echo "All Firmware built"
|
||||||
|
@for model in $(MODELS); do \
|
||||||
|
mkdir -p $(OUT_DIR)/$${model} ; \
|
||||||
|
cp -r $(OUT_HEX)/$${model}_*.bin $(OUT_DIR)/$${model}/ ; \
|
||||||
|
cp -r $(OUT_HEX)/$${model}_*.hex $(OUT_DIR)/$${model}/ ; \
|
||||||
|
cp -r $(OUT_HEX)/$${model}_*.dfu $(OUT_DIR)/$${model}/ ; \
|
||||||
|
done;
|
||||||
|
@echo "Resulting output directory: $(OUT_DIR)"
|
||||||
|
|
||||||
|
# target to build multilang supported builds for Pinecil & PinecilV2
|
||||||
|
build-multilang:
|
||||||
|
@for modelml in $(MODELS_ML); do \
|
||||||
|
$(MAKE) -C source/ -j2 model=$${modelml} firmware-multi_compressed_European firmware-multi_compressed_Bulgarian+Russian+Serbian+Ukrainian firmware-multi_Chinese+Japanese ; \
|
||||||
|
mkdir -p $(OUT_DIR)/$${modelml}_multi-lang ; \
|
||||||
|
cp $(OUT_HEX)/$${modelml}_multi_*.bin $(OUT_DIR)/$${modelml}_multi-lang ; \
|
||||||
|
cp $(OUT_HEX)/$${modelml}_multi_*.hex $(OUT_DIR)/$${modelml}_multi-lang ; \
|
||||||
|
cp $(OUT_HEX)/$${modelml}_multi_*.dfu $(OUT_DIR)/$${modelml}_multi-lang ; \
|
||||||
|
done;
|
||||||
|
@echo "Resulting output directory: $(OUT_DIR)"
|
||||||
|
|
||||||
|
# target to reproduce zips according to github CI settings; artifacts will be in $(OUT_DIR)/CI/*.zip
|
||||||
|
ci: tests build-all build-multilang
|
||||||
|
@mkdir -p $(OUT_DIR)/metadata;
|
||||||
|
@for m in $(MODELS) $(MODELS_MULTILANG); do \
|
||||||
|
cp LICENSE scripts/LICENSE_RELEASE.md $(OUT_DIR)/$${m}/ ; \
|
||||||
|
$(ZIP) $(OUT_DIR)/$${m}.zip $(OUT_DIR)/$${m} ; \
|
||||||
|
./source/metadata.py $${m}.json $${m}; \
|
||||||
|
cp $(OUT_HEX)/$${m}.json $(OUT_DIR)/metadata; \
|
||||||
|
done;
|
||||||
|
@$(ZIP) $(OUT_DIR)/metadata.zip $(OUT_DIR)/metadata
|
||||||
|
@mkdir -p $(OUT_DIR)/CI
|
||||||
|
@mv $(OUT_DIR)/*.zip $(OUT_DIR)/CI
|
||||||
|
@chmod 0777 $(OUT_DIR)/CI
|
||||||
|
@chmod 0666 $(OUT_DIR)/CI/*.zip
|
||||||
|
@echo "Resulting artifacts directory: $(OUT_DIR)/CI"
|
||||||
|
|
||||||
# pass-through target for Makefile inside source/ dir
|
# pass-through target for Makefile inside source/ dir
|
||||||
%:
|
%:
|
||||||
make -C source/ $@
|
$(MAKE) -C source/ $@
|
||||||
|
|
||||||
|
# global clean-up target for produced/generated files inside tree
|
||||||
|
clean-build:
|
||||||
|
$(MAKE) -C source/ clean-all
|
||||||
|
rm -Rf site
|
||||||
|
rm -Rf $(OUT_DIR)
|
||||||
|
|
||||||
# global clean-up target
|
# global clean-up target
|
||||||
clean-full: docker-clean
|
clean-full: clean-build docker-clean
|
||||||
make -C source/ clean-all
|
|
||||||
rm -Rf site
|
|
||||||
rm -Rf scripts/ci/artefacts
|
|
||||||
|
|
||||||
.PHONY: docker-shell docker-build docker-clean docs clean-full
|
|
||||||
|
|
||||||
|
# phony targets
|
||||||
|
.PHONY: help list
|
||||||
|
.PHONY: docker-check docker-shell docker-build docker-clean-image docker-clean-cache docker-clean
|
||||||
|
.PHONY: docs docs-deploy
|
||||||
|
.PHONY: test-md test-sh test-py test-ccpp tests
|
||||||
|
.PHONY: build-all build-multilang ci
|
||||||
|
.PHONY: clean-build clean-full
|
||||||
|
|||||||
30
README.md
30
README.md
@@ -21,18 +21,28 @@ This project is considered feature complete for use as a soldering iron, _so ple
|
|||||||
|
|
||||||
_This firmware does **NOT** support the USB port while running for changing settings. This is done through the onscreen menu only. Logos are edited on a computer and flashed like firmware._
|
_This firmware does **NOT** support the USB port while running for changing settings. This is done through the onscreen menu only. Logos are edited on a computer and flashed like firmware._
|
||||||
|
|
||||||
| Device | DC | QC | PD | EPR | BLE | Battery | Recommended |
|
| Device | DC | QC | PD | EPR | BLE | Tip Sense | Recommended Purchase | Notes |
|
||||||
| :--------: | :-: | :-: | :-: | :-: | :-: | :-----: | :---------: |
|
| :------------: | :-: | :-: | :-: | :-: | :-: | :-----: | :------------------: | :-------------------------------------------:|
|
||||||
| MHP30 | ❌ | ❌ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
|
| Miniware MHP30 | ❌ | ❌ | ✔️ | ❌ | ❌ | ✔️ | ✔️ | |
|
||||||
| Pinecil V1 | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
|
| Pinecil V1 | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ | ❌ * | |
|
||||||
| Pinecil V2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
|
| Pinecil V2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | |
|
||||||
| TS80P | ❌ | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
|
| Miniware TS101 | ✔️ | ❌ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ | Full OLED resolution not yet supported. |
|
||||||
| TS100 | ✔️ | ❌ | ❌ | ❌ | ❌ | ✔️ | ❌* |
|
| Sequre S60 | ❌ | ❌ | ✔️ | ❌ | ❌ | ❌ | ✔️ | Full OLED resolution not yet supported. |
|
||||||
| TS80 | ❌ | ✔️ | ❌ | ❌ | ❌ | ✔️ | ❌** |
|
| Miniware TS80P | ❌ | ✔️ | ✔️ | ❌ | ❌ | N/A | ✔️ | |
|
||||||
|
| Miniware TS100 | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌** | |
|
||||||
|
| Miniware TS80 | ❌ | ✔️ | ❌ | ❌ | ❌ | N/A | ❌*** | |
|
||||||
|
|
||||||
\*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_**.
|
_Tip Sense_ refers to the device being able to choose between the 'usual' TS100 or Hakko T12 style tips and Pine64's custom shorter tips which have lower resistance and allow for more power. This is N/A for TS80/TS80P as there is only one model of tip for them.
|
||||||
|
|
||||||
\**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_**.
|
_Recommended Purchase_ is only referring to if you are buying a **new** device. Of course all the devices listed are supported and will work excellently for years to come.
|
||||||
|
|
||||||
|
The TS101 and S60 feature a higher resolution OLED than other devices. Work is ongoing to support this fully, for now a cropped view is usable.
|
||||||
|
|
||||||
|
\*PinecilV1 stopped being manufactured a long time ago now, all models for sale online are generally clones (or old stock). Vendors are trying to sell these for more than Pine64 sells the V2 for now. Thus the V1 is **_no longer recommended_**.
|
||||||
|
|
||||||
|
\**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
|
## Getting Started
|
||||||
|
|
||||||
|
|||||||
0
Translations/brieflz.py
Normal file → Executable file
0
Translations/brieflz.py
Normal file → Executable file
0
Translations/brieflz_test.py
Normal file → Executable file
0
Translations/brieflz_test.py
Normal file → Executable file
@@ -1263,6 +1263,63 @@ def get_translation_sanity_checks_text(defs: dict) -> str:
|
|||||||
return sanity_checks_text
|
return sanity_checks_text
|
||||||
|
|
||||||
|
|
||||||
|
def get_version_suffix(ver) -> str:
|
||||||
|
# Check env var from push.yml first:
|
||||||
|
# - if it's pull request then use vX.YY + C.ID for version line as in *C*I with proper tag instead of merge tag for detached tree
|
||||||
|
if os.environ.get("GITHUB_CI_PR_SHA", "") != "":
|
||||||
|
return "C" + "." + os.environ["GITHUB_CI_PR_SHA"][:8].upper()
|
||||||
|
# - no github PR SHA ID, hence keep checking
|
||||||
|
|
||||||
|
suffix = str("")
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Use commands _hoping_ they won't be too new for one environments nor deprecated for another ones:
|
||||||
|
## - get commit id; --short=8 - the shorted hash with 8 digits (increase/decrease if needed!)
|
||||||
|
sha_id = f"{subprocess.check_output(['git', 'rev-parse', '--short=8', 'HEAD']).strip().decode('ascii').upper()}"
|
||||||
|
## - if the exact commit relates to tag, then this command should return one-line tag name:
|
||||||
|
tag = f"{subprocess.check_output(['git', 'tag', '--points-at', '%s' % sha_id]).strip().decode('ascii')}"
|
||||||
|
if (
|
||||||
|
f"{subprocess.check_output(['git', 'rev-parse', '--symbolic-full-name', '--short', 'HEAD']).strip().decode('ascii')}"
|
||||||
|
== "HEAD"
|
||||||
|
):
|
||||||
|
return "E" + "." + sha_id
|
||||||
|
else:
|
||||||
|
## - get short "traditional" branch name (as in `git branch` for that one with asterisk):
|
||||||
|
branch = f"{subprocess.check_output(['git', 'symbolic-ref', '--short', 'HEAD']).strip().decode('ascii')}"
|
||||||
|
if tag and "" != tag:
|
||||||
|
# _Speculate_ on tag that it's Release...
|
||||||
|
if ver == tag:
|
||||||
|
# ... but only if double-check for tag is matched
|
||||||
|
suffix = "R"
|
||||||
|
else:
|
||||||
|
# ... otherwise it's tagged but not a release version!
|
||||||
|
suffix = "T"
|
||||||
|
elif branch and "" != branch:
|
||||||
|
# _Hardcoded_ current main development branch...
|
||||||
|
if "dev" == branch:
|
||||||
|
suffix = "D"
|
||||||
|
# ... or some other branch
|
||||||
|
else:
|
||||||
|
suffix = "B"
|
||||||
|
else:
|
||||||
|
# Something else but from Git
|
||||||
|
suffix = "G"
|
||||||
|
# Attach SHA commit to ID a build since it's from git anyway
|
||||||
|
suffix += "." + sha_id
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
# No git tree so _probably_ Homebrew build from source
|
||||||
|
suffix = "H"
|
||||||
|
except OSError:
|
||||||
|
# Something _special_?
|
||||||
|
suffix = "S"
|
||||||
|
|
||||||
|
if "" == suffix:
|
||||||
|
# Something _very_ special!
|
||||||
|
suffix = "V"
|
||||||
|
|
||||||
|
return suffix
|
||||||
|
|
||||||
|
|
||||||
def read_version() -> str:
|
def read_version() -> str:
|
||||||
with open(HERE.parent / "source" / "version.h") as version_file:
|
with open(HERE.parent / "source" / "version.h") as version_file:
|
||||||
for line in version_file:
|
for line in version_file:
|
||||||
@@ -1270,11 +1327,7 @@ def read_version() -> str:
|
|||||||
matches = re.findall(r"\"(.+?)\"", line)
|
matches = re.findall(r"\"(.+?)\"", line)
|
||||||
if matches:
|
if matches:
|
||||||
version = matches[0]
|
version = matches[0]
|
||||||
try:
|
version += get_version_suffix(version)
|
||||||
version += f".{subprocess.check_output(['git', 'rev-parse', '--short=7', 'HEAD']).strip().decode('ascii').upper()}"
|
|
||||||
# --short=7: the shorted hash with 7 digits. Increase/decrease if needed!
|
|
||||||
except OSError:
|
|
||||||
version += " git"
|
|
||||||
return version
|
return version
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
0
Translations/objcopy.py
Normal file → Executable file
0
Translations/objcopy.py
Normal file → Executable file
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Беларуская",
|
"languageLocalName": "Беларуская",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Каліброўка\nзроблена!"
|
"message": "Каліброўка\nзроблена!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Некантралюемае\nразаграванне"
|
"message": "Некантралюемае\nразаграванне"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Пераканайцеся, што пры наступнай загрузцы наканечнік і ручка маюць пакаёвую тэмпературу!"
|
"message": "Пераканайцеся, што пры наступнай загрузцы наканечнік і ручка маюць пакаёвую тэмпературу!"
|
||||||
},
|
},
|
||||||
@@ -313,4 +316,4 @@
|
|||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,8 +3,8 @@
|
|||||||
"languageLocalName": "Български",
|
"languageLocalName": "Български",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Калибрирането\nе завършено!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
"message": "Нулиране"
|
"message": "Нулиране"
|
||||||
@@ -13,264 +13,267 @@
|
|||||||
"message": "Настройките бяха\nнулирани!"
|
"message": "Настройките бяха\nнулирани!"
|
||||||
},
|
},
|
||||||
"NoAccelerometerMessage": {
|
"NoAccelerometerMessage": {
|
||||||
"message": "No accelerometer\ndetected!"
|
"message": "Не е открит\nакселерометър!"
|
||||||
},
|
},
|
||||||
"NoPowerDeliveryMessage": {
|
"NoPowerDeliveryMessage": {
|
||||||
"message": "No USB-PD IC\ndetected!"
|
"message": "Не е открито\nUSB-PD захранване!"
|
||||||
},
|
},
|
||||||
"LockingKeysString": {
|
"LockingKeysString": {
|
||||||
"message": "LOCKED"
|
"message": "ЗАКЛЮЧ"
|
||||||
},
|
},
|
||||||
"UnlockingKeysString": {
|
"UnlockingKeysString": {
|
||||||
"message": "UNLOCKED"
|
"message": "ОТКЛЮЧ"
|
||||||
},
|
},
|
||||||
"WarningKeysLockedString": {
|
"WarningKeysLockedString": {
|
||||||
"message": "!LOCKED!"
|
"message": "!ЗАКЛЮЧ!"
|
||||||
},
|
},
|
||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Неконтролируемо\nпрегряване"
|
||||||
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!КС на човка!"
|
||||||
},
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Преди рестартиране се уверете, че човка и дръжката са на стайна температурата!"
|
||||||
},
|
},
|
||||||
"CJCCalibrating": {
|
"CJCCalibrating": {
|
||||||
"message": "calibrating\n"
|
"message": "калибриране\n"
|
||||||
},
|
},
|
||||||
"SettingsResetWarning": {
|
"SettingsResetWarning": {
|
||||||
"message": "Сигурни ли сте, че искате да върнете фабричните настройки?"
|
"message": "Сигурни ли сте, че искате да върнете фабричните настройки?"
|
||||||
},
|
},
|
||||||
"UVLOWarningString": {
|
"UVLOWarningString": {
|
||||||
"message": "Ниско DC Напрежение"
|
"message": "НИС.НАПР."
|
||||||
},
|
},
|
||||||
"UndervoltageString": {
|
"UndervoltageString": {
|
||||||
"message": "Ниско Напрежение\n"
|
"message": "Ниско напрежение\n"
|
||||||
},
|
},
|
||||||
"InputVoltageString": {
|
"InputVoltageString": {
|
||||||
"message": "Входно V: \n"
|
"message": "Входно V: \n"
|
||||||
},
|
},
|
||||||
"SleepingSimpleString": {
|
"SleepingSimpleString": {
|
||||||
"message": "Сън"
|
"message": "Хъррр"
|
||||||
},
|
},
|
||||||
"SleepingAdvancedString": {
|
"SleepingAdvancedString": {
|
||||||
"message": "Хър Хър Хър...\n"
|
"message": "Сън...\n"
|
||||||
},
|
},
|
||||||
"SleepingTipAdvancedString": {
|
"SleepingTipAdvancedString": {
|
||||||
"message": "Връх: \n"
|
"message": "Човка:\n"
|
||||||
},
|
},
|
||||||
"OffString": {
|
"OffString": {
|
||||||
"message": "Изкл."
|
"message": "Изкл."
|
||||||
},
|
},
|
||||||
"ProfilePreheatString": {
|
"ProfilePreheatString": {
|
||||||
"message": "Preheat\n"
|
"message": "Загряване\n"
|
||||||
},
|
},
|
||||||
"ProfileCooldownString": {
|
"ProfileCooldownString": {
|
||||||
"message": "Cooldown\n"
|
"message": "Охлаждане\n"
|
||||||
},
|
},
|
||||||
"DeviceFailedValidationWarning": {
|
"DeviceFailedValidationWarning": {
|
||||||
"message": "Your device is most likely a counterfeit!"
|
"message": "Вероятно, устройство е фалшификат!"
|
||||||
},
|
},
|
||||||
"TooHotToStartProfileWarning": {
|
"TooHotToStartProfileWarning": {
|
||||||
"message": "Too hot to\nstart profile"
|
"message": "Твърде горещо за\nстартиране на профила"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"characters": {
|
"characters": {
|
||||||
"SettingRightChar": "R",
|
"SettingRightChar": "Д",
|
||||||
"SettingLeftChar": "L",
|
"SettingLeftChar": "Л",
|
||||||
"SettingAutoChar": "A",
|
"SettingAutoChar": "А",
|
||||||
"SettingOffChar": "O",
|
"SettingOffChar": "И",
|
||||||
"SettingSlowChar": "S",
|
"SettingSlowChar": "Н",
|
||||||
"SettingMediumChar": "M",
|
"SettingMediumChar": "С",
|
||||||
"SettingFastChar": "F",
|
"SettingFastChar": "В",
|
||||||
"SettingStartNoneChar": "И",
|
"SettingStartNoneChar": "И",
|
||||||
"SettingStartSolderingChar": "Р",
|
"SettingStartSolderingChar": "З",
|
||||||
"SettingStartSleepChar": "С",
|
"SettingStartSleepChar": "С",
|
||||||
"SettingStartSleepOffChar": "П",
|
"SettingStartSleepOffChar": "П",
|
||||||
"SettingLockDisableChar": "D",
|
"SettingLockDisableChar": "И",
|
||||||
"SettingLockBoostChar": "B",
|
"SettingLockBoostChar": "Т",
|
||||||
"SettingLockFullChar": "F"
|
"SettingLockFullChar": "П"
|
||||||
},
|
},
|
||||||
"menuGroups": {
|
"menuGroups": {
|
||||||
"PowerMenu": {
|
"PowerMenu": {
|
||||||
"displayText": "Power\nsettings",
|
"displayText": "Настройки на\nзахранването",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"SolderingMenu": {
|
"SolderingMenu": {
|
||||||
"displayText": "Поялник\nНастройки",
|
"displayText": "Настройки на\nзапояване",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"PowerSavingMenu": {
|
"PowerSavingMenu": {
|
||||||
"displayText": "Режими\nНастройки",
|
"displayText": "Авто\nизключване",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"UIMenu": {
|
"UIMenu": {
|
||||||
"displayText": "Интерфейс\nНастройки",
|
"displayText": "Интерфейс\n",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"AdvancedMenu": {
|
"AdvancedMenu": {
|
||||||
"displayText": "Разширени\nНастройки",
|
"displayText": "Допълнителни\nнастройки",
|
||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"menuOptions": {
|
"menuOptions": {
|
||||||
"DCInCutoff": {
|
"DCInCutoff": {
|
||||||
"displayText": "Източник\nзахранване",
|
"displayText": "Гранично\nнапрежение",
|
||||||
"description": "Източник на захранване. Минимално напрежение. (DC 10V) (S 3,3V за клетка)"
|
"description": "Минимално напрежение, за да не се изтощи батерията (DC 10V) (S 3,3V за клетка)"
|
||||||
},
|
},
|
||||||
"MinVolCell": {
|
"MinVolCell": {
|
||||||
"displayText": "Minimum\nvoltage",
|
"displayText": "Мин.\nнапрежение",
|
||||||
"description": "Minimum allowed voltage per battery cell (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
|
"description": "Минимално допустимо напрежение на акумулаторна клетка (3S: 3 - 3,7V | 4-6S: 2,4 - 3,7V)"
|
||||||
},
|
},
|
||||||
"QCMaxVoltage": {
|
"QCMaxVoltage": {
|
||||||
"displayText": "Мощност на\nзахранване",
|
"displayText": "Напреж.\nна QC",
|
||||||
"description": "Мощност на избраното захранване"
|
"description": "Максимална напрежение с QC захранвания"
|
||||||
},
|
},
|
||||||
"PDNegTimeout": {
|
"PDNegTimeout": {
|
||||||
"displayText": "PD\ntimeout",
|
"displayText": "PD\nинтервал",
|
||||||
"description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
|
"description": "PD интервал за договаряне на захранването на стъпки от 100 мс за съвместимост с някои QC захранвания (0=Изкл.)"
|
||||||
},
|
},
|
||||||
"PDVpdo": {
|
"PDVpdo": {
|
||||||
"displayText": "PD\nVPDO",
|
"displayText": "PD\nVPDO",
|
||||||
"description": "Enables PPS & EPR modes"
|
"description": "Включи PPS & EPR"
|
||||||
},
|
},
|
||||||
"BoostTemperature": {
|
"BoostTemperature": {
|
||||||
"displayText": "Турбо\nтемп.",
|
"displayText": "Турбо\nтемп.",
|
||||||
"description": "Температура за \"турбо\" режим"
|
"description": "Температурата за \"турбо\" режим"
|
||||||
},
|
},
|
||||||
"AutoStart": {
|
"AutoStart": {
|
||||||
"displayText": "Автоматичен\nработен режим",
|
"displayText": "Автоматичен\nработен режим",
|
||||||
"description": "Режим на поялника при включване на захранването. (И=Изключен | Р=Работен | С=Сън | П=Сън температура помещение)"
|
"description": "Режим на поялника при включване на захранването (И=Изкл. | З=Запояване | С=Сън | П=Покой на стайна температурата)"
|
||||||
},
|
},
|
||||||
"TempChangeShortStep": {
|
"TempChangeShortStep": {
|
||||||
"displayText": "Промяна T\nбързо?",
|
"displayText": "Промяна T\nбързо",
|
||||||
"description": "Промяна на температура при бързо натискане на бутон!"
|
"description": "Промяна на температурата при бързо натискане на бутон"
|
||||||
},
|
},
|
||||||
"TempChangeLongStep": {
|
"TempChangeLongStep": {
|
||||||
"displayText": "Промяна Т\nзадържане?",
|
"displayText": "Промяна Т\nзадържане",
|
||||||
"description": "Промяна на температура при задържане на бутон!"
|
"description": "Промяна на температурата при задържане на бутон"
|
||||||
},
|
},
|
||||||
"LockingMode": {
|
"LockingMode": {
|
||||||
"displayText": "Allow locking\nbuttons",
|
"displayText": "Бутони за\nзаключване",
|
||||||
"description": "While soldering, hold down both buttons to toggle locking them (D=disable | B=boost mode only | F=full locking)"
|
"description": "Докато запоявате, задръжте двата бутона, за да превключите заключването им (И=Изкл. | Т=Турбо режим | П=Пълно)"
|
||||||
},
|
},
|
||||||
"ProfilePhases": {
|
"ProfilePhases": {
|
||||||
"displayText": "Profile\nPhases",
|
"displayText": "Брой\nетапи",
|
||||||
"description": "Number of phases in profile mode"
|
"description": "Броят на етапите в режим на термичен профил"
|
||||||
},
|
},
|
||||||
"ProfilePreheatTemp": {
|
"ProfilePreheatTemp": {
|
||||||
"displayText": "Preheat\nTemp",
|
"displayText": "Температурата\nна загряване",
|
||||||
"description": "Preheat to this temperature at the start of profile mode"
|
"description": "Температурата на загряване в началото на режим на термичен профил"
|
||||||
},
|
},
|
||||||
"ProfilePreheatSpeed": {
|
"ProfilePreheatSpeed": {
|
||||||
"displayText": "Preheat\nSpeed",
|
"displayText": "Скорост на\nзагряване",
|
||||||
"description": "Preheat at this rate (degrees per second)"
|
"description": "Скорост на предварително загряване (градуси в секунда)"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Temp": {
|
"ProfilePhase1Temp": {
|
||||||
"displayText": "Phase 1\nTemp",
|
"displayText": "Етап 1\nТемпературата",
|
||||||
"description": "Target temperature for the end of this phase"
|
"description": "Температурата в края на този етап"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Duration": {
|
"ProfilePhase1Duration": {
|
||||||
"displayText": "Phase 1\nDuration",
|
"displayText": "Етап 1\nПродължителност",
|
||||||
"description": "Target duration of this phase (seconds)"
|
"description": "Продължителност на този етап (в секунди)"
|
||||||
},
|
},
|
||||||
"ProfilePhase2Temp": {
|
"ProfilePhase2Temp": {
|
||||||
"displayText": "Phase 2\nTemp",
|
"displayText": "Етап 2\nТемпературата",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase2Duration": {
|
"ProfilePhase2Duration": {
|
||||||
"displayText": "Phase 2\nDuration",
|
"displayText": "Етап 2\nПродължителност",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Temp": {
|
"ProfilePhase3Temp": {
|
||||||
"displayText": "Phase 3\nTemp",
|
"displayText": "Етап 3\nТемпературата",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Duration": {
|
"ProfilePhase3Duration": {
|
||||||
"displayText": "Phase 3\nDuration",
|
"displayText": "Етап 3\nПродължителност",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Temp": {
|
"ProfilePhase4Temp": {
|
||||||
"displayText": "Phase 4\nTemp",
|
"displayText": "Етап 4\nТемпературата",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Duration": {
|
"ProfilePhase4Duration": {
|
||||||
"displayText": "Phase 4\nDuration",
|
"displayText": "Етап 4\nПродължителност",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Temp": {
|
"ProfilePhase5Temp": {
|
||||||
"displayText": "Phase 5\nTemp",
|
"displayText": "Етап 5\nТемпературата",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Duration": {
|
"ProfilePhase5Duration": {
|
||||||
"displayText": "Phase 5\nDuration",
|
"displayText": "Етап 5\nПродължителност",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfileCooldownSpeed": {
|
"ProfileCooldownSpeed": {
|
||||||
"displayText": "Cooldown\nSpeed",
|
"displayText": "Скорост на\nохлаждане",
|
||||||
"description": "Cooldown at this rate at the end of profile mode (degrees per second)"
|
"description": "Скорост на охлаждане в края на режим на термичен профил (градуси в секунда)"
|
||||||
},
|
},
|
||||||
"MotionSensitivity": {
|
"MotionSensitivity": {
|
||||||
"displayText": "Усещане\nза движение",
|
"displayText": "Чувствител.\nна движение",
|
||||||
"description": "Усещане за движение (0=Изключено | 1=Слабо | ... | 9=Силно)"
|
"description": "Чувствителност на движение на акселерометър (0=Изкл. | 1=Слабо | ... | 9=Силно)"
|
||||||
},
|
},
|
||||||
"SleepTemperature": {
|
"SleepTemperature": {
|
||||||
"displayText": "Темп.\nсън",
|
"displayText": "Темп.\nсън",
|
||||||
"description": "Температура при режим \"сън\" (C)"
|
"description": "Температурата при режим \"сън\""
|
||||||
},
|
},
|
||||||
"SleepTimeout": {
|
"SleepTimeout": {
|
||||||
"displayText": "Време\nсън",
|
"displayText": "Време\nсън",
|
||||||
"description": "Включване в режим \"сън\" след: (Минути | Секунди)"
|
"description": "Включване в режим \"сън\" (секунди | минути)"
|
||||||
},
|
},
|
||||||
"ShutdownTimeout": {
|
"ShutdownTimeout": {
|
||||||
"displayText": "Време\nизкл.",
|
"displayText": "Време\nизкл.",
|
||||||
"description": "Изключване след (Минути)"
|
"description": "Изключване след (минути)"
|
||||||
},
|
},
|
||||||
"HallEffSensitivity": {
|
"HallEffSensitivity": {
|
||||||
"displayText": "Hall sensor\nsensitivity",
|
"displayText": "Датчик\nна Хол",
|
||||||
"description": "Sensitivity to magnets (0=Изключено | 1=Слабо | ... | 9=Силно)"
|
"description": "Чувствителност на сензора към магнитно поле (0=Изкл. | 1=Слабо | ... | 9=Силно)"
|
||||||
},
|
},
|
||||||
"TemperatureUnit": {
|
"TemperatureUnit": {
|
||||||
"displayText": "Единици за\nтемпература",
|
"displayText": "Единици за\nтемпературата",
|
||||||
"description": "Единици за температура (C=Целзии | F=Фаренхайт)"
|
"description": "Единици за температурата (C=Целзии | F=Фаренхайт)"
|
||||||
},
|
},
|
||||||
"DisplayRotation": {
|
"DisplayRotation": {
|
||||||
"displayText": "Ориентация\nна дисплея",
|
"displayText": "Ориентация\nна дисплея",
|
||||||
"description": "Ориентация на дисплея (R=Дясна Ръка | L=Лява Ръка | A=Автоматично)"
|
"description": "Ориентация на дисплея (Д=Дясна ръка | Л=Лява ръка | А=Авто)"
|
||||||
},
|
},
|
||||||
"CooldownBlink": {
|
"CooldownBlink": {
|
||||||
"displayText": "Мигай при\nтопъл поялник",
|
"displayText": "Мигай при\nтопъл поялник",
|
||||||
"description": "След изключване от работен режим, индикатора за температура да мига докато човката на поялника все още е топла"
|
"description": "След изключване от работен режим, индикатора за температурата да мига докато човката на поялника все още е топла"
|
||||||
},
|
},
|
||||||
"ScrollingSpeed": {
|
"ScrollingSpeed": {
|
||||||
"displayText": "Скорост\nна текста",
|
"displayText": "Скорост\nна текста",
|
||||||
"description": "Скорост на движение на този текст"
|
"description": "Скорост на движение на този текст (Н=Ниска | B=Висока)"
|
||||||
},
|
},
|
||||||
"ReverseButtonTempChange": {
|
"ReverseButtonTempChange": {
|
||||||
"displayText": "Размяна\nбутони +-?",
|
"displayText": "Размяна\nбутони +/-",
|
||||||
"description": "Обръщане на бутоните \"+\" и \"-\" за промяна на температурата на върха на поялника"
|
"description": "Обръщане на бутоните + и - за промяна на температурата на човка на поялника"
|
||||||
},
|
},
|
||||||
"AnimSpeed": {
|
"AnimSpeed": {
|
||||||
"displayText": "Anim.\nspeed",
|
"displayText": "Скорост на\nанимацията",
|
||||||
"description": "Pace of icon animations in menu (O=off | S=slow | M=medium | F=fast)"
|
"description": "Скорост на анимация на иконата в главното меню (И=Изкл. | Н=Ниска | C=Средна | B=Висока)"
|
||||||
},
|
},
|
||||||
"AnimLoop": {
|
"AnimLoop": {
|
||||||
"displayText": "Anim.\nloop",
|
"displayText": "Анимац.\nцикъл",
|
||||||
"description": "Loop icon animations in main menu"
|
"description": "Зациклена анимация на иконите в главното меню"
|
||||||
},
|
},
|
||||||
"Brightness": {
|
"Brightness": {
|
||||||
"displayText": "Screen\nbrightness",
|
"displayText": "Яркост\nна екрана",
|
||||||
"description": "Adjust the OLED screen brightness"
|
"description": "Регулирайте яркостта на екрана"
|
||||||
},
|
},
|
||||||
"ColourInversion": {
|
"ColourInversion": {
|
||||||
"displayText": "Invert\nscreen",
|
"displayText": "Инвертиране\nна екрана",
|
||||||
"description": "Invert the OLED screen colors"
|
"description": "Инверсия на пикселите на екрана"
|
||||||
},
|
},
|
||||||
"LOGOTime": {
|
"LOGOTime": {
|
||||||
"displayText": "Boot logo\nduration",
|
"displayText": "Продължит.\nлогото",
|
||||||
"description": "Set boot logo duration (s=seconds)"
|
"description": "Продължителност на логото за стартиране (в секунди)"
|
||||||
},
|
},
|
||||||
"AdvancedIdle": {
|
"AdvancedIdle": {
|
||||||
"displayText": "Детайлен\nекран в покой",
|
"displayText": "Детайлен\nекран в покой",
|
||||||
"description": "Покажи детайлна информация със ситен шрифт на екрана в режим на покой."
|
"description": "Покажи детайлна информация със ситен шрифт на екрана в режим на покой"
|
||||||
},
|
},
|
||||||
"AdvancedSoldering": {
|
"AdvancedSoldering": {
|
||||||
"displayText": "Детайлен\nработен екран",
|
"displayText": "Детайлен\nработен екран",
|
||||||
@@ -278,34 +281,34 @@
|
|||||||
},
|
},
|
||||||
"BluetoothLE": {
|
"BluetoothLE": {
|
||||||
"displayText": "Bluetooth\n",
|
"displayText": "Bluetooth\n",
|
||||||
"description": "Enables BLE"
|
"description": "Включи BLE"
|
||||||
},
|
},
|
||||||
"PowerLimit": {
|
"PowerLimit": {
|
||||||
"displayText": "Лимит на\nмощност",
|
"displayText": "Лимит на\nмощност",
|
||||||
"description": "Максимална мощност на поялника (Watt)"
|
"description": "Максимална мощност на поялника (вати)"
|
||||||
},
|
},
|
||||||
"CalibrateCJC": {
|
"CalibrateCJC": {
|
||||||
"displayText": "Calibrate CJC\nat next boot",
|
"displayText": "Калибриране\nна темп.",
|
||||||
"description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5 C)"
|
"description": "Калибриране на температурата (CJC) при следващо включване (не се изисква, ако разликата е по-малка от 5 °С)"
|
||||||
},
|
},
|
||||||
"VoltageCalibration": {
|
"VoltageCalibration": {
|
||||||
"displayText": "Калибриране\nнапрежение?",
|
"displayText": "Калибриране\nнапрежение",
|
||||||
"description": "Калибриране на входното напрежение. Задръжте бутонa за изход"
|
"description": "Калибриране на входното напрежение (задръжте бутонa за изход)"
|
||||||
},
|
},
|
||||||
"PowerPulsePower": {
|
"PowerPulsePower": {
|
||||||
"displayText": "Захранващ\nимпулс",
|
"displayText": "Захранващ\nимпулс",
|
||||||
"description": "Поддържане на интензивност на захранващия импулс"
|
"description": "Поддържане на интензивност на захранващия импулс (вати)"
|
||||||
},
|
},
|
||||||
"PowerPulseWait": {
|
"PowerPulseWait": {
|
||||||
"displayText": "Power pulse\ndelay",
|
"displayText": "Закъснение\nна импулса",
|
||||||
"description": "Delay before keep-awake-pulse is triggered (x 2,5с)"
|
"description": "Пауза между импулсите, които предпазват захранването от автоматично изключване (x 2,5 с)"
|
||||||
},
|
},
|
||||||
"PowerPulseDuration": {
|
"PowerPulseDuration": {
|
||||||
"displayText": "Power pulse\nduration",
|
"displayText": "Продължит.\nна импулса",
|
||||||
"description": "Keep-awake-pulse duration (x 250мс)"
|
"description": "Дължината на импулса, който предпазва захранването от автоматично изключване (x 250 мс)"
|
||||||
},
|
},
|
||||||
"SettingsReset": {
|
"SettingsReset": {
|
||||||
"displayText": "Фабрични\nнастройки?",
|
"displayText": "Фабрични\nнастройки",
|
||||||
"description": "Връщане на фабрични настройки"
|
"description": "Връщане на фабрични настройки"
|
||||||
},
|
},
|
||||||
"LanguageSwitch": {
|
"LanguageSwitch": {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Český",
|
"languageLocalName": "Český",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Kalibrace\ndokončena!"
|
"message": "Kalibrace\ndokončena!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Teplotní\nOchrana"
|
"message": "Teplotní\nOchrana"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Zkrat na hrotu!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Před restartem se ujistěte, že hrot a držák mají pokojovou teplotu!"
|
"message": "Před restartem se ujistěte, že hrot a držák mají pokojovou teplotu!"
|
||||||
},
|
},
|
||||||
@@ -61,16 +64,16 @@
|
|||||||
"message": "Vyp"
|
"message": "Vyp"
|
||||||
},
|
},
|
||||||
"ProfilePreheatString": {
|
"ProfilePreheatString": {
|
||||||
"message": "Preheat\n"
|
"message": "Předehřívání\n"
|
||||||
},
|
},
|
||||||
"ProfileCooldownString": {
|
"ProfileCooldownString": {
|
||||||
"message": "Cooldown\n"
|
"message": "Zchlazování\n"
|
||||||
},
|
},
|
||||||
"DeviceFailedValidationWarning": {
|
"DeviceFailedValidationWarning": {
|
||||||
"message": "Vaše zařízení je s nejvyšší pravděpodobností padělek!"
|
"message": "Vaše zařízení je pravěpodobně padělek!"
|
||||||
},
|
},
|
||||||
"TooHotToStartProfileWarning": {
|
"TooHotToStartProfileWarning": {
|
||||||
"message": "Too hot to\nstart profile"
|
"message": "Teplota příliš vysoká pro start profilu"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"characters": {
|
"characters": {
|
||||||
@@ -153,60 +156,60 @@
|
|||||||
"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í)"
|
"description": "Při pájení podržte obě tlačítka pro jejich zamčení (Z=zakázáno | B=pouze v režimu boost | U=úplné zamčení)"
|
||||||
},
|
},
|
||||||
"ProfilePhases": {
|
"ProfilePhases": {
|
||||||
"displayText": "Profile\nPhases",
|
"displayText": "Profilové\nFáze",
|
||||||
"description": "Number of phases in profile mode"
|
"description": "Počet fází v profilovém režimu"
|
||||||
},
|
},
|
||||||
"ProfilePreheatTemp": {
|
"ProfilePreheatTemp": {
|
||||||
"displayText": "Preheat\nTemp",
|
"displayText": "Teplota\nPředehřátí",
|
||||||
"description": "Preheat to this temperature at the start of profile mode"
|
"description": "Teplota na kterou předehřát na začátku profilového režimu"
|
||||||
},
|
},
|
||||||
"ProfilePreheatSpeed": {
|
"ProfilePreheatSpeed": {
|
||||||
"displayText": "Preheat\nSpeed",
|
"displayText": "Rychlost\nPředehřívání",
|
||||||
"description": "Preheat at this rate (degrees per second)"
|
"description": "Rychlost předehřívání (stupně za sekundu)"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Temp": {
|
"ProfilePhase1Temp": {
|
||||||
"displayText": "Phase 1\nTemp",
|
"displayText": "Teplota\nFáze 1",
|
||||||
"description": "Target temperature for the end of this phase"
|
"description": "Cílová teplota na konci této fáze"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Duration": {
|
"ProfilePhase1Duration": {
|
||||||
"displayText": "Phase 1\nDuration",
|
"displayText": "Trvání\nFáze 1",
|
||||||
"description": "Target duration of this phase (seconds)"
|
"description": "Doba trvání této fáze (sekundy)"
|
||||||
},
|
},
|
||||||
"ProfilePhase2Temp": {
|
"ProfilePhase2Temp": {
|
||||||
"displayText": "Phase 2\nTemp",
|
"displayText": "Teplota\nFáze 2",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase2Duration": {
|
"ProfilePhase2Duration": {
|
||||||
"displayText": "Phase 2\nDuration",
|
"displayText": "Trvání\nFáze 2",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Temp": {
|
"ProfilePhase3Temp": {
|
||||||
"displayText": "Phase 3\nTemp",
|
"displayText": "Teplota\nFáze 3",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Duration": {
|
"ProfilePhase3Duration": {
|
||||||
"displayText": "Phase 3\nDuration",
|
"displayText": "Trvání\nFáze 3",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Temp": {
|
"ProfilePhase4Temp": {
|
||||||
"displayText": "Phase 4\nTemp",
|
"displayText": "Teplota\nFáze 4",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Duration": {
|
"ProfilePhase4Duration": {
|
||||||
"displayText": "Phase 4\nDuration",
|
"displayText": "Trvání\nFáze 4",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Temp": {
|
"ProfilePhase5Temp": {
|
||||||
"displayText": "Phase 5\nTemp",
|
"displayText": "Teplota\nFáze 5",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Duration": {
|
"ProfilePhase5Duration": {
|
||||||
"displayText": "Phase 5\nDuration",
|
"displayText": "Trvání\nFáze 5",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfileCooldownSpeed": {
|
"ProfileCooldownSpeed": {
|
||||||
"displayText": "Cooldown\nSpeed",
|
"displayText": "Rychlost\nochlazování",
|
||||||
"description": "Cooldown at this rate at the end of profile mode (degrees per second)"
|
"description": "Rychlost ochlazování na konci profilového režimu (stupně za sekundu)"
|
||||||
},
|
},
|
||||||
"MotionSensitivity": {
|
"MotionSensitivity": {
|
||||||
"displayText": "Citlivost\nna pohyb",
|
"displayText": "Citlivost\nna pohyb",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Dansk",
|
"languageLocalName": "Dansk",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Thermal\nRunaway"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Deutsch",
|
"languageLocalName": "Deutsch",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Erfolgreich\nkalibriert!"
|
"message": "Erfolgreich\nkalibriert!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Thermal\nRunaway"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Lötspitze\nkurzgeschlossen!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Vor dem Neustart bitte sicherstellen, dass Lötspitze & Gerät Raumtemperatur haben!"
|
"message": "Vor dem Neustart bitte sicherstellen, dass Lötspitze & Gerät Raumtemperatur haben!"
|
||||||
},
|
},
|
||||||
@@ -58,7 +61,7 @@
|
|||||||
"message": "Temp: \n"
|
"message": "Temp: \n"
|
||||||
},
|
},
|
||||||
"OffString": {
|
"OffString": {
|
||||||
"message": "Aus"
|
"message": "aus"
|
||||||
},
|
},
|
||||||
"ProfilePreheatString": {
|
"ProfilePreheatString": {
|
||||||
"message": "Vorwärmen\n"
|
"message": "Vorwärmen\n"
|
||||||
@@ -142,15 +145,15 @@
|
|||||||
},
|
},
|
||||||
"TempChangeShortStep": {
|
"TempChangeShortStep": {
|
||||||
"displayText": "Temp-Schritt\nDruck kurz",
|
"displayText": "Temp-Schritt\nDruck kurz",
|
||||||
"description": "Schrittweite für Temperaturwechsel bei kurzem Tastendruck"
|
"description": "Schrittweite für Temperaturänderung bei kurzem Tastendruck"
|
||||||
},
|
},
|
||||||
"TempChangeLongStep": {
|
"TempChangeLongStep": {
|
||||||
"displayText": "Temp-Schritt\nDruck lang",
|
"displayText": "Temp-Schritt\nDruck lang",
|
||||||
"description": "Schrittweite für Temperaturwechsel bei langem Tastendruck"
|
"description": "Schrittweite für Temperaturänderung bei langem Tastendruck"
|
||||||
},
|
},
|
||||||
"LockingMode": {
|
"LockingMode": {
|
||||||
"displayText": "Tasten-\nsperre",
|
"displayText": "Tasten-\nsperre",
|
||||||
"description": "Langes drücken beider Tasten im Lötmodus sperrt diese (A=aus | B=nur Boost | V=vollständig)"
|
"description": "Langes Drücken beider Tasten im Lötmodus sperrt diese (A=aus | B=nur Boost | V=vollständig)"
|
||||||
},
|
},
|
||||||
"ProfilePhases": {
|
"ProfilePhases": {
|
||||||
"displayText": "Profile\nPhasen",
|
"displayText": "Profile\nPhasen",
|
||||||
@@ -170,7 +173,7 @@
|
|||||||
},
|
},
|
||||||
"ProfilePhase1Duration": {
|
"ProfilePhase1Duration": {
|
||||||
"displayText": "Phase 1\nDauer",
|
"displayText": "Phase 1\nDauer",
|
||||||
"description": "Zieldauer dieser Phase (Sekunden)"
|
"description": "Dauer dieser Phase (Sekunden)"
|
||||||
},
|
},
|
||||||
"ProfilePhase2Temp": {
|
"ProfilePhase2Temp": {
|
||||||
"displayText": "Phase 2\nTemperatur",
|
"displayText": "Phase 2\nTemperatur",
|
||||||
@@ -214,7 +217,7 @@
|
|||||||
},
|
},
|
||||||
"SleepTemperature": {
|
"SleepTemperature": {
|
||||||
"displayText": "Ruhe-\ntemperatur",
|
"displayText": "Ruhe-\ntemperatur",
|
||||||
"description": "Ruhetemperatur der Spitze"
|
"description": "Ruhetemperatur der Lötspitze"
|
||||||
},
|
},
|
||||||
"SleepTimeout": {
|
"SleepTimeout": {
|
||||||
"displayText": "Ruhever-\nzögerung",
|
"displayText": "Ruhever-\nzögerung",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Greek",
|
"languageLocalName": "Greek",
|
||||||
"tempUnitFahrenheit": true,
|
"tempUnitFahrenheit": true,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Βαθμονόμηση\nολοκληρώθηκε!"
|
"message": "Βαθμονόμηση\nολοκληρώθηκε!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Θερμική\nΦυγή"
|
"message": "Θερμική\nΦυγή"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Πριν την επανεκκίνηση, βεβαιωθείτε ότι η μύτη και η συσκ. είναι σε θερμ. δωματίου!"
|
"message": "Πριν την επανεκκίνηση, βεβαιωθείτε ότι η μύτη και η συσκ. είναι σε θερμ. δωματίου!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "English",
|
"languageLocalName": "English",
|
||||||
"tempUnitFahrenheit": true,
|
"tempUnitFahrenheit": true,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Thermal\nRunaway"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Castellano",
|
"languageLocalName": "Castellano",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "¡Calibracion\nlista!"
|
"message": "¡Calibracion\nlista!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Térmico\nFuera de control"
|
"message": "Térmico\nFuera de control"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "¡Antes de reiniciar, asegúrese de que la punta y el mango estén a temperatura ambiente!"
|
"message": "¡Antes de reiniciar, asegúrese de que la punta y el mango estén a temperatura ambiente!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Suomi",
|
"languageLocalName": "Suomi",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Thermal\nRunaway"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Français",
|
"languageLocalName": "Français",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Étalonnage\nterminé!"
|
"message": "Étalonnage\nterminé!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Emballement\nthermique"
|
"message": "Emballement\nthermique"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Avant de redémarrer, assurez-vous que la panne et la poignée sont à température ambiante !"
|
"message": "Avant de redémarrer, assurez-vous que la panne et la poignée sont à température ambiante !"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Hrvatski",
|
"languageLocalName": "Hrvatski",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Kalibracija\ndovršena!"
|
"message": "Kalibracija\ndovršena!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Neispravan\ngrijač"
|
"message": "Neispravan\ngrijač"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Prije restarta provjerite da su vrh i ručka na sobnoj temperaturi!"
|
"message": "Prije restarta provjerite da su vrh i ručka na sobnoj temperaturi!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Magyar",
|
"languageLocalName": "Magyar",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Kalibráció\nkész!"
|
"message": "Kalibráció\nkész!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Kontrollálatlan\nhőmérséklet!"
|
"message": "Kontrollálatlan\nhőmérséklet!"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Újraindítás előtt a hegy és az eszköz legyen szobahőmérsékletű!"
|
"message": "Újraindítás előtt a hegy és az eszköz legyen szobahőmérsékletű!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Italiano",
|
"languageLocalName": "Italiano",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibrazione\ncompletata!"
|
"message": "Calibrazione\ncompletata!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Temperatura\nfuori controllo"
|
"message": "Temperatura\nfuori controllo"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "Punta in cortocircuito!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Prima di riavviare assicurati che la punta e l'impugnatura siano a temperatura ambiente!"
|
"message": "Prima di riavviare assicurati che la punta e l'impugnatura siano a temperatura ambiente!"
|
||||||
},
|
},
|
||||||
@@ -162,7 +165,7 @@
|
|||||||
},
|
},
|
||||||
"ProfilePreheatSpeed": {
|
"ProfilePreheatSpeed": {
|
||||||
"displayText": "Velocità\npreriscaldamento",
|
"displayText": "Velocità\npreriscaldamento",
|
||||||
"description": "Imposta la velocità di preriscaldamento [gradi al secondo]"
|
"description": "Imposta la velocità di preriscaldamento [°C/s]"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Temp": {
|
"ProfilePhase1Temp": {
|
||||||
"displayText": "Temperatura\nfase 1",
|
"displayText": "Temperatura\nfase 1",
|
||||||
@@ -206,7 +209,7 @@
|
|||||||
},
|
},
|
||||||
"ProfileCooldownSpeed": {
|
"ProfileCooldownSpeed": {
|
||||||
"displayText": "Velocità\nraffreddamento",
|
"displayText": "Velocità\nraffreddamento",
|
||||||
"description": "Imposta la velocità di raffreddamento al termine del profilo di riscaldamento [gradi al secondo]"
|
"description": "Imposta la velocità di raffreddamento al termine del profilo di riscaldamento [°C/s]"
|
||||||
},
|
},
|
||||||
"MotionSensitivity": {
|
"MotionSensitivity": {
|
||||||
"displayText": "Sensibilità\nal movimento",
|
"displayText": "Sensibilità\nal movimento",
|
||||||
|
|||||||
5
Translations/translation_JA_JP.json
Executable file → Normal file
5
Translations/translation_JA_JP.json
Executable file → Normal file
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "日本語",
|
"languageLocalName": "日本語",
|
||||||
"tempUnitFahrenheit": true,
|
"tempUnitFahrenheit": true,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration done!"
|
"message": "Calibration done!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "過熱"
|
"message": "過熱"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Lietuvių",
|
"languageLocalName": "Lietuvių",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Perkaitimo\npavojus"
|
"message": "Perkaitimo\npavojus"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Norsk bokmål",
|
"languageLocalName": "Norsk bokmål",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Termisk\nrømling"
|
"message": "Termisk\nrømling"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Nederlands",
|
"languageLocalName": "Nederlands",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Verwarming\nOncontroleerbaar"
|
"message": "Verwarming\nOncontroleerbaar"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Vlaams",
|
"languageLocalName": "Vlaams",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Thermal\nRunaway"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Polski",
|
"languageLocalName": "Polski",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Kalibracja\nwykonana!"
|
"message": "Kalibracja\nwykonana!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Ucieczka\ntermiczna"
|
"message": "Ucieczka\ntermiczna"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Upewnij się, że końcówka i uchwyt mają temperaturę pokojową podczas następnego rozruchu!"
|
"message": "Upewnij się, że końcówka i uchwyt mają temperaturę pokojową podczas następnego rozruchu!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Português",
|
"languageLocalName": "Português",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibração\nefetuada!"
|
"message": "Calibração\nefetuada!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Thermal\nRunaway"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Antes de reiniciar certifique-se que o ferro está à temperatura ambiente!"
|
"message": "Antes de reiniciar certifique-se que o ferro está à temperatura ambiente!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Română",
|
"languageLocalName": "Română",
|
||||||
"tempUnitFahrenheit": true,
|
"tempUnitFahrenheit": true,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Încălzire\nEşuată"
|
"message": "Încălzire\nEşuată"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Înainte de repornire, asiguraţi-vă că vârful şi mânerul sunt la temperatura camerei!"
|
"message": "Înainte de repornire, asiguraţi-vă că vârful şi mânerul sunt la temperatura camerei!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,20 +3,20 @@
|
|||||||
"languageLocalName": "Русский",
|
"languageLocalName": "Русский",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Калибровка\nзавершена!"
|
"message": "Калибровка\nзавершена!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
"message": "Сброс OK"
|
"message": "Готово!"
|
||||||
},
|
},
|
||||||
"SettingsResetMessage": {
|
"SettingsResetMessage": {
|
||||||
"message": "Настройки\nсброшены!"
|
"message": "Настройки\nсброшены!"
|
||||||
},
|
},
|
||||||
"NoAccelerometerMessage": {
|
"NoAccelerometerMessage": {
|
||||||
"message": "Не определен\nакселерометр!"
|
"message": "Акселерометр\nне обнаружен!"
|
||||||
},
|
},
|
||||||
"NoPowerDeliveryMessage": {
|
"NoPowerDeliveryMessage": {
|
||||||
"message": "USB-PD питание\nне обнаружено"
|
"message": "Питание по USB-PD\nне обнаружено"
|
||||||
},
|
},
|
||||||
"LockingKeysString": {
|
"LockingKeysString": {
|
||||||
"message": "ЗАБЛОК"
|
"message": "ЗАБЛОК"
|
||||||
@@ -28,7 +28,10 @@
|
|||||||
"message": "!ЗАБЛОК!"
|
"message": "!ЗАБЛОК!"
|
||||||
},
|
},
|
||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Неуправляемый\nРазогрев"
|
"message": "Неуправляемый\nразогрев"
|
||||||
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!КЗ на жале!"
|
||||||
},
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Пожалуйста, убедитесь, что жало и корпус имеют комнатную температуру при следующей загрузке!"
|
"message": "Пожалуйста, убедитесь, что жало и корпус имеют комнатную температуру при следующей загрузке!"
|
||||||
@@ -40,25 +43,25 @@
|
|||||||
"message": "Вы уверены, что хотите сбросить настройки к значениям по умолчанию?"
|
"message": "Вы уверены, что хотите сбросить настройки к значениям по умолчанию?"
|
||||||
},
|
},
|
||||||
"UVLOWarningString": {
|
"UVLOWarningString": {
|
||||||
"message": "НАПРЯЖ--"
|
"message": "НИЗ.НАПР"
|
||||||
},
|
},
|
||||||
"UndervoltageString": {
|
"UndervoltageString": {
|
||||||
"message": "Низ. напряжение\n"
|
"message": "Низ. напряжение\n"
|
||||||
},
|
},
|
||||||
"InputVoltageString": {
|
"InputVoltageString": {
|
||||||
"message": "Питание В: \n"
|
"message": "Питание(В):\n"
|
||||||
},
|
},
|
||||||
"SleepingSimpleString": {
|
"SleepingSimpleString": {
|
||||||
"message": "Zzzz"
|
"message": "Хххррп"
|
||||||
},
|
},
|
||||||
"SleepingAdvancedString": {
|
"SleepingAdvancedString": {
|
||||||
"message": "Ожидание...\n"
|
"message": "Сон...\n"
|
||||||
},
|
},
|
||||||
"SleepingTipAdvancedString": {
|
"SleepingTipAdvancedString": {
|
||||||
"message": "Жало: \n"
|
"message": "Жало: \n"
|
||||||
},
|
},
|
||||||
"OffString": {
|
"OffString": {
|
||||||
"message": "Вык"
|
"message": "Выкл"
|
||||||
},
|
},
|
||||||
"ProfilePreheatString": {
|
"ProfilePreheatString": {
|
||||||
"message": "Преднагрев\n"
|
"message": "Преднагрев\n"
|
||||||
@@ -67,7 +70,7 @@
|
|||||||
"message": "Остывание\n"
|
"message": "Остывание\n"
|
||||||
},
|
},
|
||||||
"DeviceFailedValidationWarning": {
|
"DeviceFailedValidationWarning": {
|
||||||
"message": "Вероятно, это устройство подделка!"
|
"message": "Вероятно, это поддельное устройство!"
|
||||||
},
|
},
|
||||||
"TooHotToStartProfileWarning": {
|
"TooHotToStartProfileWarning": {
|
||||||
"message": "Слишком горячо для\nстарта профиля"
|
"message": "Слишком горячо для\nстарта профиля"
|
||||||
@@ -81,9 +84,9 @@
|
|||||||
"SettingSlowChar": "М",
|
"SettingSlowChar": "М",
|
||||||
"SettingMediumChar": "С",
|
"SettingMediumChar": "С",
|
||||||
"SettingFastChar": "Б",
|
"SettingFastChar": "Б",
|
||||||
"SettingStartNoneChar": "В",
|
"SettingStartNoneChar": "О",
|
||||||
"SettingStartSolderingChar": "П",
|
"SettingStartSolderingChar": "П",
|
||||||
"SettingStartSleepChar": "О",
|
"SettingStartSleepChar": "С",
|
||||||
"SettingStartSleepOffChar": "К",
|
"SettingStartSleepOffChar": "К",
|
||||||
"SettingLockDisableChar": "О",
|
"SettingLockDisableChar": "О",
|
||||||
"SettingLockBoostChar": "Т",
|
"SettingLockBoostChar": "Т",
|
||||||
@@ -91,166 +94,166 @@
|
|||||||
},
|
},
|
||||||
"menuGroups": {
|
"menuGroups": {
|
||||||
"PowerMenu": {
|
"PowerMenu": {
|
||||||
"displayText": "Параметры\nпитания",
|
"displayText": "Настройки\nпитания",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"SolderingMenu": {
|
"SolderingMenu": {
|
||||||
"displayText": "Параметры\nпайки",
|
"displayText": "Настройки\nпайки",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"PowerSavingMenu": {
|
"PowerSavingMenu": {
|
||||||
"displayText": "Режимы\nсна",
|
"displayText": "Авто\nвыключение",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"UIMenu": {
|
"UIMenu": {
|
||||||
"displayText": "Параметры\nинтерфейса",
|
"displayText": "Интерфейс\n",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"AdvancedMenu": {
|
"AdvancedMenu": {
|
||||||
"displayText": "Дополнител.\nнастройки",
|
"displayText": "Доп.\nнастройки",
|
||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"menuOptions": {
|
"menuOptions": {
|
||||||
"DCInCutoff": {
|
"DCInCutoff": {
|
||||||
"displayText": "Источник\nпитания",
|
"displayText": "Предельное\nнапряжение",
|
||||||
"description": "Источник питания. Устанавливает напряжение отсечки. (DC 10В) (S 3,3В на ячейку, без лимита мощности)"
|
"description": "Установка минимально предельного напряжения от аккумулятора для предотвращения глубокого разряда (DC 10В | S 3,3В на ячейку, без ограничения мощности)"
|
||||||
},
|
},
|
||||||
"MinVolCell": {
|
"MinVolCell": {
|
||||||
"displayText": "Мин.\nнапр.",
|
"displayText": "Мин.\nнапряжение",
|
||||||
"description": "Минимальное разрешенное напряжение на ячейку (3S: 3 - 3,7V | 4S-6S: 2,4 - 3,7V)"
|
"description": "Минимально разрешённое напряжение на ячейку (3S: 3 - 3,7В | 4S-6S: 2,4 - 3,7В)"
|
||||||
},
|
},
|
||||||
"QCMaxVoltage": {
|
"QCMaxVoltage": {
|
||||||
"displayText": "Ограничение\nнапряжения QC",
|
"displayText": "Напр-е\nдля QC",
|
||||||
"description": "Максимальное напряжение для согласования с QC источником питания"
|
"description": "Максимальное напряжение для согласования с источником питания по QC"
|
||||||
},
|
},
|
||||||
"PDNegTimeout": {
|
"PDNegTimeout": {
|
||||||
"displayText": "PD\nтайм-аут",
|
"displayText": "PD\nинтервал",
|
||||||
"description": "Power Delivery тайм-аут согласования с шагом 100 мс для совместимости с некоторыми быстрыми зарядными QC (0: отключено)"
|
"description": "Интервал согласования питания по Power Delivery с шагом 100 мс для совместимости с некоторыми источниками питания по QC (0=Откл.)"
|
||||||
},
|
},
|
||||||
"PDVpdo": {
|
"PDVpdo": {
|
||||||
"displayText": "PD\nVPDO",
|
"displayText": "PD\nVPDO",
|
||||||
"description": "Включает режимы PPS & EPR."
|
"description": "Включить режимы PPS & EPR"
|
||||||
},
|
},
|
||||||
"BoostTemperature": {
|
"BoostTemperature": {
|
||||||
"displayText": "t° турбо\nрежима",
|
"displayText": "t° турбо\nрежима",
|
||||||
"description": "Температура жала в турбо-режиме"
|
"description": "Температура жала в турбо-режиме"
|
||||||
},
|
},
|
||||||
"AutoStart": {
|
"AutoStart": {
|
||||||
"displayText": "Авто\nстарт",
|
"displayText": "Режим при\nвключении",
|
||||||
"description": "Режим, в котором запускается паяльник при подаче питания (В=Выкл. | П=Пайка | О=Ожидание | К=Ожидание при комн. темп.)"
|
"description": "Режим, в котором включается паяльник (О=Откл. | П=Пайка | С=Сон | К=Ожидание при комн. темп.)"
|
||||||
},
|
},
|
||||||
"TempChangeShortStep": {
|
"TempChangeShortStep": {
|
||||||
"displayText": "Шаг темп.\nкор. наж.",
|
"displayText": "Шаг t° при\nкор.наж-ии",
|
||||||
"description": "Шаг изменения температуры при коротком нажатии кнопок"
|
"description": "Шаг изменения температуры при коротком нажатии кнопок"
|
||||||
},
|
},
|
||||||
"TempChangeLongStep": {
|
"TempChangeLongStep": {
|
||||||
"displayText": "Шаг темп.\nдлин. наж.",
|
"displayText": "Шаг t° при\nдол.наж-ии",
|
||||||
"description": "Шаг изменения температуры при длинном нажатии кнопок"
|
"description": "Шаг изменения температуры при долгом нажатии кнопок"
|
||||||
},
|
},
|
||||||
"LockingMode": {
|
"LockingMode": {
|
||||||
"displayText": "Разрешить\nблок. кнопок",
|
"displayText": "Разрешить\nблок. кнопок",
|
||||||
"description": "При работе длинное нажатие обеих кнопок блокирует их (О=Отключено | Т=Только турбо | П=Полная блокировка)"
|
"description": "Блокировать кнопки при их долгом нажатии в режиме пайки (О=Откл. | Т=Только турбо | П=Полная блокировка)"
|
||||||
},
|
},
|
||||||
"ProfilePhases": {
|
"ProfilePhases": {
|
||||||
"displayText": "Профиль\nЭтапы",
|
"displayText": "Этапы\nпрофиля",
|
||||||
"description": "Количество этапов в режиме профиля"
|
"description": "Количество этапов в режиме профиля"
|
||||||
},
|
},
|
||||||
"ProfilePreheatTemp": {
|
"ProfilePreheatTemp": {
|
||||||
"displayText": "Преднагрев\nТемпература",
|
"displayText": "Температура\nпреднагрева",
|
||||||
"description": "Разогреть до этой температуры в начале режима профиля"
|
"description": "Температура предварительного нагрева в начале режима термопрофиля"
|
||||||
},
|
},
|
||||||
"ProfilePreheatSpeed": {
|
"ProfilePreheatSpeed": {
|
||||||
"displayText": "Преднагрев\nСкорость",
|
"displayText": "Скорость\nпреднагрева",
|
||||||
"description": "Предварительный нагрев с этой скоростью (градусов в секунду)"
|
"description": "Скорость предварительного нагрева в начале режима термопрофиля (в градусах в секунду)"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Temp": {
|
"ProfilePhase1Temp": {
|
||||||
"displayText": "Этап 1\nТемпература",
|
"displayText": "Температура\n1-го этапа",
|
||||||
"description": "Целевая температура в конце этого эатпа"
|
"description": "Необходимая температура в конце 1-го этапа"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Duration": {
|
"ProfilePhase1Duration": {
|
||||||
"displayText": "Этап 1\nДлительность",
|
"displayText": "Длительность\n1-го этапа",
|
||||||
"description": "Целевая длительность этого этапа (секунды)"
|
"description": "Необходимая длительность 1-го этапа (в секундах)"
|
||||||
},
|
},
|
||||||
"ProfilePhase2Temp": {
|
"ProfilePhase2Temp": {
|
||||||
"displayText": "Этап 2\nТемпература",
|
"displayText": "Температура\n2-го этапа",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase2Duration": {
|
"ProfilePhase2Duration": {
|
||||||
"displayText": "Этап 2\nДлительность",
|
"displayText": "Длительность\n2-го этапа",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Temp": {
|
"ProfilePhase3Temp": {
|
||||||
"displayText": "Этап 3\nТемпература",
|
"displayText": "Температура\n3-го этапа",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Duration": {
|
"ProfilePhase3Duration": {
|
||||||
"displayText": "Этап 3\nДлительность",
|
"displayText": "Длительность\n3-го этапа",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Temp": {
|
"ProfilePhase4Temp": {
|
||||||
"displayText": "Этап 4\nТемпература",
|
"displayText": "Температура\n4-го этапа",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Duration": {
|
"ProfilePhase4Duration": {
|
||||||
"displayText": "Этап 4\nДлительность",
|
"displayText": "Длительность\n4-го этапа",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Temp": {
|
"ProfilePhase5Temp": {
|
||||||
"displayText": "Этап 5\nТемпература",
|
"displayText": "Температура\n5-го этапа",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Duration": {
|
"ProfilePhase5Duration": {
|
||||||
"displayText": "Этап 5\nДлительность",
|
"displayText": "Длительность\n5-го этапа",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfileCooldownSpeed": {
|
"ProfileCooldownSpeed": {
|
||||||
"displayText": "Остывание\nСкорость",
|
"displayText": "Скорость\nостывания",
|
||||||
"description": "Остывать с такой скоростью в конце режима профиля (градусов в секунду)"
|
"description": "Скорость остывания в конце режима термопрофиля (в градусах в секунду)"
|
||||||
},
|
},
|
||||||
"MotionSensitivity": {
|
"MotionSensitivity": {
|
||||||
"displayText": "Чувствительн.\nакселерометра",
|
"displayText": "Чувствительн.\nакселерометра",
|
||||||
"description": "Чувствительность акселерометра (0=Выкл. | 1=мин. | ... | 9=макс.)"
|
"description": "Чувствительность акселерометра (0=Откл. | 1=мин. | ... | 9=макс.)"
|
||||||
},
|
},
|
||||||
"SleepTemperature": {
|
"SleepTemperature": {
|
||||||
"displayText": "Темп.\nожидания",
|
"displayText": "t° при\nсне",
|
||||||
"description": "Температура жала в режиме ожидания"
|
"description": "Температура жала в режиме сна"
|
||||||
},
|
},
|
||||||
"SleepTimeout": {
|
"SleepTimeout": {
|
||||||
"displayText": "Таймаут\nожидания",
|
"displayText": "Интервал\nсна",
|
||||||
"description": "Время до перехода в режим ожидания (Минуты | Секунды)"
|
"description": "Время до перехода в режим сна (секунды | минуты)"
|
||||||
},
|
},
|
||||||
"ShutdownTimeout": {
|
"ShutdownTimeout": {
|
||||||
"displayText": "Таймаут\nвыключения",
|
"displayText": "Интервал\nотключ-я",
|
||||||
"description": "Время до выключения паяльника (минуты)"
|
"description": "Время до выключения паяльника (в минутах)"
|
||||||
},
|
},
|
||||||
"HallEffSensitivity": {
|
"HallEffSensitivity": {
|
||||||
"displayText": "Датчик\nХолла",
|
"displayText": "Датчик\nХолла",
|
||||||
"description": "Чувствительность датчика Холла к переходу в спящий режим (0=Выкл. | 1=мин. | ... | 9=макс.)"
|
"description": "Чувствительность датчика Холла к магнитному полю (0=Откл. | 1=мин. | ... | 9=макс.)"
|
||||||
},
|
},
|
||||||
"TemperatureUnit": {
|
"TemperatureUnit": {
|
||||||
"displayText": "Единицы\nтемпературы",
|
"displayText": "Единицы\nизмерения",
|
||||||
"description": "Единицы измерения температуры (C=°Цельcия | F=°Фаренгейта)"
|
"description": "Единицы измерения температуры (C=°Цельcия | F=°Фаренгейта)"
|
||||||
},
|
},
|
||||||
"DisplayRotation": {
|
"DisplayRotation": {
|
||||||
"displayText": "Ориентация\nэкрана",
|
"displayText": "Поворот\nэкрана",
|
||||||
"description": "Ориентация экрана (П=Правая рука | Л=Левая рука | А=Авто)"
|
"description": "Поворот экрана (П=Правша | Л=Левша | А=Авто)"
|
||||||
},
|
},
|
||||||
"CooldownBlink": {
|
"CooldownBlink": {
|
||||||
"displayText": "Мигание t°\nпри остывании",
|
"displayText": "Мигание t°\nпри остывании",
|
||||||
"description": "Мигать температурой на экране охлаждения, пока жало еще горячее"
|
"description": "Мигать температурой на экране при остывании, пока жало ещё горячее"
|
||||||
},
|
},
|
||||||
"ScrollingSpeed": {
|
"ScrollingSpeed": {
|
||||||
"displayText": "Скорость\nтекста",
|
"displayText": "Скорость\nтекста",
|
||||||
"description": "Скорость прокрутки текста (М=Медленная | Б=Быстрая)"
|
"description": "Скорость прокрутки текста (М=Медленная | Б=Быстрая)"
|
||||||
},
|
},
|
||||||
"ReverseButtonTempChange": {
|
"ReverseButtonTempChange": {
|
||||||
"displayText": "Поменять\nкнопки+-",
|
"displayText": "Поменять\nкнопки +/-",
|
||||||
"description": "Поменять кнопки изменения температуры"
|
"description": "Поменять кнопки изменения температуры"
|
||||||
},
|
},
|
||||||
"AnimSpeed": {
|
"AnimSpeed": {
|
||||||
"displayText": "Скорость\nанимации",
|
"displayText": "Скорость\nанимации",
|
||||||
"description": "Скорость анимации иконок в главном меню (О=Отключено | М=Медленная| С=Средняя | Б=Быстрая)"
|
"description": "Скорость анимации иконок в главном меню (О=Откл. | М=Медленная| С=Средняя | Б=Быстрая)"
|
||||||
},
|
},
|
||||||
"AnimLoop": {
|
"AnimLoop": {
|
||||||
"displayText": "Зацикленная\nанимация",
|
"displayText": "Зацикленная\nанимация",
|
||||||
@@ -258,31 +261,31 @@
|
|||||||
},
|
},
|
||||||
"Brightness": {
|
"Brightness": {
|
||||||
"displayText": "Яркость\nэкрана",
|
"displayText": "Яркость\nэкрана",
|
||||||
"description": "Настройки контраста/яркости OLED экрана"
|
"description": "Уровень яркости пикселей на экране"
|
||||||
},
|
},
|
||||||
"ColourInversion": {
|
"ColourInversion": {
|
||||||
"displayText": "Инверсия\nэкрана",
|
"displayText": "Инверсия\nэкрана",
|
||||||
"description": "Инвертировать цвета на OLED экране"
|
"description": "Инвертировать пиксели на экране"
|
||||||
},
|
},
|
||||||
"LOGOTime": {
|
"LOGOTime": {
|
||||||
"displayText": "Длительность\nпоказа логотипа",
|
"displayText": "Длит-ть\nлоготипа",
|
||||||
"description": "Длительность отображения логотипа (в секундах)"
|
"description": "Длительность отображения логотипа (в секундах)"
|
||||||
},
|
},
|
||||||
"AdvancedIdle": {
|
"AdvancedIdle": {
|
||||||
"displayText": "Подробный\nреж. ожидания",
|
"displayText": "Подробный\nэкран ожидания",
|
||||||
"description": "Отображать детальную информацию уменьшенным шрифтом на экране ожидания"
|
"description": "Показывать дополнительную информацию на экране ожидания уменьшенным шрифтом"
|
||||||
},
|
},
|
||||||
"AdvancedSoldering": {
|
"AdvancedSoldering": {
|
||||||
"displayText": "Подробный\nэкран пайки",
|
"displayText": "Подробный\nэкран пайки",
|
||||||
"description": "Показывать детальную информацию на экране пайки"
|
"description": "Показывать дополнительную информацию на экране пайки уменьшенным шрифтом"
|
||||||
},
|
},
|
||||||
"BluetoothLE": {
|
"BluetoothLE": {
|
||||||
"displayText": "Bluetooth\n",
|
"displayText": "Bluetooth\n",
|
||||||
"description": "Активирует BLE"
|
"description": "Включить BLE"
|
||||||
},
|
},
|
||||||
"PowerLimit": {
|
"PowerLimit": {
|
||||||
"displayText": "Предел\nмощности",
|
"displayText": "Предел\nмощ-ти",
|
||||||
"description": "Максимальная мощность, которую может использовать паяльник (Ватт)"
|
"description": "Максимальная мощность, которую может использовать паяльник (в ваттах)"
|
||||||
},
|
},
|
||||||
"CalibrateCJC": {
|
"CalibrateCJC": {
|
||||||
"displayText": "Калибровка\nтемпературы",
|
"displayText": "Калибровка\nтемпературы",
|
||||||
@@ -293,20 +296,20 @@
|
|||||||
"description": "Калибровка входного напряжения (долгое нажатие для выхода)"
|
"description": "Калибровка входного напряжения (долгое нажатие для выхода)"
|
||||||
},
|
},
|
||||||
"PowerPulsePower": {
|
"PowerPulsePower": {
|
||||||
"displayText": "Сила имп.\nпитания Вт",
|
"displayText": "Сила имп.\nпитания",
|
||||||
"description": "Сила импульса удерживающего от сна повербанк или другой источник питания"
|
"description": "Сила импульса, удерживающего от автовыключения источник питания (в ваттах)"
|
||||||
},
|
},
|
||||||
"PowerPulseWait": {
|
"PowerPulseWait": {
|
||||||
"displayText": "Пауза имп.\nпитания с",
|
"displayText": "Пауза имп.\nпитания (К)",
|
||||||
"description": "Пауза между импульсами удерживающими источник питания от сна (x 2,5с)"
|
"description": "Коэффициент паузы между импульсами, удерживающими от автовыключения источник питания (К x 2,5 с)"
|
||||||
},
|
},
|
||||||
"PowerPulseDuration": {
|
"PowerPulseDuration": {
|
||||||
"displayText": "Длина имп.\nпитания мс",
|
"displayText": "Длина имп.\nпитания (К)",
|
||||||
"description": "Длина импульса удерживающего от сна источник питания (x 250мс)"
|
"description": "Коэффициент длины импульса, удерживающего от автовыключения источник питания (К x 250 мс)"
|
||||||
},
|
},
|
||||||
"SettingsReset": {
|
"SettingsReset": {
|
||||||
"displayText": "Сброс\nНастроек",
|
"displayText": "Сброс\nнастроек",
|
||||||
"description": "Сброс настроек к значеням по умолчанию"
|
"description": "Сброс настроек к значениям по умолчанию"
|
||||||
},
|
},
|
||||||
"LanguageSwitch": {
|
"LanguageSwitch": {
|
||||||
"displayText": "Язык:\n RU Русский",
|
"displayText": "Язык:\n RU Русский",
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
"languageLocalName": "Slovenčina",
|
"languageLocalName": "Slovenčina",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Kalibrácia\ndokončená!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
"message": "Reset OK"
|
"message": "Reset OK"
|
||||||
@@ -30,11 +30,14 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Únik\nTepla"
|
"message": "Únik\nTepla"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Skrat hrotu!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Pred reštartovaním sa uistite, že hrot a rúčka je v izbovej teplote!"
|
||||||
},
|
},
|
||||||
"CJCCalibrating": {
|
"CJCCalibrating": {
|
||||||
"message": "calibrating\n"
|
"message": "kalibrovanie\n"
|
||||||
},
|
},
|
||||||
"SettingsResetWarning": {
|
"SettingsResetWarning": {
|
||||||
"message": "Naozaj chcete obnoviť továrenské nastavenia?"
|
"message": "Naozaj chcete obnoviť továrenské nastavenia?"
|
||||||
@@ -61,16 +64,16 @@
|
|||||||
"message": "Vyp"
|
"message": "Vyp"
|
||||||
},
|
},
|
||||||
"ProfilePreheatString": {
|
"ProfilePreheatString": {
|
||||||
"message": "Preheat\n"
|
"message": "Predhrievanie\n"
|
||||||
},
|
},
|
||||||
"ProfileCooldownString": {
|
"ProfileCooldownString": {
|
||||||
"message": "Cooldown\n"
|
"message": "Schladzovanie\n"
|
||||||
},
|
},
|
||||||
"DeviceFailedValidationWarning": {
|
"DeviceFailedValidationWarning": {
|
||||||
"message": "Vaše zariadenie je pravdepodobne falzifikát!"
|
"message": "Vaše zariadenie je pravdepodobne falzifikát!"
|
||||||
},
|
},
|
||||||
"TooHotToStartProfileWarning": {
|
"TooHotToStartProfileWarning": {
|
||||||
"message": "Too hot to\nstart profile"
|
"message": "Teplota príliž vysoká pre štart profilu"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"characters": {
|
"characters": {
|
||||||
@@ -130,7 +133,7 @@
|
|||||||
},
|
},
|
||||||
"PDVpdo": {
|
"PDVpdo": {
|
||||||
"displayText": "PD\nVPDO",
|
"displayText": "PD\nVPDO",
|
||||||
"description": "Enables PPS & EPR modes"
|
"description": "Zapína PPS & EPR režimy"
|
||||||
},
|
},
|
||||||
"BoostTemperature": {
|
"BoostTemperature": {
|
||||||
"displayText": "Boost\nteplota",
|
"displayText": "Boost\nteplota",
|
||||||
@@ -153,60 +156,60 @@
|
|||||||
"description": "Zamknutie tlačidiel - dlhé stlačenie oboch naraz počas spájkovania (Z=Zakázať | B=Okrem boost | P=Plné zamknutie)"
|
"description": "Zamknutie tlačidiel - dlhé stlačenie oboch naraz počas spájkovania (Z=Zakázať | B=Okrem boost | P=Plné zamknutie)"
|
||||||
},
|
},
|
||||||
"ProfilePhases": {
|
"ProfilePhases": {
|
||||||
"displayText": "Profile\nPhases",
|
"displayText": "Profilové\nFázy",
|
||||||
"description": "Number of phases in profile mode"
|
"description": "Počet fáz v profilovóm režime"
|
||||||
},
|
},
|
||||||
"ProfilePreheatTemp": {
|
"ProfilePreheatTemp": {
|
||||||
"displayText": "Preheat\nTemp",
|
"displayText": "Teplota\nPredhriatia",
|
||||||
"description": "Preheat to this temperature at the start of profile mode"
|
"description": "Teplota na ktorú sa má predohriať na začiatku profilového režimu"
|
||||||
},
|
},
|
||||||
"ProfilePreheatSpeed": {
|
"ProfilePreheatSpeed": {
|
||||||
"displayText": "Preheat\nSpeed",
|
"displayText": "Rýchlosť\nPredhriatia",
|
||||||
"description": "Preheat at this rate (degrees per second)"
|
"description": "Rýchlosť predhrievania (stupňe za sekundu)"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Temp": {
|
"ProfilePhase1Temp": {
|
||||||
"displayText": "Phase 1\nTemp",
|
"displayText": "Teplota\nFáze 1",
|
||||||
"description": "Target temperature for the end of this phase"
|
"description": "Cieľová teplota na konci tejto fáze"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Duration": {
|
"ProfilePhase1Duration": {
|
||||||
"displayText": "Phase 1\nDuration",
|
"displayText": "Trvanie\nFáze 1",
|
||||||
"description": "Target duration of this phase (seconds)"
|
"description": "Doba trvania tejto fáze (sekundy)"
|
||||||
},
|
},
|
||||||
"ProfilePhase2Temp": {
|
"ProfilePhase2Temp": {
|
||||||
"displayText": "Phase 2\nTemp",
|
"displayText": "Teplota\nFáze 2",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase2Duration": {
|
"ProfilePhase2Duration": {
|
||||||
"displayText": "Phase 2\nDuration",
|
"displayText": "Trvanie\nFáze 2",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Temp": {
|
"ProfilePhase3Temp": {
|
||||||
"displayText": "Phase 3\nTemp",
|
"displayText": "Teplota\nFáze 3",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Duration": {
|
"ProfilePhase3Duration": {
|
||||||
"displayText": "Phase 3\nDuration",
|
"displayText": "Trvanie\nFáze 3",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Temp": {
|
"ProfilePhase4Temp": {
|
||||||
"displayText": "Phase 4\nTemp",
|
"displayText": "Teplota\nFáze 4",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Duration": {
|
"ProfilePhase4Duration": {
|
||||||
"displayText": "Phase 4\nDuration",
|
"displayText": "Trvanie\nFáze 4",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Temp": {
|
"ProfilePhase5Temp": {
|
||||||
"displayText": "Phase 5\nTemp",
|
"displayText": "Teplota\nFáze 5",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Duration": {
|
"ProfilePhase5Duration": {
|
||||||
"displayText": "Phase 5\nDuration",
|
"displayText": "Trvanie\nFáze 4",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfileCooldownSpeed": {
|
"ProfileCooldownSpeed": {
|
||||||
"displayText": "Cooldown\nSpeed",
|
"displayText": "Rýchlosť\nochladzovania",
|
||||||
"description": "Cooldown at this rate at the end of profile mode (degrees per second)"
|
"description": "Rýchlosť ochladzovania na konci profilového režimu (stupne za sekundu)"
|
||||||
},
|
},
|
||||||
"MotionSensitivity": {
|
"MotionSensitivity": {
|
||||||
"displayText": "Citlivosť\npohybu",
|
"displayText": "Citlivosť\npohybu",
|
||||||
@@ -278,15 +281,15 @@
|
|||||||
},
|
},
|
||||||
"BluetoothLE": {
|
"BluetoothLE": {
|
||||||
"displayText": "Bluetooth\n",
|
"displayText": "Bluetooth\n",
|
||||||
"description": "Enables BLE"
|
"description": "Zapne BLE"
|
||||||
},
|
},
|
||||||
"PowerLimit": {
|
"PowerLimit": {
|
||||||
"displayText": "Obmedzenie\nvýkonu",
|
"displayText": "Obmedzenie\nvýkonu",
|
||||||
"description": "Obmedzenie výkonu podľa použitého zdroja (watt)"
|
"description": "Obmedzenie výkonu podľa použitého zdroja (watt)"
|
||||||
},
|
},
|
||||||
"CalibrateCJC": {
|
"CalibrateCJC": {
|
||||||
"displayText": "Calibrate CJC\nat next boot",
|
"displayText": "Kalibrácia CJC\npri nasladujúcom štarte",
|
||||||
"description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
|
"description": "Pri nasledujúcom štarte bude kalibrovaná kompenzácia studeného spoja (nie je potrebné ak Delta T je < 5°C)"
|
||||||
},
|
},
|
||||||
"VoltageCalibration": {
|
"VoltageCalibration": {
|
||||||
"displayText": "Kalibrácia\nnap. napätia",
|
"displayText": "Kalibrácia\nnap. napätia",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Slovenščina",
|
"languageLocalName": "Slovenščina",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Thermal\nRunaway"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Српски",
|
"languageLocalName": "Српски",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Thermal\nRunaway"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Srpski",
|
"languageLocalName": "Srpski",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Thermal\nRunaway"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,11 +3,11 @@
|
|||||||
"languageLocalName": "Svenska",
|
"languageLocalName": "Svenska",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Kalibrering\nfärdig!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
"message": "Reset OK"
|
"message": "Återställning\nOK"
|
||||||
},
|
},
|
||||||
"SettingsResetMessage": {
|
"SettingsResetMessage": {
|
||||||
"message": "Inställningar\nåterställda"
|
"message": "Inställningar\nåterställda"
|
||||||
@@ -28,13 +28,16 @@
|
|||||||
"message": "!LÅST!"
|
"message": "!LÅST!"
|
||||||
},
|
},
|
||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Termisk\nFlykt"
|
||||||
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Spets Kortsluten!"
|
||||||
},
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Före omstart, säkerställ att spetsen och handtaget är i rumstemperatur!"
|
||||||
},
|
},
|
||||||
"CJCCalibrating": {
|
"CJCCalibrating": {
|
||||||
"message": "calibrating\n"
|
"message": "kalibrerar\n"
|
||||||
},
|
},
|
||||||
"SettingsResetWarning": {
|
"SettingsResetWarning": {
|
||||||
"message": "Är du säker på att du vill återställa inställningarna?"
|
"message": "Är du säker på att du vill återställa inställningarna?"
|
||||||
@@ -61,16 +64,16 @@
|
|||||||
"message": "Av"
|
"message": "Av"
|
||||||
},
|
},
|
||||||
"ProfilePreheatString": {
|
"ProfilePreheatString": {
|
||||||
"message": "Preheat\n"
|
"message": "Förvärmning\n"
|
||||||
},
|
},
|
||||||
"ProfileCooldownString": {
|
"ProfileCooldownString": {
|
||||||
"message": "Cooldown\n"
|
"message": "Nedkyldning\n"
|
||||||
},
|
},
|
||||||
"DeviceFailedValidationWarning": {
|
"DeviceFailedValidationWarning": {
|
||||||
"message": "Your device is most likely a counterfeit!"
|
"message": "Din enhet är sannerligen oäkta!"
|
||||||
},
|
},
|
||||||
"TooHotToStartProfileWarning": {
|
"TooHotToStartProfileWarning": {
|
||||||
"message": "Too hot to\nstart profile"
|
"message": "För varm för att\nstarta profilen!"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"characters": {
|
"characters": {
|
||||||
@@ -125,12 +128,12 @@
|
|||||||
"description": "Maximal QC-spänning enheten skall efterfråga"
|
"description": "Maximal QC-spänning enheten skall efterfråga"
|
||||||
},
|
},
|
||||||
"PDNegTimeout": {
|
"PDNegTimeout": {
|
||||||
"displayText": "PD\ntimeout",
|
"displayText": "PD\npauser",
|
||||||
"description": "PD negotiation timeout in 100ms steps for compatibility with some QC chargers"
|
"description": "PD förhandlings pauser i 100ms steg för kompatibilitet med vissa PD laddare"
|
||||||
},
|
},
|
||||||
"PDVpdo": {
|
"PDVpdo": {
|
||||||
"displayText": "PD\nVPDO",
|
"displayText": "PD\nVPDO",
|
||||||
"description": "Enables PPS & EPR modes"
|
"description": "Slår på PPS & EPR lägen"
|
||||||
},
|
},
|
||||||
"BoostTemperature": {
|
"BoostTemperature": {
|
||||||
"displayText": "Turbo-\ntemp",
|
"displayText": "Turbo-\ntemp",
|
||||||
@@ -153,60 +156,60 @@
|
|||||||
"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)"
|
"description": "Vid lödning, håll nere bägge knappar för att slå på lås (A=Av | T=Bara turbo | F=Fullt lås)"
|
||||||
},
|
},
|
||||||
"ProfilePhases": {
|
"ProfilePhases": {
|
||||||
"displayText": "Profile\nPhases",
|
"displayText": "Profil-\nfaser",
|
||||||
"description": "Number of phases in profile mode"
|
"description": "Antal faser i profil läge"
|
||||||
},
|
},
|
||||||
"ProfilePreheatTemp": {
|
"ProfilePreheatTemp": {
|
||||||
"displayText": "Preheat\nTemp",
|
"displayText": "Förvärmnings-\ntemp",
|
||||||
"description": "Preheat to this temperature at the start of profile mode"
|
"description": "Förvärm till denna temperatur i början av provil läget"
|
||||||
},
|
},
|
||||||
"ProfilePreheatSpeed": {
|
"ProfilePreheatSpeed": {
|
||||||
"displayText": "Preheat\nSpeed",
|
"displayText": "Förvärmnings-\nhastighet",
|
||||||
"description": "Preheat at this rate (degrees per second)"
|
"description": "Förvärm enligt denna hastighet (grader per sekund)"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Temp": {
|
"ProfilePhase1Temp": {
|
||||||
"displayText": "Phase 1\nTemp",
|
"displayText": "Fas 1\nTemp",
|
||||||
"description": "Target temperature for the end of this phase"
|
"description": "Måltemperatur i slutet av denna fas"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Duration": {
|
"ProfilePhase1Duration": {
|
||||||
"displayText": "Phase 1\nDuration",
|
"displayText": "Fas 1\nTidslängd",
|
||||||
"description": "Target duration of this phase (seconds)"
|
"description": "Mållängd av denna fasen (sekunder)"
|
||||||
},
|
},
|
||||||
"ProfilePhase2Temp": {
|
"ProfilePhase2Temp": {
|
||||||
"displayText": "Phase 2\nTemp",
|
"displayText": "Fas 2\nTemp",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase2Duration": {
|
"ProfilePhase2Duration": {
|
||||||
"displayText": "Phase 2\nDuration",
|
"displayText": "Fas 2\nTidslängd",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Temp": {
|
"ProfilePhase3Temp": {
|
||||||
"displayText": "Phase 3\nTemp",
|
"displayText": "Fas 3\nTemp",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Duration": {
|
"ProfilePhase3Duration": {
|
||||||
"displayText": "Phase 3\nDuration",
|
"displayText": "Fas 3\nTidslängd",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Temp": {
|
"ProfilePhase4Temp": {
|
||||||
"displayText": "Phase 4\nTemp",
|
"displayText": "Fas 4\nTemp",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Duration": {
|
"ProfilePhase4Duration": {
|
||||||
"displayText": "Phase 4\nDuration",
|
"displayText": "Fas 4\nTidslängd",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Temp": {
|
"ProfilePhase5Temp": {
|
||||||
"displayText": "Phase 5\nTemp",
|
"displayText": "Fas 5\nTemp",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Duration": {
|
"ProfilePhase5Duration": {
|
||||||
"displayText": "Phase 5\nDuration",
|
"displayText": "Fas 5\nTidslängd",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfileCooldownSpeed": {
|
"ProfileCooldownSpeed": {
|
||||||
"displayText": "Cooldown\nSpeed",
|
"displayText": "Nedkylnings-\nhastighet",
|
||||||
"description": "Cooldown at this rate at the end of profile mode (degrees per second)"
|
"description": "Kyl ned i denna hastighet i slutet av profilen (grader per sekund)"
|
||||||
},
|
},
|
||||||
"MotionSensitivity": {
|
"MotionSensitivity": {
|
||||||
"displayText": "Rörelse-\nkänslighet",
|
"displayText": "Rörelse-\nkänslighet",
|
||||||
@@ -257,16 +260,16 @@
|
|||||||
"description": "Loopa animationer i huvudmeny"
|
"description": "Loopa animationer i huvudmeny"
|
||||||
},
|
},
|
||||||
"Brightness": {
|
"Brightness": {
|
||||||
"displayText": "Screen\nbrightness",
|
"displayText": "Skärmens\nLjusstyrka",
|
||||||
"description": "Adjust the OLED screen brightness"
|
"description": "Justera OLED skärmens ljusstyrka"
|
||||||
},
|
},
|
||||||
"ColourInversion": {
|
"ColourInversion": {
|
||||||
"displayText": "Invert\nscreen",
|
"displayText": "Invertera\nskärm",
|
||||||
"description": "Invert the OLED screen colors"
|
"description": "Invertera OLED skärmens färger"
|
||||||
},
|
},
|
||||||
"LOGOTime": {
|
"LOGOTime": {
|
||||||
"displayText": "Boot logo\nduration",
|
"displayText": "Start logo\nTidslängd",
|
||||||
"description": "Set boot logo duration (s=seconds)"
|
"description": "Sätt uppstartslogotypens tidslängd (s=sekunder)"
|
||||||
},
|
},
|
||||||
"AdvancedIdle": {
|
"AdvancedIdle": {
|
||||||
"displayText": "Detaljerad\nvid inaktiv",
|
"displayText": "Detaljerad\nvid inaktiv",
|
||||||
@@ -278,31 +281,31 @@
|
|||||||
},
|
},
|
||||||
"BluetoothLE": {
|
"BluetoothLE": {
|
||||||
"displayText": "Bluetooth\n",
|
"displayText": "Bluetooth\n",
|
||||||
"description": "Enables BLE"
|
"description": "Tillåter BLE"
|
||||||
},
|
},
|
||||||
"PowerLimit": {
|
"PowerLimit": {
|
||||||
"displayText": "Max-\neffekt",
|
"displayText": "Max-\neffekt",
|
||||||
"description": "Maximal effekt som enheten kan använda (Watt)"
|
"description": "Maximal effekt som enheten kan använda (Watt)"
|
||||||
},
|
},
|
||||||
"CalibrateCJC": {
|
"CalibrateCJC": {
|
||||||
"displayText": "Calibrate CJC\nat next boot",
|
"displayText": "Kalibrera CJC\nnästa uppstart",
|
||||||
"description": "At next boot tip Cold Junction Compensation will be calibrated (not required if Delta T is < 5°C)"
|
"description": "Vid nästa uppstart kommer spets Cold Junction Compensation kalibreras (ej nödvändigt om Delta T är < 5°C)"
|
||||||
},
|
},
|
||||||
"VoltageCalibration": {
|
"VoltageCalibration": {
|
||||||
"displayText": "Kalibrera\ninspänning?",
|
"displayText": "Kalibrera\ninspänning?",
|
||||||
"description": "Inspänningskalibrering. Knapparna justerar, håll inne för avslut"
|
"description": "Inspänningskalibrering. Knapparna justerar, håll inne för avslut"
|
||||||
},
|
},
|
||||||
"PowerPulsePower": {
|
"PowerPulsePower": {
|
||||||
"displayText": "Power\npulse",
|
"displayText": "Effekt\npuls",
|
||||||
"description": "Intensity of power of keep-awake-pulse (W=watt)"
|
"description": "Intensiteten av effekt för håll-vaken-puls (W=watt)"
|
||||||
},
|
},
|
||||||
"PowerPulseWait": {
|
"PowerPulseWait": {
|
||||||
"displayText": "Power pulse\ndelay",
|
"displayText": "Effekt puls\nfördröjning",
|
||||||
"description": "Delay before keep-awake-pulse is triggered (x 2.5s)"
|
"description": "Fördröjning innan håll-vaken-pulsen skickas (x 2.5s)"
|
||||||
},
|
},
|
||||||
"PowerPulseDuration": {
|
"PowerPulseDuration": {
|
||||||
"displayText": "Power pulse\nduration",
|
"displayText": "Effekt puls\ntidsmängd",
|
||||||
"description": "Keep-awake-pulse duration (x 250ms)"
|
"description": "Håll-vaken-puls varaktighet (x 250ms)"
|
||||||
},
|
},
|
||||||
"SettingsReset": {
|
"SettingsReset": {
|
||||||
"displayText": "Fabriks-\ninställ?",
|
"displayText": "Fabriks-\ninställ?",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Türkçe",
|
"languageLocalName": "Türkçe",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Thermal\nRunaway"
|
"message": "Thermal\nRunaway"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Українська",
|
"languageLocalName": "Українська",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "КХС\nвідкалібровано!"
|
"message": "КХС\nвідкалібровано!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Некерований\nрозігрів"
|
"message": "Некерований\nрозігрів"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Під час наступного завантаження переконайтеся, що жало і ручка мають кімнатну температуру!"
|
"message": "Під час наступного завантаження переконайтеся, що жало і ручка мають кімнатну температуру!"
|
||||||
},
|
},
|
||||||
@@ -61,16 +64,16 @@
|
|||||||
"message": "Вимк"
|
"message": "Вимк"
|
||||||
},
|
},
|
||||||
"ProfilePreheatString": {
|
"ProfilePreheatString": {
|
||||||
"message": "Preheat\n"
|
"message": "Попередній\nрозігрів"
|
||||||
},
|
},
|
||||||
"ProfileCooldownString": {
|
"ProfileCooldownString": {
|
||||||
"message": "Cooldown\n"
|
"message": "Охолодження\n"
|
||||||
},
|
},
|
||||||
"DeviceFailedValidationWarning": {
|
"DeviceFailedValidationWarning": {
|
||||||
"message": "Вірогідно ваш пристрій підробний!"
|
"message": "Вірогідно ваш пристрій підробний!"
|
||||||
},
|
},
|
||||||
"TooHotToStartProfileWarning": {
|
"TooHotToStartProfileWarning": {
|
||||||
"message": "Too hot to\nstart profile"
|
"message": "Занадто гараче для\nзміни профілів"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"characters": {
|
"characters": {
|
||||||
@@ -153,60 +156,60 @@
|
|||||||
"description": "Під час пайки тривале натискання обох кнопок заблокує їх (В=Вимк | Т=Тільки турбо | П=Повне)"
|
"description": "Під час пайки тривале натискання обох кнопок заблокує їх (В=Вимк | Т=Тільки турбо | П=Повне)"
|
||||||
},
|
},
|
||||||
"ProfilePhases": {
|
"ProfilePhases": {
|
||||||
"displayText": "Profile\nPhases",
|
"displayText": "Етапи\nпрофілів",
|
||||||
"description": "Number of phases in profile mode"
|
"description": "Кількість етапів в режимі профілів"
|
||||||
},
|
},
|
||||||
"ProfilePreheatTemp": {
|
"ProfilePreheatTemp": {
|
||||||
"displayText": "Preheat\nTemp",
|
"displayText": "Температура\nПоп.Розігріву",
|
||||||
"description": "Preheat to this temperature at the start of profile mode"
|
"description": "Попередньо розігріти до цієї температури на початку режимку профілів"
|
||||||
},
|
},
|
||||||
"ProfilePreheatSpeed": {
|
"ProfilePreheatSpeed": {
|
||||||
"displayText": "Preheat\nSpeed",
|
"displayText": "Швидкість\nПоп.Розігріву",
|
||||||
"description": "Preheat at this rate (degrees per second)"
|
"description": "Розігрівати з такою швидкістю (градусів в секунду)"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Temp": {
|
"ProfilePhase1Temp": {
|
||||||
"displayText": "Phase 1\nTemp",
|
"displayText": "Етап 1\nТемпература",
|
||||||
"description": "Target temperature for the end of this phase"
|
"description": "Температура в кінці цього етапу"
|
||||||
},
|
},
|
||||||
"ProfilePhase1Duration": {
|
"ProfilePhase1Duration": {
|
||||||
"displayText": "Phase 1\nDuration",
|
"displayText": "Етап 1\nТривалість",
|
||||||
"description": "Target duration of this phase (seconds)"
|
"description": "Тривалість цього етапу (секунд)"
|
||||||
},
|
},
|
||||||
"ProfilePhase2Temp": {
|
"ProfilePhase2Temp": {
|
||||||
"displayText": "Phase 2\nTemp",
|
"displayText": "Етап 2\nТемпература",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase2Duration": {
|
"ProfilePhase2Duration": {
|
||||||
"displayText": "Phase 2\nDuration",
|
"displayText": "Етап 2\nТривалість",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Temp": {
|
"ProfilePhase3Temp": {
|
||||||
"displayText": "Phase 3\nTemp",
|
"displayText": "Етап 3\nТемпература",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase3Duration": {
|
"ProfilePhase3Duration": {
|
||||||
"displayText": "Phase 3\nDuration",
|
"displayText": "Етап 3\nТривалість",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Temp": {
|
"ProfilePhase4Temp": {
|
||||||
"displayText": "Phase 4\nTemp",
|
"displayText": "Етап 4\nТемпература",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase4Duration": {
|
"ProfilePhase4Duration": {
|
||||||
"displayText": "Phase 4\nDuration",
|
"displayText": "Етап 4\nТривалість",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Temp": {
|
"ProfilePhase5Temp": {
|
||||||
"displayText": "Phase 5\nTemp",
|
"displayText": "Етап 5\nТемпература",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfilePhase5Duration": {
|
"ProfilePhase5Duration": {
|
||||||
"displayText": "Phase 5\nDuration",
|
"displayText": "Етап 5\nТривалість",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"ProfileCooldownSpeed": {
|
"ProfileCooldownSpeed": {
|
||||||
"displayText": "Cooldown\nSpeed",
|
"displayText": "Швидкість\nОхолодження",
|
||||||
"description": "Cooldown at this rate at the end of profile mode (degrees per second)"
|
"description": "Швидкість охолодження в кінці режиму профілів (градусів в секунду)"
|
||||||
},
|
},
|
||||||
"MotionSensitivity": {
|
"MotionSensitivity": {
|
||||||
"displayText": "Чутливість\nсенсору руху",
|
"displayText": "Чутливість\nсенсору руху",
|
||||||
@@ -278,7 +281,7 @@
|
|||||||
},
|
},
|
||||||
"BluetoothLE": {
|
"BluetoothLE": {
|
||||||
"displayText": "Bluetooth\n",
|
"displayText": "Bluetooth\n",
|
||||||
"description": "Enables BLE"
|
"description": "Увімкнути BLE"
|
||||||
},
|
},
|
||||||
"PowerLimit": {
|
"PowerLimit": {
|
||||||
"displayText": "Макс.\nпотуж.",
|
"displayText": "Макс.\nпотуж.",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "Tieng Viet",
|
"languageLocalName": "Tieng Viet",
|
||||||
"tempUnitFahrenheit": false,
|
"tempUnitFahrenheit": false,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration\ndone!"
|
"message": "Calibration\ndone!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "Nhiet\nTat gia nhiet"
|
"message": "Nhiet\nTat gia nhiet"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "廣東話 (香港)",
|
"languageLocalName": "廣東話 (香港)",
|
||||||
"tempUnitFahrenheit": true,
|
"tempUnitFahrenheit": true,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration done!"
|
"message": "Calibration done!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "加熱失控"
|
"message": "加熱失控"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "简体中文",
|
"languageLocalName": "简体中文",
|
||||||
"tempUnitFahrenheit": true,
|
"tempUnitFahrenheit": true,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration done!"
|
"message": "Calibration done!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "加热失控"
|
"message": "加热失控"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
@@ -313,4 +316,4 @@
|
|||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
"languageLocalName": "正體中文",
|
"languageLocalName": "正體中文",
|
||||||
"tempUnitFahrenheit": true,
|
"tempUnitFahrenheit": true,
|
||||||
"messagesWarn": {
|
"messagesWarn": {
|
||||||
"CJCCalibrationDone": {
|
"CalibrationDone": {
|
||||||
"message": "Calibration done!"
|
"message": "Calibration done!"
|
||||||
},
|
},
|
||||||
"ResetOKMessage": {
|
"ResetOKMessage": {
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
"WarningThermalRunaway": {
|
"WarningThermalRunaway": {
|
||||||
"message": "加熱失控"
|
"message": "加熱失控"
|
||||||
},
|
},
|
||||||
|
"WarningTipShorted": {
|
||||||
|
"message": "!Tip Shorted!"
|
||||||
|
},
|
||||||
"SettingsCalibrationWarning": {
|
"SettingsCalibrationWarning": {
|
||||||
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
"message": "Before rebooting, make sure tip & handle are at room temperature!"
|
||||||
},
|
},
|
||||||
@@ -313,4 +316,4 @@
|
|||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"messagesWarn": [{
|
"messagesWarn": [{
|
||||||
"id": "CJCCalibrationDone",
|
"id": "CalibrationDone",
|
||||||
"description": "Confirmation message indicating CJC calibration is complete."
|
"description": "Confirmation message indicating calibration is complete."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ResetOKMessage",
|
"id": "ResetOKMessage",
|
||||||
@@ -17,7 +17,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "NoPowerDeliveryMessage",
|
"id": "NoPowerDeliveryMessage",
|
||||||
"include": ["POW_PD"],
|
"include": [
|
||||||
|
"POW_PD"
|
||||||
|
],
|
||||||
"description": "The IC required for USB-PD could not be communicated with. This is an error warning that USB-PD WILL NOT FUNCTION. Generally indicative of either a hardware or software issues."
|
"description": "The IC required for USB-PD could not be communicated with. This is an error warning that USB-PD WILL NOT FUNCTION. Generally indicative of either a hardware or software issues."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -35,7 +37,12 @@
|
|||||||
{
|
{
|
||||||
"id": "WarningThermalRunaway",
|
"id": "WarningThermalRunaway",
|
||||||
"description": "Warning text shown when the software has disabled the heater as a safety precaution as the temperature reading didn't react as expected."
|
"description": "Warning text shown when the software has disabled the heater as a safety precaution as the temperature reading didn't react as expected."
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
|
"id": "WarningTipShorted",
|
||||||
|
"description": "Warning text shown when the software has detected that the users tip is likely shorted."
|
||||||
|
},
|
||||||
|
{
|
||||||
"id": "SettingsCalibrationWarning",
|
"id": "SettingsCalibrationWarning",
|
||||||
"description": "Confirmation message shown before performing an offset calibration. Should warn the user to make sure tip and handle are at the same temperature."
|
"description": "Confirmation message shown before performing an offset calibration. Should warn the user to make sure tip and handle are at the same temperature."
|
||||||
},
|
},
|
||||||
@@ -50,50 +57,66 @@
|
|||||||
{
|
{
|
||||||
"id": "UVLOWarningString",
|
"id": "UVLOWarningString",
|
||||||
"maxLen": 8,
|
"maxLen": 8,
|
||||||
"include": ["POW_DC"],
|
"include": [
|
||||||
|
"POW_DC"
|
||||||
|
],
|
||||||
"description": "Warning text shown when the unit turns off due to undervoltage in simple mode."
|
"description": "Warning text shown when the unit turns off due to undervoltage in simple mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "UndervoltageString",
|
"id": "UndervoltageString",
|
||||||
"maxLen": 15,
|
"maxLen": 15,
|
||||||
"include": ["POW_DC"],
|
"include": [
|
||||||
|
"POW_DC"
|
||||||
|
],
|
||||||
"description": "Warning text shown when the unit turns off due to undervoltage in advanced mode."
|
"description": "Warning text shown when the unit turns off due to undervoltage in advanced mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "InputVoltageString",
|
"id": "InputVoltageString",
|
||||||
"maxLen": 11,
|
"maxLen": 11,
|
||||||
"note": "Preferably end with a space",
|
"note": "Preferably end with a space",
|
||||||
"include": ["POW_DC"],
|
"include": [
|
||||||
|
"POW_DC"
|
||||||
|
],
|
||||||
"description": "Prefix text for 'Input Voltage' shown before showing the input voltage reading."
|
"description": "Prefix text for 'Input Voltage' shown before showing the input voltage reading."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePreheatString",
|
"id": "ProfilePreheatString",
|
||||||
"maxLen": 9,
|
"maxLen": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Shown in profile mode while preheating"
|
"description": "Shown in profile mode while preheating"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfileCooldownString",
|
"id": "ProfileCooldownString",
|
||||||
"maxLen": 9,
|
"maxLen": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Shown in profile mode while cooling down"
|
"description": "Shown in profile mode while cooling down"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "SleepingSimpleString",
|
"id": "SleepingSimpleString",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"exclude": ["NO_SLEEP_MODE"],
|
"exclude": [
|
||||||
|
"NO_SLEEP_MODE"
|
||||||
|
],
|
||||||
"description": "The text shown to indicate the unit is in sleep mode when the advanced view is NOT on."
|
"description": "The text shown to indicate the unit is in sleep mode when the advanced view is NOT on."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "SleepingAdvancedString",
|
"id": "SleepingAdvancedString",
|
||||||
"maxLen": 15,
|
"maxLen": 15,
|
||||||
"exclude": ["NO_SLEEP_MODE"],
|
"exclude": [
|
||||||
|
"NO_SLEEP_MODE"
|
||||||
|
],
|
||||||
"description": "The text shown to indicate the unit is in sleep mode when the advanced view is turned on."
|
"description": "The text shown to indicate the unit is in sleep mode when the advanced view is turned on."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "SleepingTipAdvancedString",
|
"id": "SleepingTipAdvancedString",
|
||||||
"maxLen": 6,
|
"maxLen": 6,
|
||||||
"exclude": ["NO_SLEEP_MODE"],
|
"exclude": [
|
||||||
|
"NO_SLEEP_MODE"
|
||||||
|
],
|
||||||
"description": "The prefix text shown before tip temperature when the unit is sleeping with advanced view on."
|
"description": "The prefix text shown before tip temperature when the unit is sleeping with advanced view on."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -109,11 +132,14 @@
|
|||||||
{
|
{
|
||||||
"id": "TooHotToStartProfileWarning",
|
"id": "TooHotToStartProfileWarning",
|
||||||
"default": "Too hot to\nstart profile",
|
"default": "Too hot to\nstart profile",
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Shown when profile mode is started while the device is too hot."
|
"description": "Shown when profile mode is started while the device is too hot."
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"characters": [{
|
"characters": [
|
||||||
|
{
|
||||||
"id": "SettingRightChar",
|
"id": "SettingRightChar",
|
||||||
"len": 1,
|
"len": 1,
|
||||||
"description": "Shown for fixed Right-handed display rotation."
|
"description": "Shown for fixed Right-handed display rotation."
|
||||||
@@ -187,11 +213,15 @@
|
|||||||
"description": "Shown when the locking mode is set to lock all buttons."
|
"description": "Shown when the locking mode is set to lock all buttons."
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"menuGroups": [{
|
"menuGroups": [
|
||||||
|
{
|
||||||
"id": "PowerMenu",
|
"id": "PowerMenu",
|
||||||
"maxLen": 5,
|
"maxLen": 5,
|
||||||
"maxLen2": 11,
|
"maxLen2": 11,
|
||||||
"include": ["POW_DC", "POW_QC"],
|
"include": [
|
||||||
|
"POW_DC",
|
||||||
|
"POW_QC"
|
||||||
|
],
|
||||||
"description": "Menu for settings related to power. Main settings to do with the input voltage."
|
"description": "Menu for settings related to power. Main settings to do with the input voltage."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -219,39 +249,50 @@
|
|||||||
"description": "Advanced settings. Misc catchall for settings that don't fit anywhere else or settings that require some thought before use."
|
"description": "Advanced settings. Misc catchall for settings that don't fit anywhere else or settings that require some thought before use."
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"menuOptions": [{
|
"menuOptions": [
|
||||||
|
{
|
||||||
"id": "DCInCutoff",
|
"id": "DCInCutoff",
|
||||||
"maxLen": 5,
|
"maxLen": 5,
|
||||||
"maxLen2": 11,
|
"maxLen2": 11,
|
||||||
"include": ["POW_DC"],
|
"include": [
|
||||||
|
"POW_DC"
|
||||||
|
],
|
||||||
"description": "When the device is powered by a battery, this adjusts the low voltage threshold for when the unit should turn off the heater to protect the battery."
|
"description": "When the device is powered by a battery, this adjusts the low voltage threshold for when the unit should turn off the heater to protect the battery."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "MinVolCell",
|
"id": "MinVolCell",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["POW_DC"],
|
"include": [
|
||||||
|
"POW_DC"
|
||||||
|
],
|
||||||
"description": "When powered by a battery, this adjusts the minimum voltage per cell before shutdown. (This is multiplied by the cell count.)"
|
"description": "When powered by a battery, this adjusts the minimum voltage per cell before shutdown. (This is multiplied by the cell count.)"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "QCMaxVoltage",
|
"id": "QCMaxVoltage",
|
||||||
"maxLen": 8,
|
"maxLen": 8,
|
||||||
"maxLen2": 15,
|
"maxLen2": 15,
|
||||||
"include": ["POW_QC"],
|
"include": [
|
||||||
|
"POW_QC"
|
||||||
|
],
|
||||||
"description": "This adjusts the maximum voltage the QC negotiation will adjust to. Does NOT affect USB-PD. Should be set safely based on the current rating of your power supply."
|
"description": "This adjusts the maximum voltage the QC negotiation will adjust to. Does NOT affect USB-PD. Should be set safely based on the current rating of your power supply."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "PDNegTimeout",
|
"id": "PDNegTimeout",
|
||||||
"maxLen": 8,
|
"maxLen": 8,
|
||||||
"maxLen2": 15,
|
"maxLen2": 15,
|
||||||
"include": ["POW_PD"],
|
"include": [
|
||||||
|
"POW_PD"
|
||||||
|
],
|
||||||
"description": "How long until firmware stops trying to negotiate for USB-PD and tries QC instead. Longer times may help dodgy / old PD adapters, faster times move onto PD quickly. Units of 100ms. Recommended to keep small values."
|
"description": "How long until firmware stops trying to negotiate for USB-PD and tries QC instead. Longer times may help dodgy / old PD adapters, faster times move onto PD quickly. Units of 100ms. Recommended to keep small values."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "PDVpdo",
|
"id": "PDVpdo",
|
||||||
"maxLen": 7,
|
"maxLen": 7,
|
||||||
"maxLen2": 15,
|
"maxLen2": 15,
|
||||||
"include": ["POW_PD"],
|
"include": [
|
||||||
|
"POW_PD"
|
||||||
|
],
|
||||||
"description": "Enabled PPS & EPR modes."
|
"description": "Enabled PPS & EPR modes."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -288,98 +329,126 @@
|
|||||||
"id": "ProfilePhases",
|
"id": "ProfilePhases",
|
||||||
"maxLen": 6,
|
"maxLen": 6,
|
||||||
"maxLen2": 13,
|
"maxLen2": 13,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "set the number of phases for profile mode."
|
"description": "set the number of phases for profile mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePreheatTemp",
|
"id": "ProfilePreheatTemp",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Preheat to this temperature at the start of profile mode."
|
"description": "Preheat to this temperature at the start of profile mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePreheatSpeed",
|
"id": "ProfilePreheatSpeed",
|
||||||
"maxLen": 5,
|
"maxLen": 5,
|
||||||
"maxLen2": 11,
|
"maxLen2": 11,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "How fast the temperature is allowed to rise during the preheat phase at the start of profile mode."
|
"description": "How fast the temperature is allowed to rise during the preheat phase at the start of profile mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePhase1Temp",
|
"id": "ProfilePhase1Temp",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Target temperature for the end of phase 1 of profile mode."
|
"description": "Target temperature for the end of phase 1 of profile mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePhase1Duration",
|
"id": "ProfilePhase1Duration",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Duration of phase 1 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature."
|
"description": "Duration of phase 1 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePhase2Temp",
|
"id": "ProfilePhase2Temp",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Target temperature for the end of phase 2 of profile mode."
|
"description": "Target temperature for the end of phase 2 of profile mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePhase2Duration",
|
"id": "ProfilePhase2Duration",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Duration of phase 2 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature."
|
"description": "Duration of phase 2 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePhase3Temp",
|
"id": "ProfilePhase3Temp",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Target temperature for the end of phase 3 of profile mode."
|
"description": "Target temperature for the end of phase 3 of profile mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePhase3Duration",
|
"id": "ProfilePhase3Duration",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Duration of phase 3 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature."
|
"description": "Duration of phase 3 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePhase4Temp",
|
"id": "ProfilePhase4Temp",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Target temperature for the end of phase 5 of profile mode."
|
"description": "Target temperature for the end of phase 5 of profile mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePhase4Duration",
|
"id": "ProfilePhase4Duration",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Duration of phase 5 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature."
|
"description": "Duration of phase 5 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePhase5Temp",
|
"id": "ProfilePhase5Temp",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Target temperature for the end of phase 5 of profile mode."
|
"description": "Target temperature for the end of phase 5 of profile mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfilePhase5Duration",
|
"id": "ProfilePhase5Duration",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "Duration of phase 5 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature."
|
"description": "Duration of phase 5 of profile mode. The phase might actually take longer if it takes longer to reach the target temperature."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "ProfileCooldownSpeed",
|
"id": "ProfileCooldownSpeed",
|
||||||
"maxLen": 5,
|
"maxLen": 5,
|
||||||
"maxLen2": 11,
|
"maxLen2": 11,
|
||||||
"include": ["PROFILE_SUPPORT"],
|
"include": [
|
||||||
|
"PROFILE_SUPPORT"
|
||||||
|
],
|
||||||
"description": "How fast the temperature is allowed to drop during the cooldown phase at the end of profile mode."
|
"description": "How fast the temperature is allowed to drop during the cooldown phase at the end of profile mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -392,14 +461,18 @@
|
|||||||
"id": "SleepTemperature",
|
"id": "SleepTemperature",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"exclude": ["NO_SLEEP_MODE"],
|
"exclude": [
|
||||||
|
"NO_SLEEP_MODE"
|
||||||
|
],
|
||||||
"description": "Temperature the device will drop down to while asleep. Typically around halfway between off and soldering temperature."
|
"description": "Temperature the device will drop down to while asleep. Typically around halfway between off and soldering temperature."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "SleepTimeout",
|
"id": "SleepTimeout",
|
||||||
"maxLen": 4,
|
"maxLen": 4,
|
||||||
"maxLen2": 9,
|
"maxLen2": 9,
|
||||||
"exclude": ["NO_SLEEP_MODE"],
|
"exclude": [
|
||||||
|
"NO_SLEEP_MODE"
|
||||||
|
],
|
||||||
"description": "How long of a period without movement / button-pressing is required before the device drops down to the sleep temperature."
|
"description": "How long of a period without movement / button-pressing is required before the device drops down to the sleep temperature."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -412,7 +485,9 @@
|
|||||||
"id": "HallEffSensitivity",
|
"id": "HallEffSensitivity",
|
||||||
"maxLen": 6,
|
"maxLen": 6,
|
||||||
"maxLen2": 13,
|
"maxLen2": 13,
|
||||||
"include": ["HALL_SENSOR"],
|
"include": [
|
||||||
|
"HALL_SENSOR"
|
||||||
|
],
|
||||||
"description": "If the unit has a hall effect sensor (Pinecil), this adjusts how sensitive it is at detecting a magnet to put the device into sleep mode."
|
"description": "If the unit has a hall effect sensor (Pinecil), this adjusts how sensitive it is at detecting a magnet to put the device into sleep mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -425,7 +500,9 @@
|
|||||||
"id": "DisplayRotation",
|
"id": "DisplayRotation",
|
||||||
"maxLen": 6,
|
"maxLen": 6,
|
||||||
"maxLen2": 13,
|
"maxLen2": 13,
|
||||||
"exclude": ["NO_DISPLAY_ROTATE"],
|
"exclude": [
|
||||||
|
"NO_DISPLAY_ROTATE"
|
||||||
|
],
|
||||||
"description": "If the display should rotate automatically or if it should be fixed for left- or right-handed mode."
|
"description": "If the display should rotate automatically or if it should be fixed for left- or right-handed mode."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -492,7 +569,9 @@
|
|||||||
"id": "BluetoothLE",
|
"id": "BluetoothLE",
|
||||||
"maxLen": 7,
|
"maxLen": 7,
|
||||||
"maxLen2": 15,
|
"maxLen2": 15,
|
||||||
"include": ["BLE_ENABLED"],
|
"include": [
|
||||||
|
"BLE_ENABLED"
|
||||||
|
],
|
||||||
"description": "Should BLE be enabled at boot time."
|
"description": "Should BLE be enabled at boot time."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -544,4 +623,4 @@
|
|||||||
"description": "Changes the device language on multi-lingual builds."
|
"description": "Changes the device language on multi-lingual builds."
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -3,19 +3,21 @@ site_name: IronOS
|
|||||||
site_url: https://ralim.github.io/IronOS/
|
site_url: https://ralim.github.io/IronOS/
|
||||||
site_description: "IronOS Open Source Soldering Iron firmware for Miniware and Pinecil"
|
site_description: "IronOS Open Source Soldering Iron firmware for Miniware and Pinecil"
|
||||||
|
|
||||||
# repo config
|
# Repo config
|
||||||
repo_url: https://github.com/ralim/IronOS/
|
repo_url: https://github.com/ralim/IronOS/
|
||||||
|
|
||||||
|
# Dir & location config
|
||||||
docs_dir: ../Documentation
|
docs_dir: ../Documentation
|
||||||
edit_uri: edit/dev/Documentation/
|
edit_uri: edit/dev/Documentation/
|
||||||
|
|
||||||
# Theme and config
|
# Theme and config
|
||||||
theme:
|
theme:
|
||||||
name: readthedocs
|
name: readthedocs
|
||||||
highlightsjs: true
|
highlightsjs: true
|
||||||
hljs_languages:
|
hljs_languages:
|
||||||
- yaml
|
- yaml
|
||||||
|
|
||||||
|
# Navigation structure
|
||||||
nav:
|
nav:
|
||||||
- Home: index.md
|
- Home: index.md
|
||||||
- Getting Started: GettingStarted.md
|
- Getting Started: GettingStarted.md
|
||||||
@@ -34,12 +36,15 @@ nav:
|
|||||||
- Startup Logo: Logo.md
|
- Startup Logo: Logo.md
|
||||||
- Hardware:
|
- Hardware:
|
||||||
- Hall Sensor (Pinecil): HallSensor.md
|
- Hall Sensor (Pinecil): HallSensor.md
|
||||||
|
- Bluetooth (Pinecil V2): Bluetooth.md
|
||||||
- Hardware Notes: Hardware.md
|
- Hardware Notes: Hardware.md
|
||||||
- Troubleshooting: Troubleshooting.md
|
- Troubleshooting: Troubleshooting.md
|
||||||
- Known Hardware Issues: HardwareIssues.md
|
- Known Hardware Issues: HardwareIssues.md
|
||||||
|
- Power sources: PowerSources.md
|
||||||
- Translations: Translation.md
|
- Translations: Translation.md
|
||||||
- Development: Development.md
|
- Development: Development.md
|
||||||
|
- Changelog: History.md
|
||||||
|
|
||||||
# Plugins
|
# Plugins
|
||||||
plugins:
|
plugins:
|
||||||
- search
|
- search
|
||||||
@@ -47,7 +52,6 @@ plugins:
|
|||||||
- awesome-pages
|
- awesome-pages
|
||||||
- git-revision-date
|
- git-revision-date
|
||||||
|
|
||||||
|
|
||||||
# Markdown Extensions
|
# Markdown Extensions
|
||||||
markdown_extensions:
|
markdown_extensions:
|
||||||
- attr_list
|
- attr_list
|
||||||
|
|||||||
@@ -1,29 +1,35 @@
|
|||||||
|
# Default Reference Distro for development env & deploy:
|
||||||
|
# * Alpine Linux, version 3.16 *
|
||||||
FROM alpine:3.16
|
FROM alpine:3.16
|
||||||
LABEL maintainer="Ben V. Brown <ralim@ralimtek.com>"
|
LABEL maintainer="Ben V. Brown <ralim@ralimtek.com>"
|
||||||
|
|
||||||
WORKDIR /build
|
# Default current dir when container starts
|
||||||
# Installing the two compilers, python3, python3 pip, clang format
|
WORKDIR /build/ironos
|
||||||
# Compilders ->gcc-* newlib-*
|
|
||||||
# Python3 -> py*
|
# Installing the two compilers (ARM & RISCV), python3 & pip, clang tools, etc.:
|
||||||
# Misc -> findutils make git
|
## - compilers: gcc-*, newlib-*
|
||||||
# musl-dev is required for the multi lang firmwares
|
## - python3: py*, black (required to check Python code formatting)
|
||||||
# clang is required for clang-format (for dev)
|
## - misc: findutils, make, git, diffutils, zip
|
||||||
ARG APK_COMPS="gcc-riscv-none-elf gcc-arm-none-eabi newlib-riscv-none-elf \
|
## - musl-dev (required for the multi lang firmwares)
|
||||||
newlib-arm-none-eabi"
|
## - clang (required for clang-format to check C++ code formatting)
|
||||||
|
## - shellcheck (to check sh scripts)
|
||||||
|
|
||||||
|
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_PYTHON="python3 py3-pip black"
|
||||||
ARG APK_MISC="findutils make git"
|
ARG APK_MISC="findutils make git diffutils zip"
|
||||||
ARG APK_DEV="musl-dev clang bash clang-extra-tools"
|
ARG APK_DEV="musl-dev clang bash clang-extra-tools shellcheck"
|
||||||
|
|
||||||
# PIP packages
|
# PIP packages to check & test Python code, and generate docs
|
||||||
ARG PIP_PKGS='bdflib'
|
ARG PIP_PKGS='bdflib flake8 pymdown-extensions mkdocs mkdocs-autolinks-plugin mkdocs-awesome-pages-plugin mkdocs-git-revision-date-plugin'
|
||||||
|
|
||||||
|
# Install system packages using alpine package manager
|
||||||
RUN apk add --no-cache ${APK_COMPS} ${APK_PYTHON} ${APK_MISC} ${APK_DEV}
|
RUN apk add --no-cache ${APK_COMPS} ${APK_PYTHON} ${APK_MISC} ${APK_DEV}
|
||||||
|
|
||||||
# Install Python3 packages
|
# Install Python3 packages as modules using pip
|
||||||
|
|
||||||
RUN python3 -m pip install ${PIP_PKGS}
|
RUN python3 -m pip install ${PIP_PKGS}
|
||||||
# Git trust
|
|
||||||
RUN git config --global --add safe.directory /build/source
|
|
||||||
|
|
||||||
COPY . /build/source
|
# Git trust to avoid related warning
|
||||||
COPY ./scripts/ci /build/ci
|
RUN git config --global --add safe.directory /build/ironos
|
||||||
|
|
||||||
|
# Copy the whole source tree working dir into container
|
||||||
|
COPY . /build/ironos
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
set -u
|
|
||||||
|
|
||||||
mkdir -p /build/ci/artefacts
|
|
||||||
|
|
||||||
# Build STM code
|
|
||||||
cd /build/source/source/
|
|
||||||
bash ./build.sh || exit 1
|
|
||||||
echo "All Firmware built"
|
|
||||||
# Copy out all the final resulting files we would like to store for the next op
|
|
||||||
cp -r /build/source/source/Hexfile/*.hex /build/ci/artefacts/
|
|
||||||
cp -r /build/source/source/Hexfile/*.bin /build/ci/artefacts/
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
8312c4c91799885f222f663fc81f9a31 gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
add5b6a9b12987d0e72f55a4d2cd0f3b nuclei_riscv_newlibc_prebuilt_linux64_2020.08.tar.bz2
|
|
||||||
@@ -3,24 +3,140 @@
|
|||||||
# little helper for docker deployment to:
|
# little helper for docker deployment to:
|
||||||
# - start development environment for IronOS ("shell" sub-command)
|
# - start development environment for IronOS ("shell" sub-command)
|
||||||
# - generate full set of builds ("build" sub-command)
|
# - generate full set of builds ("build" sub-command)
|
||||||
|
# - probably doing some other routines (check source briefly before running undocumented commands!)
|
||||||
|
|
||||||
#set -x
|
#set -x
|
||||||
#set -e
|
#set -e
|
||||||
|
|
||||||
|
### helper functions
|
||||||
|
|
||||||
|
# brief help (some supported commands may be missing!)
|
||||||
usage()
|
usage()
|
||||||
{
|
{
|
||||||
echo -e "\nUsage: ${0} [CMD]\n"
|
echo -e "\nUsage: ${0} [CMD]\n"
|
||||||
echo "CMD:"
|
echo "CMD (docker related):"
|
||||||
echo -e "\tshell - start docker container with shell inside to work on IronOS with all tools needed"
|
echo -e "\tshell - start docker container with shell inside to work on IronOS with all tools needed"
|
||||||
echo -e "\tbuild - compile builds of IronOS inside docker container for supported hardware"
|
echo -e "\tbuild - compile builds of IronOS inside docker container for supported hardware"
|
||||||
echo -e "\tclean - delete created docker container (but not pre-downloaded data for it)\n"
|
echo -e "\tclean - delete created docker image for IronOS & its build cache objects\n"
|
||||||
|
echo "CMD (helper routines):"
|
||||||
|
echo -e "\tdocs_readme - generate & OVERWRITE(!) README.md inside Documentation/ based on nav section from mkdocs.yml if it changed\n"
|
||||||
|
echo -e "\tcheck_style_file SRC - run code style checks based on clang-format & custom parsers for source code file SRC\n"
|
||||||
|
echo -e "\tcheck_style_log - run clang-format using source/Makefile and generate gcc-compatible error log in source/check-style.log\n"
|
||||||
echo -e "STORAGE NOTICE: for \"shell\" and \"build\" commands extra files will be downloaded so make sure that you have ~5GB of free space.\n"
|
echo -e "STORAGE NOTICE: for \"shell\" and \"build\" commands extra files will be downloaded so make sure that you have ~5GB of free space.\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Documentation/README.md automagical generation routine
|
||||||
|
docs_readme()
|
||||||
|
{
|
||||||
|
# WARNING: ON RUN Documentaion/README.md MAY BE OVERWRITTEN WITHOUT ANY WARNINGS / CONFIRMATIONS !!!
|
||||||
|
# Returns:
|
||||||
|
## 0 to the environment & silence - if there are no any changes in README.md nor updates in mkdocs.yml
|
||||||
|
## 1 to the environment (as error) & note message - if the update of README.md in repo is required
|
||||||
|
yml="scripts/IronOS-mkdocs.yml"
|
||||||
|
md_old="Documentation/README.md"
|
||||||
|
md_new="Documentation/README"
|
||||||
|
# ^^^^ hardcoded paths relative to IronOS/ to make this func very trivial
|
||||||
|
# file overwritten section looks out of style but hoping to make shellcheck happy
|
||||||
|
cat << EOF > "${md_new}"
|
||||||
|
|
||||||
|
<!-- THIS FILE IS AUTOGENERATED by "scripts/deploy.sh docs_readme" based on nav section in ${yml} config -->
|
||||||
|
<!-- THIS FILE IS NOT SUPPOSED TO BE EDITED MANUALLY -->
|
||||||
|
|
||||||
|
#### This is autogenerated README for brief navigation through github over official documentation for IronOS project
|
||||||
|
#### This documentation is also available [here online](https://ralim.github.io/IronOS)
|
||||||
|
|
||||||
|
EOF
|
||||||
|
# it probably will become unexplainable in a few months but so far it works:
|
||||||
|
sed '1,/^nav/d; /^ *$/,$d; s,- ,- [,; s,: ,](../Documentation/,; s,.md,.md),; s,:$,],; s,/Pinecil ,/Pinecil%20,; /^ - \[.*\]$/ s,\[,,; s,]$,,' "${yml}" >> "${md_new}"
|
||||||
|
ret=0
|
||||||
|
if [ -z "$(diff -q "${md_old}" "${md_new}")" ]; then
|
||||||
|
rm "${md_new}"
|
||||||
|
ret=0
|
||||||
|
else
|
||||||
|
mv "${md_new}" "${md_old}"
|
||||||
|
echo ""
|
||||||
|
echo "${yml} seems to be updated..."
|
||||||
|
echo "... while ${md_old} is out-of-date!"
|
||||||
|
echo ""
|
||||||
|
echo "Please, update ${md_old} in your local working copy by command:"
|
||||||
|
echo ""
|
||||||
|
echo " $ ./scripts/deploy.sh docs_readme"
|
||||||
|
echo ""
|
||||||
|
echo "And then commit & push changes to update ${md_old} in the repo:"
|
||||||
|
echo ""
|
||||||
|
echo " $ git commit ${md_old} -m \"${md_old}: update autogenerated file\" && git push"
|
||||||
|
echo ""
|
||||||
|
ret=1
|
||||||
|
fi;
|
||||||
|
return "${ret}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Helper function to check code style using clang-format & grep/sed custom parsers:
|
||||||
|
# - basic logic moved from source/Makefile : `check-style` target for better maintainance since a lot of sh script involved;
|
||||||
|
# - output goes in gcc-like error compatible format for IDEs/editors.
|
||||||
|
check_style_file()
|
||||||
|
{
|
||||||
|
ret=0
|
||||||
|
src="${1}"
|
||||||
|
test ! -f "${src}" && echo "ERROR!!! Provided file ${src} is not available to check/read!!!" && exit 1
|
||||||
|
# count lines using diff between beauty-fied file & original file to detect format issue
|
||||||
|
var="$(clang-format "$src" | diff "$src" - | wc -l)"
|
||||||
|
if [ "${var}" -ne 0 ]; then
|
||||||
|
# show full log error or, if LIST=anything provided, then show only filename of interest (implemented for debug purposes mainly)
|
||||||
|
if [ -z "${LIST}" ]; then
|
||||||
|
# sed is here only for pretty logging
|
||||||
|
clang-format "${src}" | diff "${src}" - | sed 's/^---/-------------------------------------------------------------------------------/; s/^< /--- /; s/^> /+++ /; /^[0-9].*/ s/[acd,].*$/ERROR1/; /^[0-9].*/ s,^,\n\n\n\n'"${src}"':,; /ERROR1$/ s,ERROR1$,:1: error: clang-format code style mismatch:,; '
|
||||||
|
else
|
||||||
|
echo "${src}"
|
||||||
|
fi;
|
||||||
|
ret=1
|
||||||
|
fi;
|
||||||
|
# - clang-format has neat option for { } in condition blocks but it's available only since version 15:
|
||||||
|
# * https://clang.llvm.org/docs/ClangFormatStyleOptions.html#insertbraces
|
||||||
|
# - since reference env is alpine 3.16 with clang-format 13, implement custom parser to do the similar thing here with grep:
|
||||||
|
# it used to trace missing { and } for if/else/do/while/for BUT IT'S VERY SPECULATIVE, very-very hacky & dirty.
|
||||||
|
# - if file is problematic but filename only requested make final grep in pipe silent ... UPD: make code messy but shellcheck happy
|
||||||
|
if [ -z "${LIST}" ]; then
|
||||||
|
grep -H -n -e "^ .*if .*)$" -e "^ .*else$" -e "^ .* do$" -e "^ .*while .*)$" -e "^ .*for .*)$" "${src}" | grep -v -e "^.*//" -e "^.*:.*: .*if ((.*[^)])$" | sed 's,^,\n\n,; s,: ,:1: error: probably missing { or } for conditional or loop block:\n>>>,;' | grep -e "^.*$"
|
||||||
|
else
|
||||||
|
grep -H -n -e "^ .*if .*)$" -e "^ .*else$" -e "^ .* do$" -e "^ .*while .*)$" -e "^ .*for .*)$" "${src}" | grep -v -e "^.*//" -e "^.*:.*: .*if ((.*[^)])$" | sed 's,^,\n\n,; s,: ,:1: error: probably missing { or } for conditional or loop block:\n>>>,;' | grep -q -e "^.*$"
|
||||||
|
fi;
|
||||||
|
if [ "${?}" -ne 1 ]; then
|
||||||
|
# ... and only print the filename
|
||||||
|
test -z "${LIST}" || echo "${src}"
|
||||||
|
ret=1;
|
||||||
|
fi;
|
||||||
|
return "${ret}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# check_style routine for those who too lazy to do it everytime manually
|
||||||
|
check_style_log()
|
||||||
|
{
|
||||||
|
log="source/check-style.log"
|
||||||
|
make -C source check-style 2>&1 | tee "${log}"
|
||||||
|
chmod 0666 "${log}"
|
||||||
|
sed -i -e 's,\r,,g' "${log}"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
### main
|
### main
|
||||||
|
|
||||||
docker_conf="Env.yml"
|
docker_conf="Env.yml"
|
||||||
|
|
||||||
|
# get absolute location of project root dir to make docker happy with config(s)
|
||||||
|
# (successfully tested on relatively POSIX-compliant Dash shell)
|
||||||
|
|
||||||
|
# this script
|
||||||
|
script_file="/deploy.sh"
|
||||||
|
# IronOS/scripts/deploy.sh
|
||||||
|
script_path="${PWD}"/"${0}"
|
||||||
|
# IronOS/scripts/
|
||||||
|
script_dir=${script_path%"${script_file}"}
|
||||||
|
# IronOS/
|
||||||
|
root_dir="${script_dir}/.."
|
||||||
|
# IronOS/Env.yml
|
||||||
|
docker_file="-f ${root_dir}/${docker_conf}"
|
||||||
|
|
||||||
# allow providing custom path to docker tool using DOCKER_BIN external env. var.
|
# allow providing custom path to docker tool using DOCKER_BIN external env. var.
|
||||||
# (compose sub-command must be included, i.e. DOCKER_BIN="/usr/local/bin/docker compose" ./deploy.sh)
|
# (compose sub-command must be included, i.e. DOCKER_BIN="/usr/local/bin/docker compose" ./deploy.sh)
|
||||||
|
|
||||||
@@ -42,6 +158,29 @@ if [ -n "${docker_tool}" ] && [ -z "${docker_bin}" ]; then
|
|||||||
docker_bin="${docker_tool} compose"
|
docker_bin="${docker_tool} compose"
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
|
# give function argument a name
|
||||||
|
|
||||||
|
cmd="${1}"
|
||||||
|
|
||||||
|
# if only README.md for Documentation update is required then run it & exit
|
||||||
|
|
||||||
|
if [ "docs_readme" = "${cmd}" ]; then
|
||||||
|
docs_readme
|
||||||
|
exit "${?}"
|
||||||
|
fi;
|
||||||
|
|
||||||
|
if [ "check_style_file" = "${cmd}" ]; then
|
||||||
|
check_style_file "${2}"
|
||||||
|
exit "${?}"
|
||||||
|
fi;
|
||||||
|
|
||||||
|
if [ "check_style_log" = "${cmd}" ]; then
|
||||||
|
check_style_log
|
||||||
|
exit "${?}"
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# if docker is not presented in any way show warning & exit
|
||||||
|
|
||||||
if [ -z "${docker_bin}" ]; then
|
if [ -z "${docker_bin}" ]; then
|
||||||
echo "ERROR: Can't find docker-compose nor docker tool. Please, install docker and try again."
|
echo "ERROR: Can't find docker-compose nor docker tool. Please, install docker and try again."
|
||||||
exit 1
|
exit 1
|
||||||
@@ -49,33 +188,19 @@ fi;
|
|||||||
|
|
||||||
# construct command to run
|
# construct command to run
|
||||||
|
|
||||||
cmd="${1}"
|
|
||||||
if [ -z "${cmd}" ] || [ "${cmd}" = "shell" ]; then
|
if [ -z "${cmd}" ] || [ "${cmd}" = "shell" ]; then
|
||||||
docker_cmd="run --rm builder"
|
docker_cmd="run --rm builder"
|
||||||
elif [ "${cmd}" = "build" ]; then
|
elif [ "${cmd}" = "build" ]; then
|
||||||
docker_cmd="run --rm builder /bin/bash /build/ci/buildAll.sh"
|
docker_cmd="run --rm builder make build-all OUT=${OUT}"
|
||||||
elif [ "${cmd}" = "clean" ]; then
|
elif [ "${cmd}" = "clean" ]; then
|
||||||
docker rmi ironos-builder:latest
|
docker rmi ironos-builder:latest
|
||||||
|
docker system prune --filter label=ironos-builder:latest --force
|
||||||
exit "${?}"
|
exit "${?}"
|
||||||
else
|
else
|
||||||
usage
|
usage
|
||||||
exit 1
|
exit 1
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
# get absolute location of project root dir to make docker happy with config(s)
|
|
||||||
# (successfully tested on relatively POSIX-compliant Dash shell)
|
|
||||||
|
|
||||||
# this script
|
|
||||||
script_file="/deploy.sh"
|
|
||||||
# IronOS/scripts/deploy.sh
|
|
||||||
script_path="${PWD}"/"${0}"
|
|
||||||
# IronOS/scripts/
|
|
||||||
script_dir=${script_path%"${script_file}"}
|
|
||||||
# IronOS/
|
|
||||||
root_dir="${script_dir}/.."
|
|
||||||
# IronOS/Env.yml
|
|
||||||
docker_file="-f ${root_dir}/${docker_conf}"
|
|
||||||
|
|
||||||
# change dir to project root dir & run constructed command
|
# change dir to project root dir & run constructed command
|
||||||
|
|
||||||
cd "${root_dir}" || exit 1
|
cd "${root_dir}" || exit 1
|
||||||
@@ -87,4 +212,3 @@ echo -e "\t* type \"${0} clean\" to delete created container (but not cached dat
|
|||||||
echo -e "\n====>>>> ${docker_bin} ${docker_file} ${docker_cmd}\n"
|
echo -e "\n====>>>> ${docker_bin} ${docker_file} ${docker_cmd}\n"
|
||||||
eval "${docker_bin} ${docker_file} ${docker_cmd}"
|
eval "${docker_bin} ${docker_file} ${docker_cmd}"
|
||||||
exit "${?}"
|
exit "${?}"
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ AllowShortFunctionsOnASingleLine: All
|
|||||||
AllowShortLambdasOnASingleLine: All
|
AllowShortLambdasOnASingleLine: All
|
||||||
AllowShortIfStatementsOnASingleLine: Never
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
AllowShortLoopsOnASingleLine: false
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AllowShortEnumsOnASingleLine: false ### <<< Keeps enums as is
|
||||||
AlwaysBreakAfterDefinitionReturnType: None
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
AlwaysBreakAfterReturnType: None
|
AlwaysBreakAfterReturnType: None
|
||||||
AlwaysBreakBeforeMultilineStrings: false
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
|||||||
@@ -3,9 +3,11 @@
|
|||||||
#include "BSP_Power.h"
|
#include "BSP_Power.h"
|
||||||
#include "BSP_QC.h"
|
#include "BSP_QC.h"
|
||||||
#include "Defines.h"
|
#include "Defines.h"
|
||||||
|
#include "Types.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BSP.h -- Board Support
|
* BSP.h -- Board Support
|
||||||
*
|
*
|
||||||
@@ -101,6 +103,11 @@ void setBuzzer(bool on);
|
|||||||
// For example, on the MHP30 this is used to figure out the resistance of the hotplate
|
// For example, on the MHP30 this is used to figure out the resistance of the hotplate
|
||||||
uint8_t preStartChecks();
|
uint8_t preStartChecks();
|
||||||
uint8_t preStartChecksDone();
|
uint8_t preStartChecksDone();
|
||||||
|
|
||||||
|
// Check if the tip or output mosfet is shorted (if possible)
|
||||||
|
bool isTipShorted();
|
||||||
|
// Show the boot logo
|
||||||
|
void showBootLogo(void);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// BSP mapping functions
|
// BSP mapping functions
|
||||||
|
|
||||||
#include "BSP.h"
|
#include "BSP.h"
|
||||||
|
#include "BootLogo.h"
|
||||||
#include "I2C_Wrapper.hpp"
|
#include "I2C_Wrapper.hpp"
|
||||||
#include "Pins.h"
|
#include "Pins.h"
|
||||||
#include "Setup.h"
|
#include "Setup.h"
|
||||||
@@ -472,4 +473,6 @@ uint64_t getDeviceID() {
|
|||||||
uint8_t preStartChecksDone() { return 1; }
|
uint8_t preStartChecksDone() { return 1; }
|
||||||
|
|
||||||
uint8_t getTipThermalMass() { return TIP_THERMAL_MASS; }
|
uint8_t getTipThermalMass() { return TIP_THERMAL_MASS; }
|
||||||
uint8_t getTipInertia() { return TIP_THERMAL_MASS; }
|
uint8_t getTipInertia() { return TIP_THERMAL_MASS; }
|
||||||
|
|
||||||
|
void showBootLogo(void) { BootLogo::handleShowingLogo((uint8_t *)FLASH_LOGOADDR); }
|
||||||
|
|||||||
@@ -18,4 +18,5 @@ void power_check() {
|
|||||||
|
|
||||||
bool getIsPoweredByDCIN() { return false; }
|
bool getIsPoweredByDCIN() { return false; }
|
||||||
|
|
||||||
uint8_t getTipResistanceX10() { return TIP_RESISTANCE; }
|
uint8_t getTipResistanceX10() { return TIP_RESISTANCE; }
|
||||||
|
bool isTipShorted() { return false; }
|
||||||
@@ -47,9 +47,9 @@ void Setup_HAL() {
|
|||||||
MX_IWDG_Init();
|
MX_IWDG_Init();
|
||||||
HAL_ADC_Start(&hadc2);
|
HAL_ADC_Start(&hadc2);
|
||||||
HAL_ADCEx_MultiModeStart_DMA(&hadc1, ADCReadings,
|
HAL_ADCEx_MultiModeStart_DMA(&hadc1, ADCReadings,
|
||||||
(ADC_SAMPLES * ADC_CHANNELS)); // start DMA of normal readings
|
(ADC_SAMPLES * ADC_CHANNELS)); // start DMA of normal readings
|
||||||
// HAL_ADCEx_InjectedStart(&hadc1); // enable injected readings
|
// HAL_ADCEx_InjectedStart(&hadc1); // enable injected readings
|
||||||
// HAL_ADCEx_InjectedStart(&hadc2); // enable injected readings
|
// HAL_ADCEx_InjectedStart(&hadc2); // enable injected readings
|
||||||
}
|
}
|
||||||
|
|
||||||
// channel 0 -> temperature sensor, 1-> VIN, 2-> tip
|
// channel 0 -> temperature sensor, 1-> VIN, 2-> tip
|
||||||
@@ -154,8 +154,9 @@ static void MX_ADC1_Init(void) {
|
|||||||
|
|
||||||
SET_BIT(hadc1.Instance->CR1, (ADC_CR1_EOSIE)); // Enable end of Normal
|
SET_BIT(hadc1.Instance->CR1, (ADC_CR1_EOSIE)); // Enable end of Normal
|
||||||
// Run ADC internal calibration
|
// Run ADC internal calibration
|
||||||
while (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK)
|
while (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK) {
|
||||||
;
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ADC2 init function */
|
/* ADC2 init function */
|
||||||
@@ -191,8 +192,9 @@ static void MX_ADC2_Init(void) {
|
|||||||
HAL_ADC_ConfigChannel(&hadc2, &sConfig);
|
HAL_ADC_ConfigChannel(&hadc2, &sConfig);
|
||||||
|
|
||||||
// Run ADC internal calibration
|
// Run ADC internal calibration
|
||||||
while (HAL_ADCEx_Calibration_Start(&hadc2) != HAL_OK)
|
while (HAL_ADCEx_Calibration_Start(&hadc2) != HAL_OK) {
|
||||||
;
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* I2C1 init function */
|
/* I2C1 init function */
|
||||||
static void MX_I2C1_Init(void) {
|
static void MX_I2C1_Init(void) {
|
||||||
|
|||||||
@@ -6,10 +6,12 @@
|
|||||||
*/
|
*/
|
||||||
#include "Setup.h"
|
#include "Setup.h"
|
||||||
#include "TipThermoModel.h"
|
#include "TipThermoModel.h"
|
||||||
|
#include "Types.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
extern uint16_t tipSenseResistancex10Ohms;
|
|
||||||
uint32_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) {
|
extern uint16_t tipSenseResistancex10Ohms;
|
||||||
|
TemperatureType_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) {
|
||||||
// For the MHP30, we are mimicing the original code and using the resistor fitted to the base of the heater head,
|
// For the MHP30, we are mimicing the original code and using the resistor fitted to the base of the heater head,
|
||||||
// this is measured at boot in pid task and in the disconnected tip check if tip is removed
|
// this is measured at boot in pid task and in the disconnected tip check if tip is removed
|
||||||
if (tipSenseResistancex10Ohms > 900 && tipSenseResistancex10Ohms <= 1100) {
|
if (tipSenseResistancex10Ohms > 900 && tipSenseResistancex10Ohms <= 1100) {
|
||||||
|
|||||||
@@ -29,8 +29,8 @@
|
|||||||
* How many seconds/minutes we wait until going to sleep/shutdown.
|
* How many seconds/minutes we wait until going to sleep/shutdown.
|
||||||
* Values -> SLEEP_TIME * 10; i.e. 5*10 = 50 Seconds!
|
* Values -> SLEEP_TIME * 10; i.e. 5*10 = 50 Seconds!
|
||||||
*/
|
*/
|
||||||
#define SLEEP_TIME 5 // x10 Seconds
|
#define SLEEP_TIME 5 // x10 Seconds
|
||||||
#define SHUTDOWN_TIME 10 // Minutes
|
#define SHUTDOWN_TIME 0 // Minutes -- Default shutdown to being off
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Auto start off for safety.
|
* Auto start off for safety.
|
||||||
@@ -164,13 +164,13 @@
|
|||||||
#define HARDWARE_MAX_WATTAGE_X10 650
|
#define HARDWARE_MAX_WATTAGE_X10 650
|
||||||
#define TIP_THERMAL_MASS 65 // TODO, needs refinement
|
#define TIP_THERMAL_MASS 65 // TODO, needs refinement
|
||||||
#define TIP_RESISTANCE 60 // x10 ohms, ~6 typical
|
#define TIP_RESISTANCE 60 // x10 ohms, ~6 typical
|
||||||
#endif /* MHP30 */
|
#endif /* MHP30 */
|
||||||
|
|
||||||
#ifdef ACCEL_EXITS_ON_MOVEMENT
|
#ifdef ACCEL_EXITS_ON_MOVEMENT
|
||||||
#define NO_SLEEP_MODE
|
#define NO_SLEEP_MODE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FLASH_LOGOADDR (0x08000000 + (62 * 1024))
|
#define FLASH_LOGOADDR (0x08000000 + (126 * 1024))
|
||||||
#define SETTINGS_START_PAGE (0x08000000 + (127 * 1024))
|
#define SETTINGS_START_PAGE (0x08000000 + (127 * 1024))
|
||||||
|
|
||||||
#endif /* CONFIGURATION_H_ */
|
#endif /* CONFIGURATION_H_ */
|
||||||
|
|||||||
@@ -30,9 +30,9 @@ void flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
|
|||||||
HAL_FLASH_Unlock();
|
HAL_FLASH_Unlock();
|
||||||
for (uint16_t i = 0; i < (length / 2); i++) {
|
for (uint16_t i = 0; i < (length / 2); i++) {
|
||||||
resetWatchdog();
|
resetWatchdog();
|
||||||
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, SETTINGS_START_PAGE+ (i*sizeof(uint16_t)), data[i]);
|
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, SETTINGS_START_PAGE + (i * sizeof(uint16_t)), data[i]);
|
||||||
}
|
}
|
||||||
HAL_FLASH_Lock();
|
HAL_FLASH_Lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void flash_read_buffer(uint8_t *buffer, const uint16_t length) { memcpy(buffer, (uint8_t*)SETTINGS_START_PAGE, length); }
|
void flash_read_buffer(uint8_t *buffer, const uint16_t length) { memcpy(buffer, (uint8_t *)SETTINGS_START_PAGE, length); }
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// BSP mapping functions
|
// BSP mapping functions
|
||||||
|
|
||||||
#include "BSP.h"
|
#include "BSP.h"
|
||||||
|
#include "BootLogo.h"
|
||||||
#include "I2C_Wrapper.hpp"
|
#include "I2C_Wrapper.hpp"
|
||||||
#include "Pins.h"
|
#include "Pins.h"
|
||||||
#include "Setup.h"
|
#include "Setup.h"
|
||||||
@@ -284,6 +285,7 @@ void performTipResistanceSampleReading() {
|
|||||||
|
|
||||||
tipResistanceReadingSlot++;
|
tipResistanceReadingSlot++;
|
||||||
}
|
}
|
||||||
|
bool tipShorted = false;
|
||||||
void FinishMeasureTipResistance() {
|
void FinishMeasureTipResistance() {
|
||||||
|
|
||||||
// Otherwise we now have the 4 samples;
|
// Otherwise we now have the 4 samples;
|
||||||
@@ -303,6 +305,8 @@ void FinishMeasureTipResistance() {
|
|||||||
// return; // Change nothing as probably disconnected tip
|
// return; // Change nothing as probably disconnected tip
|
||||||
tipResistanceReadingSlot = lastTipResistance = 0;
|
tipResistanceReadingSlot = lastTipResistance = 0;
|
||||||
return;
|
return;
|
||||||
|
} else if (reading < 200) {
|
||||||
|
tipShorted = true;
|
||||||
} else if (reading < 800) {
|
} else if (reading < 800) {
|
||||||
newRes = 62;
|
newRes = 62;
|
||||||
} else {
|
} else {
|
||||||
@@ -372,7 +376,7 @@ uint64_t getDeviceID() {
|
|||||||
|
|
||||||
uint8_t preStartChecksDone() {
|
uint8_t preStartChecksDone() {
|
||||||
#ifdef TIP_RESISTANCE_SENSE_Pin
|
#ifdef TIP_RESISTANCE_SENSE_Pin
|
||||||
return (lastTipResistance == 0 || tipResistanceReadingSlot < numTipResistanceReadings || tipMeasurementOccuring) ? 0 : 1;
|
return (lastTipResistance == 0 || tipResistanceReadingSlot < numTipResistanceReadings || tipMeasurementOccuring || tipShorted) ? 0 : 1;
|
||||||
#else
|
#else
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
@@ -387,7 +391,11 @@ uint8_t getTipResistanceX10() {
|
|||||||
return TIP_RESISTANCE;
|
return TIP_RESISTANCE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef TIP_RESISTANCE_SENSE_Pin
|
||||||
|
bool isTipShorted() { return tipShorted; }
|
||||||
|
#else
|
||||||
|
bool isTipShorted() { return false; }
|
||||||
|
#endif
|
||||||
uint8_t getTipThermalMass() {
|
uint8_t getTipThermalMass() {
|
||||||
#ifdef TIP_RESISTANCE_SENSE_Pin
|
#ifdef TIP_RESISTANCE_SENSE_Pin
|
||||||
if (lastTipResistance >= 80) {
|
if (lastTipResistance >= 80) {
|
||||||
@@ -407,4 +415,6 @@ uint8_t getTipInertia() {
|
|||||||
#else
|
#else
|
||||||
return TIP_THERMAL_MASS;
|
return TIP_THERMAL_MASS;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void showBootLogo(void) { BootLogo::handleShowingLogo((uint8_t *)FLASH_LOGOADDR); }
|
||||||
|
|||||||
@@ -229,8 +229,9 @@ static void MX_ADC1_Init(void) {
|
|||||||
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
|
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
|
||||||
SET_BIT(hadc1.Instance->CR1, (ADC_CR1_JEOCIE)); // Enable end of injected conv irq
|
SET_BIT(hadc1.Instance->CR1, (ADC_CR1_JEOCIE)); // Enable end of injected conv irq
|
||||||
// Run ADC internal calibration
|
// Run ADC internal calibration
|
||||||
while (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK)
|
while (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK) {
|
||||||
;
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ADC2 init function */
|
/* ADC2 init function */
|
||||||
@@ -272,8 +273,9 @@ static void MX_ADC2_Init(void) {
|
|||||||
HAL_ADCEx_InjectedConfigChannel(&hadc2, &sConfigInjected);
|
HAL_ADCEx_InjectedConfigChannel(&hadc2, &sConfigInjected);
|
||||||
|
|
||||||
// Run ADC internal calibration
|
// Run ADC internal calibration
|
||||||
while (HAL_ADCEx_Calibration_Start(&hadc2) != HAL_OK)
|
while (HAL_ADCEx_Calibration_Start(&hadc2) != HAL_OK) {
|
||||||
;
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* I2C1 init function */
|
/* I2C1 init function */
|
||||||
static void MX_I2C1_Init(void) {
|
static void MX_I2C1_Init(void) {
|
||||||
|
|||||||
@@ -127,4 +127,4 @@ const int32_t uVtoDegC[] = {
|
|||||||
#endif
|
#endif
|
||||||
const int uVtoDegCItems = sizeof(uVtoDegC) / (2 * sizeof(uVtoDegC[0]));
|
const int uVtoDegCItems = sizeof(uVtoDegC) / (2 * sizeof(uVtoDegC[0]));
|
||||||
|
|
||||||
uint32_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { return Utils::InterpolateLookupTable(uVtoDegC, uVtoDegCItems, tipuVDelta); }
|
TemperatureType_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { return Utils::InterpolateLookupTable(uVtoDegC, uVtoDegCItems, tipuVDelta); }
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
|
|
||||||
void flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
|
void flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
|
||||||
FLASH_EraseInitTypeDef pEraseInit;
|
FLASH_EraseInitTypeDef pEraseInit;
|
||||||
pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
|
pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||||
|
|||||||
@@ -208,9 +208,7 @@ static void prvTaskExitError(void) {
|
|||||||
// therefore not output an 'unreachable code' warning for code that appears
|
// therefore not output an 'unreachable code' warning for code that appears
|
||||||
// after it. */
|
// after it. */
|
||||||
// }
|
// }
|
||||||
for(;;){
|
for (;;) {}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include <I2C_Wrapper.hpp>
|
#include <I2C_Wrapper.hpp>
|
||||||
|
|
||||||
|
|
||||||
void preRToSInit() {
|
void preRToSInit() {
|
||||||
/* Reset of all peripherals, Initializes the Flash interface and the Systick.
|
/* Reset of all peripherals, Initializes the Flash interface and the Systick.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// BSP mapping functions
|
// BSP mapping functions
|
||||||
|
|
||||||
#include "BSP.h"
|
#include "BSP.h"
|
||||||
|
#include "BootLogo.h"
|
||||||
#include "I2C_Wrapper.hpp"
|
#include "I2C_Wrapper.hpp"
|
||||||
#include "IRQ.h"
|
#include "IRQ.h"
|
||||||
#include "Pins.h"
|
#include "Pins.h"
|
||||||
@@ -93,8 +94,10 @@ uint8_t preStartChecks() { return 1; }
|
|||||||
uint64_t getDeviceID() { return dbg_id_get(); }
|
uint64_t getDeviceID() { return dbg_id_get(); }
|
||||||
|
|
||||||
uint8_t getTipResistanceX10() { return TIP_RESISTANCE; }
|
uint8_t getTipResistanceX10() { return TIP_RESISTANCE; }
|
||||||
|
bool isTipShorted() { return false; }
|
||||||
uint8_t preStartChecksDone() { return 1; }
|
uint8_t preStartChecksDone() { return 1; }
|
||||||
|
|
||||||
uint8_t getTipThermalMass() { return TIP_THERMAL_MASS; }
|
uint8_t getTipThermalMass() { return TIP_THERMAL_MASS; }
|
||||||
uint8_t getTipInertia() { return TIP_THERMAL_MASS; }
|
uint8_t getTipInertia() { return TIP_THERMAL_MASS; }
|
||||||
|
|
||||||
|
void showBootLogo(void) { BootLogo::handleShowingLogo((uint8_t *)FLASH_LOGOADDR); }
|
||||||
|
|||||||
@@ -23,13 +23,13 @@ void log_system_state(int32_t PWMWattsx10) {
|
|||||||
// Tip_Temp_C,Handle_Temp_C,Output_Power_Wattx10,PWM,Tip_Raw\r\n
|
// Tip_Temp_C,Handle_Temp_C,Output_Power_Wattx10,PWM,Tip_Raw\r\n
|
||||||
// 3+1+3+1+3+1+3+1+5+2 = 23, so sizing at 32 for now
|
// 3+1+3+1+3+1+3+1+5+2 = 23, so sizing at 32 for now
|
||||||
|
|
||||||
outputLength = snprintf(uartOutputBuffer, uartOutputBufferLength, "%lu,%u,%li,%u,%lu\r\n", //
|
outputLength = snprintf(uartOutputBuffer, uartOutputBufferLength, "%lu,%u,%li,%u,%lu\r\n",
|
||||||
TipThermoModel::getTipInC(false), // Tip temp in C
|
TipThermoModel::getTipInC(false), // Tip temp in C
|
||||||
getHandleTemperature(0), // Handle temp in C X10
|
getHandleTemperature(0), // Handle temp in C X10
|
||||||
PWMWattsx10, // Output Wattage
|
PWMWattsx10, // Output Wattage
|
||||||
pendingPWM, // PWM
|
pendingPWM, // PWM
|
||||||
TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0), true) // Tip temp in uV
|
TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0), true) // Tip temp in uV
|
||||||
);
|
);
|
||||||
|
|
||||||
// Now print this out the uart via IRQ (DMA cant be used as oled has it)
|
// Now print this out the uart via IRQ (DMA cant be used as oled has it)
|
||||||
currentOutputPos = 0;
|
currentOutputPos = 0;
|
||||||
|
|||||||
@@ -40,18 +40,19 @@ enum class i2c_step {
|
|||||||
Wait_stop, // Wait for stop to send and we are done
|
Wait_stop, // Wait for stop to send and we are done
|
||||||
Done, // Finished
|
Done, // Finished
|
||||||
Error_occured, // Error occured on the bus
|
Error_occured, // Error occured on the bus
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct i2c_state {
|
struct i2c_state {
|
||||||
i2c_step currentStep;
|
i2c_step currentStep;
|
||||||
bool isMemoryWrite;
|
bool isMemoryWrite;
|
||||||
bool wakePart;
|
bool wakePart;
|
||||||
uint8_t deviceAddress;
|
uint8_t deviceAddress;
|
||||||
uint8_t memoryAddress;
|
uint8_t memoryAddress;
|
||||||
uint8_t * buffer;
|
uint8_t *buffer;
|
||||||
uint16_t numberOfBytes;
|
uint16_t numberOfBytes;
|
||||||
dma_parameter_struct dma_init_struct;
|
dma_parameter_struct dma_init_struct;
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c_state currentState;
|
i2c_state currentState;
|
||||||
|
|
||||||
void perform_i2c_step() {
|
void perform_i2c_step() {
|
||||||
|
|||||||
@@ -69,4 +69,4 @@ const int32_t uVtoDegC[] = {
|
|||||||
|
|
||||||
const int uVtoDegCItems = sizeof(uVtoDegC) / (2 * sizeof(uVtoDegC[0]));
|
const int uVtoDegCItems = sizeof(uVtoDegC) / (2 * sizeof(uVtoDegC[0]));
|
||||||
|
|
||||||
uint32_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { return Utils::InterpolateLookupTable(uVtoDegC, uVtoDegCItems, tipuVDelta); }
|
TemperatureType_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { return Utils::InterpolateLookupTable(uVtoDegC, uVtoDegCItems, tipuVDelta); }
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// BSP mapping functions
|
// BSP mapping functions
|
||||||
|
|
||||||
#include "BSP.h"
|
#include "BSP.h"
|
||||||
|
#include "BootLogo.h"
|
||||||
#include "I2C_Wrapper.hpp"
|
#include "I2C_Wrapper.hpp"
|
||||||
#include "IRQ.h"
|
#include "IRQ.h"
|
||||||
#include "Pins.h"
|
#include "Pins.h"
|
||||||
@@ -10,13 +11,14 @@
|
|||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "crc32.h"
|
#include "crc32.h"
|
||||||
|
#include "hal_flash.h"
|
||||||
#include "history.hpp"
|
#include "history.hpp"
|
||||||
#include "main.hpp"
|
#include "main.hpp"
|
||||||
|
|
||||||
// These control the period's of time used for the PWM
|
// These control the period's of time used for the PWM
|
||||||
const uint16_t powerPWM = 255;
|
const uint16_t powerPWM = 255;
|
||||||
const uint8_t holdoffTicks = 25; // This is the tick delay before temp measure starts (i.e. time for op-amp recovery)
|
uint8_t holdoffTicks = 25; // This is the tick delay before temp measure starts (i.e. time for op-amp recovery)
|
||||||
const uint8_t tempMeasureTicks = 25;
|
uint8_t tempMeasureTicks = 25;
|
||||||
|
|
||||||
uint16_t totalPWM = 255; // Total length of the cycle's ticks
|
uint16_t totalPWM = 255; // Total length of the cycle's ticks
|
||||||
|
|
||||||
@@ -160,13 +162,13 @@ uint8_t getTipResistanceX10() {
|
|||||||
|
|
||||||
uint8_t getTipThermalMass() {
|
uint8_t getTipThermalMass() {
|
||||||
if (lastTipResistance >= 80) {
|
if (lastTipResistance >= 80) {
|
||||||
return TIP_THERMAL_MASS;
|
return 65;
|
||||||
}
|
}
|
||||||
return 45;
|
return 45;
|
||||||
}
|
}
|
||||||
uint8_t getTipInertia() {
|
uint8_t getTipInertia() {
|
||||||
if (lastTipResistance >= 80) {
|
if (lastTipResistance >= 80) {
|
||||||
return TIP_THERMAL_MASS;
|
return 90;
|
||||||
}
|
}
|
||||||
return 10;
|
return 10;
|
||||||
}
|
}
|
||||||
@@ -187,7 +189,7 @@ void performTipResistanceSampleReading() {
|
|||||||
gpio_write(TIP_RESISTANCE_SENSE, tipResistanceReadingSlot == 0);
|
gpio_write(TIP_RESISTANCE_SENSE, tipResistanceReadingSlot == 0);
|
||||||
tipResistanceReadingSlot++;
|
tipResistanceReadingSlot++;
|
||||||
}
|
}
|
||||||
|
bool tipShorted = false;
|
||||||
void FinishMeasureTipResistance() {
|
void FinishMeasureTipResistance() {
|
||||||
|
|
||||||
// Otherwise we now have the 4 samples;
|
// Otherwise we now have the 4 samples;
|
||||||
@@ -206,6 +208,8 @@ void FinishMeasureTipResistance() {
|
|||||||
uint8_t newRes = 0;
|
uint8_t newRes = 0;
|
||||||
if (reading > 8000) {
|
if (reading > 8000) {
|
||||||
// return; // Change nothing as probably disconnected tip
|
// return; // Change nothing as probably disconnected tip
|
||||||
|
} else if (reading < 500) {
|
||||||
|
tipShorted = true;
|
||||||
} else if (reading < 4000) {
|
} else if (reading < 4000) {
|
||||||
newRes = 62;
|
newRes = 62;
|
||||||
} else {
|
} else {
|
||||||
@@ -215,8 +219,8 @@ void FinishMeasureTipResistance() {
|
|||||||
}
|
}
|
||||||
volatile bool tipMeasurementOccuring = true;
|
volatile bool tipMeasurementOccuring = true;
|
||||||
volatile TickType_t nextTipMeasurement = 100;
|
volatile TickType_t nextTipMeasurement = 100;
|
||||||
|
bool isTipShorted() { return tipShorted; }
|
||||||
void performTipMeasurementStep() {
|
void performTipMeasurementStep() {
|
||||||
|
|
||||||
// Wait 100ms for settle time
|
// Wait 100ms for settle time
|
||||||
if (xTaskGetTickCount() < (nextTipMeasurement)) {
|
if (xTaskGetTickCount() < (nextTipMeasurement)) {
|
||||||
@@ -238,7 +242,8 @@ uint8_t preStartChecks() {
|
|||||||
performTipMeasurementStep();
|
performTipMeasurementStep();
|
||||||
return preStartChecksDone();
|
return preStartChecksDone();
|
||||||
}
|
}
|
||||||
uint8_t preStartChecksDone() { return (lastTipResistance == 0 || tipResistanceReadingSlot < numTipResistanceReadings || tipMeasurementOccuring) ? 0 : 1; }
|
// If we are still measuring the tip; or tip is shorted; prevent heating
|
||||||
|
uint8_t preStartChecksDone() { return (lastTipResistance == 0 || tipResistanceReadingSlot < numTipResistanceReadings || tipMeasurementOccuring || tipShorted) ? 0 : 1; }
|
||||||
|
|
||||||
// Return hardware unique ID if possible
|
// Return hardware unique ID if possible
|
||||||
uint64_t getDeviceID() {
|
uint64_t getDeviceID() {
|
||||||
@@ -278,4 +283,11 @@ uint8_t getDeviceValidationStatus() {
|
|||||||
uint32_t programmedHash = EF_Ctrl_Get_Key_Slot_w1();
|
uint32_t programmedHash = EF_Ctrl_Get_Key_Slot_w1();
|
||||||
uint32_t computedHash = gethash();
|
uint32_t computedHash = gethash();
|
||||||
return programmedHash == computedHash ? 0 : 1;
|
return programmedHash == computedHash ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void showBootLogo(void) {
|
||||||
|
uint8_t scratch[1024];
|
||||||
|
flash_read(FLASH_LOGOADDR - 0x23000000, scratch, 1024);
|
||||||
|
|
||||||
|
BootLogo::handleShowingLogo(scratch);
|
||||||
|
}
|
||||||
|
|||||||
@@ -40,8 +40,9 @@ bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t read_address, uint8_t *p_b
|
|||||||
i2cCfg.data = p_buffer;
|
i2cCfg.data = p_buffer;
|
||||||
i2cCfg.subAddrSize = 1; // one byte address
|
i2cCfg.subAddrSize = 1; // one byte address
|
||||||
|
|
||||||
taskENTER_CRITICAL();
|
taskENTER_CRITICAL();
|
||||||
err = I2C_MasterReceiveBlocking(I2C0_ID, &i2cCfg);
|
/* --------------- */
|
||||||
|
err = I2C_MasterReceiveBlocking(I2C0_ID, &i2cCfg);
|
||||||
taskEXIT_CRITICAL();
|
taskEXIT_CRITICAL();
|
||||||
bool res = err == SUCCESS;
|
bool res = err == SUCCESS;
|
||||||
if (!res) {
|
if (!res) {
|
||||||
@@ -63,8 +64,10 @@ bool FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, uint8_t *p_bu
|
|||||||
i2cCfg.dataSize = number_of_byte;
|
i2cCfg.dataSize = number_of_byte;
|
||||||
i2cCfg.data = p_buffer;
|
i2cCfg.data = p_buffer;
|
||||||
i2cCfg.subAddrSize = 1; // one byte address
|
i2cCfg.subAddrSize = 1; // one byte address
|
||||||
taskENTER_CRITICAL();
|
|
||||||
err = I2C_MasterSendBlocking(I2C0_ID, &i2cCfg);
|
taskENTER_CRITICAL();
|
||||||
|
/* --------------- */
|
||||||
|
err = I2C_MasterSendBlocking(I2C0_ID, &i2cCfg);
|
||||||
taskEXIT_CRITICAL();
|
taskEXIT_CRITICAL();
|
||||||
bool res = err == SUCCESS;
|
bool res = err == SUCCESS;
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ extern "C" {
|
|||||||
}
|
}
|
||||||
void start_PWM_output(void);
|
void start_PWM_output(void);
|
||||||
|
|
||||||
#define ADC_Filter_Smooth 4
|
#define ADC_Filter_Smooth 1
|
||||||
history<uint16_t, ADC_Filter_Smooth> ADC_Vin;
|
history<uint16_t, ADC_Filter_Smooth> ADC_Vin;
|
||||||
history<uint16_t, ADC_Filter_Smooth> ADC_Temp;
|
history<uint16_t, ADC_Filter_Smooth> ADC_Temp;
|
||||||
history<uint16_t, ADC_Filter_Smooth> ADC_Tip;
|
history<uint16_t, ADC_Filter_Smooth> ADC_Tip;
|
||||||
@@ -67,19 +67,21 @@ void adc_fifo_irq(void) {
|
|||||||
ADC_IntClr(ADC_INT_ALL);
|
ADC_IntClr(ADC_INT_ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool fastPWM = false;
|
volatile bool inFastPWMMode = false;
|
||||||
static void switchToFastPWM(void);
|
|
||||||
|
|
||||||
volatile uint16_t PWMSafetyTimer = 0;
|
static void switchToFastPWM(void);
|
||||||
volatile uint8_t pendingPWM = 0;
|
static void switchToSlowPWM(void);
|
||||||
volatile bool lastPeriodWasFast = false;
|
|
||||||
|
volatile uint16_t PWMSafetyTimer = 0;
|
||||||
|
volatile uint8_t pendingPWM = 0;
|
||||||
|
volatile bool pendingNextPeriodIsFast = false;
|
||||||
|
|
||||||
void start_PWM_output(void) {
|
void start_PWM_output(void) {
|
||||||
|
|
||||||
if (PWMSafetyTimer) {
|
if (PWMSafetyTimer) {
|
||||||
PWMSafetyTimer--;
|
PWMSafetyTimer--;
|
||||||
if (lastPeriodWasFast != fastPWM) {
|
if (pendingNextPeriodIsFast != inFastPWMMode) {
|
||||||
if (fastPWM) {
|
if (pendingNextPeriodIsFast) {
|
||||||
switchToFastPWM();
|
switchToFastPWM();
|
||||||
} else {
|
} else {
|
||||||
switchToSlowPWM();
|
switchToSlowPWM();
|
||||||
@@ -96,6 +98,7 @@ void start_PWM_output(void) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PWM_Channel_Disable(PWM_Channel);
|
PWM_Channel_Disable(PWM_Channel);
|
||||||
|
switchToFastPWM();
|
||||||
}
|
}
|
||||||
TIMER_Enable(TIMER_CH0);
|
TIMER_Enable(TIMER_CH0);
|
||||||
}
|
}
|
||||||
@@ -108,43 +111,47 @@ void timer0_comp0_callback(void) {
|
|||||||
void timer0_comp1_callback(void) { PWM_Channel_Disable(PWM_Channel); } // Trigged at end of output cycle; turn off the tip PWM
|
void timer0_comp1_callback(void) { PWM_Channel_Disable(PWM_Channel); } // Trigged at end of output cycle; turn off the tip PWM
|
||||||
|
|
||||||
void switchToFastPWM(void) {
|
void switchToFastPWM(void) {
|
||||||
fastPWM = true;
|
inFastPWMMode = true;
|
||||||
totalPWM = powerPWM + tempMeasureTicks + holdoffTicks;
|
holdoffTicks = 10;
|
||||||
|
tempMeasureTicks = 10;
|
||||||
|
totalPWM = powerPWM + tempMeasureTicks + holdoffTicks;
|
||||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
|
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
|
||||||
|
|
||||||
// ~10Hz
|
// ~10Hz
|
||||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + holdoffTicks);
|
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + holdoffTicks);
|
||||||
// Set divider to 11
|
// Set divider to 10 ~= 10.5Hz
|
||||||
|
|
||||||
uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR);
|
uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR);
|
||||||
|
|
||||||
tmpVal = BL_SET_REG_BITS_VAL(tmpVal, TIMER_TCDR2, 11);
|
tmpVal = BL_SET_REG_BITS_VAL(tmpVal, TIMER_TCDR2, 10);
|
||||||
|
|
||||||
BL_WR_REG(TIMER_BASE, TIMER_TCDR, tmpVal);
|
BL_WR_REG(TIMER_BASE, TIMER_TCDR, tmpVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void switchToSlowPWM(void) {
|
void switchToSlowPWM(void) {
|
||||||
// 5Hz
|
// 5Hz
|
||||||
fastPWM = false;
|
inFastPWMMode = false;
|
||||||
totalPWM = powerPWM + tempMeasureTicks / 2 + holdoffTicks / 2;
|
holdoffTicks = 5;
|
||||||
|
tempMeasureTicks = 5;
|
||||||
|
totalPWM = powerPWM + tempMeasureTicks + holdoffTicks;
|
||||||
|
|
||||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
|
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
|
||||||
// Adjust ADC
|
// Adjust ADC
|
||||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + (holdoffTicks / 2));
|
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + holdoffTicks);
|
||||||
|
|
||||||
// Set divider to 22
|
// Set divider to 22
|
||||||
|
|
||||||
uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR);
|
uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR);
|
||||||
|
|
||||||
tmpVal = BL_SET_REG_BITS_VAL(tmpVal, TIMER_TCDR2, 22);
|
tmpVal = BL_SET_REG_BITS_VAL(tmpVal, TIMER_TCDR2, 20);
|
||||||
|
|
||||||
BL_WR_REG(TIMER_BASE, TIMER_TCDR, tmpVal);
|
BL_WR_REG(TIMER_BASE, TIMER_TCDR, tmpVal);
|
||||||
}
|
}
|
||||||
void setTipPWM(const uint8_t pulse, const bool shouldUseFastModePWM) {
|
void setTipPWM(const uint8_t pulse, const bool shouldUseFastModePWM) {
|
||||||
PWMSafetyTimer = 10; // This is decremented in the handler for PWM so that the tip pwm is
|
PWMSafetyTimer = 10; // This is decremented in the handler for PWM so that the tip pwm is
|
||||||
// disabled if the PID task is not scheduled often enough.
|
// disabled if the PID task is not scheduled often enough.
|
||||||
pendingPWM = pulse;
|
pendingPWM = pulse;
|
||||||
fastPWM = shouldUseFastModePWM;
|
pendingNextPeriodIsFast = shouldUseFastModePWM;
|
||||||
}
|
}
|
||||||
extern osThreadId POWTaskHandle;
|
extern osThreadId POWTaskHandle;
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ void timer0_comp1_callback(void);
|
|||||||
void timer0_comp2_callback(void);
|
void timer0_comp2_callback(void);
|
||||||
void adc_fifo_irq(void);
|
void adc_fifo_irq(void);
|
||||||
void GPIO_IRQHandler(void);
|
void GPIO_IRQHandler(void);
|
||||||
void switchToSlowPWM(void);
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -80,21 +80,20 @@
|
|||||||
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 )
|
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 )
|
||||||
#error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0
|
#error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Block sizes must not get too small. */
|
/* Block sizes must not get too small. */
|
||||||
#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) )
|
#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) )
|
||||||
|
|
||||||
/* Assumes 8bit bytes! */
|
/* Assumes 8bit bytes! */
|
||||||
#define heapBITS_PER_BYTE ( ( size_t ) 8 )
|
#define heapBITS_PER_BYTE ( ( size_t ) 8 )
|
||||||
|
|
||||||
/* Define the linked list structure. This is used to link free blocks in order
|
/* Define the linked list structure. This is used to link free blocks in order
|
||||||
* of their memory address. */
|
* of their memory address. */
|
||||||
typedef struct A_BLOCK_LINK
|
typedef struct A_BLOCK_LINK {
|
||||||
{
|
struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */
|
||||||
struct A_BLOCK_LINK * pxNextFreeBlock; /*<< The next free block in the list. */
|
size_t xBlockSize; /*<< The size of the free block. */
|
||||||
size_t xBlockSize; /*<< The size of the free block. */
|
|
||||||
} BlockLink_t;
|
} BlockLink_t;
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
@@ -105,7 +104,7 @@ typedef struct A_BLOCK_LINK
|
|||||||
* the block in front it and/or the block behind it if the memory blocks are
|
* the block in front it and/or the block behind it if the memory blocks are
|
||||||
* adjacent to each other.
|
* adjacent to each other.
|
||||||
*/
|
*/
|
||||||
static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert );
|
static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert );
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
@@ -114,14 +113,14 @@ static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert );
|
|||||||
static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK );
|
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. */
|
/* Create a couple of list links to mark the start and end of the list. */
|
||||||
static BlockLink_t xStart, * pxEnd = NULL;
|
static BlockLink_t xStart, *pxEnd = NULL;
|
||||||
|
|
||||||
/* Keeps track of the number of calls to allocate and free memory as well as the
|
/* 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. */
|
* number of free bytes remaining, but says nothing about fragmentation. */
|
||||||
static size_t xFreeBytesRemaining = 0U;
|
static size_t xFreeBytesRemaining = 0U;
|
||||||
static size_t xMinimumEverFreeBytesRemaining = 0U;
|
static size_t xMinimumEverFreeBytesRemaining = 0U;
|
||||||
static size_t xNumberOfSuccessfulAllocations = 0;
|
static size_t xNumberOfSuccessfulAllocations = 0;
|
||||||
static size_t xNumberOfSuccessfulFrees = 0;
|
static size_t xNumberOfSuccessfulFrees = 0;
|
||||||
|
|
||||||
/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize
|
/* 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
|
* member of an BlockLink_t structure is set then the block belongs to the
|
||||||
@@ -131,420 +130,354 @@ static size_t xBlockAllocatedBit = 0;
|
|||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void * pvPortMalloc( size_t xWantedSize )
|
void *pvPortMalloc( size_t xWantedSize ) {
|
||||||
{
|
BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
|
||||||
BlockLink_t * pxBlock, * pxPreviousBlock, * pxNewBlockLink;
|
void *pvReturn = NULL;
|
||||||
void * pvReturn = NULL;
|
|
||||||
|
|
||||||
/* The heap must be initialised before the first call to
|
/* The heap must be initialised before the first call to
|
||||||
* prvPortMalloc(). */
|
* prvPortMalloc(). */
|
||||||
configASSERT( pxEnd );
|
configASSERT( pxEnd );
|
||||||
|
|
||||||
vTaskSuspendAll();
|
vTaskSuspendAll();
|
||||||
{
|
{
|
||||||
/* Check the requested block size is not so large that the top bit is
|
/* 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
|
* 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
|
* is used to determine who owns the block - the application or the
|
||||||
* kernel, so it must be free. */
|
* kernel, so it must be free. */
|
||||||
if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
|
if ( ( xWantedSize & xBlockAllocatedBit ) == 0 ) {
|
||||||
{
|
/* The wanted size is increased so it can contain a BlockLink_t
|
||||||
/* The wanted size is increased so it can contain a BlockLink_t
|
* structure in addition to the requested amount of bytes. */
|
||||||
* structure in addition to the requested amount of bytes. */
|
if ( xWantedSize > 0 ) {
|
||||||
if( xWantedSize > 0 )
|
xWantedSize += xHeapStructSize;
|
||||||
{
|
|
||||||
xWantedSize += xHeapStructSize;
|
|
||||||
|
|
||||||
/* Ensure that blocks are always aligned to the required number
|
/* Ensure that blocks are always aligned to the required number
|
||||||
* of bytes. */
|
* of bytes. */
|
||||||
if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
|
if ( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) {
|
||||||
{
|
/* Byte alignment required. */
|
||||||
/* Byte alignment required. */
|
xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
|
||||||
xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
|
} else {
|
||||||
}
|
mtCOVERAGE_TEST_MARKER();
|
||||||
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
|
} 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();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do the block being inserted, and the block it is being inserted before
|
if ( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) {
|
||||||
* make a contiguous block of memory? */
|
/* Traverse the list from the start (lowest address) block until
|
||||||
puc = ( uint8_t * ) pxBlockToInsert;
|
* one of adequate size is found. */
|
||||||
|
pxPreviousBlock = &xStart;
|
||||||
|
pxBlock = xStart.pxNextFreeBlock;
|
||||||
|
|
||||||
if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
|
while ( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) {
|
||||||
{
|
pxPreviousBlock = pxBlock;
|
||||||
if( pxIterator->pxNextFreeBlock != pxEnd )
|
pxBlock = pxBlock->pxNextFreeBlock;
|
||||||
{
|
|
||||||
/* 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
|
/* If the end marker was reached then a block of adequate size
|
||||||
* before and the block after, then it's pxNextFreeBlock pointer will have
|
* was not found. */
|
||||||
* already been set, and should not be set here as that would make it point
|
if ( pxBlock != pxEnd ) {
|
||||||
* to itself. */
|
/* Return the memory space pointed to - jumping over the
|
||||||
if( pxIterator != pxBlockToInsert )
|
* BlockLink_t structure at its start. */
|
||||||
{
|
pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
|
||||||
pxIterator->pxNextFreeBlock = pxBlockToInsert;
|
|
||||||
}
|
/* This block is being returned for use so must be taken out
|
||||||
else
|
* 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();
|
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 vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions )
|
void vPortFree( void *pv ) {
|
||||||
{
|
uint8_t *puc = ( uint8_t * ) pv;
|
||||||
BlockLink_t * pxFirstFreeBlockInRegion = NULL, * pxPreviousFreeBlock;
|
BlockLink_t *pxLink;
|
||||||
size_t xAlignedHeap;
|
|
||||||
size_t xTotalRegionSize, xTotalHeapSize = 0;
|
|
||||||
BaseType_t xDefinedRegions = 0;
|
|
||||||
size_t xAddress;
|
|
||||||
const HeapRegion_t * pxHeapRegion;
|
|
||||||
|
|
||||||
/* Can only call once! */
|
if ( pv != NULL ) {
|
||||||
configASSERT( pxEnd == 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 ] );
|
pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] );
|
||||||
|
}
|
||||||
|
|
||||||
while( pxHeapRegion->xSizeInBytes > 0 )
|
xMinimumEverFreeBytesRemaining = xTotalHeapSize;
|
||||||
{
|
xFreeBytesRemaining = xTotalHeapSize;
|
||||||
xTotalRegionSize = pxHeapRegion->xSizeInBytes;
|
|
||||||
|
|
||||||
/* Ensure the heap region starts on a correctly aligned boundary. */
|
/* Check something was actually defined before it is accessed. */
|
||||||
xAddress = ( size_t ) pxHeapRegion->pucStartAddress;
|
configASSERT( xTotalHeapSize );
|
||||||
|
|
||||||
if( ( xAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
|
/* Work out the position of the top bit in a size_t variable. */
|
||||||
{
|
xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 );
|
||||||
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 )
|
void vPortGetHeapStats( HeapStats_t *pxHeapStats ) {
|
||||||
{
|
BlockLink_t *pxBlock;
|
||||||
BlockLink_t * pxBlock;
|
size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */
|
||||||
size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */
|
|
||||||
|
|
||||||
vTaskSuspendAll();
|
vTaskSuspendAll();
|
||||||
{
|
{
|
||||||
pxBlock = xStart.pxNextFreeBlock;
|
pxBlock = xStart.pxNextFreeBlock;
|
||||||
|
|
||||||
/* pxBlock will be NULL if the heap has not been initialised. The heap
|
/* pxBlock will be NULL if the heap has not been initialised. The heap
|
||||||
* is initialised automatically when the first allocation is made. */
|
* is initialised automatically when the first allocation is made. */
|
||||||
if( pxBlock != NULL )
|
if ( pxBlock != NULL ) {
|
||||||
{
|
do {
|
||||||
do
|
/* Increment the number of blocks and record the largest block seen
|
||||||
{
|
* so far. */
|
||||||
/* Increment the number of blocks and record the largest block seen
|
xBlocks++;
|
||||||
* so far. */
|
|
||||||
xBlocks++;
|
|
||||||
|
|
||||||
if( pxBlock->xBlockSize > xMaxSize )
|
if ( pxBlock->xBlockSize > xMaxSize ) {
|
||||||
{
|
xMaxSize = pxBlock->xBlockSize;
|
||||||
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;
|
/* Heap five will have a zero sized block at the end of each
|
||||||
pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize;
|
* each region - the block is only used to link to the next
|
||||||
pxHeapStats->xNumberOfFreeBlocks = xBlocks;
|
* heap region so it not a real block. */
|
||||||
|
if ( pxBlock->xBlockSize != 0 ) {
|
||||||
|
if ( pxBlock->xBlockSize < xMinSize ) {
|
||||||
|
xMinSize = pxBlock->xBlockSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
taskENTER_CRITICAL();
|
/* Move to the next block in the chain until the last block is
|
||||||
{
|
* reached. */
|
||||||
pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining;
|
pxBlock = pxBlock->pxNextFreeBlock;
|
||||||
pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations;
|
} while ( pxBlock != pxEnd );
|
||||||
pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees;
|
|
||||||
pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining;
|
|
||||||
}
|
}
|
||||||
taskEXIT_CRITICAL();
|
}
|
||||||
|
( 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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,15 +19,13 @@ uint16_t ADCReadings[ADC_NORM_SAMPLES]; // room for 32 lots of the pair of readi
|
|||||||
|
|
||||||
// Heap
|
// Heap
|
||||||
|
|
||||||
extern uint8_t __HeapBase;
|
extern uint8_t _heap_start;
|
||||||
extern uint8_t __HeapLimit; // @suppress("Type cannot be resolved")
|
extern uint8_t _heap_size; // @suppress("Type cannot be resolved")
|
||||||
const uint32_t _heap_size = ((&__HeapLimit) - (&__HeapBase));
|
|
||||||
static HeapRegion_t xHeapRegions[] = {
|
static HeapRegion_t xHeapRegions[] = {
|
||||||
{&__HeapBase, (unsigned int)_heap_size},
|
{&_heap_start, (unsigned int)&_heap_size},
|
||||||
{NULL, 0}, /* Terminates the array. */
|
{NULL, 0}, /* Terminates the array. */
|
||||||
{NULL, 0} /* Terminates the array. */
|
{NULL, 0} /* Terminates the array. */
|
||||||
};
|
};
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
|
|
||||||
void setup_timer_scheduler(void);
|
void setup_timer_scheduler(void);
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ uint16_t getADCVin(uint8_t sample);
|
|||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
void setupFUSBIRQ();
|
void setupFUSBIRQ();
|
||||||
extern const uint8_t holdoffTicks;
|
extern uint8_t holdoffTicks;
|
||||||
extern const uint8_t tempMeasureTicks;
|
extern uint8_t tempMeasureTicks;
|
||||||
#endif /* PINE_SETUP_H_ */
|
#endif /* PINE_SETUP_H_ */
|
||||||
|
|||||||
@@ -69,4 +69,4 @@ const int32_t uVtoDegC[] = {
|
|||||||
|
|
||||||
const int uVtoDegCItems = sizeof(uVtoDegC) / (2 * sizeof(int32_t));
|
const int uVtoDegCItems = sizeof(uVtoDegC) / (2 * sizeof(int32_t));
|
||||||
|
|
||||||
uint32_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { return Utils::InterpolateLookupTable(uVtoDegC, uVtoDegCItems, tipuVDelta); }
|
TemperatureType_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { return Utils::InterpolateLookupTable(uVtoDegC, uVtoDegCItems, tipuVDelta); }
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#include "bflb_platform.h"
|
#include "bflb_platform.h"
|
||||||
|
#include "drv_mmheap.h"
|
||||||
#include "hal_common.h"
|
#include "hal_common.h"
|
||||||
#include "hal_flash.h"
|
#include "hal_flash.h"
|
||||||
#include "hal_mtimer.h"
|
#include "hal_mtimer.h"
|
||||||
@@ -32,8 +33,11 @@ extern uint32_t __HeapLimit;
|
|||||||
|
|
||||||
static uint8_t uart_dbg_disable = 0;
|
static uint8_t uart_dbg_disable = 0;
|
||||||
|
|
||||||
// struct heap_info mmheap_root;
|
struct heap_info mmheap_root;
|
||||||
|
|
||||||
|
static struct heap_region system_mmheap[] = {
|
||||||
|
{NULL, 0}, {NULL, 0}, /* Terminates the array. */
|
||||||
|
};
|
||||||
__WEAK__ void board_init(void) {}
|
__WEAK__ void board_init(void) {}
|
||||||
|
|
||||||
__WEAK__ enum uart_index_type board_get_debug_uart_index(void) { return 0; }
|
__WEAK__ enum uart_index_type board_get_debug_uart_index(void) { return 0; }
|
||||||
@@ -88,14 +92,14 @@ void bflb_platform_init(uint32_t baudrate) {
|
|||||||
}
|
}
|
||||||
static bool initialized = false;
|
static bool initialized = false;
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
// system_mmheap[0].addr = (uint8_t *)&__HeapBase;
|
system_mmheap[0].addr = (uint8_t *)&__HeapBase;
|
||||||
// system_mmheap[0].mem_size = ((size_t)&__HeapLimit - (size_t)&__HeapBase);
|
system_mmheap[0].mem_size = ((size_t)&__HeapLimit - (size_t)&__HeapBase);
|
||||||
|
|
||||||
// if (system_mmheap[0].mem_size > 0) {
|
if (system_mmheap[0].mem_size > 0) {
|
||||||
// mmheap_init(&mmheap_root, system_mmheap);
|
mmheap_init(&mmheap_root, system_mmheap);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// MSG("dynamic memory init success,heap size = %d Kbyte \r\n", system_mmheap[0].mem_size / 1024);
|
MSG("dynamic memory init success,heap size = %d Kbyte \r\n", system_mmheap[0].mem_size / 1024);
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
if (ret != SUCCESS) {
|
if (ret != SUCCESS) {
|
||||||
MSG("flash init fail!!!\r\n");
|
MSG("flash init fail!!!\r\n");
|
||||||
|
|||||||
@@ -17,17 +17,18 @@ OUTPUT_ARCH( "riscv" )
|
|||||||
/* configure the entry point */
|
/* configure the entry point */
|
||||||
ENTRY(_enter)
|
ENTRY(_enter)
|
||||||
|
|
||||||
StackSize = 0x800; /* 2KB */
|
StackSize = 0x1000; /* 4KB */
|
||||||
|
__EM_SIZE =8K;
|
||||||
__EM_SIZE = DEFINED(ble_controller_init) ? 8K : 0K;
|
|
||||||
|
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
xip_memory (rx) : ORIGIN = 0x23000000, LENGTH = 1022K
|
xip_memory (rx) : ORIGIN = 0x23000000, LENGTH = 1008K /*1024 - 8K header - 4K*2 for settings and logo*/
|
||||||
itcm_memory (rx) : ORIGIN = 0x22014000, LENGTH = 12K
|
itcm_memory (rx) : ORIGIN = 0x22014000, LENGTH = 12K
|
||||||
dtcm_memory (rx) : ORIGIN = 0x42017000, LENGTH = 4K
|
dtcm_memory (rx) : ORIGIN = 0x42014000, LENGTH = 8K
|
||||||
ram_memory (!rx) : ORIGIN = 0x42018000, LENGTH = 96K
|
ram_memory (!rx) : ORIGIN = 0x42016000, LENGTH = 72K
|
||||||
hbn_memory (rx) : ORIGIN = 0x40010000, LENGTH = 0xE00 /* hbn ram 4K used 3.5K*/
|
rsvd_memory (!rx) : ORIGIN = 0x42028000, LENGTH = 1K
|
||||||
|
ram2_memory (!rx) : ORIGIN = 0x42028400, LENGTH = (31K - __EM_SIZE)
|
||||||
|
hbn_memory (rx) : ORIGIN = 0x40010000, LENGTH = 0xE00 /* hbn ram 4K used 3.5K*/
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
@@ -91,13 +92,12 @@ SECTIONS
|
|||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__text_code_end__ = .;
|
__text_code_end__ = .;
|
||||||
} > xip_memory
|
} > xip_memory
|
||||||
.preinit_array :
|
.preinit_array :
|
||||||
{
|
{
|
||||||
PROVIDE_HIDDEN (__preinit_array_start = .);
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||||
KEEP (*(.preinit_array))
|
KEEP (*(.preinit_array))
|
||||||
PROVIDE_HIDDEN (__preinit_array_end = .);
|
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||||
} >xip_memory AT>xip_memory
|
} >xip_memory AT>xip_memory
|
||||||
|
|
||||||
.init_array :
|
.init_array :
|
||||||
{
|
{
|
||||||
PROVIDE_HIDDEN (__init_array_start = .);
|
PROVIDE_HIDDEN (__init_array_start = .);
|
||||||
@@ -105,7 +105,6 @@ SECTIONS
|
|||||||
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
|
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
|
||||||
PROVIDE_HIDDEN (__init_array_end = .);
|
PROVIDE_HIDDEN (__init_array_end = .);
|
||||||
} >xip_memory AT>xip_memory
|
} >xip_memory AT>xip_memory
|
||||||
|
|
||||||
.fini_array :
|
.fini_array :
|
||||||
{
|
{
|
||||||
PROVIDE_HIDDEN (__fini_array_start = .);
|
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||||
@@ -113,7 +112,6 @@ SECTIONS
|
|||||||
KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
|
KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
|
||||||
PROVIDE_HIDDEN (__fini_array_end = .);
|
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||||
} >xip_memory AT>xip_memory
|
} >xip_memory AT>xip_memory
|
||||||
|
|
||||||
.ctors :
|
.ctors :
|
||||||
{
|
{
|
||||||
/* gcc uses crtbegin.o to find the start of
|
/* gcc uses crtbegin.o to find the start of
|
||||||
@@ -137,7 +135,6 @@ SECTIONS
|
|||||||
KEEP (*(SORT(.ctors.*)))
|
KEEP (*(SORT(.ctors.*)))
|
||||||
KEEP (*(.ctors))
|
KEEP (*(.ctors))
|
||||||
} >xip_memory AT>xip_memory
|
} >xip_memory AT>xip_memory
|
||||||
|
|
||||||
.dtors :
|
.dtors :
|
||||||
{
|
{
|
||||||
KEEP (*crtbegin.o(.dtors))
|
KEEP (*crtbegin.o(.dtors))
|
||||||
@@ -146,13 +143,11 @@ SECTIONS
|
|||||||
KEEP (*(SORT(.dtors.*)))
|
KEEP (*(SORT(.dtors.*)))
|
||||||
KEEP (*(.dtors))
|
KEEP (*(.dtors))
|
||||||
} >xip_memory AT>xip_memory
|
} >xip_memory AT>xip_memory
|
||||||
|
|
||||||
.lalign :
|
.lalign :
|
||||||
{
|
{
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
PROVIDE( _data_lma = . );
|
PROVIDE( _data_lma = . );
|
||||||
} >xip_memory AT>xip_memory
|
} >xip_memory AT>xip_memory
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__itcm_load_addr = .;
|
__itcm_load_addr = .;
|
||||||
|
|
||||||
@@ -182,7 +177,7 @@ SECTIONS
|
|||||||
__tcm_code_end__ = .;
|
__tcm_code_end__ = .;
|
||||||
} > itcm_memory
|
} > itcm_memory
|
||||||
|
|
||||||
__hbn_load_addr = __itcm_load_addr + SIZEOF(.itcm_region);
|
__hbn_load_addr = __itcm_load_addr + SIZEOF(.itcm_region);
|
||||||
|
|
||||||
.hbn_ram_region : AT (__hbn_load_addr)
|
.hbn_ram_region : AT (__hbn_load_addr)
|
||||||
{
|
{
|
||||||
@@ -208,8 +203,6 @@ SECTIONS
|
|||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__tcm_data_end__ = .;
|
__tcm_data_end__ = .;
|
||||||
} > dtcm_memory
|
} > dtcm_memory
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/* .stack_dummy section doesn't contains any symbols. It is only
|
/* .stack_dummy section doesn't contains any symbols. It is only
|
||||||
* used for linker to calculate size of stack sections, and assign
|
* used for linker to calculate size of stack sections, and assign
|
||||||
@@ -226,7 +219,6 @@ SECTIONS
|
|||||||
__StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory);
|
__StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory);
|
||||||
PROVIDE( __freertos_irq_stack_top = __StackTop);
|
PROVIDE( __freertos_irq_stack_top = __StackTop);
|
||||||
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
|
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
|
||||||
|
|
||||||
/* Check if data + heap + stack exceeds RAM limit */
|
/* Check if data + heap + stack exceeds RAM limit */
|
||||||
ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack")
|
ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack")
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
@@ -326,5 +318,7 @@ SECTIONS
|
|||||||
|
|
||||||
ASSERT((__HeapLimit - __HeapBase ) >= __heap_min_size, "heap size is too short.")
|
ASSERT((__HeapLimit - __HeapBase ) >= __heap_min_size, "heap size is too short.")
|
||||||
|
|
||||||
|
PROVIDE( _heap_start = ORIGIN(ram2_memory) );
|
||||||
|
PROVIDE( _heap_size = LENGTH(ram2_memory) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,421 @@
|
|||||||
|
/**
|
||||||
|
* @file drv_mmheap.c
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 Bouffalolab team
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the
|
||||||
|
* License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "drv_mmheap.h"
|
||||||
|
|
||||||
|
#define MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT 8
|
||||||
|
#define MEM_MANAGE_BITS_PER_BYTE 8
|
||||||
|
#define MEM_MANAGE_MEM_STRUCT_SIZE mmheap_align_up(sizeof(struct heap_node), MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT)
|
||||||
|
#define MEM_MANAGE_MINUM_MEM_SIZE (MEM_MANAGE_MEM_STRUCT_SIZE << 1)
|
||||||
|
#define MEM_MANAGE_ALLOCA_LABAL ((size_t)((size_t)1 << (sizeof(size_t) * MEM_MANAGE_BITS_PER_BYTE - 1)))
|
||||||
|
|
||||||
|
static inline size_t mmheap_align_down(size_t data, size_t align_byte)
|
||||||
|
{
|
||||||
|
return data & ~(align_byte - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t mmheap_align_up(size_t data, size_t align_byte)
|
||||||
|
{
|
||||||
|
return (data + align_byte - 1) & ~(align_byte - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct heap_node *mmheap_addr_sub(const void *addr)
|
||||||
|
{
|
||||||
|
return (struct heap_node *)((const uint8_t *)addr - MEM_MANAGE_MEM_STRUCT_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *mmheap_addr_add(const struct heap_node *mem_node)
|
||||||
|
{
|
||||||
|
return (void *)((const uint8_t *)mem_node + MEM_MANAGE_MEM_STRUCT_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief mmheap_insert_node_to_freelist
|
||||||
|
*
|
||||||
|
* @param pRoot
|
||||||
|
* @param pNode
|
||||||
|
*/
|
||||||
|
static inline void mmheap_insert_node_to_freelist(struct heap_info *pRoot, struct heap_node *pNode)
|
||||||
|
{
|
||||||
|
struct heap_node *pPriv_Node;
|
||||||
|
struct heap_node *pNext_Node;
|
||||||
|
/*Find the node with an address similar to pNode*/
|
||||||
|
for (pPriv_Node = pRoot->pStart; pPriv_Node->next_node < pNode; pPriv_Node = pPriv_Node->next_node) {
|
||||||
|
}
|
||||||
|
|
||||||
|
pNext_Node = pPriv_Node->next_node;
|
||||||
|
/*Try to merge the pNode with the previous block*/
|
||||||
|
if ((uint8_t *)mmheap_addr_add(pPriv_Node) + pPriv_Node->mem_size == (uint8_t *)pNode) {
|
||||||
|
if (pPriv_Node != pRoot->pStart) { /*can merge if not start block*/
|
||||||
|
pPriv_Node->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE + pNode->mem_size;
|
||||||
|
pNode = pPriv_Node;
|
||||||
|
} else {
|
||||||
|
/*The latter is not merged if it is a Start block to avoid wasting memory*/
|
||||||
|
pRoot->pStart->next_node = pNode;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*Insert directly into the free single-chain table when merging is not possible*/
|
||||||
|
pPriv_Node->next_node = pNode;
|
||||||
|
}
|
||||||
|
/*Try to merge the pNode with the next block*/
|
||||||
|
if ((uint8_t *)mmheap_addr_add(pNode) + pNode->mem_size == (uint8_t *)pNext_Node) {
|
||||||
|
if (pNext_Node != pRoot->pEnd) {
|
||||||
|
pNode->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE + pNext_Node->mem_size;
|
||||||
|
pNode->next_node = pNext_Node->next_node;
|
||||||
|
} else {
|
||||||
|
pNode->next_node = pRoot->pEnd;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*Insert directly into the free single-chain table when merging is not possible*/
|
||||||
|
pNode->next_node = pNext_Node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief mmheap_get_state
|
||||||
|
*
|
||||||
|
* @param pRoot
|
||||||
|
* @param pState
|
||||||
|
*/
|
||||||
|
void mmheap_get_state(struct heap_info *pRoot, struct heap_state *pState)
|
||||||
|
{
|
||||||
|
MMHEAP_ASSERT(pRoot->pStart != NULL);
|
||||||
|
MMHEAP_ASSERT(pRoot->pEnd != NULL);
|
||||||
|
pState->max_node_size = pRoot->pStart->next_node->mem_size;
|
||||||
|
pState->min_node_size = pRoot->pStart->next_node->mem_size;
|
||||||
|
pState->remain_size = 0;
|
||||||
|
pState->free_node_num = 0;
|
||||||
|
MMHEAP_LOCK();
|
||||||
|
for (struct heap_node *pNode = pRoot->pStart->next_node; pNode->next_node != NULL; pNode = pNode->next_node) {
|
||||||
|
pState->remain_size += pNode->mem_size;
|
||||||
|
pState->free_node_num++;
|
||||||
|
if (pNode->mem_size > pState->max_node_size)
|
||||||
|
pState->max_node_size = pNode->mem_size;
|
||||||
|
if (pNode->mem_size < pState->min_node_size)
|
||||||
|
pState->min_node_size = pNode->mem_size;
|
||||||
|
}
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief mmheap_align_alloc
|
||||||
|
*
|
||||||
|
* @param pRoot
|
||||||
|
* @param align_size
|
||||||
|
* @param want_size
|
||||||
|
* @return void*
|
||||||
|
*/
|
||||||
|
void *mmheap_align_alloc(struct heap_info *pRoot, size_t align_size, size_t want_size)
|
||||||
|
{
|
||||||
|
void *pReturn = NULL;
|
||||||
|
struct heap_node *pPriv_Node, *pNow_Node;
|
||||||
|
|
||||||
|
MMHEAP_ASSERT(pRoot->pStart != NULL);
|
||||||
|
MMHEAP_ASSERT(pRoot->pEnd != NULL);
|
||||||
|
|
||||||
|
if (want_size == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((want_size & MEM_MANAGE_ALLOCA_LABAL) != 0) {
|
||||||
|
MMHEAP_MALLOC_FAIL();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (align_size & (align_size - 1)) {
|
||||||
|
MMHEAP_MALLOC_FAIL();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
MMHEAP_LOCK();
|
||||||
|
if (want_size < MEM_MANAGE_MINUM_MEM_SIZE)
|
||||||
|
want_size = MEM_MANAGE_MINUM_MEM_SIZE;
|
||||||
|
if (align_size < MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT)
|
||||||
|
align_size = MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT;
|
||||||
|
|
||||||
|
want_size = mmheap_align_up(want_size, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
|
||||||
|
|
||||||
|
pPriv_Node = pRoot->pStart;
|
||||||
|
pNow_Node = pRoot->pStart->next_node;
|
||||||
|
|
||||||
|
while (pNow_Node->next_node != NULL) {
|
||||||
|
if (pNow_Node->mem_size >= want_size + MEM_MANAGE_MEM_STRUCT_SIZE) {
|
||||||
|
size_t use_align_size;
|
||||||
|
size_t new_size;
|
||||||
|
pReturn = (void *)mmheap_align_up((size_t)mmheap_addr_add(pNow_Node), align_size); /*Calculate the aligned address*/
|
||||||
|
use_align_size = (uint8_t *)pReturn - (uint8_t *)mmheap_addr_add(pNow_Node); /*Calculate the memory consumed by the alignment*/
|
||||||
|
if (use_align_size != 0) { /*if Memory misalignment*/
|
||||||
|
if (use_align_size < MEM_MANAGE_MINUM_MEM_SIZE + MEM_MANAGE_MEM_STRUCT_SIZE) { /*The unaligned value is too small*/
|
||||||
|
pReturn = (void *)mmheap_align_up(
|
||||||
|
(size_t)mmheap_addr_add(pNow_Node) + MEM_MANAGE_MINUM_MEM_SIZE + MEM_MANAGE_MEM_STRUCT_SIZE, align_size);
|
||||||
|
use_align_size = (uint8_t *)pReturn - (uint8_t *)mmheap_addr_add(pNow_Node);
|
||||||
|
}
|
||||||
|
if (use_align_size <= pNow_Node->mem_size) {
|
||||||
|
new_size = pNow_Node->mem_size - use_align_size; /*Calculate the remaining memory size by removing the memory consumed by alignment*/
|
||||||
|
if (new_size >= want_size) { /*Meet the conditions for distribution*/
|
||||||
|
struct heap_node *pNew_Node = mmheap_addr_sub(pReturn);
|
||||||
|
pNow_Node->mem_size -= new_size + MEM_MANAGE_MEM_STRUCT_SIZE; /*Split Node*/
|
||||||
|
pNew_Node->mem_size = new_size; /*The new node is also not in the free chain and does not need to be discharged from the free chain*/
|
||||||
|
pNew_Node->next_node = NULL;
|
||||||
|
pNow_Node = pNew_Node;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { /*Memory is directly aligned*/
|
||||||
|
pPriv_Node->next_node = pNow_Node->next_node;
|
||||||
|
pNow_Node->next_node = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pPriv_Node = pNow_Node;
|
||||||
|
pNow_Node = pNow_Node->next_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pNow_Node == pRoot->pEnd) {
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
MMHEAP_MALLOC_FAIL();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pNow_Node->mem_size >= MEM_MANAGE_MINUM_MEM_SIZE + MEM_MANAGE_MEM_STRUCT_SIZE + want_size) { /*Node memory is still available*/
|
||||||
|
struct heap_node *pNew_Node = (struct heap_node *)((uint8_t *)mmheap_addr_add(pNow_Node) + want_size); /*Calculate the address of the node that will be moved into the free chain table*/
|
||||||
|
pNew_Node->mem_size = pNow_Node->mem_size - want_size - MEM_MANAGE_MEM_STRUCT_SIZE;
|
||||||
|
pNew_Node->next_node = NULL;
|
||||||
|
pNow_Node->mem_size = want_size;
|
||||||
|
mmheap_insert_node_to_freelist(pRoot, pNew_Node);
|
||||||
|
}
|
||||||
|
pNow_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
return pReturn;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief mmheap_alloc
|
||||||
|
*
|
||||||
|
* @param pRoot
|
||||||
|
* @param want_size
|
||||||
|
* @return void*
|
||||||
|
*/
|
||||||
|
void *mmheap_alloc(struct heap_info *pRoot, size_t want_size)
|
||||||
|
{
|
||||||
|
return mmheap_align_alloc(pRoot, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT, want_size);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief mmheap_realloc
|
||||||
|
*
|
||||||
|
* @param pRoot
|
||||||
|
* @param src_addr
|
||||||
|
* @param want_size
|
||||||
|
* @return void*
|
||||||
|
*/
|
||||||
|
void *mmheap_realloc(struct heap_info *pRoot, void *src_addr, size_t want_size)
|
||||||
|
{
|
||||||
|
void *pReturn = NULL;
|
||||||
|
struct heap_node *pNext_Node, *pPriv_Node;
|
||||||
|
struct heap_node *pSrc_Node;
|
||||||
|
MMHEAP_ASSERT(pRoot->pStart != NULL);
|
||||||
|
MMHEAP_ASSERT(pRoot->pEnd != NULL);
|
||||||
|
if (src_addr == NULL) {
|
||||||
|
return mmheap_align_alloc(pRoot, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT, want_size);
|
||||||
|
}
|
||||||
|
if (want_size == 0) {
|
||||||
|
mmheap_free(pRoot, src_addr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
MMHEAP_LOCK();
|
||||||
|
if ((want_size & MEM_MANAGE_ALLOCA_LABAL) != 0) {
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
MMHEAP_MALLOC_FAIL();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pSrc_Node = mmheap_addr_sub(src_addr);
|
||||||
|
|
||||||
|
if ((pSrc_Node->mem_size & MEM_MANAGE_ALLOCA_LABAL) == 0) {
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
MMHEAP_ASSERT((pSrc_Node->mem_size & MEM_MANAGE_ALLOCA_LABAL) != 0);
|
||||||
|
MMHEAP_MALLOC_FAIL();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pSrc_Node->mem_size &= ~MEM_MANAGE_ALLOCA_LABAL;
|
||||||
|
if (pSrc_Node->mem_size >= want_size) {
|
||||||
|
pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;
|
||||||
|
pReturn = src_addr;
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
return pReturn;
|
||||||
|
}
|
||||||
|
/*Start looking in the free list for blocks similar to this block*/
|
||||||
|
for (pPriv_Node = pRoot->pStart; pPriv_Node->next_node < pSrc_Node; pPriv_Node = pPriv_Node->next_node) {
|
||||||
|
}
|
||||||
|
pNext_Node = pPriv_Node->next_node;
|
||||||
|
|
||||||
|
if (pNext_Node != pRoot->pEnd &&
|
||||||
|
((uint8_t *)src_addr + pSrc_Node->mem_size == (uint8_t *)pNext_Node) &&
|
||||||
|
(pSrc_Node->mem_size + pNext_Node->mem_size + MEM_MANAGE_MEM_STRUCT_SIZE >= want_size)) {
|
||||||
|
/*Meet next node non-end, memory contiguous, enough memory left*/
|
||||||
|
pReturn = src_addr;
|
||||||
|
pPriv_Node->next_node = pNext_Node->next_node;
|
||||||
|
pSrc_Node->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE + pNext_Node->mem_size;
|
||||||
|
want_size = mmheap_align_up(want_size, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
|
||||||
|
if (pSrc_Node->mem_size >= MEM_MANAGE_MINUM_MEM_SIZE + MEM_MANAGE_MEM_STRUCT_SIZE + want_size) { /*Removing the remaining space allocated is enough to open new blocks*/
|
||||||
|
struct heap_node *pNew_Node = (struct heap_node *)((uint8_t *)mmheap_addr_add(pSrc_Node) + want_size);
|
||||||
|
pNew_Node->next_node = NULL;
|
||||||
|
pNew_Node->mem_size = pSrc_Node->mem_size - want_size - MEM_MANAGE_MEM_STRUCT_SIZE;
|
||||||
|
pSrc_Node->mem_size = want_size;
|
||||||
|
mmheap_insert_node_to_freelist(pRoot, pNew_Node);
|
||||||
|
}
|
||||||
|
pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
} else {
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
pReturn = mmheap_align_alloc(pRoot, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT, want_size);
|
||||||
|
if (pReturn == NULL) {
|
||||||
|
pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;
|
||||||
|
MMHEAP_MALLOC_FAIL();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
MMHEAP_LOCK();
|
||||||
|
memcpy(pReturn, src_addr, pSrc_Node->mem_size);
|
||||||
|
pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
mmheap_free(pRoot, src_addr);
|
||||||
|
}
|
||||||
|
return pReturn;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* @param pRoot
|
||||||
|
* @param num
|
||||||
|
* @param size
|
||||||
|
* @return void*
|
||||||
|
*/
|
||||||
|
void *mmheap_calloc(struct heap_info *pRoot, size_t num, size_t size)
|
||||||
|
{
|
||||||
|
void *pReturn = NULL;
|
||||||
|
|
||||||
|
pReturn = (void *)mmheap_alloc(pRoot, size * num);
|
||||||
|
|
||||||
|
if (pReturn) {
|
||||||
|
memset(pReturn, 0, num * size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pReturn;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief mmheap_free
|
||||||
|
*
|
||||||
|
* @param pRoot
|
||||||
|
* @param addr
|
||||||
|
*/
|
||||||
|
void mmheap_free(struct heap_info *pRoot, void *addr)
|
||||||
|
{
|
||||||
|
struct heap_node *pFree_Node;
|
||||||
|
MMHEAP_ASSERT(pRoot->pStart != NULL);
|
||||||
|
MMHEAP_ASSERT(pRoot->pEnd != NULL);
|
||||||
|
MMHEAP_LOCK();
|
||||||
|
if (addr == NULL) {
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pFree_Node = mmheap_addr_sub(addr);
|
||||||
|
|
||||||
|
if ((pFree_Node->mem_size & MEM_MANAGE_ALLOCA_LABAL) == 0) {
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
MMHEAP_ASSERT((pFree_Node->mem_size & MEM_MANAGE_ALLOCA_LABAL) != 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pFree_Node->next_node != NULL) {
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
MMHEAP_ASSERT(pFree_Node->next_node == NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pFree_Node->mem_size &= ~MEM_MANAGE_ALLOCA_LABAL;
|
||||||
|
mmheap_insert_node_to_freelist(pRoot, pFree_Node);
|
||||||
|
MMHEAP_UNLOCK();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief mmheap_init
|
||||||
|
*
|
||||||
|
* @param pRoot
|
||||||
|
* @param pRegion
|
||||||
|
*/
|
||||||
|
void mmheap_init(struct heap_info *pRoot, const struct heap_region *pRegion)
|
||||||
|
{
|
||||||
|
struct heap_node *align_addr;
|
||||||
|
size_t align_size;
|
||||||
|
struct heap_node *pPriv_node = NULL;
|
||||||
|
|
||||||
|
pRoot->total_size = 0;
|
||||||
|
pRoot->pEnd = NULL;
|
||||||
|
pRoot->pStart = NULL;
|
||||||
|
|
||||||
|
for (; pRegion->addr != NULL; pRegion++) {
|
||||||
|
align_addr = (struct heap_node *)mmheap_align_up((size_t)pRegion->addr, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT); /*Calculate the aligned address*/
|
||||||
|
if ((uint8_t *)align_addr > pRegion->mem_size + (uint8_t *)pRegion->addr) /*Alignment consumes more memory than the memory area*/
|
||||||
|
continue;
|
||||||
|
align_size = pRegion->mem_size - ((uint8_t *)align_addr - (uint8_t *)pRegion->addr); /*Calculate the size of memory left after alignment*/
|
||||||
|
if (align_size < MEM_MANAGE_MINUM_MEM_SIZE + MEM_MANAGE_MEM_STRUCT_SIZE) /*if Aligning the remaining memory is too small*/
|
||||||
|
continue;
|
||||||
|
align_size -= MEM_MANAGE_MEM_STRUCT_SIZE; /*Find the size of the memory block after removing the table header*/
|
||||||
|
align_addr->mem_size = align_size;
|
||||||
|
align_addr->next_node = NULL;
|
||||||
|
if (pRoot->pStart == NULL) {
|
||||||
|
pRoot->pStart = align_addr; /*set current addr for start*/
|
||||||
|
if (align_size >= MEM_MANAGE_MINUM_MEM_SIZE + MEM_MANAGE_MEM_STRUCT_SIZE) { /*If the remaining blocks are large enough*/
|
||||||
|
align_size -= MEM_MANAGE_MEM_STRUCT_SIZE; /*Remove the next block of table headers remaining memory size*/
|
||||||
|
align_addr = (struct heap_node *)((uint8_t *)pRoot->pStart + MEM_MANAGE_MEM_STRUCT_SIZE); //the next block addr
|
||||||
|
align_addr->mem_size = align_size;
|
||||||
|
align_addr->next_node = NULL;
|
||||||
|
pRoot->pStart->mem_size = 0;
|
||||||
|
pRoot->pStart->next_node = align_addr;
|
||||||
|
pRoot->total_size = align_addr->mem_size;
|
||||||
|
} else { /*The memory is too small, and the address of the current memory block is recorded as start*/
|
||||||
|
pRoot->total_size = 0;
|
||||||
|
pRoot->pStart->mem_size = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pPriv_node->next_node = align_addr;
|
||||||
|
pRoot->total_size += align_size;
|
||||||
|
}
|
||||||
|
pPriv_node = align_addr;
|
||||||
|
}
|
||||||
|
//At this point, pPriv_node is the last block, then place the end of the table at the end of the block, find the address to place the end block, end block is only convenient for traversal, so as small as possible, assigned to MEM_MANAGE_MEM_STRUCT_SIZE
|
||||||
|
align_addr = (struct heap_node *)mmheap_align_down(
|
||||||
|
(size_t)mmheap_addr_add(pPriv_node) + pPriv_node->mem_size - MEM_MANAGE_MEM_STRUCT_SIZE, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
|
||||||
|
align_size = (uint8_t *)align_addr - (uint8_t *)mmheap_addr_add(pPriv_node); /*Find the remaining size of the previous block after the end block is allocated*/
|
||||||
|
if (align_size >= MEM_MANAGE_MINUM_MEM_SIZE) {
|
||||||
|
pRoot->total_size -= pPriv_node->mem_size - align_size; /*Removing memory consumed by allocating end blocks*/
|
||||||
|
pRoot->pEnd = align_addr; /*Update the address at the end of the list*/
|
||||||
|
pPriv_node->next_node = align_addr;
|
||||||
|
pPriv_node->mem_size = align_size;
|
||||||
|
align_addr->next_node = NULL;
|
||||||
|
align_addr->mem_size = 0; /*The end block is not involved in memory allocation, so a direct 0 is sufficient*/
|
||||||
|
} else { /*The last block is too small, directly as the end block*/
|
||||||
|
pRoot->pEnd = pPriv_node;
|
||||||
|
pRoot->total_size -= pPriv_node->mem_size;
|
||||||
|
}
|
||||||
|
MMHEAP_ASSERT(pRoot->pStart != NULL);
|
||||||
|
MMHEAP_ASSERT(pRoot->pEnd != NULL);
|
||||||
|
}
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
/**
|
||||||
|
* @file drv_mmheap.h
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 Bouffalolab team
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the
|
||||||
|
* License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __DRV_MMHEAP_H
|
||||||
|
#define __DRV_MMHEAP_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifndef MMHEAP_LOCK
|
||||||
|
#define MMHEAP_LOCK()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MMHEAP_UNLOCK
|
||||||
|
#define MMHEAP_UNLOCK()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MMHEAP_ASSERT
|
||||||
|
#define MMHEAP_ASSERT(A) \
|
||||||
|
if (!(A)) \
|
||||||
|
printf("mmheap malloc error:drv_mmheap,%d\r\n", __LINE__)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MMHEAP_MALLOC_FAIL
|
||||||
|
#define MMHEAP_MALLOC_FAIL() printf("mmheap malloc fail:drv_mmheap,%d\r\n", __LINE__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct heap_region {
|
||||||
|
void *addr;
|
||||||
|
size_t mem_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct heap_node {
|
||||||
|
struct heap_node *next_node;
|
||||||
|
size_t mem_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct heap_info {
|
||||||
|
struct heap_node *pStart;
|
||||||
|
struct heap_node *pEnd;
|
||||||
|
size_t total_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct heap_state {
|
||||||
|
size_t remain_size;
|
||||||
|
size_t free_node_num;
|
||||||
|
size_t max_node_size;
|
||||||
|
size_t min_node_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
void mmheap_init(struct heap_info *pRoot, const struct heap_region *pRigon);
|
||||||
|
/**
|
||||||
|
* @brief Alloc start address aligned memory from the heap.
|
||||||
|
* Alloc aligned address and specified size memory from the heap.
|
||||||
|
*
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* @param[in] pRoot heap info.
|
||||||
|
* @param[in] align_size address align mask of the memory.
|
||||||
|
* @param[in] want_size size of the memory.
|
||||||
|
*
|
||||||
|
* @return the pointer to the allocated memory.
|
||||||
|
*/
|
||||||
|
void *mmheap_align_alloc(struct heap_info *pRoot, size_t align_size, size_t want_size);
|
||||||
|
/**
|
||||||
|
* @brief Alloc memory.
|
||||||
|
* Allocate size bytes and returns a pointer to the allocated memory.
|
||||||
|
*
|
||||||
|
* @attention size should no bigger than MMHEAP_BLK_SIZE_MAX.
|
||||||
|
*
|
||||||
|
* @param[in] pRoot heap info.
|
||||||
|
* @param[in] want_size size of the memory.
|
||||||
|
*
|
||||||
|
* @return the pointer to the allocated memory.
|
||||||
|
*/
|
||||||
|
void *mmheap_alloc(struct heap_info *pRoot, size_t want_size);
|
||||||
|
/**
|
||||||
|
* @brief Realloc memory from the heap.
|
||||||
|
* Change the size of the memory block pointed to by ptr to size bytes.
|
||||||
|
*
|
||||||
|
* @attention
|
||||||
|
* <ul>
|
||||||
|
* <li> if ptr is NULL, then the call is equivalent to mmheap_alloc(size), for all values of size.
|
||||||
|
* <li> if ptr is if size is equal to zero, and ptr is not NULL, then the call is equivalent to mmheap_free(ptr).
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @param[in] pRoot heap info.
|
||||||
|
* @param[in] src_addr old pointer to the memory space.
|
||||||
|
* @param[in] want_size new size of the memory space.
|
||||||
|
*
|
||||||
|
* @return the new pointer to the allocated memory.
|
||||||
|
*/
|
||||||
|
void *mmheap_realloc(struct heap_info *pRoot, void *src_addr, size_t want_size);
|
||||||
|
/**
|
||||||
|
* @brief Cealloc memory from the heap.
|
||||||
|
* Change the size of the memory block pointed to by ptr to size bytes.
|
||||||
|
*
|
||||||
|
* @attention
|
||||||
|
* <ul>
|
||||||
|
* <li> if ptr is NULL, then the call is equivalent to mmheap_alloc(size), for all values of size.
|
||||||
|
* <li> if ptr is if size is equal to zero, and ptr is not NULL, then the call is equivalent to mmheap_free(ptr).
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @param[in] pRoot heap info.
|
||||||
|
* @param[in] num size number.
|
||||||
|
* @param[in] size new size of the memory space.
|
||||||
|
*
|
||||||
|
* @return the new pointer to the allocated memory.
|
||||||
|
*/
|
||||||
|
void *mmheap_calloc(struct heap_info *pRoot, size_t num, size_t size);
|
||||||
|
/**
|
||||||
|
* @brief Free the memory.
|
||||||
|
* Free the memory space pointed to by ptr, which must have been returned by a previous call to mmheap_alloc(), mmheap_aligned_alloc(), or mmheap_realloc().
|
||||||
|
*
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* @param[in] pRoot heap info.
|
||||||
|
* @param[in] addr pointer to the memory.
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*/
|
||||||
|
void mmheap_free(struct heap_info *pRoot, void *addr);
|
||||||
|
/**
|
||||||
|
* @brief get mmheap state
|
||||||
|
*
|
||||||
|
* @param pRoot heap info.
|
||||||
|
* @param pState heap state
|
||||||
|
*/
|
||||||
|
void mmheap_get_state(struct heap_info *pRoot, struct heap_state *pState);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,70 +1,61 @@
|
|||||||
#include <errno.h>
|
#include "ble.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <FreeRTOS.h>
|
|
||||||
#include "bflb_platform.h"
|
|
||||||
#include <task.h>
|
|
||||||
#include "BSP.h"
|
#include "BSP.h"
|
||||||
|
#include "bflb_platform.h"
|
||||||
|
#include "bl702_glb.h"
|
||||||
|
#include "ble_characteristics.h"
|
||||||
|
#include "ble_peripheral.h"
|
||||||
#include "bluetooth.h"
|
#include "bluetooth.h"
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "gatt.h"
|
#include "gatt.h"
|
||||||
#include "hci_core.h"
|
|
||||||
#include "uuid.h"
|
|
||||||
#include "ble_peripheral.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "bl702_glb.h"
|
|
||||||
#include "ble_characteristics.h"
|
|
||||||
#include "hal_clock.h"
|
#include "hal_clock.h"
|
||||||
#include "ble.h"
|
#include "hci_core.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "uuid.h"
|
||||||
|
#include <FreeRTOS.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <task.h>
|
||||||
|
|
||||||
|
void ble_stack_start(void) {
|
||||||
|
MSG("BLE Starting\n");
|
||||||
|
GLB_Set_EM_Sel(GLB_EM_8KB);
|
||||||
|
ble_controller_init(configMAX_PRIORITIES - 1);
|
||||||
|
|
||||||
|
// Initialize BLE Host stack
|
||||||
|
hci_driver_init();
|
||||||
|
|
||||||
|
bt_enable(bt_enable_cb);
|
||||||
void ble_stack_start(void)
|
MSG("BLE Starting...Done\n");
|
||||||
{
|
|
||||||
MSG("BLE Starting\n");
|
|
||||||
GLB_Set_EM_Sel(GLB_EM_8KB);
|
|
||||||
ble_controller_init(configMAX_PRIORITIES - 1);
|
|
||||||
|
|
||||||
// // Initialize BLE Host stack
|
|
||||||
hci_driver_init();
|
|
||||||
|
|
||||||
bt_enable(bt_enable_cb);
|
|
||||||
MSG("BLE Starting...Done\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* configSUPPORT_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the
|
/* configSUPPORT_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the
|
||||||
application must provide an implementation of vApplicationGetTimerTaskMemory()
|
application must provide an implementation of vApplicationGetTimerTaskMemory()
|
||||||
to provide the memory that is used by the Timer service task. */
|
to provide the memory that is used by the Timer service task. */
|
||||||
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize)
|
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize) {
|
||||||
{
|
/* If the buffers to be provided to the Timer task are declared inside this
|
||||||
/* If the buffers to be provided to the Timer task are declared inside this
|
function then they must be declared static - otherwise they will be allocated on
|
||||||
function then they must be declared static - otherwise they will be allocated on
|
the stack and so not exists after this function exits. */
|
||||||
the stack and so not exists after this function exits. */
|
static StaticTask_t xTimerTaskTCB;
|
||||||
static StaticTask_t xTimerTaskTCB;
|
static StackType_t uxTimerTaskStack[configTIMER_TASK_STACK_DEPTH];
|
||||||
static StackType_t uxTimerTaskStack[configTIMER_TASK_STACK_DEPTH];
|
|
||||||
|
|
||||||
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
||||||
task's state will be stored. */
|
task's state will be stored. */
|
||||||
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
||||||
|
|
||||||
/* Pass out the array that will be used as the Timer task's stack. */
|
/* Pass out the array that will be used as the Timer task's stack. */
|
||||||
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
||||||
|
|
||||||
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||||
Note that, as the array is necessarily of type StackType_t,
|
Note that, as the array is necessarily of type StackType_t,
|
||||||
configTIMER_TASK_STACK_DEPTH is specified in words, not bytes. */
|
configTIMER_TASK_STACK_DEPTH is specified in words, not bytes. */
|
||||||
*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
|
*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vApplicationMallocFailedHook(void) {
|
||||||
|
MSG("vApplicationMallocFailedHook\r\n");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
void vApplicationMallocFailedHook(void)
|
;
|
||||||
{
|
}
|
||||||
MSG("vApplicationMallocFailedHook\r\n");
|
}
|
||||||
|
|
||||||
while (1)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -113,8 +113,9 @@ int ble_char_read_status_callback(struct bt_conn *conn, const struct bt_gatt_att
|
|||||||
// hall sensor
|
// hall sensor
|
||||||
{
|
{
|
||||||
int16_t hallEffectStrength = getRawHallEffect();
|
int16_t hallEffectStrength = getRawHallEffect();
|
||||||
if (hallEffectStrength < 0)
|
if (hallEffectStrength < 0) {
|
||||||
hallEffectStrength = -hallEffectStrength;
|
hallEffectStrength = -hallEffectStrength;
|
||||||
|
}
|
||||||
temp = hallEffectStrength;
|
temp = hallEffectStrength;
|
||||||
memcpy(buf, &temp, sizeof(temp));
|
memcpy(buf, &temp, sizeof(temp));
|
||||||
return sizeof(temp);
|
return sizeof(temp);
|
||||||
|
|||||||
@@ -258,7 +258,9 @@ static struct bt_gatt_attr ble_attrs_declaration[] = {
|
|||||||
NAME
|
NAME
|
||||||
get_attr
|
get_attr
|
||||||
*/
|
*/
|
||||||
struct bt_gatt_attr *get_attr(u8_t index) { return &ble_attrs_declaration[index]; }
|
struct bt_gatt_attr *get_attr(u8_t index) {
|
||||||
|
return &ble_attrs_declaration[index];
|
||||||
|
}
|
||||||
|
|
||||||
static struct bt_gatt_service ble_tp_server = BT_GATT_SERVICE(ble_attrs_declaration);
|
static struct bt_gatt_service ble_tp_server = BT_GATT_SERVICE(ble_attrs_declaration);
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ NOTES
|
|||||||
#ifndef _BLE_TP_SVC_H_
|
#ifndef _BLE_TP_SVC_H_
|
||||||
#define _BLE_TP_SVC_H_
|
#define _BLE_TP_SVC_H_
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
#include "ble_config.h"
|
#include "ble_config.h"
|
||||||
|
|
||||||
// read value handle offset 2
|
// read value handle offset 2
|
||||||
|
|||||||
@@ -63,10 +63,10 @@
|
|||||||
* OLED Brightness
|
* OLED Brightness
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define MIN_BRIGHTNESS 1 // Min OLED brightness selectable
|
#define MIN_BRIGHTNESS 1 // Min OLED brightness selectable
|
||||||
#define MAX_BRIGHTNESS 101 // Max OLED brightness selectable
|
#define MAX_BRIGHTNESS 101 // Max OLED brightness selectable
|
||||||
#define BRIGHTNESS_STEP 25 // OLED brightness increment
|
#define BRIGHTNESS_STEP 25 // OLED brightness increment
|
||||||
#define DEFAULT_BRIGHTNESS 26 // default OLED brightness
|
#define DEFAULT_BRIGHTNESS 26 // default OLED brightness
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Temp change settings
|
* Temp change settings
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
#define POWER_PULSE_DEFAULT 0
|
#define POWER_PULSE_DEFAULT 0
|
||||||
#else
|
#else
|
||||||
#define POWER_PULSE_DEFAULT 5
|
#define POWER_PULSE_DEFAULT 5
|
||||||
#endif /* Pinecil */
|
#endif /* Pinecil */
|
||||||
#define POWER_PULSE_WAIT_DEFAULT 4 // Default rate of the power pulse: 4*2500 = 10000 ms = 10 s
|
#define POWER_PULSE_WAIT_DEFAULT 4 // Default rate of the power pulse: 4*2500 = 10000 ms = 10 s
|
||||||
#define POWER_PULSE_DURATION_DEFAULT 1 // Default duration of the power pulse: 1*250 = 250 ms
|
#define POWER_PULSE_DURATION_DEFAULT 1 // Default duration of the power pulse: 1*250 = 250 ms
|
||||||
|
|
||||||
@@ -161,14 +161,15 @@
|
|||||||
#define DEBUG_UART_OUTPUT
|
#define DEBUG_UART_OUTPUT
|
||||||
#define HAS_POWER_DEBUG_MENU
|
#define HAS_POWER_DEBUG_MENU
|
||||||
#define HARDWARE_MAX_WATTAGE_X10 750
|
#define HARDWARE_MAX_WATTAGE_X10 750
|
||||||
#define TIP_THERMAL_MASS 65 // X10 watts to raise 1 deg C in 1 second
|
|
||||||
#define BLE_ENABLED
|
#define BLE_ENABLED
|
||||||
#define NEEDS_VBUS_PROBE 0
|
#define NEEDS_VBUS_PROBE 0
|
||||||
#define CANT_DIRECT_READ_SETTINGS
|
#define CANT_DIRECT_READ_SETTINGS
|
||||||
#endif /* Pinecilv2 */
|
#endif /* Pinecilv2 */
|
||||||
|
|
||||||
#define FLASH_LOGOADDR (0x23000000 + (1022 * 1024))
|
#define FLASH_PAGE_SIZE (1024) // Read pages
|
||||||
#define FLASH_PAGE_SIZE (1024)
|
// Erase is 4 or 8 k size, so we pad these apart for now
|
||||||
|
// If we ever get low on flash, will need better solution
|
||||||
|
#define FLASH_LOGOADDR (0x23000000 + (1016 * FLASH_PAGE_SIZE))
|
||||||
#define SETTINGS_START_PAGE (1023 * FLASH_PAGE_SIZE) // Hal auto offsets base addr
|
#define SETTINGS_START_PAGE (1023 * FLASH_PAGE_SIZE) // Hal auto offsets base addr
|
||||||
|
|
||||||
#endif /* CONFIGURATION_H_ */
|
#endif /* CONFIGURATION_H_ */
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// BSP mapping functions
|
// BSP mapping functions
|
||||||
|
|
||||||
#include "BSP.h"
|
#include "BSP.h"
|
||||||
|
#include "BootLogo.h"
|
||||||
#include "HUB238.hpp"
|
#include "HUB238.hpp"
|
||||||
#include "I2C_Wrapper.hpp"
|
#include "I2C_Wrapper.hpp"
|
||||||
#include "Pins.h"
|
#include "Pins.h"
|
||||||
@@ -208,7 +209,7 @@ bool isTipDisconnected() {
|
|||||||
|
|
||||||
void setStatusLED(const enum StatusLED state) {}
|
void setStatusLED(const enum StatusLED state) {}
|
||||||
uint8_t preStartChecks() {
|
uint8_t preStartChecks() {
|
||||||
if (!hub238_has_run_selection()) {
|
if (!hub238_has_run_selection() && (xTaskGetTickCount() < TICKS_SECOND * 5)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
// We check if we are in a "Limited" mode; where we have to run the PWM really fast
|
// We check if we are in a "Limited" mode; where we have to run the PWM really fast
|
||||||
@@ -230,10 +231,12 @@ uint64_t getDeviceID() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t getTipResistanceX10() { return TIP_RESISTANCE; }
|
uint8_t getTipResistanceX10() { return TIP_RESISTANCE; }
|
||||||
|
bool isTipShorted() { return false; }
|
||||||
uint8_t preStartChecksDone() { return 1; }
|
uint8_t preStartChecksDone() { return 1; }
|
||||||
|
|
||||||
uint8_t getTipThermalMass() { return TIP_THERMAL_MASS; }
|
uint8_t getTipThermalMass() { return TIP_THERMAL_MASS; }
|
||||||
uint8_t getTipInertia() { return TIP_THERMAL_INERTIA; }
|
uint8_t getTipInertia() { return TIP_THERMAL_INERTIA; }
|
||||||
|
|
||||||
void setBuzzer(bool on) {}
|
void setBuzzer(bool on) {}
|
||||||
|
|
||||||
|
void showBootLogo(void) { BootLogo::handleShowingLogo((uint8_t *)FLASH_LOGOADDR); }
|
||||||
|
|||||||
@@ -206,8 +206,9 @@ static void MX_ADC1_Init(void) {
|
|||||||
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
|
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
|
||||||
SET_BIT(hadc1.Instance->CR1, (ADC_CR1_JEOCIE)); // Enable end of injected conv irq
|
SET_BIT(hadc1.Instance->CR1, (ADC_CR1_JEOCIE)); // Enable end of injected conv irq
|
||||||
// Run ADC internal calibration
|
// Run ADC internal calibration
|
||||||
while (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK)
|
while (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK) {
|
||||||
;
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ADC2 init function */
|
/* ADC2 init function */
|
||||||
@@ -244,8 +245,9 @@ static void MX_ADC2_Init(void) {
|
|||||||
HAL_ADCEx_InjectedConfigChannel(&hadc2, &sConfigInjected);
|
HAL_ADCEx_InjectedConfigChannel(&hadc2, &sConfigInjected);
|
||||||
|
|
||||||
// Run ADC internal calibration
|
// Run ADC internal calibration
|
||||||
while (HAL_ADCEx_Calibration_Start(&hadc2) != HAL_OK)
|
while (HAL_ADCEx_Calibration_Start(&hadc2) != HAL_OK) {
|
||||||
;
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* I2C1 init function */
|
/* I2C1 init function */
|
||||||
static void MX_I2C1_Init(void) {
|
static void MX_I2C1_Init(void) {
|
||||||
|
|||||||
@@ -8,4 +8,4 @@
|
|||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
|
|
||||||
uint32_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { return (tipuVDelta * 50) / 485; }
|
TemperatureType_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { return (tipuVDelta * 50) / 485; }
|
||||||
|
|||||||
@@ -30,10 +30,9 @@ void flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
|
|||||||
HAL_FLASH_Unlock();
|
HAL_FLASH_Unlock();
|
||||||
for (uint16_t i = 0; i < (length / 2); i++) {
|
for (uint16_t i = 0; i < (length / 2); i++) {
|
||||||
resetWatchdog();
|
resetWatchdog();
|
||||||
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, SETTINGS_START_PAGE+ (i*sizeof(uint16_t)), data[i]);
|
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, SETTINGS_START_PAGE + (i * sizeof(uint16_t)), data[i]);
|
||||||
}
|
}
|
||||||
HAL_FLASH_Lock();
|
HAL_FLASH_Lock();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void flash_read_buffer(uint8_t *buffer, const uint16_t length) { memcpy(buffer, (uint8_t*)SETTINGS_START_PAGE, length); }
|
void flash_read_buffer(uint8_t *buffer, const uint16_t length) { memcpy(buffer, (uint8_t *)SETTINGS_START_PAGE, length); }
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user